From python-checkins at python.org Tue Jul 1 02:05:11 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 02:05:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Add_unittests_for_SearchDialogBase=2E_Patch_by_Phil_Webster?= =?utf-8?q?=2E?= Message-ID: <3h2Qn36x2Jz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/2b7a4cbed2a0 changeset: 91490:2b7a4cbed2a0 branch: 2.7 parent: 91487:c173a34f20c0 user: Terry Jan Reedy date: Mon Jun 30 19:59:57 2014 -0400 summary: Issue #18592: Add unittests for SearchDialogBase. Patch by Phil Webster. files: Lib/idlelib/SearchDialogBase.py | 25 +- Lib/idlelib/idle_test/test_searchdialogbase.py | 198 ++++++++++ 2 files changed, 213 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -16,10 +16,12 @@ (make_button, create_command_buttons). These are bound to functions that execute the command. - Except for command buttons, this base class is not limited to - items common to all three subclasses. Rather, it is the Find dialog - minus the "Find Next" command and its execution function. - The other dialogs override methods to replace and add widgets. + Except for command buttons, this base class is not limited to items + common to all three subclasses. Rather, it is the Find dialog minus + the "Find Next" command, its execution function, and the + default_command attribute needed in create_widgets. The other + dialogs override attributes and methods, the latter to replace and + add widgets. ''' title = "Search Dialog" # replace in subclasses @@ -30,9 +32,10 @@ '''Initialize root, engine, and top attributes. top (level widget): set in create_widgets() called from open(). - text (Text being searched): set in open(), only used in subclasses(). + text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). + default_command: set in subclasses, used in create_widgers(). title (of dialog): class attribute, override in subclasses. icon (of dialog): ditto, use unclear if cannot minimize dialog. @@ -93,25 +96,27 @@ e = Entry(self.top, textvariable=var, exportselection=0) e.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 - return e + return l, e # return label for testing def create_entries(self): "Create one or more entry lines with make_entry." - self.ent = self.make_entry("Find:", self.engine.patvar) + self.ent = self.make_entry("Find:", self.engine.patvar)[1] def make_frame(self,labeltext=None): "Return gridded labeled Frame for option or other buttons." if labeltext: l = Label(self.top, text=labeltext) l.grid(row=self.row, column=0, sticky="nw") + else: + l = '' f = Frame(self.top) f.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return f + return l, f def create_option_buttons(self): "Fill frame with Checkbuttons bound to SearchEngine booleanvars." - f = self.make_frame("Options") + f = self.make_frame("Options")[1] btn = Checkbutton(f, anchor="w", variable=self.engine.revar, @@ -144,7 +149,7 @@ def create_other_buttons(self): "Fill frame with buttons tied to other options." - f = self.make_frame("Direction") + f = self.make_frame("Direction")[1] btn = Radiobutton(f, anchor="w", variable=self.engine.backvar, value=1, diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -0,0 +1,198 @@ +'''Unittests for idlelib/SearchDialogBase.py + +Coverage: 99%. The only thing not covered is inconsequential -- +testing skipping of suite when self.needwrapbutton is false. + +''' +import unittest +from test.test_support import requires +from Tkinter import Tk, Toplevel, Frame, Label, BooleanVar, StringVar +from idlelib import SearchEngine as se +from idlelib import SearchDialogBase as sdb +from idlelib.idle_test.mock_idle import Func +from idlelib.idle_test.mock_tk import Var, Mbox + +# The following could help make some tests gui-free. +# However, they currently make radiobutton tests fail. +##def setUpModule(): +## # Replace tk objects used to initialize se.SearchEngine. +## se.BooleanVar = Var +## se.StringVar = Var +## +##def tearDownModule(): +## se.BooleanVar = BooleanVar +## se.StringVar = StringVar + +class SearchDialogBaseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def setUp(self): + self.engine = se.SearchEngine(self.root) # None also seems to work + self.dialog = sdb.SearchDialogBase(root=self.root, engine=self.engine) + + def tearDown(self): + self.dialog.close() + + def test_open_and_close(self): + # open calls create_widgets, which needs default_command + self.dialog.default_command = None + + # Since text parameter of .open is not used in base class, + # pass dummy 'text' instead of tk.Text(). + self.dialog.open('text') + self.assertEqual(self.dialog.top.state(), 'normal') + self.dialog.close() + self.assertEqual(self.dialog.top.state(), 'withdrawn') + + self.dialog.open('text', searchphrase="hello") + self.assertEqual(self.dialog.ent.get(), 'hello') + self.dialog.close() + + def test_create_widgets(self): + self.dialog.create_entries = Func() + self.dialog.create_option_buttons = Func() + self.dialog.create_other_buttons = Func() + self.dialog.create_command_buttons = Func() + + self.dialog.default_command = None + self.dialog.create_widgets() + + self.assertTrue(self.dialog.create_entries.called) + self.assertTrue(self.dialog.create_option_buttons.called) + self.assertTrue(self.dialog.create_other_buttons.called) + self.assertTrue(self.dialog.create_command_buttons.called) + + def test_make_entry(self): + equal = self.assertEqual + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + label, entry = self.dialog.make_entry("Test:", 'hello') + equal(label.cget('text'), 'Test:') + + self.assertIn(entry.get(), 'hello') + egi = entry.grid_info() + equal(egi['row'], '0') + equal(egi['column'], '1') + equal(egi['rowspan'], '1') + equal(egi['columnspan'], '1') + equal(self.dialog.row, 1) + + def test_create_entries(self): + self.dialog.row = 0 + self.engine.setpat('hello') + self.dialog.create_entries() + self.assertIn(self.dialog.ent.get(), 'hello') + + def test_make_frame(self): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + label, frame = self.dialog.make_frame() + self.assertEqual(label, '') + self.assertIsInstance(frame, Frame) + + label, labelledframe = self.dialog.make_frame('testlabel') + self.assertEqual(label.cget('text'), 'testlabel') + self.assertIsInstance(labelledframe, Frame) + + def btn_test_setup(self, which): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + if which == 'option': + self.dialog.create_option_buttons() + elif which == 'other': + self.dialog.create_other_buttons() + else: + raise ValueError('bad which arg %s' % which) + + def test_create_option_buttons(self): + self.btn_test_setup('option') + self.checkboxtests() + + def test_create_option_buttons_flipped(self): + for var in ('revar', 'casevar', 'wordvar', 'wrapvar'): + Var = getattr(self.engine, var) + Var.set(not Var.get()) + self.btn_test_setup('option') + self.checkboxtests(flip=1) + + def checkboxtests(self, flip=0): + """Tests the four checkboxes in the search dialog window.""" + engine = self.engine + for child in self.dialog.top.winfo_children(): + for grandchild in child.winfo_children(): + text = grandchild.config()['text'][-1] + if text == ('Regular', 'expression'): + self.btnstatetest(grandchild, engine.revar, flip) + elif text == ('Match', 'case'): + self.btnstatetest(grandchild, engine.casevar, flip) + elif text == ('Whole', 'word'): + self.btnstatetest(grandchild, engine.wordvar, flip) + elif text == ('Wrap', 'around'): + self.btnstatetest(grandchild, engine.wrapvar, not flip) + + def btnstatetest(self, button, var, defaultstate): + self.assertEqual(var.get(), defaultstate) + if defaultstate == 1: + button.deselect() + else: + button.select() + self.assertEqual(var.get(), 1 - defaultstate) + + def test_create_other_buttons(self): + self.btn_test_setup('other') + self.radiobuttontests() + + def test_create_other_buttons_flipped(self): + self.engine.backvar.set(1) + self.btn_test_setup('other') + self.radiobuttontests(back=1) + + def radiobuttontests(self, back=0): + searchupbtn = None + searchdownbtn = None + + for child in self.dialog.top.winfo_children(): + for grandchild in child.children.values(): + text = grandchild.config()['text'][-1] + if text == 'Up': + searchupbtn = grandchild + elif text == 'Down': + searchdownbtn = grandchild + + # Defaults to searching downward + self.assertEqual(self.engine.backvar.get(), back) + if back: + searchdownbtn.select() + else: + searchupbtn.select() + self.assertEqual(self.engine.backvar.get(), not back) + searchdownbtn.select() + + def test_make_button(self): + self.dialog.top = Toplevel(self.root) + self.dialog.buttonframe = Frame(self.dialog.top) + btn = self.dialog.make_button('Test', self.dialog.close) + self.assertEqual(btn.cget('text'), 'Test') + + def test_create_command_buttons(self): + self.dialog.create_command_buttons() + # Look for close button command in buttonframe + closebuttoncommand = '' + for child in self.dialog.buttonframe.winfo_children(): + if child.config()['text'][-1] == 'close': + closebuttoncommand = child.config()['command'][-1] + self.assertIn('close', closebuttoncommand) + + + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 02:05:13 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 02:05:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Add_unittests_for_SearchDialogBase=2E_Patch_by_Phil_Webster?= =?utf-8?q?=2E?= Message-ID: <3h2Qn529qXz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/a0e8f2d882a3 changeset: 91491:a0e8f2d882a3 branch: 3.4 parent: 91488:fcfa9c5a00fd user: Terry Jan Reedy date: Mon Jun 30 20:00:03 2014 -0400 summary: Issue #18592: Add unittests for SearchDialogBase. Patch by Phil Webster. files: Lib/idlelib/SearchDialogBase.py | 25 +- Lib/idlelib/idle_test/test_searchdialogbase.py | 198 ++++++++++ 2 files changed, 213 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -16,10 +16,12 @@ (make_button, create_command_buttons). These are bound to functions that execute the command. - Except for command buttons, this base class is not limited to - items common to all three subclasses. Rather, it is the Find dialog - minus the "Find Next" command and its execution function. - The other dialogs override methods to replace and add widgets. + Except for command buttons, this base class is not limited to items + common to all three subclasses. Rather, it is the Find dialog minus + the "Find Next" command, its execution function, and the + default_command attribute needed in create_widgets. The other + dialogs override attributes and methods, the latter to replace and + add widgets. ''' title = "Search Dialog" # replace in subclasses @@ -30,9 +32,10 @@ '''Initialize root, engine, and top attributes. top (level widget): set in create_widgets() called from open(). - text (Text being searched): set in open(), only used in subclasses(). + text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). + default_command: set in subclasses, used in create_widgers(). title (of dialog): class attribute, override in subclasses. icon (of dialog): ditto, use unclear if cannot minimize dialog. @@ -93,25 +96,27 @@ e = Entry(self.top, textvariable=var, exportselection=0) e.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 - return e + return l, e # return label for testing def create_entries(self): "Create one or more entry lines with make_entry." - self.ent = self.make_entry("Find:", self.engine.patvar) + self.ent = self.make_entry("Find:", self.engine.patvar)[1] def make_frame(self,labeltext=None): "Return gridded labeled Frame for option or other buttons." if labeltext: l = Label(self.top, text=labeltext) l.grid(row=self.row, column=0, sticky="nw") + else: + l = '' f = Frame(self.top) f.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return f + return l, f def create_option_buttons(self): "Fill frame with Checkbuttons bound to SearchEngine booleanvars." - f = self.make_frame("Options") + f = self.make_frame("Options")[1] btn = Checkbutton(f, anchor="w", variable=self.engine.revar, @@ -144,7 +149,7 @@ def create_other_buttons(self): "Fill frame with buttons tied to other options." - f = self.make_frame("Direction") + f = self.make_frame("Direction")[1] btn = Radiobutton(f, anchor="w", variable=self.engine.backvar, value=1, diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -0,0 +1,198 @@ +'''Unittests for idlelib/SearchDialogBase.py + +Coverage: 99%. The only thing not covered is inconsequential -- +testing skipping of suite when self.needwrapbutton is false. + +''' +import unittest +from test.support import requires +from tkinter import Tk, Toplevel, Frame, Label, BooleanVar, StringVar +from idlelib import SearchEngine as se +from idlelib import SearchDialogBase as sdb +from idlelib.idle_test.mock_idle import Func +from idlelib.idle_test.mock_tk import Var, Mbox + +# The following could help make some tests gui-free. +# However, they currently make radiobutton tests fail. +##def setUpModule(): +## # Replace tk objects used to initialize se.SearchEngine. +## se.BooleanVar = Var +## se.StringVar = Var +## +##def tearDownModule(): +## se.BooleanVar = BooleanVar +## se.StringVar = StringVar + +class SearchDialogBaseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def setUp(self): + self.engine = se.SearchEngine(self.root) # None also seems to work + self.dialog = sdb.SearchDialogBase(root=self.root, engine=self.engine) + + def tearDown(self): + self.dialog.close() + + def test_open_and_close(self): + # open calls create_widgets, which needs default_command + self.dialog.default_command = None + + # Since text parameter of .open is not used in base class, + # pass dummy 'text' instead of tk.Text(). + self.dialog.open('text') + self.assertEqual(self.dialog.top.state(), 'normal') + self.dialog.close() + self.assertEqual(self.dialog.top.state(), 'withdrawn') + + self.dialog.open('text', searchphrase="hello") + self.assertEqual(self.dialog.ent.get(), 'hello') + self.dialog.close() + + def test_create_widgets(self): + self.dialog.create_entries = Func() + self.dialog.create_option_buttons = Func() + self.dialog.create_other_buttons = Func() + self.dialog.create_command_buttons = Func() + + self.dialog.default_command = None + self.dialog.create_widgets() + + self.assertTrue(self.dialog.create_entries.called) + self.assertTrue(self.dialog.create_option_buttons.called) + self.assertTrue(self.dialog.create_other_buttons.called) + self.assertTrue(self.dialog.create_command_buttons.called) + + def test_make_entry(self): + equal = self.assertEqual + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + label, entry = self.dialog.make_entry("Test:", 'hello') + equal(label.cget('text'), 'Test:') + + self.assertIn(entry.get(), 'hello') + egi = entry.grid_info() + equal(egi['row'], 0) + equal(egi['column'], 1) + equal(egi['rowspan'], 1) + equal(egi['columnspan'], 1) + equal(self.dialog.row, 1) + + def test_create_entries(self): + self.dialog.row = 0 + self.engine.setpat('hello') + self.dialog.create_entries() + self.assertIn(self.dialog.ent.get(), 'hello') + + def test_make_frame(self): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + label, frame = self.dialog.make_frame() + self.assertEqual(label, '') + self.assertIsInstance(frame, Frame) + + label, labelledframe = self.dialog.make_frame('testlabel') + self.assertEqual(label.cget('text'), 'testlabel') + self.assertIsInstance(labelledframe, Frame) + + def btn_test_setup(self, which): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + if which == 'option': + self.dialog.create_option_buttons() + elif which == 'other': + self.dialog.create_other_buttons() + else: + raise ValueError('bad which arg %s' % which) + + def test_create_option_buttons(self): + self.btn_test_setup('option') + self.checkboxtests() + + def test_create_option_buttons_flipped(self): + for var in ('revar', 'casevar', 'wordvar', 'wrapvar'): + Var = getattr(self.engine, var) + Var.set(not Var.get()) + self.btn_test_setup('option') + self.checkboxtests(flip=1) + + def checkboxtests(self, flip=0): + """Tests the four checkboxes in the search dialog window.""" + engine = self.engine + for child in self.dialog.top.winfo_children(): + for grandchild in child.winfo_children(): + text = grandchild.config()['text'][-1] + if text == ('Regular', 'expression'): + self.btnstatetest(grandchild, engine.revar, flip) + elif text == ('Match', 'case'): + self.btnstatetest(grandchild, engine.casevar, flip) + elif text == ('Whole', 'word'): + self.btnstatetest(grandchild, engine.wordvar, flip) + elif text == ('Wrap', 'around'): + self.btnstatetest(grandchild, engine.wrapvar, not flip) + + def btnstatetest(self, button, var, defaultstate): + self.assertEqual(var.get(), defaultstate) + if defaultstate == 1: + button.deselect() + else: + button.select() + self.assertEqual(var.get(), 1 - defaultstate) + + def test_create_other_buttons(self): + self.btn_test_setup('other') + self.radiobuttontests() + + def test_create_other_buttons_flipped(self): + self.engine.backvar.set(1) + self.btn_test_setup('other') + self.radiobuttontests(back=1) + + def radiobuttontests(self, back=0): + searchupbtn = None + searchdownbtn = None + + for child in self.dialog.top.winfo_children(): + for grandchild in child.children.values(): + text = grandchild.config()['text'][-1] + if text == 'Up': + searchupbtn = grandchild + elif text == 'Down': + searchdownbtn = grandchild + + # Defaults to searching downward + self.assertEqual(self.engine.backvar.get(), back) + if back: + searchdownbtn.select() + else: + searchupbtn.select() + self.assertEqual(self.engine.backvar.get(), not back) + searchdownbtn.select() + + def test_make_button(self): + self.dialog.top = Toplevel(self.root) + self.dialog.buttonframe = Frame(self.dialog.top) + btn = self.dialog.make_button('Test', self.dialog.close) + self.assertEqual(btn.cget('text'), 'Test') + + def test_create_command_buttons(self): + self.dialog.create_command_buttons() + # Look for close button command in buttonframe + closebuttoncommand = '' + for child in self.dialog.buttonframe.winfo_children(): + if child.config()['text'][-1] == 'close': + closebuttoncommand = child.config()['command'][-1] + self.assertIn('close', closebuttoncommand) + + + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 02:05:14 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 02:05:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h2Qn64X74z7Lk4@mail.python.org> http://hg.python.org/cpython/rev/b3f4616b9a94 changeset: 91492:b3f4616b9a94 parent: 91489:3134189655b1 parent: 91491:a0e8f2d882a3 user: Terry Jan Reedy date: Mon Jun 30 20:00:16 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/SearchDialogBase.py | 25 +- Lib/idlelib/idle_test/test_searchdialogbase.py | 198 ++++++++++ 2 files changed, 213 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -16,10 +16,12 @@ (make_button, create_command_buttons). These are bound to functions that execute the command. - Except for command buttons, this base class is not limited to - items common to all three subclasses. Rather, it is the Find dialog - minus the "Find Next" command and its execution function. - The other dialogs override methods to replace and add widgets. + Except for command buttons, this base class is not limited to items + common to all three subclasses. Rather, it is the Find dialog minus + the "Find Next" command, its execution function, and the + default_command attribute needed in create_widgets. The other + dialogs override attributes and methods, the latter to replace and + add widgets. ''' title = "Search Dialog" # replace in subclasses @@ -30,9 +32,10 @@ '''Initialize root, engine, and top attributes. top (level widget): set in create_widgets() called from open(). - text (Text being searched): set in open(), only used in subclasses(). + text (Text searched): set in open(), only used in subclasses(). ent (ry): created in make_entry() called from create_entry(). row (of grid): 0 in create_widgets(), +1 in make_entry/frame(). + default_command: set in subclasses, used in create_widgers(). title (of dialog): class attribute, override in subclasses. icon (of dialog): ditto, use unclear if cannot minimize dialog. @@ -93,25 +96,27 @@ e = Entry(self.top, textvariable=var, exportselection=0) e.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 - return e + return l, e # return label for testing def create_entries(self): "Create one or more entry lines with make_entry." - self.ent = self.make_entry("Find:", self.engine.patvar) + self.ent = self.make_entry("Find:", self.engine.patvar)[1] def make_frame(self,labeltext=None): "Return gridded labeled Frame for option or other buttons." if labeltext: l = Label(self.top, text=labeltext) l.grid(row=self.row, column=0, sticky="nw") + else: + l = '' f = Frame(self.top) f.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return f + return l, f def create_option_buttons(self): "Fill frame with Checkbuttons bound to SearchEngine booleanvars." - f = self.make_frame("Options") + f = self.make_frame("Options")[1] btn = Checkbutton(f, anchor="w", variable=self.engine.revar, @@ -144,7 +149,7 @@ def create_other_buttons(self): "Fill frame with buttons tied to other options." - f = self.make_frame("Direction") + f = self.make_frame("Direction")[1] btn = Radiobutton(f, anchor="w", variable=self.engine.backvar, value=1, diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -0,0 +1,198 @@ +'''Unittests for idlelib/SearchDialogBase.py + +Coverage: 99%. The only thing not covered is inconsequential -- +testing skipping of suite when self.needwrapbutton is false. + +''' +import unittest +from test.support import requires +from tkinter import Tk, Toplevel, Frame, Label, BooleanVar, StringVar +from idlelib import SearchEngine as se +from idlelib import SearchDialogBase as sdb +from idlelib.idle_test.mock_idle import Func +from idlelib.idle_test.mock_tk import Var, Mbox + +# The following could help make some tests gui-free. +# However, they currently make radiobutton tests fail. +##def setUpModule(): +## # Replace tk objects used to initialize se.SearchEngine. +## se.BooleanVar = Var +## se.StringVar = Var +## +##def tearDownModule(): +## se.BooleanVar = BooleanVar +## se.StringVar = StringVar + +class SearchDialogBaseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def setUp(self): + self.engine = se.SearchEngine(self.root) # None also seems to work + self.dialog = sdb.SearchDialogBase(root=self.root, engine=self.engine) + + def tearDown(self): + self.dialog.close() + + def test_open_and_close(self): + # open calls create_widgets, which needs default_command + self.dialog.default_command = None + + # Since text parameter of .open is not used in base class, + # pass dummy 'text' instead of tk.Text(). + self.dialog.open('text') + self.assertEqual(self.dialog.top.state(), 'normal') + self.dialog.close() + self.assertEqual(self.dialog.top.state(), 'withdrawn') + + self.dialog.open('text', searchphrase="hello") + self.assertEqual(self.dialog.ent.get(), 'hello') + self.dialog.close() + + def test_create_widgets(self): + self.dialog.create_entries = Func() + self.dialog.create_option_buttons = Func() + self.dialog.create_other_buttons = Func() + self.dialog.create_command_buttons = Func() + + self.dialog.default_command = None + self.dialog.create_widgets() + + self.assertTrue(self.dialog.create_entries.called) + self.assertTrue(self.dialog.create_option_buttons.called) + self.assertTrue(self.dialog.create_other_buttons.called) + self.assertTrue(self.dialog.create_command_buttons.called) + + def test_make_entry(self): + equal = self.assertEqual + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + label, entry = self.dialog.make_entry("Test:", 'hello') + equal(label.cget('text'), 'Test:') + + self.assertIn(entry.get(), 'hello') + egi = entry.grid_info() + equal(egi['row'], 0) + equal(egi['column'], 1) + equal(egi['rowspan'], 1) + equal(egi['columnspan'], 1) + equal(self.dialog.row, 1) + + def test_create_entries(self): + self.dialog.row = 0 + self.engine.setpat('hello') + self.dialog.create_entries() + self.assertIn(self.dialog.ent.get(), 'hello') + + def test_make_frame(self): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + label, frame = self.dialog.make_frame() + self.assertEqual(label, '') + self.assertIsInstance(frame, Frame) + + label, labelledframe = self.dialog.make_frame('testlabel') + self.assertEqual(label.cget('text'), 'testlabel') + self.assertIsInstance(labelledframe, Frame) + + def btn_test_setup(self, which): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + if which == 'option': + self.dialog.create_option_buttons() + elif which == 'other': + self.dialog.create_other_buttons() + else: + raise ValueError('bad which arg %s' % which) + + def test_create_option_buttons(self): + self.btn_test_setup('option') + self.checkboxtests() + + def test_create_option_buttons_flipped(self): + for var in ('revar', 'casevar', 'wordvar', 'wrapvar'): + Var = getattr(self.engine, var) + Var.set(not Var.get()) + self.btn_test_setup('option') + self.checkboxtests(flip=1) + + def checkboxtests(self, flip=0): + """Tests the four checkboxes in the search dialog window.""" + engine = self.engine + for child in self.dialog.top.winfo_children(): + for grandchild in child.winfo_children(): + text = grandchild.config()['text'][-1] + if text == ('Regular', 'expression'): + self.btnstatetest(grandchild, engine.revar, flip) + elif text == ('Match', 'case'): + self.btnstatetest(grandchild, engine.casevar, flip) + elif text == ('Whole', 'word'): + self.btnstatetest(grandchild, engine.wordvar, flip) + elif text == ('Wrap', 'around'): + self.btnstatetest(grandchild, engine.wrapvar, not flip) + + def btnstatetest(self, button, var, defaultstate): + self.assertEqual(var.get(), defaultstate) + if defaultstate == 1: + button.deselect() + else: + button.select() + self.assertEqual(var.get(), 1 - defaultstate) + + def test_create_other_buttons(self): + self.btn_test_setup('other') + self.radiobuttontests() + + def test_create_other_buttons_flipped(self): + self.engine.backvar.set(1) + self.btn_test_setup('other') + self.radiobuttontests(back=1) + + def radiobuttontests(self, back=0): + searchupbtn = None + searchdownbtn = None + + for child in self.dialog.top.winfo_children(): + for grandchild in child.children.values(): + text = grandchild.config()['text'][-1] + if text == 'Up': + searchupbtn = grandchild + elif text == 'Down': + searchdownbtn = grandchild + + # Defaults to searching downward + self.assertEqual(self.engine.backvar.get(), back) + if back: + searchdownbtn.select() + else: + searchupbtn.select() + self.assertEqual(self.engine.backvar.get(), not back) + searchdownbtn.select() + + def test_make_button(self): + self.dialog.top = Toplevel(self.root) + self.dialog.buttonframe = Frame(self.dialog.top) + btn = self.dialog.make_button('Test', self.dialog.close) + self.assertEqual(btn.cget('text'), 'Test') + + def test_create_command_buttons(self): + self.dialog.create_command_buttons() + # Look for close button command in buttonframe + closebuttoncommand = '' + for child in self.dialog.buttonframe.winfo_children(): + if child.config()['text'][-1] == 'close': + closebuttoncommand = child.config()['command'][-1] + self.assertIn('close', closebuttoncommand) + + + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 02:05:15 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 02:05:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_whitespace?= Message-ID: <3h2Qn75sfYz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/8a39ac367664 changeset: 91493:8a39ac367664 branch: 2.7 parent: 91490:2b7a4cbed2a0 user: Terry Jan Reedy date: Mon Jun 30 20:03:23 2014 -0400 summary: whitespace files: Lib/idlelib/idle_test/test_searchdialogbase.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -44,7 +44,7 @@ def test_open_and_close(self): # open calls create_widgets, which needs default_command - self.dialog.default_command = None + self.dialog.default_command = None # Since text parameter of .open is not used in base class, # pass dummy 'text' instead of tk.Text(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 05:03:08 2014 From: python-checkins at python.org (berker.peksag) Date: Tue, 1 Jul 2014 05:03:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzEzNjg5?= =?utf-8?q?=3A_Remove_a_dead_link_from_howto/urllib=2E?= Message-ID: <3h2VkN3lwZz7LjX@mail.python.org> http://hg.python.org/cpython/rev/e0561df131aa changeset: 91494:e0561df131aa branch: 3.4 parent: 91491:a0e8f2d882a3 user: Berker Peksag date: Tue Jul 01 06:02:42 2014 +0300 summary: Issue #13689: Remove a dead link from howto/urllib. files: Doc/howto/urllib2.rst | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -97,7 +97,7 @@ ---- Sometimes you want to send data to a URL (often the URL will refer to a CGI -(Common Gateway Interface) script [#]_ or other web application). With HTTP, +(Common Gateway Interface) script or other web application). With HTTP, this is often done using what's known as a **POST** request. This is often what your browser does when you submit a HTML form that you filled in on the web. Not all POSTs have to come from forms: you can use a POST to transmit arbitrary data @@ -572,8 +572,6 @@ This document was reviewed and revised by John Lee. -.. [#] For an introduction to the CGI protocol see - `Writing Web Applications in Python `_. .. [#] Like Google for example. The *proper* way to use google from a program is to use `PyGoogle `_ of course. See `Voidspace Google `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 05:03:09 2014 From: python-checkins at python.org (berker.peksag) Date: Tue, 1 Jul 2014 05:03:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2313689=3A_Merge_from_3=2E4=2E?= Message-ID: <3h2VkP5V3Cz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/4617c0e1f6c4 changeset: 91495:4617c0e1f6c4 parent: 91492:b3f4616b9a94 parent: 91494:e0561df131aa user: Berker Peksag date: Tue Jul 01 06:03:24 2014 +0300 summary: Issue #13689: Merge from 3.4. files: Doc/howto/urllib2.rst | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -97,7 +97,7 @@ ---- Sometimes you want to send data to a URL (often the URL will refer to a CGI -(Common Gateway Interface) script [#]_ or other web application). With HTTP, +(Common Gateway Interface) script or other web application). With HTTP, this is often done using what's known as a **POST** request. This is often what your browser does when you submit a HTML form that you filled in on the web. Not all POSTs have to come from forms: you can use a POST to transmit arbitrary data @@ -572,8 +572,6 @@ This document was reviewed and revised by John Lee. -.. [#] For an introduction to the CGI protocol see - `Writing Web Applications in Python `_. .. [#] Like Google for example. The *proper* way to use google from a program is to use `PyGoogle `_ of course. See `Voidspace Google `_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 05:53:02 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 05:53:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Refactor_2_SearchDialogBase=2Ecreate=5F=28option/other=29?= =?utf-8?q?=5Fbuttons_methods?= Message-ID: <3h2Wqy0rNRz7LjT@mail.python.org> http://hg.python.org/cpython/rev/a7f943a13f7f changeset: 91496:a7f943a13f7f branch: 2.7 parent: 91493:8a39ac367664 user: Terry Jan Reedy date: Mon Jun 30 23:52:14 2014 -0400 summary: Issue #18592: Refactor 2 SearchDialogBase.create_(option/other)_buttons methods to remove duplication and return info for tests. Rewrite corresponding tests. Test_create_option_buttons was not testing anything because of buggy comparisons. Use Python subscripting to get widget options. files: Lib/idlelib/SearchDialogBase.py | 75 ++---- Lib/idlelib/idle_test/test_searchdialogbase.py | 119 +++------ 2 files changed, 70 insertions(+), 124 deletions(-) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -105,65 +105,44 @@ def make_frame(self,labeltext=None): "Return gridded labeled Frame for option or other buttons." if labeltext: - l = Label(self.top, text=labeltext) - l.grid(row=self.row, column=0, sticky="nw") + label = Label(self.top, text=labeltext) + label.grid(row=self.row, column=0, sticky="nw") else: - l = '' - f = Frame(self.top) - f.grid(row=self.row, column=1, columnspan=1, sticky="nwe") + label = '' + frame = Frame(self.top) + frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return l, f + return frame, label # label for test def create_option_buttons(self): "Fill frame with Checkbuttons bound to SearchEngine booleanvars." - f = self.make_frame("Options")[1] - - btn = Checkbutton(f, anchor="w", - variable=self.engine.revar, - text="Regular expression") - btn.pack(side="left", fill="both") - if self.engine.isre(): - btn.select() - - btn = Checkbutton(f, anchor="w", - variable=self.engine.casevar, - text="Match case") - btn.pack(side="left", fill="both") - if self.engine.iscase(): - btn.select() - - btn = Checkbutton(f, anchor="w", - variable=self.engine.wordvar, - text="Whole word") - btn.pack(side="left", fill="both") - if self.engine.isword(): - btn.select() - + frame = self.make_frame("Options")[0] + engine = self.engine + options = [(engine.revar, "Regular expression"), + (engine.casevar, "Match case"), + (engine.wordvar, "Whole word")] if self.needwrapbutton: - btn = Checkbutton(f, anchor="w", - variable=self.engine.wrapvar, - text="Wrap around") + options.append((engine.wrapvar, "Wrap around")) + for var, label in options: + btn = Checkbutton(frame, anchor="w", variable=var, text=label) btn.pack(side="left", fill="both") - if self.engine.iswrap(): + if var.get(): btn.select() + return frame, options # for test def create_other_buttons(self): "Fill frame with buttons tied to other options." - f = self.make_frame("Direction")[1] - - btn = Radiobutton(f, anchor="w", - variable=self.engine.backvar, value=1, - text="Up") - btn.pack(side="left", fill="both") - if self.engine.isback(): - btn.select() - - btn = Radiobutton(f, anchor="w", - variable=self.engine.backvar, value=0, - text="Down") - btn.pack(side="left", fill="both") - if not self.engine.isback(): - btn.select() + frame = self.make_frame("Direction")[0] + var = self.engine.backvar + others = [(1, 'Up'), (0, 'Down')] + for val, label in others: + btn = Radiobutton(frame, anchor="w", + variable=var, value=val, text=label) + btn.pack(side="left", fill="both") + #print(var.get(), val, label) + if var.get() == val: + btn.select() + return frame, others # for test def make_button(self, label, command, isdef=0): "Return command button gridded in command frame." diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -76,7 +76,7 @@ self.dialog.row = 0 self.dialog.top = Toplevel(self.root) label, entry = self.dialog.make_entry("Test:", 'hello') - equal(label.cget('text'), 'Test:') + equal(label['text'], 'Test:') self.assertIn(entry.get(), 'hello') egi = entry.grid_info() @@ -95,101 +95,68 @@ def test_make_frame(self): self.dialog.row = 0 self.dialog.top = Toplevel(self.root) - label, frame = self.dialog.make_frame() + frame, label = self.dialog.make_frame() self.assertEqual(label, '') self.assertIsInstance(frame, Frame) - label, labelledframe = self.dialog.make_frame('testlabel') - self.assertEqual(label.cget('text'), 'testlabel') - self.assertIsInstance(labelledframe, Frame) + frame, label = self.dialog.make_frame('testlabel') + self.assertEqual(label['text'], 'testlabel') + self.assertIsInstance(frame, Frame) - def btn_test_setup(self, which): + def btn_test_setup(self, meth): + self.dialog.top = Toplevel(self.root) self.dialog.row = 0 - self.dialog.top = Toplevel(self.root) - if which == 'option': - self.dialog.create_option_buttons() - elif which == 'other': - self.dialog.create_other_buttons() - else: - raise ValueError('bad which arg %s' % which) + return meth() def test_create_option_buttons(self): - self.btn_test_setup('option') - self.checkboxtests() - - def test_create_option_buttons_flipped(self): - for var in ('revar', 'casevar', 'wordvar', 'wrapvar'): - Var = getattr(self.engine, var) - Var.set(not Var.get()) - self.btn_test_setup('option') - self.checkboxtests(flip=1) - - def checkboxtests(self, flip=0): - """Tests the four checkboxes in the search dialog window.""" - engine = self.engine - for child in self.dialog.top.winfo_children(): - for grandchild in child.winfo_children(): - text = grandchild.config()['text'][-1] - if text == ('Regular', 'expression'): - self.btnstatetest(grandchild, engine.revar, flip) - elif text == ('Match', 'case'): - self.btnstatetest(grandchild, engine.casevar, flip) - elif text == ('Whole', 'word'): - self.btnstatetest(grandchild, engine.wordvar, flip) - elif text == ('Wrap', 'around'): - self.btnstatetest(grandchild, engine.wrapvar, not flip) - - def btnstatetest(self, button, var, defaultstate): - self.assertEqual(var.get(), defaultstate) - if defaultstate == 1: - button.deselect() - else: - button.select() - self.assertEqual(var.get(), 1 - defaultstate) + e = self.engine + for state in (0, 1): + for var in (e.revar, e.casevar, e.wordvar, e.wrapvar): + var.set(state) + frame, options = self.btn_test_setup( + self.dialog.create_option_buttons) + for spec, button in zip (options, frame.pack_slaves()): + var, label = spec + self.assertEqual(button['text'], label) + self.assertEqual(var.get(), state) + if state == 1: + button.deselect() + else: + button.select() + self.assertEqual(var.get(), 1 - state) def test_create_other_buttons(self): - self.btn_test_setup('other') - self.radiobuttontests() - - def test_create_other_buttons_flipped(self): - self.engine.backvar.set(1) - self.btn_test_setup('other') - self.radiobuttontests(back=1) - - def radiobuttontests(self, back=0): - searchupbtn = None - searchdownbtn = None - - for child in self.dialog.top.winfo_children(): - for grandchild in child.children.values(): - text = grandchild.config()['text'][-1] - if text == 'Up': - searchupbtn = grandchild - elif text == 'Down': - searchdownbtn = grandchild - - # Defaults to searching downward - self.assertEqual(self.engine.backvar.get(), back) - if back: - searchdownbtn.select() - else: - searchupbtn.select() - self.assertEqual(self.engine.backvar.get(), not back) - searchdownbtn.select() + for state in (False, True): + var = self.engine.backvar + var.set(state) + frame, others = self.btn_test_setup( + self.dialog.create_other_buttons) + buttons = frame.pack_slaves() + for spec, button in zip(others, buttons): + val, label = spec + self.assertEqual(button['text'], label) + if val == state: + # hit other button, then this one + # indexes depend on button order + self.assertEqual(var.get(), state) + buttons[val].select() + self.assertEqual(var.get(), 1 - state) + buttons[1-val].select() + self.assertEqual(var.get(), state) def test_make_button(self): self.dialog.top = Toplevel(self.root) self.dialog.buttonframe = Frame(self.dialog.top) btn = self.dialog.make_button('Test', self.dialog.close) - self.assertEqual(btn.cget('text'), 'Test') + self.assertEqual(btn['text'], 'Test') def test_create_command_buttons(self): self.dialog.create_command_buttons() # Look for close button command in buttonframe closebuttoncommand = '' for child in self.dialog.buttonframe.winfo_children(): - if child.config()['text'][-1] == 'close': - closebuttoncommand = child.config()['command'][-1] + if child['text'] == 'close': + closebuttoncommand = child['command'] self.assertIn('close', closebuttoncommand) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 05:53:03 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 05:53:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Refactor_2_SearchDialogBase=2Ecreate=5F=28option/other=29?= =?utf-8?q?=5Fbuttons_methods?= Message-ID: <3h2Wqz3qYWz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/86c26ff25207 changeset: 91497:86c26ff25207 branch: 3.4 parent: 91494:e0561df131aa user: Terry Jan Reedy date: Mon Jun 30 23:52:20 2014 -0400 summary: Issue #18592: Refactor 2 SearchDialogBase.create_(option/other)_buttons methods to remove duplication and return info for tests. Rewrite corresponding tests. Test_create_option_buttons was not testing anything because of buggy comparisons. Use Python subscripting to get widget options. files: Lib/idlelib/SearchDialogBase.py | 75 ++---- Lib/idlelib/idle_test/test_searchdialogbase.py | 119 +++------ 2 files changed, 70 insertions(+), 124 deletions(-) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -105,65 +105,44 @@ def make_frame(self,labeltext=None): "Return gridded labeled Frame for option or other buttons." if labeltext: - l = Label(self.top, text=labeltext) - l.grid(row=self.row, column=0, sticky="nw") + label = Label(self.top, text=labeltext) + label.grid(row=self.row, column=0, sticky="nw") else: - l = '' - f = Frame(self.top) - f.grid(row=self.row, column=1, columnspan=1, sticky="nwe") + label = '' + frame = Frame(self.top) + frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return l, f + return frame, label # label for test def create_option_buttons(self): "Fill frame with Checkbuttons bound to SearchEngine booleanvars." - f = self.make_frame("Options")[1] - - btn = Checkbutton(f, anchor="w", - variable=self.engine.revar, - text="Regular expression") - btn.pack(side="left", fill="both") - if self.engine.isre(): - btn.select() - - btn = Checkbutton(f, anchor="w", - variable=self.engine.casevar, - text="Match case") - btn.pack(side="left", fill="both") - if self.engine.iscase(): - btn.select() - - btn = Checkbutton(f, anchor="w", - variable=self.engine.wordvar, - text="Whole word") - btn.pack(side="left", fill="both") - if self.engine.isword(): - btn.select() - + frame = self.make_frame("Options")[0] + engine = self.engine + options = [(engine.revar, "Regular expression"), + (engine.casevar, "Match case"), + (engine.wordvar, "Whole word")] if self.needwrapbutton: - btn = Checkbutton(f, anchor="w", - variable=self.engine.wrapvar, - text="Wrap around") + options.append((engine.wrapvar, "Wrap around")) + for var, label in options: + btn = Checkbutton(frame, anchor="w", variable=var, text=label) btn.pack(side="left", fill="both") - if self.engine.iswrap(): + if var.get(): btn.select() + return frame, options # for test def create_other_buttons(self): "Fill frame with buttons tied to other options." - f = self.make_frame("Direction")[1] - - btn = Radiobutton(f, anchor="w", - variable=self.engine.backvar, value=1, - text="Up") - btn.pack(side="left", fill="both") - if self.engine.isback(): - btn.select() - - btn = Radiobutton(f, anchor="w", - variable=self.engine.backvar, value=0, - text="Down") - btn.pack(side="left", fill="both") - if not self.engine.isback(): - btn.select() + frame = self.make_frame("Direction")[0] + var = self.engine.backvar + others = [(1, 'Up'), (0, 'Down')] + for val, label in others: + btn = Radiobutton(frame, anchor="w", + variable=var, value=val, text=label) + btn.pack(side="left", fill="both") + #print(var.get(), val, label) + if var.get() == val: + btn.select() + return frame, others # for test def make_button(self, label, command, isdef=0): "Return command button gridded in command frame." diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -76,7 +76,7 @@ self.dialog.row = 0 self.dialog.top = Toplevel(self.root) label, entry = self.dialog.make_entry("Test:", 'hello') - equal(label.cget('text'), 'Test:') + equal(label['text'], 'Test:') self.assertIn(entry.get(), 'hello') egi = entry.grid_info() @@ -95,101 +95,68 @@ def test_make_frame(self): self.dialog.row = 0 self.dialog.top = Toplevel(self.root) - label, frame = self.dialog.make_frame() + frame, label = self.dialog.make_frame() self.assertEqual(label, '') self.assertIsInstance(frame, Frame) - label, labelledframe = self.dialog.make_frame('testlabel') - self.assertEqual(label.cget('text'), 'testlabel') - self.assertIsInstance(labelledframe, Frame) + frame, label = self.dialog.make_frame('testlabel') + self.assertEqual(label['text'], 'testlabel') + self.assertIsInstance(frame, Frame) - def btn_test_setup(self, which): + def btn_test_setup(self, meth): + self.dialog.top = Toplevel(self.root) self.dialog.row = 0 - self.dialog.top = Toplevel(self.root) - if which == 'option': - self.dialog.create_option_buttons() - elif which == 'other': - self.dialog.create_other_buttons() - else: - raise ValueError('bad which arg %s' % which) + return meth() def test_create_option_buttons(self): - self.btn_test_setup('option') - self.checkboxtests() - - def test_create_option_buttons_flipped(self): - for var in ('revar', 'casevar', 'wordvar', 'wrapvar'): - Var = getattr(self.engine, var) - Var.set(not Var.get()) - self.btn_test_setup('option') - self.checkboxtests(flip=1) - - def checkboxtests(self, flip=0): - """Tests the four checkboxes in the search dialog window.""" - engine = self.engine - for child in self.dialog.top.winfo_children(): - for grandchild in child.winfo_children(): - text = grandchild.config()['text'][-1] - if text == ('Regular', 'expression'): - self.btnstatetest(grandchild, engine.revar, flip) - elif text == ('Match', 'case'): - self.btnstatetest(grandchild, engine.casevar, flip) - elif text == ('Whole', 'word'): - self.btnstatetest(grandchild, engine.wordvar, flip) - elif text == ('Wrap', 'around'): - self.btnstatetest(grandchild, engine.wrapvar, not flip) - - def btnstatetest(self, button, var, defaultstate): - self.assertEqual(var.get(), defaultstate) - if defaultstate == 1: - button.deselect() - else: - button.select() - self.assertEqual(var.get(), 1 - defaultstate) + e = self.engine + for state in (0, 1): + for var in (e.revar, e.casevar, e.wordvar, e.wrapvar): + var.set(state) + frame, options = self.btn_test_setup( + self.dialog.create_option_buttons) + for spec, button in zip (options, frame.pack_slaves()): + var, label = spec + self.assertEqual(button['text'], label) + self.assertEqual(var.get(), state) + if state == 1: + button.deselect() + else: + button.select() + self.assertEqual(var.get(), 1 - state) def test_create_other_buttons(self): - self.btn_test_setup('other') - self.radiobuttontests() - - def test_create_other_buttons_flipped(self): - self.engine.backvar.set(1) - self.btn_test_setup('other') - self.radiobuttontests(back=1) - - def radiobuttontests(self, back=0): - searchupbtn = None - searchdownbtn = None - - for child in self.dialog.top.winfo_children(): - for grandchild in child.children.values(): - text = grandchild.config()['text'][-1] - if text == 'Up': - searchupbtn = grandchild - elif text == 'Down': - searchdownbtn = grandchild - - # Defaults to searching downward - self.assertEqual(self.engine.backvar.get(), back) - if back: - searchdownbtn.select() - else: - searchupbtn.select() - self.assertEqual(self.engine.backvar.get(), not back) - searchdownbtn.select() + for state in (False, True): + var = self.engine.backvar + var.set(state) + frame, others = self.btn_test_setup( + self.dialog.create_other_buttons) + buttons = frame.pack_slaves() + for spec, button in zip(others, buttons): + val, label = spec + self.assertEqual(button['text'], label) + if val == state: + # hit other button, then this one + # indexes depend on button order + self.assertEqual(var.get(), state) + buttons[val].select() + self.assertEqual(var.get(), 1 - state) + buttons[1-val].select() + self.assertEqual(var.get(), state) def test_make_button(self): self.dialog.top = Toplevel(self.root) self.dialog.buttonframe = Frame(self.dialog.top) btn = self.dialog.make_button('Test', self.dialog.close) - self.assertEqual(btn.cget('text'), 'Test') + self.assertEqual(btn['text'], 'Test') def test_create_command_buttons(self): self.dialog.create_command_buttons() # Look for close button command in buttonframe closebuttoncommand = '' for child in self.dialog.buttonframe.winfo_children(): - if child.config()['text'][-1] == 'close': - closebuttoncommand = child.config()['command'][-1] + if child['text'] == 'close': + closebuttoncommand = child['command'] self.assertIn('close', closebuttoncommand) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 05:53:04 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 1 Jul 2014 05:53:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h2Wr06WSFz7Lk1@mail.python.org> http://hg.python.org/cpython/rev/3bad10a56a2a changeset: 91498:3bad10a56a2a parent: 91495:4617c0e1f6c4 parent: 91497:86c26ff25207 user: Terry Jan Reedy date: Mon Jun 30 23:52:32 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/SearchDialogBase.py | 75 ++---- Lib/idlelib/idle_test/test_searchdialogbase.py | 119 +++------ 2 files changed, 70 insertions(+), 124 deletions(-) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -105,65 +105,44 @@ def make_frame(self,labeltext=None): "Return gridded labeled Frame for option or other buttons." if labeltext: - l = Label(self.top, text=labeltext) - l.grid(row=self.row, column=0, sticky="nw") + label = Label(self.top, text=labeltext) + label.grid(row=self.row, column=0, sticky="nw") else: - l = '' - f = Frame(self.top) - f.grid(row=self.row, column=1, columnspan=1, sticky="nwe") + label = '' + frame = Frame(self.top) + frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return l, f + return frame, label # label for test def create_option_buttons(self): "Fill frame with Checkbuttons bound to SearchEngine booleanvars." - f = self.make_frame("Options")[1] - - btn = Checkbutton(f, anchor="w", - variable=self.engine.revar, - text="Regular expression") - btn.pack(side="left", fill="both") - if self.engine.isre(): - btn.select() - - btn = Checkbutton(f, anchor="w", - variable=self.engine.casevar, - text="Match case") - btn.pack(side="left", fill="both") - if self.engine.iscase(): - btn.select() - - btn = Checkbutton(f, anchor="w", - variable=self.engine.wordvar, - text="Whole word") - btn.pack(side="left", fill="both") - if self.engine.isword(): - btn.select() - + frame = self.make_frame("Options")[0] + engine = self.engine + options = [(engine.revar, "Regular expression"), + (engine.casevar, "Match case"), + (engine.wordvar, "Whole word")] if self.needwrapbutton: - btn = Checkbutton(f, anchor="w", - variable=self.engine.wrapvar, - text="Wrap around") + options.append((engine.wrapvar, "Wrap around")) + for var, label in options: + btn = Checkbutton(frame, anchor="w", variable=var, text=label) btn.pack(side="left", fill="both") - if self.engine.iswrap(): + if var.get(): btn.select() + return frame, options # for test def create_other_buttons(self): "Fill frame with buttons tied to other options." - f = self.make_frame("Direction")[1] - - btn = Radiobutton(f, anchor="w", - variable=self.engine.backvar, value=1, - text="Up") - btn.pack(side="left", fill="both") - if self.engine.isback(): - btn.select() - - btn = Radiobutton(f, anchor="w", - variable=self.engine.backvar, value=0, - text="Down") - btn.pack(side="left", fill="both") - if not self.engine.isback(): - btn.select() + frame = self.make_frame("Direction")[0] + var = self.engine.backvar + others = [(1, 'Up'), (0, 'Down')] + for val, label in others: + btn = Radiobutton(frame, anchor="w", + variable=var, value=val, text=label) + btn.pack(side="left", fill="both") + #print(var.get(), val, label) + if var.get() == val: + btn.select() + return frame, others # for test def make_button(self, label, command, isdef=0): "Return command button gridded in command frame." diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -76,7 +76,7 @@ self.dialog.row = 0 self.dialog.top = Toplevel(self.root) label, entry = self.dialog.make_entry("Test:", 'hello') - equal(label.cget('text'), 'Test:') + equal(label['text'], 'Test:') self.assertIn(entry.get(), 'hello') egi = entry.grid_info() @@ -95,101 +95,68 @@ def test_make_frame(self): self.dialog.row = 0 self.dialog.top = Toplevel(self.root) - label, frame = self.dialog.make_frame() + frame, label = self.dialog.make_frame() self.assertEqual(label, '') self.assertIsInstance(frame, Frame) - label, labelledframe = self.dialog.make_frame('testlabel') - self.assertEqual(label.cget('text'), 'testlabel') - self.assertIsInstance(labelledframe, Frame) + frame, label = self.dialog.make_frame('testlabel') + self.assertEqual(label['text'], 'testlabel') + self.assertIsInstance(frame, Frame) - def btn_test_setup(self, which): + def btn_test_setup(self, meth): + self.dialog.top = Toplevel(self.root) self.dialog.row = 0 - self.dialog.top = Toplevel(self.root) - if which == 'option': - self.dialog.create_option_buttons() - elif which == 'other': - self.dialog.create_other_buttons() - else: - raise ValueError('bad which arg %s' % which) + return meth() def test_create_option_buttons(self): - self.btn_test_setup('option') - self.checkboxtests() - - def test_create_option_buttons_flipped(self): - for var in ('revar', 'casevar', 'wordvar', 'wrapvar'): - Var = getattr(self.engine, var) - Var.set(not Var.get()) - self.btn_test_setup('option') - self.checkboxtests(flip=1) - - def checkboxtests(self, flip=0): - """Tests the four checkboxes in the search dialog window.""" - engine = self.engine - for child in self.dialog.top.winfo_children(): - for grandchild in child.winfo_children(): - text = grandchild.config()['text'][-1] - if text == ('Regular', 'expression'): - self.btnstatetest(grandchild, engine.revar, flip) - elif text == ('Match', 'case'): - self.btnstatetest(grandchild, engine.casevar, flip) - elif text == ('Whole', 'word'): - self.btnstatetest(grandchild, engine.wordvar, flip) - elif text == ('Wrap', 'around'): - self.btnstatetest(grandchild, engine.wrapvar, not flip) - - def btnstatetest(self, button, var, defaultstate): - self.assertEqual(var.get(), defaultstate) - if defaultstate == 1: - button.deselect() - else: - button.select() - self.assertEqual(var.get(), 1 - defaultstate) + e = self.engine + for state in (0, 1): + for var in (e.revar, e.casevar, e.wordvar, e.wrapvar): + var.set(state) + frame, options = self.btn_test_setup( + self.dialog.create_option_buttons) + for spec, button in zip (options, frame.pack_slaves()): + var, label = spec + self.assertEqual(button['text'], label) + self.assertEqual(var.get(), state) + if state == 1: + button.deselect() + else: + button.select() + self.assertEqual(var.get(), 1 - state) def test_create_other_buttons(self): - self.btn_test_setup('other') - self.radiobuttontests() - - def test_create_other_buttons_flipped(self): - self.engine.backvar.set(1) - self.btn_test_setup('other') - self.radiobuttontests(back=1) - - def radiobuttontests(self, back=0): - searchupbtn = None - searchdownbtn = None - - for child in self.dialog.top.winfo_children(): - for grandchild in child.children.values(): - text = grandchild.config()['text'][-1] - if text == 'Up': - searchupbtn = grandchild - elif text == 'Down': - searchdownbtn = grandchild - - # Defaults to searching downward - self.assertEqual(self.engine.backvar.get(), back) - if back: - searchdownbtn.select() - else: - searchupbtn.select() - self.assertEqual(self.engine.backvar.get(), not back) - searchdownbtn.select() + for state in (False, True): + var = self.engine.backvar + var.set(state) + frame, others = self.btn_test_setup( + self.dialog.create_other_buttons) + buttons = frame.pack_slaves() + for spec, button in zip(others, buttons): + val, label = spec + self.assertEqual(button['text'], label) + if val == state: + # hit other button, then this one + # indexes depend on button order + self.assertEqual(var.get(), state) + buttons[val].select() + self.assertEqual(var.get(), 1 - state) + buttons[1-val].select() + self.assertEqual(var.get(), state) def test_make_button(self): self.dialog.top = Toplevel(self.root) self.dialog.buttonframe = Frame(self.dialog.top) btn = self.dialog.make_button('Test', self.dialog.close) - self.assertEqual(btn.cget('text'), 'Test') + self.assertEqual(btn['text'], 'Test') def test_create_command_buttons(self): self.dialog.create_command_buttons() # Look for close button command in buttonframe closebuttoncommand = '' for child in self.dialog.buttonframe.winfo_children(): - if child.config()['text'][-1] == 'close': - closebuttoncommand = child.config()['command'][-1] + if child['text'] == 'close': + closebuttoncommand = child['command'] self.assertIn('close', closebuttoncommand) -- Repository URL: http://hg.python.org/cpython From root at python.org Tue Jul 1 06:05:22 2014 From: root at python.org (Cron Daemon) Date: Tue, 01 Jul 2014 06:05:22 +0200 Subject: [Python-checkins] Cron /home/docs/build-devguide Message-ID: abort: error: Connection timed out From python-checkins at python.org Tue Jul 1 08:31:57 2014 From: python-checkins at python.org (ned.deily) Date: Tue, 1 Jul 2014 08:31:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODkx?= =?utf-8?q?=3A_remove_extraneous_semicolon=2E?= Message-ID: <3h2bMK5MWNz7LjP@mail.python.org> http://hg.python.org/cpython/rev/50e924d26ba6 changeset: 91499:50e924d26ba6 branch: 3.4 parent: 91497:86c26ff25207 user: Ned Deily date: Mon Jun 30 23:31:14 2014 -0700 summary: Issue #21891: remove extraneous semicolon. files: Python/sysmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1546,7 +1546,7 @@ #define STRIFY(name) QUOTE(name) #define MAJOR STRIFY(PY_MAJOR_VERSION) #define MINOR STRIFY(PY_MINOR_VERSION) -#define TAG NAME "-" MAJOR MINOR; +#define TAG NAME "-" MAJOR MINOR const char *_PySys_ImplCacheTag = TAG; #undef NAME #undef QUOTE -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 08:31:58 2014 From: python-checkins at python.org (ned.deily) Date: Tue, 1 Jul 2014 08:31:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321891=3A_remove_extraneous_semicolon=2E?= Message-ID: <3h2bML6mj4z7Ljn@mail.python.org> http://hg.python.org/cpython/rev/fc527ecb4487 changeset: 91500:fc527ecb4487 parent: 91498:3bad10a56a2a parent: 91499:50e924d26ba6 user: Ned Deily date: Mon Jun 30 23:31:33 2014 -0700 summary: Issue #21891: remove extraneous semicolon. files: Python/sysmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1546,7 +1546,7 @@ #define STRIFY(name) QUOTE(name) #define MAJOR STRIFY(PY_MAJOR_VERSION) #define MINOR STRIFY(PY_MINOR_VERSION) -#define TAG NAME "-" MAJOR MINOR; +#define TAG NAME "-" MAJOR MINOR const char *_PySys_ImplCacheTag = TAG; #undef NAME #undef QUOTE -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 08:58:07 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 08:58:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQ2xvc2VzICMyMTg5?= =?utf-8?q?2=2C_=2321893=3A_Use_PY=5FFORMAT=5FSIZE=5FT_instead_of_=25zi_or?= =?utf-8?q?_=25zu_to_format_C?= Message-ID: <3h2bxW1fxxz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/4f55e802baf0 changeset: 91501:4f55e802baf0 branch: 3.4 parent: 91499:50e924d26ba6 user: Victor Stinner date: Tue Jul 01 08:57:10 2014 +0200 summary: Closes #21892, #21893: Use PY_FORMAT_SIZE_T instead of %zi or %zu to format C size_t, because %zi/%u is not supported on all platforms. files: Modules/hashtable.c | 5 ++- Objects/unicodeobject.c | 34 +++++++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Modules/hashtable.c b/Modules/hashtable.c --- a/Modules/hashtable.c +++ b/Modules/hashtable.c @@ -233,11 +233,12 @@ nchains++; } } - printf("hash table %p: entries=%zu/%zu (%.0f%%), ", + printf("hash table %p: entries=%" + PY_FORMAT_SIZE_T "u/%" PY_FORMAT_SIZE_T "u (%.0f%%), ", ht, ht->entries, ht->num_buckets, load * 100.0); if (nchains) printf("avg_chain_len=%.1f, ", (double)total_chain_len / nchains); - printf("max_chain_len=%zu, %zu kB\n", + printf("max_chain_len=%" PY_FORMAT_SIZE_T "u, %" PY_FORMAT_SIZE_T "u kB\n", max_chain_len, size / 1024); } #endif diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1011,17 +1011,19 @@ } else data = unicode->data.any; - printf("%s: len=%zu, ",unicode_kind_name(op), ascii->length); + printf("%s: len=%" PY_FORMAT_SIZE_T "u, ", + 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); + printf(" (%" PY_FORMAT_SIZE_T "u), ", compact->wstr_length); if (!ascii->state.compact && compact->utf8 == unicode->data.any) printf("shared "); - printf("utf8=%p (%zu)", compact->utf8, compact->utf8_length); + printf("utf8=%p (%" PY_FORMAT_SIZE_T "u)", + compact->utf8, compact->utf8_length); } printf(", data=%p\n", data); } @@ -1370,8 +1372,9 @@ 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", + "Cannot write %" PY_FORMAT_SIZE_T "i characters at %" + PY_FORMAT_SIZE_T "i in a string of %" + PY_FORMAT_SIZE_T "i characters", how_many, to_start, PyUnicode_GET_LENGTH(to)); return -1; } @@ -4080,7 +4083,9 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", newpos); goto onError; } @@ -4173,7 +4178,9 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", newpos); goto onError; } @@ -6436,7 +6443,9 @@ if (*newpos<0) *newpos = len + *newpos; if (*newpos<0 || *newpos>len) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -8459,7 +8468,9 @@ else *newpos = i_newpos; if (*newpos<0 || *newpos>PyUnicode_GET_LENGTH(unicode)) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -9741,7 +9752,8 @@ item = items[i]; if (!PyUnicode_Check(item)) { PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected str instance," + "sequence item %" PY_FORMAT_SIZE_T + "d: expected str instance," " %.80s found", i, Py_TYPE(item)->tp_name); goto onError; @@ -14440,7 +14452,7 @@ default: PyErr_Format(PyExc_ValueError, "unsupported format character '%c' (0x%x) " - "at index %zd", + "at index %" PY_FORMAT_SIZE_T "d", (31<=arg->ch && arg->ch<=126) ? (char)arg->ch : '?', (int)arg->ch, ctx->fmtpos - 1); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 08:58:08 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 08:58:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgQ2xvc2VzICMyMTg5MiwgIzIxODkzOiBVc2UgUFlf?= =?utf-8?q?FORMAT=5FSIZE=5FT_instead_of_=25zi_or_=25zu?= Message-ID: <3h2bxX4cxqz7LkS@mail.python.org> http://hg.python.org/cpython/rev/669b43bffd87 changeset: 91502:669b43bffd87 parent: 91500:fc527ecb4487 parent: 91501:4f55e802baf0 user: Victor Stinner date: Tue Jul 01 08:57:54 2014 +0200 summary: (Merge 3.4) Closes #21892, #21893: Use PY_FORMAT_SIZE_T instead of %zi or %zu to format C size_t, because %zi/%u is not supported on all platforms. files: Modules/hashtable.c | 5 ++- Objects/unicodeobject.c | 34 +++++++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/Modules/hashtable.c b/Modules/hashtable.c --- a/Modules/hashtable.c +++ b/Modules/hashtable.c @@ -233,11 +233,12 @@ nchains++; } } - printf("hash table %p: entries=%zu/%zu (%.0f%%), ", + printf("hash table %p: entries=%" + PY_FORMAT_SIZE_T "u/%" PY_FORMAT_SIZE_T "u (%.0f%%), ", ht, ht->entries, ht->num_buckets, load * 100.0); if (nchains) printf("avg_chain_len=%.1f, ", (double)total_chain_len / nchains); - printf("max_chain_len=%zu, %zu kB\n", + printf("max_chain_len=%" PY_FORMAT_SIZE_T "u, %" PY_FORMAT_SIZE_T "u kB\n", max_chain_len, size / 1024); } #endif diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1011,17 +1011,19 @@ } else data = unicode->data.any; - printf("%s: len=%zu, ",unicode_kind_name(op), ascii->length); + printf("%s: len=%" PY_FORMAT_SIZE_T "u, ", + 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); + printf(" (%" PY_FORMAT_SIZE_T "u), ", compact->wstr_length); if (!ascii->state.compact && compact->utf8 == unicode->data.any) printf("shared "); - printf("utf8=%p (%zu)", compact->utf8, compact->utf8_length); + printf("utf8=%p (%" PY_FORMAT_SIZE_T "u)", + compact->utf8, compact->utf8_length); } printf(", data=%p\n", data); } @@ -1370,8 +1372,9 @@ 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", + "Cannot write %" PY_FORMAT_SIZE_T "i characters at %" + PY_FORMAT_SIZE_T "i in a string of %" + PY_FORMAT_SIZE_T "i characters", how_many, to_start, PyUnicode_GET_LENGTH(to)); return -1; } @@ -4080,7 +4083,9 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", newpos); goto onError; } @@ -4173,7 +4178,9 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", newpos); goto onError; } @@ -6436,7 +6443,9 @@ if (*newpos<0) *newpos = len + *newpos; if (*newpos<0 || *newpos>len) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -8436,7 +8445,9 @@ else *newpos = i_newpos; if (*newpos<0 || *newpos>PyUnicode_GET_LENGTH(unicode)) { - PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, + "position %" PY_FORMAT_SIZE_T + "d from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -9764,7 +9775,8 @@ item = items[i]; if (!PyUnicode_Check(item)) { PyErr_Format(PyExc_TypeError, - "sequence item %zd: expected str instance," + "sequence item %" PY_FORMAT_SIZE_T + "d: expected str instance," " %.80s found", i, Py_TYPE(item)->tp_name); goto onError; @@ -14454,7 +14466,7 @@ default: PyErr_Format(PyExc_ValueError, "unsupported format character '%c' (0x%x) " - "at index %zd", + "at index %" PY_FORMAT_SIZE_T "d", (31<=arg->ch && arg->ch<=126) ? (char)arg->ch : '?', (int)arg->ch, ctx->fmtpos - 1); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Jul 1 10:06:43 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 01 Jul 2014 10:06:43 +0200 Subject: [Python-checkins] Daily reference leaks (b3f4616b9a94): sum=17 Message-ID: results for b3f4616b9a94 on branch "default" -------------------------------------------- test_asyncio leaked [4, 0, 0] memory blocks, sum=4 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_io leaked [2, 2, 2] references, sum=6 test_site leaked [0, 2, 0] references, sum=2 test_site leaked [0, 2, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogsBcLJ0', '-x'] From python-checkins at python.org Tue Jul 1 12:39:40 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 12:39:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogRml4?= =?utf-8?q?_test=5Fsleep=5Fcancel=28=29=3A_call=5Flater=28=29_mock_has_no_?= =?utf-8?q?self_parameter?= Message-ID: <3h2hs80qWFz7Lkn@mail.python.org> http://hg.python.org/cpython/rev/9b9ea48a76a5 changeset: 91503:9b9ea48a76a5 branch: 3.4 parent: 91501:4f55e802baf0 user: Victor Stinner date: Tue Jul 01 12:38:51 2014 +0200 summary: asyncio: Fix test_sleep_cancel(): call_later() mock has no self parameter files: Lib/test/test_asyncio/test_tasks.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -993,9 +993,9 @@ handle = None orig_call_later = loop.call_later - def call_later(self, delay, callback, *args): + def call_later(delay, callback, *args): nonlocal handle - handle = orig_call_later(self, delay, callback, *args) + handle = orig_call_later(delay, callback, *args) return handle loop.call_later = call_later -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 12:39:41 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 12:39:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgYXN5bmNpbzogRml4IHRlc3Rfc2xlZXBfY2FuY2Vs?= =?utf-8?b?KCk6IGNhbGxfbGF0ZXIoKSBtb2NrIGhhcyBubyBzZWxm?= Message-ID: <3h2hs92Vv8z7LkS@mail.python.org> http://hg.python.org/cpython/rev/2e0a98178c07 changeset: 91504:2e0a98178c07 parent: 91502:669b43bffd87 parent: 91503:9b9ea48a76a5 user: Victor Stinner date: Tue Jul 01 12:39:26 2014 +0200 summary: (Merge 3.4) asyncio: Fix test_sleep_cancel(): call_later() mock has no self parameter files: Lib/test/test_asyncio/test_tasks.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -993,9 +993,9 @@ handle = None orig_call_later = loop.call_later - def call_later(self, delay, callback, *args): + def call_later(delay, callback, *args): nonlocal handle - handle = orig_call_later(self, delay, callback, *args) + handle = orig_call_later(delay, callback, *args) return handle loop.call_later = call_later -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 16:38:32 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 16:38:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzgx?= =?utf-8?q?=3A_Make_the_ssl_module_=22ssize=5Ft_clean=22_for_parsing_param?= =?utf-8?q?eters=2E?= Message-ID: <3h2p8m517vz7LjP@mail.python.org> http://hg.python.org/cpython/rev/36e884e65e45 changeset: 91505:36e884e65e45 branch: 3.4 parent: 91503:9b9ea48a76a5 user: Victor Stinner date: Tue Jul 01 16:37:17 2014 +0200 summary: Issue #21781: Make the ssl module "ssize_t clean" for parsing parameters. ssl.RAND_add() now supports strings longer than 2 GB. files: Misc/NEWS | 2 ++ Modules/_ssl.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,8 @@ Library ------- +- Issue #21781: ssl.RAND_add() now supports strings longer than 2 GB. + - Issue #11453: asyncore: emit a ResourceWarning when an unclosed file_wrapper object is destroyed. The destructor now closes the file if needed. The close() method can now be called twice: the second call does nothing. diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -14,6 +14,8 @@ http://bugs.python.org/issue8108#msg102867 ? */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #ifdef WITH_THREAD @@ -3235,12 +3237,17 @@ PySSL_RAND_add(PyObject *self, PyObject *args) { char *buf; - int len; + Py_ssize_t len, written; double entropy; if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy)) return NULL; - RAND_add(buf, len, entropy); + do { + written = Py_MIN(len, INT_MAX); + RAND_add(buf, (int)written, entropy); + buf += written; + len -= written; + } while (len); Py_INCREF(Py_None); return Py_None; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 16:39:34 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 16:39:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2321781=3A_Make_the_ssl_module_?= =?utf-8?q?=22ssize=5Ft_clean=22_for_parsing?= Message-ID: <3h2p9y3nQ1z7LjP@mail.python.org> http://hg.python.org/cpython/rev/26afcb8a87b9 changeset: 91506:26afcb8a87b9 parent: 91504:2e0a98178c07 parent: 91505:36e884e65e45 user: Victor Stinner date: Tue Jul 01 16:39:23 2014 +0200 summary: (Merge 3.4) Issue #21781: Make the ssl module "ssize_t clean" for parsing parameters. ssl.RAND_add() now supports strings longer than 2 GB. files: Misc/NEWS | 2 ++ Modules/_ssl.c | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -103,6 +103,8 @@ Library ------- +- Issue #21781: ssl.RAND_add() now supports strings longer than 2 GB. + - Issue #21679: Prevent extraneous fstat() calls during open(). Patch by Bohuslav Kabrda. diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -14,6 +14,8 @@ http://bugs.python.org/issue8108#msg102867 ? */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #ifdef WITH_THREAD @@ -3233,12 +3235,17 @@ PySSL_RAND_add(PyObject *self, PyObject *args) { char *buf; - int len; + Py_ssize_t len, written; double entropy; if (!PyArg_ParseTuple(args, "s#d:RAND_add", &buf, &len, &entropy)) return NULL; - RAND_add(buf, len, entropy); + do { + written = Py_MIN(len, INT_MAX); + RAND_add(buf, (int)written, entropy); + buf += written; + len -= written; + } while (len); Py_INCREF(Py_None); return Py_None; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 16:47:04 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 16:47:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQ2xvc2VzICMyMTc4?= =?utf-8?q?0=3A_make_the_unicodedata_module_=22ssize=5Ft_clean=22_for_pars?= =?utf-8?q?ing?= Message-ID: <3h2pLc2h7gz7LjP@mail.python.org> http://hg.python.org/cpython/rev/b82ff2d7f5ef changeset: 91507:b82ff2d7f5ef branch: 3.4 parent: 91505:36e884e65e45 user: Victor Stinner date: Tue Jul 01 16:45:52 2014 +0200 summary: Closes #21780: make the unicodedata module "ssize_t clean" for parsing parameters files: Modules/unicodedata.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -13,6 +13,8 @@ ------------------------------------------------------------------------ */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #include "ucnhash.h" #include "structmember.h" @@ -1271,12 +1273,16 @@ Py_UCS4 code; char* name; - int namelen; + Py_ssize_t namelen; unsigned int index; if (!PyArg_ParseTuple(args, "s#:lookup", &name, &namelen)) return NULL; + if (namelen > INT_MAX) { + PyErr_SetString(PyExc_KeyError, "name too long"); + return NULL; + } - if (!_getcode(self, name, namelen, &code, 1)) { + if (!_getcode(self, name, (int)namelen, &code, 1)) { PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 16:47:05 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 16:47:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Closes_=2321780=3A_make_the_unicodedat?= =?utf-8?q?a_module_=22ssize=5Ft_clean=22_for?= Message-ID: <3h2pLd4PV3z7Ljl@mail.python.org> http://hg.python.org/cpython/rev/afd64e660628 changeset: 91508:afd64e660628 parent: 91506:26afcb8a87b9 parent: 91507:b82ff2d7f5ef user: Victor Stinner date: Tue Jul 01 16:46:12 2014 +0200 summary: (Merge 3.4) Closes #21780: make the unicodedata module "ssize_t clean" for parsing parameters files: Modules/unicodedata.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -13,6 +13,8 @@ ------------------------------------------------------------------------ */ +#define PY_SSIZE_T_CLEAN + #include "Python.h" #include "ucnhash.h" #include "structmember.h" @@ -1271,12 +1273,16 @@ Py_UCS4 code; char* name; - int namelen; + Py_ssize_t namelen; unsigned int index; if (!PyArg_ParseTuple(args, "s#:lookup", &name, &namelen)) return NULL; + if (namelen > INT_MAX) { + PyErr_SetString(PyExc_KeyError, "name too long"); + return NULL; + } - if (!_getcode(self, name, namelen, &code, 1)) { + if (!_getcode(self, name, (int)namelen, &code, 1)) { PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 16:49:02 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 16:49:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzg2Nzc6?= =?utf-8?q?_make_the_zlib_module_=22ssize=5Ft_clean=22_for_parsing_paramet?= =?utf-8?q?ers?= Message-ID: <3h2pNt6xVPz7LjP@mail.python.org> http://hg.python.org/cpython/rev/691ca1694fe7 changeset: 91509:691ca1694fe7 branch: 3.4 parent: 91507:b82ff2d7f5ef user: Victor Stinner date: Tue Jul 01 16:48:12 2014 +0200 summary: Issue #8677: make the zlib module "ssize_t clean" for parsing parameters files: Modules/zlibmodule.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -3,6 +3,7 @@ /* Windows users: read Python's PCbuild\readme.txt */ +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "structmember.h" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 16:49:04 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 1 Jul 2014 16:49:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=238677=3A_make_the_zlib_module_?= =?utf-8?q?=22ssize=5Ft_clean=22_for_parsing?= Message-ID: <3h2pNw1Q2lz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/45dcdd8f3211 changeset: 91510:45dcdd8f3211 parent: 91508:afd64e660628 parent: 91509:691ca1694fe7 user: Victor Stinner date: Tue Jul 01 16:48:42 2014 +0200 summary: (Merge 3.4) Issue #8677: make the zlib module "ssize_t clean" for parsing parameters files: Modules/zlibmodule.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c --- a/Modules/zlibmodule.c +++ b/Modules/zlibmodule.c @@ -3,6 +3,7 @@ /* Windows users: read Python's PCbuild\readme.txt */ +#define PY_SSIZE_T_CLEAN #include "Python.h" #include "structmember.h" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 1 21:31:13 2014 From: python-checkins at python.org (zach.ware) Date: Tue, 1 Jul 2014 21:31:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE0MDk3?= =?utf-8?q?=3A_Backport_796d1371605d_and_subsequent_changes=2E?= Message-ID: <3h2wfT2tghz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/438da6ae38fa changeset: 91511:438da6ae38fa branch: 2.7 parent: 91496:a7f943a13f7f user: Zachary Ware date: Tue Jul 01 14:25:34 2014 -0500 summary: Issue #14097: Backport 796d1371605d and subsequent changes. The 2.7 tutorial introduction now matches the 3.x introduction as rewritten by Ezio Melotti, with appropriate changes for 2.x. files: Doc/tutorial/introduction.rst | 560 ++++++++++----------- 1 files changed, 269 insertions(+), 291 deletions(-) diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -5,7 +5,7 @@ ********************************** In the following examples, input and output are distinguished by the presence or -absence of prompts (``>>>`` and ``...``): to repeat the example, you must type +absence of prompts (:term:`>>>` and :term:`...`): to repeat the example, you must type everything after the prompt, when the prompt appears; lines that do not begin with a prompt are output from the interpreter. Note that a secondary prompt on a line by itself in an example means you must type a blank line; this is used to @@ -22,9 +22,9 @@ Some examples:: # this is the first comment - SPAM = 1 # and this is the second comment - # ... and now a third! - STRING = "# This is not a comment." + spam = 1 # and this is the second comment + # ... and now a third! + text = "# This is not a comment because it's inside quotes." .. _tut-calculator: @@ -44,43 +44,57 @@ The interpreter acts as a simple calculator: you can type an expression at it and it will write the value. Expression syntax is straightforward: the operators ``+``, ``-``, ``*`` and ``/`` work just like in most other languages -(for example, Pascal or C); parentheses can be used for grouping. For example:: +(for example, Pascal or C); parentheses (``()``) can be used for grouping. +For example:: - >>> 2+2 + >>> 2 + 2 4 - >>> # This is a comment - ... 2+2 - 4 - >>> 2+2 # and a comment on the same line as code - 4 - >>> (50-5*6)/4 + >>> 50 - 5*6 + 20 + >>> (50 - 5.0*6) / 4 + 5.0 + >>> 8 / 5.0 + 1.6 + +The integer numbers (e.g. ``2``, ``4``, ``20``) have type :class:`int`, +the ones with a fractional part (e.g. ``5.0``, ``1.6``) have type +:class:`float`. We will see more about numeric types later in the tutorial. + +The return type of a division (``/``) operation depends on its operands. If +both operands are of type :class:`int`, :term:`floor division` is performed +and an :class:`int` is returned. If either operand is a :class:`float`, +classic division is performed and a :class:`float` is returned. The ``//`` +operator is also provided for doing floor division no matter what the +operands are. The remainder can be calculated with the ``%`` operator:: + + >>> 17 / 3 # int / int -> int 5 - >>> # Integer division returns the floor: - ... 7/3 + >>> 17 / 3.0 # int / float -> float + 5.666666666666667 + >>> 17 // 3.0 # explicit floor division discards the fractional part + 5.0 + >>> 17 % 3 # the % operator returns the remainder of the division 2 - >>> 7/-3 - -3 + >>> 5 * 3 + 2 # result * divisor + remainder + 17 -The equal sign (``'='``) is used to assign a value to a variable. Afterwards, no +With Python, it is possible to use the ``**`` operator to calculate powers [#]_:: + + >>> 5 ** 2 # 5 squared + 25 + >>> 2 ** 7 # 2 to the power of 7 + 128 + +The equal sign (``=``) is used to assign a value to a variable. Afterwards, no result is displayed before the next interactive prompt:: >>> width = 20 - >>> height = 5*9 + >>> height = 5 * 9 >>> width * height 900 -A value can be assigned to several variables simultaneously:: - - >>> x = y = z = 0 # Zero x, y and z - >>> x - 0 - >>> y - 0 - >>> z - 0 - -Variables must be "defined" (assigned a value) before they can be used, or an -error will occur:: +If a variable is not "defined" (assigned a value), trying to use it will +give you an error:: >>> n # try to access an undefined variable Traceback (most recent call last): @@ -95,49 +109,6 @@ >>> 7.0 / 2 3.5 -Complex numbers are also supported; imaginary numbers are written with a suffix -of ``j`` or ``J``. Complex numbers with a nonzero real component are written as -``(real+imagj)``, or can be created with the ``complex(real, imag)`` function. -:: - - >>> 1j * 1J - (-1+0j) - >>> 1j * complex(0,1) - (-1+0j) - >>> 3+1j*3 - (3+3j) - >>> (3+1j)*3 - (9+3j) - >>> (1+2j)/(1+1j) - (1.5+0.5j) - -Complex numbers are always represented as two floating point numbers, the real -and imaginary part. To extract these parts from a complex number *z*, use -``z.real`` and ``z.imag``. :: - - >>> a=1.5+0.5j - >>> a.real - 1.5 - >>> a.imag - 0.5 - -The conversion functions to floating point and integer (:func:`float`, -:func:`int` and :func:`long`) don't work for complex numbers --- there is no one -correct way to convert a complex number to a real number. Use ``abs(z)`` to get -its magnitude (as a float) or ``z.real`` to get its real part. :: - - >>> a=3.0+4.0j - >>> float(a) - Traceback (most recent call last): - File "", line 1, in ? - TypeError: can't convert complex to float; use abs(z) - >>> a.real - 3.0 - >>> a.imag - 4.0 - >>> abs(a) # sqrt(a.real**2 + a.imag**2) - 5.0 - In interactive mode, the last printed expression is assigned to the variable ``_``. This means that when you are using Python as a desk calculator, it is somewhat easier to continue calculations, for example:: @@ -155,20 +126,28 @@ assign a value to it --- you would create an independent local variable with the same name masking the built-in variable with its magic behavior. +In addition to :class:`int` and :class:`float`, Python supports other types of +numbers, such as :class:`~decimal.Decimal` and :class:`~fractions.Fraction`. +Python also has built-in support for :ref:`complex numbers `, +and uses the ``j`` or ``J`` suffix to indicate the imaginary part +(e.g. ``3+5j``). + .. _tut-strings: Strings ------- -Besides numbers, Python can also manipulate strings, which can be expressed in -several ways. They can be enclosed in single quotes or double quotes:: +Besides numbers, Python can also manipulate strings, which can be expressed +in several ways. They can be enclosed in single quotes (``'...'``) or +double quotes (``"..."``) with the same result [#]_. ``\`` can be used +to escape quotes:: - >>> 'spam eggs' + >>> 'spam eggs' # single quotes 'spam eggs' - >>> 'doesn\'t' + >>> 'doesn\'t' # use \' to escape the single quote... "doesn't" - >>> "doesn't" + >>> "doesn't" # ...or use double quotes instead "doesn't" >>> '"Yes," he said.' '"Yes," he said.' @@ -177,45 +156,48 @@ >>> '"Isn\'t," she said.' '"Isn\'t," she said.' -The interpreter prints the result of string operations in the same way as they -are typed for input: inside quotes, and with quotes and other funny characters -escaped by backslashes, to show the precise value. The string is enclosed in -double quotes if the string contains a single quote and no double quotes, else -it's enclosed in single quotes. The :keyword:`print` statement produces a more -readable output for such input strings. +In the interactive interpreter, the output string is enclosed in quotes and +special characters are escaped with backslashes. While this might sometimes +look different from the input (the enclosing quotes could change), the two +strings are equivalent. The string is enclosed in double quotes if +the string contains a single quote and no double quotes, otherwise it is +enclosed in single quotes. The :keyword:`print` statement produces a more +readable output, by omitting the enclosing quotes and by printing escaped +and special characters:: -String literals can span multiple lines in several ways. Continuation lines can -be used, with a backslash as the last character on the line indicating that the -next line is a logical continuation of the line:: + >>> '"Isn\'t," she said.' + '"Isn\'t," she said.' + >>> print '"Isn\'t," she said.' + "Isn't," she said. + >>> s = 'First line.\nSecond line.' # \n means newline + >>> s # without print(), \n is included in the output + 'First line.\nSecond line.' + >>> print s # with print, \n produces a new line + First line. + Second line. - hello = "This is a rather long string containing\n\ - several lines of text just as you would do in C.\n\ - Note that whitespace at the beginning of the line is\ - significant." +If you don't want characters prefaced by ``\`` to be interpreted as +special characters, you can use *raw strings* by adding an ``r`` before +the first quote:: - print hello + >>> print 'C:\some\name' # here \n means newline! + C:\some + ame + >>> print r'C:\some\name' # note the r before the quote + C:\some\name -Note that newlines still need to be embedded in the string using ``\n`` -- the -newline following the trailing backslash is discarded. This example would print -the following: +String literals can span multiple lines. One way is using triple-quotes: +``"""..."""`` or ``'''...'''``. End of lines are automatically +included in the string, but it's possible to prevent this by adding a ``\`` at +the end of the line. The following example:: -.. code-block:: text - - This is a rather long string containing - several lines of text just as you would do in C. - Note that whitespace at the beginning of the line is significant. - -Or, strings can be surrounded in a pair of matching triple-quotes: ``"""`` or -``'''``. End of lines do not need to be escaped when using triple-quotes, but -they will be included in the string. :: - - print """ + print """\ Usage: thingy [OPTIONS] -h Display this usage message -H hostname Hostname to connect to """ -produces the following output: +produces the following output (note that the initial newline is not included): .. code-block:: text @@ -223,142 +205,100 @@ -h Display this usage message -H hostname Hostname to connect to -If we make the string literal a "raw" string, ``\n`` sequences are not converted -to newlines, but the backslash at the end of the line, and the newline character -in the source, are both included in the string as data. Thus, the example:: - - hello = r"This is a rather long string containing\n\ - several lines of text much as you would do in C." - - print hello - -would print: - -.. code-block:: text - - This is a rather long string containing\n\ - several lines of text much as you would do in C. - Strings can be concatenated (glued together) with the ``+`` operator, and repeated with ``*``:: - >>> word = 'Help' + 'A' - >>> word - 'HelpA' - >>> '<' + word*5 + '>' - '' + >>> # 3 times 'un', followed by 'ium' + >>> 3 * 'un' + 'ium' + 'unununium' -Two string literals next to each other are automatically concatenated; the first -line above could also have been written ``word = 'Help' 'A'``; this only works -with two literals, not with arbitrary string expressions:: +Two or more *string literals* (i.e. the ones enclosed between quotes) next +to each other are automatically concatenated. :: - >>> 'str' 'ing' # <- This is ok - 'string' - >>> 'str'.strip() + 'ing' # <- This is ok - 'string' - >>> 'str'.strip() 'ing' # <- This is invalid - File "", line 1, in ? - 'str'.strip() 'ing' - ^ + >>> 'Py' 'thon' + 'Python' + +This only works with two literals though, not with variables or expressions:: + + >>> prefix = 'Py' + >>> prefix 'thon' # can't concatenate a variable and a string literal + ... + SyntaxError: invalid syntax + >>> ('un' * 3) 'ium' + ... SyntaxError: invalid syntax -Strings can be subscripted (indexed); like in C, the first character of a string -has subscript (index) 0. There is no separate character type; a character is -simply a string of size one. Like in Icon, substrings can be specified with the -*slice notation*: two indices separated by a colon. :: +If you want to concatenate variables or a variable and a literal, use ``+``:: - >>> word[4] - 'A' - >>> word[0:2] - 'He' - >>> word[2:4] - 'lp' + >>> prefix + 'thon' + 'Python' + +This feature is particularly useful when you want to break long strings:: + + >>> text = ('Put several strings within parentheses ' + 'to have them joined together.') + >>> text + 'Put several strings within parentheses to have them joined together.' + +Strings can be *indexed* (subscripted), with the first character having index 0. +There is no separate character type; a character is simply a string of size +one:: + + >>> word = 'Python' + >>> word[0] # character in position 0 + 'P' + >>> word[5] # character in position 5 + 'n' + +Indices may also be negative numbers, to start counting from the right:: + + >>> word[-1] # last character + 'n' + >>> word[-2] # second-last character + 'o' + >>> word[-6] + 'P' + +Note that since -0 is the same as 0, negative indices start from -1. + +In addition to indexing, *slicing* is also supported. While indexing is used +to obtain individual characters, *slicing* allows you to obtain a substring:: + + >>> word[0:2] # characters from position 0 (included) to 2 (excluded) + 'Py' + >>> word[2:5] # characters from position 2 (included) to 5 (excluded) + 'tho' + +Note how the start is always included, and the end always excluded. This +makes sure that ``s[:i] + s[i:]`` is always equal to ``s``:: + + >>> word[:2] + word[2:] + 'Python' + >>> word[:4] + word[4:] + 'Python' Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults to the size of the string being sliced. :: - >>> word[:2] # The first two characters - 'He' - >>> word[2:] # Everything except the first two characters - 'lpA' - -Unlike a C string, Python strings cannot be changed. Assigning to an indexed -position in the string results in an error:: - - >>> word[0] = 'x' - Traceback (most recent call last): - File "", line 1, in ? - TypeError: object does not support item assignment - >>> word[:1] = 'Splat' - Traceback (most recent call last): - File "", line 1, in ? - TypeError: object does not support slice assignment - -However, creating a new string with the combined content is easy and efficient:: - - >>> 'x' + word[1:] - 'xelpA' - >>> 'Splat' + word[4] - 'SplatA' - -Here's a useful invariant of slice operations: ``s[:i] + s[i:]`` equals ``s``. -:: - - >>> word[:2] + word[2:] - 'HelpA' - >>> word[:3] + word[3:] - 'HelpA' - -Degenerate slice indices are handled gracefully: an index that is too large is -replaced by the string size, an upper bound smaller than the lower bound returns -an empty string. :: - - >>> word[1:100] - 'elpA' - >>> word[10:] - '' - >>> word[2:1] - '' - -Indices may be negative numbers, to start counting from the right. For example:: - - >>> word[-1] # The last character - 'A' - >>> word[-2] # The last-but-one character - 'p' - >>> word[-2:] # The last two characters - 'pA' - >>> word[:-2] # Everything except the last two characters - 'Hel' - -But note that -0 is really the same as 0, so it does not count from the right! -:: - - >>> word[-0] # (since -0 equals 0) - 'H' - -Out-of-range negative slice indices are truncated, but don't try this for -single-element (non-slice) indices:: - - >>> word[-100:] - 'HelpA' - >>> word[-10] # error - Traceback (most recent call last): - File "", line 1, in ? - IndexError: string index out of range + >>> word[:2] # character from the beginning to position 2 (excluded) + 'Py' + >>> word[4:] # characters from position 4 (included) to the end + 'on' + >>> word[-2:] # characters from the second-last (included) to the end + 'on' One way to remember how slices work is to think of the indices as pointing *between* characters, with the left edge of the first character numbered 0. Then the right edge of the last character of a string of *n* characters has index *n*, for example:: - +---+---+---+---+---+ - | H | e | l | p | A | - +---+---+---+---+---+ - 0 1 2 3 4 5 - -5 -4 -3 -2 -1 + +---+---+---+---+---+---+ + | P | y | t | h | o | n | + +---+---+---+---+---+---+ + 0 1 2 3 4 5 6 + -6 -5 -4 -3 -2 -1 -The first row of numbers gives the position of the indices 0...5 in the string; +The first row of numbers gives the position of the indices 0...6 in the string; the second row gives the corresponding negative indices. The slice from *i* to *j* consists of all characters between the edges labeled *i* and *j*, respectively. @@ -367,6 +307,38 @@ indices, if both are within bounds. For example, the length of ``word[1:3]`` is 2. +Attempting to use a index that is too large will result in an error:: + + >>> word[42] # the word only has 7 characters + Traceback (most recent call last): + File "", line 1, in + IndexError: string index out of range + +However, out of range slice indexes are handled gracefully when used for +slicing:: + + >>> word[4:42] + 'on' + >>> word[42:] + '' + +Python strings cannot be changed --- they are :term:`immutable`. +Therefore, assigning to an indexed position in the string results in an error:: + + >>> word[0] = 'J' + ... + TypeError: 'str' object does not support item assignment + >>> word[2:] = 'py' + ... + TypeError: 'str' object does not support item assignment + +If you need a different string, you should create a new one:: + + >>> 'J' + word[1:] + 'Jython' + >>> word[:2] + 'py' + 'Pypy' + The built-in function :func:`len` returns the length of a string:: >>> s = 'supercalifragilisticexpialidocious' @@ -499,94 +471,89 @@ Python knows a number of *compound* data types, used to group together other values. The most versatile is the *list*, which can be written as a list of -comma-separated values (items) between square brackets. List items need not all -have the same type. :: +comma-separated values (items) between square brackets. Lists might contain +items of different types, but usually the items all have the same type. :: - >>> a = ['spam', 'eggs', 100, 1234] - >>> a - ['spam', 'eggs', 100, 1234] + >>> squares = [1, 4, 9, 16, 25] + >>> squares + [1, 4, 9, 16, 25] -Like string indices, list indices start at 0, and lists can be sliced, -concatenated and so on:: +Like strings (and all other built-in :term:`sequence` type), lists can be +indexed and sliced:: - >>> a[0] - 'spam' - >>> a[3] - 1234 - >>> a[-2] - 100 - >>> a[1:-1] - ['eggs', 100] - >>> a[:2] + ['bacon', 2*2] - ['spam', 'eggs', 'bacon', 4] - >>> 3*a[:3] + ['Boo!'] - ['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!'] + >>> squares[0] # indexing returns the item + 1 + >>> squares[-1] + 25 + >>> squares[-3:] # slicing returns a new list + [9, 16, 25] All slice operations return a new list containing the requested elements. This -means that the following slice returns a shallow copy of the list *a*:: +means that the following slice returns a new (shallow) copy of the list:: - >>> a[:] - ['spam', 'eggs', 100, 1234] + >>> squares[:] + [1, 4, 9, 16, 25] -Unlike strings, which are *immutable*, it is possible to change individual -elements of a list:: +Lists also supports operations like concatenation:: - >>> a - ['spam', 'eggs', 100, 1234] - >>> a[2] = a[2] + 23 - >>> a - ['spam', 'eggs', 123, 1234] + >>> squares + [36, 49, 64, 81, 100] + [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] + +Unlike strings, which are :term:`immutable`, lists are a :term:`mutable` +type, i.e. it is possible to change their content:: + + >>> cubes = [1, 8, 27, 65, 125] # something's wrong here + >>> 4 ** 3 # the cube of 4 is 64, not 65! + 64 + >>> cubes[3] = 64 # replace the wrong value + >>> cubes + [1, 8, 27, 64, 125] + +You can also add new items at the end of the list, by using +the :meth:`~list.append` *method* (we will see more about methods later):: + + >>> cubes.append(216) # add the cube of 6 + >>> cubes.append(7 ** 3) # and the cube of 7 + >>> cubes + [1, 8, 27, 64, 125, 216, 343] Assignment to slices is also possible, and this can even change the size of the list or clear it entirely:: - >>> # Replace some items: - ... a[0:2] = [1, 12] - >>> a - [1, 12, 123, 1234] - >>> # Remove some: - ... a[0:2] = [] - >>> a - [123, 1234] - >>> # Insert some: - ... a[1:1] = ['bletch', 'xyzzy'] - >>> a - [123, 'bletch', 'xyzzy', 1234] - >>> # Insert (a copy of) itself at the beginning - >>> a[:0] = a - >>> a - [123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234] - >>> # Clear the list: replace all items with an empty list - >>> a[:] = [] - >>> a + >>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] + >>> letters + ['a', 'b', 'c', 'd', 'e', 'f', 'g'] + >>> # replace some values + >>> letters[2:5] = ['C', 'D', 'E'] + >>> letters + ['a', 'b', 'C', 'D', 'E', 'f', 'g'] + >>> # now remove them + >>> letters[2:5] = [] + >>> letters + ['a', 'b', 'f', 'g'] + >>> # clear the list by replacing all the elements with an empty list + >>> letters[:] = [] + >>> letters [] The built-in function :func:`len` also applies to lists:: - >>> a = ['a', 'b', 'c', 'd'] - >>> len(a) + >>> letters = ['a', 'b', 'c', 'd'] + >>> len(letters) 4 It is possible to nest lists (create lists containing other lists), for example:: - >>> q = [2, 3] - >>> p = [1, q, 4] - >>> len(p) - 3 - >>> p[1] - [2, 3] - >>> p[1][0] - 2 - >>> p[1].append('xtra') # See section 5.1 - >>> p - [1, [2, 3, 'xtra'], 4] - >>> q - [2, 3, 'xtra'] - -Note that in the last example, ``p[1]`` and ``q`` really refer to the same -object! We'll come back to *object semantics* later. - + >>> a = ['a', 'b', 'c'] + >>> n = [1, 2, 3] + >>> x = [a, n] + >>> x + [['a', 'b', 'c'], [1, 2, 3]] + >>> x[0] + ['a', 'b', 'c'] + >>> x[0][1] + 'b' .. _tut-firststeps: @@ -658,3 +625,14 @@ Note that the interpreter inserts a newline before it prints the next prompt if the last line was not completed. + +.. rubric:: Footnotes + +.. [#] Since ``**`` has higher precedence than ``-``, ``-3**2`` will be + interpreted as ``-(3**2)`` and thus result in ``-9``. To avoid this + and get ``9``, you can use ``(-3)**2``. + +.. [#] Unlike other languages, special characters such as ``\n`` have the + same meaning with both single (``'...'``) and double (``"..."``) quotes. + The only difference between the two is that within single quotes you don't + need to escape ``"`` (but you have to escape ``\'``) and vice versa. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 00:53:22 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 2 Jul 2014 00:53:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Delete_a_few_u?= =?utf-8?q?nused_names_suggested_by_pyflakes=2E?= Message-ID: <3h317k22Q1z7LjP@mail.python.org> http://hg.python.org/cpython/rev/962c1fefc34a changeset: 91512:962c1fefc34a branch: 2.7 user: Terry Jan Reedy date: Tue Jul 01 18:52:31 2014 -0400 summary: Delete a few unused names suggested by pyflakes. files: Lib/idlelib/CallTipWindow.py | 12 +++++++----- Lib/idlelib/ClassBrowser.py | 2 +- Lib/idlelib/Debugger.py | 1 - Lib/idlelib/configHandler.py | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Lib/idlelib/CallTipWindow.py b/Lib/idlelib/CallTipWindow.py --- a/Lib/idlelib/CallTipWindow.py +++ b/Lib/idlelib/CallTipWindow.py @@ -2,9 +2,8 @@ After ToolTip.py, which uses ideas gleaned from PySol Used by the CallTips IDLE extension. - """ -from Tkinter import * +from Tkinter import Toplevel, Label, LEFT, SOLID, TclError HIDE_VIRTUAL_EVENT_NAME = "<>" HIDE_SEQUENCES = ("", "") @@ -133,13 +132,16 @@ return bool(self.tipwindow) -def _calltip_window(parent): +def _calltip_window(parent): # htest # + import re + from Tkinter import Tk, Text, LEFT, BOTH + root = Tk() root.title("Test calltips") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d"%(x, y + 150)) - class MyEditWin: # comparenceptually an editor_window + class MyEditWin: # conceptually an editor_window def __init__(self): text = self.text = Text(root) text.pack(side=LEFT, fill=BOTH, expand=1) @@ -161,7 +163,7 @@ def calltip_hide(self, event): self.calltip.hidetip() - editwin = MyEditWin() + MyEditWin() if __name__=='__main__': from idlelib.idle_test.htest import run diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py --- a/Lib/idlelib/ClassBrowser.py +++ b/Lib/idlelib/ClassBrowser.py @@ -101,7 +101,7 @@ return [] try: dict = pyclbr.readmodule_ex(name, [dir] + sys.path) - except ImportError, msg: + except ImportError: return [] items = [] self.classes = {} diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py --- a/Lib/idlelib/Debugger.py +++ b/Lib/idlelib/Debugger.py @@ -1,6 +1,5 @@ import os import bdb -import types from Tkinter import * from idlelib.WindowList import ListedToplevel from idlelib.ScrolledList import ScrolledList diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py --- a/Lib/idlelib/configHandler.py +++ b/Lib/idlelib/configHandler.py @@ -20,7 +20,7 @@ import os import sys import string -from ConfigParser import ConfigParser, NoOptionError, NoSectionError +from ConfigParser import ConfigParser class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 00:53:23 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 2 Jul 2014 00:53:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Delete_a_few_u?= =?utf-8?q?nused_names_suggested_by_pyflakes=2E?= Message-ID: <3h317l3rsyz7LjP@mail.python.org> http://hg.python.org/cpython/rev/b836a0cd68f7 changeset: 91513:b836a0cd68f7 branch: 3.4 parent: 91509:691ca1694fe7 user: Terry Jan Reedy date: Tue Jul 01 18:52:37 2014 -0400 summary: Delete a few unused names suggested by pyflakes. files: Lib/idlelib/CallTipWindow.py | 12 +++++++----- Lib/idlelib/ClassBrowser.py | 2 +- Lib/idlelib/Debugger.py | 1 - Lib/idlelib/configDialog.py | 3 +-- Lib/idlelib/configHandler.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/CallTipWindow.py b/Lib/idlelib/CallTipWindow.py --- a/Lib/idlelib/CallTipWindow.py +++ b/Lib/idlelib/CallTipWindow.py @@ -2,9 +2,8 @@ After ToolTip.py, which uses ideas gleaned from PySol Used by the CallTips IDLE extension. - """ -from tkinter import * +from tkinter import Toplevel, Label, LEFT, SOLID, TclError HIDE_VIRTUAL_EVENT_NAME = "<>" HIDE_SEQUENCES = ("", "") @@ -133,13 +132,16 @@ return bool(self.tipwindow) -def _calltip_window(parent): +def _calltip_window(parent): # htest # + import re + from tkinter import Tk, Text, LEFT, BOTH + root = Tk() root.title("Test calltips") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d"%(x, y + 150)) - class MyEditWin: # comparenceptually an editor_window + class MyEditWin: # conceptually an editor_window def __init__(self): text = self.text = Text(root) text.pack(side=LEFT, fill=BOTH, expand=1) @@ -161,7 +163,7 @@ def calltip_hide(self, event): self.calltip.hidetip() - editwin = MyEditWin() + MyEditWin() if __name__=='__main__': from idlelib.idle_test.htest import run diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py --- a/Lib/idlelib/ClassBrowser.py +++ b/Lib/idlelib/ClassBrowser.py @@ -101,7 +101,7 @@ return [] try: dict = pyclbr.readmodule_ex(name, [dir] + sys.path) - except ImportError as msg: + except ImportError: return [] items = [] self.classes = {} diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py --- a/Lib/idlelib/Debugger.py +++ b/Lib/idlelib/Debugger.py @@ -1,6 +1,5 @@ import os import bdb -import types from tkinter import * from idlelib.WindowList import ListedToplevel from idlelib.ScrolledList import ScrolledList diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -13,7 +13,6 @@ import tkinter.messagebox as tkMessageBox import tkinter.colorchooser as tkColorChooser import tkinter.font as tkFont -import copy from idlelib.configHandler import idleConf from idlelib.dynOptionMenuWidget import DynOptionMenu @@ -679,7 +678,7 @@ if self.listBindings.curselection(): reselect=1 listIndex=self.listBindings.index(ANCHOR) - keySet=idleConf.GetKeySet(keySetName) + # keySet=idleConf.GetKeySet(keySetName) # unused, delete? bindNames = list(keySet.keys()) bindNames.sort() self.listBindings.delete(0,END) diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py --- a/Lib/idlelib/configHandler.py +++ b/Lib/idlelib/configHandler.py @@ -20,7 +20,7 @@ import os import sys -from configparser import ConfigParser, NoOptionError, NoSectionError +from configparser import ConfigParser class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 00:53:24 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 2 Jul 2014 00:53:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h317m5bSdz7Lkt@mail.python.org> http://hg.python.org/cpython/rev/3d452fd11899 changeset: 91514:3d452fd11899 parent: 91510:45dcdd8f3211 parent: 91513:b836a0cd68f7 user: Terry Jan Reedy date: Tue Jul 01 18:52:53 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/CallTipWindow.py | 12 +++++++----- Lib/idlelib/ClassBrowser.py | 2 +- Lib/idlelib/Debugger.py | 1 - Lib/idlelib/configDialog.py | 3 +-- Lib/idlelib/configHandler.py | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/CallTipWindow.py b/Lib/idlelib/CallTipWindow.py --- a/Lib/idlelib/CallTipWindow.py +++ b/Lib/idlelib/CallTipWindow.py @@ -2,9 +2,8 @@ After ToolTip.py, which uses ideas gleaned from PySol Used by the CallTips IDLE extension. - """ -from tkinter import * +from tkinter import Toplevel, Label, LEFT, SOLID, TclError HIDE_VIRTUAL_EVENT_NAME = "<>" HIDE_SEQUENCES = ("", "") @@ -133,13 +132,16 @@ return bool(self.tipwindow) -def _calltip_window(parent): +def _calltip_window(parent): # htest # + import re + from tkinter import Tk, Text, LEFT, BOTH + root = Tk() root.title("Test calltips") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d"%(x, y + 150)) - class MyEditWin: # comparenceptually an editor_window + class MyEditWin: # conceptually an editor_window def __init__(self): text = self.text = Text(root) text.pack(side=LEFT, fill=BOTH, expand=1) @@ -161,7 +163,7 @@ def calltip_hide(self, event): self.calltip.hidetip() - editwin = MyEditWin() + MyEditWin() if __name__=='__main__': from idlelib.idle_test.htest import run diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py --- a/Lib/idlelib/ClassBrowser.py +++ b/Lib/idlelib/ClassBrowser.py @@ -101,7 +101,7 @@ return [] try: dict = pyclbr.readmodule_ex(name, [dir] + sys.path) - except ImportError as msg: + except ImportError: return [] items = [] self.classes = {} diff --git a/Lib/idlelib/Debugger.py b/Lib/idlelib/Debugger.py --- a/Lib/idlelib/Debugger.py +++ b/Lib/idlelib/Debugger.py @@ -1,6 +1,5 @@ import os import bdb -import types from tkinter import * from idlelib.WindowList import ListedToplevel from idlelib.ScrolledList import ScrolledList diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -13,7 +13,6 @@ import tkinter.messagebox as tkMessageBox import tkinter.colorchooser as tkColorChooser import tkinter.font as tkFont -import copy from idlelib.configHandler import idleConf from idlelib.dynOptionMenuWidget import DynOptionMenu @@ -679,7 +678,7 @@ if self.listBindings.curselection(): reselect=1 listIndex=self.listBindings.index(ANCHOR) - keySet=idleConf.GetKeySet(keySetName) + # keySet=idleConf.GetKeySet(keySetName) # unused, delete? bindNames = list(keySet.keys()) bindNames.sort() self.listBindings.delete(0,END) diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py --- a/Lib/idlelib/configHandler.py +++ b/Lib/idlelib/configHandler.py @@ -20,7 +20,7 @@ import os import sys -from configparser import ConfigParser, NoOptionError, NoSectionError +from configparser import ConfigParser class InvalidConfigType(Exception): pass class InvalidConfigSet(Exception): pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 03:25:09 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 2 Jul 2014 03:25:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE4MjU4?= =?utf-8?q?=3A_Fix_test_discovery_for_test=5Fcodecmaps=5F*=2E?= Message-ID: <3h34Vs1JzMz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/27feb652d3ad changeset: 91515:27feb652d3ad branch: 3.4 parent: 91513:b836a0cd68f7 user: Zachary Ware date: Tue Jul 01 19:55:04 2014 -0500 summary: Issue #18258: Fix test discovery for test_codecmaps_*. files: Lib/test/multibytecodec_support.py | 3 +-- Lib/test/test_codecmaps_cn.py | 5 +---- Lib/test/test_codecmaps_hk.py | 5 +---- Lib/test/test_codecmaps_jp.py | 5 +---- Lib/test/test_codecmaps_kr.py | 5 +---- Lib/test/test_codecmaps_tw.py | 5 +---- 6 files changed, 6 insertions(+), 22 deletions(-) diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py --- a/Lib/test/multibytecodec_support.py +++ b/Lib/test/multibytecodec_support.py @@ -277,8 +277,7 @@ supmaps = [] codectests = [] - def __init__(self, *args, **kw): - unittest.TestCase.__init__(self, *args, **kw) + def setUp(self): try: self.open_mapping_file().close() # test it to report the error early except (OSError, HTTPException): diff --git a/Lib/test/test_codecmaps_cn.py b/Lib/test/test_codecmaps_cn.py --- a/Lib/test/test_codecmaps_cn.py +++ b/Lib/test/test_codecmaps_cn.py @@ -25,8 +25,5 @@ 'trunk/charset/data/xml/gb-18030-2000.xml' -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_hk.py b/Lib/test/test_codecmaps_hk.py --- a/Lib/test/test_codecmaps_hk.py +++ b/Lib/test/test_codecmaps_hk.py @@ -12,8 +12,5 @@ encoding = 'big5hkscs' mapfileurl = 'http://people.freebsd.org/~perky/i18n/BIG5HKSCS-2004.TXT' -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_jp.py b/Lib/test/test_codecmaps_jp.py --- a/Lib/test/test_codecmaps_jp.py +++ b/Lib/test/test_codecmaps_jp.py @@ -59,8 +59,5 @@ mapfileurl = 'http://people.freebsd.org/~perky/i18n/SHIFT_JISX0213.TXT' -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_kr.py b/Lib/test/test_codecmaps_kr.py --- a/Lib/test/test_codecmaps_kr.py +++ b/Lib/test/test_codecmaps_kr.py @@ -36,8 +36,5 @@ pass_enctest = [(b'\\', '\u20a9')] pass_dectest = [(b'\\', '\u20a9')] -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_tw.py b/Lib/test/test_codecmaps_tw.py --- a/Lib/test/test_codecmaps_tw.py +++ b/Lib/test/test_codecmaps_tw.py @@ -26,8 +26,5 @@ (b"\xFFxy", "replace", "\ufffdxy"), ) -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 03:25:10 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 2 Jul 2014 03:25:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2318258=3A_Fix_test_discovery_for_test=5Fcodecmap?= =?utf-8?q?s=5F*=2E?= Message-ID: <3h34Vt2ynvz7LkS@mail.python.org> http://hg.python.org/cpython/rev/b08921c7d1ec changeset: 91516:b08921c7d1ec parent: 91514:3d452fd11899 parent: 91515:27feb652d3ad user: Zachary Ware date: Tue Jul 01 20:06:19 2014 -0500 summary: Issue #18258: Fix test discovery for test_codecmaps_*. files: Lib/test/multibytecodec_support.py | 3 +-- Lib/test/test_codecmaps_cn.py | 5 +---- Lib/test/test_codecmaps_hk.py | 5 +---- Lib/test/test_codecmaps_jp.py | 5 +---- Lib/test/test_codecmaps_kr.py | 5 +---- Lib/test/test_codecmaps_tw.py | 5 +---- 6 files changed, 6 insertions(+), 22 deletions(-) diff --git a/Lib/test/multibytecodec_support.py b/Lib/test/multibytecodec_support.py --- a/Lib/test/multibytecodec_support.py +++ b/Lib/test/multibytecodec_support.py @@ -277,8 +277,7 @@ supmaps = [] codectests = [] - def __init__(self, *args, **kw): - unittest.TestCase.__init__(self, *args, **kw) + def setUp(self): try: self.open_mapping_file().close() # test it to report the error early except (OSError, HTTPException): diff --git a/Lib/test/test_codecmaps_cn.py b/Lib/test/test_codecmaps_cn.py --- a/Lib/test/test_codecmaps_cn.py +++ b/Lib/test/test_codecmaps_cn.py @@ -25,8 +25,5 @@ 'trunk/charset/data/xml/gb-18030-2000.xml' -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_hk.py b/Lib/test/test_codecmaps_hk.py --- a/Lib/test/test_codecmaps_hk.py +++ b/Lib/test/test_codecmaps_hk.py @@ -12,8 +12,5 @@ encoding = 'big5hkscs' mapfileurl = 'http://people.freebsd.org/~perky/i18n/BIG5HKSCS-2004.TXT' -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_jp.py b/Lib/test/test_codecmaps_jp.py --- a/Lib/test/test_codecmaps_jp.py +++ b/Lib/test/test_codecmaps_jp.py @@ -59,8 +59,5 @@ mapfileurl = 'http://people.freebsd.org/~perky/i18n/SHIFT_JISX0213.TXT' -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_kr.py b/Lib/test/test_codecmaps_kr.py --- a/Lib/test/test_codecmaps_kr.py +++ b/Lib/test/test_codecmaps_kr.py @@ -36,8 +36,5 @@ pass_enctest = [(b'\\', '\u20a9')] pass_dectest = [(b'\\', '\u20a9')] -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() diff --git a/Lib/test/test_codecmaps_tw.py b/Lib/test/test_codecmaps_tw.py --- a/Lib/test/test_codecmaps_tw.py +++ b/Lib/test/test_codecmaps_tw.py @@ -26,8 +26,5 @@ (b"\xFFxy", "replace", "\ufffdxy"), ) -def test_main(): - support.run_unittest(__name__) - if __name__ == "__main__": - test_main() + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 03:34:16 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 2 Jul 2014 03:34:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_More_idlelib_c?= =?utf-8?q?leanup_inspired_by_pyflakes=2E?= Message-ID: <3h34jN36Lxz7LjR@mail.python.org> http://hg.python.org/cpython/rev/6cbb97f039bd changeset: 91517:6cbb97f039bd branch: 2.7 parent: 91512:962c1fefc34a user: Terry Jan Reedy date: Tue Jul 01 21:33:26 2014 -0400 summary: More idlelib cleanup inspired by pyflakes. files: Lib/idlelib/SearchEngine.py | 2 +- Lib/idlelib/StackViewer.py | 4 ++-- Lib/idlelib/idle_test/test_textview.py | 6 ++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Lib/idlelib/SearchEngine.py b/Lib/idlelib/SearchEngine.py --- a/Lib/idlelib/SearchEngine.py +++ b/Lib/idlelib/SearchEngine.py @@ -85,7 +85,7 @@ except re.error as what: args = what.args msg = args[0] - col = arg[1] if len(args) >= 2 else -1 + col = args[1] if len(args) >= 2 else -1 self.report_error(pat, msg, col) return None return prog diff --git a/Lib/idlelib/StackViewer.py b/Lib/idlelib/StackViewer.py --- a/Lib/idlelib/StackViewer.py +++ b/Lib/idlelib/StackViewer.py @@ -131,8 +131,8 @@ root.geometry("+%d+%d"%(x, y + 150)) flist = PyShellFileList(root) try: # to obtain a traceback object - a - except: + intentional_name_error + except NameError: exc_type, exc_value, exc_tb = sys.exc_info() # inject stack trace to sys diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -3,7 +3,7 @@ import unittest import os from test.test_support import requires -from Tkinter import Tk, Text, TclError +from Tkinter import Tk from idlelib import textView as tv from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_tk import Mbox @@ -93,6 +93,4 @@ self.assertIsNone(view) if __name__ == '__main__': - unittest.main(verbosity=2, exit=False) - from idlelib.idle_test.htest import run - run(TextViewer) + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 03:34:17 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 2 Jul 2014 03:34:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_More_idlelib_c?= =?utf-8?q?leanup_inspired_by_pyflakes=2E?= Message-ID: <3h34jP4X6Zz7LjR@mail.python.org> http://hg.python.org/cpython/rev/78fc2465f114 changeset: 91518:78fc2465f114 branch: 3.4 parent: 91515:27feb652d3ad user: Terry Jan Reedy date: Tue Jul 01 21:33:31 2014 -0400 summary: More idlelib cleanup inspired by pyflakes. files: Lib/idlelib/SearchEngine.py | 2 +- Lib/idlelib/StackViewer.py | 4 ++-- Lib/idlelib/idle_test/test_textview.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/SearchEngine.py b/Lib/idlelib/SearchEngine.py --- a/Lib/idlelib/SearchEngine.py +++ b/Lib/idlelib/SearchEngine.py @@ -85,7 +85,7 @@ except re.error as what: args = what.args msg = args[0] - col = arg[1] if len(args) >= 2 else -1 + col = args[1] if len(args) >= 2 else -1 self.report_error(pat, msg, col) return None return prog diff --git a/Lib/idlelib/StackViewer.py b/Lib/idlelib/StackViewer.py --- a/Lib/idlelib/StackViewer.py +++ b/Lib/idlelib/StackViewer.py @@ -131,8 +131,8 @@ root.geometry("+%d+%d"%(x, y + 150)) flist = PyShellFileList(root) try: # to obtain a traceback object - a - except: + intentional_name_error + except NameError: exc_type, exc_value, exc_tb = sys.exc_info() # inject stack trace to sys diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -12,7 +12,7 @@ import unittest import os -from tkinter import Tk, Text, TclError +from tkinter import Tk from idlelib import textView as tv from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_tk import Mbox @@ -23,7 +23,7 @@ def tearDownModule(): global root - root.destroy() + root.destroy() # pyflakes falsely sees root as undefined del root -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 03:34:18 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 2 Jul 2014 03:34:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h34jQ6J3jz7LkP@mail.python.org> http://hg.python.org/cpython/rev/5c9b508e442f changeset: 91519:5c9b508e442f parent: 91516:b08921c7d1ec parent: 91518:78fc2465f114 user: Terry Jan Reedy date: Tue Jul 01 21:33:46 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/SearchEngine.py | 2 +- Lib/idlelib/StackViewer.py | 4 ++-- Lib/idlelib/idle_test/test_textview.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/idlelib/SearchEngine.py b/Lib/idlelib/SearchEngine.py --- a/Lib/idlelib/SearchEngine.py +++ b/Lib/idlelib/SearchEngine.py @@ -85,7 +85,7 @@ except re.error as what: args = what.args msg = args[0] - col = arg[1] if len(args) >= 2 else -1 + col = args[1] if len(args) >= 2 else -1 self.report_error(pat, msg, col) return None return prog diff --git a/Lib/idlelib/StackViewer.py b/Lib/idlelib/StackViewer.py --- a/Lib/idlelib/StackViewer.py +++ b/Lib/idlelib/StackViewer.py @@ -131,8 +131,8 @@ root.geometry("+%d+%d"%(x, y + 150)) flist = PyShellFileList(root) try: # to obtain a traceback object - a - except: + intentional_name_error + except NameError: exc_type, exc_value, exc_tb = sys.exc_info() # inject stack trace to sys diff --git a/Lib/idlelib/idle_test/test_textview.py b/Lib/idlelib/idle_test/test_textview.py --- a/Lib/idlelib/idle_test/test_textview.py +++ b/Lib/idlelib/idle_test/test_textview.py @@ -12,7 +12,7 @@ import unittest import os -from tkinter import Tk, Text, TclError +from tkinter import Tk from idlelib import textView as tv from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_tk import Mbox @@ -23,7 +23,7 @@ def tearDownModule(): global root - root.destroy() + root.destroy() # pyflakes falsely sees root as undefined del root -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 06:21:45 2014 From: python-checkins at python.org (andrew.svetlov) Date: Wed, 2 Jul 2014 06:21:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Use_try-finall?= =?utf-8?q?y_idiom_in_example_for_locks_in_multiprocessing?= Message-ID: <3h38Qd5Hsjz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/34ec73494e74 changeset: 91520:34ec73494e74 branch: 3.4 parent: 91518:78fc2465f114 user: Andrew Svetlov date: Wed Jul 02 07:21:03 2014 +0300 summary: Use try-finally idiom in example for locks in multiprocessing files: Doc/library/multiprocessing.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -262,8 +262,10 @@ def f(l, i): l.acquire() - print('hello world', i) - l.release() + try: + print('hello world', i) + finally: + l.release() if __name__ == '__main__': lock = Lock() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 06:21:46 2014 From: python-checkins at python.org (andrew.svetlov) Date: Wed, 2 Jul 2014 06:21:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy40?= Message-ID: <3h38Qf6xWgz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/25df025cf9cf changeset: 91521:25df025cf9cf parent: 91519:5c9b508e442f parent: 91520:34ec73494e74 user: Andrew Svetlov date: Wed Jul 02 07:21:31 2014 +0300 summary: Merge 3.4 files: Doc/library/multiprocessing.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -262,8 +262,10 @@ def f(l, i): l.acquire() - print('hello world', i) - l.release() + try: + print('hello world', i) + finally: + l.release() if __name__ == '__main__': lock = Lock() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 07:37:29 2014 From: python-checkins at python.org (berker.peksag) Date: Wed, 2 Jul 2014 07:37:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=235800=3A_headers_p?= =?utf-8?q?arameter_of_wsgiref=2Eheaders=2EHeaders_is_now_optional=2E?= Message-ID: <3h3B6123SPz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/a91f0d4a2381 changeset: 91522:a91f0d4a2381 user: Berker Peksag date: Wed Jul 02 08:37:22 2014 +0300 summary: Issue #5800: headers parameter of wsgiref.headers.Headers is now optional. Patch by Pablo Torres Navarrete and SilentGhost. files: Doc/library/wsgiref.rst | 9 +++++++-- Doc/whatsnew/3.5.rst | 6 ++++++ Lib/test/test_wsgiref.py | 6 +++--- Lib/wsgiref/headers.py | 4 ++-- Misc/NEWS | 3 +++ 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst --- a/Doc/library/wsgiref.rst +++ b/Doc/library/wsgiref.rst @@ -184,10 +184,11 @@ manipulation of WSGI response headers using a mapping-like interface. -.. class:: Headers(headers) +.. class:: Headers([headers]) Create a mapping-like object wrapping *headers*, which must be a list of header - name/value tuples as described in :pep:`3333`. + name/value tuples as described in :pep:`3333`. The default value of *headers* is + an empty list. :class:`Headers` objects support typical mapping operations including :meth:`__getitem__`, :meth:`get`, :meth:`__setitem__`, :meth:`setdefault`, @@ -251,6 +252,10 @@ Content-Disposition: attachment; filename="bud.gif" + .. versionchanged:: 3.5 + *headers* parameter is optional. + + :mod:`wsgiref.simple_server` -- a simple WSGI HTTP server --------------------------------------------------------- diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -230,6 +230,12 @@ :meth:`socket.socket.send`. (contributed by Giampaolo Rodola' in :issue:`17552`) +wsgiref +------- + +* *headers* parameter of :class:`wsgiref.headers.Headers` is now optional. + (Contributed by Pablo Torres Navarrete and SilentGhost in :issue:`5800`.) + xmlrpc ------ diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py --- a/Lib/test/test_wsgiref.py +++ b/Lib/test/test_wsgiref.py @@ -338,6 +338,7 @@ def testMappingInterface(self): test = [('x','y')] + self.assertEqual(len(Headers()), 0) self.assertEqual(len(Headers([])),0) self.assertEqual(len(Headers(test[:])),1) self.assertEqual(Headers(test[:]).keys(), ['x']) @@ -345,7 +346,7 @@ self.assertEqual(Headers(test[:]).items(), test) self.assertIsNot(Headers(test).items(), test) # must be copy! - h=Headers([]) + h = Headers() del h['foo'] # should not raise an error h['Foo'] = 'bar' @@ -370,9 +371,8 @@ def testRequireList(self): self.assertRaises(TypeError, Headers, "foo") - def testExtras(self): - h = Headers([]) + h = Headers() self.assertEqual(str(h),'\r\n') h.add_header('foo','bar',baz="spam") diff --git a/Lib/wsgiref/headers.py b/Lib/wsgiref/headers.py --- a/Lib/wsgiref/headers.py +++ b/Lib/wsgiref/headers.py @@ -26,10 +26,10 @@ class Headers: - """Manage a collection of HTTP response headers""" - def __init__(self,headers): + def __init__(self, headers=None): + headers = headers if headers is not None else [] if type(headers) is not list: raise TypeError("Headers must be a list of name/value tuples") self._headers = headers diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -103,6 +103,9 @@ Library ------- +- Issue #5800: headers parameter of wsgiref.headers.Headers is now optional. + Initial patch by Pablo Torres Navarrete and SilentGhost. + - Issue #21781: ssl.RAND_add() now supports strings longer than 2 GB. - Issue #21679: Prevent extraneous fstat() calls during open(). Patch by -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 09:48:42 2014 From: python-checkins at python.org (berker.peksag) Date: Wed, 2 Jul 2014 09:48:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5ODcw?= =?utf-8?q?=3A_BaseCookie_now_parses_=27secure=27_and_=27httponly=27_flags?= =?utf-8?q?=2E?= Message-ID: <3h3F1Q1zFGz7LkB@mail.python.org> http://hg.python.org/cpython/rev/0ba6ebd90b9d changeset: 91523:0ba6ebd90b9d branch: 2.7 parent: 91517:6cbb97f039bd user: Berker Peksag date: Wed Jul 02 10:48:27 2014 +0300 summary: Issue #19870: BaseCookie now parses 'secure' and 'httponly' flags. Backport of issue #16611. files: Lib/Cookie.py | 15 +++++++- Lib/test/test_cookie.py | 45 +++++++++++++++++++++++++++++ Misc/NEWS | 3 + 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/Lib/Cookie.py b/Lib/Cookie.py --- a/Lib/Cookie.py +++ b/Lib/Cookie.py @@ -426,6 +426,8 @@ "version" : "Version", } + _flags = {'secure', 'httponly'} + def __init__(self): # Set defaults self.key = self.value = self.coded_value = None @@ -532,6 +534,7 @@ r"(?P" # Start of group 'key' ""+ _LegalCharsPatt +"+?" # Any word of at least one letter, nongreedy r")" # End of group 'key' + r"(" # Optional group: there may not be a value. r"\s*=\s*" # Equal Sign r"(?P" # Start of group 'val' r'"(?:[^\\"]|\\.)*"' # Any doublequoted string @@ -540,7 +543,9 @@ r"|" # or ""+ _LegalCharsPatt +"*" # Any word or empty string r")" # End of group 'val' - r"\s*;?" # Probably ending in a semi-colon + r")?" # End of optional value group + r"\s*" # Any number of spaces. + r"(\s+|;|$)" # Ending either at space, semicolon, or EOS. ) @@ -656,8 +661,12 @@ M[ K[1:] ] = V elif K.lower() in Morsel._reserved: if M: - M[ K ] = _unquote(V) - else: + if V is None: + if K.lower() in Morsel._flags: + M[K] = True + else: + M[K] = _unquote(V) + elif V is not None: rval, cval = self.value_decode(V) self.__set(K, rval, cval) M = self[K] diff --git a/Lib/test/test_cookie.py b/Lib/test/test_cookie.py --- a/Lib/test/test_cookie.py +++ b/Lib/test/test_cookie.py @@ -80,6 +80,51 @@ self.assertEqual(C.output(['val']), 'Set-Cookie: val="some\\054funky\\073stuff"') + def test_set_secure_httponly_attrs(self): + C = Cookie.SimpleCookie('Customer="WILE_E_COYOTE"') + C['Customer']['secure'] = True + C['Customer']['httponly'] = True + self.assertEqual(C.output(), + 'Set-Cookie: Customer="WILE_E_COYOTE"; httponly; secure') + + def test_secure_httponly_false_if_not_present(self): + C = Cookie.SimpleCookie() + C.load('eggs=scrambled; Path=/bacon') + self.assertFalse(C['eggs']['httponly']) + self.assertFalse(C['eggs']['secure']) + + def test_secure_httponly_true_if_present(self): + # Issue 16611 + C = Cookie.SimpleCookie() + C.load('eggs=scrambled; httponly; secure; Path=/bacon') + self.assertTrue(C['eggs']['httponly']) + self.assertTrue(C['eggs']['secure']) + + def test_secure_httponly_true_if_have_value(self): + # This isn't really valid, but demonstrates what the current code + # is expected to do in this case. + C = Cookie.SimpleCookie() + C.load('eggs=scrambled; httponly=foo; secure=bar; Path=/bacon') + self.assertTrue(C['eggs']['httponly']) + self.assertTrue(C['eggs']['secure']) + # Here is what it actually does; don't depend on this behavior. These + # checks are testing backward compatibility for issue 16611. + self.assertEqual(C['eggs']['httponly'], 'foo') + self.assertEqual(C['eggs']['secure'], 'bar') + + def test_bad_attrs(self): + # Issue 16611: make sure we don't break backward compatibility. + C = Cookie.SimpleCookie() + C.load('cookie=with; invalid; version; second=cookie;') + self.assertEqual(C.output(), + 'Set-Cookie: cookie=with\r\nSet-Cookie: second=cookie') + + def test_extra_spaces(self): + C = Cookie.SimpleCookie() + C.load('eggs = scrambled ; secure ; path = bar ; foo=foo ') + self.assertEqual(C.output(), + 'Set-Cookie: eggs=scrambled; Path=bar; secure\r\nSet-Cookie: foo=foo') + def test_quoted_meta(self): # Try cookie with quoted meta-data C = Cookie.SimpleCookie() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #19870: BaseCookie now parses 'secure' and 'httponly' flags. + Backport of issue #16611. + What's New in Python 2.7.8? =========================== -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Jul 2 10:58:47 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 02 Jul 2014 10:58:47 +0200 Subject: [Python-checkins] Daily reference leaks (b08921c7d1ec): sum=13 Message-ID: results for b08921c7d1ec on branch "default" -------------------------------------------- test_collections leaked [2, -2, 0] references, sum=0 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_io leaked [2, 2, 2] references, sum=6 test_site leaked [0, 2, 0] references, sum=2 test_site leaked [0, 2, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogmQiY4t', '-x'] From python-checkins at python.org Wed Jul 2 14:36:31 2014 From: python-checkins at python.org (jason.coombs) Date: Wed, 2 Jul 2014 14:36:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Normalize_style_per_PEP-8?= Message-ID: <3h3MPW6m4Mz7MVh@mail.python.org> http://hg.python.org/cpython/rev/3744b6ad8c3f changeset: 91524:3744b6ad8c3f parent: 91522:a91f0d4a2381 user: Jason R. Coombs date: Wed Jul 02 08:36:19 2014 -0400 summary: Normalize style per PEP-8 files: Lib/distutils/dist.py | 69 +++++++++++++++--------------- 1 files changed, 34 insertions(+), 35 deletions(-) diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py --- a/Lib/distutils/dist.py +++ b/Lib/distutils/dist.py @@ -4,7 +4,9 @@ being built/installed/distributed. """ -import sys, os, re +import sys +import os +import re from email import message_from_file try: @@ -22,7 +24,7 @@ # the same as a Python NAME -- I don't allow leading underscores. The fact # that they're very similar is no coincidence; the default naming scheme is # to look for a Python module named after the command. -command_re = re.compile (r'^[a-zA-Z]([a-zA-Z0-9_]*)$') +command_re = re.compile(r'^[a-zA-Z]([a-zA-Z0-9_]*)$') class Distribution: @@ -39,7 +41,6 @@ See the code for 'setup()', in core.py, for details. """ - # 'global_options' describes the command-line options that may be # supplied to the setup script prior to any actual commands. # Eg. "./setup.py -n" or "./setup.py --quiet" both take advantage of @@ -48,12 +49,13 @@ # don't want to pollute the commands with too many options that they # have minimal control over. # The fourth entry for verbose means that it can be repeated. - global_options = [('verbose', 'v', "run verbosely (default)", 1), - ('quiet', 'q', "run quietly (turns verbosity off)"), - ('dry-run', 'n', "don't actually do anything"), - ('help', 'h', "show detailed help message"), - ('no-user-cfg', None, - 'ignore pydistutils.cfg in your home directory'), + global_options = [ + ('verbose', 'v', "run verbosely (default)", 1), + ('quiet', 'q', "run quietly (turns verbosity off)"), + ('dry-run', 'n', "don't actually do anything"), + ('help', 'h', "show detailed help message"), + ('no-user-cfg', None, + 'ignore pydistutils.cfg in your home directory'), ] # 'common_usage' is a short (2-3 line) string describing the common @@ -115,10 +117,9 @@ # negative options are options that exclude other options negative_opt = {'quiet': 'verbose'} - # -- Creation/initialization methods ------------------------------- - def __init__ (self, attrs=None): + def __init__(self, attrs=None): """Construct a new Distribution instance: initialize all the attributes of a Distribution, and then use 'attrs' (a dictionary mapping attribute names to values) to assign some of those @@ -532,15 +533,15 @@ # to be sure that the basic "command" interface is implemented. if not issubclass(cmd_class, Command): raise DistutilsClassError( - "command class %s must subclass Command" % cmd_class) + "command class %s must subclass Command" % cmd_class) # Also make sure that the command object provides a list of its # known options. if not (hasattr(cmd_class, 'user_options') and isinstance(cmd_class.user_options, list)): - raise DistutilsClassError(("command class %s must provide " + - "'user_options' attribute (a list of tuples)") % \ - cmd_class) + msg = ("command class %s must provide " + "'user_options' attribute (a list of tuples)") + raise DistutilsClassError(msg % cmd_class) # If the command class has a list of negative alias options, # merge it in with the global negative aliases. @@ -552,12 +553,11 @@ # Check for help_options in command class. They have a different # format (tuple of four) so we need to preprocess them here. if (hasattr(cmd_class, 'help_options') and - isinstance(cmd_class.help_options, list)): + isinstance(cmd_class.help_options, list)): help_options = fix_help_options(cmd_class.help_options) else: help_options = [] - # All commands support the global options too, just by adding # in 'global_options'. parser.set_option_table(self.global_options + @@ -570,7 +570,7 @@ return if (hasattr(cmd_class, 'help_options') and - isinstance(cmd_class.help_options, list)): + isinstance(cmd_class.help_options, list)): help_option_found=0 for (help_option, short, desc, func) in cmd_class.help_options: if hasattr(opts, parser.get_attr_name(help_option)): @@ -647,7 +647,7 @@ else: klass = self.get_command_class(command) if (hasattr(klass, 'help_options') and - isinstance(klass.help_options, list)): + isinstance(klass.help_options, list)): parser.set_option_table(klass.user_options + fix_help_options(klass.help_options)) else: @@ -814,7 +814,7 @@ klass_name = command try: - __import__ (module_name) + __import__(module_name) module = sys.modules[module_name] except ImportError: continue @@ -823,8 +823,8 @@ klass = getattr(module, klass_name) except AttributeError: raise DistutilsModuleError( - "invalid command '%s' (no class '%s' in module '%s')" - % (command, klass_name, module_name)) + "invalid command '%s' (no class '%s' in module '%s')" + % (command, klass_name, module_name)) self.cmdclass[command] = klass return klass @@ -840,7 +840,7 @@ cmd_obj = self.command_obj.get(command) if not cmd_obj and create: if DEBUG: - self.announce("Distribution.get_command_obj(): " \ + self.announce("Distribution.get_command_obj(): " "creating '%s' command object" % command) klass = self.get_command_class(command) @@ -897,8 +897,8 @@ setattr(command_obj, option, value) else: raise DistutilsOptionError( - "error in %s: command '%s' has no such option '%s'" - % (source, command_name, option)) + "error in %s: command '%s' has no such option '%s'" + % (source, command_name, option)) except ValueError as msg: raise DistutilsOptionError(msg) @@ -974,7 +974,6 @@ cmd_obj.run() self.have_run[command] = 1 - # -- Distribution query methods ------------------------------------ def has_pure_modules(self): @@ -1112,17 +1111,17 @@ """ version = '1.0' if (self.provides or self.requires or self.obsoletes or - self.classifiers or self.download_url): + self.classifiers or self.download_url): version = '1.1' file.write('Metadata-Version: %s\n' % version) - file.write('Name: %s\n' % self.get_name() ) - file.write('Version: %s\n' % self.get_version() ) - file.write('Summary: %s\n' % self.get_description() ) - file.write('Home-page: %s\n' % self.get_url() ) - file.write('Author: %s\n' % self.get_contact() ) - file.write('Author-email: %s\n' % self.get_contact_email() ) - file.write('License: %s\n' % self.get_license() ) + file.write('Name: %s\n' % self.get_name()) + file.write('Version: %s\n' % self.get_version()) + file.write('Summary: %s\n' % self.get_description()) + file.write('Home-page: %s\n' % self.get_url()) + file.write('Author: %s\n' % self.get_contact()) + file.write('Author-email: %s\n' % self.get_contact_email()) + file.write('License: %s\n' % self.get_license()) if self.download_url: file.write('Download-URL: %s\n' % self.download_url) @@ -1131,7 +1130,7 @@ keywords = ','.join(self.get_keywords()) if keywords: - file.write('Keywords: %s\n' % keywords ) + file.write('Keywords: %s\n' % keywords) self._write_list(file, 'Platform', self.get_platforms()) self._write_list(file, 'Classifier', self.get_classifiers()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 23:01:35 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 2 Jul 2014 23:01:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxMDkw?= =?utf-8?q?=3A_io=2EFileIO=2Ereadall=28=29_does_not_ignore_I/O_errors_anym?= =?utf-8?q?ore=2E_Before=2C?= Message-ID: <3h3ZcH2bDzz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/652b62213072 changeset: 91525:652b62213072 branch: 3.4 parent: 91520:34ec73494e74 user: Victor Stinner date: Wed Jul 02 22:59:31 2014 +0200 summary: Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored I/O errors if at least the first C call read() succeed. files: Misc/NEWS | 3 +++ Modules/_io/fileio.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, + it ignored I/O errors if at least the first C call read() succeed. + - Issue #21781: ssl.RAND_add() now supports strings longer than 2 GB. - Issue #11453: asyncore: emit a ResourceWarning when an unclosed file_wrapper diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -691,9 +691,9 @@ } continue; } - if (bytes_read > 0) - break; if (errno == EAGAIN) { + if (bytes_read > 0) + break; Py_DECREF(result); Py_RETURN_NONE; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 23:01:36 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 2 Jul 2014 23:01:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzIxMDkwOiBpby5GaWxlSU8ucmVhZGFs?= =?utf-8?q?l=28=29_does_not_ignore_I/O_errors?= Message-ID: <3h3ZcJ47Zrz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/440279cec378 changeset: 91526:440279cec378 parent: 91524:3744b6ad8c3f parent: 91525:652b62213072 user: Victor Stinner date: Wed Jul 02 23:00:38 2014 +0200 summary: (Merge 3.4) Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored I/O errors if at least the first C call read() succeed. files: Misc/NEWS | 3 +++ Modules/_io/fileio.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -103,6 +103,9 @@ Library ------- +- Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, + it ignored I/O errors if at least the first C call read() succeed. + - Issue #5800: headers parameter of wsgiref.headers.Headers is now optional. Initial patch by Pablo Torres Navarrete and SilentGhost. diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -694,9 +694,9 @@ } continue; } - if (bytes_read > 0) - break; if (errno == EAGAIN) { + if (bytes_read > 0) + break; Py_DECREF(result); Py_RETURN_NONE; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 2 23:14:19 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 2 Jul 2014 23:14:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxMDkw?= =?utf-8?q?=3A_io=2EFileIO=2Ereadall=28=29_does_not_ignore_I/O_errors_anym?= =?utf-8?q?ore=2E_Before=2C?= Message-ID: <3h3Ztz6wSPz7LjP@mail.python.org> http://hg.python.org/cpython/rev/1492a42b8308 changeset: 91527:1492a42b8308 branch: 2.7 parent: 91523:0ba6ebd90b9d user: Victor Stinner date: Wed Jul 02 23:12:48 2014 +0200 summary: Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored I/O errors if at least the first C call read() succeed. files: Misc/NEWS | 3 +++ Modules/_io/fileio.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, + it ignored I/O errors if at least the first C call read() succeed. + - Issue #19870: BaseCookie now parses 'secure' and 'httponly' flags. Backport of issue #16611. diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -577,9 +577,9 @@ } continue; } - if (total > 0) - break; if (errno == EAGAIN) { + if (total > 0) + break; Py_DECREF(result); Py_RETURN_NONE; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 01:00:30 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 3 Jul 2014 01:00:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h3dFV3W2tz7LjP@mail.python.org> http://hg.python.org/cpython/rev/4b612f7bffd4 changeset: 91528:4b612f7bffd4 branch: 3.4 parent: 91525:652b62213072 user: Victor Stinner date: Thu Jul 03 00:59:00 2014 +0200 summary: asyncio: sync with Tulip * _UnixSubprocessTransport: fix file mode of stdin. Open stdin in write mode, not in read mode * Examples: close the event loop at exit * More reliable CoroWrapper.__del__. If the constructor is interrupted by KeyboardInterrupt or the coroutine objet is destroyed lately, some the _source_traceback attribute doesn't exist anymore. * repr(Task): include also the future the task is waiting for files: Lib/asyncio/coroutines.py | 14 ++++++++------ Lib/asyncio/tasks.py | 3 +++ Lib/asyncio/unix_events.py | 2 +- Lib/test/test_asyncio/test_tasks.py | 11 +++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -111,12 +111,14 @@ frame = getattr(gen, 'gi_frame', None) if frame is not None and frame.f_lasti == -1: func = events._format_callback(self.func, ()) - tb = ''.join(traceback.format_list(self._source_traceback)) - message = ('Coroutine %s was never yielded from\n' - 'Coroutine object created at (most recent call last):\n' - '%s' - % (func, tb.rstrip())) - logger.error(message) + msg = 'Coroutine %s was never yielded from' % func + tb = getattr(self, '_source_traceback', ()) + if tb: + tb = ''.join(traceback.format_list(tb)) + msg += ('\nCoroutine object created at ' + '(most recent call last):\n') + msg += tb.rstrip() + logger.error(msg) def coroutine(func): diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -109,6 +109,9 @@ if self._callbacks: info.append(self._format_callbacks()) + if self._fut_waiter is not None: + info.append('wait_for=%r' % self._fut_waiter) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def get_stack(self, *, limit=None): diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -494,7 +494,7 @@ universal_newlines=False, bufsize=bufsize, **kwargs) if stdin_w is not None: stdin.close() - self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize) + self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) class AbstractChildWatcher: diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -218,6 +218,17 @@ '()]>' % coro) self.loop.run_until_complete(t) + def test_task_repr_wait_for(self): + @asyncio.coroutine + def wait_for(fut): + return (yield from fut) + + fut = asyncio.Future(loop=self.loop) + task = asyncio.Task(wait_for(fut), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertRegex(repr(task), + '' % re.escape(repr(fut))) + def test_task_basics(self): @asyncio.coroutine def outer(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 01:00:31 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 3 Jul 2014 01:00:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h3dFW51V2z7LjP@mail.python.org> http://hg.python.org/cpython/rev/3d176d6a05e6 changeset: 91529:3d176d6a05e6 parent: 91526:440279cec378 parent: 91528:4b612f7bffd4 user: Victor Stinner date: Thu Jul 03 00:59:28 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip * _UnixSubprocessTransport: fix file mode of stdin. Open stdin in write mode, not in read mode * Examples: close the event loop at exit * More reliable CoroWrapper.__del__. If the constructor is interrupted by KeyboardInterrupt or the coroutine objet is destroyed lately, some the _source_traceback attribute doesn't exist anymore. * repr(Task): include also the future the task is waiting for files: Lib/asyncio/coroutines.py | 14 ++++++++------ Lib/asyncio/tasks.py | 3 +++ Lib/asyncio/unix_events.py | 2 +- Lib/test/test_asyncio/test_tasks.py | 11 +++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -111,12 +111,14 @@ frame = getattr(gen, 'gi_frame', None) if frame is not None and frame.f_lasti == -1: func = events._format_callback(self.func, ()) - tb = ''.join(traceback.format_list(self._source_traceback)) - message = ('Coroutine %s was never yielded from\n' - 'Coroutine object created at (most recent call last):\n' - '%s' - % (func, tb.rstrip())) - logger.error(message) + msg = 'Coroutine %s was never yielded from' % func + tb = getattr(self, '_source_traceback', ()) + if tb: + tb = ''.join(traceback.format_list(tb)) + msg += ('\nCoroutine object created at ' + '(most recent call last):\n') + msg += tb.rstrip() + logger.error(msg) def coroutine(func): diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -109,6 +109,9 @@ if self._callbacks: info.append(self._format_callbacks()) + if self._fut_waiter is not None: + info.append('wait_for=%r' % self._fut_waiter) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def get_stack(self, *, limit=None): diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -494,7 +494,7 @@ universal_newlines=False, bufsize=bufsize, **kwargs) if stdin_w is not None: stdin.close() - self._proc.stdin = open(stdin_w.detach(), 'rb', buffering=bufsize) + self._proc.stdin = open(stdin_w.detach(), 'wb', buffering=bufsize) class AbstractChildWatcher: diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -218,6 +218,17 @@ '()]>' % coro) self.loop.run_until_complete(t) + def test_task_repr_wait_for(self): + @asyncio.coroutine + def wait_for(fut): + return (yield from fut) + + fut = asyncio.Future(loop=self.loop) + task = asyncio.Task(wait_for(fut), loop=self.loop) + test_utils.run_briefly(self.loop) + self.assertRegex(repr(task), + '' % re.escape(repr(fut))) + def test_task_basics(self): @asyncio.coroutine def outer(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 01:30:59 2014 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 3 Jul 2014 01:30:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_guidance_f?= =?utf-8?q?or_subclassing_collections=2ESet=28=29?= Message-ID: <3h3dwg4ySPz7LjW@mail.python.org> http://hg.python.org/cpython/rev/b10caad6a052 changeset: 91530:b10caad6a052 branch: 2.7 parent: 91527:1492a42b8308 user: Raymond Hettinger date: Thu Jul 03 00:30:52 2014 +0100 summary: Fix guidance for subclassing collections.Set() files: Doc/library/collections.rst | 2 +- Lib/_abcoll.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -1028,7 +1028,7 @@ (2) To override the comparisons (presumably for speed, as the - semantics are fixed), redefine :meth:`__le__` and + semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`, then the other operations will automatically follow suit. (3) diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py --- a/Lib/_abcoll.py +++ b/Lib/_abcoll.py @@ -143,7 +143,7 @@ methods except for __contains__, __iter__ and __len__. To override the comparisons (presumably for speed, as the - semantics are fixed), all you have to do is redefine __le__ and + semantics are fixed), redefine __le__ and __ge__, then the other operations will automatically follow suit. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 01:32:05 2014 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 3 Jul 2014 01:32:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_guidance_f?= =?utf-8?q?or_subclassing_collections=2ESet=28=29?= Message-ID: <3h3dxx1W1dz7LjW@mail.python.org> http://hg.python.org/cpython/rev/b28292359d4a changeset: 91531:b28292359d4a branch: 3.4 parent: 91528:4b612f7bffd4 user: Raymond Hettinger date: Thu Jul 03 00:31:30 2014 +0100 summary: Fix guidance for subclassing collections.Set() files: Doc/library/collections.abc.rst | 2 +- Lib/_collections_abc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -173,7 +173,7 @@ (2) To override the comparisons (presumably for speed, as the - semantics are fixed), redefine :meth:`__le__` and + semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`, then the other operations will automatically follow suit. (3) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -183,7 +183,7 @@ methods except for __contains__, __iter__ and __len__. To override the comparisons (presumably for speed, as the - semantics are fixed), all you have to do is redefine __le__ and + semantics are fixed), redefine __le__ and __ge__, then the other operations will automatically follow suit. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 01:32:06 2014 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 3 Jul 2014 01:32:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3h3dxy2tgyz7LlS@mail.python.org> http://hg.python.org/cpython/rev/a0eafe1069fc changeset: 91532:a0eafe1069fc parent: 91529:3d176d6a05e6 parent: 91531:b28292359d4a user: Raymond Hettinger date: Thu Jul 03 00:31:54 2014 +0100 summary: merge files: Doc/library/collections.abc.rst | 2 +- Lib/_collections_abc.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -173,7 +173,7 @@ (2) To override the comparisons (presumably for speed, as the - semantics are fixed), redefine :meth:`__le__` and + semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`, then the other operations will automatically follow suit. (3) diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -183,7 +183,7 @@ methods except for __contains__, __iter__ and __len__. To override the comparisons (presumably for speed, as the - semantics are fixed), all you have to do is redefine __le__ and + semantics are fixed), redefine __le__ and __ge__, then the other operations will automatically follow suit. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 05:25:13 2014 From: python-checkins at python.org (berker.peksag) Date: Thu, 3 Jul 2014 05:25:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321755=3A_Skip_=7B?= =?utf-8?q?Frozen=2CSource=7D=5FDeadlockAvoidanceTests_tests_when?= Message-ID: <3h3l6x4n5Vz7Lml@mail.python.org> http://hg.python.org/cpython/rev/b88525a8c01d changeset: 91533:b88525a8c01d user: Berker Peksag date: Thu Jul 03 06:25:10 2014 +0300 summary: Issue #21755: Skip {Frozen,Source}_DeadlockAvoidanceTests tests when Python is built without threads. files: Lib/test/test_importlib/test_locks.py | 130 +++++++------ 1 files changed, 71 insertions(+), 59 deletions(-) diff --git a/Lib/test/test_importlib/test_locks.py b/Lib/test/test_importlib/test_locks.py --- a/Lib/test/test_importlib/test_locks.py +++ b/Lib/test/test_importlib/test_locks.py @@ -52,74 +52,86 @@ pass - at unittest.skipUnless(threading, "threads needed for this test") -class DeadlockAvoidanceTests: +if threading is not None: + class DeadlockAvoidanceTests: - def setUp(self): - try: - self.old_switchinterval = sys.getswitchinterval() - sys.setswitchinterval(0.000001) - except AttributeError: - self.old_switchinterval = None + def setUp(self): + try: + self.old_switchinterval = sys.getswitchinterval() + sys.setswitchinterval(0.000001) + except AttributeError: + self.old_switchinterval = None - def tearDown(self): - if self.old_switchinterval is not None: - sys.setswitchinterval(self.old_switchinterval) + def tearDown(self): + if self.old_switchinterval is not None: + sys.setswitchinterval(self.old_switchinterval) - def run_deadlock_avoidance_test(self, create_deadlock): - NLOCKS = 10 - locks = [self.LockType(str(i)) for i in range(NLOCKS)] - pairs = [(locks[i], locks[(i+1)%NLOCKS]) for i in range(NLOCKS)] - if create_deadlock: - NTHREADS = NLOCKS - else: - NTHREADS = NLOCKS - 1 - barrier = threading.Barrier(NTHREADS) - results = [] - def _acquire(lock): - """Try to acquire the lock. Return True on success, False on deadlock.""" - try: - lock.acquire() - except self.DeadlockError: - return False + def run_deadlock_avoidance_test(self, create_deadlock): + NLOCKS = 10 + locks = [self.LockType(str(i)) for i in range(NLOCKS)] + pairs = [(locks[i], locks[(i+1)%NLOCKS]) for i in range(NLOCKS)] + if create_deadlock: + NTHREADS = NLOCKS else: - return True - def f(): - a, b = pairs.pop() - ra = _acquire(a) - barrier.wait() - rb = _acquire(b) - results.append((ra, rb)) - if rb: - b.release() - if ra: - a.release() - lock_tests.Bunch(f, NTHREADS).wait_for_finished() - self.assertEqual(len(results), NTHREADS) - return results + NTHREADS = NLOCKS - 1 + barrier = threading.Barrier(NTHREADS) + results = [] - def test_deadlock(self): - results = self.run_deadlock_avoidance_test(True) - # At least one of the threads detected a potential deadlock on its - # second acquire() call. It may be several of them, because the - # deadlock avoidance mechanism is conservative. - nb_deadlocks = results.count((True, False)) - self.assertGreaterEqual(nb_deadlocks, 1) - self.assertEqual(results.count((True, True)), len(results) - nb_deadlocks) + def _acquire(lock): + """Try to acquire the lock. Return True on success, + False on deadlock.""" + try: + lock.acquire() + except self.DeadlockError: + return False + else: + return True - def test_no_deadlock(self): - results = self.run_deadlock_avoidance_test(False) - self.assertEqual(results.count((True, False)), 0) - self.assertEqual(results.count((True, True)), len(results)) + def f(): + a, b = pairs.pop() + ra = _acquire(a) + barrier.wait() + rb = _acquire(b) + results.append((ra, rb)) + if rb: + b.release() + if ra: + a.release() + lock_tests.Bunch(f, NTHREADS).wait_for_finished() + self.assertEqual(len(results), NTHREADS) + return results + def test_deadlock(self): + results = self.run_deadlock_avoidance_test(True) + # At least one of the threads detected a potential deadlock on its + # second acquire() call. It may be several of them, because the + # deadlock avoidance mechanism is conservative. + nb_deadlocks = results.count((True, False)) + self.assertGreaterEqual(nb_deadlocks, 1) + self.assertEqual(results.count((True, True)), len(results) - nb_deadlocks) -DEADLOCK_ERRORS = {kind: splitinit._bootstrap._DeadlockError - for kind, splitinit in init.items()} + def test_no_deadlock(self): + results = self.run_deadlock_avoidance_test(False) + self.assertEqual(results.count((True, False)), 0) + self.assertEqual(results.count((True, True)), len(results)) -(Frozen_DeadlockAvoidanceTests, - Source_DeadlockAvoidanceTests - ) = test_util.test_both(DeadlockAvoidanceTests, - LockType=LOCK_TYPES, DeadlockError=DEADLOCK_ERRORS) + + DEADLOCK_ERRORS = {kind: splitinit._bootstrap._DeadlockError + for kind, splitinit in init.items()} + + (Frozen_DeadlockAvoidanceTests, + Source_DeadlockAvoidanceTests + ) = test_util.test_both(DeadlockAvoidanceTests, + LockType=LOCK_TYPES, + DeadlockError=DEADLOCK_ERRORS) +else: + DEADLOCK_ERRORS = {} + + class Frozen_DeadlockAvoidanceTests(unittest.TestCase): + pass + + class Source_DeadlockAvoidanceTests(unittest.TestCase): + pass class LifetimeTests: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 07:55:48 2014 From: python-checkins at python.org (nick.coghlan) Date: Thu, 3 Jul 2014 07:55:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_440_updates_based_on_Dona?= =?utf-8?q?ld=27s_pip_integration_work?= Message-ID: <3h3pSh2thGz7Lkg@mail.python.org> http://hg.python.org/peps/rev/59a0d31a1bc2 changeset: 5492:59a0d31a1bc2 user: Nick Coghlan date: Wed Jul 02 22:54:49 2014 -0700 summary: PEP 440 updates based on Donald's pip integration work files: pep-0440.txt | 615 +++++++++++++++++++++----------------- 1 files changed, 333 insertions(+), 282 deletions(-) diff --git a/pep-0440.txt b/pep-0440.txt --- a/pep-0440.txt +++ b/pep-0440.txt @@ -2,7 +2,8 @@ Title: Version Identification and Dependency Specification Version: $Revision$ Last-Modified: $Date$ -Author: Nick Coghlan +Author: Nick Coghlan , + Donald Stufft BDFL-Delegate: Nick Coghlan Discussions-To: Distutils SIG Status: Draft @@ -21,7 +22,7 @@ distributions, and declaring dependencies on particular versions. This document addresses several limitations of the previous attempt at a -standardised approach to versioning, as described in PEP 345 and PEP 386. +standardized approach to versioning, as described in PEP 345 and PEP 386. .. note:: @@ -56,11 +57,6 @@ Distributions are identified by a public version identifier which supports all defined version comparison operations -Distributions may also define a source label, which is not used by -automated tools. Source labels are useful when a project internal -versioning scheme requires translation to create a compliant public -version identifier. - The version scheme is used both to describe the distribution version provided by a particular distribution archive, as well as to place constraints on the version of dependencies needed in order to build or @@ -72,7 +68,7 @@ Public version identifiers MUST comply with the following scheme:: - [N:]N(.N)*[{a|b|c|rc}N][.postN][.devN] + [N!]N(.N)*[{a|b|c}N][.postN][.devN] Public version identifiers MUST NOT include leading or trailing whitespace. @@ -84,9 +80,9 @@ Public version identifiers are separated into up to five segments: -* Epoch segment: ``N:`` +* Epoch segment: ``N!`` * Release segment: ``N(.N)*`` -* Pre-release segment: ``{a|b|c|rc}N`` +* Pre-release segment: ``{a|b|c}N`` * Post-release segment: ``.postN`` * Development release segment: ``.devN`` @@ -119,64 +115,64 @@ Local version identifiers MUST comply with the following scheme:: - [-N[.N]+] + [+] -Local version identifiers are used to denote fully API compatible patched -versions of upstream projects. These are created by application developers -and system integrators when upgrading to a new upstream release would be too -disruptive to the application or other integrated system (such as a Linux -distribution). +They consist of a normal public version identifier (as defined in the +previous section), along with an arbitrary "local version label", separated +from the public version identifier by a plus. Local version labels have +no specific semantics assigned, but some syntactic restrictions are imposed. -Local version identifiers may be used anywhere a public version identifier -is expected. +Local version identifiers are used to denote fully API (and, if applicable, +ABI) compatible patched versions of upstream projects. For example, these +may be created by application developers and system integrators by applying +specific backported bug fixes when upgrading to a new upstream release would +be too disruptive to the application or other integrated system (such as a +Linux distribution). -Local version identifiers MUST NOT include leading or trailing whitespace. - -Numeric components in the integrator suffix are interpreted in the same way -as the numeric components of the release segment. - -The additional segment after the hyphen is referred to as the "integrator -suffix", and makes it possible to differentiate upstream releases from -potentially altered rebuilds by downstream integrators. The inclusion of an -integrator suffix does not affect the kind of a release, but indicates that +The inclusion of the local version label makes it possible to differentiate +upstream releases from potentially altered rebuilds by downstream +integrators. The use of a local version identifier does not affect the kind +of a release but, when applied to a source distribution, does indicate that it may not contain the exact same code as the corresponding upstream release. +To ensure local version identifiers can be readily incorporated as part of +filenames and URLs, and to avoid formatting inconsistencies in hexadecimal +hash representations, local version labels MUST be limited to the following +set of permitted characters: + +* ASCII letters (``[a-zA-Z]``) +* ASCII digits (``[0-9]``) +* periods (``.``) + +Local version labels MUST start and end with an ASCII letter or digit. + +Comparison and ordering of local versions considers each segment of the local +version (divided by a ``.``) separately. If a segment consists entirely of +ASCII digits then that section should be considered an integer for comparison +purposes and if a segment contains any ASCII letters than that segment is +compared lexicographically with case insensitivity. When comparing a numeric +and lexicographic segment, the numeric section always compares as greater than +the lexicographic segment. Additionally a local version with a great number of +segments will always compare as greater than a local version with fewer +segments, as long as the shorter local version's segments match the beginning +of the longer local version's segments exactly. + +Local version identifiers may be used in most locations where a public +version identifier is expected, with the exception of any version specifiers +that explicitly rely on being able to unambiguously order candidate versions. + Public index servers SHOULD NOT allow the use of local version identifiers -in uploaded distributions. Local version identifiers are intended as a tool -for software integrators rather than publishers. +for uploaded distributions. -Distributions using a local version identifier SHOULD provide the +Source distributions using a local version identifier SHOULD provide the ``python.integrator`` extension metadata (as defined in :pep:`459`). -Source labels -------------- - -Source labels are text strings with minimal defined semantics. - -To ensure source labels can be readily incorporated as part of file names -and URLs, and to avoid formatting inconsistences in hexadecimal hash -representations they MUST be limited to the following set of permitted -characters: - -* Lowercase ASCII letters (``[a-z]``) -* ASCII digits (``[0-9]``) -* underscores (``_``) -* hyphens (``-``) -* periods (``.``) -* plus signs (``+``) - -Source labels MUST start and end with an ASCII letter or digit. - -Source labels MUST be unique within each project and MUST NOT match any -defined version for the project. - - Final releases -------------- -A version identifier that consists solely of a release segment is -termed a "final release". +A version identifier that consists solely of a release segment and optionally +an epoch identifier is termed a "final release". The release segment consists of one or more non-negative integer values, separated by dots:: @@ -190,7 +186,7 @@ Comparison and ordering of release segments considers the numeric value of each component of the release segment in turn. When comparing release segments with different numbers of components, the shorter segment is -padded out with additional zeroes as necessary. +padded out with additional zeros as necessary. While any number of additional components after the first are permitted under this scheme, the most common variants are to use two components @@ -222,13 +218,8 @@ form to ``X.Y.0`` when comparing it to any release segment that includes three components. -Date based release segments are also permitted, and are treated differently -in some cases when used in version specifiers. Any version identifier where -the leading component in the release segment is greater than or equal to -``1980`` is considered to be a date based release. - -An example of a date based release scheme using the year and month of the -release:: +Date based release segments are also permitted. An example of a date based +release scheme using the year and month of the release:: 2012.04 2012.07 @@ -249,7 +240,7 @@ X.YaN # Alpha release X.YbN # Beta release - X.YcN # Candidate release (alternative notation: X.YrcN) + X.YcN # Candidate release X.Y # Final release A version identifier that consists solely of a release segment and a @@ -263,10 +254,8 @@ Installation tools MAY accept both ``c`` and ``rc`` releases for a common release segment in order to handle some existing legacy distributions. -Installation tools SHOULD interpret all ``rc`` versions as coming after all -``c`` versions (that is, ``rc1`` indicates a later version than ``c2``). -Installation tools MAY warn the user when such ambiguous versions are -detected, or even reject them entirely. +Installation tools SHOULD interpret ``rc`` versions as being equivalent to +``c`` versions (that is, ``rc1`` indicates the same version as ``c1``). Build tools, publication tools and index servers SHOULD disallow the creation of both ``c`` and ``rc`` releases for a common release segment. @@ -360,9 +349,9 @@ -------------- If included in a version identifier, the epoch appears before all other -components, separated from the release segment by a colon:: +components, separated from the release segment by an exclamation mark:: - E:X.Y # Version identifier with epoch + E!X.Y # Version identifier with epoch If no explicit epoch is given, the implicit epoch is ``0``. @@ -386,9 +375,97 @@ 2013.10 2014.04 - 1:1.0 - 1:1.1 - 1:2.0 + 1!1.0 + 1!1.1 + 1!2.0 + +Normalization +------------- + +In order to maintain better compatibility with existing versions there are a +number of "alternative" syntaxes that MUST be taken into account when parsing +versions. These syntaxes MUST be considered when parsing a version, however +they should be "normalized" to the standard syntax defined above. + + +Case sensitivity +~~~~~~~~~~~~~~~~ + +All ascii letters should be interpreted case insensitively within a version and +the normal form is lowercase. This allows versions such as ``1.1RC1`` which +would be normalized to ``1.1c1``. + + +Integer Normalization +~~~~~~~~~~~~~~~~~~~~~ + +All integers are interpreted via the ``int()`` built in and normalize to the +string form of the output. This means that an integer version of ``00`` would +normalize to ``0`` while ``09000`` would normalize to ``9000``. This does not +hold true for integers inside of an alphanumeric segment of a local version +such as ``1.0+foo0100`` which is already in its normalized form. + + +Pre-release separators +~~~~~~~~~~~~~~~~~~~~~~ + +Pre-releases should allow either a ``.`` or a ``-`` separator between the +release segment and the pre-release segment. The normal form for this is +without a separator. This allows versions such as ``1.1.a1`` or ``1.1-a1`` +which would be normalized to ``1.1a1``. + + +Pre-release spelling +~~~~~~~~~~~~~~~~~~~~ + +Pre-releases allow the additional spellings of alpha, beta, and rc for a, b, +and c respectively. This allows versions such as ``1.1alpha1``, ``1.1beta2``, +or ``1.1rc3`` which normalize to ``1.1a1``, ``1.1b2``, and ``1.1c3``. In every +case the additional spelling should be considered equivalent to their normal +forms. + + +Implicit pre-release number +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Pre releases allow omitting the numeral in which case it is implicitly assumed +to be ``0``. The normal form for this is to include the ``0`` explicitly. This +allows versions such as ``1.2a`` which is normalized to ``1.2a0``. + + +Post release separators +~~~~~~~~~~~~~~~~~~~~~~~ + +Post releases allow either a ``.`` or a ``-`` separator as well as omitting the +separator all together. The normal form of this is with the ``.`` separator. +This allows versions such as ``1.2-post2`` or ``1.2post2`` which normalize to +``1.2.post2``. + + +Implicit post release number +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Post releases allow omiting the numeral in which case it is implicitly assumed +to be ``0``. The normal form for this is to include the ``0`` explicitly. This +allows versions such as ``1.2.post`` which is normalized to ``1.2.post0``. + + +Development release separators +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Development releases allow either a ``.`` or a ``-`` separator as well as +omitting the separator all together. The normal form of this is with the ``.`` +separator. This allows versions such as ``1.2-dev2`` or ``1.2dev2`` which +normalize to ``1.2.dev2``. + + +Implicit development release number +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Development releases allow omiting the numeral in which case it is implicitly +assumed to be ``0``. The normal form for this is to include the ``0`` +explicitly. This allows versions such as ``1.2.dev`` which is normalized to +``1.2.dev0``. Examples of compliant version schemes @@ -483,16 +560,17 @@ tuple(map(int, release_segment.split("."))) All release segments involved in the comparison MUST be converted to a -consistent length by padding shorter segments with zeroes as needed. +consistent length by padding shorter segments with zeros as needed. Within a numeric release (``1.0``, ``2.7.3``), the following suffixes are permitted and MUST be ordered as shown:: - .devN, aN, bN, cN, rcN, , .postN + .devN, aN, bN, cN/rcN, , .postN -Note that `rc` will always sort after `c` (regardless of the numeric -component) although they are semantically equivalent. Tools MAY -reject this case as ambiguous and remain in compliance with the PEP. +Note that `rc` is considered to be semantically equivalent to `c` and must be +sorted as if it were `c`. Tools MAY reject the case of having the same ``N`` +for both a ``rc`` and a ``c`` in the same release segment as ambiguous and +remain in compliance with the PEP. Within an alpha (``1.0a1``), beta (``1.0b1``), or release candidate (``1.0c1``, ``1.0rc1``), the following suffixes are permitted and MUST be @@ -526,60 +604,46 @@ 1.0c1.dev456 1.0c1 1.0 + 1.0+abc.5 + 1.0+abc.7 + 1.0+5 1.0.post456.dev34 1.0.post456 1.1.dev1 -The integrator suffix of local version identifiers that share a common -public version identifier prefix MUST be sorted in the same order as -Python's tuple sorting when the integrator suffix is parsed as follows -(this is the same definition as is used for the release segment):: - - tuple(map(int, integrator_suffix.split("."))) - -All integrator suffixes involved in the comparison MUST be converted to a -consistent length by padding shorter segments with zeroes as needed. - -All local version identifiers (even the ``-0`` suffix) are sorted *after* -the corresponding unqualified public version identifier. - Version ordering across different metadata versions --------------------------------------------------- -Metadata v1.0 (PEP 241) and metadata v1.1 (PEP 314) do not -specify a standard version identification or ordering scheme. This PEP does -not mandate any particular approach to handling such versions, but -acknowledges that the de facto standard for ordering them is -the scheme used by the ``pkg_resources`` component of ``setuptools``. +Metadata v1.0 (PEP 241) and metadata v1.1 (PEP 314) do not specify a standard +version identification or ordering scheme. However metadata v1.2 (PEP 345) +does specify a scheme which is defined in PEP 386. -Software that automatically processes distribution metadata SHOULD attempt -to normalize non-compliant version identifiers to the standard scheme, and -ignore them if normalization fails. As any normalization scheme will be -implementation specific, this means that projects using non-compliant -version identifiers may not be handled consistently across different -tools, even when correctly publishing the earlier metadata versions. +Due to the nature of the simple installer API it is not possible for an +installer to be aware of which metadata version a particular distribution was +using. Additionally installers required the ability to create a reasonably +prioritized list that includes all, or as many as possible, versions of +a project to determine which versions it should install. These requirements +necessitate a standardization across one parsing mechanism to be used for all +versions of a project. -For distributions currently using non-compliant version identifiers, these -filtering guidelines mean that it should be enough for the project to -simply switch to the use of compliant version identifiers to ensure -consistent handling by automated tools. +Due to the above, this PEP MUST be used for all versions of metadata and +supersedes PEP 386 even for metadata v1.2. Tools SHOULD ignore any versions +which cannot be parsed by the rules in this PEP, but MAY fall back to +implementation defined version parsing and ordering schemes if no versions +complying with this PEP are available. Distribution users may wish to explicitly remove non-compliant versions from any private package indexes they control. -For metadata v1.2 (PEP 345), the version ordering described in this PEP -SHOULD be used in preference to the one defined in PEP 386. - Compatibility with other version schemes ---------------------------------------- Some projects may choose to use a version scheme which requires translation in order to comply with the public version scheme defined in -this PEP. In such cases, the source label can be used to -record the project specific version as an arbitrary label, while the -translated public version is published in the version field. +this PEP. In such cases, the project specific version can be stored in the +metadata while the translated public version is published in the version field. This allows automated distribution tools to provide consistently correct ordering of published releases, while still allowing developers to use @@ -609,6 +673,8 @@ labels to compatible public versions is to use the ``.devN`` suffix to specify the appropriate version order. +Specific build information may also be included in local version labels. + .. _Semantic versioning: http://semver.org/ @@ -621,8 +687,10 @@ permitted in the public version field. As with semantic versioning, the public ``.devN`` suffix may be used to -uniquely identify such releases for publication, while the source label is -used to record the original DVCS based version label. +uniquely identify such releases for publication, while the original DVCS based +label can be stored in the project metadata. + +Identifying hash information may also be included in local version labels. Olson database versioning @@ -638,7 +706,7 @@ update within the year. As with other translated version identifiers, the corresponding Olson -database version could be recorded in the source label field. +database version could be recorded in the project metadata. Version specifiers @@ -647,18 +715,16 @@ A version specifier consists of a series of version clauses, separated by commas. For example:: - 0.9, ~= 0.9, >= 1.0, != 1.3.4.*, < 2.0 + ~= 0.9, >= 1.0, != 1.3.4.*, < 2.0 -The comparison operator (or lack thereof) determines the kind of version -clause: - -* No operator: equivalent to ``>=`` for date based releases, and to ``~=`` - otherwise +The comparison operator determines the kind of version clause: + * ``~=``: `Compatible release`_ clause * ``==``: `Version matching`_ clause * ``!=``: `Version exclusion`_ clause * ``<=``, ``>=``: `Inclusive ordered comparison`_ clause * ``<``, ``>``: `Exclusive ordered comparison`_ clause +* ``===``: `Arbitrary equality`_ clause. The comma (",") is equivalent to a logical **and** operator: a candidate version must match all given version clauses in order to match the @@ -673,6 +739,11 @@ pre-releases are considered as candidate versions SHOULD be handled as described in `Handling of pre-releases`_. +Except where specifically noted below, local version identifiers MUST NOT be +permitted in version specifiers, and local version labels MUST be ignored +entirely when checking if candidate versions match a given version +specifier. + Compatible release ------------------ @@ -683,17 +754,17 @@ to be compatible with the specified version. The specified version identifier must be in the standard format described in -`Version scheme`_. - -Automated tools SHOULD report an error when this operator is used in -conjunction with a date based version identifier, as it assumes the use -of semantic API versioning. +`Version scheme`_. Local version identifiers are NOT permitted in this +version specifier. For a given release identifier ``V.N``, the compatible release clause is approximately equivalent to the pair of comparison clauses:: >= V.N, == V.* +This operator MUST NOT be used with a single segment version number such as +``~=1``. + For example, the following groups of version clauses are equivalent:: 2.2 @@ -718,7 +789,7 @@ The padding rules for release segment comparisons means that the assumed degree of forward compatibility in a compatible release clause can be -controlled by appending additional zeroes to the version specifier:: +controlled by appending additional zeros to the version specifier:: 2.2.0 ~= 2.2.0 @@ -736,18 +807,14 @@ and a version identifier. The specified version identifier must be in the standard format described in -`Version scheme`_, but a trailing ``.*`` is permitted as described below. - -If the specified version identifier is a public version identifier (no -integrator suffix), then the integrator suffix of any candidate versions -MUST be ignored when matching versions. +`Version scheme`_, but a trailing ``.*`` is permitted on public version +identifiers as described below. By default, the version matching operator is based on a strict equality comparison: the specified version must be exactly the same as the requested version. The *only* substitution performed is the zero padding of the release segment to ensure the release segments are compared with the same -length (and similarly for the integrator suffix, if matching against a -specified local version identifier). +length. Whether or not strict version matching is appropriate depends on the specific use case for the version specifier. Automated tools SHOULD at least issue @@ -758,16 +825,42 @@ a trailing ``.*`` to the version identifier in the version matching clause. This means that additional trailing segments will be ignored when determining whether or not a version identifier matches the clause. If the -version includes only a release segment, than trailing components in the -release segment are also ignored. +specified version includes only a release segment, than trailing components +(or the lack thereof) in the release segment are also ignored. For example, given the version ``1.1.post1``, the following clauses would match or not as shown:: - + == 1.1 # Not equal, so 1.1.post1 does not match clause == 1.1.post1 # Equal, so 1.1.post1 matches clause == 1.1.* # Same prefix, so 1.1.post1 matches clause +For purposes of prefix matching, the pre-release segment is considered to +have an implied preceding ``.``, so given the version ``1.1a1``, the +following clauses would match or not as shown:: + + == 1.1 # Not equal, so 1.1a1 does not match clause + == 1.1a1 # Equal, so 1.1a1 matches clause + == 1.1.* # Same prefix, so 1.1a1 matches clause + +An exact match is also considered a prefix match (this interpreation is +implied by the usual zero padding rules for the release segment of version +identifiers). Given the version ``1.1``, the following clauses would +match or not as shown:: + + == 1.1 # Equal, so 1.1 matches clause + == 1.1.0 # Zero padding expands 1.1 to 1.1.0, so it matches clause + == 1.1.dev1 # Not equal (dev-release), so 1.1 does not match clause + == 1.1a1 # Not equal (pre-release), so 1.1 does not match clause + == 1.1.post1 # Not equal (post-release), so 1.1 does not match clause + == 1.1.* # Same prefix, so 1.1 matches clause + +It is invalid to have a prefix match containing a development or local release +such as ``1.0.dev1.*`` or ``1.0+foo1.*``. If present, the development release +segment is always the final segment in the public version, and the local version +is ignored for comparison purposes, so using either in a prefix match wouldn't +make any sense. + The use of ``==`` (without at least the wildcard suffix) when defining dependencies for published distributions is strongly discouraged as it greatly complicates the deployment of security fixes. The strict version @@ -775,6 +868,16 @@ dependencies for repeatable *deployments of applications* while using a shared distribution index. +If the specified version identifier is a public version identifier (no +local version label), then the local version label of any candidate versions +MUST be ignored when matching versions. + +If the specified version identifier is a local version identifier, then the +local version labels of candidate versions MUST be considered when matching +versions, with the public version identifier being matched as described +above, and the local version label being checked for equivalence using a +strict string equality comparison. + Version exclusion ----------------- @@ -786,13 +889,9 @@ those of the `Version matching`_ operator, except that the sense of any match is inverted. -If the specified version identifier is a public version identifier (no -integrator suffix), then the integrator suffix of any candidate versions -MUST be ignored when excluding versions. - For example, given the version ``1.1.post1``, the following clauses would match or not as shown:: - + != 1.1 # Not equal, so 1.1.post1 matches clause != 1.1.post1 # Equal, so 1.1.post1 does not match clause != 1.1.* # Same prefix, so 1.1.post1 does not match clause @@ -812,9 +911,7 @@ As with version matching, the release segment is zero padded as necessary to ensure the release segments are compared with the same length. -Local version identifiers are handled according to the combination of their -handling by the version matching operator and the consistent ordering -defined by the standard version scheme. +Local version identifiers are NOT permitted in this version specifier. Exclusive ordered comparison @@ -835,9 +932,31 @@ the given version, even if acceptance of pre-releases is enabled as described in the section below. -Local version identifiers are handled according to the combination of their -handling by the version exclusion operator and the consistent ordering -defined by the standard version scheme. +Local version identifiers are NOT permitted in this version specifier. + + +Arbitrary equality +------------------ + +Arbitrary equality comparisons are simple string equality operations which do +not take into account any of the semantic information such as zero padding or +local versions. This operator also does not support prefix matching as the +``==`` operator does. + +The primary use case for arbitrary equality is to allow for specifying a +version which cannot otherwise be represented by this PEP. This operator is +special and acts as an escape hatch to allow someone using a tool which +implements this PEP to still install a legacy version which is otherwise +incompatible with this PEP. + +An example would be ``===foobar`` which would match a version of ``foobar``. + +This operator may also be used to explicitly require an unpatched version +of a project such as ``===1.0`` which would not match for a version +``1.0+downstream1``. + +Use of this operator is heavily discouraged and tooling MAY display a warning +when it is used. Handling of pre-releases @@ -892,7 +1011,7 @@ Some automated tools may permit the use of a direct reference as an alternative to a normal version specifier. A direct reference consists of -the word ``from`` and an explicit URL. +the specifier ``@`` and an explicit URL. Whether or not direct references are appropriate depends on the specific use case for the version specifier. Automated tools SHOULD at least issue @@ -910,11 +1029,11 @@ For example, a local source archive may be referenced directly:: - pip (from file:///localbuilds/pip-1.3.1.zip) + pip @ file:///localbuilds/pip-1.3.1.zip Alternatively, a prebuilt archive may also be referenced:: - pip (from file:///localbuilds/pip-1.3.1-py33-none-any.whl) + pip @ file:///localbuilds/pip-1.3.1-py33-none-any.whl All direct references that do not refer to a local file URL SHOULD specify a secure transport mechanism (such as ``https``) AND include an expected @@ -958,9 +1077,9 @@ Remote URL examples:: - pip (from https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686) - pip (from git+https://github.com/pypa/pip.git at 7921be1537eac1e97bc40179a57f0349c2aee67d) - pip (from git+https://github.com/pypa/pip.git at 1.3.1#7921be1537eac1e97bc40179a57f0349c2aee67d) + pip @ https://github.com/pypa/pip/archive/1.3.1.zip#sha1=da9234ee9982d4bbb3c72346a6de940a148ea686 + pip @ git+https://github.com/pypa/pip.git at 7921be1537eac1e97bc40179a57f0349c2aee67d + pip @ git+https://github.com/pypa/pip.git at 1.3.1#7921be1537eac1e97bc40179a57f0349c2aee67d @@ -986,9 +1105,10 @@ * Added the "direct reference" concept as a standard notation for direct references to resources (rather than each tool needing to invent its own) -* Added the "local version identifier" and "integrator suffix" concepts to +* Added the "local version identifier" and "local version label" concepts to allow system integrators to indicate patched builds in a way that is - supported by the upstream tools + supported by the upstream tools, as well as to allow the incorporation of + build tags into the versioning of binary distributions. * Added the "compatible release" clause @@ -1013,16 +1133,6 @@ The rationale for major changes is given in the following sections. -Adding source labels --------------------- - -The new source label support is intended to make it clearer that the -constraints on public version identifiers are there primarily to aid in -the creation of reliable automated dependency analysis tools. Projects -are free to use whatever versioning scheme they like internally, so long -as they are able to translate it to something the dependency analysis tools -will understand. - Changing the version scheme --------------------------- @@ -1055,17 +1165,12 @@ a couple of projects with version identifiers differing only in a trailing ``\n`` character were found on PyPI. -The exclusion of major release numbers that look like dates was implied -by the overall text of PEP 386, but not clear in the definition of the -version scheme. This exclusion has been made clear in the definition of -the release component. - `Appendix A` shows detailed results of an analysis of PyPI distribution version information, as collected on 19th February, 2013. This analysis -compares the behaviour of the explicitly ordered version schemes defined in -this PEP and PEP 386 with the de facto standard defined by the behaviour +compares the behavior of the explicitly ordered version schemes defined in +this PEP and PEP 386 with the de facto standard defined by the behavior of setuptools. These metrics are useful, as the intent of both PEPs is to -follow existing setuptools behaviour as closely as is feasible, while +follow existing setuptools behavior as closely as is feasible, while still throwing exceptions for unorderable versions (rather than trying to guess an appropriate order as setuptools does). @@ -1077,7 +1182,7 @@ the new metadata standard, even for projects that weren't directly affected. The data also shows that the pre-release sorting discrepancies are seen -only when analysing *all* versions from PyPI, rather than when analysing +only when analyzing *all* versions from PyPI, rather than when analyzing public versions. This is largely due to the fact that PyPI normally reports only the most recent version for each project (unless maintainers explicitly configure their project to display additional versions). However, @@ -1159,22 +1264,12 @@ allowing pre-release versions to be retrieved automatically when that's the only way to satisfy a dependency. -The "some forward compatibility assumed" default version constraint is -derived from the Ruby community's "pessimistic version constraint" -operator [2]_ to allow projects to take a cautious approach to forward -compatibility promises, while still easily setting a minimum required -version for their dependencies. It is made the default behaviour rather -than needing a separate operator in order to explicitly discourage -overspecification of dependencies by library developers. The explicit -comparison operators remain available to cope with dependencies with -unreliable or non-existent backwards compatibility policies, as well -as for legitimate use cases related to deployment of integrated applications. - -The optional explicit spelling of the compatible release clause (``~=``) is -inspired by the Ruby (``~>``) and PHP (``~``) equivalents. It is defined -in order to allow easier conversion to the legacy ``pkg_resources`` version -specifier format (which omits the parentheses, but requires a comparison -operator). +The "some forward compatibility assumed" version constraint is derived from the +Ruby community's "pessimistic version constraint" operator [2]_ to allow +projects to take a cautious approach to forward compatibility promises, while +still easily setting a minimum required version for their dependencies. The +spelling of the compatible release clause (``~=``) is inspired by the Ruby +(``~>``) and PHP (``~``) equivalents. Further improvements are also planned to the handling of parallel installation of multiple versions of the same library, but these will @@ -1196,19 +1291,6 @@ like to be able to migrate to the new metadata standards without changing it. -The approach now adopted in the PEP is to: - -* consider a leading release segment component greater than or equal to - ``1980`` to denote a "date based release" -* using ``>=`` rather than ``~=`` as the default comparison operator for - version specifier clauses based on a date based release -* recommend reporting an error if ``~=`` is used with a date based release - -This approach means that date based version identifiers should "just work" -for ``pytz`` and any other projects with stable APIs, and at least be usable -(through the use of appropriate version specifiers on the consumer side) for -projects with less stable APIs. - Adding version epochs --------------------- @@ -1224,6 +1306,10 @@ using date based versioning to switch to semantic versioning by specifying a new version epoch. +The ``!`` character was chosen to delimit an epoch version rather than the +``:`` character, which is commonly used in other systems, due to the fact that +``:`` is not a valid character in a Windows directory name. + Adding direct references ------------------------ @@ -1243,6 +1329,18 @@ as well as reducing PyPI's own apparent reliability. +Adding arbitrary equality +------------------------- + +Arbitrary equality is added as an "escape clause" to handle the case where +someone needs to install a project which uses a non compliant version. Although +this PEP is able to attain ~97% compatibility with the versions that are +already on PyPI there are still ~3% of versions which cannot be parsed. This +operator gives a simple and effective way to still depend on them without +having to "guess" at the semantics of what they mean (which would be required +if anything other than strict string based equality was supported). + + Adding local version identifiers -------------------------------- @@ -1253,31 +1351,37 @@ Historically, this practice has been invisible to cross-platform language specific distribution tools - the reported "version" in the upstream -metadata is the same as for the unmodified code. This inaccuracy then -can then cause problems when attempting to work with a mixture of integrator +metadata is the same as for the unmodified code. This inaccuracy can then +cause problems when attempting to work with a mixture of integrator provided code and unmodified upstream code, or even just attempting to identify exactly which version of the software is installed. -The introduction of local version identifiers and the "integrator suffix" +The introduction of local version identifiers and "local version labels" into the versioning scheme, with the corresponding ``python.integrator`` metadata extension allows this kind of activity to be represented accurately, which should improve interoperability between the upstream tools and various integrated platforms. -The exact scheme chosen is largely modelled on the existing behaviour of +The exact scheme chosen is largely modeled on the existing behavior of ``pkg_resources.parse_version`` and ``pkg_resources.parse_requirements``, with the main distinction being that where ``pkg_resources`` currently always takes the suffix into account when comparing versions for exact matches, -the PEP requires that the integrator suffix of the candidate version be -ignored when no integrator suffix is present in the version specifier clause. - -The hyphen is chosen primarily for readability of local version identifiers. -While the wheel format also uses hyphens as separators between components, -the escaping rules defined in PEP 427 will convert the hyphen in a local -version identifier to an underscore before using it in a wheel filename. +the PEP requires that the local version label of the candidate version be +ignored when no local version label is present in the version specifier +clause. Furthermore, the PEP does not attempt to impose any structure on +the local version labels (aside from limiting the set of permitted +characters and defining their ordering). This change is designed to ensure that an integrator provided version like -``pip 1.5-1`` will still satisfy a version specifier like ``pip (== 1.1)``. +``pip 1.5+1`` or ``pip 1.5+1.git.abc123de`` will still satisfy a version +specifier like ``pip>=1.5``. + +The plus is chosen primarily for readability of local version identifiers. +It was chosen instead of the hyphen to prevent +``pkg_resources.parse_version`` from parsing it as a prerelease, which is +important for enabling a successful migration to the new, more structured, +versioning scheme. The plus was chosen instead of a tilde because of the +significance of the tilde in Debian's version algorithm. References @@ -1286,80 +1390,27 @@ The initial attempt at a standardised version scheme, along with the justifications for needing such a standard can be found in PEP 386. -.. [1] Version compatibility analysis script: - http://hg.python.org/peps/file/default/pep-0426/pepsort.py +.. [1] Reference Implementation of PEP 440 Versions and Specifiers + https://github.com/pypa/packaging/pull/1 -.. [2] Pessimistic version constraint +.. [2] Version compatibility analysis script: + https://github.com/pypa/packaging/blob/master/tasks/check.py + +.. [3] Pessimistic version constraint http://docs.rubygems.org/read/chapter/16 Appendix A ========== -Metadata v2.0 guidelines versus setuptools (note that this analysis was -run when this PEP was still embedded as part of PEP 426):: +Metadata v2.0 guidelines versus setuptools:: - $ ./pepsort.py - Comparing PEP 426 version sort to setuptools. - - Analysing release versions - Compatible: 24477 / 28194 (86.82 %) - Compatible with translation: 247 / 28194 (0.88 %) - Compatible with filtering: 84 / 28194 (0.30 %) - No compatible versions: 420 / 28194 (1.49 %) - Sorts differently (after translations): 0 / 28194 (0.00 %) - Sorts differently (no translations): 0 / 28194 (0.00 %) - No applicable versions: 2966 / 28194 (10.52 %) - - Analysing public versions - Compatible: 25600 / 28194 (90.80 %) - Compatible with translation: 1505 / 28194 (5.34 %) - Compatible with filtering: 13 / 28194 (0.05 %) - No compatible versions: 420 / 28194 (1.49 %) - Sorts differently (after translations): 0 / 28194 (0.00 %) - Sorts differently (no translations): 0 / 28194 (0.00 %) - No applicable versions: 656 / 28194 (2.33 %) - - Analysing all versions - Compatible: 24239 / 28194 (85.97 %) - Compatible with translation: 2833 / 28194 (10.05 %) - Compatible with filtering: 513 / 28194 (1.82 %) - No compatible versions: 320 / 28194 (1.13 %) - Sorts differently (after translations): 38 / 28194 (0.13 %) - Sorts differently (no translations): 2 / 28194 (0.01 %) - No applicable versions: 249 / 28194 (0.88 %) - -Metadata v1.2 guidelines versus setuptools:: - - $ ./pepsort.py 386 - Comparing PEP 386 version sort to setuptools. - - Analysing release versions - Compatible: 24244 / 28194 (85.99 %) - Compatible with translation: 247 / 28194 (0.88 %) - Compatible with filtering: 84 / 28194 (0.30 %) - No compatible versions: 648 / 28194 (2.30 %) - Sorts differently (after translations): 0 / 28194 (0.00 %) - Sorts differently (no translations): 0 / 28194 (0.00 %) - No applicable versions: 2971 / 28194 (10.54 %) - - Analysing public versions - Compatible: 25371 / 28194 (89.99 %) - Compatible with translation: 1507 / 28194 (5.35 %) - Compatible with filtering: 12 / 28194 (0.04 %) - No compatible versions: 648 / 28194 (2.30 %) - Sorts differently (after translations): 0 / 28194 (0.00 %) - Sorts differently (no translations): 0 / 28194 (0.00 %) - No applicable versions: 656 / 28194 (2.33 %) - - Analysing all versions - Compatible: 23969 / 28194 (85.01 %) - Compatible with translation: 2789 / 28194 (9.89 %) - Compatible with filtering: 530 / 28194 (1.88 %) - No compatible versions: 547 / 28194 (1.94 %) - Sorts differently (after translations): 96 / 28194 (0.34 %) - Sorts differently (no translations): 14 / 28194 (0.05 %) - No applicable versions: 249 / 28194 (0.88 %) + $ invoke check.pep440 + Total Version Compatibility: 231807/239450 (96.81%) + Total Sorting Compatibility (Unfiltered): 43095/45505 (94.70%) + Total Sorting Compatibility (Filtered): 45481/45505 (99.95%) + Projects with No Compatible Versions: 802/45505 (1.76%) + Projects with Differing Latest Version: 1163/45505 (2.56%) Copyright -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Jul 3 07:55:49 2014 From: python-checkins at python.org (nick.coghlan) Date: Thu, 3 Jul 2014 07:55:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Update_PEP_426_for_PEP_440_ch?= =?utf-8?q?anges_=26_add_python=2Econstraints_extension?= Message-ID: <3h3pSj6rmlz7Lmn@mail.python.org> http://hg.python.org/peps/rev/471651c1fe20 changeset: 5493:471651c1fe20 user: Nick Coghlan date: Wed Jul 02 22:55:34 2014 -0700 summary: Update PEP 426 for PEP 440 changes & add python.constraints extension files: pep-0426.txt | 235 +++++++++++++------------------------- pep-0459.txt | 194 ++++++++++++++++++++++++++++--- 2 files changed, 257 insertions(+), 172 deletions(-) diff --git a/pep-0426.txt b/pep-0426.txt --- a/pep-0426.txt +++ b/pep-0426.txt @@ -602,15 +602,18 @@ Version ------- -The distribution's public version identifier, as defined in PEP 440. Public -versions are designed for consumption by automated tools and support a -variety of flexible version specification mechanisms (see PEP 440 for -details). +The distribution's public or local version identifier, as defined in PEP 440. +Version identifiers are designed for consumption by automated tools and +support a variety of flexible version specification mechanisms (see PEP 440 +for details). Version identifiers MUST comply with the format defined in PEP 440. Version identifiers MUST be unique within each project. +Index servers MAY place restrictions on the use of local version identifiers +as described in PEP 440. + Example:: "version": "1.0a2" @@ -646,17 +649,31 @@ operation depending on one of these fields is requested. -Source label ------------- - -A constrained identifying text string, as defined in PEP 440. Source labels -cannot be used in version specifiers - they are included for information -purposes only. - -Source labels MUST meet the character restrictions defined in PEP 440. - -Source labels MUST be unique within each project and MUST NOT match any -defined version for the project. +Source labels +------------- + +Source labels are text strings with minimal defined semantics. They are +intended to allow the original source code to be unambiguously identified, +even if an integrator has applied additional local modifications to a +particular distribution. + +To ensure source labels can be readily incorporated as part of file names +and URLs, and to avoid formatting inconsistencies in hexadecimal hash +representations they MUST be limited to the following set of permitted +characters: + +* Lowercase ASCII letters (``[a-z]``) +* ASCII digits (``[0-9]``) +* underscores (``_``) +* hyphens (``-``) +* periods (``.``) +* plus signs (``+``) + +Source labels MUST start and end with an ASCII letter or digit. + +A source label for a project MUST NOT match any defined version for that +project. This restriction ensures that there is no ambiguity between version +identifiers and source labels. Examples:: @@ -817,12 +834,11 @@ Individual requirements are defined as strings containing a distribution name (as found in the ``name`` field). The distribution name may be followed by an extras specifier (enclosed in square -brackets) and by a version specifier or direct reference (within -parentheses). +brackets) and by a version specifier or direct reference. Whitespace is permitted between the distribution name and an opening square bracket or parenthesis. Whitespace is also permitted between a -closing square bracket and an opening parenthesis. +closing square bracket and the version specifier. See `Extras (optional dependencies)`_ for details on extras and PEP 440 for details on version specifiers and direct references. @@ -837,9 +853,9 @@ "Flask" "Django" "Pyramid" - "SciPy (0.12)" + "SciPy ~= 0.12" "ComfyChair[warmup]" - "ComfyChair[warmup] (> 0.1)" + "ComfyChair[warmup] > 0.1" Mapping dependencies to development and distribution activities @@ -912,10 +928,10 @@ "run_requires": { - "requires": ["SciPy", "PasteDeploy", "zope.interface (>3.5.0)"] + "requires": ["SciPy", "PasteDeploy", "zope.interface > 3.5.0"] }, { - "requires": ["pywin32 (>1.0)"], + "requires": ["pywin32 > 1.0"], "environment": "sys_platform == 'win32'" }, { @@ -950,11 +966,11 @@ "meta_requires": { - "requires": ["ComfyUpholstery (== 1.0a2)", - "ComfySeatCushion (== 1.0a2)"] + "requires": ["ComfyUpholstery == 1.0a2", + "ComfySeatCushion == 1.0a2"] }, { - "requires": ["CupOfTeaAtEleven (== 1.0a2)"], + "requires": ["CupOfTeaAtEleven == 1.0a2"], "environment": "'linux' in sys_platform" } ] @@ -979,7 +995,7 @@ "requires": ["unittest2"] }, { - "requires": ["pywin32 (>1.0)"], + "requires": ["pywin32 > 1.0"], "environment": "sys_platform == 'win32'" }, { @@ -1008,10 +1024,10 @@ "build_requires": { - "requires": ["setuptools (>= 0.7)"] + "requires": ["setuptools >= 0.7"] }, { - "requires": ["pywin32 (>1.0)"], + "requires": ["pywin32 > 1.0"], "environment": "sys_platform == 'win32'" }, { @@ -1044,10 +1060,10 @@ "dev_requires": { - "requires": ["hgtools", "sphinx (>= 1.0)"] + "requires": ["hgtools", "sphinx >= 1.0"] }, { - "requires": ["pywin32 (>1.0)"], + "requires": ["pywin32 > 1.0"], "environment": "sys_platform == 'win32'" } ] @@ -1138,59 +1154,7 @@ "obsoleted_by": "AcceptableName" "name": "distribute", - "obsoleted_by": "setuptools (>= 0.7)" - - -Supports Environments ---------------------- - -A list of strings specifying the environments that the distribution -explicitly supports. An environment is considered supported if it -matches at least one of the environment markers given. - -If this field is not given in the metadata, it is assumed that the -distribution supports any platform supported by Python. - -Individual entries are environment markers, as described in -`Environment markers`_. - -Installation tools SHOULD report an error if supported environments are -specified by the distribution and the current platform fails to match -any of them, MUST at least emit a warning, and MAY allow the user to -force the installation to proceed regardless. - -The two main uses of this field are to declare which versions of Python -and which underlying operating systems are supported. - -Examples indicating supported Python versions:: - - # Supports Python 2.6+ - "supports_environments": ["python_version >= '2.6'"] - - # Supports Python 2.6+ (for 2.x) or 3.3+ (for 3.x) - "supports_environments": ["python_version >= '3.3'", - "'3.0' > python_version >= '2.6'"] - -Examples indicating supported operating systems:: - - # Windows only - "supports_environments": ["sys_platform == 'win32'"] - - # Anything except Windows - "supports_environments": ["sys_platform != 'win32'"] - - # Linux or BSD only - "supports_environments": ["'linux' in sys_platform", - "'bsd' in sys_platform"] - -Example where the supported Python version varies by platform:: - - # The standard library's os module has long supported atomic renaming - # on POSIX systems, but only gained atomic renaming on Windows in Python - # 3.3. A distribution that needs atomic renaming support for reliable - # operation might declare the following supported environments. - "supports_environments": ["python_version >= '2.6' and sys_platform != 'win32'", - "python_version >= '3.3' and sys_platform == 'win32'"] + "obsoleted_by": "setuptools >= 0.7" Metadata Extensions @@ -1204,7 +1168,7 @@ described below: * ``extension_version`` -* ``required_extension`` +* ``installer_must_handle`` The following example shows the ``python.details`` and ``python.commands`` standard extensions from :pep:`459`:: @@ -1263,16 +1227,16 @@ all of the needed fields. -Required extensions -------------------- +Required extension handling +--------------------------- A project may consider correct handling of some extensions to be essential to correct installation of the software. This is indicated by setting the -``required_extension`` field to ``true``. Setting it to ``false`` or +``installer_must_handle`` field to ``true``. Setting it to ``false`` or omitting it altogether indicates that processing the extension when installing the distribution is not considered mandatory by the developers. -Installation tools MUST fail if ``required_extension`` is set to ``true`` +Installation tools MUST fail if ``installer_must_handle`` is set to ``true`` for an extension and the tool does not have any ability to process that particular extension (whether directly or through a tool-specific plugin system). @@ -1408,13 +1372,13 @@ "name": "ComfyChair", "run_requires": [ { - "requires": ["pywin32 (>1.0)"], + "requires": ["pywin32 > 1.0"], "environment": "sys.platform == 'win32'" } ] "build_requires": [ { - "requires": ["pywin32 (>1.0)"], + "requires": ["pywin32 > 1.0"], "environment": "sys.platform == 'win32'" } ] @@ -1594,7 +1558,9 @@ * consistently use underscores instead of periods in the variable names * allow ordered string comparisons and chained comparisons -* New system for defining supported environments +* New constraint mechanism to define supported environments and ensure + compatibility between independently built binary components at + installation time * Updated obsolescence mechanism @@ -1665,6 +1631,13 @@ easy to distribute 1.x and 2.x metadata in parallel, greatly simplifying several aspects of the migration to the new metadata format. +The specific choice of ``pydist.json`` as the preferred file name relates +to the fact that the metadata described in these files applies to the +distribution as a whole, rather than to any particular build. Additional +metadata formats may be defined in the future to hold information that can +only be determined after building a binary distribution for a particular +target environment. + Changing the version scheme --------------------------- @@ -1676,7 +1649,16 @@ Source labels ------------- -See PEP 440 for the rationale behind the addition of this field. +The new source label support is intended to make it clearer that the +constraints on public version identifiers are there primarily to aid in +the creation of reliable automated dependency analysis tools. Projects +are free to use whatever versioning scheme they like internally, so long +as they are able to translate it to something the dependency analysis tools +will understand. + +Source labels also make it straightforward to record specific details of a +version, like a hash or tag name that allows the release to be reconstructed +from the project version control system. Support for different kinds of dependencies @@ -1803,10 +1785,17 @@ Changes to platform support --------------------------- +This feature is provided by the ``python.constraints`` extension in +:pep:`459`. + The new environment marker system makes it possible to define supported platforms in a way that is actually amenable to automated processing. This has been used to replace several older fields with poorly defined semantics. +The constraints mechanism also allows additional information to be +conveyed through metadata extensions and then checked for consistency at +install time. + For the moment, the old ``Requires-External`` field has been removed entirely. The metadata extension mechanism will hopefully prove to be a more useful replacement. @@ -1894,7 +1883,7 @@ MIME type registration ---------------------- -At some point after acceptance of the PEP, I will likely submit the +At some point after acceptance of the PEP, we may submit the following MIME type registration requests to IANA: * Full metadata: ``application/vnd.python.pydist+json`` @@ -2146,7 +2135,7 @@ Alternative dependency specification example:: ["Pillow", "PIL"] - ["mysql", "psycopg2 (>= 4)", "sqlite3"] + ["mysql", "psycopg2 >= 4", "sqlite3"] However, neither of the given examples is particularly compelling, since Pillow/PIL style forks aren't common, and the database driver use @@ -2187,64 +2176,6 @@ the idea won't be reconsidered until metadata 2.1 at the earliest). -A hook to run tests against installed distributions ---------------------------------------------------- - -Earlier drafts of this PEP defined a hook for running automated -tests against an *installed* distribution. This isn't actually what you -generally want - you want the ability to test a *built* distribution, -potentially relying on files which won't be included in the binary archives. - -RPM's "check" step also runs between the build step and the install step, -rather than after the install step. - -Accordingly, the ``test_installed_dist`` hook has been removed, and the -``test_built_dist`` metabuild hook has been tentatively defined. However, -along with the rest of the metabuild hooks, further consideration has been -deferred until metadata 2.1 at the earliest. - - -Extensible signatures for the install hooks -------------------------------------------- - -The install hooks have been deliberately designed to NOT accept arbitary -keyword arguments that the hook implementation is then expected to ignore. - -The argument in favour of that API design technique is to allow the addition -of new optional arguments in the future, without requiring the definition -of a new install hook, or migration to version 3.0 of the metadata -specification. It is a technique very commonly seen in function wrappers -which merely pass arguments along to the inner function rather than -processing them directly. - -However, the install hooks are already designed to have access to the full -metadata for the distribution (including all metadata extensions and -the previous/next version when appropriate), as well as to the full target -deployment environment. - -This means there are two candidates for additional information that -could be passed as arbitrary keyword arguments: - -* installer dependent settings -* user provided installation options - -The first of those runs explicitly counter to one of the core goals of the -metadata 2.0 specification: decoupling the software developer's choice of -development and publication tools from the software integrator's choice of -integration and deployment tools. - -The second is a complex problem that has a readily available workaround in -the form of operating system level environment variables (this is also -one way to interoperate with platform specific installation tools). - -Alternatively, installer developers may either implicitly inject an -additional metadata extension when invoking the install hook, or else -define an alternate hook signature as a distinct metadata extension to be -provided by the distribution. Either of these approaches makes the -reliance on installer-dependent behaviour suitably explicit in either -the install hook implementation or the distribution metadata. - - References ========== diff --git a/pep-0459.txt b/pep-0459.txt --- a/pep-0459.txt +++ b/pep-0459.txt @@ -45,21 +45,22 @@ * ``python.details`` * ``python.project`` * ``python.integrator`` +* ``python.exports`` * ``python.commands`` -* ``python.exports`` +* ``python.constraints`` All standard extensions are currently at version ``1.0``, and thus the ``extension_metadata`` field may be omitted without losing access to any functionality. -The ``details`` extension -========================= +The ``python.details`` extension +================================ -The ``details`` extension allows for more information to be provided +The ``python.details`` extension allows for more information to be provided regarding the software distribution. -The ``details`` extension contains three subfields: +The ``python.details`` extension contains four custom subfields: * ``license``: the copyright license for the distribution * ``keywords``: package index keywords for the distribution @@ -169,13 +170,13 @@ } -The ``project`` extension -========================= +The ``python.project`` extension +================================ -The ``project`` extension allows for more information to be provided +The ``python.project`` extension allows for more information to be provided regarding the creation and maintenance of the distribution. -The ``project`` extension contains three subfields: +The ``python.project`` extension contains three custom subfields: * ``contacts``: key contact points for the distribution * ``contributors``: other contributors to the distribution @@ -290,10 +291,11 @@ } -The ``integrator`` extension -============================ +The ``python.integrator`` extension +=================================== -Structurally, this extension is identical to the ``project`` extension. +Structurally, this extension is largely identical to the ``python.project`` +extension (the extension name is the only difference). However, where the ``project`` metadata refers to the upstream creators of the software, the ``integrator`` metadata refers to the downstream @@ -303,20 +305,20 @@ extension will not be used. However, if the software has been patched (for example, backporting compatible fixes from a later version, or addressing a platform compatibility issue), then this extension SHOULD be used, and -an integrator suffix added to the package version number. +a local version label added to the distribution's version identifier. If there are multiple redistributors in the chain, each one just overwrites this extension with their particular metadata. -The ``exports`` extension -========================= +The ``python.exports`` extension +================================ Most Python distributions expose packages and modules for import through the Python module namespace. Distributions may also expose other interfaces when installed. -The ``exports`` extension contains three subfields: +The ``python.exports`` extension contains three custom subfields: * ``modules``: modules exported by the distribution * ``namespaces``: namespace packages that the distribution contributes to @@ -464,10 +466,10 @@ } -The ``commands`` extension -========================== +The ``python.commands`` extension +================================= -The ``commands`` extension contains three subfields: +The ``python.commands`` extension contains three custom subfields: * ``wrap_console``: console wrapper scripts to be generated by the installer * ``wrap_gui``: GUI wrapper scripts to be generated by the installer @@ -495,6 +497,8 @@ purpose only - installing them is handled through the normal processes for files created when building a distribution. +Build tools SHOULD mark this extension as requiring handling by installers. + Index servers SHOULD allow multiple distributions to publish the same commands, but MAY notify distribution authors of potential conflicts. @@ -504,13 +508,163 @@ Example:: - "commands": { + "python.commands": { + "installer_must_handle": true, "wrap_console": [{"chair": "chair:run_cli"}], "wrap_gui": [{"chair-gui": "chair:run_gui"}], "prebuilt": ["reduniforms"] } +The ``python.constraints`` extension +==================================== + +The ``python.constraints`` extension contains two custom subfields: + +* ``environments``: supported installation environments +* ``extension_metadata``: required exact matches in extension metadata + fields published by other installed components + +Build tools SHOULD mark this extension as requiring handling by installers. + +Index servers SHOULD allow distributions to be uploaded with constraints +that cannot be satisfied using that index, but MAY notify distribution +authors of any such potential compatibility issues. + +Installation tools SHOULD report an error if constraints are specified by +the distribution and the target installation environment fails to satisfy +them, MUST at least emit a warning, and MAY allow the user to +force the installation to proceed regardless. + +Example:: + + "python.constraints": { + "installer_must_handle": true, + "environments": ["python_version >= 2.6"], + "extension_metadata": { + "fortranlib": { + "fortranlib.compatibility": { + "fortran_abi": "openblas-g77" + } + } + } + } + + +Supported Environments +---------------------- + +The ``environments`` subfield is a list of strings specifying the +environments that the distribution explicitly supports. An environment is +considered supported if it matches at least one of the environment markers +given. + +If this field is not given in the metadata, it is assumed that the +distribution supports any platform supported by Python. + +Individual entries are environment markers, as described in :pep:`426`. + +The two main uses of this field are to declare which versions of Python +and which underlying operating systems are supported. + +Examples indicating supported Python versions:: + + # Supports Python 2.6+ + "environments": ["python_version >= '2.6'"] + + # Supports Python 2.6+ (for 2.x) or 3.3+ (for 3.x) + "environments": ["python_version >= '3.3'", + "'3.0' > python_version >= '2.6'"] + +Examples indicating supported operating systems:: + + # Windows only + "environments": ["sys_platform == 'win32'"] + + # Anything except Windows + "environments": ["sys_platform != 'win32'"] + + # Linux or BSD only + "environments": ["'linux' in sys_platform", + "'bsd' in sys_platform"] + +Example where the supported Python version varies by platform:: + + # The standard library's os module has long supported atomic renaming + # on POSIX systems, but only gained atomic renaming on Windows in Python + # 3.3. A distribution that needs atomic renaming support for reliable + # operation might declare the following supported environments. + "environment": ["python_version >= '2.6' and sys_platform != 'win32'", + "python_version >= '3.3' and sys_platform == 'win32'"] + + +Extension metadata constraints +------------------------------ + +The ``extension_metadata`` subfield is a mapping from distribution names +to extension metadata snippets that are expected to exactly match the +metadata of the named distribution in the target installation environment. + +Each submapping then consists of a mapping from metadata extension names to +the exact expected values of a subset of fields. + +For example, a distribution called ``fortranlib`` may publish a different +FORTRAN ABI depending on how it is built, and any related projects that are +installed into the same runtime environment should use matching build +options. This can be handled by having the base distribution publish a +custom extension that indicates the build option that was used to create +the binary extensions:: + + "extensions": { + "fortranlib.compatibility": { + "fortran_abi": "openblas-g77" + } + } + +Other distributions that contain binary extensions that need to be compatible +with the base distribution would then define a suitable constraint in their +own metadata:: + + "python.constraints": { + "installer_must_handle": true, + "extension_metadata": { + "fortranlib": { + "fortranlib.compatibility": { + "fortran_abi": "openblas-g77" + } + } + } + } + +This constraint specifies that: + +* ``fortranlib`` must be installed (this should also be expressed as a + normal dependency so that installers ensure it is satisfied) +* The installed version of ``fortranlib`` must include the custom + ``fortranlib.compatibility`` extension in its published metadata +* The ``fortan_abi`` subfield of that extension must have the *exact* + value ``openblas-g77``. + +If all of these conditions are met (the distribution is installed, the +specified extension is included in the metadata, the specified subfields +have the exact specified value), then the constraint is considered to be +satisfied. + +.. note:: + + The primary intended use case here is allowing C extensions with additional + ABI compatibility requirements to declare those in a way that any + installation tool can enforce without needing to understand the details. + In particular, many NumPy based scientific libraries need to be built + using a consistent set of FORTRAN libraries, hence the "fortranlib" + example. + + This is the reason there's no support for pattern matching or boolean + logic: even the "simple" version of this extension is relatively + complex, and there's currently no compelling rationale for making it + more complicated than it already is. + + Copyright ========= -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Thu Jul 3 09:57:17 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 03 Jul 2014 09:57:17 +0200 Subject: [Python-checkins] Daily reference leaks (a0eafe1069fc): sum=22 Message-ID: results for a0eafe1069fc on branch "default" -------------------------------------------- test_asyncio leaked [0, 4, 0] memory blocks, sum=4 test_collections leaked [2, 4, 0] references, sum=6 test_collections leaked [1, 2, 0] memory blocks, sum=3 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_io leaked [2, 2, 2] references, sum=6 test_site leaked [0, -2, 2] references, sum=0 test_site leaked [0, -2, 2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogR8czSR', '-x'] From python-checkins at python.org Thu Jul 3 15:08:07 2014 From: python-checkins at python.org (andrew.svetlov) Date: Thu, 3 Jul 2014 15:08:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Update_docs_ab?= =?utf-8?q?out_tp=5Frichcompare?= Message-ID: <3h403W0c1qz7LlJ@mail.python.org> http://hg.python.org/cpython/rev/71a0743f36db changeset: 91534:71a0743f36db branch: 3.4 parent: 91531:b28292359d4a user: Andrew Svetlov date: Thu Jul 03 16:07:17 2014 +0300 summary: Update docs about tp_richcompare files: Doc/c-api/typeobj.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -597,7 +597,9 @@ .. c:member:: richcmpfunc PyTypeObject.tp_richcompare An optional pointer to the rich comparison function, whose signature is - ``PyObject *tp_richcompare(PyObject *a, PyObject *b, int op)``. + ``PyObject *tp_richcompare(PyObject *a, PyObject *b, int op)``. The first + parameter is guaranteed to be an instance of the type that is defined + by :c:type:`PyTypeObject`. The function should return the result of the comparison (usually ``Py_True`` or ``Py_False``). If the comparison is undefined, it must return -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 15:08:08 2014 From: python-checkins at python.org (andrew.svetlov) Date: Thu, 3 Jul 2014 15:08:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy40?= Message-ID: <3h403X2j7qz7Llp@mail.python.org> http://hg.python.org/cpython/rev/06bdd7e8fffd changeset: 91535:06bdd7e8fffd parent: 91533:b88525a8c01d parent: 91534:71a0743f36db user: Andrew Svetlov date: Thu Jul 03 16:07:57 2014 +0300 summary: Merge 3.4 files: Doc/c-api/typeobj.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -597,7 +597,9 @@ .. c:member:: richcmpfunc PyTypeObject.tp_richcompare An optional pointer to the rich comparison function, whose signature is - ``PyObject *tp_richcompare(PyObject *a, PyObject *b, int op)``. + ``PyObject *tp_richcompare(PyObject *a, PyObject *b, int op)``. The first + parameter is guaranteed to be an instance of the type that is defined + by :c:type:`PyTypeObject`. The function should return the result of the comparison (usually ``Py_True`` or ``Py_False``). If the comparison is undefined, it must return -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 18:04:15 2014 From: python-checkins at python.org (zach.ware) Date: Thu, 3 Jul 2014 18:04:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxMTUx?= =?utf-8?q?=3A_Fixed_a_segfault_in_the_=5Fwinreg_module=2E?= Message-ID: <3h43yl3XKZz7LlP@mail.python.org> http://hg.python.org/cpython/rev/f2e6c33ce3e9 changeset: 91536:f2e6c33ce3e9 branch: 2.7 parent: 91530:b10caad6a052 user: Zachary Ware date: Thu Jul 03 10:57:44 2014 -0500 summary: Issue #21151: Fixed a segfault in the _winreg module. When ``None`` was passed as a ``REG_BINARY`` value to SetValueEx, PyMem_DEL was called on an uninitialized buffer. Patch by John Ehresman. (Also an incidental typo fix in a comment in test_winreg) files: Lib/test/test_winreg.py | 15 ++++++++++++++- Misc/NEWS | 3 +++ PC/_winreg.c | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -341,7 +341,7 @@ def test_queryvalueex_return_value(self): # Test for Issue #16759, return unsigned int from QueryValueEx. # Reg2Py, which gets called by QueryValueEx, was returning a value - # generated by PyLong_FromLong. The implmentation now uses + # generated by PyLong_FromLong. The implementation now uses # PyLong_FromUnsignedLong to match DWORD's size. try: with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck: @@ -354,6 +354,19 @@ finally: DeleteKey(HKEY_CURRENT_USER, test_key_name) + def test_setvalueex_crash_with_none_arg(self): + # Test for Issue #21151, segfault when None is passed to SetValueEx + try: + with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck: + self.assertNotEqual(ck.handle, 0) + test_val = None + SetValueEx(ck, "test_name", 0, REG_BINARY, test_val) + ret_val, ret_type = QueryValueEx(ck, "test_name") + self.assertEqual(ret_type, REG_BINARY) + self.assertEqual(ret_val, test_val) + finally: + DeleteKey(HKEY_CURRENT_USER, test_key_name) + @unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #21151: Fixed a segfault in the _winreg module when ``None`` is passed + as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. + - Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored I/O errors if at least the first C call read() succeed. diff --git a/PC/_winreg.c b/PC/_winreg.c --- a/PC/_winreg.c +++ b/PC/_winreg.c @@ -883,8 +883,10 @@ /* ALSO handle ALL unknown data types here. Even if we can't support it natively, we should handle the bits. */ default: - if (value == Py_None) + if (value == Py_None) { *retDataSize = 0; + *retDataBuf = NULL; + } else { void *src_buf; PyBufferProcs *pb = value->ob_type->tp_as_buffer; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 18:04:16 2014 From: python-checkins at python.org (zach.ware) Date: Thu, 3 Jul 2014 18:04:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxMTUx?= =?utf-8?q?=3A_Fixed_a_segfault_in_the_winreg_module=2E?= Message-ID: <3h43ym54X6z7Lm5@mail.python.org> http://hg.python.org/cpython/rev/0c5a1835af91 changeset: 91537:0c5a1835af91 branch: 3.4 parent: 91534:71a0743f36db user: Zachary Ware date: Thu Jul 03 10:58:06 2014 -0500 summary: Issue #21151: Fixed a segfault in the winreg module. When ``None`` was passed as a ``REG_BINARY`` value to SetValueEx, PyMem_DEL was called on an uninitialized buffer. Patch by John Ehresman. (Also an incidental typo fix in a comment in test_winreg) files: Lib/test/test_winreg.py | 15 ++++++++++++++- Misc/NEWS | 3 +++ PC/winreg.c | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -341,7 +341,7 @@ def test_queryvalueex_return_value(self): # Test for Issue #16759, return unsigned int from QueryValueEx. # Reg2Py, which gets called by QueryValueEx, was returning a value - # generated by PyLong_FromLong. The implmentation now uses + # generated by PyLong_FromLong. The implementation now uses # PyLong_FromUnsignedLong to match DWORD's size. try: with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck: @@ -354,6 +354,19 @@ finally: DeleteKey(HKEY_CURRENT_USER, test_key_name) + def test_setvalueex_crash_with_none_arg(self): + # Test for Issue #21151, segfault when None is passed to SetValueEx + try: + with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck: + self.assertNotEqual(ck.handle, 0) + test_val = None + SetValueEx(ck, "test_name", 0, REG_BINARY, test_val) + ret_val, ret_type = QueryValueEx(ck, "test_name") + self.assertEqual(ret_type, REG_BINARY) + self.assertEqual(ret_val, test_val) + finally: + DeleteKey(HKEY_CURRENT_USER, test_key_name) + @unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21151: Fixed a segfault in the winreg module when ``None`` is passed + as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. + - Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored I/O errors if at least the first C call read() succeed. diff --git a/PC/winreg.c b/PC/winreg.c --- a/PC/winreg.c +++ b/PC/winreg.c @@ -871,8 +871,10 @@ /* ALSO handle ALL unknown data types here. Even if we can't support it natively, we should handle the bits. */ default: - if (value == Py_None) + if (value == Py_None) { *retDataSize = 0; + *retDataBuf = NULL; + } else { Py_buffer view; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 18:04:17 2014 From: python-checkins at python.org (zach.ware) Date: Thu, 3 Jul 2014 18:04:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Closes_=2321151=3A_Merge_with_3=2E4?= Message-ID: <3h43yn6vcPz7Ln2@mail.python.org> http://hg.python.org/cpython/rev/21cfbcacf0d8 changeset: 91538:21cfbcacf0d8 parent: 91535:06bdd7e8fffd parent: 91537:0c5a1835af91 user: Zachary Ware date: Thu Jul 03 11:03:46 2014 -0500 summary: Closes #21151: Merge with 3.4 files: Lib/test/test_winreg.py | 15 ++++++++++++++- Misc/NEWS | 3 +++ PC/winreg.c | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_winreg.py b/Lib/test/test_winreg.py --- a/Lib/test/test_winreg.py +++ b/Lib/test/test_winreg.py @@ -341,7 +341,7 @@ def test_queryvalueex_return_value(self): # Test for Issue #16759, return unsigned int from QueryValueEx. # Reg2Py, which gets called by QueryValueEx, was returning a value - # generated by PyLong_FromLong. The implmentation now uses + # generated by PyLong_FromLong. The implementation now uses # PyLong_FromUnsignedLong to match DWORD's size. try: with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck: @@ -354,6 +354,19 @@ finally: DeleteKey(HKEY_CURRENT_USER, test_key_name) + def test_setvalueex_crash_with_none_arg(self): + # Test for Issue #21151, segfault when None is passed to SetValueEx + try: + with CreateKey(HKEY_CURRENT_USER, test_key_name) as ck: + self.assertNotEqual(ck.handle, 0) + test_val = None + SetValueEx(ck, "test_name", 0, REG_BINARY, test_val) + ret_val, ret_type = QueryValueEx(ck, "test_name") + self.assertEqual(ret_type, REG_BINARY) + self.assertEqual(ret_val, test_val) + finally: + DeleteKey(HKEY_CURRENT_USER, test_key_name) + @unittest.skipUnless(REMOTE_NAME, "Skipping remote registry tests") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -103,6 +103,9 @@ Library ------- +- Issue #21151: Fixed a segfault in the winreg module when ``None`` is passed + as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. + - Issue #21090: io.FileIO.readall() does not ignore I/O errors anymore. Before, it ignored I/O errors if at least the first C call read() succeed. diff --git a/PC/winreg.c b/PC/winreg.c --- a/PC/winreg.c +++ b/PC/winreg.c @@ -871,8 +871,10 @@ /* ALSO handle ALL unknown data types here. Even if we can't support it natively, we should handle the bits. */ default: - if (value == Py_None) + if (value == Py_None) { *retDataSize = 0; + *retDataBuf = NULL; + } else { Py_buffer view; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 3 20:48:49 2014 From: python-checkins at python.org (r.david.murray) Date: Thu, 3 Jul 2014 20:48:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbjogIzE1MDE0OiBBZGQgJ2F1dGgn?= =?utf-8?q?_command_to_implement_auth_mechanisms_and_use_it_in_login=2E?= Message-ID: <3h47cd6CZMz7LjT@mail.python.org> http://hg.python.org/cpython/rev/42917d774476 changeset: 91539:42917d774476 user: R David Murray date: Thu Jul 03 14:47:46 2014 -0400 summary: #15014: Add 'auth' command to implement auth mechanisms and use it in login. Patch by Milan Oberkirch. files: Doc/library/smtplib.rst | 39 +++++++++- Doc/whatsnew/3.5.rst | 7 + Lib/smtplib.py | 111 ++++++++++++++++---------- Lib/test/test_smtplib.py | 60 +++++++++----- Misc/NEWS | 3 + 5 files changed, 153 insertions(+), 67 deletions(-) diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -240,8 +240,7 @@ the server is stored as the :attr:`ehlo_resp` attribute, :attr:`does_esmtp` is set to true or false depending on whether the server supports ESMTP, and :attr:`esmtp_features` will be a dictionary containing the names of the - SMTP service extensions this server supports, and their - parameters (if any). + SMTP service extensions this server supports, and their parameters (if any). Unless you wish to use :meth:`has_extn` before sending mail, it should not be necessary to call this method explicitly. It will be implicitly called by @@ -291,6 +290,42 @@ :exc:`SMTPException` No suitable authentication method was found. + Each of the authentication methods supported by :mod:`smtplib` are tried in + turn if they are advertised as supported by the server (see :meth:`auth` + for a list of supported authentication methods). + + +.. method:: SMTP.auth(mechanism, authobject) + + Issue an ``SMTP`` ``AUTH`` command for the specified authentication + *mechanism*, and handle the challenge response via *authobject*. + + *mechanism* specifies which authentication mechanism is to + be used as argument to the ``AUTH`` command; the valid values are + those listed in the ``auth`` element of :attr:`esmtp_features`. + + *authobject* must be a callable object taking a single argument: + + data = authobject(challenge) + + It will be called to process the server's challenge response; the + *challenge* argument it is passed will be a ``bytes``. It should return + ``bytes`` *data* that will be base64 encoded and sent to the server. + + The ``SMTP`` class provides ``authobjects`` for the ``CRAM-MD5``, ``PLAIN``, + and ``LOGIN`` mechanisms; they are named ``SMTP.auth_cram_md5``, + ``SMTP.auth_plain``, and ``SMTP.auth_login`` respectively. They all require + that the ``user`` and ``password`` properties of the ``SMTP`` instance are + set to appropriate values. + + User code does not normally need to call ``auth`` directly, but can instead + call the :meth:`login` method, which will try each of the above mechanisms in + turn, in the order listed. ``auth`` is exposed to facilitate the + implementation of authentication methods not (or not yet) supported directly + by :mod:`smtplib`. + + .. versionadded:: 3.5 + .. method:: SMTP.starttls(keyfile=None, certfile=None, context=None) diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -221,6 +221,13 @@ addresses in the :class:`~smtpd.SMTPServer` constructor, and have it successfully connect. (Contributed by Milan Oberkirch in :issue:`14758`.) +smtplib +------- + +* A new :meth:`~smtplib.SMTP.auth` method provides a convenient way to + implement custom authentication mechanisms (contributed by Milan Oberkirch in + :issue:`15014`). + socket ------ diff --git a/Lib/smtplib.py b/Lib/smtplib.py --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -571,12 +571,60 @@ if not (200 <= code <= 299): raise SMTPHeloError(code, resp) + def auth(self, mechanism, authobject): + """Authentication command - requires response processing. + + 'mechanism' specifies which authentication mechanism is to + be used - the valid values are those listed in the 'auth' + element of 'esmtp_features'. + + 'authobject' must be a callable object taking a single argument: + + data = authobject(challenge) + + It will be called to process the server's challenge response; the + challenge argument it is passed will be a bytes. It should return + bytes data that will be base64 encoded and sent to the server. + """ + + mechanism = mechanism.upper() + (code, resp) = self.docmd("AUTH", mechanism) + # Server replies with 334 (challenge) or 535 (not supported) + if code == 334: + challenge = base64.decodebytes(resp) + response = encode_base64( + authobject(challenge).encode('ascii'), eol='') + (code, resp) = self.docmd(response) + if code in (235, 503): + return (code, resp) + raise SMTPAuthenticationError(code, resp) + + def auth_cram_md5(self, challenge): + """ Authobject to use with CRAM-MD5 authentication. Requires self.user + and self.password to be set.""" + return self.user + " " + hmac.HMAC( + self.password.encode('ascii'), challenge, 'md5').hexdigest() + + def auth_plain(self, challenge): + """ Authobject to use with PLAIN authentication. Requires self.user and + self.password to be set.""" + return "\0%s\0%s" % (self.user, self.password) + + def auth_login(self, challenge): + """ Authobject to use with LOGIN authentication. Requires self.user and + self.password to be set.""" + (code, resp) = self.docmd( + encode_base64(self.user.encode('ascii'), eol='')) + if code == 334: + return self.password + raise SMTPAuthenticationError(code, resp) + def login(self, user, password): """Log in on an SMTP server that requires authentication. The arguments are: - - user: The user name to authenticate with. - - password: The password for the authentication. + - user: The user name to authenticate with. + - password: The password for the authentication. If there has been no previous EHLO or HELO command this session, this method tries ESMTP EHLO first. @@ -593,63 +641,40 @@ found. """ - def encode_cram_md5(challenge, user, password): - challenge = base64.decodebytes(challenge) - response = user + " " + hmac.HMAC(password.encode('ascii'), - challenge, 'md5').hexdigest() - return encode_base64(response.encode('ascii'), eol='') - - def encode_plain(user, password): - s = "\0%s\0%s" % (user, password) - return encode_base64(s.encode('ascii'), eol='') - - AUTH_PLAIN = "PLAIN" - AUTH_CRAM_MD5 = "CRAM-MD5" - AUTH_LOGIN = "LOGIN" - self.ehlo_or_helo_if_needed() - if not self.has_extn("auth"): raise SMTPException("SMTP AUTH extension not supported by server.") # Authentication methods the server claims to support advertised_authlist = self.esmtp_features["auth"].split() - # List of authentication methods we support: from preferred to - # less preferred methods. Except for the purpose of testing the weaker - # ones, we prefer stronger methods like CRAM-MD5: - preferred_auths = [AUTH_CRAM_MD5, AUTH_PLAIN, AUTH_LOGIN] + # Authentication methods we can handle in our preferred order: + preferred_auths = ['CRAM-MD5', 'PLAIN', 'LOGIN'] - # We try the authentication methods the server advertises, but only the - # ones *we* support. And in our preferred order. - authlist = [auth for auth in preferred_auths if auth in advertised_authlist] + # We try the supported authentications in our preferred order, if + # the server supports them. + authlist = [auth for auth in preferred_auths + if auth in advertised_authlist] if not authlist: raise SMTPException("No suitable authentication method found.") # Some servers advertise authentication methods they don't really # support, so if authentication fails, we continue until we've tried # all methods. + self.user, self.password = user, password for authmethod in authlist: - if authmethod == AUTH_CRAM_MD5: - (code, resp) = self.docmd("AUTH", AUTH_CRAM_MD5) - if code == 334: - (code, resp) = self.docmd(encode_cram_md5(resp, user, password)) - elif authmethod == AUTH_PLAIN: - (code, resp) = self.docmd("AUTH", - AUTH_PLAIN + " " + encode_plain(user, password)) - elif authmethod == AUTH_LOGIN: - (code, resp) = self.docmd("AUTH", - "%s %s" % (AUTH_LOGIN, encode_base64(user.encode('ascii'), eol=''))) - if code == 334: - (code, resp) = self.docmd(encode_base64(password.encode('ascii'), eol='')) + method_name = 'auth_' + authmethod.lower().replace('-', '_') + try: + (code, resp) = self.auth(authmethod, getattr(self, method_name)) + # 235 == 'Authentication successful' + # 503 == 'Error: already authenticated' + if code in (235, 503): + return (code, resp) + except SMTPAuthenticationError as e: + last_exception = e - # 235 == 'Authentication successful' - # 503 == 'Error: already authenticated' - if code in (235, 503): - return (code, resp) - - # We could not login sucessfully. Return result of last attempt. - raise SMTPAuthenticationError(code, resp) + # We could not login successfully. Return result of last attempt. + raise last_exception def starttls(self, keyfile=None, certfile=None, context=None): """Puts the connection to the SMTP server into TLS mode. diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -10,6 +10,7 @@ import time import select import errno +import base64 import unittest from test import support, mock_socket @@ -605,7 +606,8 @@ 'cram-md5': ('TXIUQUBZB21LD2HLCMUUY29TIDG4OWQ0MJ' 'KWZGQ4ODNMNDA4NTGXMDRLZWMYZJDMODG1'), } -sim_auth_login_password = 'C29TZXBHC3N3B3JK' +sim_auth_login_user = 'TXIUQUBZB21LD2HLCMUUY29T' +sim_auth_plain = 'AE1YLKFAC29TZXDOZXJLLMNVBQBZB21LCGFZC3DVCMQ=' sim_lists = {'list-1':['Mr.A at somewhere.com','Mrs.C at somewhereesle.com'], 'list-2':['Ms.B at xn--fo-fka.com',], @@ -659,18 +661,16 @@ self.push('550 No access for you!') def smtp_AUTH(self, arg): - if arg.strip().lower()=='cram-md5': + mech = arg.strip().lower() + if mech=='cram-md5': self.push('334 {}'.format(sim_cram_md5_challenge)) - return - mech, auth = arg.split() - mech = mech.lower() - if mech not in sim_auth_credentials: + elif mech not in sim_auth_credentials: self.push('504 auth type unimplemented') return - if mech == 'plain' and auth==sim_auth_credentials['plain']: - self.push('235 plain auth ok') - elif mech=='login' and auth==sim_auth_credentials['login']: - self.push('334 Password:') + elif mech=='plain': + self.push('334 ') + elif mech=='login': + self.push('334 ') else: self.push('550 No access for you!') @@ -818,28 +818,28 @@ self.assertEqual(smtp.expn(u), expected_unknown) smtp.quit() - def testAUTH_PLAIN(self): - self.serv.add_feature("AUTH PLAIN") - smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) - - expected_auth_ok = (235, b'plain auth ok') - self.assertEqual(smtp.login(sim_auth[0], sim_auth[1]), expected_auth_ok) - smtp.close() - - # SimSMTPChannel doesn't fully support LOGIN or CRAM-MD5 auth because they - # require a synchronous read to obtain the credentials...so instead smtpd + # SimSMTPChannel doesn't fully support AUTH because it requires a + # synchronous read to obtain the credentials...so instead smtpd # sees the credential sent by smtplib's login method as an unknown command, # which results in smtplib raising an auth error. Fortunately the error # message contains the encoded credential, so we can partially check that it # was generated correctly (partially, because the 'word' is uppercased in # the error message). + def testAUTH_PLAIN(self): + self.serv.add_feature("AUTH PLAIN") + smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) + try: smtp.login(sim_auth[0], sim_auth[1]) + except smtplib.SMTPAuthenticationError as err: + self.assertIn(sim_auth_plain, str(err)) + smtp.close() + def testAUTH_LOGIN(self): self.serv.add_feature("AUTH LOGIN") smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) try: smtp.login(sim_auth[0], sim_auth[1]) except smtplib.SMTPAuthenticationError as err: - self.assertIn(sim_auth_login_password, str(err)) + self.assertIn(sim_auth_login_user, str(err)) smtp.close() def testAUTH_CRAM_MD5(self): @@ -857,7 +857,23 @@ smtp = smtplib.SMTP(HOST, self.port, local_hostname='localhost', timeout=15) try: smtp.login(sim_auth[0], sim_auth[1]) except smtplib.SMTPAuthenticationError as err: - self.assertIn(sim_auth_login_password, str(err)) + self.assertIn(sim_auth_login_user, str(err)) + smtp.close() + + def test_auth_function(self): + smtp = smtplib.SMTP(HOST, self.port, + local_hostname='localhost', timeout=15) + self.serv.add_feature("AUTH CRAM-MD5") + smtp.user, smtp.password = sim_auth[0], sim_auth[1] + supported = {'CRAM-MD5': smtp.auth_cram_md5, + 'PLAIN': smtp.auth_plain, + 'LOGIN': smtp.auth_login, + } + for mechanism, method in supported.items(): + try: smtp.auth(mechanism, method) + except smtplib.SMTPAuthenticationError as err: + self.assertIn(sim_auth_credentials[mechanism.lower()].upper(), + str(err)) smtp.close() def test_with_statement(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -103,6 +103,9 @@ Library ------- +- Issue #15014: Added 'auth' method to smtplib to make implementing auth + mechanisms simpler, and used it internally in the login method. + - Issue #21151: Fixed a segfault in the winreg module when ``None`` is passed as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Jul 4 11:00:50 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 04 Jul 2014 11:00:50 +0200 Subject: [Python-checkins] Daily reference leaks (42917d774476): sum=9 Message-ID: results for 42917d774476 on branch "default" -------------------------------------------- test_functools leaked [0, 0, 3] memory blocks, sum=3 test_io leaked [2, 2, 2] references, sum=6 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogODkfML', '-x'] From python-checkins at python.org Fri Jul 4 14:07:29 2014 From: python-checkins at python.org (berker.peksag) Date: Fri, 4 Jul 2014 14:07:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Add_an_index_e?= =?utf-8?q?ntry_for_exec=28=29_builtin=2E?= Message-ID: <3h4Zg51mlsz7Llx@mail.python.org> http://hg.python.org/cpython/rev/c76ab5f4fcc1 changeset: 91540:c76ab5f4fcc1 branch: 3.4 parent: 91537:0c5a1835af91 user: Berker Peksag date: Fri Jul 04 15:06:45 2014 +0300 summary: Add an index entry for exec() builtin. Reported by Draic Kin on docs at . files: Doc/library/functions.rst | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -410,6 +410,7 @@ See :func:`ast.literal_eval` for a function that can safely evaluate strings with expressions containing only literals. +.. index:: builtin: exec .. function:: exec(object[, globals[, locals]]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 4 14:07:30 2014 From: python-checkins at python.org (berker.peksag) Date: Fri, 4 Jul 2014 14:07:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgZnJvbSAzLjQu?= Message-ID: <3h4Zg63CmFz7Llx@mail.python.org> http://hg.python.org/cpython/rev/4f129a722341 changeset: 91541:4f129a722341 parent: 91539:42917d774476 parent: 91540:c76ab5f4fcc1 user: Berker Peksag date: Fri Jul 04 15:07:31 2014 +0300 summary: Merge from 3.4. files: Doc/library/functions.rst | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -410,6 +410,7 @@ See :func:`ast.literal_eval` for a function that can safely evaluate strings with expressions containing only literals. +.. index:: builtin: exec .. function:: exec(object[, globals[, locals]]) -- Repository URL: http://hg.python.org/cpython From bcannon at gmail.com Fri Jul 4 15:00:26 2014 From: bcannon at gmail.com (Brett Cannon) Date: Fri, 04 Jul 2014 13:00:26 +0000 Subject: [Python-checkins] Daily reference leaks (42917d774476): sum=9 References: Message-ID: Looks like there is an actual leak found by test_io. Any ideas on what may have introduced it? On Fri Jul 04 2014 at 5:01:02 AM, wrote: > results for 42917d774476 on branch "default" > -------------------------------------------- > > test_functools leaked [0, 0, 3] memory blocks, sum=3 > test_io leaked [2, 2, 2] references, sum=6 > > > Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', > '3:3:/home/antoine/cpython/refleaks/reflogODkfML', '-x'] > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > https://mail.python.org/mailman/listinfo/python-checkins > -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Fri Jul 4 22:50:43 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 4 Jul 2014 22:50:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODky?= =?utf-8?q?=2C_=2321893=3A_Partial_revert_of_changeset_4f55e802baf0=2C_PyE?= =?utf-8?b?cnJfRm9ybWF0KCk=?= Message-ID: <3h4pGq1XpRz7Lnh@mail.python.org> http://hg.python.org/cpython/rev/6fb1e2ce513a changeset: 91542:6fb1e2ce513a branch: 3.4 parent: 91540:c76ab5f4fcc1 user: Victor Stinner date: Fri Jul 04 22:47:46 2014 +0200 summary: Issue #21892, #21893: Partial revert of changeset 4f55e802baf0, PyErr_Format() uses "%zd" for Py_ssize_t, not PY_FORMAT_SIZE_T files: Objects/unicodeobject.c | 26 ++++++++------------------ 1 files changed, 8 insertions(+), 18 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1372,9 +1372,8 @@ 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 %" PY_FORMAT_SIZE_T "i characters at %" - PY_FORMAT_SIZE_T "i in a string of %" - PY_FORMAT_SIZE_T "i characters", + "Cannot write %zi characters at %zi " + "in a string of %zi characters", how_many, to_start, PyUnicode_GET_LENGTH(to)); return -1; } @@ -4083,9 +4082,7 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); goto onError; } @@ -4178,9 +4175,7 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); goto onError; } @@ -6443,9 +6438,7 @@ if (*newpos<0) *newpos = len + *newpos; if (*newpos<0 || *newpos>len) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -8468,9 +8461,7 @@ else *newpos = i_newpos; if (*newpos<0 || *newpos>PyUnicode_GET_LENGTH(unicode)) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -9752,8 +9743,7 @@ item = items[i]; if (!PyUnicode_Check(item)) { PyErr_Format(PyExc_TypeError, - "sequence item %" PY_FORMAT_SIZE_T - "d: expected str instance," + "sequence item %zd: expected str instance," " %.80s found", i, Py_TYPE(item)->tp_name); goto onError; @@ -14452,7 +14442,7 @@ default: PyErr_Format(PyExc_ValueError, "unsupported format character '%c' (0x%x) " - "at index %" PY_FORMAT_SIZE_T "d", + "at index %zd", (31<=arg->ch && arg->ch<=126) ? (char)arg->ch : '?', (int)arg->ch, ctx->fmtpos - 1); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 4 22:50:44 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 4 Jul 2014 22:50:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzIxODkyLCAjMjE4OTM6IFBhcnRpYWwg?= =?utf-8?q?revert_of_changeset_4f55e802baf0=2C?= Message-ID: <3h4pGr3VMrz7LpV@mail.python.org> http://hg.python.org/cpython/rev/58cd562e3ef9 changeset: 91543:58cd562e3ef9 parent: 91541:4f129a722341 parent: 91542:6fb1e2ce513a user: Victor Stinner date: Fri Jul 04 22:50:13 2014 +0200 summary: (Merge 3.4) Issue #21892, #21893: Partial revert of changeset 4f55e802baf0, PyErr_Format() uses "%zd" for Py_ssize_t, not PY_FORMAT_SIZE_T files: Objects/unicodeobject.c | 26 ++++++++------------------ 1 files changed, 8 insertions(+), 18 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1372,9 +1372,8 @@ 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 %" PY_FORMAT_SIZE_T "i characters at %" - PY_FORMAT_SIZE_T "i in a string of %" - PY_FORMAT_SIZE_T "i characters", + "Cannot write %zi characters at %zi " + "in a string of %zi characters", how_many, to_start, PyUnicode_GET_LENGTH(to)); return -1; } @@ -4083,9 +4082,7 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); goto onError; } @@ -4178,9 +4175,7 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); goto onError; } @@ -6443,9 +6438,7 @@ if (*newpos<0) *newpos = len + *newpos; if (*newpos<0 || *newpos>len) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -8445,9 +8438,7 @@ else *newpos = i_newpos; if (*newpos<0 || *newpos>PyUnicode_GET_LENGTH(unicode)) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -9775,8 +9766,7 @@ item = items[i]; if (!PyUnicode_Check(item)) { PyErr_Format(PyExc_TypeError, - "sequence item %" PY_FORMAT_SIZE_T - "d: expected str instance," + "sequence item %zd: expected str instance," " %.80s found", i, Py_TYPE(item)->tp_name); goto onError; @@ -14466,7 +14456,7 @@ default: PyErr_Format(PyExc_ValueError, "unsupported format character '%c' (0x%x) " - "at index %" PY_FORMAT_SIZE_T "d", + "at index %zd", (31<=arg->ch && arg->ch<=126) ? (char)arg->ch : '?', (int)arg->ch, ctx->fmtpos - 1); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 4 23:38:34 2014 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 4 Jul 2014 23:38:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_update?= Message-ID: <3h4qL23L2Pz7LnD@mail.python.org> http://hg.python.org/peps/rev/029c5ecb74d9 changeset: 5494:029c5ecb74d9 user: Benjamin Peterson date: Fri Jul 04 14:38:29 2014 -0700 summary: update files: pep-0373.txt | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/pep-0373.txt b/pep-0373.txt --- a/pep-0373.txt +++ b/pep-0373.txt @@ -71,10 +71,8 @@ Planned future release dates: -- 2.7.7 rc1 2014-05-17 -- 2.7.7 final 2014-05-31 -- 2.7.8 November 2014 -- 2.7.9 May 2015 +- 2.7.9 December 2014 +- 2.7.10 June 2015 - beyond this date, releases as needed Dates of previous maintenance releases: @@ -89,6 +87,9 @@ - 2.7.5 2013-05-12 - 2.7.6rc1 2013-10-26 - 2.7.6 2013-11-10 +- 2.7.7rc1 2014-05-17 +- 2.7.7 2014-05-31 +- 2.7.8 2014-06-30 Possible features for 2.7 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Jul 5 02:00:30 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 5 Jul 2014 02:00:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_properly_decref_the_return?= =?utf-8?q?_value_of_close=28=29?= Message-ID: <3h4tTp6Tv1z7Lpg@mail.python.org> http://hg.python.org/cpython/rev/c43362d35d8d changeset: 91544:c43362d35d8d user: Benjamin Peterson date: Fri Jul 04 17:00:25 2014 -0700 summary: properly decref the return value of close() files: Modules/_io/_iomodule.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -455,11 +455,13 @@ error: if (result != NULL) { - PyObject *exc, *val, *tb; + PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - if (_PyObject_CallMethodId(result, &PyId_close, NULL) != NULL) + close_result = _PyObject_CallMethodId(result, &PyId_close, NULL); + if (close_result != NULL) { + Py_DECREF(close_result); PyErr_Restore(exc, val, tb); - else { + } else { PyObject *exc2, *val2, *tb2; PyErr_Fetch(&exc2, &val2, &tb2); PyErr_NormalizeException(&exc, &val, &tb); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 02:18:04 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 5 Jul 2014 02:18:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_properly_decre?= =?utf-8?q?f_the_return_value_of_close=28=29?= Message-ID: <3h4tt45wZfz7Lp6@mail.python.org> http://hg.python.org/cpython/rev/5563f895b215 changeset: 91545:5563f895b215 branch: 2.7 parent: 91536:f2e6c33ce3e9 user: Benjamin Peterson date: Fri Jul 04 17:00:25 2014 -0700 summary: properly decref the return value of close() files: Modules/_io/_iomodule.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -526,11 +526,13 @@ error: if (result != NULL) { - PyObject *exc, *val, *tb; + PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - if (PyObject_CallMethod(result, "close", NULL) != NULL) + close_result = PyObject_CallMethod(result, "close", NULL); + if (close_result != NULL) { + Py_DECREF(close_result); PyErr_Restore(exc, val, tb); - else { + } else { Py_XDECREF(exc); Py_XDECREF(val); Py_XDECREF(tb); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 02:18:06 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 5 Jul 2014 02:18:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_properly_decre?= =?utf-8?q?f_the_return_value_of_close=28=29?= Message-ID: <3h4tt60DZcz7LpL@mail.python.org> http://hg.python.org/cpython/rev/888fd1cdec6f changeset: 91546:888fd1cdec6f branch: 3.4 parent: 91542:6fb1e2ce513a user: Benjamin Peterson date: Fri Jul 04 17:00:25 2014 -0700 summary: properly decref the return value of close() files: Modules/_io/_iomodule.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -465,11 +465,13 @@ error: if (result != NULL) { - PyObject *exc, *val, *tb; + PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - if (_PyObject_CallMethodId(result, &PyId_close, NULL) != NULL) + close_result = _PyObject_CallMethodId(result, &PyId_close, NULL); + if (close_result != NULL) { + Py_DECREF(close_result); PyErr_Restore(exc, val, tb); - else { + } else { PyObject *exc2, *val2, *tb2; PyErr_Fetch(&exc2, &val2, &tb2); PyErr_NormalizeException(&exc, &val, &tb); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 02:18:07 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 5 Jul 2014 02:18:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy40?= Message-ID: <3h4tt71rv6z7Lpw@mail.python.org> http://hg.python.org/cpython/rev/f79f0967537f changeset: 91547:f79f0967537f parent: 91544:c43362d35d8d parent: 91546:888fd1cdec6f user: Benjamin Peterson date: Fri Jul 04 17:17:57 2014 -0700 summary: merge 3.4 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 02:30:39 2014 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 5 Jul 2014 02:30:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODk3?= =?utf-8?q?=3A_Fix_a_crash_with_the_f=5Flocals_attribute_with_closure_vari?= =?utf-8?q?ables?= Message-ID: <3h4v8b1hQ8z7LpX@mail.python.org> http://hg.python.org/cpython/rev/758468cdf72c changeset: 91548:758468cdf72c branch: 3.4 parent: 91546:888fd1cdec6f user: Antoine Pitrou date: Fri Jul 04 20:24:13 2014 -0400 summary: Issue #21897: Fix a crash with the f_locals attribute with closure variables when frame.clear() has been called. files: Lib/test/test_frame.py | 52 ++++++++++++++++++++++++++++++ Misc/NEWS | 3 + Objects/frameobject.c | 2 +- 3 files changed, 56 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -1,5 +1,6 @@ import gc import sys +import types import unittest import weakref @@ -109,6 +110,57 @@ self.assertIs(None, wr()) +class FrameLocalsTest(unittest.TestCase): + """ + Tests for the .f_locals attribute. + """ + + def make_frames(self): + def outer(): + x = 5 + y = 6 + def inner(): + z = x + 2 + 1/0 + t = 9 + return inner() + try: + outer() + except ZeroDivisionError as e: + tb = e.__traceback__ + frames = [] + while tb: + frames.append(tb.tb_frame) + tb = tb.tb_next + return frames + + def test_locals(self): + f, outer, inner = self.make_frames() + outer_locals = outer.f_locals + self.assertIsInstance(outer_locals.pop('inner'), types.FunctionType) + self.assertEqual(outer_locals, {'x': 5, 'y': 6}) + inner_locals = inner.f_locals + self.assertEqual(inner_locals, {'x': 5, 'z': 7}) + + def test_clear_locals(self): + # Test f_locals after clear() (issue #21897) + f, outer, inner = self.make_frames() + outer.clear() + inner.clear() + self.assertEqual(outer.f_locals, {}) + self.assertEqual(inner.f_locals, {}) + + def test_locals_clear_locals(self): + # Test f_locals before and after clear() (to exercise caching) + f, outer, inner = self.make_frames() + outer.f_locals + inner.f_locals + outer.clear() + inner.clear() + self.assertEqual(outer.f_locals, {}) + self.assertEqual(inner.f_locals, {}) + + def test_main(): support.run_unittest(__name__) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21897: Fix a crash with the f_locals attribute with closure + variables when frame.clear() has been called. + - Issue #21151: Fixed a segfault in the winreg module when ``None`` is passed as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. diff --git a/Objects/frameobject.c b/Objects/frameobject.c --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -786,7 +786,7 @@ PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = values[j]; assert(PyUnicode_Check(key)); - if (deref) { + if (deref && value != NULL) { assert(PyCell_Check(value)); value = PyCell_GET(value); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 02:30:40 2014 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 5 Jul 2014 02:30:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321897=3A_Fix_a_crash_with_the_f=5Flocals_attrib?= =?utf-8?q?ute_with_closure_variables?= Message-ID: <3h4v8c3Qy8z7LpX@mail.python.org> http://hg.python.org/cpython/rev/bd6515070f9c changeset: 91549:bd6515070f9c parent: 91547:f79f0967537f parent: 91548:758468cdf72c user: Antoine Pitrou date: Fri Jul 04 20:26:22 2014 -0400 summary: Issue #21897: Fix a crash with the f_locals attribute with closure variables when frame.clear() has been called. files: Lib/test/test_frame.py | 52 ++++++++++++++++++++++++++++++ Misc/NEWS | 3 + Objects/frameobject.c | 2 +- 3 files changed, 56 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -1,5 +1,6 @@ import gc import sys +import types import unittest import weakref @@ -109,6 +110,57 @@ self.assertIs(None, wr()) +class FrameLocalsTest(unittest.TestCase): + """ + Tests for the .f_locals attribute. + """ + + def make_frames(self): + def outer(): + x = 5 + y = 6 + def inner(): + z = x + 2 + 1/0 + t = 9 + return inner() + try: + outer() + except ZeroDivisionError as e: + tb = e.__traceback__ + frames = [] + while tb: + frames.append(tb.tb_frame) + tb = tb.tb_next + return frames + + def test_locals(self): + f, outer, inner = self.make_frames() + outer_locals = outer.f_locals + self.assertIsInstance(outer_locals.pop('inner'), types.FunctionType) + self.assertEqual(outer_locals, {'x': 5, 'y': 6}) + inner_locals = inner.f_locals + self.assertEqual(inner_locals, {'x': 5, 'z': 7}) + + def test_clear_locals(self): + # Test f_locals after clear() (issue #21897) + f, outer, inner = self.make_frames() + outer.clear() + inner.clear() + self.assertEqual(outer.f_locals, {}) + self.assertEqual(inner.f_locals, {}) + + def test_locals_clear_locals(self): + # Test f_locals before and after clear() (to exercise caching) + f, outer, inner = self.make_frames() + outer.f_locals + inner.f_locals + outer.clear() + inner.clear() + self.assertEqual(outer.f_locals, {}) + self.assertEqual(inner.f_locals, {}) + + def test_main(): support.run_unittest(__name__) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #21897: Fix a crash with the f_locals attribute with closure + variables when frame.clear() has been called. + - Issue #21205: Add a new ``__qualname__`` attribute to generator, the qualified name, and use it in the representation of a generator (``repr(gen)``). The default name of the generator (``__name__`` attribute) diff --git a/Objects/frameobject.c b/Objects/frameobject.c --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -786,7 +786,7 @@ PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = values[j]; assert(PyUnicode_Check(key)); - if (deref) { + if (deref && value != NULL) { assert(PyCell_Check(value)); value = PyCell_GET(value); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 10:11:04 2014 From: python-checkins at python.org (berker.peksag) Date: Sat, 5 Jul 2014 10:11:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTIw?= =?utf-8?q?=3A_Add_a_missing_colon_to_the_=5F=5Fmain=5F=5F_doc=2E?= Message-ID: <3h55Mr514Bz7LqK@mail.python.org> http://hg.python.org/cpython/rev/6094aa25b33c changeset: 91550:6094aa25b33c branch: 3.4 parent: 91548:758468cdf72c user: Berker Peksag date: Sat Jul 05 11:10:16 2014 +0300 summary: Issue #21920: Add a missing colon to the __main__ doc. Patch by Stefan Tatschner. files: Doc/library/__main__.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst --- a/Doc/library/__main__.rst +++ b/Doc/library/__main__.rst @@ -12,7 +12,7 @@ A module can discover whether or not it is running in the main scope by checking its own ``__name__``, which allows a common idiom for conditionally executing code in a module when it is run as a script or with ``python --m`` but not when it is imported: +-m`` but not when it is imported:: if __name__ == "__main__": # execute only if run as a script -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 10:11:05 2014 From: python-checkins at python.org (berker.peksag) Date: Sat, 5 Jul 2014 10:11:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321920=3A_Merge_from_3=2E4=2E?= Message-ID: <3h55Ms6JG9z7Lqk@mail.python.org> http://hg.python.org/cpython/rev/e22d0ff286f9 changeset: 91551:e22d0ff286f9 parent: 91549:bd6515070f9c parent: 91550:6094aa25b33c user: Berker Peksag date: Sat Jul 05 11:11:09 2014 +0300 summary: Issue #21920: Merge from 3.4. files: Doc/library/__main__.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst --- a/Doc/library/__main__.rst +++ b/Doc/library/__main__.rst @@ -12,7 +12,7 @@ A module can discover whether or not it is running in the main scope by checking its own ``__name__``, which allows a common idiom for conditionally executing code in a module when it is run as a script or with ``python --m`` but not when it is imported: +-m`` but not when it is imported:: if __name__ == "__main__": # execute only if run as a script -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Jul 5 10:58:56 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 05 Jul 2014 10:58:56 +0200 Subject: [Python-checkins] Daily reference leaks (bd6515070f9c): sum=5 Message-ID: results for bd6515070f9c on branch "default" -------------------------------------------- test_collections leaked [2, 0, 0] references, sum=2 test_functools leaked [0, 0, 3] memory blocks, sum=3 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogvJTzhp', '-x'] From python-checkins at python.org Sat Jul 5 15:31:26 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 5 Jul 2014 15:31:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQ2xvc2VzICMyMTg4?= =?utf-8?q?6=2C_=2321447=3A_Fix_a_race_condition_in_asyncio_when_setting_t?= =?utf-8?q?he_result?= Message-ID: <3h5DTV71bcz7LpL@mail.python.org> http://hg.python.org/cpython/rev/d7e4efd5e279 changeset: 91552:d7e4efd5e279 branch: 3.4 parent: 91550:6094aa25b33c user: Victor Stinner date: Sat Jul 05 15:29:41 2014 +0200 summary: Closes #21886, #21447: Fix a race condition in asyncio when setting the result of a Future with call_soon(). Add an helper, a private method, to set the result only if the future was not cancelled. files: Lib/asyncio/coroutines.py | 6 ++++++ Lib/asyncio/futures.py | 6 ++++++ Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/queues.py | 2 +- Lib/asyncio/selector_events.py | 5 +++-- Lib/asyncio/tasks.py | 3 ++- Lib/asyncio/unix_events.py | 4 ++-- Lib/test/test_asyncio/test_futures.py | 6 ++++++ Lib/test/test_asyncio/test_tasks.py | 4 ++++ 9 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -64,6 +64,12 @@ self.gen = gen self.func = func self._source_traceback = traceback.extract_stack(sys._getframe(1)) + # __name__, __qualname__, __doc__ attributes are set by the coroutine() + # decorator + + def __repr__(self): + return ('<%s %s>' + % (self.__class__.__name__, _format_coroutine(self))) def __iter__(self): return self diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -316,6 +316,12 @@ # So-called internal methods (note: no set_running_or_notify_cancel()). + def _set_result_unless_cancelled(self, result): + """Helper setting the result only if the future was not cancelled.""" + if self.cancelled(): + return + self.set_result(result) + def set_result(self, result): """Mark the future done and set its result. diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -173,7 +173,7 @@ # run, we need to defer the put for a tick to ensure that # getters and putters alternate perfectly. See # ChannelTest.test_wait. - self._loop.call_soon(putter.set_result, None) + self._loop.call_soon(putter._set_result_unless_cancelled, None) return self._get() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): if self._closing: @@ -690,7 +690,8 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if self._waiter is not None: - self._loop.call_soon(self._waiter.set_result, None) + self._loop.call_soon(self._waiter._set_result_unless_cancelled, + None) def pause_reading(self): # XXX This is a bit icky, given the comment at the top of diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -487,7 +487,8 @@ def sleep(delay, result=None, *, loop=None): """Coroutine that completes after a given time (in seconds).""" future = futures.Future(loop=loop) - h = future._loop.call_later(delay, future.set_result, result) + h = future._loop.call_later(delay, + future._set_result_unless_cancelled, result) try: return (yield from future) finally: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -269,7 +269,7 @@ self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _read_ready(self): try: @@ -353,7 +353,7 @@ self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): return sum(len(data) for data in self._buffer) diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -343,6 +343,12 @@ message = m_log.error.call_args[0][0] self.assertRegex(message, re.compile(regex, re.DOTALL)) + def test_set_result_unless_cancelled(self): + fut = asyncio.Future(loop=self.loop) + fut.cancel() + fut._set_result_unless_cancelled(2) + self.assertTrue(fut.cancelled()) + class FutureDoneCallbackTests(test_utils.TestCase): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -211,6 +211,10 @@ coro = ('%s() at %s:%s' % (coro_qualname, code.co_filename, code.co_firstlineno)) + # test repr(CoroWrapper) + if coroutines._DEBUG: + self.assertEqual(repr(gen), '' % coro) + # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 15:31:28 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 5 Jul 2014 15:31:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgQ2xvc2VzICMyMTg4NiwgIzIxNDQ3OiBGaXggYSBy?= =?utf-8?q?ace_condition_in_asyncio_when_setting?= Message-ID: <3h5DTX2Lmsz7LqV@mail.python.org> http://hg.python.org/cpython/rev/50c995bdc00a changeset: 91553:50c995bdc00a parent: 91551:e22d0ff286f9 parent: 91552:d7e4efd5e279 user: Victor Stinner date: Sat Jul 05 15:30:42 2014 +0200 summary: (Merge 3.4) Closes #21886, #21447: Fix a race condition in asyncio when setting the result of a Future with call_soon(). Add an helper, a private method, to set the result only if the future was not cancelled. files: Lib/asyncio/coroutines.py | 6 ++++++ Lib/asyncio/futures.py | 6 ++++++ Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/queues.py | 2 +- Lib/asyncio/selector_events.py | 5 +++-- Lib/asyncio/tasks.py | 3 ++- Lib/asyncio/unix_events.py | 4 ++-- Lib/test/test_asyncio/test_futures.py | 6 ++++++ Lib/test/test_asyncio/test_tasks.py | 4 ++++ 9 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -64,6 +64,12 @@ self.gen = gen self.func = func self._source_traceback = traceback.extract_stack(sys._getframe(1)) + # __name__, __qualname__, __doc__ attributes are set by the coroutine() + # decorator + + def __repr__(self): + return ('<%s %s>' + % (self.__class__.__name__, _format_coroutine(self))) def __iter__(self): return self diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -316,6 +316,12 @@ # So-called internal methods (note: no set_running_or_notify_cancel()). + def _set_result_unless_cancelled(self, result): + """Helper setting the result only if the future was not cancelled.""" + if self.cancelled(): + return + self.set_result(result) + def set_result(self, result): """Mark the future done and set its result. diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -173,7 +173,7 @@ # run, we need to defer the put for a tick to ensure that # getters and putters alternate perfectly. See # ChannelTest.test_wait. - self._loop.call_soon(putter.set_result, None) + self._loop.call_soon(putter._set_result_unless_cancelled, None) return self._get() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): if self._closing: @@ -690,7 +690,8 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if self._waiter is not None: - self._loop.call_soon(self._waiter.set_result, None) + self._loop.call_soon(self._waiter._set_result_unless_cancelled, + None) def pause_reading(self): # XXX This is a bit icky, given the comment at the top of diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -487,7 +487,8 @@ def sleep(delay, result=None, *, loop=None): """Coroutine that completes after a given time (in seconds).""" future = futures.Future(loop=loop) - h = future._loop.call_later(delay, future.set_result, result) + h = future._loop.call_later(delay, + future._set_result_unless_cancelled, result) try: return (yield from future) finally: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -269,7 +269,7 @@ self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _read_ready(self): try: @@ -353,7 +353,7 @@ self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): return sum(len(data) for data in self._buffer) diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -343,6 +343,12 @@ message = m_log.error.call_args[0][0] self.assertRegex(message, re.compile(regex, re.DOTALL)) + def test_set_result_unless_cancelled(self): + fut = asyncio.Future(loop=self.loop) + fut.cancel() + fut._set_result_unless_cancelled(2) + self.assertTrue(fut.cancelled()) + class FutureDoneCallbackTests(test_utils.TestCase): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -211,6 +211,10 @@ coro = ('%s() at %s:%s' % (coro_qualname, code.co_filename, code.co_firstlineno)) + # test repr(CoroWrapper) + if coroutines._DEBUG: + self.assertEqual(repr(gen), '' % coro) + # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 15:41:29 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 5 Jul 2014 15:41:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQ2xvc2VzICMyMTky?= =?utf-8?q?1=3A_Fix_ResourceWarning_in_the_asyncio_examples=3A_close_the_e?= =?utf-8?q?vent?= Message-ID: <3h5Dj50R05z7Lp4@mail.python.org> http://hg.python.org/cpython/rev/f6827c6b1164 changeset: 91554:f6827c6b1164 branch: 3.4 parent: 91552:d7e4efd5e279 user: Victor Stinner date: Sat Jul 05 15:38:59 2014 +0200 summary: Closes #21921: Fix ResourceWarning in the asyncio examples: close the event loop at exit. Patch written by Vajrasky Kok (I modified also the "hello world" example using a coroutine). files: Doc/library/asyncio-eventloop.rst | 10 ++++++++-- Doc/library/asyncio-task.rst | 5 ++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -651,7 +651,10 @@ loop = asyncio.get_event_loop() loop.call_soon(print_and_repeat, loop) - loop.run_forever() + try: + loop.run_forever() + finally: + loop.close() .. seealso:: @@ -679,5 +682,8 @@ print("Event loop running forever, press CTRL+c to interrupt.") print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid()) - loop.run_forever() + try: + loop.run_forever() + finally: + loop.close() diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -89,7 +89,10 @@ yield from asyncio.sleep(2) loop = asyncio.get_event_loop() - loop.run_until_complete(greet_every_two_seconds()) + try: + loop.run_until_complete(greet_every_two_seconds()) + finally: + loop.close() .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 5 15:41:30 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 5 Jul 2014 15:41:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Closes_=2321921=3A_Fix_ResourceWarning?= =?utf-8?q?_in_the_asyncio_examples=3A_close?= Message-ID: <3h5Dj62Bqrz7LqV@mail.python.org> http://hg.python.org/cpython/rev/0533f148fb49 changeset: 91555:0533f148fb49 parent: 91553:50c995bdc00a parent: 91554:f6827c6b1164 user: Victor Stinner date: Sat Jul 05 15:41:18 2014 +0200 summary: (Merge 3.4) Closes #21921: Fix ResourceWarning in the asyncio examples: close the event loop at exit. Patch written by Vajrasky Kok (I modified also the "hello world" example using a coroutine). files: Doc/library/asyncio-eventloop.rst | 10 ++++++++-- Doc/library/asyncio-task.rst | 5 ++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -651,7 +651,10 @@ loop = asyncio.get_event_loop() loop.call_soon(print_and_repeat, loop) - loop.run_forever() + try: + loop.run_forever() + finally: + loop.close() .. seealso:: @@ -679,5 +682,8 @@ print("Event loop running forever, press CTRL+c to interrupt.") print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid()) - loop.run_forever() + try: + loop.run_forever() + finally: + loop.close() diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -89,7 +89,10 @@ yield from asyncio.sleep(2) loop = asyncio.get_event_loop() - loop.run_until_complete(greet_every_two_seconds()) + try: + loop.run_until_complete(greet_every_two_seconds()) + finally: + loop.close() .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 6 08:33:18 2014 From: python-checkins at python.org (berker.peksag) Date: Sun, 6 Jul 2014 08:33:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=239554=3A_Use_moder?= =?utf-8?q?n_unittest_features_in_test=5Fargparse=2E?= Message-ID: <3h5g8Z5l9zz7LsN@mail.python.org> http://hg.python.org/cpython/rev/f240ca6345c8 changeset: 91556:f240ca6345c8 user: Berker Peksag date: Sun Jul 06 09:33:20 2014 +0300 summary: Issue #9554: Use modern unittest features in test_argparse. Initial patch by Denver Coneybeare and Radu Voicilas. files: Lib/test/test_argparse.py | 102 +++++++------------------ Misc/ACKS | 1 + Misc/NEWS | 3 + 3 files changed, 35 insertions(+), 71 deletions(-) diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -20,15 +20,6 @@ class TestCase(unittest.TestCase): - def assertEqual(self, obj1, obj2): - if obj1 != obj2: - print('') - print(repr(obj1)) - print(repr(obj2)) - print(obj1) - print(obj2) - super(TestCase, self).assertEqual(obj1, obj2) - def setUp(self): # The tests assume that line wrapping occurs at 80 columns, but this # behaviour can be overridden by setting the COLUMNS environment @@ -1993,14 +1984,9 @@ ''')) def _test_subparser_help(self, args_str, expected_help): - try: + with self.assertRaises(ArgumentParserError) as cm: self.parser.parse_args(args_str.split()) - except ArgumentParserError: - err = sys.exc_info()[1] - if err.stdout != expected_help: - print(repr(expected_help)) - print(repr(err.stdout)) - self.assertEqual(err.stdout, expected_help) + self.assertEqual(expected_help, cm.exception.stdout) def test_subparser1_help(self): self._test_subparser_help('5.0 1 -h', textwrap.dedent('''\ @@ -2839,15 +2825,15 @@ def test_get_default(self): parser = ErrorRaisingArgumentParser() - self.assertEqual(None, parser.get_default("foo")) - self.assertEqual(None, parser.get_default("bar")) + self.assertIsNone(parser.get_default("foo")) + self.assertIsNone(parser.get_default("bar")) parser.add_argument("--foo") - self.assertEqual(None, parser.get_default("foo")) - self.assertEqual(None, parser.get_default("bar")) + self.assertIsNone(parser.get_default("foo")) + self.assertIsNone(parser.get_default("bar")) parser.add_argument("--bar", type=int, default=42) - self.assertEqual(None, parser.get_default("foo")) + self.assertIsNone(parser.get_default("foo")) self.assertEqual(42, parser.get_default("bar")) parser.set_defaults(foo="badger") @@ -2862,18 +2848,16 @@ def test_empty(self): ns = argparse.Namespace() - self.assertEqual('' in ns, False) - self.assertEqual('' not in ns, True) - self.assertEqual('x' in ns, False) + self.assertNotIn('', ns) + self.assertNotIn('x', ns) def test_non_empty(self): ns = argparse.Namespace(x=1, y=2) - self.assertEqual('x' in ns, True) - self.assertEqual('x' not in ns, False) - self.assertEqual('y' in ns, True) - self.assertEqual('' in ns, False) - self.assertEqual('xx' in ns, False) - self.assertEqual('z' in ns, False) + self.assertNotIn('', ns) + self.assertIn('x', ns) + self.assertIn('y', ns) + self.assertNotIn('xx', ns) + self.assertNotIn('z', ns) # ===================== # Help formatting tests @@ -2929,13 +2913,6 @@ def _test(self, tester, parser_text): expected_text = getattr(tester, self.func_suffix) expected_text = textwrap.dedent(expected_text) - if expected_text != parser_text: - print(repr(expected_text)) - print(repr(parser_text)) - for char1, char2 in zip(expected_text, parser_text): - if char1 != char2: - print('first diff: %r %r' % (char1, char2)) - break tester.assertEqual(expected_text, parser_text) def test_format(self, tester): @@ -4216,24 +4193,17 @@ self.assertValueError('foo', action='baz') self.assertValueError('--foo', action=('store', 'append')) parser = argparse.ArgumentParser() - try: + with self.assertRaises(ValueError) as cm: parser.add_argument("--foo", action="store-true") - except ValueError: - e = sys.exc_info()[1] - expected = 'unknown action' - msg = 'expected %r, found %r' % (expected, e) - self.assertTrue(expected in str(e), msg) + self.assertIn('unknown action', str(cm.exception)) def test_multiple_dest(self): parser = argparse.ArgumentParser() parser.add_argument(dest='foo') - try: + with self.assertRaises(ValueError) as cm: parser.add_argument('bar', dest='baz') - except ValueError: - e = sys.exc_info()[1] - expected = 'dest supplied twice for positional argument' - msg = 'expected %r, found %r' % (expected, e) - self.assertTrue(expected in str(e), msg) + self.assertIn('dest supplied twice for positional argument', + str(cm.exception)) def test_no_argument_actions(self): for action in ['store_const', 'store_true', 'store_false', @@ -4390,18 +4360,10 @@ class TestOptionalsHelpVersionActions(TestCase): """Test the help and version actions""" - def _get_error(self, func, *args, **kwargs): - try: - func(*args, **kwargs) - except ArgumentParserError: - return sys.exc_info()[1] - else: - self.assertRaises(ArgumentParserError, func, *args, **kwargs) - def assertPrintHelpExit(self, parser, args_str): - self.assertEqual( - parser.format_help(), - self._get_error(parser.parse_args, args_str.split()).stdout) + with self.assertRaises(ArgumentParserError) as cm: + parser.parse_args(args_str.split()) + self.assertEqual(parser.format_help(), cm.exception.stdout) def assertArgumentParserError(self, parser, *args): self.assertRaises(ArgumentParserError, parser.parse_args, args) @@ -4416,8 +4378,9 @@ def test_version_format(self): parser = ErrorRaisingArgumentParser(prog='PPP') parser.add_argument('-v', '--version', action='version', version='%(prog)s 3.5') - msg = self._get_error(parser.parse_args, ['-v']).stdout - self.assertEqual('PPP 3.5\n', msg) + with self.assertRaises(ArgumentParserError) as cm: + parser.parse_args(['-v']) + self.assertEqual('PPP 3.5\n', cm.exception.stdout) def test_version_no_help(self): parser = ErrorRaisingArgumentParser(add_help=False) @@ -4429,8 +4392,9 @@ def test_version_action(self): parser = ErrorRaisingArgumentParser(prog='XXX') parser.add_argument('-V', action='version', version='%(prog)s 3.7') - msg = self._get_error(parser.parse_args, ['-V']).stdout - self.assertEqual('XXX 3.7\n', msg) + with self.assertRaises(ArgumentParserError) as cm: + parser.parse_args(['-V']) + self.assertEqual('XXX 3.7\n', cm.exception.stdout) def test_no_help(self): parser = ErrorRaisingArgumentParser(add_help=False) @@ -4600,14 +4564,10 @@ parser = ErrorRaisingArgumentParser(prog='PROG', add_help=False) parser.add_argument('x', type=spam) - try: + with self.assertRaises(ArgumentParserError) as cm: parser.parse_args(['XXX']) - except ArgumentParserError: - expected = 'usage: PROG x\nPROG: error: argument x: spam!\n' - msg = sys.exc_info()[1].stderr - self.assertEqual(expected, msg) - else: - self.fail() + self.assertEqual('usage: PROG x\nPROG: error: argument x: spam!\n', + cm.exception.stderr) # ========================= # MessageContentError tests diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1399,6 +1399,7 @@ Pauli Virtanen Frank Visser Johannes Vogel +Radu Voicilas Alex Volkov Martijn Vries Sjoerd de Vries diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -653,6 +653,9 @@ Tests ----- +- Issue #9554: Use modern unittest features in test_argparse. Initial patch by + Denver Coneybeare and Radu Voicilas. + - Issue #20155: Changed HTTP method names in failing tests in test_httpservers so that packet filtering software (specifically Windows Base Filtering Engine) does not interfere with the transaction semantics expected by the tests. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Jul 6 11:05:50 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 06 Jul 2014 11:05:50 +0200 Subject: [Python-checkins] Daily reference leaks (0533f148fb49): sum=55 Message-ID: results for 0533f148fb49 on branch "default" -------------------------------------------- test_collections leaked [0, -2, 2] references, sum=0 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_multiprocessing_fork leaked [38, 0, 0] references, sum=38 test_multiprocessing_fork leaked [18, 0, 0] memory blocks, sum=18 test_site leaked [0, 0, -2] references, sum=-2 test_site leaked [0, 0, -2] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogxHa2kM', '-x'] From python-checkins at python.org Sun Jul 6 19:58:08 2014 From: python-checkins at python.org (ezio.melotti) Date: Sun, 6 Jul 2014 19:58:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzIwMTM1OiBtb3Zl?= =?utf-8?q?_FAQ_about_mutable_default_arguments_to_the_programming_FAQs_pa?= =?utf-8?b?Z2Uu?= Message-ID: <3h5yLm3W7dz7LmN@mail.python.org> http://hg.python.org/cpython/rev/3881c12fa3ae changeset: 91557:3881c12fa3ae branch: 2.7 parent: 91545:5563f895b215 user: Ezio Melotti date: Sun Jul 06 20:53:27 2014 +0300 summary: #20135: move FAQ about mutable default arguments to the programming FAQs page. files: Doc/faq/design.rst | 56 ----------------------------- Doc/faq/programming.rst | 56 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -712,62 +712,6 @@ sloppy and not write test cases at all. -Why are default values shared between objects? ----------------------------------------------- - -This type of bug commonly bites neophyte programmers. Consider this function:: - - def foo(mydict={}): # Danger: shared reference to one dict for all calls - ... compute something ... - mydict[key] = value - return mydict - -The first time you call this function, ``mydict`` contains a single item. The -second time, ``mydict`` contains two items because when ``foo()`` begins -executing, ``mydict`` starts out with an item already in it. - -It is often expected that a function call creates new objects for default -values. This is not what happens. Default values are created exactly once, when -the function is defined. If that object is changed, like the dictionary in this -example, subsequent calls to the function will refer to this changed object. - -By definition, immutable objects such as numbers, strings, tuples, and ``None``, -are safe from change. Changes to mutable objects such as dictionaries, lists, -and class instances can lead to confusion. - -Because of this feature, it is good programming practice to not use mutable -objects as default values. Instead, use ``None`` as the default value and -inside the function, check if the parameter is ``None`` and create a new -list/dictionary/whatever if it is. For example, don't write:: - - def foo(mydict={}): - ... - -but:: - - def foo(mydict=None): - if mydict is None: - mydict = {} # create a new dict for local namespace - -This feature can be useful. When you have a function that's time-consuming to -compute, a common technique is to cache the parameters and the resulting value -of each call to the function, and return the cached value if the same value is -requested again. This is called "memoizing", and can be implemented like this:: - - # Callers will never provide a third parameter for this function. - def expensive(arg1, arg2, _cache={}): - if (arg1, arg2) in _cache: - return _cache[(arg1, arg2)] - - # Calculate the value - result = ... expensive computation ... - _cache[(arg1, arg2)] = result # Store result in the cache - return result - -You could use a global variable containing a dictionary instead of the default -value; it's a matter of taste. - - Why is there no goto? --------------------- diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -499,6 +499,62 @@ occur when the module is initialized. +Why are default values shared between objects? +---------------------------------------------- + +This type of bug commonly bites neophyte programmers. Consider this function:: + + def foo(mydict={}): # Danger: shared reference to one dict for all calls + ... compute something ... + mydict[key] = value + return mydict + +The first time you call this function, ``mydict`` contains a single item. The +second time, ``mydict`` contains two items because when ``foo()`` begins +executing, ``mydict`` starts out with an item already in it. + +It is often expected that a function call creates new objects for default +values. This is not what happens. Default values are created exactly once, when +the function is defined. If that object is changed, like the dictionary in this +example, subsequent calls to the function will refer to this changed object. + +By definition, immutable objects such as numbers, strings, tuples, and ``None``, +are safe from change. Changes to mutable objects such as dictionaries, lists, +and class instances can lead to confusion. + +Because of this feature, it is good programming practice to not use mutable +objects as default values. Instead, use ``None`` as the default value and +inside the function, check if the parameter is ``None`` and create a new +list/dictionary/whatever if it is. For example, don't write:: + + def foo(mydict={}): + ... + +but:: + + def foo(mydict=None): + if mydict is None: + mydict = {} # create a new dict for local namespace + +This feature can be useful. When you have a function that's time-consuming to +compute, a common technique is to cache the parameters and the resulting value +of each call to the function, and return the cached value if the same value is +requested again. This is called "memoizing", and can be implemented like this:: + + # Callers will never provide a third parameter for this function. + def expensive(arg1, arg2, _cache={}): + if (arg1, arg2) in _cache: + return _cache[(arg1, arg2)] + + # Calculate the value + result = ... expensive computation ... + _cache[(arg1, arg2)] = result # Store result in the cache + return result + +You could use a global variable containing a dictionary instead of the default +value; it's a matter of taste. + + How can I pass optional or keyword parameters from one function to another? --------------------------------------------------------------------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 6 19:58:09 2014 From: python-checkins at python.org (ezio.melotti) Date: Sun, 6 Jul 2014 19:58:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogIzIwMTM1OiBtb3Zl?= =?utf-8?q?_FAQ_about_mutable_default_arguments_to_the_programming_FAQs_pa?= =?utf-8?b?Z2Uu?= Message-ID: <3h5yLp04TVz7LrH@mail.python.org> http://hg.python.org/cpython/rev/3b7b0f5aac1e changeset: 91558:3b7b0f5aac1e branch: 3.4 parent: 91554:f6827c6b1164 user: Ezio Melotti date: Sun Jul 06 20:53:27 2014 +0300 summary: #20135: move FAQ about mutable default arguments to the programming FAQs page. files: Doc/faq/design.rst | 56 ----------------------------- Doc/faq/programming.rst | 56 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -664,62 +664,6 @@ sloppy and not write test cases at all. -Why are default values shared between objects? ----------------------------------------------- - -This type of bug commonly bites neophyte programmers. Consider this function:: - - def foo(mydict={}): # Danger: shared reference to one dict for all calls - ... compute something ... - mydict[key] = value - return mydict - -The first time you call this function, ``mydict`` contains a single item. The -second time, ``mydict`` contains two items because when ``foo()`` begins -executing, ``mydict`` starts out with an item already in it. - -It is often expected that a function call creates new objects for default -values. This is not what happens. Default values are created exactly once, when -the function is defined. If that object is changed, like the dictionary in this -example, subsequent calls to the function will refer to this changed object. - -By definition, immutable objects such as numbers, strings, tuples, and ``None``, -are safe from change. Changes to mutable objects such as dictionaries, lists, -and class instances can lead to confusion. - -Because of this feature, it is good programming practice to not use mutable -objects as default values. Instead, use ``None`` as the default value and -inside the function, check if the parameter is ``None`` and create a new -list/dictionary/whatever if it is. For example, don't write:: - - def foo(mydict={}): - ... - -but:: - - def foo(mydict=None): - if mydict is None: - mydict = {} # create a new dict for local namespace - -This feature can be useful. When you have a function that's time-consuming to -compute, a common technique is to cache the parameters and the resulting value -of each call to the function, and return the cached value if the same value is -requested again. This is called "memoizing", and can be implemented like this:: - - # Callers will never provide a third parameter for this function. - def expensive(arg1, arg2, _cache={}): - if (arg1, arg2) in _cache: - return _cache[(arg1, arg2)] - - # Calculate the value - result = ... expensive computation ... - _cache[(arg1, arg2)] = result # Store result in the cache - return result - -You could use a global variable containing a dictionary instead of the default -value; it's a matter of taste. - - Why is there no goto? --------------------- diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -352,6 +352,62 @@ occur when the module is initialized. +Why are default values shared between objects? +---------------------------------------------- + +This type of bug commonly bites neophyte programmers. Consider this function:: + + def foo(mydict={}): # Danger: shared reference to one dict for all calls + ... compute something ... + mydict[key] = value + return mydict + +The first time you call this function, ``mydict`` contains a single item. The +second time, ``mydict`` contains two items because when ``foo()`` begins +executing, ``mydict`` starts out with an item already in it. + +It is often expected that a function call creates new objects for default +values. This is not what happens. Default values are created exactly once, when +the function is defined. If that object is changed, like the dictionary in this +example, subsequent calls to the function will refer to this changed object. + +By definition, immutable objects such as numbers, strings, tuples, and ``None``, +are safe from change. Changes to mutable objects such as dictionaries, lists, +and class instances can lead to confusion. + +Because of this feature, it is good programming practice to not use mutable +objects as default values. Instead, use ``None`` as the default value and +inside the function, check if the parameter is ``None`` and create a new +list/dictionary/whatever if it is. For example, don't write:: + + def foo(mydict={}): + ... + +but:: + + def foo(mydict=None): + if mydict is None: + mydict = {} # create a new dict for local namespace + +This feature can be useful. When you have a function that's time-consuming to +compute, a common technique is to cache the parameters and the resulting value +of each call to the function, and return the cached value if the same value is +requested again. This is called "memoizing", and can be implemented like this:: + + # Callers will never provide a third parameter for this function. + def expensive(arg1, arg2, _cache={}): + if (arg1, arg2) in _cache: + return _cache[(arg1, arg2)] + + # Calculate the value + result = ... expensive computation ... + _cache[(arg1, arg2)] = result # Store result in the cache + return result + +You could use a global variable containing a dictionary instead of the default +value; it's a matter of taste. + + How can I pass optional or keyword parameters from one function to another? --------------------------------------------------------------------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 6 19:58:11 2014 From: python-checkins at python.org (ezio.melotti) Date: Sun, 6 Jul 2014 19:58:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogIzIwMTM1OiBtZXJnZSB3aXRoIDMuNC4=?= Message-ID: <3h5yLq2zF5z7Lt7@mail.python.org> http://hg.python.org/cpython/rev/f2a36b01ac02 changeset: 91559:f2a36b01ac02 parent: 91556:f240ca6345c8 parent: 91558:3b7b0f5aac1e user: Ezio Melotti date: Sun Jul 06 20:59:19 2014 +0300 summary: #20135: merge with 3.4. files: Doc/faq/design.rst | 56 ----------------------------- Doc/faq/programming.rst | 56 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -664,62 +664,6 @@ sloppy and not write test cases at all. -Why are default values shared between objects? ----------------------------------------------- - -This type of bug commonly bites neophyte programmers. Consider this function:: - - def foo(mydict={}): # Danger: shared reference to one dict for all calls - ... compute something ... - mydict[key] = value - return mydict - -The first time you call this function, ``mydict`` contains a single item. The -second time, ``mydict`` contains two items because when ``foo()`` begins -executing, ``mydict`` starts out with an item already in it. - -It is often expected that a function call creates new objects for default -values. This is not what happens. Default values are created exactly once, when -the function is defined. If that object is changed, like the dictionary in this -example, subsequent calls to the function will refer to this changed object. - -By definition, immutable objects such as numbers, strings, tuples, and ``None``, -are safe from change. Changes to mutable objects such as dictionaries, lists, -and class instances can lead to confusion. - -Because of this feature, it is good programming practice to not use mutable -objects as default values. Instead, use ``None`` as the default value and -inside the function, check if the parameter is ``None`` and create a new -list/dictionary/whatever if it is. For example, don't write:: - - def foo(mydict={}): - ... - -but:: - - def foo(mydict=None): - if mydict is None: - mydict = {} # create a new dict for local namespace - -This feature can be useful. When you have a function that's time-consuming to -compute, a common technique is to cache the parameters and the resulting value -of each call to the function, and return the cached value if the same value is -requested again. This is called "memoizing", and can be implemented like this:: - - # Callers will never provide a third parameter for this function. - def expensive(arg1, arg2, _cache={}): - if (arg1, arg2) in _cache: - return _cache[(arg1, arg2)] - - # Calculate the value - result = ... expensive computation ... - _cache[(arg1, arg2)] = result # Store result in the cache - return result - -You could use a global variable containing a dictionary instead of the default -value; it's a matter of taste. - - Why is there no goto? --------------------- diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -352,6 +352,62 @@ occur when the module is initialized. +Why are default values shared between objects? +---------------------------------------------- + +This type of bug commonly bites neophyte programmers. Consider this function:: + + def foo(mydict={}): # Danger: shared reference to one dict for all calls + ... compute something ... + mydict[key] = value + return mydict + +The first time you call this function, ``mydict`` contains a single item. The +second time, ``mydict`` contains two items because when ``foo()`` begins +executing, ``mydict`` starts out with an item already in it. + +It is often expected that a function call creates new objects for default +values. This is not what happens. Default values are created exactly once, when +the function is defined. If that object is changed, like the dictionary in this +example, subsequent calls to the function will refer to this changed object. + +By definition, immutable objects such as numbers, strings, tuples, and ``None``, +are safe from change. Changes to mutable objects such as dictionaries, lists, +and class instances can lead to confusion. + +Because of this feature, it is good programming practice to not use mutable +objects as default values. Instead, use ``None`` as the default value and +inside the function, check if the parameter is ``None`` and create a new +list/dictionary/whatever if it is. For example, don't write:: + + def foo(mydict={}): + ... + +but:: + + def foo(mydict=None): + if mydict is None: + mydict = {} # create a new dict for local namespace + +This feature can be useful. When you have a function that's time-consuming to +compute, a common technique is to cache the parameters and the resulting value +of each call to the function, and return the cached value if the same value is +requested again. This is called "memoizing", and can be implemented like this:: + + # Callers will never provide a third parameter for this function. + def expensive(arg1, arg2, _cache={}): + if (arg1, arg2) in _cache: + return _cache[(arg1, arg2)] + + # Calculate the value + result = ... expensive computation ... + _cache[(arg1, arg2)] = result # Store result in the cache + return result + +You could use a global variable containing a dictionary instead of the default +value; it's a matter of taste. + + How can I pass optional or keyword parameters from one function to another? --------------------------------------------------------------------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 6 22:04:43 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 6 Jul 2014 22:04:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_upgrade_to_unicode_7=2E0?= =?utf-8?q?=2E0?= Message-ID: <3h618q38NZz7LkJ@mail.python.org> http://hg.python.org/cpython/rev/d25ae22cc992 changeset: 91560:d25ae22cc992 user: Benjamin Peterson date: Sun Jul 06 13:04:20 2014 -0700 summary: upgrade to unicode 7.0.0 files: Doc/library/unicodedata.rst | 8 +- Lib/test/test_unicodedata.py | 4 +- Misc/NEWS | 2 + Modules/unicodedata_db.h | 9378 ++- Modules/unicodename_db.h | 40640 ++++++++-------- Objects/unicodetype_db.h | 3694 +- Tools/unicode/makeunicodedata.py | 2 +- 7 files changed, 28371 insertions(+), 25357 deletions(-) diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -15,8 +15,8 @@ This module provides access to the Unicode Character Database (UCD) which defines character properties for all Unicode characters. The data contained in -this database is compiled from the `UCD version 6.3.0 -`_. +this database is compiled from the `UCD version 7.0.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -166,6 +166,6 @@ .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/6.3.0/ucd/NameAliases.txt +.. [#] http://www.unicode.org/Public/7.0.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/6.3.0/ucd/NamedSequences.txt +.. [#] http://www.unicode.org/Public/7.0.0/ucd/NamedSequences.txt diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -21,7 +21,7 @@ class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = 'e74e878de71b6e780ffac271785c3cb58f6251f3' + expectedchecksum = '618e2c1a22ee79d2235319709f16c50f987ee21f' def test_method_checksum(self): h = hashlib.sha1() @@ -80,7 +80,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): # update this, if the database changes - expectedchecksum = 'f0b74d26776331cc7bdc3a4698f037d73f2cee2b' + expectedchecksum = '0f44b670846279c608f20e5b6eeb26e6a8ab1f07' def test_function_checksum(self): data = [] h = hashlib.sha1() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Upgrade Unicode database to Unicode 7.0.0. + - Issue #21897: Fix a crash with the f_locals attribute with closure variables when frame.clear() has been called. diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h --- a/Modules/unicodedata_db.h +++ b/Modules/unicodedata_db.h @@ -1,6 +1,6 @@ /* this file was generated by Tools/unicode/makeunicodedata.py 3.2 */ -#define UNIDATA_VERSION "6.3.0" +#define UNIDATA_VERSION "7.0.0" /* a list of unique database records */ const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = { {0, 0, 0, 0, 0, 0}, @@ -323,7 +323,9 @@ {27, 0, 19, 0, 1, 136}, {14, 0, 19, 0, 5, 0}, {8, 0, 19, 0, 5, 0}, + {9, 0, 9, 0, 5, 0}, {9, 0, 4, 0, 5, 0}, + {30, 0, 4, 0, 5, 0}, {9, 0, 12, 0, 5, 0}, {30, 0, 1, 0, 5, 170}, {5, 216, 1, 0, 5, 0}, @@ -335,8 +337,8 @@ }; /* Reindexing of NFC first characters. */ -#define TOTAL_FIRST 372 -#define TOTAL_LAST 56 +#define TOTAL_FIRST 376 +#define TOTAL_LAST 62 struct reindex{int start;short count,index;}; static struct reindex nfc_first[] = { { 60, 2, 0}, @@ -546,6 +548,9 @@ { 69787, 0, 368}, { 69797, 0, 369}, { 69937, 1, 370}, + { 70471, 0, 372}, + { 70841, 0, 373}, + { 71096, 1, 374}, {0,0,0} }; @@ -583,6 +588,12 @@ { 12441, 1, 52}, { 69818, 0, 54}, { 69927, 0, 55}, + { 70462, 0, 56}, + { 70487, 0, 57}, + { 70832, 0, 58}, + { 70842, 0, 59}, + { 70845, 0, 60}, + { 71087, 0, 61}, {0,0,0} }; @@ -714,36 +725,43 @@ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 123, 124, - 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 84, - 138, 139, 140, 141, 142, 84, 84, 84, 84, 84, 84, 143, 84, 144, 145, 146, - 84, 147, 84, 148, 84, 84, 84, 149, 84, 84, 84, 150, 151, 152, 153, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 154, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 41, 41, 41, 41, 41, 41, 155, 84, 156, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 41, 41, 41, 41, 41, 41, 41, 41, 157, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 41, 41, 41, 41, 158, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 159, 160, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 161, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 78, 162, 163, 164, 165, 84, 166, 84, 167, 168, 169, 170, 171, 172, - 173, 174, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 175, 176, 84, 84, 177, 178, 179, - 180, 181, 84, 182, 183, 184, 185, 186, 187, 188, 189, 190, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 101, 101, 101, + 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 138, 41, 41, 145, 138, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 138, 138, 138, 155, 138, 138, 138, 156, + 157, 158, 159, 160, 161, 162, 138, 138, 163, 138, 164, 165, 166, 138, + 138, 138, 167, 138, 138, 138, 168, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 169, 170, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 41, 41, 41, 41, 41, 41, 41, 41, 171, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 41, 41, 41, 41, 172, 173, 174, 175, 138, 138, 138, 138, + 138, 138, 176, 177, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 178, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 179, 180, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 78, + 181, 182, 183, 184, 138, 185, 138, 186, 187, 188, 189, 190, 191, 192, + 193, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 194, 195, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 196, 197, 138, 138, 198, 199, 200, 201, 202, 138, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, @@ -767,359 +785,459 @@ 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 191, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 215, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, - 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 192, - 101, 193, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 122, 122, 122, 122, 194, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 195, 84, 196, 197, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 121, 121, 121, 121, 121, 121, 121, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 216, + 101, 217, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 122, 122, 122, 122, 218, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 219, 138, 220, 221, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -1155,8 +1273,8 @@ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 222, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 198, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, @@ -1192,7 +1310,7 @@ 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 121, 198, + 121, 121, 121, 121, 222, }; static unsigned short index2[] = { @@ -1244,7 +1362,7 @@ 69, 59, 69, 69, 70, 60, 62, 62, 62, 60, 60, 60, 62, 62, 71, 60, 60, 60, 62, 62, 62, 62, 60, 61, 62, 62, 60, 72, 73, 73, 72, 73, 73, 72, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 44, 47, 44, 47, 74, 54, 44, - 47, 0, 0, 51, 47, 47, 47, 75, 0, 0, 0, 0, 0, 58, 76, 38, 75, 38, 38, 38, + 47, 0, 0, 51, 47, 47, 47, 75, 44, 0, 0, 0, 0, 58, 76, 38, 75, 38, 38, 38, 0, 38, 0, 38, 38, 43, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, 39, 39, 39, 39, 39, 39, 39, 38, 38, 43, 43, 43, 43, 43, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, @@ -1267,153 +1385,154 @@ 38, 43, 38, 43, 38, 43, 44, 47, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 47, 38, 43, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, + 44, 47, 44, 47, 44, 47, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 0, 0, 53, 83, 83, 83, 83, 83, 83, 0, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 53, 83, 83, 83, 83, 83, 83, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 35, - 0, 83, 84, 0, 0, 0, 0, 85, 0, 86, 81, 81, 81, 81, 86, 81, 81, 81, 87, 86, - 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, 81, 81, 87, - 88, 81, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 104, 81, 86, 104, 97, 0, 0, 0, 0, 0, 0, 0, 0, 107, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 35, 0, 83, 84, 0, 0, 26, 26, 85, 0, 86, 81, 81, 81, 81, 86, 81, + 81, 81, 87, 86, 81, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, + 86, 81, 81, 87, 88, 81, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 104, 81, 86, 104, 97, 0, 0, 0, 0, 0, + 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, + 0, 0, 0, 0, 107, 107, 107, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 108, 108, 108, 108, 108, 108, 78, 78, 109, 110, 110, 111, 112, 113, 26, + 26, 81, 81, 81, 81, 81, 81, 81, 81, 114, 115, 116, 113, 117, 0, 113, 113, + 118, 118, 119, 119, 119, 119, 119, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 120, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 121, 122, 123, 114, 115, 116, 124, 125, 126, 126, 127, 86, 81, 81, + 81, 81, 81, 86, 81, 81, 86, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 128, 110, 129, 129, 113, 118, 118, 130, 118, 118, 118, 118, 131, 131, + 131, 131, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 119, 118, 119, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 119, 113, 118, 81, 81, 81, 81, + 81, 81, 81, 108, 26, 81, 81, 81, 81, 86, 81, 120, 120, 81, 81, 26, 86, + 81, 81, 86, 118, 118, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 118, 118, 118, 133, 133, 118, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 0, 117, 118, 134, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 81, 86, 81, 81, + 86, 81, 81, 86, 86, 86, 81, 86, 86, 81, 86, 81, 81, 81, 86, 81, 86, 81, + 86, 81, 86, 81, 81, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, - 0, 107, 107, 107, 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 108, 108, - 108, 108, 108, 0, 78, 78, 109, 110, 110, 111, 112, 113, 26, 26, 81, 81, - 81, 81, 81, 81, 81, 81, 114, 115, 116, 113, 117, 0, 113, 113, 118, 118, - 119, 119, 119, 119, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 120, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 121, - 122, 123, 114, 115, 116, 124, 125, 126, 126, 127, 86, 81, 81, 81, 81, 81, - 86, 81, 81, 86, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 110, - 129, 129, 113, 118, 118, 130, 118, 118, 118, 118, 131, 131, 131, 131, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 119, 118, 119, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 119, 113, 118, 81, 81, 81, 81, 81, 81, 81, - 108, 26, 81, 81, 81, 81, 86, 81, 120, 120, 81, 81, 26, 86, 81, 81, 86, - 118, 118, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 118, 118, - 118, 133, 133, 118, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 0, 117, 118, 134, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 81, 86, 81, 81, 86, 81, 81, - 86, 86, 86, 81, 86, 86, 81, 86, 81, 81, 81, 86, 81, 86, 81, 86, 81, 86, - 81, 81, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, - 136, 136, 136, 136, 136, 136, 136, 136, 136, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, - 81, 81, 81, 81, 81, 81, 86, 81, 137, 137, 26, 138, 138, 138, 137, 0, 0, - 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, 81, 81, 81, 137, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 137, 81, 81, 81, 137, 81, 81, 81, 81, 81, 0, - 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 86, 86, 86, - 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 0, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, - 81, 86, 81, 81, 86, 81, 81, 81, 86, 86, 86, 121, 122, 123, 81, 81, 81, - 86, 81, 81, 86, 86, 81, 81, 81, 81, 0, 135, 135, 135, 139, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, - 48, 48, 48, 48, 48, 48, 140, 48, 48, 140, 48, 48, 48, 48, 48, 135, 139, - 141, 48, 139, 139, 139, 135, 135, 135, 135, 135, 135, 135, 135, 139, 139, - 139, 139, 142, 139, 139, 48, 81, 86, 81, 81, 135, 135, 135, 143, 143, - 143, 143, 143, 143, 143, 143, 48, 48, 135, 135, 83, 83, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 83, 53, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 0, 135, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, - 48, 0, 0, 0, 48, 48, 48, 48, 0, 0, 145, 48, 146, 139, 139, 135, 135, 135, - 135, 0, 0, 139, 139, 0, 0, 147, 147, 142, 48, 0, 0, 0, 0, 0, 0, 0, 0, - 146, 0, 0, 0, 0, 143, 143, 0, 143, 48, 48, 135, 135, 0, 0, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 48, 48, 85, 85, 148, 148, 148, 148, - 148, 148, 80, 85, 0, 0, 0, 0, 0, 135, 135, 139, 0, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 143, 0, 48, 143, 0, 48, 48, 0, 0, 145, 0, 139, 139, 139, 135, - 135, 0, 0, 0, 0, 135, 135, 0, 0, 135, 135, 142, 0, 0, 0, 135, 0, 0, 0, 0, - 0, 0, 0, 143, 143, 143, 48, 0, 143, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 135, 135, 48, 48, 48, 135, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 0, 48, 48, 48, 48, 48, 0, 0, 145, 48, 139, 139, 139, 135, 135, 135, - 135, 135, 0, 135, 135, 139, 0, 139, 139, 142, 0, 0, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 83, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 135, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, - 48, 48, 48, 0, 0, 145, 48, 146, 135, 139, 135, 135, 135, 135, 0, 0, 139, - 147, 0, 0, 147, 147, 142, 0, 0, 0, 0, 0, 0, 0, 0, 149, 146, 0, 0, 0, 0, - 143, 143, 0, 48, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 80, 48, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 135, 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, - 0, 48, 48, 140, 48, 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, 0, 0, 48, 48, - 0, 0, 0, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 146, 139, 135, 139, 139, 0, 0, 0, 139, 139, 139, 0, 147, - 147, 147, 142, 0, 0, 48, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148, - 148, 148, 26, 26, 26, 26, 26, 26, 85, 26, 0, 0, 0, 0, 0, 0, 139, 139, - 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0, - 0, 0, 48, 135, 135, 135, 139, 139, 139, 139, 0, 135, 135, 150, 0, 135, - 135, 135, 142, 0, 0, 0, 0, 0, 0, 0, 151, 152, 0, 48, 48, 0, 0, 0, 0, 0, - 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 80, 0, 0, - 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 0, 0, 145, 48, 139, 154, 147, 139, 146, 139, 139, 0, 154, 147, 147, - 0, 147, 147, 135, 142, 0, 0, 0, 0, 0, 0, 0, 146, 146, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, - 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 48, 146, 139, 139, 135, 135, 135, 135, 0, 139, 139, 139, 0, - 147, 147, 147, 142, 48, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 148, 148, 148, 148, 148, 148, 0, 0, 0, 80, 48, 48, 48, 48, 48, 48, - 0, 0, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 107, 107, 81, 81, 81, 81, 81, 81, 81, 86, 81, 137, 137, 26, 138, 138, + 138, 137, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, 81, + 81, 81, 137, 81, 81, 81, 81, 81, 81, 81, 81, 81, 137, 81, 81, 81, 137, + 81, 81, 81, 81, 81, 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 104, 104, 104, 104, 0, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 86, 86, 86, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 86, 81, 81, 86, 81, 81, + 81, 86, 86, 86, 121, 122, 123, 81, 81, 81, 86, 81, 81, 86, 86, 81, 81, + 81, 81, 81, 135, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 48, 48, 48, 48, 48, 48, 140, + 48, 48, 140, 48, 48, 48, 48, 48, 135, 139, 141, 48, 139, 139, 139, 135, + 135, 135, 135, 135, 135, 135, 135, 139, 139, 139, 139, 142, 139, 139, 48, + 81, 86, 81, 81, 135, 135, 135, 143, 143, 143, 143, 143, 143, 143, 143, + 48, 48, 135, 135, 83, 83, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 83, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 135, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 48, 48, 48, + 48, 0, 0, 145, 48, 146, 139, 139, 135, 135, 135, 135, 0, 0, 139, 139, 0, + 0, 147, 147, 142, 48, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 143, 143, + 0, 143, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 48, 48, 85, 85, 148, 148, 148, 148, 148, 148, 80, 85, 0, 0, 0, + 0, 0, 135, 135, 139, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 0, 0, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 143, 0, 48, 143, 0, + 48, 48, 0, 0, 145, 0, 139, 139, 139, 135, 135, 0, 0, 0, 0, 135, 135, 0, + 0, 135, 135, 142, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 143, 143, 143, 48, + 0, 143, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 135, 135, 48, 48, 48, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, + 135, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, + 48, 0, 0, 145, 48, 139, 139, 139, 135, 135, 135, 135, 135, 0, 135, 135, + 139, 0, 139, 139, 142, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 83, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 139, + 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 0, + 0, 145, 48, 146, 135, 139, 135, 135, 135, 135, 0, 0, 139, 147, 0, 0, 147, + 147, 142, 0, 0, 0, 0, 0, 0, 0, 0, 149, 146, 0, 0, 0, 0, 143, 143, 0, 48, + 48, 48, 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 80, 48, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, + 48, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 0, 48, 48, 140, 48, + 0, 0, 0, 48, 48, 0, 48, 0, 48, 48, 0, 0, 0, 48, 48, 0, 0, 0, 48, 48, 48, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 146, + 139, 135, 139, 139, 0, 0, 0, 139, 139, 139, 0, 147, 147, 147, 142, 0, 0, + 48, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 148, 148, 148, 26, 26, 26, + 26, 26, 26, 85, 26, 0, 0, 0, 0, 0, 135, 139, 139, 139, 0, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, - 155, 0, 0, 0, 0, 146, 139, 139, 135, 135, 135, 0, 135, 0, 139, 139, 147, - 139, 147, 147, 147, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 139, 139, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 135, 48, 156, 135, 135, 135, 135, 157, - 157, 142, 0, 0, 0, 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 158, 158, 158, - 158, 135, 135, 135, 83, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 0, 48, 48, - 0, 48, 0, 0, 48, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, - 48, 48, 0, 48, 48, 48, 0, 48, 0, 48, 0, 0, 48, 48, 0, 48, 48, 48, 48, - 135, 48, 156, 135, 135, 135, 135, 159, 159, 0, 135, 135, 48, 0, 0, 48, - 48, 48, 48, 48, 0, 53, 0, 160, 160, 160, 160, 135, 135, 0, 0, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 156, 156, 48, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 161, 83, - 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, 80, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148, 148, 148, 148, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 135, 135, + 135, 139, 139, 139, 139, 0, 135, 135, 150, 0, 135, 135, 135, 142, 0, 0, + 0, 0, 0, 0, 0, 151, 152, 0, 48, 48, 0, 0, 0, 0, 0, 0, 48, 48, 135, 135, + 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, + 0, 0, 153, 153, 153, 153, 153, 153, 153, 80, 0, 135, 139, 139, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0, 0, 145, 48, + 139, 154, 147, 139, 146, 139, 139, 0, 154, 147, 147, 0, 147, 147, 135, + 142, 0, 0, 0, 0, 0, 0, 0, 146, 146, 0, 0, 0, 0, 0, 0, 0, 48, 0, 48, 48, + 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 48, + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 139, 139, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, + 146, 139, 139, 135, 135, 135, 135, 0, 139, 139, 139, 0, 147, 147, 147, + 142, 48, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 135, 135, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148, + 148, 148, 148, 148, 148, 0, 0, 0, 80, 48, 48, 48, 48, 48, 48, 0, 0, 139, + 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 155, 0, 0, 0, + 0, 146, 139, 139, 135, 135, 135, 0, 135, 0, 139, 139, 147, 139, 147, 147, + 147, 146, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 0, 0, 139, 139, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 48, 156, 135, 135, 135, 135, + 157, 157, 142, 0, 0, 0, 0, 85, 48, 48, 48, 48, 48, 48, 53, 135, 158, 158, + 158, 158, 135, 135, 135, 83, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 48, 0, 0, + 48, 48, 0, 48, 0, 0, 48, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 0, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 0, 48, 0, 48, 0, 0, 48, 48, 0, 48, 48, 48, + 48, 135, 48, 156, 135, 135, 135, 135, 159, 159, 0, 135, 135, 48, 0, 0, + 48, 48, 48, 48, 48, 0, 53, 0, 160, 160, 160, 160, 135, 135, 0, 0, 144, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 156, 156, 48, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 48, 80, 80, 80, 83, 83, 83, 83, 83, 83, 83, 83, 161, + 83, 83, 83, 83, 83, 83, 80, 83, 80, 80, 80, 86, 86, 80, 80, 80, 80, 80, + 80, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 80, 86, 80, 86, 80, 162, 163, 164, 163, 164, 139, 139, 48, 48, 48, 143, 48, 48, 48, 48, 0, 48, 48, 48, 48, 143, 48, 48, 48, 48, 143, 48, 48, 48, 48, 143, 48, 48, 48, 48, 143, 48, 48, @@ -1513,10 +1632,10 @@ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 83, 83, 83, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 48, 135, 135, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, + 48, 48, 48, 83, 83, 83, 173, 173, 173, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 48, 48, 48, 48, 135, 135, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 142, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, @@ -1544,7 +1663,7 @@ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 0, 0, 135, 135, 135, 139, 139, 139, 139, 135, 135, 139, 139, + 48, 48, 48, 48, 0, 135, 135, 135, 139, 139, 139, 139, 135, 135, 139, 139, 139, 0, 0, 0, 0, 139, 139, 135, 139, 139, 139, 139, 139, 139, 87, 81, 86, 0, 0, 0, 0, 26, 0, 0, 0, 138, 138, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, @@ -1567,998 +1686,1142 @@ 81, 81, 81, 81, 81, 81, 0, 0, 86, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, 83, 53, 83, 83, 83, 83, - 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 139, 48, 140, 48, - 140, 48, 140, 48, 140, 48, 140, 48, 48, 48, 140, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, 146, 135, 135, 135, 135, 135, - 147, 135, 147, 139, 139, 147, 147, 135, 147, 175, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 83, 83, - 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 86, 81, - 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 135, - 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, 135, - 135, 135, 139, 139, 135, 135, 175, 142, 139, 139, 48, 48, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, - 139, 135, 135, 139, 139, 139, 135, 139, 135, 135, 135, 175, 175, 0, 0, 0, - 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 139, 139, 139, 139, 139, - 135, 135, 135, 135, 135, 135, 135, 135, 139, 139, 135, 145, 0, 0, 0, 83, - 83, 83, 83, 83, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, - 0, 48, 48, 48, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 83, 83, - 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, 83, 176, 86, 86, 86, 86, 86, - 81, 81, 86, 86, 86, 86, 81, 139, 176, 176, 176, 176, 176, 176, 176, 48, - 48, 48, 48, 86, 48, 48, 48, 48, 139, 139, 81, 48, 48, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 83, 83, 0, 0, 81, 81, 81, 81, 81, 86, 86, 86, 86, 86, 86, 81, 81, 86, 82, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, + 139, 48, 140, 48, 140, 48, 140, 48, 140, 48, 140, 48, 48, 48, 140, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, 146, 135, + 135, 135, 135, 135, 147, 135, 147, 139, 139, 147, 147, 135, 147, 175, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 83, 83, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 81, 86, 81, 81, 81, 81, 81, 81, 81, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 0, 0, 0, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 139, 135, 135, 135, 135, 139, 139, 135, 135, 175, 142, 135, + 135, 48, 48, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 145, 139, 135, 135, 139, 139, 139, 135, 139, 135, + 135, 135, 175, 175, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, + 139, 139, 139, 139, 139, 139, 135, 135, 135, 135, 135, 135, 135, 135, + 139, 139, 135, 145, 0, 0, 0, 83, 83, 83, 83, 83, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 0, 0, 0, 48, 48, 48, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 53, 53, 53, 53, 53, 53, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 83, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 81, + 83, 176, 86, 86, 86, 86, 86, 81, 81, 86, 86, 86, 86, 81, 139, 176, 176, + 176, 176, 176, 176, 176, 48, 48, 48, 48, 86, 48, 48, 48, 48, 139, 139, + 81, 48, 48, 0, 81, 81, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 53, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 47, 47, 47, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 51, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 51, 51, 51, 51, 51, + 47, 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 81, 81, 86, 81, - 81, 81, 81, 81, 81, 81, 86, 81, 81, 177, 178, 86, 179, 81, 81, 81, 81, + 51, 51, 51, 51, 81, 81, 86, 81, 81, 81, 81, 81, 81, 81, 86, 81, 81, 177, + 178, 86, 179, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 86, - 81, 86, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 43, 43, 43, 43, 35, 181, 47, 47, 44, 47, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, - 44, 47, 44, 47, 44, 47, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, - 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, - 0, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, + 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 180, 86, 81, 86, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 43, 43, 43, 43, 35, 181, 47, 47, 44, 47, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, + 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 47, 44, 47, 44, 47, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, - 43, 43, 0, 38, 0, 38, 0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, - 38, 38, 38, 38, 38, 38, 38, 43, 182, 43, 182, 43, 182, 43, 182, 43, 182, - 43, 182, 43, 182, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 183, 183, 183, - 183, 183, 183, 183, 183, 43, 43, 43, 43, 43, 43, 43, 43, 183, 183, 183, - 183, 183, 183, 183, 183, 43, 43, 43, 43, 43, 43, 43, 43, 183, 183, 183, - 183, 183, 183, 183, 183, 43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 184, - 183, 58, 182, 58, 58, 76, 43, 43, 43, 0, 43, 43, 38, 184, 38, 184, 183, - 76, 76, 76, 43, 43, 43, 182, 0, 0, 43, 43, 38, 38, 38, 184, 0, 76, 76, - 76, 43, 43, 43, 182, 43, 43, 43, 43, 38, 38, 38, 184, 38, 76, 185, 185, - 0, 0, 43, 43, 43, 0, 43, 43, 38, 184, 38, 184, 183, 185, 58, 0, 186, 186, - 187, 187, 187, 187, 187, 187, 187, 187, 187, 174, 174, 174, 188, 189, - 190, 191, 84, 190, 190, 190, 22, 192, 193, 194, 195, 196, 193, 194, 195, - 196, 22, 22, 22, 138, 197, 197, 197, 22, 198, 199, 200, 201, 202, 203, - 204, 21, 205, 110, 205, 206, 207, 22, 192, 192, 138, 28, 36, 22, 192, - 138, 197, 208, 208, 138, 138, 138, 209, 163, 164, 192, 192, 192, 138, - 138, 138, 138, 138, 138, 138, 138, 78, 138, 208, 138, 138, 192, 138, 138, - 138, 138, 138, 138, 138, 187, 174, 174, 174, 174, 174, 0, 210, 211, 212, - 213, 174, 174, 174, 174, 174, 174, 214, 51, 0, 0, 34, 214, 214, 214, 214, - 214, 215, 215, 216, 217, 218, 219, 214, 34, 34, 34, 34, 214, 214, 214, - 214, 214, 215, 215, 216, 217, 218, 0, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, 85, 220, 221, 85, - 85, 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 81, 176, 176, - 81, 81, 81, 81, 176, 176, 176, 81, 81, 82, 82, 82, 82, 81, 82, 82, 82, - 176, 176, 81, 86, 81, 176, 176, 86, 86, 86, 86, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 49, 223, 26, 223, 222, 49, 26, 223, 35, - 49, 49, 49, 35, 35, 49, 49, 49, 46, 26, 49, 223, 26, 78, 49, 49, 49, 49, - 49, 26, 26, 222, 223, 223, 26, 49, 26, 224, 26, 49, 26, 184, 224, 49, 49, - 225, 35, 49, 49, 44, 49, 35, 156, 156, 156, 156, 35, 26, 222, 35, 35, 49, - 49, 226, 78, 78, 78, 78, 49, 35, 35, 35, 35, 26, 78, 26, 26, 47, 80, 227, - 227, 227, 37, 37, 227, 227, 227, 227, 227, 227, 37, 37, 37, 37, 227, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, - 229, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, - 229, 229, 229, 173, 173, 173, 44, 47, 173, 173, 173, 173, 37, 0, 0, 0, 0, - 0, 0, 40, 40, 40, 40, 40, 30, 30, 30, 30, 30, 230, 230, 26, 26, 26, 26, - 78, 26, 26, 78, 26, 26, 78, 26, 26, 26, 26, 26, 26, 26, 230, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 231, 230, 230, 26, 26, 40, 26, 40, + 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 43, 43, + 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, 38, 38, + 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 0, 38, 0, 38, 0, 38, 0, + 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, + 182, 43, 182, 43, 182, 43, 182, 43, 182, 43, 182, 43, 182, 0, 0, 43, 43, + 43, 43, 43, 43, 43, 43, 183, 183, 183, 183, 183, 183, 183, 183, 43, 43, + 43, 43, 43, 43, 43, 43, 183, 183, 183, 183, 183, 183, 183, 183, 43, 43, + 43, 43, 43, 43, 43, 43, 183, 183, 183, 183, 183, 183, 183, 183, 43, 43, + 43, 43, 43, 0, 43, 43, 38, 38, 38, 184, 183, 58, 182, 58, 58, 76, 43, 43, + 43, 0, 43, 43, 38, 184, 38, 184, 183, 76, 76, 76, 43, 43, 43, 182, 0, 0, + 43, 43, 38, 38, 38, 184, 0, 76, 76, 76, 43, 43, 43, 182, 43, 43, 43, 43, + 38, 38, 38, 184, 38, 76, 185, 185, 0, 0, 43, 43, 43, 0, 43, 43, 38, 184, + 38, 184, 183, 185, 58, 0, 186, 186, 187, 187, 187, 187, 187, 187, 187, + 187, 187, 174, 174, 174, 188, 189, 190, 191, 84, 190, 190, 190, 22, 192, + 193, 194, 195, 196, 193, 194, 195, 196, 22, 22, 22, 138, 197, 197, 197, + 22, 198, 199, 200, 201, 202, 203, 204, 21, 205, 110, 205, 206, 207, 22, + 192, 192, 138, 28, 36, 22, 192, 138, 197, 208, 208, 138, 138, 138, 209, + 163, 164, 192, 192, 192, 138, 138, 138, 138, 138, 138, 138, 138, 78, 138, + 208, 138, 138, 192, 138, 138, 138, 138, 138, 138, 138, 187, 174, 174, + 174, 174, 174, 0, 210, 211, 212, 213, 174, 174, 174, 174, 174, 174, 214, + 51, 0, 0, 34, 214, 214, 214, 214, 214, 215, 215, 216, 217, 218, 219, 214, + 34, 34, 34, 34, 214, 214, 214, 214, 214, 215, 215, 216, 217, 218, 0, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, 85, 85, 85, 85, + 85, 85, 85, 85, 220, 221, 85, 85, 23, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 81, 81, 176, 176, 81, 81, 81, 81, 176, 176, 176, 81, 81, 82, + 82, 82, 82, 81, 82, 82, 82, 176, 176, 81, 86, 81, 176, 176, 86, 86, 86, + 86, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 222, 49, 223, + 26, 223, 222, 49, 26, 223, 35, 49, 49, 49, 35, 35, 49, 49, 49, 46, 26, + 49, 223, 26, 78, 49, 49, 49, 49, 49, 26, 26, 222, 223, 223, 26, 49, 26, + 224, 26, 49, 26, 184, 224, 49, 49, 225, 35, 49, 49, 44, 49, 35, 156, 156, + 156, 156, 35, 26, 222, 35, 35, 49, 49, 226, 78, 78, 78, 78, 49, 35, 35, + 35, 35, 26, 78, 26, 26, 47, 80, 227, 227, 227, 37, 37, 227, 227, 227, + 227, 227, 227, 37, 37, 37, 37, 227, 228, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 229, 229, 229, 229, 228, 228, 228, 228, 228, + 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 173, 173, 173, 44, + 47, 173, 173, 173, 173, 37, 0, 0, 0, 0, 0, 0, 40, 40, 40, 40, 40, 30, 30, + 30, 30, 30, 230, 230, 26, 26, 26, 26, 78, 26, 26, 78, 26, 26, 78, 26, 26, + 26, 26, 26, 26, 26, 230, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 40, 232, 233, 233, 234, 78, 78, 40, 233, 234, - 232, 233, 234, 232, 78, 40, 78, 233, 235, 236, 78, 233, 232, 78, 78, 78, - 233, 232, 232, 233, 40, 233, 233, 232, 232, 40, 234, 40, 234, 40, 40, 40, - 40, 233, 237, 226, 233, 226, 226, 232, 232, 232, 40, 40, 40, 40, 78, 232, - 78, 232, 233, 233, 232, 232, 232, 234, 232, 232, 234, 232, 232, 234, 233, - 234, 232, 232, 233, 78, 78, 78, 78, 78, 233, 232, 232, 232, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 232, 238, 40, 234, 78, 233, 233, 233, 233, 232, - 232, 233, 233, 78, 230, 238, 238, 234, 234, 232, 232, 234, 234, 232, 232, - 234, 234, 232, 232, 232, 232, 232, 232, 234, 234, 233, 233, 234, 234, - 233, 233, 234, 234, 232, 232, 232, 78, 78, 232, 232, 232, 232, 78, 78, - 40, 78, 78, 232, 40, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, 78, 40, - 232, 232, 232, 232, 232, 232, 234, 234, 234, 234, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 78, 78, 78, 78, 78, 232, 233, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 232, 232, 232, 232, 232, 78, 78, 232, 232, 78, 78, - 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 234, 234, 234, - 234, 232, 232, 232, 232, 232, 232, 234, 234, 234, 234, 78, 78, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 26, - 26, 26, 26, 26, 26, 26, 26, 163, 164, 163, 164, 26, 26, 26, 26, 26, 26, - 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 232, 232, 26, 26, - 26, 26, 26, 26, 26, 239, 240, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 231, 230, 230, 26, 26, 40, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 40, 232, + 233, 233, 234, 78, 78, 40, 233, 234, 232, 233, 234, 232, 78, 40, 78, 233, + 235, 236, 78, 233, 232, 78, 78, 78, 233, 232, 232, 233, 40, 233, 233, + 232, 232, 40, 234, 40, 234, 40, 40, 40, 40, 233, 237, 226, 233, 226, 226, + 232, 232, 232, 40, 40, 40, 40, 78, 232, 78, 232, 233, 233, 232, 232, 232, + 234, 232, 232, 234, 232, 232, 234, 233, 234, 232, 232, 233, 78, 78, 78, + 78, 78, 233, 232, 232, 232, 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, 238, + 40, 234, 78, 233, 233, 233, 233, 232, 232, 233, 233, 78, 230, 238, 238, + 234, 234, 232, 232, 234, 234, 232, 232, 234, 234, 232, 232, 232, 232, + 232, 232, 234, 234, 233, 233, 234, 234, 233, 233, 234, 234, 232, 232, + 232, 78, 78, 232, 232, 232, 232, 78, 78, 40, 78, 78, 232, 40, 78, 78, 78, + 78, 78, 78, 78, 78, 232, 232, 78, 40, 232, 232, 232, 232, 232, 232, 234, + 234, 234, 234, 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 78, 78, + 78, 78, 232, 233, 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, 232, 232, + 232, 78, 78, 232, 232, 78, 78, 78, 78, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 234, 234, 234, 234, 232, 232, 232, 232, 232, 232, 234, + 234, 234, 234, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 26, 26, 26, 26, 26, 26, 26, 26, 163, 164, + 163, 164, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 232, 232, 26, 26, 26, 26, 26, 26, 26, 239, 240, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 26, 78, 26, + 80, 80, 80, 80, 80, 80, 26, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 26, 26, 26, + 26, 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 80, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, + 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 241, 241, 227, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 30, + 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, + 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, + 40, 26, 26, 26, 26, 30, 30, 26, 26, 30, 40, 26, 26, 26, 26, 30, 30, 30, + 26, 26, 30, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 78, + 78, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, + 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 30, 26, 30, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 30, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, 26, 30, 30, 30, 30, + 26, 30, 30, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 26, 26, 26, 26, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 232, 78, 78, 232, 232, 163, 164, + 78, 232, 232, 78, 232, 232, 232, 78, 78, 78, 78, 78, 232, 232, 232, 232, + 78, 78, 78, 78, 78, 232, 232, 232, 78, 78, 78, 232, 232, 232, 232, 9, 10, + 9, 10, 9, 10, 9, 10, 163, 164, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 163, 164, 9, 10, 163, + 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, + 164, 163, 164, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 78, 78, 78, + 78, 78, 78, 78, 232, 78, 78, 78, 78, 78, 78, 78, 232, 232, 232, 232, 232, + 232, 78, 78, 78, 232, 78, 78, 78, 78, 232, 232, 232, 232, 232, 78, 232, + 232, 78, 78, 163, 164, 163, 164, 232, 78, 78, 78, 78, 232, 78, 232, 232, + 232, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, + 232, 232, 232, 232, 78, 78, 163, 164, 78, 78, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 232, 232, 226, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 78, 232, 232, 232, 232, 78, 78, 232, + 78, 232, 78, 78, 232, 78, 232, 232, 232, 232, 78, 78, 78, 78, 78, 232, + 232, 78, 78, 78, 78, 78, 78, 232, 232, 232, 78, 78, 78, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, + 232, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, 78, 78, 78, + 78, 232, 232, 232, 232, 78, 232, 232, 78, 78, 232, 226, 216, 216, 78, 78, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 78, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, + 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 78, 78, 78, 78, 243, 78, + 232, 78, 78, 78, 232, 232, 232, 232, 232, 78, 78, 78, 78, 78, 232, 232, + 232, 78, 78, 78, 78, 232, 78, 78, 78, 232, 232, 232, 232, 232, 78, 232, + 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 26, + 26, 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, + 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 227, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 30, 30, 26, 30, 30, 30, 30, 30, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, - 30, 30, 26, 26, 30, 40, 26, 26, 26, 26, 30, 30, 26, 26, 30, 40, 26, 26, - 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 30, 30, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 78, 78, - 78, 78, 78, 78, 78, 78, 26, 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, - 26, 26, 30, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 30, 26, - 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 26, - 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, 30, - 26, 30, 30, 30, 30, 26, 30, 30, 26, 40, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 44, 47, 44, + 44, 44, 47, 47, 44, 47, 44, 47, 44, 47, 44, 44, 44, 44, 47, 44, 47, 47, + 44, 47, 47, 47, 47, 47, 47, 51, 51, 44, 44, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 47, 26, 26, 26, 26, 26, 26, 44, 47, 44, 47, 81, 81, 81, 44, + 47, 0, 0, 0, 0, 0, 138, 138, 138, 138, 153, 138, 138, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, + 0, 0, 0, 47, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 51, 83, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, + 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, + 0, 48, 48, 48, 48, 48, 48, 48, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 138, 138, 28, 36, 28, 36, 138, 138, 138, 28, 36, 138, 28, + 36, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 138, 138, 84, 138, + 28, 36, 138, 138, 28, 36, 163, 164, 163, 164, 163, 164, 163, 164, 138, + 138, 138, 138, 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 84, 84, 138, 138, 138, 138, 84, 138, 195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 0, 244, + 244, 244, 244, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, + 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 0, + 0, 0, 0, 246, 247, 247, 247, 244, 248, 170, 249, 250, 251, 250, 251, 250, + 251, 250, 251, 250, 251, 244, 244, 250, 251, 250, 251, 250, 251, 250, + 251, 252, 253, 254, 254, 244, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 255, 256, 257, 258, 259, 259, 252, 248, 248, 248, 248, 248, 245, + 244, 260, 260, 260, 248, 170, 247, 244, 26, 0, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 261, 170, 261, 170, 261, 170, 261, 170, + 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, + 261, 170, 170, 261, 170, 261, 170, 261, 170, 170, 170, 170, 170, 170, + 261, 261, 170, 261, 261, 170, 261, 261, 170, 261, 261, 170, 261, 261, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 261, 170, 170, 0, 0, 262, 262, + 263, 263, 248, 264, 265, 252, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, + 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 170, + 261, 170, 261, 170, 261, 170, 170, 170, 170, 170, 170, 261, 261, 170, + 261, 261, 170, 261, 261, 170, 261, 261, 170, 261, 261, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 261, 170, 170, 261, 261, 261, 261, 247, 248, + 248, 264, 265, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 0, 266, 266, 267, 267, 267, 267, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 0, 0, 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, 245, 0, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 269, 269, 269, 269, 269, + 269, 269, 269, 245, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 270, 270, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 245, 245, 245, 266, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 270, 270, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 245, 245, 245, 245, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 0, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 245, 245, 245, 245, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 245, 245, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 80, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, 30, - 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 26, 30, - 26, 26, 26, 26, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 30, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, - 163, 164, 163, 164, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 232, 78, 78, - 232, 232, 163, 164, 78, 232, 232, 78, 232, 232, 232, 78, 78, 78, 78, 78, - 232, 232, 232, 232, 78, 78, 78, 78, 78, 232, 232, 232, 78, 78, 78, 232, - 232, 232, 232, 9, 10, 9, 10, 9, 10, 9, 10, 163, 164, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 163, 164, 9, 10, 163, 164, 163, 164, 163, 164, 163, 164, 163, 164, 163, - 164, 163, 164, 163, 164, 163, 164, 78, 78, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 78, 78, 78, 78, 78, 78, 78, 78, 232, 78, 78, 78, 78, 78, 78, 78, - 232, 232, 232, 232, 232, 232, 78, 78, 78, 232, 78, 78, 78, 78, 232, 232, - 232, 232, 232, 78, 232, 232, 78, 78, 163, 164, 163, 164, 232, 78, 78, 78, - 78, 232, 78, 232, 232, 232, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 232, 232, 232, 232, 232, 232, 78, 78, 163, 164, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 232, 232, 226, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 232, 232, - 232, 232, 78, 78, 232, 78, 232, 78, 78, 232, 78, 232, 232, 232, 232, 78, - 78, 78, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 232, 232, 232, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 232, 232, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 232, 232, 78, 78, 78, 78, 232, 232, 232, 232, 78, 232, 232, 78, 78, 232, - 226, 216, 216, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 78, 78, 232, 232, 232, 232, 232, 232, 232, 232, - 78, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 78, 78, 78, - 78, 78, 243, 78, 232, 78, 78, 78, 232, 232, 232, 232, 232, 78, 78, 78, - 78, 78, 232, 232, 232, 78, 78, 78, 78, 232, 78, 78, 78, 232, 232, 232, - 232, 232, 78, 232, 78, 78, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 26, 26, 78, 78, 78, 78, 78, 78, 0, 0, 0, 26, 26, 26, 26, - 26, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 44, 47, 44, 44, 44, 47, 47, 44, - 47, 44, 47, 44, 47, 44, 44, 44, 44, 47, 44, 47, 47, 44, 47, 47, 47, 47, - 47, 47, 51, 51, 44, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 26, - 26, 26, 26, 26, 26, 44, 47, 44, 47, 81, 81, 81, 44, 47, 0, 0, 0, 0, 0, - 138, 138, 138, 138, 153, 138, 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 0, 0, 0, 47, 0, - 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 51, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 142, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, - 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, - 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, - 48, 48, 48, 0, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 138, 138, 28, 36, 28, 36, 138, 138, 138, 28, 36, 138, 28, 36, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 84, 138, 138, 84, 138, 28, 36, 138, - 138, 28, 36, 163, 164, 163, 164, 163, 164, 163, 164, 138, 138, 138, 138, - 138, 52, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 84, 84, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 244, 244, 244, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 248, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 0, 244, 244, 244, 244, 245, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 245, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, - 245, 245, 245, 245, 245, 245, 245, 245, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 0, 0, 0, 0, 246, 247, 247, 247, - 244, 248, 170, 249, 250, 251, 250, 251, 250, 251, 250, 251, 250, 251, - 244, 244, 250, 251, 250, 251, 250, 251, 250, 251, 252, 253, 254, 254, - 244, 249, 249, 249, 249, 249, 249, 249, 249, 249, 255, 256, 257, 258, - 259, 259, 252, 248, 248, 248, 248, 248, 245, 244, 260, 260, 260, 248, - 170, 247, 244, 26, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, - 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 170, 261, 170, - 261, 170, 261, 170, 170, 170, 170, 170, 170, 261, 261, 170, 261, 261, - 170, 261, 261, 170, 261, 261, 170, 261, 261, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 261, 170, 170, 0, 0, 262, 262, 263, 263, 248, 264, 265, - 252, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 261, 170, - 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, 261, 170, - 261, 170, 261, 170, 261, 170, 261, 170, 170, 261, 170, 261, 170, 261, - 170, 170, 170, 170, 170, 170, 261, 261, 170, 261, 261, 170, 261, 261, - 170, 261, 261, 170, 261, 261, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 261, 170, 170, 261, 261, 261, 261, 247, 248, 248, 264, 265, 0, 0, 0, 0, - 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 244, 244, 244, 244, 244, 244, 244, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 53, 53, 53, 53, 53, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 53, 138, 138, 138, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 48, 81, 82, 82, 82, 138, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 138, 52, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 51, 51, 0, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 81, + 81, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 54, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 47, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 51, + 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44, 47, 44, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 47, 52, 271, 271, 44, 47, 44, 47, 0, 44, 47, 44, 47, 47, + 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, + 47, 44, 47, 44, 44, 44, 44, 0, 0, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 51, 51, 47, 48, 48, 48, 48, 48, 48, + 48, 135, 48, 48, 48, 142, 48, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, + 139, 135, 135, 139, 26, 26, 26, 26, 0, 0, 0, 0, 148, 148, 148, 148, 148, + 148, 80, 80, 85, 225, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 138, 138, 138, 138, 0, 0, 0, 0, 0, 0, 0, + 0, 139, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 48, 48, 48, 48, 48, 48, 83, + 83, 83, 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 86, 86, + 86, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 139, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 0, 266, 266, 267, 267, - 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 245, 245, 0, 267, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 269, 269, 269, 269, 269, 269, 269, 269, 245, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, - 245, 245, 266, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 270, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 270, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, 245, 245, 245, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 245, 245, 245, - 245, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 245, 245, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 268, 268, 268, 245, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, + 135, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, 139, + 139, 135, 135, 135, 135, 139, 139, 135, 139, 139, 139, 175, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 53, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 0, 0, 0, 0, 83, 83, 48, 48, 48, 48, 48, 135, 53, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, + 135, 135, 135, 139, 139, 135, 135, 139, 139, 135, 135, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 135, 48, 48, 48, 48, 48, 48, 48, 48, 135, 139, 0, 0, + 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 83, 83, 83, 83, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, + 48, 48, 48, 48, 48, 80, 80, 80, 48, 139, 135, 139, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, 48, 81, 81, 86, 48, 48, 81, 81, + 48, 48, 48, 48, 48, 81, 81, 48, 81, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 53, 83, 83, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, 135, 139, 139, 83, 83, 48, 53, + 53, 139, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, + 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 271, 51, 51, 51, 51, 0, 0, 0, 0, 47, 47, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 135, 139, 139, + 135, 139, 139, 83, 139, 142, 0, 0, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 0, 0, 0, 0, 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, + 261, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, + 272, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 170, 170, 274, 170, 274, 170, 170, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 170, 274, 170, 274, 170, 170, + 274, 274, 170, 170, 170, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 0, 0, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 275, 276, 275, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 215, 275, 275, 275, 275, + 275, 275, 275, 275, 275, 275, 275, 275, 275, 0, 275, 275, 275, 275, 275, + 0, 275, 0, 275, 275, 0, 275, 275, 0, 275, 275, 275, 275, 275, 275, 275, + 275, 275, 277, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 278, 278, 278, 278, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 279, 195, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 280, 26, 0, 0, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 281, 281, 281, 281, 281, 281, + 281, 282, 283, 281, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 86, 86, + 86, 86, 86, 86, 86, 0, 0, 281, 284, 284, 285, 285, 282, 283, 282, 283, + 282, 283, 282, 283, 282, 283, 282, 283, 282, 283, 282, 283, 247, 247, + 282, 283, 281, 281, 281, 281, 285, 285, 285, 286, 281, 286, 0, 281, 286, + 281, 281, 284, 287, 288, 287, 288, 287, 288, 289, 281, 281, 290, 291, + 292, 292, 293, 0, 281, 294, 289, 281, 0, 0, 0, 0, 131, 131, 131, 118, + 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 174, 0, 295, 295, + 296, 297, 296, 295, 295, 298, 299, 295, 300, 301, 302, 301, 301, 303, + 303, 303, 303, 303, 303, 303, 303, 303, 303, 301, 295, 304, 305, 304, + 295, 295, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 298, 295, 299, 307, 308, 307, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, + 309, 309, 309, 309, 298, 305, 299, 305, 298, 299, 310, 311, 312, 310, + 310, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 314, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 314, 314, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 0, 0, 0, 313, 313, 313, 313, 313, 313, 0, + 0, 313, 313, 313, 313, 313, 313, 0, 0, 313, 313, 313, 313, 313, 313, 0, + 0, 313, 313, 313, 0, 0, 0, 297, 297, 305, 307, 315, 297, 297, 0, 316, + 317, 317, 317, 317, 316, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 318, + 318, 26, 30, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, + 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 153, 153, 153, 153, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 153, 153, + 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 86, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, + 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 320, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 148, 148, + 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 173, 48, 48, 48, 48, 48, 48, 48, + 48, 173, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 83, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 83, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 0, + 0, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 0, 104, 321, 321, 321, 321, 321, 321, 321, 321, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 322, 322, 321, 321, 321, + 321, 321, 321, 321, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 321, 321, 321, + 321, 321, 321, 321, 321, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 321, 321, 321, 321, 321, 321, 0, 0, 0, 138, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 107, 107, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 135, 135, 135, 0, + 135, 135, 0, 0, 0, 0, 0, 135, 86, 135, 81, 107, 107, 107, 107, 0, 107, + 107, 107, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 0, 0, 0, 0, 81, 176, 86, 0, 0, 0, 0, 142, 321, 321, 321, 321, 321, + 321, 321, 321, 0, 0, 0, 0, 0, 0, 0, 0, 104, 104, 104, 104, 104, 104, 104, + 104, 104, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 321, 321, 104, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 321, 321, 321, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 322, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 81, 86, + 0, 0, 0, 0, 321, 321, 321, 321, 321, 104, 104, 104, 104, 104, 104, 104, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 0, 0, 0, 138, 138, 138, 138, 138, 138, 138, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 0, 0, 321, 321, 321, 321, 321, 321, 321, 321, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 321, 321, 321, 321, 321, 321, + 321, 321, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 104, 104, 104, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 321, 321, 321, 321, 321, 321, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, + 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 323, 0, 139, + 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 142, 83, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 153, 153, 153, 153, 153, + 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, + 153, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 135, 135, 139, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, + 48, 140, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, + 48, 48, 48, 139, 139, 139, 135, 135, 135, 135, 139, 139, 142, 141, 83, + 83, 188, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 81, 81, 81, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 149, 135, 135, + 135, 135, 139, 135, 150, 150, 135, 135, 135, 142, 142, 0, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 145, 83, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 139, 175, 48, 48, 48, 48, 83, 83, 83, + 83, 0, 0, 0, 0, 83, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 48, 0, 0, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 135, 135, + 135, 139, 139, 135, 175, 145, 135, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 135, 139, 139, 139, 135, 135, 135, 135, 135, 135, 145, 142, + 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, + 0, 0, 0, 0, 135, 139, 139, 0, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, + 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 0, 48, + 48, 48, 48, 48, 0, 0, 145, 48, 146, 139, 135, 139, 139, 139, 139, 0, 0, + 139, 139, 0, 0, 147, 147, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, + 0, 0, 48, 48, 48, 48, 48, 139, 139, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, + 0, 0, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 146, 139, 139, 135, 135, 135, 135, + 135, 135, 139, 149, 147, 147, 146, 147, 135, 135, 139, 142, 145, 48, 48, + 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 146, 139, 139, 135, 135, 135, 135, 0, 0, 139, + 139, 147, 147, 135, 135, 139, 142, 145, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, + 139, 139, 135, 135, 135, 135, 135, 135, 135, 135, 139, 139, 135, 139, + 142, 135, 83, 83, 83, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 135, 139, 135, 139, 139, 135, 135, 135, + 135, 135, 135, 175, 145, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 144, 144, 144, 144, 144, 144, 144, 144, + 144, 144, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 0, 83, + 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 144, 144, 144, + 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 176, 176, 176, 176, 176, 83, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, + 81, 81, 81, 81, 81, 81, 83, 83, 83, 83, 83, 80, 80, 80, 80, 53, 53, 53, + 53, 83, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, + 144, 144, 144, 144, 0, 148, 148, 148, 148, 148, 148, 148, 0, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 135, 135, 135, 135, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, + 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 80, 135, + 176, 83, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 324, 324, 324, 324, 324, 324, 324, 325, 325, 176, + 176, 176, 80, 80, 80, 326, 325, 325, 325, 325, 325, 174, 174, 174, 174, + 174, 174, 174, 174, 86, 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, + 81, 81, 86, 86, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, + 81, 81, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 324, 324, + 324, 324, 324, 324, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81, + 81, 81, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 248, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 0, 0, 0, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 53, 53, 53, 53, - 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 138, 138, - 138, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 48, 48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 48, 81, 82, 82, 82, 138, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 138, 52, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 81, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 81, 81, 83, 83, 83, 83, 83, 83, 0, 0, 0, 0, 0, - 0, 0, 0, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 54, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 47, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, - 44, 47, 44, 47, 44, 47, 51, 47, 47, 47, 47, 47, 47, 47, 47, 44, 47, 44, - 47, 44, 44, 47, 44, 47, 44, 47, 44, 47, 44, 47, 52, 271, 271, 44, 47, 44, - 47, 0, 44, 47, 44, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 47, 44, - 47, 44, 47, 44, 47, 44, 47, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, 47, 48, 48, 48, 48, - 48, 48, 48, 135, 48, 48, 48, 142, 48, 48, 48, 48, 135, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 139, 139, 135, 135, 139, 26, 26, 26, 26, 0, 0, 0, 0, 148, 148, 148, - 148, 148, 148, 80, 80, 85, 225, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 138, 138, 138, 138, 0, 0, 0, 0, - 0, 0, 0, 0, 139, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 48, 48, 48, 48, 48, 48, - 83, 83, 83, 48, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 86, - 86, 86, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 139, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, - 0, 0, 135, 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 145, - 139, 139, 135, 135, 135, 135, 139, 139, 135, 139, 139, 139, 175, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 0, 53, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, 135, 139, 139, 135, 135, - 139, 139, 135, 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 135, 48, 48, - 48, 48, 48, 48, 48, 48, 135, 139, 0, 0, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 0, 0, 83, 83, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 48, 48, 48, 48, 48, 80, 80, 80, - 48, 139, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 81, - 48, 81, 81, 86, 48, 48, 81, 81, 48, 48, 48, 48, 48, 81, 81, 48, 81, 48, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 48, 53, 83, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 135, - 135, 139, 139, 83, 83, 48, 53, 53, 139, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, - 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 0, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 139, 139, 135, 139, 139, 135, 139, 139, 83, 139, - 142, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, - 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 170, 170, 274, 170, 274, 170, 170, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 170, 274, 170, 274, 170, 170, 274, 274, 170, 170, 170, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 0, 0, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 274, 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 35, 35, 35, 35, 0, 0, 0, 0, 0, 275, 276, 275, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 215, 275, 275, 275, 275, 275, 275, 275, 275, 275, - 275, 275, 275, 275, 0, 275, 275, 275, 275, 275, 0, 275, 0, 275, 275, 0, - 275, 275, 0, 275, 275, 275, 275, 275, 275, 275, 275, 275, 277, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 195, 279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 280, 26, 0, 0, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 281, 281, 281, 281, 281, 281, 281, 282, 283, 281, 0, 0, - 0, 0, 0, 0, 81, 81, 81, 81, 81, 81, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, - 284, 284, 285, 285, 282, 283, 282, 283, 282, 283, 282, 283, 282, 283, - 282, 283, 282, 283, 282, 283, 247, 247, 282, 283, 281, 281, 281, 281, - 285, 285, 285, 286, 281, 286, 0, 281, 286, 281, 281, 284, 287, 288, 287, - 288, 287, 288, 289, 281, 281, 290, 291, 292, 292, 293, 0, 281, 294, 289, - 281, 0, 0, 0, 0, 131, 131, 131, 118, 131, 0, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 0, 0, 174, 0, 295, 295, 296, 297, 296, 295, 295, 298, - 299, 295, 300, 301, 302, 301, 301, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 303, 301, 295, 304, 305, 304, 295, 295, 306, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 306, 298, 295, 299, 307, 308, 307, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, - 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 309, 298, 305, - 299, 305, 298, 299, 310, 311, 312, 310, 310, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 314, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 314, 314, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, - 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 0, - 0, 0, 313, 313, 313, 313, 313, 313, 0, 0, 313, 313, 313, 313, 313, 313, - 0, 0, 313, 313, 313, 313, 313, 313, 0, 0, 313, 313, 313, 0, 0, 0, 297, - 297, 305, 307, 315, 297, 297, 0, 316, 317, 317, 317, 317, 316, 316, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 318, 318, 318, 26, 30, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 0, 0, 0, 0, 0, 83, 138, 83, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - 319, 319, 153, 153, 153, 153, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 153, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 86, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 0, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 173, 48, - 48, 48, 48, 48, 48, 48, 48, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 83, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, - 48, 83, 173, 173, 173, 173, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 0, 0, 107, 0, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 107, 107, 0, 0, 0, 107, 0, 0, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 0, 104, 320, 320, 320, 320, 320, 320, 320, 320, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 320, 320, 320, 320, 320, - 320, 0, 0, 0, 138, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, - 0, 0, 0, 0, 0, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 135, 135, 135, 0, 135, 135, 0, 0, 0, 0, 0, 135, 86, 135, 81, 107, - 107, 107, 107, 0, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 0, 0, 0, 0, 81, 176, 86, 0, 0, 0, 0, 142, - 320, 320, 320, 320, 320, 320, 320, 320, 0, 0, 0, 0, 0, 0, 0, 0, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 320, 320, - 104, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 0, 0, 0, - 138, 138, 138, 138, 138, 138, 138, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 0, 320, 320, 320, 320, 320, 320, 320, 320, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 0, 0, 0, 0, 320, 320, 320, 320, 320, 320, 320, 320, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, - 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, - 321, 321, 321, 321, 321, 321, 321, 0, 139, 135, 139, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 142, 83, 83, 83, 83, 83, 83, - 83, 0, 0, 0, 0, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 153, 153, 153, 153, 153, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 135, 139, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 140, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 140, 48, 48, 48, 48, 139, 139, 139, 135, - 135, 135, 135, 139, 139, 142, 141, 83, 83, 188, 83, 83, 83, 83, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, - 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, 0, - 0, 81, 81, 81, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 149, 135, 135, 135, 135, 139, 135, 150, 150, 135, 135, - 135, 142, 142, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 83, - 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 139, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 139, 139, 139, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 139, 175, 48, 48, 48, 48, 83, 83, 83, 83, - 0, 0, 0, 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 135, - 139, 135, 139, 139, 135, 135, 135, 135, 135, 135, 175, 145, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 83, 83, 83, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, 135, 135, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 322, 322, 322, 322, 322, 322, 322, 323, 323, 176, 176, 176, 80, 80, 80, - 324, 323, 323, 323, 323, 323, 174, 174, 174, 174, 174, 174, 174, 174, 86, - 86, 86, 86, 86, 86, 86, 86, 80, 80, 81, 81, 81, 81, 81, 86, 86, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 322, 322, 322, 322, 322, 322, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 81, 81, 81, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 148, 148, 148, 148, 148, 148, 148, 148, - 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, + 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 0, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 0, - 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, - 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 0, 49, - 49, 49, 49, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 49, 49, 0, 49, 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, - 49, 0, 0, 0, 49, 49, 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 49, 0, 49, 49, 0, 0, 49, 0, 0, 49, 49, 0, 0, 49, + 49, 49, 49, 0, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 0, 35, 0, + 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 0, 49, 49, 49, 49, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 0, 49, 49, + 49, 49, 49, 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 0, 49, + 49, 49, 49, 0, 49, 49, 49, 49, 49, 0, 49, 0, 0, 0, 49, 49, 49, 49, 49, + 49, 49, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 325, + 35, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 0, 0, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 327, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 226, + 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 327, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 327, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 327, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 49, 49, 49, 49, 49, 49, 49, 327, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 226, 35, 35, - 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 226, 35, 35, 35, 35, 35, 35, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 325, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 226, 35, 35, 35, 35, 35, 35, 49, 35, 0, 0, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 326, 326, 326, 326, 326, 131, 131, 131, 131, 0, 131, 131, 131, 131, + 35, 35, 35, 35, 49, 35, 0, 0, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 0, 0, 321, 321, 321, 321, 321, 321, 321, 321, 321, 86, 86, 86, 86, + 86, 86, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, + 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, - 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 131, - 131, 131, 0, 131, 0, 131, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 131, 0, 131, - 0, 131, 0, 131, 131, 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 0, 131, - 0, 131, 0, 131, 0, 131, 131, 0, 131, 0, 0, 131, 131, 131, 131, 0, 131, - 131, 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 131, 131, - 131, 0, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 0, 131, 131, 131, 131, 131, 0, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 131, 0, 131, 131, 0, 131, 0, 0, 131, 0, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 0, 0, 0, 0, 0, + 0, 131, 0, 0, 0, 0, 131, 0, 131, 0, 131, 0, 131, 131, 131, 0, 131, 131, + 0, 131, 0, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 0, 131, 131, 0, 131, + 0, 0, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 0, 131, + 131, 131, 131, 0, 131, 131, 131, 131, 0, 131, 0, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 0, + 131, 131, 131, 131, 131, 0, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 0, 0, 0, 0, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 153, 153, 0, 0, + 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 327, 0, 241, 241, 241, 241, 241, 241, 241, + 241, 241, 329, 0, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 222, 222, 0, 0, 0, 0, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, - 328, 328, 328, 241, 328, 328, 328, 328, 328, 328, 328, 328, 328, 328, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 268, 268, 268, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 241, 241, 241, 241, 241, 241, 241, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 222, 222, 0, 0, 0, 0, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 241, + 330, 330, 330, 330, 330, 330, 330, 330, 330, 330, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 268, 268, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 268, 268, 0, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, 268, - 268, 268, 0, 0, 0, 0, 0, 0, 0, 268, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 0, 0, 0, 0, 0, 268, 268, 268, 268, 268, 268, 268, 268, 268, 0, 0, 0, + 0, 0, 0, 0, 268, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, - 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, - 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 0, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, @@ -2567,76 +2830,103 @@ 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, - 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, + 274, 274, 274, 274, 274, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 174, 174, 174, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, @@ -2649,8 +2939,8 @@ 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, @@ -2659,7 +2949,7 @@ 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 273, 273, 273, 273, 0, 0, + 273, 273, 273, 273, 273, 273, 273, 273, 273, 0, 0, }; /* decomposition data */ @@ -3146,359 +3436,355 @@ 50, 49, 26085, 770, 50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, 26085, 770, 50, 53, 26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, 50, 56, 26085, 770, 50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, - 26085, 778, 103, 97, 108, 259, 42863, 259, 294, 259, 339, 256, 35912, - 256, 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, - 256, 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, - 256, 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, - 256, 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, - 256, 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, - 256, 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, - 256, 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, - 256, 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, - 256, 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, - 256, 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, - 256, 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, - 256, 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, - 256, 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, - 256, 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, - 256, 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, - 256, 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, - 256, 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, - 256, 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, - 256, 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, - 256, 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, - 256, 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, - 256, 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, - 256, 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, - 256, 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, - 256, 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, - 256, 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, - 256, 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, - 256, 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, - 256, 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, - 256, 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, - 256, 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, - 256, 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, - 256, 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, - 256, 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, - 256, 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, - 256, 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, - 256, 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, - 256, 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, - 256, 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, - 256, 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, - 256, 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, - 256, 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, - 256, 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, - 256, 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, - 256, 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, - 256, 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, - 256, 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, - 256, 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, - 256, 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, - 256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, - 256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, - 256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, - 256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, - 256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, - 256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, - 256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, - 256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, - 256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, - 256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, - 256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, - 256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, - 256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, - 256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, - 256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, - 256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, - 256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, - 256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, - 256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, - 256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, - 256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, - 256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, - 256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, - 256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, - 256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, - 256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, - 256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, - 154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, - 105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, - 116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, - 514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, - 1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, - 262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, - 64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, - 1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, - 1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, - 512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, - 1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, - 1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, - 512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, - 1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, - 1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, - 269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, - 1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, - 270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, - 1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, - 267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, - 1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, - 268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, - 1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, - 269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, - 1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, - 270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, - 1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, - 267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, - 1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, - 268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, - 1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, - 268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, - 524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, - 1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, - 1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, - 525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, - 1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, - 523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, - 1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, - 1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, - 523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, - 1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, - 1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, - 523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, - 1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, - 1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, - 523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, - 1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, - 1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, - 523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, - 1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, - 1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, - 523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, - 1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, - 1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, - 523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, - 1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, - 1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, - 523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, - 1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, - 1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, - 1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, - 524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, - 1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, - 1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, - 524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, - 1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, - 1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, - 524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, - 1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, - 1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, - 524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, - 1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, - 1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, - 525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, - 1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, - 1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, - 525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, - 1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, - 1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, - 525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, - 1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, - 1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, - 525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, - 1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, - 1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, - 525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, - 1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, - 1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, - 526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, - 1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, - 1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, - 526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, - 782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, - 1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, - 523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, - 1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, - 1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, - 523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, - 1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, - 1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, - 524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, - 1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, - 1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, - 524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, - 1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, - 1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, - 525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, - 1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, - 1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, - 524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, - 1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, - 1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, - 1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, - 1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, - 1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, - 1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, - 1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, - 1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, - 1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, - 1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, - 1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, - 1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, - 1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, - 1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, - 1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, - 1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, - 1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, - 1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, - 1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, - 1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, - 1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, - 1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, - 1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, - 1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, - 1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, - 1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, - 1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, - 1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, - 1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, - 1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, - 1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, - 1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, - 1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, - 1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, - 1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, - 1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, - 1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, - 1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, - 1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, - 1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, - 1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, - 1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, - 1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, - 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, - 1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, - 59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, - 8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, - 265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, - 265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, - 265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, - 258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, - 63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, - 271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, - 62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, - 1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, - 523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, - 1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, - 1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, - 268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, - 1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, - 267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, - 1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, - 268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, - 1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, - 267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, - 1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, - 270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, - 1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, - 267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, - 1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, - 268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, - 1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, - 269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, - 1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, - 268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, - 524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, - 1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, - 264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, - 264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, - 264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, - 264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, - 264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, - 264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, - 264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, - 264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, - 264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, - 264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, - 264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, - 264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, - 264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, - 272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, - 272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, - 272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, - 272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, - 272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, - 272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, - 272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, - 272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, - 272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, - 272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, - 272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, - 272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, - 272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, - 272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, - 272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, - 272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, - 272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, - 272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, - 272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, - 264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, - 8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, - 69797, 69818, 512, 69937, 69927, 512, 69938, 69927, 512, 119127, 119141, - 512, 119128, 119141, 512, 119135, 119150, 512, 119135, 119151, 512, - 119135, 119152, 512, 119135, 119153, 512, 119135, 119154, 512, 119225, - 119141, 512, 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, - 512, 119227, 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, - 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, - 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, - 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, - 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, - 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, - 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, - 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, - 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, - 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, - 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, - 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, - 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, - 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, - 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, - 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, - 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, - 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, - 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, + 26085, 778, 103, 97, 108, 259, 1098, 259, 1100, 259, 42863, 259, 294, + 259, 339, 259, 42791, 259, 43831, 259, 619, 259, 43858, 256, 35912, 256, + 26356, 256, 36554, 256, 36040, 256, 28369, 256, 20018, 256, 21477, 256, + 40860, 256, 40860, 256, 22865, 256, 37329, 256, 21895, 256, 22856, 256, + 25078, 256, 30313, 256, 32645, 256, 34367, 256, 34746, 256, 35064, 256, + 37007, 256, 27138, 256, 27931, 256, 28889, 256, 29662, 256, 33853, 256, + 37226, 256, 39409, 256, 20098, 256, 21365, 256, 27396, 256, 29211, 256, + 34349, 256, 40478, 256, 23888, 256, 28651, 256, 34253, 256, 35172, 256, + 25289, 256, 33240, 256, 34847, 256, 24266, 256, 26391, 256, 28010, 256, + 29436, 256, 37070, 256, 20358, 256, 20919, 256, 21214, 256, 25796, 256, + 27347, 256, 29200, 256, 30439, 256, 32769, 256, 34310, 256, 34396, 256, + 36335, 256, 38706, 256, 39791, 256, 40442, 256, 30860, 256, 31103, 256, + 32160, 256, 33737, 256, 37636, 256, 40575, 256, 35542, 256, 22751, 256, + 24324, 256, 31840, 256, 32894, 256, 29282, 256, 30922, 256, 36034, 256, + 38647, 256, 22744, 256, 23650, 256, 27155, 256, 28122, 256, 28431, 256, + 32047, 256, 32311, 256, 38475, 256, 21202, 256, 32907, 256, 20956, 256, + 20940, 256, 31260, 256, 32190, 256, 33777, 256, 38517, 256, 35712, 256, + 25295, 256, 27138, 256, 35582, 256, 20025, 256, 23527, 256, 24594, 256, + 29575, 256, 30064, 256, 21271, 256, 30971, 256, 20415, 256, 24489, 256, + 19981, 256, 27852, 256, 25976, 256, 32034, 256, 21443, 256, 22622, 256, + 30465, 256, 33865, 256, 35498, 256, 27578, 256, 36784, 256, 27784, 256, + 25342, 256, 33509, 256, 25504, 256, 30053, 256, 20142, 256, 20841, 256, + 20937, 256, 26753, 256, 31975, 256, 33391, 256, 35538, 256, 37327, 256, + 21237, 256, 21570, 256, 22899, 256, 24300, 256, 26053, 256, 28670, 256, + 31018, 256, 38317, 256, 39530, 256, 40599, 256, 40654, 256, 21147, 256, + 26310, 256, 27511, 256, 36706, 256, 24180, 256, 24976, 256, 25088, 256, + 25754, 256, 28451, 256, 29001, 256, 29833, 256, 31178, 256, 32244, 256, + 32879, 256, 36646, 256, 34030, 256, 36899, 256, 37706, 256, 21015, 256, + 21155, 256, 21693, 256, 28872, 256, 35010, 256, 35498, 256, 24265, 256, + 24565, 256, 25467, 256, 27566, 256, 31806, 256, 29557, 256, 20196, 256, + 22265, 256, 23527, 256, 23994, 256, 24604, 256, 29618, 256, 29801, 256, + 32666, 256, 32838, 256, 37428, 256, 38646, 256, 38728, 256, 38936, 256, + 20363, 256, 31150, 256, 37300, 256, 38584, 256, 24801, 256, 20102, 256, + 20698, 256, 23534, 256, 23615, 256, 26009, 256, 27138, 256, 29134, 256, + 30274, 256, 34044, 256, 36988, 256, 40845, 256, 26248, 256, 38446, 256, + 21129, 256, 26491, 256, 26611, 256, 27969, 256, 28316, 256, 29705, 256, + 30041, 256, 30827, 256, 32016, 256, 39006, 256, 20845, 256, 25134, 256, + 38520, 256, 20523, 256, 23833, 256, 28138, 256, 36650, 256, 24459, 256, + 24900, 256, 26647, 256, 29575, 256, 38534, 256, 21033, 256, 21519, 256, + 23653, 256, 26131, 256, 26446, 256, 26792, 256, 27877, 256, 29702, 256, + 30178, 256, 32633, 256, 35023, 256, 35041, 256, 37324, 256, 38626, 256, + 21311, 256, 28346, 256, 21533, 256, 29136, 256, 29848, 256, 34298, 256, + 38563, 256, 40023, 256, 40607, 256, 26519, 256, 28107, 256, 33256, 256, + 31435, 256, 31520, 256, 31890, 256, 29376, 256, 28825, 256, 35672, 256, + 20160, 256, 33590, 256, 21050, 256, 20999, 256, 24230, 256, 25299, 256, + 31958, 256, 23429, 256, 27934, 256, 26292, 256, 36667, 256, 34892, 256, + 38477, 256, 35211, 256, 24275, 256, 20800, 256, 21952, 256, 22618, 256, + 26228, 256, 20958, 256, 29482, 256, 30410, 256, 31036, 256, 31070, 256, + 31077, 256, 31119, 256, 38742, 256, 31934, 256, 32701, 256, 34322, 256, + 35576, 256, 36920, 256, 37117, 256, 39151, 256, 39164, 256, 39208, 256, + 40372, 256, 37086, 256, 38583, 256, 20398, 256, 20711, 256, 20813, 256, + 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, 256, + 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, 256, + 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, 256, + 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, 256, + 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, 256, + 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, 256, + 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, 256, + 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, 256, + 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, 256, + 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, 256, + 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, 256, + 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, 256, + 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, 256, + 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, 256, + 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, 256, + 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, 256, + 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, 256, + 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, 256, + 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, 256, + 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, 256, + 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, 256, + 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, 256, + 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, 256, + 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, 256, + 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, 256, + 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, 256, + 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, 154832, + 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, 105, 514, + 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, 116, 514, + 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, 514, 1406, + 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, 1506, 262, + 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, 262, 1512, + 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, 64329, 1473, + 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, 1488, 1468, 512, + 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, 1468, 512, 1493, + 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, 512, 1498, 1468, + 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, 1504, 1468, 512, + 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, 1468, 512, 1511, + 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, 512, 1493, 1465, + 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, 1488, 1500, 267, + 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, 1659, 267, 1662, + 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, 269, 1664, 270, + 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, 1663, 268, 1663, + 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, 270, 1657, 267, + 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, 1702, 269, 1702, + 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, 267, 1667, 268, + 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, 1670, 270, 1670, + 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, 268, 1677, 267, + 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, 1672, 267, 1688, + 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, 269, 1705, 270, + 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, 1715, 268, 1715, + 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, 270, 1713, 267, + 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, 1723, 267, 1728, + 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, 267, 1726, 268, + 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, 1747, 268, 1747, + 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, 268, 1735, 267, + 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, 1739, 268, 1739, + 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, 268, 1744, 269, + 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, 524, 1574, 1575, + 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, 1574, 1608, 523, + 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, 1734, 523, 1574, + 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, 525, 1574, 1744, + 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, 1740, 268, 1740, + 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, 523, 1574, 1605, + 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, 1576, 1581, 523, + 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, 1610, 523, 1578, + 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, 523, 1578, 1609, + 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, 1579, 1609, 523, + 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, 1580, 523, 1581, + 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, 523, 1587, 1580, + 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, 1589, 1581, 523, + 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, 1582, 523, 1590, + 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, 523, 1593, 1580, + 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, 1601, 1580, 523, + 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, 1609, 523, 1601, + 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, 523, 1602, 1610, + 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, 1603, 1582, 523, + 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, 1610, 523, 1604, + 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, 523, 1604, 1609, + 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, 1605, 1582, 523, + 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, 1580, 523, 1606, + 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, 523, 1606, 1610, + 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, 1607, 1610, 523, + 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, 1605, 523, 1610, + 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, 523, 1609, 1648, + 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, 1617, 779, 32, + 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, 1574, 1585, + 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, 1609, 524, + 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, 524, 1576, + 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, 1578, 1586, + 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, 1610, 524, + 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, 524, 1579, + 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, 1602, 1609, + 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, 1605, 524, + 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, 524, 1604, + 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, 1606, 1586, + 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, 1610, 524, + 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, 524, 1610, + 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, 1574, 1581, + 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, 1580, 525, + 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, 525, 1578, + 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, 1578, 1607, + 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, 1580, 525, + 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, 525, 1587, + 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, 1589, 1582, + 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, 1582, 525, + 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, 525, 1593, + 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, 1601, 1581, + 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, 1605, 525, + 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, 525, 1603, + 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, 1604, 1605, + 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, 1582, 525, + 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, 525, 1606, + 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, 1607, 1648, + 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, 1605, 525, + 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, 526, 1576, + 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, 1579, 1607, + 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, 1607, 526, + 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, 526, 1606, + 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, 782, 1600, + 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, 1610, 523, + 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, 523, 1587, + 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, 1581, 1609, + 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, 1609, 523, + 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, 523, 1590, + 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, 1588, 1605, + 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, 1585, 524, + 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, 524, 1594, + 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, 1588, 1609, + 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, 1609, 524, + 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, 524, 1589, + 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, 1588, 1581, + 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, 1585, 524, + 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, 525, 1588, + 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, 1591, 1605, + 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, 1580, 526, + 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, 524, 1575, + 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, 1580, 781, + 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, 1605, 781, + 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, 1582, 780, + 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, 1610, 780, + 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, 1581, 780, + 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, 1581, 781, + 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, 1605, 780, + 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, 1605, 780, + 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, 1610, 780, + 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, 1605, 781, + 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, 1605, 781, + 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, 1581, 781, + 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, 1605, 780, + 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, 1609, 780, + 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, 1609, 780, + 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, 1581, 780, + 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, 1610, 780, + 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, 1580, 780, + 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, 1581, 781, + 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, 1605, 780, + 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, 1605, 781, + 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, 1582, 781, + 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, 1605, 780, + 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, 1605, 780, + 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, 1609, 780, + 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, 1610, 780, + 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, 1610, 780, + 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, 1609, 780, + 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, 1609, 780, + 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, 1610, 780, + 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, 1610, 780, + 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, 1610, 780, + 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, 1610, 781, + 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, 1610, 780, + 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, 1610, 781, + 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, 1605, 780, + 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, 1610, 780, + 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, 1610, 781, + 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, 1605, 780, + 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, 1746, 779, + 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, 1603, 1576, + 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, 1605, 1035, + 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, 1608, 1587, + 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, 32, 1575, + 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, 1604, 1605, + 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, 1585, 1740, + 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, 59, 265, 33, + 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, 8212, 265, + 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, 265, 12308, + 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, 265, 12296, + 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, 265, 91, 265, + 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, 258, 95, 258, + 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, 63, 271, 33, + 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, 271, 12309, + 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, 62, 271, 61, + 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, 1600, 1611, 523, + 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, 523, 32, 1615, + 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, 1617, 526, + 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, 1570, 268, + 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, 268, 1573, + 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, 1575, 267, + 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, 267, 1578, + 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, 1579, 270, + 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, 268, 1581, + 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, 1582, 267, + 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, 267, 1586, + 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, 1588, 268, + 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, 270, 1589, + 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, 1591, 269, + 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, 267, 1593, + 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, 1594, 270, + 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, 268, 1602, + 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, 1603, 267, + 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, 269, 1605, + 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, 1607, 268, + 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, 268, 1609, + 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, 524, 1604, + 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, 1604, 1573, + 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, 264, 36, + 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, 264, 44, + 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, 264, 52, + 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, 264, 60, + 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, 264, 68, + 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, 264, 76, + 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, 264, 84, + 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, 264, 92, + 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, 264, 100, + 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, 264, 107, + 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, 264, 114, + 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, 264, 121, + 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, 264, 10630, + 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, 272, 12530, + 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, 272, 12515, + 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, 272, 12452, + 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, 272, 12463, + 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, 272, 12475, + 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, 272, 12488, + 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, 272, 12495, + 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, 272, 12511, + 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, 272, 12520, + 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, 272, 12527, + 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, 272, 12594, + 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, 272, 12600, + 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, 272, 12606, + 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, 272, 12612, + 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, 272, 12618, + 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, 272, 12624, + 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, 272, 12630, + 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, 272, 12636, + 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, 272, 12642, + 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, 264, 165, + 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, 8595, 272, + 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, 69797, 69818, + 512, 69937, 69927, 512, 69938, 69927, 512, 70471, 70462, 512, 70471, + 70487, 512, 70841, 70842, 512, 70841, 70832, 512, 70841, 70845, 512, + 71096, 71087, 512, 71097, 71087, 512, 119127, 119141, 512, 119128, + 119141, 512, 119135, 119150, 512, 119135, 119151, 512, 119135, 119152, + 512, 119135, 119153, 512, 119135, 119154, 512, 119225, 119141, 512, + 119226, 119141, 512, 119227, 119150, 512, 119228, 119150, 512, 119227, + 119151, 512, 119228, 119151, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, + 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, + 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, + 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, + 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, + 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, + 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, + 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, + 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, + 262, 101, 262, 102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, - 262, 65, 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, - 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, - 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, + 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, + 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, + 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, + 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, + 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, + 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, + 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, + 262, 67, 262, 68, 262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, + 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, + 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 112, 262, + 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, + 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, + 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, + 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, + 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, + 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, + 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, + 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, + 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, + 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, + 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, + 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, + 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, - 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, - 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, - 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, - 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, - 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, - 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, - 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, - 262, 71, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, - 262, 81, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, - 262, 69, 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, - 262, 79, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, - 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, - 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, - 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, - 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, - 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, - 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, - 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, + 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 68, 262, 69, + 262, 70, 262, 71, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 79, + 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, @@ -3536,33 +3822,15 @@ 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, - 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, - 305, 262, 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, - 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, - 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, - 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, - 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, - 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, - 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, - 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, - 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, - 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, - 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, - 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, - 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, - 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, - 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, - 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, - 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, - 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, - 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, - 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, - 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, - 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, - 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, - 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, - 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, - 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, + 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, + 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, + 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, + 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, + 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, + 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, + 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, + 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 305, 262, + 567, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, @@ -3578,339 +3846,546 @@ 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, - 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, - 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, - 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, - 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, - 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, - 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, - 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, - 56, 262, 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, - 1586, 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605, - 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, - 1585, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, - 262, 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262, - 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604, - 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, - 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594, - 262, 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262, - 1593, 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594, - 262, 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262, - 1591, 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, - 262, 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262, - 1582, 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575, - 262, 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262, - 1581, 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, - 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, - 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, - 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, - 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, - 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, - 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, - 514, 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, - 44, 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, - 770, 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, - 40, 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, - 74, 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, - 41, 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, - 770, 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, - 40, 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, - 12308, 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, - 266, 66, 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, - 266, 74, 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, - 266, 82, 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, - 266, 90, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, - 86, 522, 87, 67, 515, 77, 67, 515, 77, 68, 522, 68, 74, 522, 12411, - 12363, 522, 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, - 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, - 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, - 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, - 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, - 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, - 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, - 266, 26376, 266, 30003, 266, 21106, 266, 21942, 770, 12308, 26412, 12309, - 770, 12308, 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, - 12309, 770, 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, - 30423, 12309, 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, - 24471, 263, 21487, 256, 20029, 256, 20024, 256, 20033, 256, 131362, 256, - 20320, 256, 20398, 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, - 20711, 256, 20687, 256, 13470, 256, 132666, 256, 20813, 256, 20820, 256, - 20836, 256, 20855, 256, 132380, 256, 13497, 256, 20839, 256, 20877, 256, - 132427, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, - 168415, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, - 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, - 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, - 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, - 133676, 256, 28784, 256, 21450, 256, 21471, 256, 133987, 256, 21483, 256, - 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256, - 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256, - 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256, - 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256, - 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256, - 22700, 256, 136420, 256, 22770, 256, 22775, 256, 22790, 256, 22810, 256, - 22818, 256, 22882, 256, 136872, 256, 136938, 256, 23020, 256, 23067, 256, - 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, 256, 23304, 256, - 23358, 256, 23358, 256, 137672, 256, 23491, 256, 23512, 256, 23527, 256, - 23539, 256, 138008, 256, 23551, 256, 23558, 256, 24403, 256, 23586, 256, - 14209, 256, 23648, 256, 23662, 256, 23744, 256, 23693, 256, 138724, 256, - 23875, 256, 138726, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, - 24034, 256, 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, - 14434, 256, 139651, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, - 24266, 256, 172946, 256, 24318, 256, 140081, 256, 140081, 256, 33281, - 256, 24354, 256, 24354, 256, 14535, 256, 144056, 256, 156122, 256, 24418, - 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569, - 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 141012, 256, 24775, - 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256, 24974, - 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256, 25078, - 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256, 25424, - 256, 142092, 256, 25405, 256, 25340, 256, 25448, 256, 25475, 256, 25572, - 256, 142321, 256, 25634, 256, 25541, 256, 25513, 256, 14894, 256, 25705, - 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, 25935, 256, 25964, - 256, 143370, 256, 26083, 256, 26360, 256, 26185, 256, 15129, 256, 26257, - 256, 15112, 256, 15076, 256, 20882, 256, 20885, 256, 26368, 256, 26268, - 256, 32941, 256, 17369, 256, 26391, 256, 26395, 256, 26401, 256, 26462, - 256, 26451, 256, 144323, 256, 15177, 256, 26618, 256, 26501, 256, 26706, - 256, 26757, 256, 144493, 256, 26766, 256, 26655, 256, 26900, 256, 15261, - 256, 26946, 256, 27043, 256, 27114, 256, 27304, 256, 145059, 256, 27355, - 256, 15384, 256, 27425, 256, 145575, 256, 27476, 256, 15438, 256, 27506, - 256, 27551, 256, 27578, 256, 27579, 256, 146061, 256, 138507, 256, - 146170, 256, 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, 256, - 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, - 28037, 256, 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256, - 28363, 256, 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, 256, - 147342, 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, 256, - 28746, 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, 256, - 148067, 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, 256, - 149000, 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, 29562, - 256, 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, - 256, 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, - 256, 150582, 256, 30014, 256, 150674, 256, 30064, 256, 139679, 256, - 30224, 256, 151457, 256, 151480, 256, 151620, 256, 16380, 256, 16392, - 256, 30452, 256, 151795, 256, 151794, 256, 151833, 256, 151859, 256, - 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, 256, - 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, 256, - 16611, 256, 153126, 256, 31062, 256, 153242, 256, 153285, 256, 31119, - 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 153980, - 256, 154279, 256, 154279, 256, 31470, 256, 16898, 256, 154539, 256, - 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, 256, 17056, 256, - 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, 256, 17153, 256, - 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, 256, 156231, 256, - 17241, 256, 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, 256, - 32773, 256, 156890, 256, 156963, 256, 32864, 256, 157096, 256, 32880, - 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, - 256, 23221, 256, 157607, 256, 157621, 256, 144275, 256, 144284, 256, - 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, 256, - 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, 256, - 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, 256, - 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, 256, - 33756, 256, 158774, 256, 159083, 256, 158933, 256, 17707, 256, 34033, - 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, 17757, - 256, 17761, 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, 34396, - 256, 34407, 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, - 256, 34681, 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, - 256, 34817, 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, 35031, - 256, 35038, 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, 162150, - 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925, - 256, 162984, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, 163631, - 256, 133124, 256, 36299, 256, 36284, 256, 36336, 256, 133342, 256, 36564, - 256, 36664, 256, 165330, 256, 165357, 256, 37012, 256, 37105, 256, 37137, - 256, 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, 256, 37500, - 256, 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, 256, 38327, - 256, 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, 256, 168261, - 256, 168474, 256, 19054, 256, 19062, 256, 38880, 256, 168970, 256, 19122, - 256, 169110, 256, 38923, 256, 38923, 256, 38953, 256, 169398, 256, 39138, - 256, 19251, 256, 39209, 256, 39335, 256, 39362, 256, 39422, 256, 19406, - 256, 170800, 256, 39698, 256, 40000, 256, 40189, 256, 19662, 256, 19693, - 256, 40295, 256, 172238, 256, 19704, 256, 172293, 256, 172558, 256, - 172689, 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, 40709, 256, - 40719, 256, 40726, 256, 40763, 256, 173568, + 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, + 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, + 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, + 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, + 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, + 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, + 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, + 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, + 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, + 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, + 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, + 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, + 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, + 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, + 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, + 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, + 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, + 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, + 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, + 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, + 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, + 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, + 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, + 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, + 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, + 1008, 262, 981, 262, 1009, 262, 982, 262, 988, 262, 989, 262, 48, 262, + 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, + 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, + 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, + 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, + 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, + 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, + 57, 262, 1575, 262, 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, + 262, 1581, 262, 1591, 262, 1610, 262, 1603, 262, 1604, 262, 1605, 262, + 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, + 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, + 1592, 262, 1594, 262, 1646, 262, 1722, 262, 1697, 262, 1647, 262, 1576, + 262, 1580, 262, 1607, 262, 1581, 262, 1610, 262, 1603, 262, 1604, 262, + 1605, 262, 1606, 262, 1587, 262, 1593, 262, 1601, 262, 1589, 262, 1602, + 262, 1588, 262, 1578, 262, 1579, 262, 1582, 262, 1590, 262, 1594, 262, + 1580, 262, 1581, 262, 1610, 262, 1604, 262, 1606, 262, 1587, 262, 1593, + 262, 1589, 262, 1602, 262, 1588, 262, 1582, 262, 1590, 262, 1594, 262, + 1722, 262, 1647, 262, 1576, 262, 1580, 262, 1607, 262, 1581, 262, 1591, + 262, 1610, 262, 1603, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, + 1601, 262, 1589, 262, 1602, 262, 1588, 262, 1578, 262, 1579, 262, 1582, + 262, 1590, 262, 1592, 262, 1594, 262, 1646, 262, 1697, 262, 1575, 262, + 1576, 262, 1580, 262, 1583, 262, 1607, 262, 1608, 262, 1586, 262, 1581, + 262, 1591, 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, + 1593, 262, 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, + 262, 1579, 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 262, + 1576, 262, 1580, 262, 1583, 262, 1608, 262, 1586, 262, 1581, 262, 1591, + 262, 1610, 262, 1604, 262, 1605, 262, 1606, 262, 1587, 262, 1593, 262, + 1601, 262, 1589, 262, 1602, 262, 1585, 262, 1588, 262, 1578, 262, 1579, + 262, 1582, 262, 1584, 262, 1590, 262, 1592, 262, 1594, 514, 48, 46, 514, + 48, 44, 514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, 44, + 514, 54, 44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, 770, + 40, 66, 41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, 40, + 70, 41, 770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, 74, + 41, 770, 40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, 41, + 770, 40, 79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, 770, + 40, 83, 41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, 40, + 87, 41, 770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, 12308, + 83, 12309, 263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 65, 266, 66, + 266, 67, 266, 68, 266, 69, 266, 70, 266, 71, 266, 72, 266, 73, 266, 74, + 266, 75, 266, 76, 266, 77, 266, 78, 266, 79, 266, 80, 266, 81, 266, 82, + 266, 83, 266, 84, 266, 85, 266, 86, 266, 87, 266, 88, 266, 89, 266, 90, + 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, 778, 80, 80, 86, 522, + 87, 67, 515, 77, 67, 515, 77, 68, 522, 68, 74, 522, 12411, 12363, 522, + 12467, 12467, 266, 12469, 266, 25163, 266, 23383, 266, 21452, 266, 12487, + 266, 20108, 266, 22810, 266, 35299, 266, 22825, 266, 20132, 266, 26144, + 266, 28961, 266, 26009, 266, 21069, 266, 24460, 266, 20877, 266, 26032, + 266, 21021, 266, 32066, 266, 29983, 266, 36009, 266, 22768, 266, 21561, + 266, 28436, 266, 25237, 266, 25429, 266, 19968, 266, 19977, 266, 36938, + 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, 266, 25171, + 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, 266, 26376, + 266, 30003, 266, 21106, 266, 21942, 770, 12308, 26412, 12309, 770, 12308, + 19977, 12309, 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, + 12308, 28857, 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, + 770, 12308, 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, + 21487, 256, 20029, 256, 20024, 256, 20033, 256, 131362, 256, 20320, 256, + 20398, 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, 256, + 20687, 256, 13470, 256, 132666, 256, 20813, 256, 20820, 256, 20836, 256, + 20855, 256, 132380, 256, 13497, 256, 20839, 256, 20877, 256, 132427, 256, + 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, 168415, 256, + 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, 21106, 256, + 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, 21242, 256, + 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, 21338, 256, + 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, 133676, 256, + 28784, 256, 21450, 256, 21471, 256, 133987, 256, 21483, 256, 21489, 256, + 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256, 21666, 256, + 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256, 21892, 256, + 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256, 22022, 256, + 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256, 22478, 256, + 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256, 22700, 256, + 136420, 256, 22770, 256, 22775, 256, 22790, 256, 22810, 256, 22818, 256, + 22882, 256, 136872, 256, 136938, 256, 23020, 256, 23067, 256, 23079, 256, + 23000, 256, 23142, 256, 14062, 256, 14076, 256, 23304, 256, 23358, 256, + 23358, 256, 137672, 256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, + 138008, 256, 23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, + 23648, 256, 23662, 256, 23744, 256, 23693, 256, 138724, 256, 23875, 256, + 138726, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, + 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, + 139651, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, 256, + 172946, 256, 24318, 256, 140081, 256, 140081, 256, 33281, 256, 24354, + 256, 24354, 256, 14535, 256, 144056, 256, 156122, 256, 24418, 256, 24427, + 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569, 256, 24705, + 256, 14650, 256, 14620, 256, 24724, 256, 141012, 256, 24775, 256, 24904, + 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256, 24974, 256, 25010, + 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256, 25078, 256, 25104, + 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256, 25424, 256, 142092, + 256, 25405, 256, 25340, 256, 25448, 256, 25475, 256, 25572, 256, 142321, + 256, 25634, 256, 25541, 256, 25513, 256, 14894, 256, 25705, 256, 25726, + 256, 25757, 256, 25719, 256, 14956, 256, 25935, 256, 25964, 256, 143370, + 256, 26083, 256, 26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, + 256, 15076, 256, 20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, + 256, 17369, 256, 26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, + 256, 144323, 256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, + 256, 144493, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, 26946, + 256, 27043, 256, 27114, 256, 27304, 256, 145059, 256, 27355, 256, 15384, + 256, 27425, 256, 145575, 256, 27476, 256, 15438, 256, 27506, 256, 27551, + 256, 27578, 256, 27579, 256, 146061, 256, 138507, 256, 146170, 256, + 27726, 256, 146620, 256, 27839, 256, 27853, 256, 27751, 256, 27926, 256, + 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, 28037, 256, + 146718, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256, 28363, 256, + 28359, 256, 147153, 256, 28153, 256, 28526, 256, 147294, 256, 147342, + 256, 28614, 256, 28729, 256, 28702, 256, 28699, 256, 15766, 256, 28746, + 256, 28797, 256, 28791, 256, 28845, 256, 132389, 256, 28997, 256, 148067, + 256, 29084, 256, 148395, 256, 29224, 256, 29237, 256, 29264, 256, 149000, + 256, 29312, 256, 29333, 256, 149301, 256, 149524, 256, 29562, 256, 29579, + 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, 29788, + 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, 150582, + 256, 30014, 256, 150674, 256, 30064, 256, 139679, 256, 30224, 256, + 151457, 256, 151480, 256, 151620, 256, 16380, 256, 16392, 256, 30452, + 256, 151795, 256, 151794, 256, 151833, 256, 151859, 256, 30494, 256, + 30495, 256, 30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, + 16534, 256, 152605, 256, 30798, 256, 30860, 256, 30924, 256, 16611, 256, + 153126, 256, 31062, 256, 153242, 256, 153285, 256, 31119, 256, 31211, + 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 153980, 256, 154279, + 256, 154279, 256, 31470, 256, 16898, 256, 154539, 256, 31686, 256, 31689, + 256, 16935, 256, 154752, 256, 31954, 256, 17056, 256, 31976, 256, 31971, + 256, 32000, 256, 155526, 256, 32099, 256, 17153, 256, 32199, 256, 32258, + 256, 32325, 256, 17204, 256, 156200, 256, 156231, 256, 17241, 256, + 156377, 256, 32634, 256, 156478, 256, 32661, 256, 32762, 256, 32773, 256, + 156890, 256, 156963, 256, 32864, 256, 157096, 256, 32880, 256, 144223, + 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, 256, 23221, + 256, 157607, 256, 157621, 256, 144275, 256, 144284, 256, 33281, 256, + 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, 256, 33437, 256, + 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, 256, 158524, 256, + 33509, 256, 33565, 256, 33635, 256, 33709, 256, 33571, 256, 33725, 256, + 33767, 256, 33879, 256, 33619, 256, 33738, 256, 33740, 256, 33756, 256, + 158774, 256, 159083, 256, 158933, 256, 17707, 256, 34033, 256, 34035, + 256, 34070, 256, 160714, 256, 34148, 256, 159532, 256, 17757, 256, 17761, + 256, 159665, 256, 159954, 256, 17771, 256, 34384, 256, 34396, 256, 34407, + 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, + 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, + 256, 17913, 256, 34912, 256, 34915, 256, 161383, 256, 35031, 256, 35038, + 256, 17973, 256, 35066, 256, 13499, 256, 161966, 256, 162150, 256, 18110, + 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925, 256, 162984, + 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, 163631, 256, 133124, + 256, 36299, 256, 36284, 256, 36336, 256, 133342, 256, 36564, 256, 36664, + 256, 165330, 256, 165357, 256, 37012, 256, 37105, 256, 37137, 256, + 165678, 256, 37147, 256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, + 37881, 256, 37909, 256, 166906, 256, 38283, 256, 18837, 256, 38327, 256, + 167287, 256, 18918, 256, 38595, 256, 23986, 256, 38691, 256, 168261, 256, + 168474, 256, 19054, 256, 19062, 256, 38880, 256, 168970, 256, 19122, 256, + 169110, 256, 38923, 256, 38923, 256, 38953, 256, 169398, 256, 39138, 256, + 19251, 256, 39209, 256, 39335, 256, 39362, 256, 39422, 256, 19406, 256, + 170800, 256, 39698, 256, 40000, 256, 40189, 256, 19662, 256, 19693, 256, + 40295, 256, 172238, 256, 19704, 256, 172293, 256, 172558, 256, 172689, + 256, 40635, 256, 19798, 256, 40697, 256, 40702, 256, 40709, 256, 40719, + 256, 40726, 256, 40763, 256, 173568, }; /* index tables for the decomposition data */ -#define DECOMP_SHIFT 8 +#define DECOMP_SHIFT 7 static unsigned char decomp_index1[] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, 20, 21, 22, 23, 24, 7, 7, 7, 7, 7, 25, - 7, 26, 27, 28, 29, 30, 31, 32, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 36, 37, 38, 39, 40, - 41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 43, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 44, 7, 7, 45, - 46, 47, 48, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 49, 7, 7, 50, 51, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 52, 53, 54, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 10, 11, 12, 0, 0, 0, 0, 13, 14, 15, 0, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 0, 42, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, + 45, 0, 0, 46, 0, 47, 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 61, 0, 0, 0, 0, 0, 0, 62, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 78, 0, 0, 0, 79, 0, 0, 80, 0, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 83, 0, 0, 0, 0, 84, 85, + 86, 87, 88, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 92, 93, 0, 0, 0, 0, 94, 95, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 98, 99, 100, 101, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static unsigned short decomp_index2[] = { @@ -3978,38 +4453,22 @@ 0, 0, 0, 0, 1066, 1069, 1072, 1075, 0, 0, 1078, 1081, 0, 0, 1084, 1087, 1090, 1093, 1096, 1099, 0, 0, 1102, 1105, 1108, 1111, 1114, 1117, 0, 0, 1120, 1123, 1126, 1129, 1132, 1135, 1138, 1141, 1144, 1147, 1150, 1153, - 0, 0, 1156, 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1165, 1168, 1171, 1174, - 1177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1180, 1183, 1186, 1189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1156, 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1162, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1165, 1168, 1171, 1174, 1177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1180, 1183, 1186, 1189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1201, 0, 0, 0, @@ -4031,191 +4490,175 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, 0, 0, 1270, 1273, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1276, 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1282, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1285, 1288, 1291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 1300, 1303, 0, - 1306, 1309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 1315, 1318, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1321, 0, 1324, 1327, 1330, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 1342, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1345, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1267, 0, 0, 1270, 1273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1276, 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1285, 1288, 1291, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 1300, 1303, 0, 1306, 1309, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1312, 1315, 1318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1321, 0, 1324, 1327, 1330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1339, 1342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1345, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1347, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1350, 0, 0, 0, 0, 1353, 0, 0, 0, 0, 1356, 0, 0, 0, 0, 1359, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1365, 0, + 1368, 1371, 1374, 1377, 1380, 0, 0, 0, 0, 0, 0, 0, 1383, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1389, 0, 0, 0, 0, 1392, 0, 0, 0, 0, 1395, 0, 0, 0, 0, 1398, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1404, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1407, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1409, 0, 1412, 0, 1415, 0, 1418, 0, 1421, 0, 0, + 0, 1424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1427, 0, 1430, + 0, 0, 1433, 1436, 0, 1439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1442, 1444, 1446, 0, + 1448, 1450, 1452, 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 0, + 1470, 1472, 1474, 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, + 1494, 1496, 1498, 1500, 1502, 1504, 0, 1506, 1508, 1510, 1512, 1514, + 1516, 1518, 1520, 1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, 1538, + 1540, 1542, 1544, 1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1350, 0, 0, 0, 0, 1353, 0, 0, 0, 0, - 1356, 0, 0, 0, 0, 1359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1365, 0, 1368, 1371, 1374, 1377, 1380, 0, 0, 0, 0, - 0, 0, 0, 1383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1389, 0, 0, 0, 0, 1392, 0, 0, 0, 0, 1395, 0, - 0, 0, 0, 1398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1401, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1409, 0, 1412, 0, - 1415, 0, 1418, 0, 1421, 0, 0, 0, 1424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1427, 0, 1430, 0, 0, 1433, 1436, 0, 1439, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1442, 1444, 1446, 0, 1448, 1450, 1452, - 1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 0, 1470, 1472, 1474, - 1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1496, 1498, - 1500, 1502, 1504, 0, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, - 1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, 1538, 1540, 1542, 1544, - 1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1564, 1566, 1568, - 1570, 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, - 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, - 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1638, 1641, 1644, 1647, 1650, 1653, - 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 1683, 1686, 1689, - 1692, 1695, 1698, 1701, 1704, 1707, 1710, 1713, 1716, 1719, 1722, 1725, - 1728, 1731, 1734, 1737, 1740, 1743, 1746, 1749, 1752, 1755, 1758, 1761, - 1764, 1767, 1770, 1773, 1776, 1779, 1782, 1785, 1788, 1791, 1794, 1797, - 1800, 1803, 1806, 1809, 1812, 1815, 1818, 1821, 1824, 1827, 1830, 1833, - 1836, 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, 1863, 1866, 1869, - 1872, 1875, 1878, 1881, 1884, 1887, 1890, 1893, 1896, 1899, 1902, 1905, - 1908, 1911, 1914, 1917, 1920, 1923, 1926, 1929, 1932, 1935, 1938, 1941, - 1944, 1947, 1950, 1953, 1956, 1959, 1962, 1965, 1968, 1971, 1974, 1977, - 1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, 2007, 2010, 2013, - 2016, 2019, 2022, 2025, 2028, 2031, 2034, 2037, 2040, 2043, 2046, 2049, - 2052, 2055, 2058, 2061, 2064, 2067, 2070, 2073, 2076, 2079, 2082, 2085, - 2088, 2091, 2094, 2097, 2100, 2103, 0, 0, 0, 0, 2106, 2109, 2112, 2115, - 2118, 2121, 2124, 2127, 2130, 2133, 2136, 2139, 2142, 2145, 2148, 2151, - 2154, 2157, 2160, 2163, 2166, 2169, 2172, 2175, 2178, 2181, 2184, 2187, - 2190, 2193, 2196, 2199, 2202, 2205, 2208, 2211, 2214, 2217, 2220, 2223, - 2226, 2229, 2232, 2235, 2238, 2241, 2244, 2247, 2250, 2253, 2256, 2259, - 2262, 2265, 2268, 2271, 2274, 2277, 2280, 2283, 2286, 2289, 2292, 2295, - 2298, 2301, 2304, 2307, 2310, 2313, 2316, 2319, 2322, 2325, 2328, 2331, - 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, 2358, 2361, 2364, 2367, - 2370, 2373, 0, 0, 0, 0, 0, 0, 2376, 2379, 2382, 2385, 2388, 2391, 2394, - 2397, 2400, 2403, 2406, 2409, 2412, 2415, 2418, 2421, 2424, 2427, 2430, - 2433, 2436, 2439, 0, 0, 2442, 2445, 2448, 2451, 2454, 2457, 0, 0, 2460, - 2463, 2466, 2469, 2472, 2475, 2478, 2481, 2484, 2487, 2490, 2493, 2496, - 2499, 2502, 2505, 2508, 2511, 2514, 2517, 2520, 2523, 2526, 2529, 2532, - 2535, 2538, 2541, 2544, 2547, 2550, 2553, 2556, 2559, 2562, 2565, 2568, - 2571, 0, 0, 2574, 2577, 2580, 2583, 2586, 2589, 0, 0, 2592, 2595, 2598, - 2601, 2604, 2607, 2610, 2613, 0, 2616, 0, 2619, 0, 2622, 0, 2625, 2628, - 2631, 2634, 2637, 2640, 2643, 2646, 2649, 2652, 2655, 2658, 2661, 2664, - 2667, 2670, 2673, 2676, 2679, 2681, 2684, 2686, 2689, 2691, 2694, 2696, - 2699, 2701, 2704, 2706, 2709, 0, 0, 2711, 2714, 2717, 2720, 2723, 2726, - 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, 2753, 2756, 2759, 2762, - 2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, 2789, 2792, 2795, 2798, - 2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, 2825, 2828, 2831, 2834, - 2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, 2861, 2864, 2867, 0, - 2870, 2873, 2876, 2879, 2882, 2885, 2887, 2890, 2893, 2895, 2898, 2901, - 2904, 2907, 2910, 0, 2913, 2916, 2919, 2922, 2924, 2927, 2929, 2932, - 2935, 2938, 2941, 2944, 2947, 2950, 0, 0, 2952, 2955, 2958, 2961, 2964, - 2967, 0, 2969, 2972, 2975, 2978, 2981, 2984, 2987, 2989, 2992, 2995, - 2998, 3001, 3004, 3007, 3010, 3012, 3015, 3018, 3020, 0, 0, 3022, 3025, - 3028, 0, 3031, 3034, 3037, 3040, 3042, 3045, 3047, 3050, 3052, 0, 3055, - 3057, 3059, 3061, 3063, 3065, 3067, 3069, 3071, 3073, 3075, 0, 0, 0, 0, - 0, 0, 3077, 0, 0, 0, 0, 0, 3079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3082, 3084, 3087, 0, 0, 0, 0, 0, 0, 0, 0, 3091, 0, 0, 0, 3093, 3096, 0, - 3100, 3103, 0, 0, 0, 0, 3107, 0, 3110, 0, 0, 0, 0, 0, 0, 0, 0, 3113, - 3116, 3119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3122, 0, 0, 0, 0, 0, - 0, 0, 3127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3129, 3131, - 0, 0, 3133, 3135, 3137, 3139, 3141, 3143, 3145, 3147, 3149, 3151, 3153, - 3155, 3157, 3159, 3161, 3163, 3165, 3167, 3169, 3171, 3173, 3175, 3177, - 3179, 3181, 3183, 3185, 0, 3187, 3189, 3191, 3193, 3195, 3197, 3199, - 3201, 3203, 3205, 3207, 3209, 3211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3216, 3220, 3224, - 3226, 0, 3229, 3233, 3237, 0, 3239, 3242, 3244, 3246, 3248, 3250, 3252, - 3254, 3256, 3258, 3260, 0, 3262, 3264, 0, 0, 3267, 3269, 3271, 3273, - 3275, 0, 0, 3277, 3280, 3284, 0, 3287, 0, 3289, 0, 3291, 0, 3293, 3295, - 3297, 3299, 0, 3301, 3303, 3305, 0, 3307, 3309, 3311, 3313, 3315, 3317, - 3319, 0, 3321, 3325, 3327, 3329, 3331, 3333, 0, 0, 0, 0, 3335, 3337, - 3339, 3341, 3343, 0, 0, 0, 0, 0, 0, 3345, 3349, 3353, 3358, 3362, 3366, - 3370, 3374, 3378, 3382, 3386, 3390, 3394, 3398, 3402, 3406, 3409, 3411, - 3414, 3418, 3421, 3423, 3426, 3430, 3435, 3438, 3440, 3443, 3447, 3449, - 3451, 3453, 3455, 3457, 3460, 3464, 3467, 3469, 3472, 3476, 3481, 3484, - 3486, 3489, 3493, 3495, 3497, 3499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3501, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3505, 3508, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3511, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3514, - 3517, 3520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3523, 0, 0, 0, 0, 3526, 0, 0, 3529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3532, 0, 3535, - 0, 0, 0, 0, 0, 3538, 3541, 0, 3545, 3548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3552, 0, 0, 3555, 0, 0, 3558, 0, 3561, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3564, 0, 3567, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3570, 3573, 3576, 3579, 3582, 0, 0, 3585, 3588, - 0, 0, 3591, 3594, 0, 0, 0, 0, 0, 0, 3597, 3600, 0, 0, 3603, 3606, 0, 0, - 3609, 3612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3615, 3618, 3621, 3624, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3627, - 3630, 3633, 3636, 0, 0, 0, 0, 0, 0, 3639, 3642, 3645, 3648, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3651, 3653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1564, 1566, 1568, 1570, 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, + 1588, 1590, 1592, 1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, + 1612, 1614, 1616, 1618, 1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, + 1636, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1638, 1641, 1644, + 1647, 1650, 1653, 1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, + 1683, 1686, 1689, 1692, 1695, 1698, 1701, 1704, 1707, 1710, 1713, 1716, + 1719, 1722, 1725, 1728, 1731, 1734, 1737, 1740, 1743, 1746, 1749, 1752, + 1755, 1758, 1761, 1764, 1767, 1770, 1773, 1776, 1779, 1782, 1785, 1788, + 1791, 1794, 1797, 1800, 1803, 1806, 1809, 1812, 1815, 1818, 1821, 1824, + 1827, 1830, 1833, 1836, 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, + 1863, 1866, 1869, 1872, 1875, 1878, 1881, 1884, 1887, 1890, 1893, 1896, + 1899, 1902, 1905, 1908, 1911, 1914, 1917, 1920, 1923, 1926, 1929, 1932, + 1935, 1938, 1941, 1944, 1947, 1950, 1953, 1956, 1959, 1962, 1965, 1968, + 1971, 1974, 1977, 1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, + 2007, 2010, 2013, 2016, 2019, 2022, 2025, 2028, 2031, 2034, 2037, 2040, + 2043, 2046, 2049, 2052, 2055, 2058, 2061, 2064, 2067, 2070, 2073, 2076, + 2079, 2082, 2085, 2088, 2091, 2094, 2097, 2100, 2103, 0, 0, 0, 0, 2106, + 2109, 2112, 2115, 2118, 2121, 2124, 2127, 2130, 2133, 2136, 2139, 2142, + 2145, 2148, 2151, 2154, 2157, 2160, 2163, 2166, 2169, 2172, 2175, 2178, + 2181, 2184, 2187, 2190, 2193, 2196, 2199, 2202, 2205, 2208, 2211, 2214, + 2217, 2220, 2223, 2226, 2229, 2232, 2235, 2238, 2241, 2244, 2247, 2250, + 2253, 2256, 2259, 2262, 2265, 2268, 2271, 2274, 2277, 2280, 2283, 2286, + 2289, 2292, 2295, 2298, 2301, 2304, 2307, 2310, 2313, 2316, 2319, 2322, + 2325, 2328, 2331, 2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, 2358, + 2361, 2364, 2367, 2370, 2373, 0, 0, 0, 0, 0, 0, 2376, 2379, 2382, 2385, + 2388, 2391, 2394, 2397, 2400, 2403, 2406, 2409, 2412, 2415, 2418, 2421, + 2424, 2427, 2430, 2433, 2436, 2439, 0, 0, 2442, 2445, 2448, 2451, 2454, + 2457, 0, 0, 2460, 2463, 2466, 2469, 2472, 2475, 2478, 2481, 2484, 2487, + 2490, 2493, 2496, 2499, 2502, 2505, 2508, 2511, 2514, 2517, 2520, 2523, + 2526, 2529, 2532, 2535, 2538, 2541, 2544, 2547, 2550, 2553, 2556, 2559, + 2562, 2565, 2568, 2571, 0, 0, 2574, 2577, 2580, 2583, 2586, 2589, 0, 0, + 2592, 2595, 2598, 2601, 2604, 2607, 2610, 2613, 0, 2616, 0, 2619, 0, + 2622, 0, 2625, 2628, 2631, 2634, 2637, 2640, 2643, 2646, 2649, 2652, + 2655, 2658, 2661, 2664, 2667, 2670, 2673, 2676, 2679, 2681, 2684, 2686, + 2689, 2691, 2694, 2696, 2699, 2701, 2704, 2706, 2709, 0, 0, 2711, 2714, + 2717, 2720, 2723, 2726, 2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, + 2753, 2756, 2759, 2762, 2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, + 2789, 2792, 2795, 2798, 2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, + 2825, 2828, 2831, 2834, 2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, + 2861, 2864, 2867, 0, 2870, 2873, 2876, 2879, 2882, 2885, 2887, 2890, + 2893, 2895, 2898, 2901, 2904, 2907, 2910, 0, 2913, 2916, 2919, 2922, + 2924, 2927, 2929, 2932, 2935, 2938, 2941, 2944, 2947, 2950, 0, 0, 2952, + 2955, 2958, 2961, 2964, 2967, 0, 2969, 2972, 2975, 2978, 2981, 2984, + 2987, 2989, 2992, 2995, 2998, 3001, 3004, 3007, 3010, 3012, 3015, 3018, + 3020, 0, 0, 3022, 3025, 3028, 0, 3031, 3034, 3037, 3040, 3042, 3045, + 3047, 3050, 3052, 0, 3055, 3057, 3059, 3061, 3063, 3065, 3067, 3069, + 3071, 3073, 3075, 0, 0, 0, 0, 0, 0, 3077, 0, 0, 0, 0, 0, 3079, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3082, 3084, 3087, 0, 0, 0, 0, 0, 0, 0, 0, + 3091, 0, 0, 0, 3093, 3096, 0, 3100, 3103, 0, 0, 0, 0, 3107, 0, 3110, 0, + 0, 0, 0, 0, 0, 0, 0, 3113, 3116, 3119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3122, 0, 0, 0, 0, 0, 0, 0, 3127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3129, 3131, 0, 0, 3133, 3135, 3137, 3139, 3141, 3143, + 3145, 3147, 3149, 3151, 3153, 3155, 3157, 3159, 3161, 3163, 3165, 3167, + 3169, 3171, 3173, 3175, 3177, 3179, 3181, 3183, 3185, 0, 3187, 3189, + 3191, 3193, 3195, 3197, 3199, 3201, 3203, 3205, 3207, 3209, 3211, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3216, 3220, 3224, 3226, 0, 3229, 3233, 3237, 0, 3239, 3242, 3244, + 3246, 3248, 3250, 3252, 3254, 3256, 3258, 3260, 0, 3262, 3264, 0, 0, + 3267, 3269, 3271, 3273, 3275, 0, 0, 3277, 3280, 3284, 0, 3287, 0, 3289, + 0, 3291, 0, 3293, 3295, 3297, 3299, 0, 3301, 3303, 3305, 0, 3307, 3309, + 3311, 3313, 3315, 3317, 3319, 0, 3321, 3325, 3327, 3329, 3331, 3333, 0, + 0, 0, 0, 3335, 3337, 3339, 3341, 3343, 0, 0, 0, 0, 0, 0, 3345, 3349, + 3353, 3358, 3362, 3366, 3370, 3374, 3378, 3382, 3386, 3390, 3394, 3398, + 3402, 3406, 3409, 3411, 3414, 3418, 3421, 3423, 3426, 3430, 3435, 3438, + 3440, 3443, 3447, 3449, 3451, 3453, 3455, 3457, 3460, 3464, 3467, 3469, + 3472, 3476, 3481, 3484, 3486, 3489, 3493, 3495, 3497, 3499, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3505, 3508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3511, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3514, 3517, 3520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3523, 0, 0, 0, 0, 3526, + 0, 0, 3529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3532, 0, 3535, 0, 0, 0, 0, 0, 3538, 3541, 0, 3545, 3548, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3552, 0, 0, 3555, 0, 0, 3558, + 0, 3561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3564, 0, 3567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3570, 3573, 3576, 3579, + 3582, 0, 0, 3585, 3588, 0, 0, 3591, 3594, 0, 0, 0, 0, 0, 0, 3597, 3600, + 0, 0, 3603, 3606, 0, 0, 3609, 3612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3615, + 3618, 3621, 3624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3627, 3630, 3633, 3636, 0, 0, 0, 0, 0, 0, 3639, 3642, + 3645, 3648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3651, 3653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4256,23 +4699,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4370,785 +4797,822 @@ 6530, 6533, 6536, 6539, 6542, 6545, 6548, 6551, 6554, 6558, 6562, 6566, 6570, 6574, 6578, 6582, 6586, 6590, 6594, 6598, 6602, 6606, 6610, 6614, 6618, 6622, 6626, 6630, 6634, 6638, 6642, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6648, 6650, 0, 0, 0, 0, 0, 0, 6652, 6654, 6656, 6658, 6660, 6662, 6664, - 6666, 6668, 6670, 6672, 6674, 6676, 6678, 6680, 6682, 6684, 6686, 6688, - 6690, 6692, 6694, 6696, 6698, 6700, 6702, 6704, 6706, 6708, 6710, 6712, - 6714, 6716, 6718, 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734, 6736, - 6738, 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, 6758, 6760, - 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, 6780, 6782, 6784, - 6786, 6788, 6790, 6792, 6794, 6796, 6798, 6800, 6802, 6804, 6806, 6808, - 6810, 6812, 6814, 6816, 6818, 6820, 6822, 6824, 6826, 6828, 6830, 6832, - 6834, 6836, 6838, 6840, 6842, 6844, 6846, 6848, 6850, 6852, 6854, 6856, - 6858, 6860, 6862, 6864, 6866, 6868, 6870, 6872, 6874, 6876, 6878, 6880, - 6882, 6884, 6886, 6888, 6890, 6892, 6894, 6896, 6898, 6900, 6902, 6904, - 6906, 6908, 6910, 6912, 6914, 6916, 6918, 6920, 6922, 6924, 6926, 6928, - 6930, 6932, 6934, 6936, 6938, 6940, 6942, 6944, 6946, 6948, 6950, 6952, - 6954, 6956, 6958, 6960, 6962, 6964, 6966, 6968, 6970, 6972, 6974, 6976, - 6978, 6980, 6982, 6984, 6986, 6988, 6990, 6992, 6994, 6996, 6998, 7000, - 7002, 7004, 7006, 7008, 7010, 7012, 7014, 7016, 7018, 7020, 7022, 7024, - 7026, 7028, 7030, 7032, 7034, 7036, 7038, 7040, 7042, 7044, 7046, 7048, - 7050, 7052, 7054, 7056, 7058, 7060, 7062, 7064, 7066, 7068, 7070, 7072, - 7074, 7076, 7078, 7080, 7082, 7084, 7086, 7088, 7090, 7092, 7094, 7096, - 7098, 7100, 7102, 7104, 7106, 7108, 7110, 7112, 7114, 7116, 7118, 7120, - 7122, 7124, 7126, 7128, 7130, 7132, 7134, 7136, 7138, 7140, 7142, 7144, - 7146, 7148, 7150, 7152, 7154, 7156, 7158, 7160, 7162, 7164, 7166, 7168, - 7170, 7172, 7174, 7176, 7178, 7180, 7182, 7184, 7186, 7188, 7190, 0, 0, - 7192, 0, 7194, 0, 0, 7196, 7198, 7200, 7202, 7204, 7206, 7208, 7210, - 7212, 7214, 0, 7216, 0, 7218, 0, 0, 7220, 7222, 0, 0, 0, 7224, 7226, - 7228, 7230, 7232, 7234, 7236, 7238, 7240, 7242, 7244, 7246, 7248, 7250, - 7252, 7254, 7256, 7258, 7260, 7262, 7264, 7266, 7268, 7270, 7272, 7274, - 7276, 7278, 7280, 7282, 7284, 7286, 7288, 7290, 7292, 7294, 7296, 7298, - 7300, 7302, 7304, 7306, 7308, 7310, 7312, 7314, 7316, 7318, 7320, 7322, - 7324, 7326, 7328, 7330, 7332, 7334, 7336, 7338, 7340, 7342, 7344, 7346, - 7348, 7350, 7352, 7354, 7356, 7358, 0, 0, 7360, 7362, 7364, 7366, 7368, - 7370, 7372, 7374, 7376, 7378, 7380, 7382, 7384, 7386, 7388, 7390, 7392, - 7394, 7396, 7398, 7400, 7402, 7404, 7406, 7408, 7410, 7412, 7414, 7416, - 7418, 7420, 7422, 7424, 7426, 7428, 7430, 7432, 7434, 7436, 7438, 7440, - 7442, 7444, 7446, 7448, 7450, 7452, 7454, 7456, 7458, 7460, 7462, 7464, - 7466, 7468, 7470, 7472, 7474, 7476, 7478, 7480, 7482, 7484, 7486, 7488, - 7490, 7492, 7494, 7496, 7498, 7500, 7502, 7504, 7506, 7508, 7510, 7512, - 7514, 7516, 7518, 7520, 7522, 7524, 7526, 7528, 7530, 7532, 7534, 7536, - 7538, 7540, 7542, 7544, 7546, 7548, 7550, 7552, 7554, 7556, 7558, 7560, - 7562, 7564, 7566, 7568, 7570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7572, 7575, 7578, 7581, 7585, 7589, 7592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7595, 7598, 7601, 7604, 7607, 0, 0, 0, 0, 0, 7610, 0, 7613, 7616, - 7618, 7620, 7622, 7624, 7626, 7628, 7630, 7632, 7634, 7636, 7639, 7642, - 7645, 7648, 7651, 7654, 7657, 7660, 7663, 7666, 7669, 7672, 0, 7675, - 7678, 7681, 7684, 7687, 0, 7690, 0, 7693, 7696, 0, 7699, 7702, 0, 7705, - 7708, 7711, 7714, 7717, 7720, 7723, 7726, 7729, 7732, 7735, 7737, 7739, - 7741, 7743, 7745, 7747, 7749, 7751, 7753, 7755, 7757, 7759, 7761, 7763, - 7765, 7767, 7769, 7771, 7773, 7775, 7777, 7779, 7781, 7783, 7785, 7787, - 7789, 7791, 7793, 7795, 7797, 7799, 7801, 7803, 7805, 7807, 7809, 7811, - 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, 7831, 7833, 7835, - 7837, 7839, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, - 7861, 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 7881, 7883, - 7885, 7887, 7889, 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, - 7909, 7911, 7913, 7915, 7917, 7919, 7921, 7923, 7925, 7927, 7929, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7931, 7933, 7935, 7937, 7939, 7941, 7943, 7945, - 7947, 7949, 7951, 7953, 7955, 7957, 7959, 7961, 7963, 7965, 7967, 7969, - 7971, 7973, 7975, 7977, 7980, 7983, 7986, 7989, 7992, 7995, 7998, 8001, - 8004, 8007, 8010, 8013, 8016, 8019, 8022, 8025, 8028, 8031, 8033, 8035, - 8037, 8039, 8042, 8045, 8048, 8051, 8054, 8057, 8060, 8063, 8066, 8069, - 8072, 8075, 8078, 8081, 8084, 8087, 8090, 8093, 8096, 8099, 8102, 8105, - 8108, 8111, 8114, 8117, 8120, 8123, 8126, 8129, 8132, 8135, 8138, 8141, - 8144, 8147, 8150, 8153, 8156, 8159, 8162, 8165, 8168, 8171, 8174, 8177, - 8180, 8183, 8186, 8189, 8192, 8195, 8198, 8201, 8204, 8207, 8210, 8213, - 8216, 8219, 8222, 8225, 8228, 8231, 8234, 8237, 8240, 8243, 8246, 8249, - 8252, 8255, 8258, 8261, 8264, 8267, 8270, 8273, 8276, 8279, 8282, 8285, - 8288, 8291, 8294, 8297, 8300, 8303, 8306, 8309, 8312, 8315, 8318, 8321, - 8325, 8329, 8333, 8337, 8341, 8345, 8348, 8351, 8354, 8357, 8360, 8363, - 8366, 8369, 8372, 8375, 8378, 8381, 8384, 8387, 8390, 8393, 8396, 8399, - 8402, 8405, 8408, 8411, 8414, 8417, 8420, 8423, 8426, 8429, 8432, 8435, - 8438, 8441, 8444, 8447, 8450, 8453, 8456, 8459, 8462, 8465, 8468, 8471, - 8474, 8477, 8480, 8483, 8486, 8489, 8492, 8495, 8498, 8501, 8504, 8507, - 8510, 8513, 8516, 8519, 8522, 8525, 8528, 8531, 8534, 8537, 8540, 8543, - 8546, 8549, 8552, 8555, 8558, 8561, 8564, 8567, 8570, 8573, 8576, 8579, - 8582, 8585, 8588, 8591, 8594, 8597, 8600, 8603, 8606, 8609, 8612, 8615, - 8618, 8621, 8624, 8627, 8630, 8633, 8636, 8639, 8642, 8645, 8648, 8651, - 8654, 8657, 8660, 8663, 8666, 8669, 8672, 8675, 8678, 8681, 8684, 8687, - 8690, 8693, 8696, 8699, 8702, 8705, 8708, 8711, 8714, 8717, 8720, 8723, - 8726, 8729, 8732, 8735, 8738, 8741, 8744, 8747, 8750, 8753, 8756, 8759, - 8762, 8765, 8768, 8771, 8775, 8779, 8783, 8786, 8789, 8792, 8795, 8798, - 8801, 8804, 8807, 8810, 8813, 8816, 8819, 8822, 8825, 8828, 8831, 8834, - 8837, 8840, 8843, 8846, 8849, 8852, 8855, 8858, 8861, 8864, 8867, 8870, - 8873, 8876, 8879, 8882, 8885, 8888, 8891, 8894, 8897, 8900, 8903, 8906, - 8909, 8912, 8915, 8918, 8921, 8924, 8927, 8930, 8933, 8936, 8939, 8942, - 8945, 8948, 8951, 8954, 8957, 8960, 8963, 8966, 8969, 8972, 8975, 8978, - 8981, 8984, 8987, 8990, 8993, 8996, 8999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9002, 9006, 9010, 9014, 9018, 9022, 9026, 9030, - 9034, 9038, 9042, 9046, 9050, 9054, 9058, 9062, 9066, 9070, 9074, 9078, - 9082, 9086, 9090, 9094, 9098, 9102, 9106, 9110, 9114, 9118, 9122, 9126, - 9130, 9134, 9138, 9142, 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, - 9178, 9182, 9186, 9190, 9194, 9198, 9202, 9206, 9210, 9214, 9218, 9222, - 9226, 9230, 9234, 9238, 9242, 9246, 9250, 9254, 0, 0, 9258, 9262, 9266, - 9270, 9274, 9278, 9282, 9286, 9290, 9294, 9298, 9302, 9306, 9310, 9314, - 9318, 9322, 9326, 9330, 9334, 9338, 9342, 9346, 9350, 9354, 9358, 9362, - 9366, 9370, 9374, 9378, 9382, 9386, 9390, 9394, 9398, 9402, 9406, 9410, - 9414, 9418, 9422, 9426, 9430, 9434, 9438, 9442, 9446, 9450, 9454, 9458, - 9462, 9466, 9470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9474, - 9478, 9482, 9487, 9492, 9497, 9502, 9507, 9512, 9517, 9521, 9540, 9549, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9554, 9556, - 9558, 9560, 9562, 9564, 9566, 9568, 9570, 9572, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9574, 9576, 9578, 9580, 9582, - 9584, 9586, 9588, 9590, 9592, 9594, 9596, 9598, 9600, 9602, 9604, 9606, - 9608, 9610, 9612, 9614, 0, 0, 9616, 9618, 9620, 9622, 9624, 9626, 9628, - 9630, 9632, 9634, 9636, 9638, 0, 9640, 9642, 9644, 9646, 9648, 9650, - 9652, 9654, 9656, 9658, 9660, 9662, 9664, 9666, 9668, 9670, 9672, 9674, - 9676, 0, 9678, 9680, 9682, 9684, 0, 0, 0, 0, 9686, 9689, 9692, 0, 9695, - 0, 9698, 9701, 9704, 9707, 9710, 9713, 9716, 9719, 9722, 9725, 9728, - 9730, 9732, 9734, 9736, 9738, 9740, 9742, 9744, 9746, 9748, 9750, 9752, - 9754, 9756, 9758, 9760, 9762, 9764, 9766, 9768, 9770, 9772, 9774, 9776, - 9778, 9780, 9782, 9784, 9786, 9788, 9790, 9792, 9794, 9796, 9798, 9800, - 9802, 9804, 9806, 9808, 9810, 9812, 9814, 9816, 9818, 9820, 9822, 9824, - 9826, 9828, 9830, 9832, 9834, 9836, 9838, 9840, 9842, 9844, 9846, 9848, - 9850, 9852, 9854, 9856, 9858, 9860, 9862, 9864, 9866, 9868, 9870, 9872, - 9874, 9876, 9878, 9880, 9882, 9884, 9886, 9888, 9890, 9892, 9894, 9896, - 9898, 9900, 9902, 9904, 9906, 9908, 9910, 9912, 9914, 9916, 9918, 9920, - 9922, 9924, 9926, 9928, 9930, 9932, 9934, 9936, 9938, 9940, 9942, 9944, - 9946, 9948, 9950, 9952, 9954, 9956, 9958, 9960, 9962, 9965, 9968, 9971, - 9974, 9977, 9980, 9983, 0, 0, 0, 0, 9986, 9988, 9990, 9992, 9994, 9996, - 9998, 10000, 10002, 10004, 10006, 10008, 10010, 10012, 10014, 10016, - 10018, 10020, 10022, 10024, 10026, 10028, 10030, 10032, 10034, 10036, - 10038, 10040, 10042, 10044, 10046, 10048, 10050, 10052, 10054, 10056, - 10058, 10060, 10062, 10064, 10066, 10068, 10070, 10072, 10074, 10076, - 10078, 10080, 10082, 10084, 10086, 10088, 10090, 10092, 10094, 10096, - 10098, 10100, 10102, 10104, 10106, 10108, 10110, 10112, 10114, 10116, - 10118, 10120, 10122, 10124, 10126, 10128, 10130, 10132, 10134, 10136, - 10138, 10140, 10142, 10144, 10146, 10148, 10150, 10152, 10154, 10156, - 10158, 10160, 10162, 10164, 10166, 10168, 10170, 10172, 10174, 10176, - 10178, 10180, 10182, 10184, 10186, 10188, 10190, 10192, 10194, 10196, - 10198, 10200, 10202, 10204, 10206, 10208, 10210, 10212, 10214, 10216, - 10218, 10220, 10222, 10224, 10226, 10228, 10230, 10232, 10234, 10236, - 10238, 10240, 10242, 10244, 10246, 10248, 10250, 10252, 10254, 10256, - 10258, 10260, 10262, 10264, 10266, 10268, 10270, 10272, 10274, 10276, - 10278, 10280, 10282, 10284, 10286, 10288, 10290, 10292, 10294, 10296, - 10298, 10300, 10302, 10304, 10306, 10308, 10310, 10312, 10314, 10316, - 10318, 10320, 10322, 10324, 10326, 10328, 10330, 10332, 10334, 10336, - 10338, 10340, 10342, 10344, 10346, 10348, 10350, 10352, 10354, 10356, - 10358, 10360, 10362, 10364, 0, 0, 0, 10366, 10368, 10370, 10372, 10374, - 10376, 0, 0, 10378, 10380, 10382, 10384, 10386, 10388, 0, 0, 10390, - 10392, 10394, 10396, 10398, 10400, 0, 0, 10402, 10404, 10406, 0, 0, 0, - 10408, 10410, 10412, 10414, 10416, 10418, 10420, 0, 10422, 10424, 10426, - 10428, 10430, 10432, 10434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10436, 0, 10439, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 10442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10445, 10448, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10451, 10454, 10457, 10460, 10463, - 10466, 10469, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10472, 10475, - 10478, 10481, 10484, 10487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 10490, 10492, 10494, 10496, 10498, 10500, 10502, 10504, 10506, 10508, - 10510, 10512, 10514, 10516, 10518, 10520, 10522, 10524, 10526, 10528, - 10530, 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, 10548, - 10550, 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, 10568, - 10570, 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, 10588, - 10590, 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, 10608, - 10610, 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, 10628, - 10630, 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, 10648, - 10650, 10652, 10654, 10656, 10658, 0, 10660, 10662, 10664, 10666, 10668, - 10670, 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, 10688, - 10690, 10692, 10694, 10696, 10698, 10700, 10702, 10704, 10706, 10708, - 10710, 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, 10728, - 10730, 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, 10748, - 10750, 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, 10768, - 10770, 10772, 10774, 10776, 10778, 10780, 10782, 10784, 10786, 10788, - 10790, 10792, 10794, 10796, 10798, 10800, 0, 10802, 10804, 0, 0, 10806, - 0, 0, 10808, 10810, 0, 0, 10812, 10814, 10816, 10818, 0, 10820, 10822, - 10824, 10826, 10828, 10830, 10832, 10834, 10836, 10838, 10840, 10842, 0, - 10844, 0, 10846, 10848, 10850, 10852, 10854, 10856, 10858, 0, 10860, - 10862, 10864, 10866, 10868, 10870, 10872, 10874, 10876, 10878, 10880, - 10882, 10884, 10886, 10888, 10890, 10892, 10894, 10896, 10898, 10900, - 10902, 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, 10920, - 10922, 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, 10940, - 10942, 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 10960, - 10962, 10964, 10966, 10968, 10970, 10972, 10974, 10976, 10978, 10980, - 10982, 10984, 10986, 10988, 0, 10990, 10992, 10994, 10996, 0, 0, 10998, - 11000, 11002, 11004, 11006, 11008, 11010, 11012, 0, 11014, 11016, 11018, - 11020, 11022, 11024, 11026, 0, 11028, 11030, 11032, 11034, 11036, 11038, - 11040, 11042, 11044, 11046, 11048, 11050, 11052, 11054, 11056, 11058, - 11060, 11062, 11064, 11066, 11068, 11070, 11072, 11074, 11076, 11078, - 11080, 11082, 0, 11084, 11086, 11088, 11090, 0, 11092, 11094, 11096, - 11098, 11100, 0, 11102, 0, 0, 0, 11104, 11106, 11108, 11110, 11112, - 11114, 11116, 0, 11118, 11120, 11122, 11124, 11126, 11128, 11130, 11132, - 11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, 11152, - 11154, 11156, 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172, - 11174, 11176, 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192, - 11194, 11196, 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212, - 11214, 11216, 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232, - 11234, 11236, 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252, - 11254, 11256, 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272, - 11274, 11276, 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292, - 11294, 11296, 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312, - 11314, 11316, 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332, - 11334, 11336, 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352, - 11354, 11356, 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372, - 11374, 11376, 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392, - 11394, 11396, 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412, - 11414, 11416, 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, - 11434, 11436, 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452, - 11454, 11456, 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472, - 11474, 11476, 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492, - 11494, 11496, 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512, - 11514, 11516, 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532, - 11534, 11536, 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552, - 11554, 11556, 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572, - 11574, 11576, 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, - 11594, 11596, 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612, - 11614, 11616, 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632, - 11634, 11636, 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652, - 11654, 11656, 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672, - 11674, 11676, 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692, - 11694, 11696, 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712, - 11714, 11716, 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732, - 11734, 11736, 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752, - 11754, 11756, 11758, 11760, 11762, 11764, 11766, 11768, 11770, 11772, - 11774, 11776, 11778, 11780, 11782, 11784, 11786, 11788, 11790, 11792, - 11794, 11796, 0, 0, 11798, 11800, 11802, 11804, 11806, 11808, 11810, - 11812, 11814, 11816, 11818, 11820, 11822, 11824, 11826, 11828, 11830, - 11832, 11834, 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850, - 11852, 11854, 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870, - 11872, 11874, 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890, - 11892, 11894, 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910, - 11912, 11914, 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930, - 11932, 11934, 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950, - 11952, 11954, 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970, - 11972, 11974, 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990, - 11992, 11994, 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010, - 12012, 12014, 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030, - 12032, 12034, 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050, - 12052, 12054, 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070, - 12072, 12074, 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, - 12092, 12094, 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, - 12112, 12114, 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, - 12132, 12134, 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, - 12152, 12154, 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, - 12172, 12174, 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, - 12192, 12194, 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, - 12212, 12214, 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, - 12232, 12234, 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, - 12252, 12254, 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, - 12272, 12274, 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, - 12292, 12294, 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, - 12312, 12314, 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, - 12332, 12334, 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, - 12352, 12354, 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, - 12372, 12374, 12376, 12378, 12380, 0, 0, 12382, 12384, 12386, 12388, - 12390, 12392, 12394, 12396, 12398, 12400, 12402, 12404, 12406, 12408, - 12410, 12412, 12414, 12416, 12418, 12420, 12422, 12424, 12426, 12428, - 12430, 12432, 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448, - 12450, 12452, 12454, 12456, 12458, 12460, 12462, 12464, 12466, 12468, - 12470, 12472, 12474, 12476, 12478, 12480, 12482, 12484, 12486, 12488, 0, - 12490, 12492, 12494, 12496, 12498, 12500, 12502, 12504, 12506, 12508, - 12510, 12512, 12514, 12516, 12518, 12520, 12522, 12524, 12526, 12528, - 12530, 12532, 12534, 12536, 12538, 12540, 12542, 0, 12544, 12546, 0, - 12548, 0, 0, 12550, 0, 12552, 12554, 12556, 12558, 12560, 12562, 12564, - 12566, 12568, 12570, 0, 12572, 12574, 12576, 12578, 0, 12580, 0, 12582, - 0, 0, 0, 0, 0, 0, 12584, 0, 0, 0, 0, 12586, 0, 12588, 0, 12590, 0, 12592, - 12594, 12596, 0, 12598, 12600, 0, 12602, 0, 0, 12604, 0, 12606, 0, 12608, - 0, 12610, 0, 12612, 0, 12614, 12616, 0, 12618, 0, 0, 12620, 12622, 12624, - 12626, 0, 12628, 12630, 12632, 12634, 12636, 12638, 12640, 0, 12642, - 12644, 12646, 12648, 0, 12650, 12652, 12654, 12656, 0, 12658, 0, 12660, - 12662, 12664, 12666, 12668, 12670, 12672, 12674, 12676, 12678, 0, 12680, - 12682, 12684, 12686, 12688, 12690, 12692, 12694, 12696, 12698, 12700, - 12702, 12704, 12706, 12708, 12710, 12712, 0, 0, 0, 0, 0, 12714, 12716, - 12718, 0, 12720, 12722, 12724, 12726, 12728, 0, 12730, 12732, 12734, - 12736, 12738, 12740, 12742, 12744, 12746, 12748, 12750, 12752, 12754, - 12756, 12758, 12760, 12762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12764, 12767, 12770, 12773, 12776, 12779, 12782, 12785, - 12788, 12791, 12794, 0, 0, 0, 0, 0, 12797, 12801, 12805, 12809, 12813, - 12817, 12821, 12825, 12829, 12833, 12837, 12841, 12845, 12849, 12853, - 12857, 12861, 12865, 12869, 12873, 12877, 12881, 12885, 12889, 12893, - 12897, 12901, 12905, 12907, 12909, 12912, 0, 12915, 12917, 12919, 12921, - 12923, 12925, 12927, 12929, 12931, 12933, 12935, 12937, 12939, 12941, - 12943, 12945, 12947, 12949, 12951, 12953, 12955, 12957, 12959, 12961, - 12963, 12965, 12967, 12970, 12973, 12976, 12979, 12983, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12986, 12989, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12995, 12998, 13001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13003, 13005, 13007, 13009, 13011, 13013, 13015, 13017, 13019, 13021, - 13023, 13025, 13027, 13029, 13031, 13033, 13035, 13037, 13039, 13041, - 13043, 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13059, 13061, - 13063, 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, 13081, - 13083, 13085, 13087, 0, 0, 0, 0, 0, 13089, 13093, 13097, 13101, 13105, - 13109, 13113, 13117, 13121, 0, 0, 0, 0, 0, 0, 0, 13125, 13127, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13129, 13131, 13133, 13135, 13137, 13139, 13141, 13143, 13145, - 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161, 13163, 13165, - 13167, 13169, 13171, 13173, 13175, 13177, 13179, 13181, 13183, 13185, - 13187, 13189, 13191, 13193, 13195, 13197, 13199, 13201, 13203, 13205, - 13207, 13209, 13211, 13213, 13215, 13217, 13219, 13221, 13223, 13225, - 13227, 13229, 13231, 13233, 13235, 13237, 13239, 13241, 13243, 13245, - 13247, 13249, 13251, 13253, 13255, 13257, 13259, 13261, 13263, 13265, - 13267, 13269, 13271, 13273, 13275, 13277, 13279, 13281, 13283, 13285, - 13287, 13289, 13291, 13293, 13295, 13297, 13299, 13301, 13303, 13305, - 13307, 13309, 13311, 13313, 13315, 13317, 13319, 13321, 13323, 13325, - 13327, 13329, 13331, 13333, 13335, 13337, 13339, 13341, 13343, 13345, - 13347, 13349, 13351, 13353, 13355, 13357, 13359, 13361, 13363, 13365, - 13367, 13369, 13371, 13373, 13375, 13377, 13379, 13381, 13383, 13385, - 13387, 13389, 13391, 13393, 13395, 13397, 13399, 13401, 13403, 13405, - 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13421, 13423, 13425, - 13427, 13429, 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, - 13447, 13449, 13451, 13453, 13455, 13457, 13459, 13461, 13463, 13465, - 13467, 13469, 13471, 13473, 13475, 13477, 13479, 13481, 13483, 13485, - 13487, 13489, 13491, 13493, 13495, 13497, 13499, 13501, 13503, 13505, - 13507, 13509, 13511, 13513, 13515, 13517, 13519, 13521, 13523, 13525, - 13527, 13529, 13531, 13533, 13535, 13537, 13539, 13541, 13543, 13545, - 13547, 13549, 13551, 13553, 13555, 13557, 13559, 13561, 13563, 13565, - 13567, 13569, 13571, 13573, 13575, 13577, 13579, 13581, 13583, 13585, - 13587, 13589, 13591, 13593, 13595, 13597, 13599, 13601, 13603, 13605, - 13607, 13609, 13611, 13613, 13615, 13617, 13619, 13621, 13623, 13625, - 13627, 13629, 13631, 13633, 13635, 13637, 13639, 13641, 13643, 13645, - 13647, 13649, 13651, 13653, 13655, 13657, 13659, 13661, 13663, 13665, - 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683, 13685, - 13687, 13689, 13691, 13693, 13695, 13697, 13699, 13701, 13703, 13705, - 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13721, 13723, 13725, - 13727, 13729, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13745, - 13747, 13749, 13751, 13753, 13755, 13757, 13759, 13761, 13763, 13765, - 13767, 13769, 13771, 13773, 13775, 13777, 13779, 13781, 13783, 13785, - 13787, 13789, 13791, 13793, 13795, 13797, 13799, 13801, 13803, 13805, - 13807, 13809, 13811, 13813, 13815, 13817, 13819, 13821, 13823, 13825, - 13827, 13829, 13831, 13833, 13835, 13837, 13839, 13841, 13843, 13845, - 13847, 13849, 13851, 13853, 13855, 13857, 13859, 13861, 13863, 13865, - 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881, 13883, 13885, - 13887, 13889, 13891, 13893, 13895, 13897, 13899, 13901, 13903, 13905, - 13907, 13909, 13911, 13913, 13915, 13917, 13919, 13921, 13923, 13925, - 13927, 13929, 13931, 13933, 13935, 13937, 13939, 13941, 13943, 13945, - 13947, 13949, 13951, 13953, 13955, 13957, 13959, 13961, 13963, 13965, - 13967, 13969, 13971, 13973, 13975, 13977, 13979, 13981, 13983, 13985, - 13987, 13989, 13991, 13993, 13995, 13997, 13999, 14001, 14003, 14005, - 14007, 14009, 14011, 14013, 14015, 14017, 14019, 14021, 14023, 14025, - 14027, 14029, 14031, 14033, 14035, 14037, 14039, 14041, 14043, 14045, - 14047, 14049, 14051, 14053, 14055, 14057, 14059, 14061, 14063, 14065, - 14067, 14069, 14071, 14073, 14075, 14077, 14079, 14081, 14083, 14085, - 14087, 14089, 14091, 14093, 14095, 14097, 14099, 14101, 14103, 14105, - 14107, 14109, 14111, 14113, 14115, 14117, 14119, 14121, 14123, 14125, - 14127, 14129, 14131, 14133, 14135, 14137, 14139, 14141, 14143, 14145, - 14147, 14149, 14151, 14153, 14155, 14157, 14159, 14161, 14163, 14165, - 14167, 14169, 14171, 14173, 14175, 14177, 14179, 14181, 14183, 14185, - 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201, 14203, 14205, - 14207, 14209, 14211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6646, 6648, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6650, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6652, 6654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6656, 6658, 6660, 6662, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, + 6680, 6682, 6684, 6686, 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, + 6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, + 6728, 6730, 6732, 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, + 6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, + 6776, 6778, 6780, 6782, 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, + 6800, 6802, 6804, 6806, 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, + 6824, 6826, 6828, 6830, 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, + 6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, + 6872, 6874, 6876, 6878, 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, + 6896, 6898, 6900, 6902, 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, + 6920, 6922, 6924, 6926, 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, + 6944, 6946, 6948, 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, + 6968, 6970, 6972, 6974, 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, + 6992, 6994, 6996, 6998, 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, + 7016, 7018, 7020, 7022, 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, + 7040, 7042, 7044, 7046, 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, + 7064, 7066, 7068, 7070, 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, + 7088, 7090, 7092, 7094, 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, + 7112, 7114, 7116, 7118, 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, + 7136, 7138, 7140, 7142, 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, + 7160, 7162, 7164, 7166, 7168, 7170, 7172, 7174, 7176, 7178, 7180, 7182, + 7184, 7186, 7188, 7190, 7192, 7194, 7196, 7198, 7200, 7202, 0, 0, 7204, + 0, 7206, 0, 0, 7208, 7210, 7212, 7214, 7216, 7218, 7220, 7222, 7224, + 7226, 0, 7228, 0, 7230, 0, 0, 7232, 7234, 0, 0, 0, 7236, 7238, 7240, + 7242, 7244, 7246, 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, 7264, + 7266, 7268, 7270, 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, 7288, + 7290, 7292, 7294, 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, 7312, + 7314, 7316, 7318, 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, 7336, + 7338, 7340, 7342, 7344, 7346, 7348, 7350, 7352, 7354, 7356, 7358, 7360, + 7362, 7364, 7366, 7368, 7370, 0, 0, 7372, 7374, 7376, 7378, 7380, 7382, + 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, 7400, 7402, 7404, 7406, + 7408, 7410, 7412, 7414, 7416, 7418, 7420, 7422, 7424, 7426, 7428, 7430, + 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, 7448, 7450, 7452, 7454, + 7456, 7458, 7460, 7462, 7464, 7466, 7468, 7470, 7472, 7474, 7476, 7478, + 7480, 7482, 7484, 7486, 7488, 7490, 7492, 7494, 7496, 7498, 7500, 7502, + 7504, 7506, 7508, 7510, 7512, 7514, 7516, 7518, 7520, 7522, 7524, 7526, + 7528, 7530, 7532, 7534, 7536, 7538, 7540, 7542, 7544, 7546, 7548, 7550, + 7552, 7554, 7556, 7558, 7560, 7562, 7564, 7566, 7568, 7570, 7572, 7574, + 7576, 7578, 7580, 7582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7584, + 7587, 7590, 7593, 7597, 7601, 7604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7607, 7610, 7613, 7616, 7619, 0, 0, 0, 0, 0, 7622, 0, 7625, 7628, 7630, + 7632, 7634, 7636, 7638, 7640, 7642, 7644, 7646, 7648, 7651, 7654, 7657, + 7660, 7663, 7666, 7669, 7672, 7675, 7678, 7681, 7684, 0, 7687, 7690, + 7693, 7696, 7699, 0, 7702, 0, 7705, 7708, 0, 7711, 7714, 0, 7717, 7720, + 7723, 7726, 7729, 7732, 7735, 7738, 7741, 7744, 7747, 7749, 7751, 7753, + 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, 7777, + 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, + 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, + 7827, 7829, 7831, 7833, 7835, 7837, 7839, 7841, 7843, 7845, 7847, 7849, + 7851, 7853, 7855, 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, 7873, + 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, 7897, + 7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, 7919, 7921, + 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7937, 7939, 7941, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7943, 7945, 7947, 7949, 7951, 7953, 7955, 7957, 7959, + 7961, 7963, 7965, 7967, 7969, 7971, 7973, 7975, 7977, 7979, 7981, 7983, + 7985, 7987, 7989, 7992, 7995, 7998, 8001, 8004, 8007, 8010, 8013, 8016, + 8019, 8022, 8025, 8028, 8031, 8034, 8037, 8040, 8043, 8045, 8047, 8049, + 8051, 8054, 8057, 8060, 8063, 8066, 8069, 8072, 8075, 8078, 8081, 8084, + 8087, 8090, 8093, 8096, 8099, 8102, 8105, 8108, 8111, 8114, 8117, 8120, + 8123, 8126, 8129, 8132, 8135, 8138, 8141, 8144, 8147, 8150, 8153, 8156, + 8159, 8162, 8165, 8168, 8171, 8174, 8177, 8180, 8183, 8186, 8189, 8192, + 8195, 8198, 8201, 8204, 8207, 8210, 8213, 8216, 8219, 8222, 8225, 8228, + 8231, 8234, 8237, 8240, 8243, 8246, 8249, 8252, 8255, 8258, 8261, 8264, + 8267, 8270, 8273, 8276, 8279, 8282, 8285, 8288, 8291, 8294, 8297, 8300, + 8303, 8306, 8309, 8312, 8315, 8318, 8321, 8324, 8327, 8330, 8333, 8337, + 8341, 8345, 8349, 8353, 8357, 8360, 8363, 8366, 8369, 8372, 8375, 8378, + 8381, 8384, 8387, 8390, 8393, 8396, 8399, 8402, 8405, 8408, 8411, 8414, + 8417, 8420, 8423, 8426, 8429, 8432, 8435, 8438, 8441, 8444, 8447, 8450, + 8453, 8456, 8459, 8462, 8465, 8468, 8471, 8474, 8477, 8480, 8483, 8486, + 8489, 8492, 8495, 8498, 8501, 8504, 8507, 8510, 8513, 8516, 8519, 8522, + 8525, 8528, 8531, 8534, 8537, 8540, 8543, 8546, 8549, 8552, 8555, 8558, + 8561, 8564, 8567, 8570, 8573, 8576, 8579, 8582, 8585, 8588, 8591, 8594, + 8597, 8600, 8603, 8606, 8609, 8612, 8615, 8618, 8621, 8624, 8627, 8630, + 8633, 8636, 8639, 8642, 8645, 8648, 8651, 8654, 8657, 8660, 8663, 8666, + 8669, 8672, 8675, 8678, 8681, 8684, 8687, 8690, 8693, 8696, 8699, 8702, + 8705, 8708, 8711, 8714, 8717, 8720, 8723, 8726, 8729, 8732, 8735, 8738, + 8741, 8744, 8747, 8750, 8753, 8756, 8759, 8762, 8765, 8768, 8771, 8774, + 8777, 8780, 8783, 8787, 8791, 8795, 8798, 8801, 8804, 8807, 8810, 8813, + 8816, 8819, 8822, 8825, 8828, 8831, 8834, 8837, 8840, 8843, 8846, 8849, + 8852, 8855, 8858, 8861, 8864, 8867, 8870, 8873, 8876, 8879, 8882, 8885, + 8888, 8891, 8894, 8897, 8900, 8903, 8906, 8909, 8912, 8915, 8918, 8921, + 8924, 8927, 8930, 8933, 8936, 8939, 8942, 8945, 8948, 8951, 8954, 8957, + 8960, 8963, 8966, 8969, 8972, 8975, 8978, 8981, 8984, 8987, 8990, 8993, + 8996, 8999, 9002, 9005, 9008, 9011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9014, 9018, 9022, 9026, 9030, 9034, 9038, 9042, 9046, + 9050, 9054, 9058, 9062, 9066, 9070, 9074, 9078, 9082, 9086, 9090, 9094, + 9098, 9102, 9106, 9110, 9114, 9118, 9122, 9126, 9130, 9134, 9138, 9142, + 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, 9178, 9182, 9186, 9190, + 9194, 9198, 9202, 9206, 9210, 9214, 9218, 9222, 9226, 9230, 9234, 9238, + 9242, 9246, 9250, 9254, 9258, 9262, 9266, 0, 0, 9270, 9274, 9278, 9282, + 9286, 9290, 9294, 9298, 9302, 9306, 9310, 9314, 9318, 9322, 9326, 9330, + 9334, 9338, 9342, 9346, 9350, 9354, 9358, 9362, 9366, 9370, 9374, 9378, + 9382, 9386, 9390, 9394, 9398, 9402, 9406, 9410, 9414, 9418, 9422, 9426, + 9430, 9434, 9438, 9442, 9446, 9450, 9454, 9458, 9462, 9466, 9470, 9474, + 9478, 9482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9486, 9490, + 9494, 9499, 9504, 9509, 9514, 9519, 9524, 9529, 9533, 9552, 9561, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9566, 9568, 9570, + 9572, 9574, 9576, 9578, 9580, 9582, 9584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9586, 9588, 9590, 9592, 9594, 9596, + 9598, 9600, 9602, 9604, 9606, 9608, 9610, 9612, 9614, 9616, 9618, 9620, + 9622, 9624, 9626, 0, 0, 9628, 9630, 9632, 9634, 9636, 9638, 9640, 9642, + 9644, 9646, 9648, 9650, 0, 9652, 9654, 9656, 9658, 9660, 9662, 9664, + 9666, 9668, 9670, 9672, 9674, 9676, 9678, 9680, 9682, 9684, 9686, 9688, + 0, 9690, 9692, 9694, 9696, 0, 0, 0, 0, 9698, 9701, 9704, 0, 9707, 0, + 9710, 9713, 9716, 9719, 9722, 9725, 9728, 9731, 9734, 9737, 9740, 9742, + 9744, 9746, 9748, 9750, 9752, 9754, 9756, 9758, 9760, 9762, 9764, 9766, + 9768, 9770, 9772, 9774, 9776, 9778, 9780, 9782, 9784, 9786, 9788, 9790, + 9792, 9794, 9796, 9798, 9800, 9802, 9804, 9806, 9808, 9810, 9812, 9814, + 9816, 9818, 9820, 9822, 9824, 9826, 9828, 9830, 9832, 9834, 9836, 9838, + 9840, 9842, 9844, 9846, 9848, 9850, 9852, 9854, 9856, 9858, 9860, 9862, + 9864, 9866, 9868, 9870, 9872, 9874, 9876, 9878, 9880, 9882, 9884, 9886, + 9888, 9890, 9892, 9894, 9896, 9898, 9900, 9902, 9904, 9906, 9908, 9910, + 9912, 9914, 9916, 9918, 9920, 9922, 9924, 9926, 9928, 9930, 9932, 9934, + 9936, 9938, 9940, 9942, 9944, 9946, 9948, 9950, 9952, 9954, 9956, 9958, + 9960, 9962, 9964, 9966, 9968, 9970, 9972, 9974, 9977, 9980, 9983, 9986, + 9989, 9992, 9995, 0, 0, 0, 0, 9998, 10000, 10002, 10004, 10006, 10008, + 10010, 10012, 10014, 10016, 10018, 10020, 10022, 10024, 10026, 10028, + 10030, 10032, 10034, 10036, 10038, 10040, 10042, 10044, 10046, 10048, + 10050, 10052, 10054, 10056, 10058, 10060, 10062, 10064, 10066, 10068, + 10070, 10072, 10074, 10076, 10078, 10080, 10082, 10084, 10086, 10088, + 10090, 10092, 10094, 10096, 10098, 10100, 10102, 10104, 10106, 10108, + 10110, 10112, 10114, 10116, 10118, 10120, 10122, 10124, 10126, 10128, + 10130, 10132, 10134, 10136, 10138, 10140, 10142, 10144, 10146, 10148, + 10150, 10152, 10154, 10156, 10158, 10160, 10162, 10164, 10166, 10168, + 10170, 10172, 10174, 10176, 10178, 10180, 10182, 10184, 10186, 10188, + 10190, 10192, 10194, 10196, 10198, 10200, 10202, 10204, 10206, 10208, + 10210, 10212, 10214, 10216, 10218, 10220, 10222, 10224, 10226, 10228, + 10230, 10232, 10234, 10236, 10238, 10240, 10242, 10244, 10246, 10248, + 10250, 10252, 10254, 10256, 10258, 10260, 10262, 10264, 10266, 10268, + 10270, 10272, 10274, 10276, 10278, 10280, 10282, 10284, 10286, 10288, + 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, 10308, + 10310, 10312, 10314, 10316, 10318, 10320, 10322, 10324, 10326, 10328, + 10330, 10332, 10334, 10336, 10338, 10340, 10342, 10344, 10346, 10348, + 10350, 10352, 10354, 10356, 10358, 10360, 10362, 10364, 10366, 10368, + 10370, 10372, 10374, 10376, 0, 0, 0, 10378, 10380, 10382, 10384, 10386, + 10388, 0, 0, 10390, 10392, 10394, 10396, 10398, 10400, 0, 0, 10402, + 10404, 10406, 10408, 10410, 10412, 0, 0, 10414, 10416, 10418, 0, 0, 0, + 10420, 10422, 10424, 10426, 10428, 10430, 10432, 0, 10434, 10436, 10438, + 10440, 10442, 10444, 10446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 10448, 0, 10451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10457, 10460, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10463, 10466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10469, + 10472, 0, 10475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10478, 10481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 10484, 10487, 10490, 10493, 10496, 10499, 10502, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10505, 10508, 10511, 10514, 10517, + 10520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10523, 10525, 10527, + 10529, 10531, 10533, 10535, 10537, 10539, 10541, 10543, 10545, 10547, + 10549, 10551, 10553, 10555, 10557, 10559, 10561, 10563, 10565, 10567, + 10569, 10571, 10573, 10575, 10577, 10579, 10581, 10583, 10585, 10587, + 10589, 10591, 10593, 10595, 10597, 10599, 10601, 10603, 10605, 10607, + 10609, 10611, 10613, 10615, 10617, 10619, 10621, 10623, 10625, 10627, + 10629, 10631, 10633, 10635, 10637, 10639, 10641, 10643, 10645, 10647, + 10649, 10651, 10653, 10655, 10657, 10659, 10661, 10663, 10665, 10667, + 10669, 10671, 10673, 10675, 10677, 10679, 10681, 10683, 10685, 10687, + 10689, 10691, 0, 10693, 10695, 10697, 10699, 10701, 10703, 10705, 10707, + 10709, 10711, 10713, 10715, 10717, 10719, 10721, 10723, 10725, 10727, + 10729, 10731, 10733, 10735, 10737, 10739, 10741, 10743, 10745, 10747, + 10749, 10751, 10753, 10755, 10757, 10759, 10761, 10763, 10765, 10767, + 10769, 10771, 10773, 10775, 10777, 10779, 10781, 10783, 10785, 10787, + 10789, 10791, 10793, 10795, 10797, 10799, 10801, 10803, 10805, 10807, + 10809, 10811, 10813, 10815, 10817, 10819, 10821, 10823, 10825, 10827, + 10829, 10831, 10833, 0, 10835, 10837, 0, 0, 10839, 0, 0, 10841, 10843, 0, + 0, 10845, 10847, 10849, 10851, 0, 10853, 10855, 10857, 10859, 10861, + 10863, 10865, 10867, 10869, 10871, 10873, 10875, 0, 10877, 0, 10879, + 10881, 10883, 10885, 10887, 10889, 10891, 0, 10893, 10895, 10897, 10899, + 10901, 10903, 10905, 10907, 10909, 10911, 10913, 10915, 10917, 10919, + 10921, 10923, 10925, 10927, 10929, 10931, 10933, 10935, 10937, 10939, + 10941, 10943, 10945, 10947, 10949, 10951, 10953, 10955, 10957, 10959, + 10961, 10963, 10965, 10967, 10969, 10971, 10973, 10975, 10977, 10979, + 10981, 10983, 10985, 10987, 10989, 10991, 10993, 10995, 10997, 10999, + 11001, 11003, 11005, 11007, 11009, 11011, 11013, 11015, 11017, 11019, + 11021, 0, 11023, 11025, 11027, 11029, 0, 0, 11031, 11033, 11035, 11037, + 11039, 11041, 11043, 11045, 0, 11047, 11049, 11051, 11053, 11055, 11057, + 11059, 0, 11061, 11063, 11065, 11067, 11069, 11071, 11073, 11075, 11077, + 11079, 11081, 11083, 11085, 11087, 11089, 11091, 11093, 11095, 11097, + 11099, 11101, 11103, 11105, 11107, 11109, 11111, 11113, 11115, 0, 11117, + 11119, 11121, 11123, 0, 11125, 11127, 11129, 11131, 11133, 0, 11135, 0, + 0, 0, 11137, 11139, 11141, 11143, 11145, 11147, 11149, 0, 11151, 11153, + 11155, 11157, 11159, 11161, 11163, 11165, 11167, 11169, 11171, 11173, + 11175, 11177, 11179, 11181, 11183, 11185, 11187, 11189, 11191, 11193, + 11195, 11197, 11199, 11201, 11203, 11205, 11207, 11209, 11211, 11213, + 11215, 11217, 11219, 11221, 11223, 11225, 11227, 11229, 11231, 11233, + 11235, 11237, 11239, 11241, 11243, 11245, 11247, 11249, 11251, 11253, + 11255, 11257, 11259, 11261, 11263, 11265, 11267, 11269, 11271, 11273, + 11275, 11277, 11279, 11281, 11283, 11285, 11287, 11289, 11291, 11293, + 11295, 11297, 11299, 11301, 11303, 11305, 11307, 11309, 11311, 11313, + 11315, 11317, 11319, 11321, 11323, 11325, 11327, 11329, 11331, 11333, + 11335, 11337, 11339, 11341, 11343, 11345, 11347, 11349, 11351, 11353, + 11355, 11357, 11359, 11361, 11363, 11365, 11367, 11369, 11371, 11373, + 11375, 11377, 11379, 11381, 11383, 11385, 11387, 11389, 11391, 11393, + 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, 11411, 11413, + 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, 11433, + 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, 11453, + 11455, 11457, 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473, + 11475, 11477, 11479, 11481, 11483, 11485, 11487, 11489, 11491, 11493, + 11495, 11497, 11499, 11501, 11503, 11505, 11507, 11509, 11511, 11513, + 11515, 11517, 11519, 11521, 11523, 11525, 11527, 11529, 11531, 11533, + 11535, 11537, 11539, 11541, 11543, 11545, 11547, 11549, 11551, 11553, + 11555, 11557, 11559, 11561, 11563, 11565, 11567, 11569, 11571, 11573, + 11575, 11577, 11579, 11581, 11583, 11585, 11587, 11589, 11591, 11593, + 11595, 11597, 11599, 11601, 11603, 11605, 11607, 11609, 11611, 11613, + 11615, 11617, 11619, 11621, 11623, 11625, 11627, 11629, 11631, 11633, + 11635, 11637, 11639, 11641, 11643, 11645, 11647, 11649, 11651, 11653, + 11655, 11657, 11659, 11661, 11663, 11665, 11667, 11669, 11671, 11673, + 11675, 11677, 11679, 11681, 11683, 11685, 11687, 11689, 11691, 11693, + 11695, 11697, 11699, 11701, 11703, 11705, 11707, 11709, 11711, 11713, + 11715, 11717, 11719, 11721, 11723, 11725, 11727, 11729, 11731, 11733, + 11735, 11737, 11739, 11741, 11743, 11745, 11747, 11749, 11751, 11753, + 11755, 11757, 11759, 11761, 11763, 11765, 11767, 11769, 11771, 11773, + 11775, 11777, 11779, 11781, 11783, 11785, 11787, 11789, 11791, 11793, + 11795, 11797, 11799, 11801, 11803, 11805, 11807, 11809, 11811, 11813, + 11815, 11817, 11819, 11821, 11823, 11825, 11827, 11829, 0, 0, 11831, + 11833, 11835, 11837, 11839, 11841, 11843, 11845, 11847, 11849, 11851, + 11853, 11855, 11857, 11859, 11861, 11863, 11865, 11867, 11869, 11871, + 11873, 11875, 11877, 11879, 11881, 11883, 11885, 11887, 11889, 11891, + 11893, 11895, 11897, 11899, 11901, 11903, 11905, 11907, 11909, 11911, + 11913, 11915, 11917, 11919, 11921, 11923, 11925, 11927, 11929, 11931, + 11933, 11935, 11937, 11939, 11941, 11943, 11945, 11947, 11949, 11951, + 11953, 11955, 11957, 11959, 11961, 11963, 11965, 11967, 11969, 11971, + 11973, 11975, 11977, 11979, 11981, 11983, 11985, 11987, 11989, 11991, + 11993, 11995, 11997, 11999, 12001, 12003, 12005, 12007, 12009, 12011, + 12013, 12015, 12017, 12019, 12021, 12023, 12025, 12027, 12029, 12031, + 12033, 12035, 12037, 12039, 12041, 12043, 12045, 12047, 12049, 12051, + 12053, 12055, 12057, 12059, 12061, 12063, 12065, 12067, 12069, 12071, + 12073, 12075, 12077, 12079, 12081, 12083, 12085, 12087, 12089, 12091, + 12093, 12095, 12097, 12099, 12101, 12103, 12105, 12107, 12109, 12111, + 12113, 12115, 12117, 12119, 12121, 12123, 12125, 12127, 12129, 12131, + 12133, 12135, 12137, 12139, 12141, 12143, 12145, 12147, 12149, 12151, + 12153, 12155, 12157, 12159, 12161, 12163, 12165, 12167, 12169, 12171, + 12173, 12175, 12177, 12179, 12181, 12183, 12185, 12187, 12189, 12191, + 12193, 12195, 12197, 12199, 12201, 12203, 12205, 12207, 12209, 12211, + 12213, 12215, 12217, 12219, 12221, 12223, 12225, 12227, 12229, 12231, + 12233, 12235, 12237, 12239, 12241, 12243, 12245, 12247, 12249, 12251, + 12253, 12255, 12257, 12259, 12261, 12263, 12265, 12267, 12269, 12271, + 12273, 12275, 12277, 12279, 12281, 12283, 12285, 12287, 12289, 12291, + 12293, 12295, 12297, 12299, 12301, 12303, 12305, 12307, 12309, 12311, + 12313, 12315, 12317, 12319, 12321, 12323, 12325, 12327, 12329, 12331, + 12333, 12335, 12337, 12339, 12341, 12343, 12345, 12347, 12349, 12351, + 12353, 12355, 12357, 12359, 12361, 12363, 12365, 12367, 12369, 12371, + 12373, 12375, 12377, 12379, 12381, 12383, 12385, 12387, 12389, 12391, + 12393, 12395, 12397, 12399, 12401, 12403, 12405, 12407, 12409, 12411, + 12413, 0, 0, 12415, 12417, 12419, 12421, 12423, 12425, 12427, 12429, + 12431, 12433, 12435, 12437, 12439, 12441, 12443, 12445, 12447, 12449, + 12451, 12453, 12455, 12457, 12459, 12461, 12463, 12465, 12467, 12469, + 12471, 12473, 12475, 12477, 12479, 12481, 12483, 12485, 12487, 12489, + 12491, 12493, 12495, 12497, 12499, 12501, 12503, 12505, 12507, 12509, + 12511, 12513, 12515, 12517, 12519, 12521, 0, 12523, 12525, 12527, 12529, + 12531, 12533, 12535, 12537, 12539, 12541, 12543, 12545, 12547, 12549, + 12551, 12553, 12555, 12557, 12559, 12561, 12563, 12565, 12567, 12569, + 12571, 12573, 12575, 0, 12577, 12579, 0, 12581, 0, 0, 12583, 0, 12585, + 12587, 12589, 12591, 12593, 12595, 12597, 12599, 12601, 12603, 0, 12605, + 12607, 12609, 12611, 0, 12613, 0, 12615, 0, 0, 0, 0, 0, 0, 12617, 0, 0, + 0, 0, 12619, 0, 12621, 0, 12623, 0, 12625, 12627, 12629, 0, 12631, 12633, + 0, 12635, 0, 0, 12637, 0, 12639, 0, 12641, 0, 12643, 0, 12645, 0, 12647, + 12649, 0, 12651, 0, 0, 12653, 12655, 12657, 12659, 0, 12661, 12663, + 12665, 12667, 12669, 12671, 12673, 0, 12675, 12677, 12679, 12681, 0, + 12683, 12685, 12687, 12689, 0, 12691, 0, 12693, 12695, 12697, 12699, + 12701, 12703, 12705, 12707, 12709, 12711, 0, 12713, 12715, 12717, 12719, + 12721, 12723, 12725, 12727, 12729, 12731, 12733, 12735, 12737, 12739, + 12741, 12743, 12745, 0, 0, 0, 0, 0, 12747, 12749, 12751, 0, 12753, 12755, + 12757, 12759, 12761, 0, 12763, 12765, 12767, 12769, 12771, 12773, 12775, + 12777, 12779, 12781, 12783, 12785, 12787, 12789, 12791, 12793, 12795, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12797, 12800, + 12803, 12806, 12809, 12812, 12815, 12818, 12821, 12824, 12827, 0, 0, 0, + 0, 0, 12830, 12834, 12838, 12842, 12846, 12850, 12854, 12858, 12862, + 12866, 12870, 12874, 12878, 12882, 12886, 12890, 12894, 12898, 12902, + 12906, 12910, 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12940, + 12942, 12945, 0, 12948, 12950, 12952, 12954, 12956, 12958, 12960, 12962, + 12964, 12966, 12968, 12970, 12972, 12974, 12976, 12978, 12980, 12982, + 12984, 12986, 12988, 12990, 12992, 12994, 12996, 12998, 13000, 13003, + 13006, 13009, 13012, 13016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13019, 13022, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13025, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13028, 13031, + 13034, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13036, 13038, 13040, 13042, + 13044, 13046, 13048, 13050, 13052, 13054, 13056, 13058, 13060, 13062, + 13064, 13066, 13068, 13070, 13072, 13074, 13076, 13078, 13080, 13082, + 13084, 13086, 13088, 13090, 13092, 13094, 13096, 13098, 13100, 13102, + 13104, 13106, 13108, 13110, 13112, 13114, 13116, 13118, 13120, 0, 0, 0, + 0, 0, 13122, 13126, 13130, 13134, 13138, 13142, 13146, 13150, 13154, 0, + 0, 0, 0, 0, 0, 0, 13158, 13160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 13162, 13164, 13166, 13168, 13170, 13172, 13174, + 13176, 13178, 13180, 13182, 13184, 13186, 13188, 13190, 13192, 13194, + 13196, 13198, 13200, 13202, 13204, 13206, 13208, 13210, 13212, 13214, + 13216, 13218, 13220, 13222, 13224, 13226, 13228, 13230, 13232, 13234, + 13236, 13238, 13240, 13242, 13244, 13246, 13248, 13250, 13252, 13254, + 13256, 13258, 13260, 13262, 13264, 13266, 13268, 13270, 13272, 13274, + 13276, 13278, 13280, 13282, 13284, 13286, 13288, 13290, 13292, 13294, + 13296, 13298, 13300, 13302, 13304, 13306, 13308, 13310, 13312, 13314, + 13316, 13318, 13320, 13322, 13324, 13326, 13328, 13330, 13332, 13334, + 13336, 13338, 13340, 13342, 13344, 13346, 13348, 13350, 13352, 13354, + 13356, 13358, 13360, 13362, 13364, 13366, 13368, 13370, 13372, 13374, + 13376, 13378, 13380, 13382, 13384, 13386, 13388, 13390, 13392, 13394, + 13396, 13398, 13400, 13402, 13404, 13406, 13408, 13410, 13412, 13414, + 13416, 13418, 13420, 13422, 13424, 13426, 13428, 13430, 13432, 13434, + 13436, 13438, 13440, 13442, 13444, 13446, 13448, 13450, 13452, 13454, + 13456, 13458, 13460, 13462, 13464, 13466, 13468, 13470, 13472, 13474, + 13476, 13478, 13480, 13482, 13484, 13486, 13488, 13490, 13492, 13494, + 13496, 13498, 13500, 13502, 13504, 13506, 13508, 13510, 13512, 13514, + 13516, 13518, 13520, 13522, 13524, 13526, 13528, 13530, 13532, 13534, + 13536, 13538, 13540, 13542, 13544, 13546, 13548, 13550, 13552, 13554, + 13556, 13558, 13560, 13562, 13564, 13566, 13568, 13570, 13572, 13574, + 13576, 13578, 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, + 13596, 13598, 13600, 13602, 13604, 13606, 13608, 13610, 13612, 13614, + 13616, 13618, 13620, 13622, 13624, 13626, 13628, 13630, 13632, 13634, + 13636, 13638, 13640, 13642, 13644, 13646, 13648, 13650, 13652, 13654, + 13656, 13658, 13660, 13662, 13664, 13666, 13668, 13670, 13672, 13674, + 13676, 13678, 13680, 13682, 13684, 13686, 13688, 13690, 13692, 13694, + 13696, 13698, 13700, 13702, 13704, 13706, 13708, 13710, 13712, 13714, + 13716, 13718, 13720, 13722, 13724, 13726, 13728, 13730, 13732, 13734, + 13736, 13738, 13740, 13742, 13744, 13746, 13748, 13750, 13752, 13754, + 13756, 13758, 13760, 13762, 13764, 13766, 13768, 13770, 13772, 13774, + 13776, 13778, 13780, 13782, 13784, 13786, 13788, 13790, 13792, 13794, + 13796, 13798, 13800, 13802, 13804, 13806, 13808, 13810, 13812, 13814, + 13816, 13818, 13820, 13822, 13824, 13826, 13828, 13830, 13832, 13834, + 13836, 13838, 13840, 13842, 13844, 13846, 13848, 13850, 13852, 13854, + 13856, 13858, 13860, 13862, 13864, 13866, 13868, 13870, 13872, 13874, + 13876, 13878, 13880, 13882, 13884, 13886, 13888, 13890, 13892, 13894, + 13896, 13898, 13900, 13902, 13904, 13906, 13908, 13910, 13912, 13914, + 13916, 13918, 13920, 13922, 13924, 13926, 13928, 13930, 13932, 13934, + 13936, 13938, 13940, 13942, 13944, 13946, 13948, 13950, 13952, 13954, + 13956, 13958, 13960, 13962, 13964, 13966, 13968, 13970, 13972, 13974, + 13976, 13978, 13980, 13982, 13984, 13986, 13988, 13990, 13992, 13994, + 13996, 13998, 14000, 14002, 14004, 14006, 14008, 14010, 14012, 14014, + 14016, 14018, 14020, 14022, 14024, 14026, 14028, 14030, 14032, 14034, + 14036, 14038, 14040, 14042, 14044, 14046, 14048, 14050, 14052, 14054, + 14056, 14058, 14060, 14062, 14064, 14066, 14068, 14070, 14072, 14074, + 14076, 14078, 14080, 14082, 14084, 14086, 14088, 14090, 14092, 14094, + 14096, 14098, 14100, 14102, 14104, 14106, 14108, 14110, 14112, 14114, + 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, + 14136, 14138, 14140, 14142, 14144, 14146, 14148, 14150, 14152, 14154, + 14156, 14158, 14160, 14162, 14164, 14166, 14168, 14170, 14172, 14174, + 14176, 14178, 14180, 14182, 14184, 14186, 14188, 14190, 14192, 14194, + 14196, 14198, 14200, 14202, 14204, 14206, 14208, 14210, 14212, 14214, + 14216, 14218, 14220, 14222, 14224, 14226, 14228, 14230, 14232, 14234, + 14236, 14238, 14240, 14242, 14244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* NFC pairs */ #define COMP_SHIFT 2 static unsigned short comp_index[] = { - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 11, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, - 14, 15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 0, 19, 20, 21, 0, 0, - 0, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 0, 0, 33, 0, 0, 0, 0, 0, 0, - 0, 0, 34, 35, 36, 0, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 40, 41, 42, 43, 44, - 45, 46, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48, 0, 49, 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, 0, 53, 0, 54, 0, 55, 56, 57, - 0, 0, 0, 0, 0, 0, 0, 58, 59, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, - 63, 0, 64, 65, 66, 0, 0, 0, 0, 0, 0, 0, 67, 68, 69, 70, 71, 72, 0, 0, 0, - 0, 0, 0, 0, 0, 73, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 76, 77, - 78, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 82, 83, 84, 0, 85, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 88, 0, 89, 90, 91, 0, 0, 0, 0, 0, 0, 0, 92, 93, 94, - 95, 96, 97, 98, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 101, 102, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 106, 107, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 109, 110, 111, 0, 112, 0, 113, 0, 0, 0, 0, 0, 0, 0, 114, 115, 116, - 117, 118, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 121, 0, 122, 0, 0, - 0, 0, 0, 0, 0, 123, 124, 125, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, - 128, 0, 129, 130, 131, 0, 0, 0, 0, 0, 0, 0, 132, 133, 134, 135, 136, 137, - 138, 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 140, 141, 142, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 144, 145, 146, 0, 147, - 148, 149, 0, 0, 0, 0, 0, 0, 0, 150, 151, 152, 153, 154, 155, 156, 0, 0, - 0, 0, 0, 0, 0, 157, 0, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 160, - 0, 161, 162, 163, 0, 0, 0, 0, 0, 0, 0, 164, 0, 165, 0, 166, 167, 168, 0, - 0, 0, 0, 0, 0, 0, 169, 170, 0, 0, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, - 173, 174, 0, 175, 176, 177, 0, 0, 0, 0, 0, 0, 0, 178, 179, 180, 181, 182, - 183, 0, 0, 0, 0, 0, 0, 0, 0, 184, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 186, 187, 188, 189, 190, 191, 192, 0, 0, 0, 0, 0, 0, 0, 193, 194, 195, - 0, 196, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 198, 199, 0, 200, 201, 202, 0, 0, - 0, 0, 0, 0, 0, 203, 204, 205, 206, 207, 208, 209, 0, 0, 0, 0, 0, 0, 0, - 210, 0, 0, 0, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 213, 214, 0, 215, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217, - 218, 219, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 222, 223, 0, 224, 0, - 225, 0, 0, 0, 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 227, 0, 0, 0, 0, 0, 0, - 228, 0, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 235, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 238, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 240, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, - 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 248, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 255, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 257, 0, - 258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 259, 260, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 264, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 266, 0, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 268, 0, 269, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 271, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 279, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 283, 0, 284, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, 0, 287, 0, - 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 289, 0, 290, 0, 291, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 292, 0, 293, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 295, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 305, 306, 0, 307, - 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 309, 0, 0, 310, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 311, 0, 0, 312, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 314, 315, 0, 316, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 321, 0, 322, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 323, 0, 0, 324, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, - 0, 0, 0, 0, 328, 329, 0, 330, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 332, 0, 0, - 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 335, 0, 0, 0, 336, 0, 0, 0, - 0, 0, 0, 337, 338, 0, 339, 0, 0, 0, 340, 0, 0, 0, 0, 0, 0, 341, 0, 0, - 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 344, 345, 0, 346, 0, 0, 0, 347, 0, 0, 0, 0, 0, 0, 348, 0, 0, 349, - 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, - 0, 0, 353, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 355, 0, 0, 0, 0, 0, 0, 356, 357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 362, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 366, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 376, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, - 381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 385, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 390, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 397, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 409, 410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 414, 415, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 419, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 422, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, - 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 441, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 442, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 446, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 450, - 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, - 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 459, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, - 0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, - 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, - 0, 0, 474, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 481, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 484, - 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0, - 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, - 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0, - 0, 0, 498, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 505, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, - 0, 0, 507, 0, 0, 0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, - 0, 510, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, 0, - 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 518, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 520, - 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 523, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 530, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533, 0, - 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, - 0, 538, 0, 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 558, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 560, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 563, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 578, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 580, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 633, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, + 6, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 12, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 15, 16, 17, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 20, 0, 21, 22, 23, 0, 0, 0, 0, 0, 0, 0, 0, 24, 25, 26, 27, 28, 29, + 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 32, 33, 34, 35, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, 0, + 40, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 45, 46, 47, 0, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, + 51, 52, 53, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 56, 0, 57, 58, 59, 0, + 0, 0, 0, 0, 0, 0, 0, 60, 0, 61, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 63, 64, 65, 0, 66, 67, 68, 0, 0, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, 0, + 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 77, 0, 78, 79, 80, 81, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 83, 84, 85, + 0, 86, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 91, 92, 93, 0, 0, + 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, 104, 0, 0, 105, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 112, 113, + 114, 115, 0, 0, 116, 0, 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, + 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 124, 0, 0, 125, 0, 0, 0, 0, + 0, 0, 0, 0, 126, 127, 128, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 131, 132, 133, 134, 135, 0, 0, 0, 0, 0, 0, 0, 0, 136, 137, 138, 139, + 140, 141, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 144, 145, 146, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, + 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 0, 163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 165, 0, 166, 167, 168, 0, 0, 0, 0, 0, 0, + 0, 0, 169, 0, 0, 170, 171, 172, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 175, + 176, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, 179, 180, 181, 182, + 183, 184, 185, 0, 0, 0, 0, 0, 0, 0, 0, 186, 187, 188, 189, 190, 191, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 192, 0, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 194, 195, 196, 197, 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 201, 202, + 203, 204, 205, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 207, 208, 0, 209, + 210, 211, 0, 0, 0, 0, 0, 0, 0, 0, 212, 213, 214, 215, 216, 217, 218, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 221, 222, 223, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 226, 227, 228, 0, 229, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 230, 231, 232, 0, 233, 0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 235, + 0, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 237, 0, 238, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 241, 242, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 244, 245, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 253, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 255, 256, 0, 257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 0, + 259, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, + 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 264, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 265, 266, 267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 270, 271, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 272, 273, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 274, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 275, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 277, 0, 278, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 279, 0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, + 283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 284, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 285, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 292, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 297, 298, 299, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 301, 0, 302, 0, 303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 305, 306, 0, 307, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 0, 309, 0, 310, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 315, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 322, 0, 0, + 323, 0, 0, 324, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 326, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 327, 0, 0, 0, 328, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 330, + 331, 0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 0, 0, 0, 334, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 336, 337, 338, 0, 339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 340, 0, 0, 341, + 0, 0, 0, 342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, 345, 346, 0, + 0, 347, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 350, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 352, 0, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, + 354, 355, 0, 356, 0, 0, 0, 357, 0, 0, 0, 0, 0, 0, 0, 358, 0, 0, 0, 359, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 361, 362, 363, 0, 364, 0, 0, 365, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, + 0, 367, 0, 0, 0, 368, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 370, 0, + 0, 0, 0, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 379, 380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 381, 382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 384, 385, 386, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 389, 390, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 398, 399, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 401, 402, 403, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 407, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 414, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 419, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 422, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, + 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 440, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 456, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 461, 462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 463, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 468, 0, 0, 0, + 0, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 475, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, + 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 480, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 483, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 486, 0, 0, + 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, 0, 0, + 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, 0, 0, 493, 0, 0, 0, 0, 0, 0, 494, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 500, 0, 0, + 0, 0, 0, 0, 0, 501, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 0, 0, 503, + 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 508, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 510, 0, 0, 0, 0, 0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 512, 0, + 0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 0, 0, 0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, + 0, 518, 0, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 521, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 523, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, + 0, 0, 526, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, + 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 0, 0, 531, 0, 0, + 0, 0, 0, 0, 532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 533, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 536, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 539, 0, 0, 0, 0, 0, 0, 540, 0, 0, + 0, 0, 0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 543, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 544, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 547, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 554, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 556, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 558, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 561, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 563, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 570, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 574, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 576, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 588, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 600, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 612, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 615, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 633, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 651, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 654, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 656, }; static unsigned int comp_data[] = { - 0, 0, 0, 0, 0, 0, 0, 8814, 0, 0, 0, 8800, 0, 0, 0, 8815, 192, 193, 194, - 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840, 0, - 7680, 0, 0, 260, 0, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, 0, 262, - 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 199, 0, 0, 0, 0, 7690, 0, 0, 0, 0, - 270, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, 200, 201, 202, 7868, - 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, 0, 0, 0, 7864, 0, 0, 0, - 552, 280, 7704, 0, 7706, 0, 0, 0, 0, 7710, 0, 0, 500, 284, 0, 7712, 286, - 288, 0, 0, 0, 0, 486, 0, 290, 0, 0, 0, 0, 292, 0, 0, 0, 7714, 7718, 0, 0, - 0, 542, 0, 7716, 0, 0, 0, 7720, 0, 0, 7722, 0, 0, 0, 204, 205, 206, 296, - 298, 300, 304, 207, 7880, 0, 0, 463, 520, 522, 0, 0, 0, 7882, 0, 0, 0, 0, - 302, 0, 0, 7724, 0, 0, 0, 0, 308, 0, 0, 7728, 0, 0, 0, 0, 0, 488, 0, - 7730, 0, 0, 0, 310, 0, 0, 0, 0, 7732, 0, 0, 313, 0, 0, 0, 0, 0, 317, 0, - 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 7742, 0, 0, 0, 0, 7744, 0, - 0, 7746, 0, 0, 504, 323, 0, 209, 0, 0, 7748, 0, 0, 0, 0, 327, 0, 7750, 0, - 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 210, 211, 212, 213, 332, 334, 558, - 214, 7886, 0, 336, 465, 524, 526, 0, 0, 416, 7884, 0, 0, 0, 0, 490, 0, 0, - 7764, 0, 0, 0, 0, 7766, 0, 0, 340, 0, 0, 0, 0, 7768, 0, 0, 0, 0, 344, - 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 0, 0, 0, 0, 7774, 0, 0, 346, 348, - 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, 536, 350, 0, 0, 0, 0, - 7786, 0, 0, 0, 0, 356, 0, 7788, 0, 0, 538, 354, 0, 7792, 0, 0, 7790, 0, - 217, 218, 219, 360, 362, 364, 0, 220, 7910, 366, 368, 467, 532, 534, 0, - 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0, 7796, 0, 0, 0, 0, 0, 7804, 0, - 7806, 0, 0, 7808, 7810, 372, 0, 0, 0, 7814, 7812, 0, 7816, 0, 0, 0, 0, - 7818, 7820, 7922, 221, 374, 7928, 562, 0, 7822, 376, 7926, 0, 0, 0, 0, - 7924, 0, 0, 0, 377, 7824, 0, 0, 0, 379, 0, 0, 0, 0, 381, 0, 7826, 0, 0, - 0, 0, 7828, 0, 224, 225, 226, 227, 257, 259, 551, 228, 7843, 229, 0, 462, - 513, 515, 0, 0, 0, 7841, 0, 7681, 0, 0, 261, 0, 0, 0, 7683, 0, 0, 7685, - 0, 0, 0, 0, 7687, 0, 0, 263, 265, 0, 0, 0, 267, 0, 0, 0, 0, 269, 0, 231, - 0, 0, 0, 0, 7691, 0, 0, 0, 0, 271, 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, - 7695, 0, 232, 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, 283, 517, - 519, 0, 0, 0, 7865, 0, 0, 0, 553, 281, 7705, 0, 7707, 0, 0, 0, 0, 7711, - 0, 0, 501, 285, 0, 7713, 287, 289, 0, 0, 0, 0, 487, 0, 291, 0, 0, 0, 0, - 293, 0, 0, 0, 7715, 7719, 0, 0, 0, 543, 0, 7717, 0, 0, 0, 7721, 0, 0, - 7723, 0, 7830, 0, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, - 521, 523, 0, 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 0, 0, 309, 0, - 0, 0, 0, 496, 0, 7729, 0, 0, 0, 0, 0, 489, 0, 7731, 0, 0, 0, 311, 0, 0, - 0, 0, 7733, 0, 0, 314, 0, 0, 0, 0, 0, 318, 0, 7735, 0, 0, 0, 316, 0, - 7741, 0, 0, 7739, 0, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, 0, 505, - 324, 0, 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 7751, 0, 0, 0, 326, 0, 7755, - 0, 0, 7753, 0, 242, 243, 244, 245, 333, 335, 559, 246, 7887, 0, 337, 466, - 525, 527, 0, 0, 417, 7885, 0, 0, 0, 0, 491, 0, 0, 7765, 0, 0, 0, 0, 7767, - 0, 0, 341, 0, 0, 0, 0, 7769, 0, 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, 0, - 0, 0, 343, 0, 0, 0, 0, 7775, 0, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, - 353, 0, 7779, 0, 0, 537, 351, 0, 0, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, - 7789, 0, 0, 539, 355, 0, 7793, 0, 0, 7791, 0, 249, 250, 251, 361, 363, - 365, 0, 252, 7911, 367, 369, 468, 533, 535, 0, 0, 432, 7909, 7795, 0, 0, - 0, 371, 7799, 0, 7797, 0, 0, 0, 0, 0, 7805, 0, 7807, 0, 0, 7809, 7811, - 373, 0, 0, 0, 7815, 7813, 0, 7832, 0, 0, 0, 7817, 0, 0, 0, 0, 7819, 7821, - 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, 7833, 0, 0, 0, 7925, 0, 0, - 0, 378, 7825, 0, 0, 0, 380, 0, 0, 0, 0, 382, 0, 7827, 0, 0, 0, 0, 7829, - 0, 8173, 901, 0, 0, 8129, 0, 0, 0, 7846, 7844, 0, 7850, 7848, 0, 0, 0, - 478, 0, 0, 0, 0, 506, 0, 0, 0, 508, 0, 0, 482, 0, 0, 0, 0, 7688, 0, 0, - 7872, 7870, 0, 7876, 7874, 0, 0, 0, 0, 7726, 0, 0, 7890, 7888, 0, 7894, - 7892, 0, 0, 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 554, 0, 0, 0, 0, 510, 0, - 0, 475, 471, 0, 0, 469, 0, 0, 0, 0, 0, 0, 473, 7847, 7845, 0, 7851, 7849, - 0, 0, 0, 479, 0, 0, 0, 0, 507, 0, 0, 0, 509, 0, 0, 483, 0, 0, 0, 0, 7689, - 0, 0, 7873, 7871, 0, 7877, 7875, 0, 0, 0, 0, 7727, 0, 0, 7891, 7889, 0, - 7895, 7893, 0, 0, 0, 0, 7757, 0, 0, 557, 0, 0, 7759, 555, 0, 0, 0, 0, - 511, 0, 0, 476, 472, 0, 0, 470, 0, 0, 0, 0, 0, 0, 474, 7856, 7854, 0, - 7860, 7858, 0, 0, 0, 7857, 7855, 0, 7861, 7859, 0, 0, 0, 7700, 7702, 0, - 0, 7701, 7703, 0, 0, 7760, 7762, 0, 0, 7761, 7763, 0, 0, 0, 0, 7780, 0, - 0, 0, 7781, 0, 0, 0, 7782, 0, 0, 0, 7783, 0, 0, 7800, 0, 0, 0, 7801, 0, - 0, 0, 0, 0, 7802, 0, 0, 0, 7803, 0, 0, 7835, 0, 7900, 7898, 0, 7904, - 7902, 0, 0, 0, 0, 7906, 0, 0, 7901, 7899, 0, 7905, 7903, 0, 0, 0, 0, - 7907, 0, 0, 7914, 7912, 0, 7918, 7916, 0, 0, 0, 0, 7920, 0, 0, 7915, - 7913, 0, 7919, 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 0, 0, 494, 492, 0, 0, 0, - 493, 0, 0, 0, 480, 0, 0, 0, 481, 0, 0, 0, 0, 7708, 0, 0, 0, 7709, 0, 0, - 560, 0, 0, 0, 561, 0, 0, 0, 0, 0, 0, 495, 8122, 902, 0, 0, 8121, 8120, 0, - 0, 0, 0, 7944, 7945, 0, 8124, 0, 0, 8136, 904, 0, 0, 0, 0, 7960, 7961, - 8138, 905, 0, 0, 0, 0, 7976, 7977, 0, 8140, 0, 0, 8154, 906, 0, 0, 8153, - 8152, 0, 938, 0, 0, 7992, 7993, 8184, 908, 0, 0, 0, 0, 8008, 8009, 0, 0, - 0, 8172, 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 8186, 911, - 0, 0, 0, 0, 8040, 8041, 0, 8188, 0, 0, 0, 8116, 0, 0, 0, 8132, 0, 0, - 8048, 940, 0, 0, 8113, 8112, 0, 0, 0, 0, 7936, 7937, 8118, 8115, 0, 0, - 8050, 941, 0, 0, 0, 0, 7952, 7953, 8052, 942, 0, 0, 0, 0, 7968, 7969, - 8134, 8131, 0, 0, 8054, 943, 0, 0, 8145, 8144, 0, 970, 0, 0, 7984, 7985, - 8150, 0, 0, 0, 8056, 972, 0, 0, 0, 0, 8000, 8001, 0, 0, 8164, 8165, 8058, - 973, 0, 0, 8161, 8160, 0, 971, 0, 0, 8016, 8017, 8166, 0, 0, 0, 8060, - 974, 0, 0, 0, 0, 8032, 8033, 8182, 8179, 0, 0, 8146, 912, 0, 0, 8151, 0, - 0, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 0, 8180, 0, 0, 0, 979, 0, 0, 0, 0, - 0, 980, 0, 0, 0, 1031, 0, 1232, 0, 1234, 0, 1027, 0, 0, 1024, 0, 0, 0, 0, - 1238, 0, 1025, 0, 1217, 0, 1244, 0, 0, 0, 1246, 1037, 0, 0, 0, 1250, - 1049, 0, 1252, 0, 1036, 0, 0, 0, 0, 0, 1254, 1262, 1038, 0, 1264, 0, 0, - 1266, 0, 0, 0, 0, 1268, 0, 0, 0, 1272, 0, 0, 0, 1260, 0, 1233, 0, 1235, - 0, 1107, 0, 0, 1104, 0, 0, 0, 0, 1239, 0, 1105, 0, 1218, 0, 1245, 0, 0, - 0, 1247, 1117, 0, 0, 0, 1251, 1081, 0, 1253, 0, 1116, 0, 0, 0, 0, 0, - 1255, 1263, 1118, 0, 1265, 0, 0, 1267, 0, 0, 0, 0, 1269, 0, 0, 0, 1273, - 0, 0, 0, 1261, 0, 0, 0, 1111, 1142, 0, 0, 0, 1143, 0, 0, 0, 0, 0, 0, - 1242, 0, 0, 0, 1243, 0, 0, 0, 1258, 0, 0, 0, 1259, 0, 0, 1570, 1571, - 1573, 0, 0, 0, 0, 0, 0, 1572, 0, 0, 0, 1574, 0, 0, 0, 1730, 0, 0, 0, - 1747, 0, 0, 0, 1728, 0, 2345, 0, 0, 0, 2353, 0, 0, 0, 2356, 0, 0, 0, 0, - 2507, 2508, 2891, 2888, 2892, 0, 2964, 0, 0, 0, 0, 0, 0, 3018, 3020, 0, - 0, 0, 0, 0, 0, 3019, 0, 3144, 0, 0, 0, 0, 0, 3264, 0, 0, 3274, 3271, - 3272, 0, 0, 0, 0, 0, 0, 3275, 0, 3402, 3404, 0, 0, 3403, 0, 0, 0, 0, 0, - 3546, 3548, 3550, 0, 0, 0, 0, 0, 3549, 0, 0, 4134, 0, 0, 0, 0, 6918, 0, - 0, 0, 6920, 0, 0, 0, 6922, 0, 0, 0, 6924, 0, 0, 0, 6926, 0, 0, 0, 6930, - 0, 0, 0, 6971, 0, 0, 0, 6973, 0, 0, 0, 6976, 0, 0, 0, 6977, 0, 0, 0, - 6979, 7736, 0, 0, 0, 7737, 0, 0, 0, 7772, 0, 0, 0, 7773, 0, 0, 0, 0, 0, - 7784, 0, 0, 0, 7785, 0, 0, 0, 7852, 0, 0, 7862, 0, 0, 0, 0, 7853, 0, 0, - 7863, 0, 0, 0, 0, 7878, 0, 0, 0, 7879, 0, 0, 0, 7896, 0, 0, 0, 7897, 0, - 7938, 7940, 0, 0, 7942, 8064, 0, 0, 7939, 7941, 0, 0, 7943, 8065, 0, 0, - 0, 8066, 0, 0, 0, 8067, 0, 0, 0, 8068, 0, 0, 0, 8069, 0, 0, 0, 8070, 0, - 0, 0, 8071, 0, 0, 7946, 7948, 0, 0, 7950, 8072, 0, 0, 7947, 7949, 0, 0, - 7951, 8073, 0, 0, 0, 8074, 0, 0, 0, 8075, 0, 0, 0, 8076, 0, 0, 0, 8077, - 0, 0, 0, 8078, 0, 0, 0, 8079, 0, 0, 7954, 7956, 0, 0, 7955, 7957, 0, 0, - 7962, 7964, 0, 0, 7963, 7965, 0, 0, 7970, 7972, 0, 0, 7974, 8080, 0, 0, - 7971, 7973, 0, 0, 7975, 8081, 0, 0, 0, 8082, 0, 0, 0, 8083, 0, 0, 0, - 8084, 0, 0, 0, 8085, 0, 0, 0, 8086, 0, 0, 0, 8087, 0, 0, 7978, 7980, 0, - 0, 7982, 8088, 0, 0, 7979, 7981, 0, 0, 7983, 8089, 0, 0, 0, 8090, 0, 0, - 0, 8091, 0, 0, 0, 8092, 0, 0, 0, 8093, 0, 0, 0, 8094, 0, 0, 0, 8095, 0, - 0, 7986, 7988, 0, 0, 7990, 0, 0, 0, 7987, 7989, 0, 0, 7991, 0, 0, 0, - 7994, 7996, 0, 0, 7998, 0, 0, 0, 7995, 7997, 0, 0, 7999, 0, 0, 0, 8002, - 8004, 0, 0, 8003, 8005, 0, 0, 8010, 8012, 0, 0, 8011, 8013, 0, 0, 8018, - 8020, 0, 0, 8022, 0, 0, 0, 8019, 8021, 0, 0, 8023, 0, 0, 0, 8027, 8029, - 0, 0, 8031, 0, 0, 0, 8034, 8036, 0, 0, 8038, 8096, 0, 0, 8035, 8037, 0, - 0, 8039, 8097, 0, 0, 0, 8098, 0, 0, 0, 8099, 0, 0, 0, 8100, 0, 0, 0, - 8101, 0, 0, 0, 8102, 0, 0, 0, 8103, 0, 0, 8042, 8044, 0, 0, 8046, 8104, - 0, 0, 8043, 8045, 0, 0, 8047, 8105, 0, 0, 0, 8106, 0, 0, 0, 8107, 0, 0, - 0, 8108, 0, 0, 0, 8109, 0, 0, 0, 8110, 0, 0, 0, 8111, 0, 0, 0, 8114, 0, - 0, 0, 8130, 0, 0, 0, 8178, 0, 0, 0, 8119, 0, 0, 8141, 8142, 0, 0, 8143, - 0, 0, 0, 0, 8135, 0, 0, 0, 8183, 0, 0, 8157, 8158, 0, 0, 8159, 0, 0, 0, - 0, 0, 0, 8602, 0, 0, 0, 8603, 0, 0, 0, 8622, 0, 0, 0, 8653, 0, 0, 0, - 8655, 0, 0, 0, 8654, 0, 0, 0, 8708, 0, 0, 0, 8713, 0, 0, 0, 8716, 0, 0, - 0, 8740, 0, 0, 0, 8742, 0, 0, 0, 8769, 0, 0, 0, 8772, 0, 0, 0, 8775, 0, - 0, 0, 8777, 0, 0, 0, 8813, 0, 0, 0, 8802, 0, 0, 0, 8816, 0, 0, 0, 8817, - 0, 0, 0, 8820, 0, 0, 0, 8821, 0, 0, 0, 8824, 0, 0, 0, 8825, 0, 0, 0, - 8832, 0, 0, 0, 8833, 0, 0, 0, 8928, 0, 0, 0, 8929, 0, 0, 0, 8836, 0, 0, - 0, 8837, 0, 0, 0, 8840, 0, 0, 0, 8841, 0, 0, 0, 8930, 0, 0, 0, 8931, 0, - 0, 0, 8876, 0, 0, 0, 8877, 0, 0, 0, 8878, 0, 0, 0, 8879, 0, 0, 0, 8938, - 0, 0, 0, 8939, 0, 0, 0, 8940, 0, 0, 0, 8941, 12436, 0, 0, 0, 12364, 0, 0, - 0, 12366, 0, 0, 0, 12368, 0, 0, 0, 12370, 0, 0, 0, 12372, 0, 0, 0, 12374, - 0, 0, 0, 12376, 0, 0, 0, 12378, 0, 0, 0, 12380, 0, 0, 0, 12382, 0, 0, 0, - 12384, 0, 0, 0, 12386, 0, 0, 0, 12389, 0, 0, 0, 12391, 0, 0, 0, 12393, 0, - 0, 0, 12400, 12401, 0, 0, 12403, 12404, 0, 0, 12406, 12407, 0, 0, 12409, - 12410, 0, 0, 12412, 12413, 0, 0, 12446, 0, 0, 0, 12532, 0, 0, 0, 12460, - 0, 0, 0, 12462, 0, 0, 0, 12464, 0, 0, 0, 12466, 0, 0, 0, 12468, 0, 0, 0, - 12470, 0, 0, 0, 12472, 0, 0, 0, 12474, 0, 0, 0, 12476, 0, 0, 0, 12478, 0, - 0, 0, 12480, 0, 0, 0, 12482, 0, 0, 0, 12485, 0, 0, 0, 12487, 0, 0, 0, - 12489, 0, 0, 0, 12496, 12497, 0, 0, 12499, 12500, 0, 0, 12502, 12503, 0, - 0, 12505, 12506, 0, 0, 12508, 12509, 0, 0, 12535, 0, 0, 0, 12536, 0, 0, - 0, 12537, 0, 0, 0, 12538, 0, 0, 0, 12542, 0, 0, 0, 0, 0, 69786, 0, 0, 0, - 69788, 0, 0, 0, 69803, 0, 0, 0, 0, 69934, 0, 0, 0, 69935, + 0, 0, 0, 0, 0, 0, 0, 8814, 0, 8800, 0, 0, 0, 0, 0, 8815, 0, 0, 192, 193, + 194, 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840, + 0, 7680, 0, 0, 260, 0, 0, 0, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, + 0, 0, 0, 262, 264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 0, 0, 0, 0, 199, 0, + 0, 7690, 0, 0, 0, 0, 270, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, + 0, 0, 200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, + 0, 0, 0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 7710, 0, 0, 0, 0, + 500, 284, 0, 7712, 286, 288, 0, 0, 0, 0, 486, 0, 0, 0, 0, 0, 290, 0, 0, + 292, 0, 0, 0, 7714, 7718, 0, 0, 0, 542, 0, 7716, 0, 0, 0, 7720, 0, 0, + 7722, 0, 0, 0, 0, 0, 204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, + 463, 520, 522, 0, 0, 0, 7882, 302, 0, 0, 7724, 0, 0, 308, 0, 0, 0, 0, + 7728, 0, 488, 0, 0, 0, 0, 0, 7730, 0, 0, 0, 310, 7732, 0, 0, 0, 0, 313, + 0, 0, 0, 0, 0, 317, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, + 0, 7742, 7744, 0, 0, 0, 0, 0, 0, 7746, 504, 323, 0, 209, 0, 0, 7748, 0, + 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 210, + 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0, 0, + 416, 7884, 490, 0, 0, 0, 0, 7764, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 340, + 7768, 0, 0, 0, 0, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 7774, 0, 0, + 0, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, 536, 350, + 0, 0, 7786, 0, 0, 0, 0, 356, 0, 0, 0, 0, 0, 7788, 0, 0, 538, 354, 0, + 7792, 0, 0, 7790, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, + 366, 368, 467, 532, 534, 0, 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0, + 7796, 0, 0, 0, 7804, 0, 0, 0, 0, 0, 7806, 7808, 7810, 372, 0, 0, 0, 7814, + 7812, 0, 7816, 0, 0, 7818, 7820, 0, 0, 7922, 221, 374, 7928, 562, 0, + 7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 0, 0, 0, 377, 7824, 0, 0, 0, + 379, 0, 0, 0, 0, 381, 0, 0, 0, 0, 0, 7826, 7828, 0, 0, 0, 224, 225, 226, + 227, 257, 259, 551, 228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, + 7681, 0, 0, 261, 0, 7683, 0, 0, 0, 0, 0, 0, 7685, 7687, 0, 0, 0, 0, 263, + 265, 0, 0, 0, 267, 0, 0, 0, 0, 269, 0, 231, 0, 0, 7691, 0, 0, 0, 0, 271, + 0, 0, 0, 0, 0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 0, 0, 0, 232, + 233, 234, 7869, 275, 277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, + 7865, 0, 0, 0, 553, 281, 7705, 0, 7707, 0, 0, 7711, 0, 0, 0, 0, 501, 285, + 0, 7713, 287, 289, 0, 0, 0, 0, 487, 0, 291, 0, 0, 293, 0, 0, 0, 7715, + 7719, 0, 0, 0, 543, 0, 0, 0, 0, 0, 7717, 0, 0, 0, 7721, 0, 0, 7723, 0, + 7830, 0, 0, 0, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, + 521, 523, 0, 0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 309, 0, 0, 0, + 0, 496, 0, 0, 0, 7729, 0, 0, 0, 0, 0, 489, 0, 7731, 0, 0, 0, 311, 0, 0, + 0, 0, 7733, 0, 0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, + 0, 7741, 0, 0, 7739, 0, 0, 0, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, + 0, 0, 0, 505, 324, 0, 241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 0, 0, 0, 0, + 7751, 0, 0, 0, 326, 0, 7755, 0, 0, 7753, 0, 0, 0, 242, 243, 244, 245, + 333, 335, 559, 246, 7887, 0, 337, 466, 525, 527, 0, 0, 417, 7885, 0, 0, + 0, 0, 491, 0, 0, 0, 0, 7765, 7767, 0, 0, 0, 0, 341, 0, 0, 0, 0, 7769, 0, + 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, 0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, + 0, 0, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 7779, + 0, 0, 537, 351, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 7789, 0, 0, 539, 355, + 0, 7793, 0, 0, 7791, 0, 0, 0, 249, 250, 251, 361, 363, 365, 0, 252, 7911, + 367, 369, 468, 533, 535, 0, 0, 432, 7909, 7795, 0, 0, 0, 371, 7799, 0, + 7797, 0, 0, 0, 7805, 0, 7807, 0, 0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, + 7813, 0, 7832, 0, 0, 0, 7817, 0, 0, 7819, 7821, 0, 0, 7923, 253, 375, + 7929, 563, 0, 7823, 255, 7927, 7833, 0, 0, 0, 7925, 0, 378, 7825, 0, 0, + 0, 380, 0, 0, 0, 0, 382, 0, 7827, 0, 0, 0, 0, 7829, 0, 0, 0, 8173, 901, + 0, 0, 8129, 0, 7846, 7844, 0, 7850, 7848, 0, 0, 0, 0, 0, 478, 0, 0, 506, + 0, 0, 0, 0, 0, 508, 0, 0, 482, 0, 0, 7688, 0, 0, 0, 0, 7872, 7870, 0, + 7876, 0, 0, 0, 0, 7874, 0, 0, 7726, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, + 0, 0, 0, 7892, 0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 554, 0, 0, 510, + 0, 0, 0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 7847, 7845, 0, 7851, + 7849, 0, 0, 0, 0, 0, 479, 0, 0, 507, 0, 0, 0, 0, 0, 509, 0, 0, 483, 0, 0, + 7689, 0, 0, 0, 0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 7727, 0, + 0, 0, 0, 7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 7757, 0, 0, 557, 0, + 0, 7759, 0, 0, 555, 0, 0, 511, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0, 0, + 474, 0, 0, 7856, 7854, 0, 7860, 7858, 0, 0, 0, 0, 0, 7857, 7855, 0, 7861, + 0, 0, 0, 0, 7859, 0, 7700, 7702, 0, 0, 0, 0, 7701, 7703, 7760, 7762, 0, + 0, 0, 0, 7761, 7763, 0, 0, 7780, 0, 7781, 0, 0, 0, 0, 0, 7782, 0, 7783, + 0, 0, 0, 0, 7800, 0, 0, 0, 0, 0, 7801, 0, 0, 0, 7802, 0, 7803, 0, 0, 0, + 0, 7835, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0, 0, 0, 7902, 0, 0, 0, 0, + 7906, 7901, 7899, 0, 7905, 7903, 0, 0, 0, 0, 7907, 0, 0, 0, 0, 7914, + 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0, 7920, 7915, 7913, 0, 7919, + 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 494, 0, 0, 492, 0, 0, 0, 0, 0, 493, 0, + 480, 0, 0, 0, 0, 0, 481, 0, 0, 7708, 0, 0, 0, 0, 0, 7709, 560, 0, 0, 0, + 0, 0, 561, 0, 0, 0, 0, 495, 0, 0, 8122, 902, 0, 0, 8121, 8120, 7944, + 7945, 0, 0, 0, 0, 0, 8124, 8136, 904, 0, 0, 0, 0, 7960, 7961, 0, 0, 8138, + 905, 7976, 7977, 0, 0, 0, 0, 0, 8140, 8154, 906, 0, 0, 8153, 8152, 0, + 938, 0, 0, 7992, 7993, 0, 0, 8184, 908, 8008, 8009, 0, 0, 0, 0, 0, 8172, + 0, 0, 8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 8186, + 911, 0, 0, 0, 0, 8040, 8041, 0, 8188, 0, 0, 0, 0, 0, 8116, 0, 8132, 0, 0, + 0, 0, 8048, 940, 0, 0, 8113, 8112, 7936, 7937, 0, 0, 0, 0, 8118, 8115, + 8050, 941, 0, 0, 0, 0, 7952, 7953, 0, 0, 8052, 942, 7968, 7969, 0, 0, 0, + 0, 8134, 8131, 8054, 943, 0, 0, 8145, 8144, 0, 970, 0, 0, 7984, 7985, + 8150, 0, 0, 0, 0, 0, 8056, 972, 8000, 8001, 0, 0, 0, 0, 8164, 8165, 0, 0, + 8058, 973, 0, 0, 8161, 8160, 0, 971, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, + 0, 8060, 974, 0, 0, 0, 0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 8146, 912, + 0, 0, 8151, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 0, 0, 0, 8180, 0, 979, 0, + 0, 0, 0, 0, 980, 0, 1031, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 1027, 1024, 0, + 0, 0, 0, 1238, 0, 1025, 0, 0, 0, 1217, 0, 1244, 0, 0, 0, 0, 0, 1246, 0, + 0, 1037, 0, 0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 1036, 0, 0, 0, 1254, 0, + 0, 1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 1268, 0, 0, 0, 0, 0, 1272, 0, + 1260, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 1107, 1104, 0, 0, 0, 0, 1239, 0, + 1105, 0, 0, 0, 1218, 0, 1245, 0, 0, 0, 0, 0, 1247, 0, 0, 1117, 0, 0, 0, + 1251, 1081, 0, 1253, 0, 0, 0, 1116, 0, 0, 0, 1255, 0, 0, 1263, 1118, 0, + 1265, 0, 0, 1267, 0, 0, 1269, 0, 0, 0, 0, 0, 1273, 0, 1261, 0, 0, 0, 0, + 0, 1111, 0, 0, 1142, 0, 1143, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 1243, 0, + 1258, 0, 0, 0, 0, 0, 1259, 1570, 1571, 1573, 0, 0, 0, 0, 1572, 0, 1574, + 0, 0, 0, 0, 0, 1730, 0, 1747, 0, 0, 0, 0, 0, 1728, 0, 0, 0, 2345, 0, + 2353, 0, 0, 0, 0, 0, 2356, 0, 0, 2507, 2508, 0, 0, 2891, 2888, 2892, 0, + 0, 0, 2964, 0, 0, 0, 0, 3018, 3020, 0, 0, 0, 0, 3019, 0, 0, 0, 3144, 0, + 0, 0, 3264, 3274, 3271, 3272, 0, 0, 0, 0, 3275, 0, 0, 0, 3402, 3404, 0, + 0, 0, 0, 3403, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 3549, 4134, 0, 0, 0, + 0, 0, 0, 6918, 0, 6920, 0, 0, 0, 0, 0, 6922, 0, 6924, 0, 0, 0, 0, 0, + 6926, 0, 6930, 0, 0, 0, 0, 0, 6971, 0, 6973, 0, 0, 0, 0, 0, 6976, 0, + 6977, 0, 0, 0, 0, 0, 6979, 0, 0, 7736, 0, 7737, 0, 0, 0, 0, 0, 7772, 0, + 7773, 0, 0, 0, 7784, 0, 0, 0, 0, 0, 7785, 0, 7852, 0, 0, 7862, 0, 0, + 7853, 0, 0, 7863, 0, 0, 7878, 0, 0, 0, 0, 0, 7879, 0, 7896, 0, 0, 0, 0, + 0, 7897, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 7939, 7941, 0, 0, 7943, + 8065, 0, 0, 0, 0, 0, 8066, 0, 8067, 0, 0, 0, 0, 0, 8068, 0, 8069, 0, 0, + 0, 0, 0, 8070, 0, 8071, 0, 0, 0, 0, 7946, 7948, 0, 0, 7950, 8072, 7947, + 7949, 0, 0, 7951, 8073, 0, 0, 0, 0, 0, 8074, 0, 8075, 0, 0, 0, 0, 0, + 8076, 0, 8077, 0, 0, 0, 0, 0, 8078, 0, 8079, 0, 0, 0, 0, 7954, 7956, + 7955, 7957, 0, 0, 0, 0, 7962, 7964, 7963, 7965, 0, 0, 0, 0, 7970, 7972, + 0, 0, 7974, 8080, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 0, 0, 0, 8082, 0, + 8083, 0, 0, 0, 0, 0, 8084, 0, 8085, 0, 0, 0, 0, 0, 8086, 0, 8087, 0, 0, + 0, 0, 7978, 7980, 0, 0, 7982, 8088, 7979, 7981, 0, 0, 7983, 8089, 0, 0, + 0, 0, 0, 8090, 0, 8091, 0, 0, 0, 0, 0, 8092, 0, 8093, 0, 0, 0, 0, 0, + 8094, 0, 8095, 0, 0, 0, 0, 7986, 7988, 0, 0, 7990, 0, 7987, 7989, 0, 0, + 7991, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 7998, 0, 7995, 7997, 0, 0, 7999, + 0, 0, 0, 0, 0, 8002, 8004, 8003, 8005, 0, 0, 0, 0, 8010, 8012, 8011, + 8013, 0, 0, 0, 0, 8018, 8020, 0, 0, 8022, 0, 8019, 8021, 0, 0, 8023, 0, + 0, 0, 0, 0, 8027, 8029, 0, 0, 8031, 0, 8034, 8036, 0, 0, 8038, 8096, 0, + 0, 0, 0, 8035, 8037, 0, 0, 8039, 8097, 0, 8098, 0, 0, 0, 0, 0, 8099, 0, + 8100, 0, 0, 0, 0, 0, 8101, 0, 8102, 0, 0, 0, 0, 0, 8103, 8042, 8044, 0, + 0, 8046, 8104, 0, 0, 0, 0, 8043, 8045, 0, 0, 8047, 8105, 0, 8106, 0, 0, + 0, 0, 0, 8107, 0, 8108, 0, 0, 0, 0, 0, 8109, 0, 8110, 0, 0, 0, 0, 0, + 8111, 0, 8114, 0, 0, 0, 0, 0, 8130, 0, 8178, 0, 0, 0, 0, 0, 8119, 8141, + 8142, 0, 0, 8143, 0, 0, 0, 0, 0, 0, 8135, 0, 8183, 0, 0, 0, 0, 8157, + 8158, 0, 0, 8159, 0, 0, 0, 0, 8602, 0, 8603, 0, 0, 0, 0, 0, 8622, 0, + 8653, 0, 0, 0, 0, 0, 8655, 0, 8654, 0, 0, 0, 0, 0, 8708, 0, 8713, 0, 0, + 0, 0, 0, 8716, 0, 8740, 0, 0, 0, 0, 0, 8742, 0, 8769, 0, 0, 0, 0, 0, + 8772, 0, 8775, 0, 0, 0, 0, 0, 8777, 0, 8813, 0, 0, 0, 0, 0, 8802, 0, + 8816, 0, 0, 0, 0, 0, 8817, 0, 8820, 0, 0, 0, 0, 0, 8821, 0, 8824, 0, 0, + 0, 0, 0, 8825, 0, 8832, 0, 0, 0, 0, 0, 8833, 0, 8928, 0, 0, 0, 0, 0, + 8929, 0, 8836, 0, 0, 0, 0, 0, 8837, 0, 8840, 0, 0, 0, 0, 0, 8841, 0, + 8930, 0, 0, 0, 0, 0, 8931, 0, 8876, 0, 0, 0, 0, 0, 8877, 0, 8878, 0, 0, + 0, 0, 0, 8879, 0, 8938, 0, 0, 0, 0, 0, 8939, 0, 8940, 0, 0, 0, 0, 0, + 8941, 0, 0, 12436, 0, 12364, 0, 0, 0, 0, 0, 12366, 0, 12368, 0, 0, 0, 0, + 0, 12370, 0, 12372, 0, 0, 0, 0, 0, 12374, 0, 12376, 0, 0, 0, 0, 0, 12378, + 0, 12380, 0, 0, 0, 0, 0, 12382, 0, 12384, 0, 0, 0, 0, 0, 12386, 0, 12389, + 0, 0, 0, 0, 0, 12391, 0, 12393, 0, 0, 0, 0, 0, 12400, 12401, 12403, + 12404, 0, 0, 0, 0, 12406, 12407, 12409, 12410, 0, 0, 0, 0, 12412, 12413, + 12446, 0, 0, 0, 0, 0, 12532, 0, 12460, 0, 0, 0, 0, 0, 12462, 0, 12464, 0, + 0, 0, 0, 0, 12466, 0, 12468, 0, 0, 0, 0, 0, 12470, 0, 12472, 0, 0, 0, 0, + 0, 12474, 0, 12476, 0, 0, 0, 0, 0, 12478, 0, 12480, 0, 0, 0, 0, 0, 12482, + 0, 12485, 0, 0, 0, 0, 0, 12487, 0, 12489, 0, 0, 0, 0, 0, 12496, 12497, + 12499, 12500, 0, 0, 0, 0, 12502, 12503, 12505, 12506, 0, 0, 0, 0, 12508, + 12509, 12535, 0, 0, 0, 0, 0, 12536, 0, 12537, 0, 0, 0, 0, 0, 12538, 0, + 12542, 0, 0, 0, 69786, 0, 0, 0, 0, 0, 69788, 0, 69803, 0, 0, 0, 0, 0, 0, + 69934, 0, 69935, 0, 0, 70475, 70476, 0, 0, 70844, 70843, 70846, 0, 0, + 71098, 0, 0, 0, 0, 0, 71099, }; static const change_record change_records_3_2_0[] = { @@ -5210,372 +5674,373 @@ }; static unsigned char changes_3_2_0_index[] = { 0, 1, 2, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 2, 2, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 2, 2, 2, 37, 38, 2, 39, 2, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, - 50, 2, 51, 2, 2, 52, 53, 54, 55, 56, 2, 57, 58, 59, 60, 2, 2, 61, 62, 63, - 64, 65, 65, 2, 2, 2, 2, 66, 2, 67, 68, 69, 70, 71, 2, 2, 2, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 2, 2, 2, 2, 2, 2, 82, 2, 2, 2, 2, 2, 83, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 84, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 86, - 87, 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 90, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 91, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 92, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 95, 2, 2, 2, 2, 2, 2, 2, 2, 96, 49, 49, - 97, 98, 49, 99, 100, 101, 102, 103, 104, 105, 106, 107, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 108, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 109, 110, 111, 112, 113, 114, 2, 2, 2, 115, 116, 2, 117, 118, - 119, 120, 121, 122, 2, 123, 124, 125, 126, 127, 2, 2, 2, 2, 2, 2, 128, 2, - 129, 130, 131, 2, 132, 2, 133, 2, 2, 2, 134, 2, 2, 2, 135, 136, 137, 138, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 139, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 49, 49, 49, 49, 49, 49, 140, 2, 141, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 49, 49, 49, 49, 49, 49, - 49, 142, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 49, 49, 49, 143, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 144, 145, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 146, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 147, 2, 148, 2, 149, 2, 2, 150, 2, 2, 2, 151, 152, - 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 154, 155, - 2, 2, 156, 157, 158, 159, 160, 2, 161, 162, 163, 164, 165, 166, 167, 148, - 168, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 169, 170, 93, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 82, 171, 2, 172, 173, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 174, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 175, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 176, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 177, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 178, 49, 179, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 174, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 49, 180, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 19, 20, 21, 22, 23, 24, 25, 2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 2, 2, 2, 38, 39, 2, 40, 2, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 2, 52, 2, 2, 53, 54, 55, 56, 57, 2, 58, 59, 60, 61, 2, 2, 62, 63, + 64, 65, 66, 66, 2, 2, 2, 2, 67, 68, 69, 70, 71, 72, 73, 2, 2, 2, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 2, 2, 2, 2, 2, 2, 84, 2, 2, 2, 2, 2, 85, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 2, 87, 2, 2, 2, 2, 2, 2, 2, 2, + 88, 89, 2, 2, 2, 2, 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 91, + 92, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 93, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 94, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 95, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 96, 97, 2, 2, 2, 2, 2, 2, 2, 2, 98, 50, 50, + 99, 100, 50, 101, 102, 103, 104, 105, 106, 107, 108, 109, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 110, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 111, 112, 113, 114, 115, 116, 2, 2, 117, 118, 119, 2, 120, + 121, 122, 123, 124, 125, 2, 126, 127, 128, 129, 130, 131, 2, 50, 50, 132, + 2, 133, 134, 135, 136, 137, 138, 139, 140, 141, 2, 2, 2, 142, 2, 2, 2, + 143, 144, 145, 146, 147, 148, 149, 2, 2, 150, 2, 151, 152, 153, 2, 2, 2, + 154, 2, 2, 2, 155, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 50, 50, 50, + 50, 156, 157, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 50, 50, 50, 50, 50, 50, 50, 50, 158, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, + 50, 50, 159, 160, 161, 162, 2, 2, 2, 2, 2, 2, 163, 164, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 165, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 166, 167, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 168, 2, + 169, 2, 170, 2, 2, 171, 2, 2, 2, 172, 173, 174, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 50, 175, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 176, 177, 2, 2, 178, 179, 180, + 181, 182, 2, 183, 184, 50, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 194, 195, 95, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 84, 196, 2, 197, 198, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 199, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 200, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 201, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 202, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 203, 50, 204, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 199, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 50, 205, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, }; static unsigned char changes_3_2_0_data[] = { @@ -5611,7 +6076,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 10, 0, 9, 9, 0, 0, 0, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5623,16 +6088,16 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5660,16 +6125,16 @@ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5696,18 +6161,18 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 20, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5716,785 +6181,945 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 33, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 9, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 35, 4, 0, 0, 36, 37, 38, + 39, 40, 41, 1, 1, 0, 0, 0, 4, 35, 8, 6, 7, 36, 37, 38, 39, 40, 41, 1, 1, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 43, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 46, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 9, 9, 9, + 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 35, 4, 0, 0, 36, 37, 38, 39, 40, 41, 1, 1, 0, 0, 0, - 4, 35, 8, 6, 7, 36, 37, 38, 39, 40, 41, 1, 1, 0, 0, 0, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 45, 46, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 0, 0, 9, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, + 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 0, 0, 9, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, 0, 0, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 0, 0, 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, - 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 0, 0, 0, 1, 1, 21, 21, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 0, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 0, 0, 0, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, - 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, + 0, 9, 0, 9, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, + 0, 9, 9, 0, 9, 0, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, + 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0, 0, 9, 0, 9, 0, 9, 0, 9, 9, 9, 0, 9, 9, 0, 9, 0, 0, 9, 0, - 9, 0, 9, 0, 9, 0, 9, 0, 9, 9, 0, 9, 0, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, - 9, 9, 0, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 9, 9, 9, 0, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 0, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, 9, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6503,51 +7128,24 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; static const change_record* get_change_3_2_0(Py_UCS4 n) diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -4,76 +4,75 @@ /* lexicon */ static unsigned char lexicon[] = { - 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, 65, 82, 65, 66, 73, 195, 67, 74, 203, 77, + 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 73, 71, 206, 83, 89, 76, + 76, 65, 66, 76, 197, 83, 77, 65, 76, 204, 67, 65, 80, 73, 84, 65, 204, + 76, 65, 84, 73, 206, 65, 82, 65, 66, 73, 195, 89, 201, 67, 74, 203, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 69, 71, 89, 80, 84, 73, 65, - 206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 67, 79, 77, 80, 65, 84, 73, - 66, 73, 76, 73, 84, 217, 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, 65, 78, 196, 66, 79, 76, 196, 72, 65, 78, 71, 85, 204, 86, 79, 87, - 69, 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, 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, 84, 65, 77, 73, 204, 67, 73, 82, 67, 76, 69, 196, 67, 79, 77, 66, - 73, 78, 73, 78, 199, 84, 65, 201, 70, 73, 78, 65, 204, 86, 65, 201, 83, - 81, 85, 65, 82, 197, 76, 69, 70, 212, 82, 73, 71, 72, 212, 86, 65, 82, - 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, - 82, 206, 65, 66, 79, 86, 69, 128, 66, 89, 90, 65, 78, 84, 73, 78, 197, - 83, 73, 71, 78, 128, 66, 69, 76, 79, 87, 128, 68, 79, 85, 66, 76, 197, - 73, 83, 79, 76, 65, 84, 69, 196, 78, 85, 77, 66, 69, 210, 75, 65, 84, 65, - 75, 65, 78, 193, 194, 77, 79, 68, 73, 70, 73, 69, 210, 68, 79, 212, 75, - 65, 78, 71, 88, 201, 65, 128, 76, 73, 78, 69, 65, 210, 84, 73, 66, 69, - 84, 65, 206, 79, 198, 73, 78, 73, 84, 73, 65, 204, 77, 69, 69, 205, 86, - 69, 82, 84, 73, 67, 65, 204, 77, 89, 65, 78, 77, 65, 210, 85, 128, 75, - 72, 77, 69, 210, 87, 72, 73, 84, 197, 65, 66, 79, 86, 197, 67, 65, 82, - 82, 73, 69, 210, 73, 128, 65, 82, 82, 79, 87, 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, 83, - 89, 77, 66, 79, 76, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, - 196, 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, 77, 73, 65, 207, 80, 76, 85, 211, 82, 73, 71, 72, 84, 87, - 65, 82, 68, 211, 71, 69, 79, 82, 71, 73, 65, 206, 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, 72, 79, 79, 75, 128, 213, 84, 87, - 79, 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, 65, 76, 69, 198, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 73, 195, 79, 78, 69, 128, 84, 79, 128, 84, 87, 207, - 72, 69, 65, 86, 217, 79, 86, 69, 210, 67, 79, 78, 83, 79, 78, 65, 78, - 212, 66, 82, 65, 72, 77, 201, 83, 67, 82, 73, 80, 212, 85, 208, 76, 79, - 215, 72, 65, 200, 79, 78, 197, 68, 79, 87, 206, 72, 73, 71, 200, 70, 85, - 76, 76, 87, 73, 68, 84, 200, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, - 65, 204, 84, 65, 199, 66, 65, 82, 128, 68, 79, 77, 73, 78, 207, 78, 85, - 77, 69, 82, 73, 195, 70, 82, 65, 75, 84, 85, 210, 84, 72, 82, 69, 197, - 67, 72, 65, 82, 65, 67, 84, 69, 210, 77, 65, 76, 65, 89, 65, 76, 65, 205, - 80, 72, 65, 83, 69, 45, 195, 84, 79, 78, 197, 68, 79, 85, 66, 76, 69, 45, - 83, 84, 82, 85, 67, 203, 76, 69, 70, 84, 87, 65, 82, 68, 211, 72, 73, 82, - 65, 71, 65, 78, 193, 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, 77, 69, 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 86, 79, 67, 65, - 76, 73, 195, 65, 82, 77, 69, 78, 73, 65, 206, 74, 69, 69, 205, 78, 69, - 71, 65, 84, 73, 86, 197, 73, 68, 69, 79, 71, 82, 65, 80, 200, 74, 65, 86, - 65, 78, 69, 83, 197, 79, 82, 73, 89, 193, 84, 72, 82, 69, 69, 128, 87, - 69, 83, 84, 45, 67, 82, 69, 197, 70, 79, 85, 82, 128, 72, 65, 128, 72, - 65, 76, 198, 77, 65, 82, 203, 75, 65, 78, 78, 65, 68, 193, 78, 69, 215, - 80, 72, 65, 83, 69, 45, 193, 84, 72, 65, 201, 67, 72, 69, 82, 79, 75, 69, - 197, 68, 79, 84, 211, 71, 85, 74, 65, 82, 65, 84, 201, 67, 72, 65, 205, - 76, 85, 197, 83, 72, 65, 82, 65, 68, 193, 83, 73, 78, 72, 65, 76, 193, - 75, 65, 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, - 72, 65, 77, 90, 193, 83, 89, 82, 73, 65, 195, 84, 73, 76, 68, 69, 128, - 71, 85, 82, 77, 85, 75, 72, 201, 77, 65, 128, 77, 65, 89, 69, 203, 77, - 69, 69, 84, 69, 201, 78, 79, 84, 65, 84, 73, 79, 206, 70, 73, 86, 69, - 128, 80, 65, 128, 89, 65, 128, 76, 73, 71, 72, 212, 83, 73, 88, 128, 69, - 73, 71, 72, 84, 128, 76, 69, 80, 67, 72, 193, 78, 65, 128, 83, 69, 86, - 69, 78, 128, 76, 79, 78, 199, 78, 73, 78, 69, 128, 84, 85, 82, 75, 73, - 195, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 79, 80, 69, 206, 82, 65, - 128, 83, 65, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 86, 73, 69, 212, - 76, 65, 207, 90, 90, 89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, + 206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 67, 85, 78, 69, 73, 70, 79, + 82, 205, 67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, 84, 217, 83, 89, 77, + 66, 79, 204, 70, 79, 82, 77, 128, 68, 73, 71, 73, 212, 67, 65, 78, 65, + 68, 73, 65, 206, 83, 89, 76, 76, 65, 66, 73, 67, 211, 66, 65, 77, 85, + 205, 86, 79, 87, 69, 204, 65, 78, 196, 66, 79, 76, 196, 72, 65, 78, 71, + 85, 204, 76, 73, 78, 69, 65, 210, 71, 82, 69, 69, 203, 76, 73, 71, 65, + 84, 85, 82, 197, 84, 73, 77, 69, 211, 77, 85, 83, 73, 67, 65, 204, 69, + 84, 72, 73, 79, 80, 73, 195, 193, 70, 79, 210, 67, 89, 82, 73, 76, 76, + 73, 195, 73, 84, 65, 76, 73, 195, 67, 79, 77, 66, 73, 78, 73, 78, 199, + 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 67, + 73, 82, 67, 76, 69, 196, 84, 65, 77, 73, 204, 84, 65, 201, 70, 73, 78, + 65, 204, 78, 85, 77, 66, 69, 210, 65, 82, 82, 79, 87, 128, 86, 65, 201, + 76, 69, 70, 212, 82, 73, 71, 72, 212, 83, 81, 85, 65, 82, 197, 68, 79, + 85, 66, 76, 197, 65, 82, 82, 79, 215, 65, 66, 79, 86, 69, 128, 83, 73, + 71, 78, 128, 86, 65, 82, 73, 65, 84, 73, 79, 206, 66, 69, 76, 79, 87, + 128, 66, 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 66, 89, + 90, 65, 78, 84, 73, 78, 197, 87, 72, 73, 84, 197, 66, 76, 65, 67, 203, + 73, 83, 79, 76, 65, 84, 69, 196, 65, 128, 194, 75, 65, 84, 65, 75, 65, + 78, 193, 77, 79, 68, 73, 70, 73, 69, 210, 77, 89, 65, 78, 77, 65, 210, + 68, 79, 212, 75, 65, 78, 71, 88, 201, 75, 73, 75, 65, 75, 85, 201, 77, + 69, 78, 68, 197, 85, 128, 84, 73, 66, 69, 84, 65, 206, 79, 198, 73, 128, + 79, 128, 72, 69, 65, 86, 217, 73, 78, 73, 84, 73, 65, 204, 86, 69, 82, + 84, 73, 67, 65, 204, 77, 69, 69, 205, 67, 79, 80, 84, 73, 195, 75, 72, + 77, 69, 210, 77, 65, 82, 75, 128, 65, 66, 79, 86, 197, 67, 65, 82, 82, + 73, 69, 210, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 89, 69, 200, 80, + 72, 65, 83, 69, 45, 197, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, 77, 79, + 78, 71, 79, 76, 73, 65, 206, 83, 84, 82, 79, 75, 69, 128, 76, 69, 70, 84, + 87, 65, 82, 68, 211, 83, 89, 77, 66, 79, 76, 128, 84, 73, 76, 197, 68, + 85, 80, 76, 79, 89, 65, 206, 66, 79, 216, 80, 65, 82, 69, 78, 84, 72, 69, + 83, 73, 90, 69, 196, 83, 81, 85, 65, 82, 69, 196, 84, 72, 65, 205, 74, + 79, 78, 71, 83, 69, 79, 78, 199, 80, 76, 85, 211, 79, 78, 69, 128, 72, + 69, 66, 82, 69, 215, 77, 73, 65, 207, 84, 87, 79, 128, 213, 67, 79, 78, + 83, 79, 78, 65, 78, 212, 71, 69, 79, 82, 71, 73, 65, 206, 72, 79, 79, 75, + 128, 68, 82, 65, 87, 73, 78, 71, 211, 72, 77, 79, 78, 199, 80, 65, 72, + 65, 87, 200, 67, 72, 79, 83, 69, 79, 78, 199, 76, 79, 215, 86, 79, 67, + 65, 76, 73, 195, 72, 65, 76, 70, 87, 73, 68, 84, 200, 66, 65, 76, 73, 78, + 69, 83, 197, 84, 87, 207, 79, 78, 197, 85, 208, 83, 67, 82, 73, 80, 212, + 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196, 84, 79, + 128, 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 65, 76, 69, 198, 72, 73, + 71, 200, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 84, 72, 82, 69, + 197, 68, 79, 87, 206, 79, 86, 69, 210, 83, 73, 78, 72, 65, 76, 193, 78, + 85, 77, 69, 82, 73, 195, 66, 65, 82, 128, 84, 79, 78, 197, 66, 82, 65, + 72, 77, 201, 66, 65, 82, 194, 70, 79, 85, 82, 128, 72, 65, 200, 77, 65, + 82, 203, 84, 72, 82, 69, 69, 128, 78, 79, 82, 84, 200, 70, 85, 76, 76, + 87, 73, 68, 84, 200, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, + 204, 76, 73, 71, 72, 212, 84, 65, 199, 68, 79, 77, 73, 78, 207, 76, 79, + 78, 199, 65, 67, 85, 84, 69, 128, 70, 82, 65, 75, 84, 85, 210, 72, 65, + 128, 77, 65, 76, 65, 89, 65, 76, 65, 205, 67, 72, 65, 82, 65, 67, 84, 69, + 210, 80, 72, 65, 83, 69, 45, 195, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, + 85, 67, 203, 72, 65, 76, 198, 72, 73, 82, 65, 71, 65, 78, 193, 74, 85, + 78, 71, 83, 69, 79, 78, 199, 84, 69, 76, 85, 71, 213, 65, 82, 77, 69, 78, + 73, 65, 206, 66, 69, 78, 71, 65, 76, 201, 71, 76, 65, 71, 79, 76, 73, 84, + 73, 195, 85, 80, 87, 65, 82, 68, 211, 70, 73, 86, 69, 128, 77, 69, 68, + 73, 65, 204, 78, 69, 71, 65, 84, 73, 86, 197, 74, 69, 69, 205, 75, 65, + 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 73, 68, 69, 79, 71, 82, 65, 80, + 200, 74, 65, 86, 65, 78, 69, 83, 197, 68, 79, 84, 211, 79, 82, 73, 89, + 193, 80, 65, 128, 87, 69, 83, 84, 45, 67, 82, 69, 197, 82, 85, 78, 73, + 195, 83, 128, 75, 65, 78, 78, 65, 68, 193, 83, 73, 88, 128, 77, 65, 128, + 78, 69, 215, 80, 72, 65, 83, 69, 45, 193, 83, 79, 85, 84, 200, 84, 72, + 65, 201, 89, 65, 128, 67, 65, 82, 196, 67, 72, 69, 82, 79, 75, 69, 197, + 69, 73, 71, 72, 84, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 204, 83, 69, + 86, 69, 78, 128, 83, 72, 65, 82, 65, 68, 193, 67, 73, 84, 201, 71, 85, + 74, 65, 82, 65, 84, 201, 78, 65, 128, 78, 73, 78, 69, 128, 84, 85, 82, + 78, 69, 196, 87, 65, 82, 65, 78, 199, 67, 72, 65, 205, 71, 82, 65, 78, + 84, 72, 193, 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, 65, 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, 83, 89, 65, @@ -84,181 +83,192 @@ 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, 83, 80, 128, 90, 87, 78, - 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 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, 83, 72, 65, 128, 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, 65, 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, 83, 65, 89, 65, 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, 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, 82, 73, 69, 196, 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, 84, 72, 73, 78, 128, 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, + 74, 128, 90, 87, 78, 66, 83, 80, 128, 90, 87, 74, 128, 90, 87, 202, 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, 83, 72, 65, + 128, 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, 73, 128, 90, 72, 79, + 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, 73, 76, 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, 89, 73, 78, + 128, 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, 82, 76, 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, 193, 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, 65, 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, 74, 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, 82, + 89, 128, 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, 87, 68, 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, 73, 78, 128, 89, 69, 72, 128, 89, 69, + 69, 71, 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, 68, 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, 83, 65, 89, 65, 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, 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, 79, 74, 128, 88, + 89, 79, 79, 128, 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 205, + 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, 87, 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, 72, 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, 65, 66, 128, 88, 73, 128, 88, 71, 128, + 88, 69, 89, 78, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, + 69, 128, 88, 69, 128, 88, 65, 85, 83, 128, 88, 65, 85, 128, 88, 65, 80, + 72, 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, 88, 45, 216, 87, 90, 128, 87, 89, + 78, 78, 128, 87, 89, 78, 206, 87, 86, 73, 128, 87, 86, 69, 128, 87, 86, + 65, 128, 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, 73, 128, 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, 87, 128, 87, 79, 82, 82, 73, 69, 196, + 87, 79, 82, 76, 196, 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, 84, 72, 73, 78, 128, 87, 73, 84, 72, 73, + 206, 87, 73, 82, 69, 196, 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, + 79, 87, 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, 73, 69, 82, 83, 84, 82, 65, 83, 211, 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, + 65, 76, 69, 128, 87, 72, 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, 73, 69, 82, 83, 84, 82, 65, 83, + 211, 87, 69, 73, 128, 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, 66, 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, 84, 69, 66, 65, 83, + 75, 69, 84, 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, 68, 68, + 65, 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, 74, 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, 84, 83, 128, 86, 84, 128, 86, 83, 57, 57, 128, 86, 83, 57, 56, 128, 86, 83, 57, 55, 128, 86, @@ -347,232 +357,250 @@ 48, 49, 128, 86, 83, 49, 48, 48, 128, 86, 83, 49, 48, 128, 86, 83, 49, 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, 86, 79, 84, 128, 86, 79, 80, 128, 86, 79, 79, 128, 86, 79, 77, 128, - 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, 71, 197, 86, 79, 76, 67, 65, - 78, 79, 128, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, - 73, 67, 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 76, - 73, 90, 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, - 88, 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, 84, 82, 73, 79, - 76, 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, 69, 128, 86, - 73, 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, 73, 83, 65, 82, - 71, 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, 73, 83, 65, 82, - 71, 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, 128, 86, 73, - 82, 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, 128, 86, 73, - 79, 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, 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, 74, 45, 50, 128, 86, 73, - 68, 74, 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, 70, 65, 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, + 128, 86, 79, 84, 128, 86, 79, 211, 86, 79, 80, 128, 86, 79, 79, 73, 128, + 86, 79, 79, 128, 86, 79, 77, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, + 84, 65, 71, 197, 86, 79, 76, 67, 65, 78, 79, 128, 86, 79, 76, 65, 80, 85, + 203, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, 67, + 69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 76, 73, 90, + 65, 84, 73, 79, 206, 86, 79, 67, 65, 204, 86, 79, 128, 86, 73, 89, 79, + 128, 86, 73, 88, 128, 86, 73, 84, 82, 73, 79, 76, 45, 50, 128, 86, 73, + 84, 82, 73, 79, 76, 128, 86, 73, 84, 65, 69, 45, 50, 128, 86, 73, 84, 65, + 69, 128, 86, 73, 84, 128, 86, 73, 83, 73, 71, 79, 84, 72, 73, 195, 86, + 73, 83, 65, 82, 71, 65, 89, 65, 128, 86, 73, 83, 65, 82, 71, 65, 128, 86, + 73, 83, 65, 82, 71, 193, 86, 73, 82, 73, 65, 77, 128, 86, 73, 82, 71, 79, + 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, 65, 77, 65, 128, 86, 73, 80, + 128, 86, 73, 79, 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, 197, + 86, 73, 78, 128, 86, 73, 76, 76, 65, 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, 212, 86, 73, 69, 80, 128, 86, 73, + 69, 128, 86, 73, 68, 74, 45, 50, 128, 86, 73, 68, 74, 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, 70, 65, 128, 86, 69, 89, 90, 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, + 82, 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, 72, 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, 45, 50, 128, - 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, 85, 83, 197, 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, 73, 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, 78, 71, 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, 79, 45, 69, 205, 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, 75, 73, 83, - 200, 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, 83, 65, 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, + 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 84, 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, 74, 128, 86, 65, 73, 128, 86, 65, 72, 128, + 86, 65, 200, 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, 87, 85, + 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, 45, 50, + 128, 85, 83, 69, 45, 49, 128, 85, 83, 69, 128, 85, 83, 197, 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, 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, 67, 69, 82, 84, 65, 73, 78, 84, 217, 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, 73, 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, 78, 71, + 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, 83, 72, 65, 80, 69, 196, 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, 89, 128, 84, 89, 65, 128, 84, 88, 87, 86, + 128, 84, 88, 87, 214, 84, 88, 72, 69, 69, 202, 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, 79, 45, 69, 205, 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, 206, 84, + 85, 82, 75, 73, 83, 200, 84, 85, 82, 75, 73, 195, 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, 66, 128, 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, 66, 128, 84, + 83, 87, 65, 128, 84, 83, 86, 128, 84, 83, 83, 69, 128, 84, 83, 83, 65, + 128, 84, 83, 79, 214, 84, 83, 73, 85, 128, 84, 83, 72, 85, 71, 83, 128, + 84, 83, 72, 79, 79, 75, 128, 84, 83, 72, 79, 79, 203, 84, 83, 72, 79, 79, + 74, 128, 84, 83, 72, 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, + 69, 199, 84, 83, 72, 69, 69, 74, 128, 84, 83, 72, 69, 128, 84, 83, 72, + 65, 194, 84, 83, 72, 65, 128, 84, 83, 69, 82, 69, 128, 84, 83, 69, 69, + 66, 128, 84, 83, 65, 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 66, + 128, 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, 77, 80, 45, 57, 128, 84, 82, 85, 77, 80, 45, 56, 128, + 84, 82, 85, 77, 80, 45, 55, 128, 84, 82, 85, 77, 80, 45, 54, 128, 84, 82, + 85, 77, 80, 45, 53, 128, 84, 82, 85, 77, 80, 45, 52, 128, 84, 82, 85, 77, + 80, 45, 51, 128, 84, 82, 85, 77, 80, 45, 50, 49, 128, 84, 82, 85, 77, 80, + 45, 50, 48, 128, 84, 82, 85, 77, 80, 45, 50, 128, 84, 82, 85, 77, 80, 45, + 49, 57, 128, 84, 82, 85, 77, 80, 45, 49, 56, 128, 84, 82, 85, 77, 80, 45, + 49, 55, 128, 84, 82, 85, 77, 80, 45, 49, 54, 128, 84, 82, 85, 77, 80, 45, + 49, 53, 128, 84, 82, 85, 77, 80, 45, 49, 52, 128, 84, 82, 85, 77, 80, 45, + 49, 51, 128, 84, 82, 85, 77, 80, 45, 49, 50, 128, 84, 82, 85, 77, 80, 45, + 49, 49, 128, 84, 82, 85, 77, 80, 45, 49, 48, 128, 84, 82, 85, 77, 80, 45, + 49, 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, 76, + 76, 73, 79, 78, 83, 128, 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, @@ -583,1414 +611,1483 @@ 84, 82, 65, 205, 84, 82, 65, 73, 78, 128, 84, 82, 65, 73, 206, 84, 82, 65, 73, 76, 73, 78, 199, 84, 82, 65, 70, 70, 73, 67, 128, 84, 82, 65, 70, 70, 73, 195, 84, 82, 65, 68, 197, 84, 82, 65, 67, 84, 79, 82, 128, 84, - 82, 65, 67, 75, 128, 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82, - 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 84, 65, 204, 84, 79, 84, - 128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 67, 85, 76, 85, 83, - 128, 84, 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, 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, 56, 128, - 84, 79, 78, 69, 45, 55, 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, 89, 65, 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, 69, 205, 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, 128, 84, 72, 69, 84, 72, 69, - 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, 128, 84, 72, 69, 84, - 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, 83, 69, 79, 83, 128, - 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, 211, 84, 72, 69, 82, 77, 79, 68, - 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, 82, 69, 70, 79, 82, 69, 128, 84, - 72, 69, 82, 197, 84, 72, 69, 206, 84, 72, 69, 77, 65, 84, 73, 83, 77, 79, - 211, 84, 72, 69, 77, 65, 128, 84, 72, 69, 77, 193, 84, 72, 69, 72, 128, - 84, 72, 69, 200, 84, 72, 197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, - 72, 65, 75, 72, 65, 84, 128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, - 128, 84, 72, 65, 206, 84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65, - 72, 65, 78, 128, 84, 72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, - 84, 72, 45, 67, 82, 69, 197, 84, 69, 88, 84, 128, 84, 69, 88, 128, 84, - 69, 86, 73, 82, 128, 84, 69, 85, 84, 69, 85, 88, 128, 84, 69, 85, 84, 69, - 85, 87, 69, 78, 128, 84, 69, 85, 84, 128, 84, 69, 85, 78, 128, 84, 69, - 85, 65, 69, 81, 128, 84, 69, 85, 65, 69, 78, 128, 84, 69, 85, 128, 84, - 69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, 83, 69, 77, - 69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, 65, 70, 79, - 78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, - 65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, - 128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, - 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, + 82, 65, 67, 75, 66, 65, 76, 76, 128, 84, 82, 65, 67, 75, 128, 84, 82, 65, + 128, 84, 82, 128, 84, 79, 88, 128, 84, 79, 87, 69, 82, 128, 84, 79, 86, + 128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 85, 67, 72, 84, 79, 78, + 197, 84, 79, 84, 65, 204, 84, 79, 84, 128, 84, 79, 83, 128, 84, 79, 82, + 84, 79, 73, 83, 197, 84, 79, 82, 78, 65, 68, 79, 128, 84, 79, 82, 67, 85, + 76, 85, 83, 128, 84, 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, 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, 56, 128, 84, 79, 78, 69, 45, 55, 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, 89, 65, 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, 82, 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, 72, 85, 84, 193, 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, 69, 83, 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, 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, 83, + 128, 84, 73, 67, 75, 69, 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203, + 84, 73, 65, 82, 65, 128, 84, 73, 50, 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, 69, 205, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128, + 84, 72, 79, 85, 83, 65, 78, 68, 83, 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, 77, + 128, 84, 72, 79, 74, 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, 45, 83, 84, 65, 71, 197, 84, 72, 73, 82, 68, 128, 84, 72, + 73, 82, 196, 84, 72, 73, 73, 128, 84, 72, 73, 71, 72, 128, 84, 72, 73, + 69, 85, 84, 200, 84, 72, 73, 67, 203, 84, 72, 73, 65, 66, 128, 84, 72, + 69, 89, 128, 84, 72, 69, 84, 72, 69, 128, 84, 72, 69, 84, 72, 128, 84, + 72, 69, 84, 65, 128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, 73, 65, + 206, 84, 72, 69, 83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, 211, 84, + 72, 69, 211, 84, 72, 69, 82, 77, 79, 77, 69, 84, 69, 82, 128, 84, 72, 69, + 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, 82, 69, 70, 79, + 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, 84, 72, 69, 77, 65, + 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, 72, 69, 77, 193, + 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 65, 128, 84, 72, 197, + 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, 128, 84, + 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, 84, 72, + 65, 77, 69, 68, 72, 128, 84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, + 65, 74, 128, 84, 72, 65, 72, 65, 78, 128, 84, 72, 65, 65, 78, 193, 84, + 72, 65, 65, 76, 85, 128, 84, 72, 45, 67, 82, 69, 197, 84, 69, 88, 84, + 128, 84, 69, 88, 212, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, 69, + 85, 84, 69, 85, 88, 128, 84, 69, 85, 84, 69, 85, 87, 69, 78, 128, 84, 69, + 85, 84, 128, 84, 69, 85, 78, 128, 84, 69, 85, 65, 69, 81, 128, 84, 69, + 85, 65, 69, 78, 128, 84, 69, 85, 128, 84, 69, 84, 82, 65, 83, 73, 77, 79, + 85, 128, 84, 69, 84, 82, 65, 83, 69, 77, 69, 128, 84, 69, 84, 82, 65, 80, + 76, 73, 128, 84, 69, 84, 82, 65, 71, 82, 65, 205, 84, 69, 84, 82, 65, 70, + 79, 78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, + 84, 65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, + 78, 128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 83, 69, 82, 65, 128, + 84, 69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, 200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 80, 128, 84, 69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, 69, 78, 213, 84, 69, - 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, 211, 84, 69, 78, 78, - 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, 45, 84, 72, 73, 82, 84, 89, - 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, 84, 69, 76, - 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 76, 69, 210, 84, 69, 76, - 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83, 73, 79, 78, 128, 84, 69, 76, - 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 69, 128, 84, - 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76, 69, 73, 65, 128, 84, 69, 76, - 69, 71, 82, 65, 80, 200, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, - 128, 84, 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, - 84, 69, 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, - 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, - 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65, - 82, 45, 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, 128, 84, - 69, 45, 50, 128, 84, 67, 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69, - 200, 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, 128, - 84, 195, 84, 65, 89, 128, 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, 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, 82, 201, 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, 85, 76, 65, 84, 73, 79, 206, 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, 65, 45, 50, 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, 83, 84, 69, 205, 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, 78, 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, 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, 89, 65, 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, 57, 128, 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82, - 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83, - 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, - 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, - 83, 69, 196, 83, 85, 80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 69, - 210, 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, 85, 79, 80, 128, 83, 85, - 79, 128, 83, 85, 78, 83, 69, 212, 83, 85, 78, 82, 73, 83, 69, 128, 83, - 85, 78, 82, 73, 83, 197, 83, 85, 78, 71, 76, 65, 83, 83, 69, 83, 128, 83, - 85, 78, 71, 128, 83, 85, 78, 70, 76, 79, 87, 69, 82, 128, 83, 85, 78, - 128, 83, 85, 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, 84, - 73, 79, 78, 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, 83, - 72, 128, 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, 85, - 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, 83, - 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, 83, 85, 72, 85, 82, - 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, - 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, - 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84, - 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, - 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, - 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, - 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, - 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, 78, 128, 83, 85, - 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, 73, 77, 65, 84, - 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, 83, 85, 66, 76, - 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, - 69, 67, 84, 128, 83, 85, 66, 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, - 80, 128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 66, 128, 83, 85, 65, - 69, 84, 128, 83, 85, 65, 69, 78, 128, 83, 85, 65, 69, 128, 83, 85, 65, - 128, 83, 213, 83, 84, 88, 128, 83, 84, 87, 65, 128, 83, 84, 85, 68, 89, - 128, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 83, 128, 83, 84, 82, - 79, 78, 199, 83, 84, 82, 79, 75, 69, 83, 128, 83, 84, 82, 79, 75, 69, - 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, 82, 79, 75, 69, 45, 56, - 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, 45, 54, - 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, 45, 52, - 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, 45, 50, - 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, 84, 82, 79, 75, 69, 45, - 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, 75, - 197, 83, 84, 82, 73, 80, 69, 128, 83, 84, 82, 73, 78, 71, 128, 83, 84, - 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, 128, - 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, 84, 82, - 69, 84, 67, 72, 69, 196, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, 78, 71, - 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, 83, 84, 82, 65, 87, 66, - 69, 82, 82, 89, 128, 83, 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, 84, 82, - 65, 84, 85, 77, 128, 83, 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, 84, 73, - 65, 206, 83, 84, 82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, - 84, 78, 69, 83, 83, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, - 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, - 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, 84, 67, - 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, - 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, - 83, 84, 79, 67, 75, 128, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, - 204, 83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 80, - 128, 83, 84, 69, 77, 128, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, - 65, 77, 128, 83, 84, 69, 65, 205, 83, 84, 65, 86, 82, 79, 85, 128, 83, - 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 65, 85, - 82, 79, 83, 128, 83, 84, 65, 84, 85, 197, 83, 84, 65, 84, 73, 79, 78, - 128, 83, 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 84, 69, 128, 83, 84, - 65, 82, 212, 83, 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 83, - 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, 83, 84, 65, 210, 83, 84, 65, - 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, - 65, 78, 68, 128, 83, 84, 65, 78, 128, 83, 84, 65, 76, 76, 73, 79, 78, - 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, 198, 83, 84, 65, 67, 67, - 65, 84, 79, 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, 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, 51, 128, 83, 83, 50, 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, + 78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, 83, 128, 84, 69, 78, + 211, 84, 69, 78, 78, 73, 211, 84, 69, 78, 71, 197, 84, 69, 78, 45, 84, + 72, 73, 82, 84, 89, 128, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, + 85, 211, 84, 69, 76, 85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 76, + 69, 210, 84, 69, 76, 73, 83, 72, 193, 84, 69, 76, 69, 86, 73, 83, 73, 79, + 78, 128, 84, 69, 76, 69, 83, 67, 79, 80, 69, 128, 84, 69, 76, 69, 80, 72, + 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, 69, 76, 69, 73, + 65, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, 84, 69, 75, 128, 84, 69, + 73, 87, 83, 128, 84, 69, 71, 69, 72, 128, 84, 69, 69, 78, 83, 128, 84, + 69, 69, 69, 69, 128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, + 65, 82, 211, 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 80, 79, 75, 69, 196, + 84, 69, 65, 82, 68, 82, 79, 80, 45, 83, 72, 65, 78, 75, 69, 196, 84, 69, + 65, 82, 68, 82, 79, 80, 45, 66, 65, 82, 66, 69, 196, 84, 69, 65, 82, 45, + 79, 70, 198, 84, 69, 65, 67, 85, 208, 84, 69, 45, 85, 128, 84, 69, 45, + 50, 128, 84, 67, 72, 69, 72, 69, 72, 128, 84, 67, 72, 69, 72, 69, 200, + 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, 200, 84, 67, 72, 69, 128, 84, + 195, 84, 65, 89, 128, 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, 77, 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, 83, 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, 82, + 71, 69, 84, 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, 71, 69, 78, 84, 128, 84, 65, + 78, 71, 69, 78, 212, 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, 82, 201, 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, 85, 76, 65, 84, 73, 79, 206, 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, 65, 45, 50, 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, 83, + 84, 69, 205, 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, 73, 65, 195, 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, 78, 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, 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, 82, 193, 83, 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, + 83, 85, 83, 72, 73, 128, 83, 85, 82, 89, 65, 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, 57, 128, 83, 85, 82, 128, + 83, 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, 65, 210, 83, 85, 80, 69, + 82, 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 83, 69, 84, 128, 83, 85, 80, + 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, 83, 67, 82, 73, 80, 212, 83, 85, + 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 83, 85, 80, 69, 82, 70, 73, 88, + 69, 196, 83, 85, 80, 69, 210, 83, 85, 80, 128, 83, 85, 79, 88, 128, 83, + 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 83, 69, 212, 83, 85, 78, + 82, 73, 83, 69, 128, 83, 85, 78, 82, 73, 83, 197, 83, 85, 78, 71, 76, 65, + 83, 83, 69, 83, 128, 83, 85, 78, 71, 128, 83, 85, 78, 70, 76, 79, 87, 69, + 82, 128, 83, 85, 78, 68, 65, 78, 69, 83, 197, 83, 85, 78, 128, 83, 85, + 206, 83, 85, 77, 77, 69, 82, 128, 83, 85, 77, 77, 65, 84, 73, 79, 78, + 128, 83, 85, 77, 77, 65, 84, 73, 79, 206, 83, 85, 77, 65, 83, 72, 128, + 83, 85, 77, 128, 83, 85, 76, 70, 85, 82, 128, 83, 85, 75, 85, 78, 128, + 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, 213, 83, 85, 73, + 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, 83, 85, 73, 212, 83, 85, + 72, 85, 82, 128, 83, 85, 69, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, + 83, 85, 67, 67, 69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, + 85, 67, 67, 69, 69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, + 78, 73, 84, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, + 66, 83, 84, 73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, + 197, 83, 85, 66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, + 83, 67, 82, 73, 80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, + 85, 66, 76, 73, 78, 69, 65, 210, 83, 85, 66, 76, 73, 77, 65, 84, 73, 79, + 78, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 45, 51, 128, 83, 85, 66, 76, + 73, 77, 65, 84, 69, 45, 50, 128, 83, 85, 66, 76, 73, 77, 65, 84, 69, 128, + 83, 85, 66, 76, 73, 77, 65, 84, 197, 83, 85, 66, 74, 79, 73, 78, 69, 196, + 83, 85, 66, 74, 69, 67, 84, 128, 83, 85, 66, 73, 84, 79, 128, 83, 85, 66, + 71, 82, 79, 85, 80, 128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 66, + 128, 83, 85, 65, 77, 128, 83, 85, 65, 69, 84, 128, 83, 85, 65, 69, 78, + 128, 83, 85, 65, 69, 128, 83, 85, 65, 66, 128, 83, 85, 65, 128, 83, 213, + 83, 84, 88, 128, 83, 84, 87, 65, 128, 83, 84, 85, 68, 89, 128, 83, 84, + 85, 68, 73, 207, 83, 84, 85, 67, 75, 45, 79, 85, 212, 83, 84, 83, 128, + 83, 84, 82, 79, 78, 199, 83, 84, 82, 79, 75, 69, 83, 128, 83, 84, 82, 79, + 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, 82, 79, 75, 69, + 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, 82, 79, 75, 69, + 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, 82, 79, 75, 69, + 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, 82, 79, 75, 69, + 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, 84, 82, 79, 75, + 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, 83, 84, 82, 79, + 75, 197, 83, 84, 82, 73, 80, 69, 128, 83, 84, 82, 73, 78, 71, 128, 83, + 84, 82, 73, 78, 199, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, 71, 72, + 128, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, 217, 83, + 84, 82, 69, 84, 67, 72, 69, 196, 83, 84, 82, 69, 83, 211, 83, 84, 82, 69, + 78, 71, 84, 72, 128, 83, 84, 82, 69, 65, 77, 69, 82, 128, 83, 84, 82, 65, + 87, 66, 69, 82, 82, 89, 128, 83, 84, 82, 65, 84, 85, 77, 45, 50, 128, 83, + 84, 82, 65, 84, 85, 77, 128, 83, 84, 82, 65, 84, 85, 205, 83, 84, 82, 65, + 84, 73, 65, 206, 83, 84, 82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, + 71, 72, 84, 78, 69, 83, 83, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, + 82, 65, 73, 70, 128, 83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, + 83, 84, 79, 86, 69, 128, 83, 84, 79, 82, 69, 128, 83, 84, 79, 80, 87, 65, + 84, 67, 72, 128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, + 65, 71, 69, 128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, + 69, 128, 83, 84, 79, 67, 75, 128, 83, 84, 79, 67, 203, 83, 84, 73, 82, + 82, 85, 208, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, 83, 84, + 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 82, 69, 79, 128, + 83, 84, 69, 80, 128, 83, 84, 69, 78, 79, 71, 82, 65, 80, 72, 73, 195, 83, + 84, 69, 77, 128, 83, 84, 69, 65, 77, 73, 78, 199, 83, 84, 69, 65, 77, + 128, 83, 84, 69, 65, 205, 83, 84, 65, 86, 82, 79, 85, 128, 83, 84, 65, + 86, 82, 79, 83, 128, 83, 84, 65, 86, 82, 79, 211, 83, 84, 65, 85, 82, 79, + 83, 128, 83, 84, 65, 84, 85, 197, 83, 84, 65, 84, 73, 79, 78, 128, 83, + 84, 65, 84, 69, 82, 83, 128, 83, 84, 65, 84, 69, 128, 83, 84, 65, 82, + 212, 83, 84, 65, 82, 83, 128, 83, 84, 65, 82, 82, 69, 196, 83, 84, 65, + 82, 75, 128, 83, 84, 65, 82, 128, 83, 84, 65, 210, 83, 84, 65, 78, 68, + 83, 84, 73, 76, 76, 128, 83, 84, 65, 78, 68, 65, 82, 196, 83, 84, 65, 78, + 68, 128, 83, 84, 65, 78, 128, 83, 84, 65, 77, 80, 69, 196, 83, 84, 65, + 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, 198, + 83, 84, 65, 68, 73, 85, 77, 128, 83, 84, 65, 67, 67, 65, 84, 79, 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, 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, 73, 78, + 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, 51, 128, 83, 83, 50, 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, 65, 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, + 65, 82, 69, 68, 128, 83, 81, 85, 65, 82, 69, 128, 83, 80, 89, 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, 82, 84, 211, 83, 80, 79, 79, 78, 128, 83, + 80, 76, 73, 84, 84, 73, 78, 199, 83, 80, 76, 65, 89, 69, 68, 128, 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, 68, 69, 82, 128, 83, 80, 73, 68, 69, 210, + 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, 73, 78, 199, 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, 65, 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, 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, 82, 193, 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, 80, 69, 78, 199, 83, 79, 77, 128, 83, 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, - 211, 83, 79, 72, 128, 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, 83, 72, 73, 70, 84, 45, 51, 128, 83, 73, 78, 71, 76, 69, 45, - 83, 72, 73, 70, 84, 45, 50, 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, 54, 128, 83, 72, 65, 51, 128, 83, 72, 65, - 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 67, 128, 83, 71, 65, 215, - 83, 71, 65, 194, 83, 71, 128, 83, 69, 88, 84, 85, 76, 193, 83, 69, 88, - 84, 73, 76, 69, 128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 86, 69, 82, 65, - 78, 67, 69, 128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, - 217, 83, 69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, - 128, 83, 69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, - 73, 82, 84, 89, 128, 83, 69, 86, 69, 206, 83, 69, 85, 88, 128, 83, 69, - 85, 78, 89, 65, 77, 128, 83, 69, 85, 65, 69, 81, 128, 83, 69, 84, 70, 79, - 78, 128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, - 81, 85, 65, 68, 82, 65, 84, 69, 128, 83, 69, 83, 65, 77, 197, 83, 69, 82, - 86, 73, 67, 197, 83, 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, 70, 211, - 83, 69, 81, 85, 69, 78, 67, 197, 83, 69, 80, 84, 69, 77, 66, 69, 82, 128, - 83, 69, 80, 65, 82, 65, 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, - 210, 83, 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, 83, 69, 77, 85, - 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, 128, - 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, 212, 83, - 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 77, 73, 77, 73, 78, - 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, 83, 69, 77, 73, 67, - 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, 83, 69, 77, 73, - 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, 73, 67, 73, 82, 67, 76, 197, - 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, 73, 45, 86, 79, 73, - 67, 69, 196, 83, 69, 76, 70, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, - 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, - 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, - 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, - 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 56, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 50, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 52, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 49, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 57, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 54, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 48, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 50, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, - 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, - 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 54, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 51, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, - 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 55, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, - 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 48, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, - 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 52, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 56, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 52, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 49, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, - 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 53, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 49, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 57, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 53, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, - 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 48, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 52, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 48, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 56, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 52, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, - 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 56, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, - 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 49, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, - 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 53, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 57, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 53, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 50, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 54, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 50, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, 69, 76, 69, - 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, - 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 54, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, - 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 128, 83, - 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, 69, 67, 84, - 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, - 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 51, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, 83, 69, 76, - 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, - 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 55, 128, - 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, - 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, 128, 83, 69, - 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, - 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 48, - 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, 69, 76, 69, 67, - 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 210, 83, 69, 76, 69, - 67, 84, 69, 196, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, - 83, 69, 72, 128, 83, 69, 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, - 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, - 128, 83, 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69, - 45, 78, 79, 45, 69, 86, 73, 204, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, - 84, 73, 79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, - 128, 83, 69, 67, 79, 78, 68, 128, 83, 69, 66, 65, 84, 66, 69, 73, 212, - 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, 71, 85, 76, 204, - 83, 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, 83, 67, 82, 85, - 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, 73, 80, 84, - 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, 83, 67, 82, - 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, 79, - 82, 69, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, 128, 83, - 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, 69, - 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, 204, 83, 67, - 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, 69, 80, 84, 69, - 210, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65, 78, 68, 73, 67, - 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128, 83, 66, 85, 194, - 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, 83, 65, 89, 65, 78, 78, 65, - 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, 79, 78, 69, 128, 83, 65, - 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, 128, 83, 65, 87, 128, - 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, 73, 76, 128, 83, 65, 84, - 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, 84, - 75, 65, 65, 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 197, 83, 65, 84, 67, - 72, 69, 76, 128, 83, 65, 84, 65, 78, 71, 65, 128, 83, 65, 83, 72, 128, - 83, 65, 83, 65, 75, 128, 83, 65, 82, 73, 128, 83, 65, 82, 193, 83, 65, - 82, 128, 83, 65, 81, 128, 83, 65, 80, 65, 128, 83, 65, 78, 89, 79, 79, - 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, 84, 73, 73, 77, 85, - 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, 50, 128, 83, 65, - 78, 68, 65, 76, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, - 77, 89, 79, 203, 83, 65, 77, 86, 65, 84, 128, 83, 65, 77, 80, 73, 128, - 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, - 75, 72, 128, 83, 65, 77, 69, 75, 200, 83, 65, 77, 66, 65, 128, 83, 65, - 77, 65, 82, 73, 84, 65, 206, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, - 128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, 76, 84, 45, 50, 128, - 83, 65, 76, 84, 128, 83, 65, 76, 212, 83, 65, 76, 76, 65, 76, 76, 65, 72, - 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, 205, 83, 65, 76, 65, 128, - 83, 65, 76, 45, 65, 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, - 65, 75, 79, 84, 128, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, - 83, 65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, - 73, 76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, - 71, 73, 84, 84, 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, - 128, 83, 65, 199, 83, 65, 70, 72, 65, 128, 83, 65, 68, 72, 69, 128, 83, - 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70, - 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128, - 83, 65, 45, 73, 128, 83, 65, 45, 50, 128, 83, 48, 52, 54, 128, 83, 48, - 52, 53, 128, 83, 48, 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, 52, 50, - 128, 83, 48, 52, 49, 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, 128, 83, - 48, 51, 56, 128, 83, 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, 48, 51, - 53, 65, 128, 83, 48, 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, 51, 51, - 128, 83, 48, 51, 50, 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, 128, 83, - 48, 50, 57, 128, 83, 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, 48, 50, - 54, 66, 128, 83, 48, 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, 48, 50, - 53, 128, 83, 48, 50, 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, 50, 128, - 83, 48, 50, 49, 128, 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, 83, 48, - 49, 56, 128, 83, 48, 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, 48, 49, - 54, 128, 83, 48, 49, 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, 49, 52, - 65, 128, 83, 48, 49, 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, 50, 128, - 83, 48, 49, 49, 128, 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, 83, 48, - 48, 56, 128, 83, 48, 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, 48, 48, - 54, 128, 83, 48, 48, 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, 51, 128, - 83, 48, 48, 50, 65, 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, 128, 83, - 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, 82, 89, - 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, 82, 89, - 80, 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, 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, 72, - 73, 78, 71, 89, 193, 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, 77, - 84, 128, 82, 76, 79, 128, 82, 76, 77, 128, 82, 76, 73, 128, 82, 76, 69, - 128, 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, + 211, 83, 79, 76, 73, 196, 83, 79, 72, 128, 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, 215, + 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, 79, 65, 206, 83, 76, 73, 78, 71, + 128, 83, 76, 73, 71, 72, 84, 76, 217, 83, 76, 73, 68, 73, 78, 71, 128, + 83, 76, 73, 68, 69, 82, 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, + 197, 83, 76, 69, 85, 84, 200, 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, 90, 197, 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, 85, 83, 79, 73, + 196, 83, 73, 78, 75, 73, 78, 71, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, + 73, 70, 84, 45, 51, 128, 83, 73, 78, 71, 76, 69, 45, 83, 72, 73, 70, 84, + 45, 50, 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, 68, 68, 72, 65, + 77, 128, 83, 73, 68, 68, 72, 65, 205, 83, 73, 67, 75, 78, 69, 83, 83, + 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, 66, 197, 83, 73, 65, 128, 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, 197, 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, 76, 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, 82, 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, 72, 65, 78, 196, 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, 80, 73, 78, 199, 83, + 72, 79, 80, 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, + 128, 83, 72, 79, 79, 73, 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, 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, 79, 79, 73, 128, 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, 75, 128, 83, 72, 65, 73, 128, 83, 72, + 65, 70, 84, 128, 83, 72, 65, 70, 212, 83, 72, 65, 68, 79, 87, 69, 196, + 83, 72, 65, 68, 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, 54, 128, 83, 72, + 65, 51, 128, 83, 72, 65, 179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, + 67, 128, 83, 71, 65, 215, 83, 71, 65, 194, 83, 71, 128, 83, 69, 89, 75, + 128, 83, 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, 128, 83, + 69, 88, 84, 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, 128, 83, 69, + 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, 69, 86, 69, 78, + 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, 69, 86, 69, 78, + 84, 69, 69, 206, 83, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 83, + 69, 86, 69, 206, 83, 69, 85, 88, 128, 83, 69, 85, 78, 89, 65, 77, 128, + 83, 69, 85, 65, 69, 81, 128, 83, 69, 84, 70, 79, 78, 128, 83, 69, 83, 84, + 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, 81, 85, 65, 68, 82, 65, + 84, 69, 128, 83, 69, 83, 65, 77, 197, 83, 69, 82, 86, 73, 67, 197, 83, + 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, 70, 211, 83, 69, 82, 73, 70, + 128, 83, 69, 81, 85, 69, 78, 67, 197, 83, 69, 80, 84, 69, 77, 66, 69, 82, + 128, 83, 69, 80, 65, 82, 65, 84, 79, 82, 128, 83, 69, 80, 65, 82, 65, 84, + 79, 210, 83, 69, 78, 84, 79, 128, 83, 69, 78, 84, 73, 128, 83, 69, 77, + 85, 78, 67, 73, 193, 83, 69, 77, 75, 65, 84, 72, 128, 83, 69, 77, 75, + 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, 83, 69, 77, 73, 83, 79, 70, + 212, 83, 69, 77, 73, 83, 69, 88, 84, 73, 76, 69, 128, 83, 69, 77, 73, 77, + 73, 78, 73, 77, 193, 83, 69, 77, 73, 68, 73, 82, 69, 67, 212, 83, 69, 77, + 73, 67, 79, 76, 79, 78, 128, 83, 69, 77, 73, 67, 79, 76, 79, 206, 83, 69, + 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, 69, 77, 73, 67, 73, 82, 67, + 76, 197, 83, 69, 77, 73, 66, 82, 69, 86, 73, 211, 83, 69, 77, 73, 45, 86, + 79, 73, 67, 69, 196, 83, 69, 76, 70, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 50, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 55, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 49, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 57, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, + 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 48, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 57, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 56, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 54, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 53, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 51, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 50, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 48, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 52, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 50, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 49, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 55, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 52, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 49, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 56, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 54, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 51, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 50, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 55, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 54, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 51, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 50, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, + 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 55, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 54, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, + 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 51, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 48, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, + 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 55, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 52, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 51, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 48, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 56, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 55, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 52, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 49, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 48, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, + 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 56, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 53, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 52, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 49, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 48, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 54, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 51, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 50, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 55, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 54, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 51, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 48, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 55, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 52, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 51, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 48, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 56, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 55, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 52, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 51, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, + 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 48, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 56, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 55, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, + 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 52, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 49, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 48, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, + 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 56, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 53, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 52, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 49, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 57, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 56, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 53, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 49, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 57, 128, 83, 69, + 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, + 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 54, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 53, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 50, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 49, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, + 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 57, 128, 83, 69, 76, 69, + 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, + 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 54, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 53, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, + 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 50, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 128, 83, + 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 57, 128, 83, 69, 76, 69, 67, 84, + 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, + 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 54, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, + 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 51, 128, + 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 50, 128, 83, 69, 76, 69, 67, + 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, + 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 128, 83, 69, 76, + 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 128, 83, + 69, 76, 69, 67, 84, 79, 210, 83, 69, 76, 69, 67, 84, 69, 196, 83, 69, 73, + 83, 77, 65, 128, 83, 69, 73, 83, 77, 193, 83, 69, 72, 128, 83, 69, 71, + 79, 76, 128, 83, 69, 71, 78, 79, 128, 83, 69, 71, 77, 69, 78, 84, 128, + 83, 69, 69, 86, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, 128, 83, + 69, 69, 206, 83, 69, 69, 68, 76, 73, 78, 71, 128, 83, 69, 69, 45, 78, 79, + 45, 69, 86, 73, 204, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, 79, + 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, 83, + 69, 67, 79, 78, 68, 128, 83, 69, 67, 65, 78, 84, 128, 83, 69, 66, 65, 84, + 66, 69, 73, 212, 83, 69, 65, 84, 128, 83, 69, 65, 76, 128, 83, 69, 65, + 71, 85, 76, 204, 83, 68, 79, 78, 199, 83, 68, 128, 83, 67, 87, 65, 128, + 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, 82, 79, 76, 76, 128, 83, 67, 82, + 73, 80, 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, + 83, 67, 82, 69, 65, 77, 73, 78, 199, 83, 67, 79, 82, 80, 73, 85, 83, 128, + 83, 67, 79, 82, 69, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, 83, 67, 73, + 128, 83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, + 69, 68, 69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 79, + 204, 83, 67, 72, 79, 76, 65, 82, 128, 83, 67, 72, 69, 77, 193, 83, 67, + 69, 80, 84, 69, 210, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, 83, 67, 65, + 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, 83, 128, + 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, 83, 65, + 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 79, 80, 72, 79, 78, + 69, 128, 83, 65, 88, 73, 77, 65, 84, 65, 128, 83, 65, 87, 65, 78, 128, + 83, 65, 87, 128, 83, 65, 86, 79, 85, 82, 73, 78, 199, 83, 65, 85, 82, 65, + 83, 72, 84, 82, 193, 83, 65, 85, 73, 76, 128, 83, 65, 84, 85, 82, 78, + 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, 85, 128, 83, 65, 84, 75, 65, 65, + 78, 128, 83, 65, 84, 69, 76, 76, 73, 84, 69, 128, 83, 65, 84, 69, 76, 76, + 73, 84, 197, 83, 65, 84, 67, 72, 69, 76, 128, 83, 65, 84, 65, 78, 71, 65, + 128, 83, 65, 83, 72, 128, 83, 65, 83, 65, 75, 128, 83, 65, 82, 73, 128, + 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 81, 128, 83, 65, 80, 65, 128, + 83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, + 84, 73, 73, 77, 85, 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, + 50, 128, 83, 65, 78, 68, 72, 201, 83, 65, 78, 68, 65, 76, 128, 83, 65, + 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, 203, 83, 65, 77, + 86, 65, 84, 128, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, + 128, 83, 65, 77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, + 69, 75, 200, 83, 65, 77, 66, 65, 128, 83, 65, 77, 65, 82, 73, 84, 65, + 206, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, 128, 83, 65, 76, 84, + 73, 76, 76, 79, 128, 83, 65, 76, 84, 45, 50, 128, 83, 65, 76, 84, 128, + 83, 65, 76, 212, 83, 65, 76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, + 76, 193, 83, 65, 76, 65, 205, 83, 65, 76, 65, 128, 83, 65, 76, 45, 65, + 77, 77, 79, 78, 73, 65, 67, 128, 83, 65, 76, 128, 83, 65, 75, 79, 84, + 128, 83, 65, 75, 69, 85, 65, 69, 128, 83, 65, 75, 197, 83, 65, 74, 68, + 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, 76, 128, + 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 72, 128, 83, 65, 71, 73, 84, 84, + 65, 82, 73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, 128, 83, 65, + 199, 83, 65, 70, 72, 65, 128, 83, 65, 70, 69, 84, 217, 83, 65, 68, 72, + 69, 128, 83, 65, 68, 69, 128, 83, 65, 68, 128, 83, 65, 196, 83, 65, 67, + 82, 73, 70, 73, 67, 73, 65, 204, 83, 65, 65, 73, 128, 83, 65, 65, 68, 72, + 85, 128, 83, 65, 45, 73, 128, 83, 65, 45, 50, 128, 83, 48, 52, 54, 128, + 83, 48, 52, 53, 128, 83, 48, 52, 52, 128, 83, 48, 52, 51, 128, 83, 48, + 52, 50, 128, 83, 48, 52, 49, 128, 83, 48, 52, 48, 128, 83, 48, 51, 57, + 128, 83, 48, 51, 56, 128, 83, 48, 51, 55, 128, 83, 48, 51, 54, 128, 83, + 48, 51, 53, 65, 128, 83, 48, 51, 53, 128, 83, 48, 51, 52, 128, 83, 48, + 51, 51, 128, 83, 48, 51, 50, 128, 83, 48, 51, 49, 128, 83, 48, 51, 48, + 128, 83, 48, 50, 57, 128, 83, 48, 50, 56, 128, 83, 48, 50, 55, 128, 83, + 48, 50, 54, 66, 128, 83, 48, 50, 54, 65, 128, 83, 48, 50, 54, 128, 83, + 48, 50, 53, 128, 83, 48, 50, 52, 128, 83, 48, 50, 51, 128, 83, 48, 50, + 50, 128, 83, 48, 50, 49, 128, 83, 48, 50, 48, 128, 83, 48, 49, 57, 128, + 83, 48, 49, 56, 128, 83, 48, 49, 55, 65, 128, 83, 48, 49, 55, 128, 83, + 48, 49, 54, 128, 83, 48, 49, 53, 128, 83, 48, 49, 52, 66, 128, 83, 48, + 49, 52, 65, 128, 83, 48, 49, 52, 128, 83, 48, 49, 51, 128, 83, 48, 49, + 50, 128, 83, 48, 49, 49, 128, 83, 48, 49, 48, 128, 83, 48, 48, 57, 128, + 83, 48, 48, 56, 128, 83, 48, 48, 55, 128, 83, 48, 48, 54, 65, 128, 83, + 48, 48, 54, 128, 83, 48, 48, 53, 128, 83, 48, 48, 52, 128, 83, 48, 48, + 51, 128, 83, 48, 48, 50, 65, 128, 83, 48, 48, 50, 128, 83, 48, 48, 49, + 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, 196, 82, 89, 89, 128, + 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, 128, 82, 89, 82, 128, + 82, 89, 80, 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, 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, 66, 76, 197, 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, 78, 73, 65, 206, 82, 79, 77, + 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 69, 210, 82, 79, 76, 76, 69, + 68, 45, 85, 208, 82, 79, 72, 73, 78, 71, 89, 193, 82, 79, 71, 128, 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, 77, 84, 128, 82, 76, 79, 128, + 82, 76, 77, 128, 82, 76, 73, 128, 82, 76, 69, 128, 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, 71, 73, 78, 199, 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, 85, 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, 84, 73, 84, 73, 79, - 206, 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, 89, 65, 128, 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, 79, 82, 77, 69, - 196, 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, 75, 65, 65, 82, 65, 65, 78, 83, 65, 89, 65, 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, 72, 128, 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, - 65, 45, 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, 82, 48, 49, 56, 128, 82, 48, 49, 55, - 128, 82, 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, - 82, 48, 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, - 49, 49, 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, - 57, 128, 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, - 82, 48, 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, - 48, 48, 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, - 48, 48, 50, 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, - 88, 128, 81, 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, - 82, 128, 81, 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, - 69, 128, 81, 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, - 128, 81, 87, 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, - 65, 128, 81, 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, - 86, 128, 81, 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, - 89, 65, 128, 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, - 85, 79, 88, 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, - 206, 81, 85, 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, - 75, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, 67, 69, 128, 81, 85, 73, - 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, 78, 88, 128, - 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 76, 128, 81, 85, 73, - 67, 203, 81, 85, 73, 128, 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, - 78, 69, 196, 81, 85, 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, - 79, 206, 81, 85, 69, 69, 78, 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, - 81, 85, 66, 85, 84, 83, 128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, - 85, 65, 82, 84, 69, 82, 83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, - 65, 82, 84, 69, 82, 128, 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 78, 84, - 73, 84, 217, 81, 85, 65, 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, - 78, 84, 128, 81, 85, 65, 68, 82, 65, 78, 212, 81, 85, 65, 68, 128, 81, - 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, - 79, 84, 128, 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, - 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, - 128, 81, 79, 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, - 81, 73, 84, 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 69, 88, 128, - 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, - 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, - 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, - 128, 81, 72, 73, 128, 81, 72, 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, - 65, 128, 81, 72, 65, 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, - 81, 69, 69, 128, 81, 69, 128, 81, 65, 85, 128, 81, 65, 84, 65, 78, 128, - 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, 65, 80, - 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, 81, 65, - 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, 81, 65, - 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, 128, 81, - 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, 81, 48, - 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, 51, - 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, 89, 88, - 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, 89, 80, - 128, 80, 89, 128, 80, 87, 79, 89, 128, 80, 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, 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, 78, 65, 77, 65, 128, 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, 49, 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, 84, 69, 67, 84, 69, 196, 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, 71, 82, 65, 205, 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, 86, 65, 84, 197, 80, 82, 73, 86, 65, 67, 217, - 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, 84, 128, 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, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, - 197, 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, 85, - 128, 80, 76, 79, 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, - 72, 82, 79, 78, 128, 80, 76, 68, 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, 73, 84, 84, 69, 196, 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, - 76, 128, 80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, - 206, 80, 69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, - 200, 80, 69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, - 83, 72, 73, 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69, - 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, 69, 83, - 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, 69, 68, - 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 67, 72, 128, 80, - 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 73, 128, 80, 68, 70, - 128, 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, 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, 83, 65, 78, 71, 65, 206, 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, 79, 78, 71, 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, - 72, 128, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, - 80, 65, 68, 68, 73, 78, 199, 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, + 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71, 72, 84, 45, 76, 73, + 71, 72, 84, 69, 196, 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, 66, 66, 79, + 206, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, + 207, 82, 72, 65, 128, 82, 72, 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, 45, 83, 67, + 72, 87, 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, + 85, 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, 84, 73, 84, 73, + 79, 206, 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, 89, 65, 128, 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, 73, 78, 68, 69, 210, + 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, 73, 128, + 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, 79, 82, 77, 69, 196, 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, 68, 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, 67, 69, 73, + 86, 69, 210, 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, 211, 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, 75, 65, 65, 82, 65, 65, 78, 83, 65, 89, 65, 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, 72, 128, 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, 67, 73, 78, 199, 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, 65, 45, 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, 82, 48, 49, 56, + 128, 82, 48, 49, 55, 128, 82, 48, 49, 54, 65, 128, 82, 48, 49, 54, 128, + 82, 48, 49, 53, 128, 82, 48, 49, 52, 128, 82, 48, 49, 51, 128, 82, 48, + 49, 50, 128, 82, 48, 49, 49, 128, 82, 48, 49, 48, 65, 128, 82, 48, 49, + 48, 128, 82, 48, 48, 57, 128, 82, 48, 48, 56, 128, 82, 48, 48, 55, 128, + 82, 48, 48, 54, 128, 82, 48, 48, 53, 128, 82, 48, 48, 52, 128, 82, 48, + 48, 51, 66, 128, 82, 48, 48, 51, 65, 128, 82, 48, 48, 51, 128, 82, 48, + 48, 50, 65, 128, 82, 48, 48, 50, 128, 82, 48, 48, 49, 128, 82, 45, 67, + 82, 69, 197, 81, 89, 88, 128, 81, 89, 85, 128, 81, 89, 84, 128, 81, 89, + 82, 88, 128, 81, 89, 82, 128, 81, 89, 80, 128, 81, 89, 79, 128, 81, 89, + 73, 128, 81, 89, 69, 69, 128, 81, 89, 69, 128, 81, 89, 65, 65, 128, 81, + 89, 65, 128, 81, 89, 128, 81, 87, 73, 128, 81, 87, 69, 69, 128, 81, 87, + 69, 128, 81, 87, 65, 65, 128, 81, 87, 65, 128, 81, 85, 88, 128, 81, 85, + 86, 128, 81, 85, 85, 86, 128, 81, 85, 85, 128, 81, 85, 84, 128, 81, 85, + 83, 72, 83, 72, 65, 89, 65, 128, 81, 85, 82, 88, 128, 81, 85, 82, 128, + 81, 85, 80, 128, 81, 85, 79, 88, 128, 81, 85, 79, 84, 197, 81, 85, 79, + 84, 65, 84, 73, 79, 206, 81, 85, 79, 84, 128, 81, 85, 79, 80, 128, 81, + 85, 79, 128, 81, 85, 75, 128, 81, 85, 73, 78, 84, 69, 83, 83, 69, 78, 67, + 69, 128, 81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, + 67, 85, 78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, + 212, 81, 85, 73, 76, 76, 128, 81, 85, 73, 67, 203, 81, 85, 73, 128, 81, + 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, 69, 196, 81, 85, 69, 83, 84, + 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, 206, 81, 85, 69, 69, 78, + 128, 81, 85, 69, 69, 206, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, 128, + 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, 83, + 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, 128, + 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 78, 84, 73, 84, 217, 81, 85, 65, + 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, 85, 65, + 68, 82, 65, 78, 212, 81, 85, 65, 68, 67, 79, 76, 79, 78, 128, 81, 85, 65, + 68, 128, 81, 85, 65, 196, 81, 85, 65, 128, 81, 85, 128, 81, 208, 81, 79, + 88, 128, 81, 79, 84, 128, 81, 79, 80, 72, 128, 81, 79, 80, 65, 128, 81, + 79, 80, 128, 81, 79, 79, 128, 81, 79, 207, 81, 79, 70, 128, 81, 79, 198, + 81, 79, 65, 128, 81, 79, 128, 81, 78, 128, 81, 73, 88, 128, 81, 73, 84, + 83, 65, 128, 81, 73, 84, 128, 81, 73, 80, 128, 81, 73, 73, 128, 81, 73, + 69, 88, 128, 81, 73, 69, 84, 128, 81, 73, 69, 80, 128, 81, 73, 69, 128, + 81, 73, 128, 81, 72, 87, 73, 128, 81, 72, 87, 69, 69, 128, 81, 72, 87, + 69, 128, 81, 72, 87, 65, 65, 128, 81, 72, 87, 65, 128, 81, 72, 85, 128, + 81, 72, 79, 80, 72, 128, 81, 72, 79, 128, 81, 72, 73, 128, 81, 72, 69, + 69, 128, 81, 72, 69, 128, 81, 72, 65, 85, 128, 81, 72, 65, 65, 128, 81, + 72, 65, 128, 81, 71, 65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, + 128, 81, 69, 128, 81, 65, 89, 128, 81, 65, 85, 128, 81, 65, 84, 65, 78, + 128, 81, 65, 82, 78, 69, 217, 81, 65, 82, 128, 81, 65, 81, 128, 81, 65, + 80, 72, 128, 81, 65, 77, 65, 84, 83, 128, 81, 65, 77, 65, 84, 211, 81, + 65, 76, 193, 81, 65, 73, 82, 84, 72, 82, 65, 128, 81, 65, 73, 128, 81, + 65, 70, 128, 81, 65, 198, 81, 65, 68, 77, 65, 128, 81, 65, 65, 73, 128, + 81, 65, 65, 70, 85, 128, 81, 65, 65, 70, 128, 81, 48, 48, 55, 128, 81, + 48, 48, 54, 128, 81, 48, 48, 53, 128, 81, 48, 48, 52, 128, 81, 48, 48, + 51, 128, 81, 48, 48, 50, 128, 81, 48, 48, 49, 128, 80, 90, 128, 80, 89, + 88, 128, 80, 89, 84, 128, 80, 89, 82, 88, 128, 80, 89, 82, 128, 80, 89, + 80, 128, 80, 87, 79, 89, 128, 80, 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, 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, 78, 65, 77, 65, 128, 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, 194, 80, 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, + 128, 80, 85, 49, 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, 65, 76, 84, 69, 210, 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, 84, + 69, 67, 84, 69, 196, 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, 79, 82, 128, 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, 72, 73, 66, 73, 84, 69, + 196, 80, 82, 79, 71, 82, 69, 83, 83, 128, 80, 82, 79, 71, 82, 65, 205, + 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, 86, + 65, 84, 197, 80, 82, 73, 86, 65, 67, 217, 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, 69, + 82, 128, 80, 82, 73, 78, 84, 69, 210, 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, 84, 128, 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, 84, 65, + 66, 76, 197, 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, 77, 77, 69, 69, 128, 80, 79, 77, 77, 69, 197, + 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, + 67, 75, 69, 212, 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, 84, 65, 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, 85, 128, 80, 76, 79, 87, 128, + 80, 76, 79, 80, 72, 85, 128, 80, 76, 72, 65, 85, 128, 80, 76, 69, 84, 72, + 82, 79, 78, 128, 80, 76, 68, 128, 80, 76, 65, 89, 73, 78, 199, 80, 76, + 65, 84, 69, 128, 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, 82, 65, 67, 89, 128, + 80, 73, 82, 50, 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, 84, 85, 82, 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, 66, 128, 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, 72, 178, 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, 78, 73, 206, 80, 69, 82, + 77, 73, 84, 84, 69, 196, 80, 69, 82, 77, 73, 195, 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, 80, 69, 82, 128, 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, 78, 65, 78, 84, 128, 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, 76, 128, 80, 69, 206, 80, + 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, 69, + 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, 69, + 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, 83, 72, 73, + 128, 80, 69, 69, 80, 128, 80, 69, 69, 77, 128, 80, 69, 69, 73, 128, 80, + 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 83, 128, 80, 69, 68, + 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, 69, 83, 84, 65, 76, 128, 80, + 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, 204, 80, 69, 65, 67, 72, + 128, 80, 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 73, 128, 80, + 68, 70, 128, 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, 85, 128, 80, 65, 213, 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, 83, 69, 78, 71, 69, 210, 80, 65, 83, + 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, 128, 80, 65, 83, 69, 81, 128, + 80, 65, 83, 65, 78, 71, 65, 206, 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, 75, + 128, 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, 69, 78, 84, 72, 69, 83, 69, 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, + 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, 79, 78, 71, 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, 77, 89, 82, 69, 78, 197, 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, 78, 84, 66, 82, 85, 83, 72, 128, 80, 65, 73, 128, + 80, 65, 72, 76, 65, 86, 201, 80, 65, 72, 128, 80, 65, 71, 69, 83, 128, + 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80, 65, + 68, 68, 73, 78, 199, 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, 83, 67, 128, 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, 68, 69, 210, 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, 82, 65, 84, 73, 78, 199, 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, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, - 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, 73, 78, 197, 79, 78, - 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 79, 77, 73, 83, 83, 73, 79, - 206, 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, - 77, 69, 71, 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, - 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, 79, - 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, 73, - 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, 77, - 128, 79, 72, 205, 79, 71, 82, 69, 128, 79, 71, 79, 78, 69, 75, 128, 79, - 71, 79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 70, 70, 73, 67, 69, 82, - 128, 79, 70, 70, 73, 67, 69, 128, 79, 70, 70, 73, 67, 197, 79, 70, 70, - 128, 79, 69, 89, 128, 79, 69, 75, 128, 79, 68, 69, 78, 128, 79, 68, 196, - 79, 67, 84, 79, 80, 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, - 84, 69, 212, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, 79, 67, 67, 76, - 85, 83, 73, 79, 78, 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, - 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, 73, 76, 73, 128, - 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, 79, 66, 69, 76, 85, - 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, 79, 65, 89, 128, 79, - 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, 128, 79, 193, 79, 48, - 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, 48, 65, 128, 79, 48, - 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, 128, 79, 48, 52, 55, - 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, 48, 52, 52, 128, 79, - 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, 49, 128, 79, 48, 52, - 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, 79, 48, 51, 55, 128, - 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, 79, 48, 51, 54, 66, - 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, 79, 48, 51, 53, 128, - 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, 48, 51, 51, 128, 79, - 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, 48, 65, 128, 79, 48, - 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, 57, 128, 79, 48, 50, - 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, 79, 48, 50, 53, 65, - 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, 79, 48, 50, 52, 128, - 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, 50, 49, 128, 79, 48, - 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, 57, 65, 128, 79, 48, - 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, 128, 79, 48, 49, 54, - 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, 48, 49, 51, 128, 79, - 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, 48, 67, 128, 79, 48, - 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, 49, 48, 128, 79, 48, - 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, 128, 79, 48, 48, 54, - 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, 68, 128, 79, 48, 48, - 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, 54, 65, 128, 79, 48, - 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, 53, 128, 79, 48, 48, - 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, 79, 48, 48, 49, 65, - 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, 45, 79, 45, 73, 128, - 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, 84, 128, 78, 90, 89, - 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, 128, 78, 90, 89, 128, - 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, 90, 85, 82, 128, 78, - 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, 79, 88, 128, 78, 90, - 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, 90, 79, 88, 128, 78, - 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, 84, 128, 78, 90, 73, - 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, 80, 128, 78, 90, 73, - 69, 128, 78, 90, 73, 128, 78, 90, 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, 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, 72, 65, 128, 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, 72, 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, 76, 128, 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, 49, 177, 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, 199, 79, 86, 69, 82, 76, 65, 80, 128, 79, 86, 69, 82, 76, 65, 73, 68, + 128, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 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, 83, 67, 128, 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, 68, + 69, 210, 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, 82, 65, 84, 73, 78, 199, 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, 79, 128, 79, 80, 69, 78, 45, 207, 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, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, + 85, 128, 79, 79, 72, 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, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, + 65, 217, 79, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 79, 78, 69, 45, 76, + 73, 78, 197, 79, 78, 67, 79, 77, 73, 78, 199, 79, 78, 65, 80, 128, 79, + 77, 73, 83, 83, 73, 79, 206, 79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, + 67, 82, 79, 206, 79, 77, 69, 71, 65, 128, 79, 77, 69, 71, 193, 79, 77, + 65, 76, 79, 78, 128, 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, + 79, 76, 68, 128, 79, 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, + 82, 193, 79, 74, 73, 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, + 76, 128, 79, 73, 204, 79, 72, 77, 128, 79, 72, 205, 79, 71, 82, 69, 128, + 79, 71, 79, 78, 69, 75, 128, 79, 71, 79, 78, 69, 203, 79, 71, 72, 65, + 205, 79, 70, 70, 73, 67, 69, 82, 128, 79, 70, 70, 73, 67, 69, 128, 79, + 70, 70, 73, 67, 197, 79, 70, 70, 128, 79, 69, 89, 128, 79, 69, 75, 128, + 79, 68, 69, 78, 128, 79, 68, 68, 128, 79, 68, 196, 79, 67, 84, 79, 80, + 85, 83, 128, 79, 67, 84, 79, 66, 69, 82, 128, 79, 67, 84, 69, 212, 79, + 67, 84, 65, 71, 79, 78, 128, 79, 67, 210, 79, 67, 76, 79, 67, 75, 128, + 79, 67, 67, 76, 85, 83, 73, 79, 78, 128, 79, 66, 83, 84, 82, 85, 67, 84, + 73, 79, 78, 128, 79, 66, 79, 76, 211, 79, 66, 79, 204, 79, 66, 79, 70, + 73, 76, 73, 128, 79, 66, 76, 73, 81, 85, 197, 79, 66, 74, 69, 67, 212, + 79, 66, 69, 76, 85, 83, 128, 79, 66, 69, 76, 79, 83, 128, 79, 66, 128, + 79, 65, 89, 128, 79, 65, 75, 128, 79, 65, 66, 79, 65, 70, 73, 76, 73, + 128, 79, 193, 79, 48, 53, 49, 128, 79, 48, 53, 48, 66, 128, 79, 48, 53, + 48, 65, 128, 79, 48, 53, 48, 128, 79, 48, 52, 57, 128, 79, 48, 52, 56, + 128, 79, 48, 52, 55, 128, 79, 48, 52, 54, 128, 79, 48, 52, 53, 128, 79, + 48, 52, 52, 128, 79, 48, 52, 51, 128, 79, 48, 52, 50, 128, 79, 48, 52, + 49, 128, 79, 48, 52, 48, 128, 79, 48, 51, 57, 128, 79, 48, 51, 56, 128, + 79, 48, 51, 55, 128, 79, 48, 51, 54, 68, 128, 79, 48, 51, 54, 67, 128, + 79, 48, 51, 54, 66, 128, 79, 48, 51, 54, 65, 128, 79, 48, 51, 54, 128, + 79, 48, 51, 53, 128, 79, 48, 51, 52, 128, 79, 48, 51, 51, 65, 128, 79, + 48, 51, 51, 128, 79, 48, 51, 50, 128, 79, 48, 51, 49, 128, 79, 48, 51, + 48, 65, 128, 79, 48, 51, 48, 128, 79, 48, 50, 57, 65, 128, 79, 48, 50, + 57, 128, 79, 48, 50, 56, 128, 79, 48, 50, 55, 128, 79, 48, 50, 54, 128, + 79, 48, 50, 53, 65, 128, 79, 48, 50, 53, 128, 79, 48, 50, 52, 65, 128, + 79, 48, 50, 52, 128, 79, 48, 50, 51, 128, 79, 48, 50, 50, 128, 79, 48, + 50, 49, 128, 79, 48, 50, 48, 65, 128, 79, 48, 50, 48, 128, 79, 48, 49, + 57, 65, 128, 79, 48, 49, 57, 128, 79, 48, 49, 56, 128, 79, 48, 49, 55, + 128, 79, 48, 49, 54, 128, 79, 48, 49, 53, 128, 79, 48, 49, 52, 128, 79, + 48, 49, 51, 128, 79, 48, 49, 50, 128, 79, 48, 49, 49, 128, 79, 48, 49, + 48, 67, 128, 79, 48, 49, 48, 66, 128, 79, 48, 49, 48, 65, 128, 79, 48, + 49, 48, 128, 79, 48, 48, 57, 128, 79, 48, 48, 56, 128, 79, 48, 48, 55, + 128, 79, 48, 48, 54, 70, 128, 79, 48, 48, 54, 69, 128, 79, 48, 48, 54, + 68, 128, 79, 48, 48, 54, 67, 128, 79, 48, 48, 54, 66, 128, 79, 48, 48, + 54, 65, 128, 79, 48, 48, 54, 128, 79, 48, 48, 53, 65, 128, 79, 48, 48, + 53, 128, 79, 48, 48, 52, 128, 79, 48, 48, 51, 128, 79, 48, 48, 50, 128, + 79, 48, 48, 49, 65, 128, 79, 48, 48, 49, 128, 79, 45, 89, 69, 128, 79, + 45, 79, 45, 73, 128, 79, 45, 69, 128, 78, 90, 89, 88, 128, 78, 90, 89, + 84, 128, 78, 90, 89, 82, 88, 128, 78, 90, 89, 82, 128, 78, 90, 89, 80, + 128, 78, 90, 89, 128, 78, 90, 85, 88, 128, 78, 90, 85, 82, 88, 128, 78, + 90, 85, 82, 128, 78, 90, 85, 81, 128, 78, 90, 85, 80, 128, 78, 90, 85, + 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 206, 78, 90, 85, 128, 78, + 90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, + 84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, + 80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 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, 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, 78, 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, 78, 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, 78, + 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, 72, 65, 128, 78, 89, 69, 84, 128, 78, 89, 69, 212, 78, + 89, 69, 78, 128, 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, 72, 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, 76, + 128, 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, 49, 177, 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, 88, 73, 86, 128, 78, 84, + 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 85, 74, 128, 78, 84, 213, 78, + 84, 83, 65, 85, 128, 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 79, 71, + 128, 78, 84, 79, 199, 78, 84, 73, 69, 197, 78, 84, 72, 65, 85, 128, 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, 65, 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, 211, 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, 81, 73, 71, 128, 78, 79, 89, 128, + 78, 79, 88, 128, 78, 79, 87, 67, 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, 65, 84, 73, 79, 206, 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, 72, 69, 65, 83, 84, 45, 80, 79, 73, 78, 84, 73, + 78, 199, 78, 79, 82, 77, 65, 204, 78, 79, 82, 68, 73, 195, 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, 72, 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, 78, 66, - 83, 80, 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, 76, 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, 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, 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, 72, - 65, 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, - 72, 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, 76, 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, 72, 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, 78, 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, 75, 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, + 69, 65, 75, 73, 78, 199, 78, 79, 78, 128, 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, 72, 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, 78, 66, 83, 80, 128, 78, 77, 128, 78, 76, 65, 85, 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, 76, 128, 78, + 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, 75, 65, + 85, 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, 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, 78, + 57, 128, 78, 73, 78, 128, 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, 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, 78, 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, 72, 65, 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, 65, 128, 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, + 65, 65, 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, 72, 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, 76, + 73, 78, 197, 78, 69, 87, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, + 84, 69, 82, 128, 78, 69, 84, 87, 79, 82, 75, 69, 196, 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, 79, 69, 128, 78, 69, 78, 65, 78, 79, 128, 78, 69, + 78, 128, 78, 69, 76, 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, 67, 72, 65, 85, 128, 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, 72, 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, + 78, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 83, 65, + 204, 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, + 75, 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, 66, + 65, 84, 65, 69, 65, 206, 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, 65, 45, 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, 83, 128, 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, 83, 80, 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, 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, + 193, 78, 65, 52, 128, 78, 65, 50, 128, 78, 65, 45, 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, 83, 128, 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, 83, 128, 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, 78, 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, + 78, 128, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, 200, 77, 85, + 67, 65, 65, 68, 128, 77, 85, 65, 83, 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, 82, 207, 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, 79, 82, 87, 65, 89, 128, 77, 79, + 84, 79, 82, 67, 89, 67, 76, 69, 128, 77, 79, 84, 79, 210, 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, 68, 128, + 77, 79, 79, 196, 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, 201, + 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, 77, 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, 83, 80, 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, 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, 73, 90, + 69, 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, 83, 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, 73, 84, 65, 82, 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, 68, 45, 76, 69, 86, 69, 204, 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, 73, 67, 210, 77, 72, 90, 128, 77, 72, 65, 128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, @@ -2018,161 +2115,219 @@ 77, 69, 82, 79, 73, 84, 73, 195, 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, 128, 77, 69, 69, - 77, 85, 128, 77, 69, 69, 77, 128, 77, 69, 69, 69, 69, 128, 77, 69, 68, + 82, 67, 85, 82, 217, 77, 69, 78, 79, 69, 128, 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, 202, 77, 69, 69, 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, 196, 77, 67, 72, 213, 77, 67, - 72, 65, 206, 77, 195, 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, 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, 76, 73, 78, 197, 77, 65, 82, 89, 128, 77, 65, 82, 85, 75, 85, - 128, 77, 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, 89, 73, 78, 199, - 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 75, 69, 82, 128, 77, 65, 82, - 75, 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, 82, 75, 45, 50, - 128, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, 77, 65, 82, 67, - 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, 67, 65, 84, 79, - 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 83, 73, 84, 69, - 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, - 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, 81, 128, 77, 65, 80, 76, - 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 79, 128, 77, 65, 78, - 83, 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, 65, - 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, - 65, 78, 68, 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, 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, 69, 68, 73, 67, 65, 204, 77, 69, 68, 65, 76, 128, 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, + 196, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 195, 77, 66, 85, 85, 128, + 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, 73, 90, 69, 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, 76, 73, 78, + 197, 77, 65, 82, 89, 128, 77, 65, 82, 87, 65, 82, 201, 77, 65, 82, 85, + 75, 85, 128, 77, 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, 89, 73, 78, + 199, 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 75, 211, 77, 65, 82, + 75, 69, 82, 128, 77, 65, 82, 75, 45, 52, 128, 77, 65, 82, 75, 45, 51, + 128, 77, 65, 82, 75, 45, 50, 128, 77, 65, 82, 75, 45, 49, 128, 77, 65, + 82, 69, 128, 77, 65, 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, + 84, 65, 67, 67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, + 82, 67, 65, 83, 73, 84, 69, 128, 77, 65, 82, 66, 85, 84, 65, 128, 77, 65, + 82, 66, 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, 65, 70, 128, 77, 65, + 81, 128, 77, 65, 80, 76, 197, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, + 65, 79, 128, 77, 65, 78, 84, 69, 76, 80, 73, 69, 67, 197, 77, 65, 78, 83, + 89, 79, 78, 128, 77, 65, 78, 83, 85, 65, 69, 128, 77, 65, 78, 78, 65, + 218, 77, 65, 78, 78, 65, 128, 77, 65, 78, 73, 67, 72, 65, 69, 65, 206, + 77, 65, 78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 68, 65, 73, 76, 73, 78, + 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, 78, + 65, 212, 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, 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, 89, 89, 65, - 65, 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, + 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 74, 65, 78, 201, 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, 89, 89, 65, 65, 128, 77, 65, 65, 73, 128, 77, 65, + 65, 128, 77, 65, 50, 128, 77, 49, 57, 183, 77, 49, 57, 182, 77, 49, 57, + 181, 77, 49, 57, 180, 77, 49, 57, 179, 77, 49, 57, 178, 77, 49, 57, 177, + 77, 49, 57, 176, 77, 49, 56, 185, 77, 49, 56, 184, 77, 49, 56, 183, 77, + 49, 56, 182, 77, 49, 56, 181, 77, 49, 56, 180, 77, 49, 56, 179, 77, 49, + 56, 178, 77, 49, 56, 177, 77, 49, 56, 176, 77, 49, 55, 185, 77, 49, 55, + 184, 77, 49, 55, 183, 77, 49, 55, 182, 77, 49, 55, 181, 77, 49, 55, 180, + 77, 49, 55, 179, 77, 49, 55, 178, 77, 49, 55, 177, 77, 49, 55, 176, 77, + 49, 54, 185, 77, 49, 54, 184, 77, 49, 54, 183, 77, 49, 54, 182, 77, 49, + 54, 181, 77, 49, 54, 180, 77, 49, 54, 179, 77, 49, 54, 178, 77, 49, 54, + 177, 77, 49, 54, 176, 77, 49, 53, 185, 77, 49, 53, 184, 77, 49, 53, 183, + 77, 49, 53, 182, 77, 49, 53, 181, 77, 49, 53, 180, 77, 49, 53, 179, 77, + 49, 53, 178, 77, 49, 53, 177, 77, 49, 53, 176, 77, 49, 52, 185, 77, 49, + 52, 184, 77, 49, 52, 183, 77, 49, 52, 182, 77, 49, 52, 181, 77, 49, 52, + 180, 77, 49, 52, 179, 77, 49, 52, 178, 77, 49, 52, 177, 77, 49, 52, 176, + 77, 49, 51, 185, 77, 49, 51, 184, 77, 49, 51, 183, 77, 49, 51, 182, 77, + 49, 51, 181, 77, 49, 51, 180, 77, 49, 51, 179, 77, 49, 51, 178, 77, 49, + 51, 177, 77, 49, 51, 176, 77, 49, 50, 185, 77, 49, 50, 184, 77, 49, 50, + 183, 77, 49, 50, 182, 77, 49, 50, 181, 77, 49, 50, 180, 77, 49, 50, 179, + 77, 49, 50, 178, 77, 49, 50, 177, 77, 49, 50, 176, 77, 49, 49, 185, 77, + 49, 49, 184, 77, 49, 49, 183, 77, 49, 49, 182, 77, 49, 49, 181, 77, 49, + 49, 180, 77, 49, 49, 179, 77, 49, 49, 178, 77, 49, 49, 177, 77, 49, 49, + 176, 77, 49, 48, 185, 77, 49, 48, 184, 77, 49, 48, 183, 77, 49, 48, 182, + 77, 49, 48, 181, 77, 49, 48, 180, 77, 49, 48, 179, 77, 49, 48, 178, 77, + 49, 48, 177, 77, 49, 48, 176, 77, 48, 57, 185, 77, 48, 57, 184, 77, 48, + 57, 183, 77, 48, 57, 182, 77, 48, 57, 181, 77, 48, 57, 180, 77, 48, 57, + 179, 77, 48, 57, 178, 77, 48, 57, 177, 77, 48, 57, 176, 77, 48, 56, 185, + 77, 48, 56, 184, 77, 48, 56, 183, 77, 48, 56, 182, 77, 48, 56, 181, 77, + 48, 56, 180, 77, 48, 56, 179, 77, 48, 56, 178, 77, 48, 56, 177, 77, 48, + 56, 176, 77, 48, 55, 185, 77, 48, 55, 184, 77, 48, 55, 183, 77, 48, 55, + 182, 77, 48, 55, 181, 77, 48, 55, 180, 77, 48, 55, 179, 77, 48, 55, 178, + 77, 48, 55, 177, 77, 48, 55, 176, 77, 48, 54, 185, 77, 48, 54, 184, 77, + 48, 54, 183, 77, 48, 54, 182, 77, 48, 54, 181, 77, 48, 54, 180, 77, 48, + 54, 179, 77, 48, 54, 178, 77, 48, 54, 177, 77, 48, 54, 176, 77, 48, 53, + 185, 77, 48, 53, 184, 77, 48, 53, 183, 77, 48, 53, 182, 77, 48, 53, 181, + 77, 48, 53, 180, 77, 48, 53, 179, 77, 48, 53, 178, 77, 48, 53, 177, 77, + 48, 53, 176, 77, 48, 52, 185, 77, 48, 52, 184, 77, 48, 52, 183, 77, 48, + 52, 182, 77, 48, 52, 181, 77, 48, 52, 52, 128, 77, 48, 52, 180, 77, 48, + 52, 51, 128, 77, 48, 52, 179, 77, 48, 52, 50, 128, 77, 48, 52, 178, 77, + 48, 52, 49, 128, 77, 48, 52, 177, 77, 48, 52, 48, 65, 128, 77, 48, 52, + 48, 128, 77, 48, 52, 176, 77, 48, 51, 57, 128, 77, 48, 51, 185, 77, 48, + 51, 56, 128, 77, 48, 51, 184, 77, 48, 51, 55, 128, 77, 48, 51, 183, 77, + 48, 51, 54, 128, 77, 48, 51, 182, 77, 48, 51, 53, 128, 77, 48, 51, 181, + 77, 48, 51, 52, 128, 77, 48, 51, 180, 77, 48, 51, 51, 66, 128, 77, 48, + 51, 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, 51, 179, 77, 48, 51, 50, + 128, 77, 48, 51, 178, 77, 48, 51, 49, 65, 128, 77, 48, 51, 49, 128, 77, + 48, 51, 177, 77, 48, 51, 48, 128, 77, 48, 51, 176, 77, 48, 50, 57, 128, + 77, 48, 50, 185, 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, 48, + 50, 184, 77, 48, 50, 55, 128, 77, 48, 50, 183, 77, 48, 50, 54, 128, 77, + 48, 50, 182, 77, 48, 50, 53, 128, 77, 48, 50, 181, 77, 48, 50, 52, 65, + 128, 77, 48, 50, 52, 128, 77, 48, 50, 180, 77, 48, 50, 51, 128, 77, 48, + 50, 179, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, 50, 178, + 77, 48, 50, 49, 128, 77, 48, 50, 177, 77, 48, 50, 48, 128, 77, 48, 50, + 176, 77, 48, 49, 57, 128, 77, 48, 49, 185, 77, 48, 49, 56, 128, 77, 48, + 49, 184, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, 183, + 77, 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 182, 77, 48, + 49, 53, 65, 128, 77, 48, 49, 53, 128, 77, 48, 49, 181, 77, 48, 49, 52, + 128, 77, 48, 49, 180, 77, 48, 49, 51, 128, 77, 48, 49, 179, 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, 82, 79, 128, 76, 82, - 77, 128, 76, 82, 73, 128, 76, 82, 69, 128, 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, 69, 196, 76, 79, - 79, 80, 128, 76, 79, 79, 208, 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, 75, 73, 78, - 71, 45, 83, 72, 73, 70, 212, 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, 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, + 48, 49, 178, 77, 48, 49, 49, 128, 77, 48, 49, 177, 77, 48, 49, 48, 65, + 128, 77, 48, 49, 48, 128, 77, 48, 49, 176, 77, 48, 48, 57, 128, 77, 48, + 48, 185, 77, 48, 48, 56, 128, 77, 48, 48, 184, 77, 48, 48, 55, 128, 77, + 48, 48, 183, 77, 48, 48, 54, 128, 77, 48, 48, 182, 77, 48, 48, 53, 128, + 77, 48, 48, 181, 77, 48, 48, 52, 128, 77, 48, 48, 180, 77, 48, 48, 51, + 65, 128, 77, 48, 48, 51, 128, 77, 48, 48, 179, 77, 48, 48, 50, 128, 77, + 48, 48, 178, 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, 128, 77, 48, + 48, 49, 128, 77, 48, 48, 177, 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, 73, 84, 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, 197, 76, + 85, 66, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, + 76, 85, 178, 76, 82, 79, 128, 76, 82, 77, 128, 76, 82, 73, 128, 76, 82, + 69, 128, 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, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 76, 79, 87, 45, 77, + 73, 196, 76, 79, 87, 45, 70, 65, 76, 76, 73, 78, 199, 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, 69, 196, 76, 79, 79, 80, 128, 76, 79, 79, 208, 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, 75, 73, 78, 71, 45, 83, 72, 73, 70, 212, 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, 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, 200, + 76, 73, 84, 128, 76, 73, 83, 213, 76, 73, 83, 128, 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, 75, 69, 196, 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, 78, 73, + 78, 199, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, + 128, 76, 73, 70, 84, 69, 82, 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, 85, 128, 76, 69, 213, 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, + 86, 73, 84, 65, 84, 73, 78, 71, 128, 76, 69, 85, 77, 128, 76, 69, 85, 65, + 69, 80, 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 85, 128, 76, 69, 213, + 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, 67, 72, 193, 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, 73, 211, + 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, + 73, 128, 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, 199, 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, 76, 73, 71, 72, 84, 69, 196, 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, @@ -2181,137 +2336,151 @@ 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, 72, 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, 73, 65, 204, 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, 73, - 128, 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, 88, 87, 65, 65, - 128, 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, 128, 75, 88, 73, - 128, 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, 65, 128, 75, 88, - 65, 128, 75, 87, 85, 51, 49, 56, 128, 75, 87, 79, 79, 128, 75, 87, 79, - 128, 75, 87, 73, 73, 128, 75, 87, 73, 128, 75, 87, 69, 69, 128, 75, 87, - 69, 128, 75, 87, 65, 89, 128, 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, - 128, 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, 75, 85, 85, 72, 128, - 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, 85, 50, 128, - 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, 128, 75, 85, 82, - 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, 128, 75, 85, 210, - 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, 128, 75, 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, 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, + 76, 65, 128, 76, 65, 85, 75, 65, 218, 76, 65, 85, 74, 128, 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, 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, 78, 128, 76, 65, 77, 80, 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, 73, 78, 199, 76, 65, 201, 76, 65, 72, 83, + 72, 85, 128, 76, 65, 72, 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, 73, 65, 204, 76, 65, 66, 69, 76, 128, + 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, 54, 128, 76, 52, 128, 76, 51, 128, 76, 50, 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, 73, 128, 75, 88, 87, 69, 69, 128, 75, 88, 87, 69, 128, 75, + 88, 87, 65, 65, 128, 75, 88, 87, 65, 128, 75, 88, 85, 128, 75, 88, 79, + 128, 75, 88, 73, 128, 75, 88, 69, 69, 128, 75, 88, 69, 128, 75, 88, 65, + 65, 128, 75, 88, 65, 128, 75, 87, 86, 128, 75, 87, 85, 51, 49, 56, 128, + 75, 87, 79, 79, 128, 75, 87, 79, 128, 75, 87, 77, 128, 75, 87, 73, 73, + 128, 75, 87, 73, 128, 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 66, + 128, 75, 87, 65, 89, 128, 75, 87, 65, 69, 84, 128, 75, 87, 65, 65, 128, + 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, 75, 85, 86, 128, 75, 85, + 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, 72, + 85, 50, 128, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, + 128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, + 128, 75, 85, 210, 75, 85, 81, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, + 128, 75, 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, 71, 128, 75, 85, 69, 84, 128, 75, 85, 66, 128, 75, + 85, 65, 86, 128, 75, 85, 65, 66, 128, 75, 85, 65, 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, 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, 72, 128, 75, 80, + 65, 128, 75, 79, 88, 128, 75, 79, 86, 85, 85, 128, 75, 79, 86, 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, 86, 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, + 75, 79, 79, 66, 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, 69, 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, 68, 65, 77, 128, 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, - 77, 213, 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, 79, 69, 84, 128, 75, 79, 66, 128, 75, 79, 65, 76, 65, 128, 75, 79, + 65, 128, 75, 78, 79, 66, 83, 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, 87, 128, 75, 73, 86, 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, 73, 66, 128, 75, 73, 65, 86, 128, 75, 73, 65, 66, 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, 68, 65, 87, 65, 68, 201, 75, 72, + 85, 68, 65, 77, 128, 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, 74, 75, 201, 75, 72, 79, 128, 75, 72, 207, 75, 72, 77, 213, 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, 201, 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, 86, 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, 66, 128, 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, 89, 66, 79, 65, 82, 196, 75, 69, 88, + 128, 75, 69, 86, 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, 86, 128, 75, 69, + 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, + 75, 69, 69, 66, 128, 75, 69, 66, 128, 75, 69, 65, 65, 69, 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, 86, 128, + 75, 65, 87, 73, 128, 75, 65, 87, 66, 128, 75, 65, 86, 89, 75, 65, 128, + 75, 65, 86, 128, 75, 65, 85, 86, 128, 75, 65, 85, 78, 65, 128, 75, 65, + 85, 206, 75, 65, 85, 66, 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, 208, 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, 86, 128, 75, 65, 73, 84, + 72, 201, 75, 65, 73, 82, 73, 128, 75, 65, 73, 66, 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, 86, 128, 75, 65, 65, 73, 128, 75, 65, 65, + 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 65, 66, 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, @@ -2319,1509 +2488,1538 @@ 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, 65, 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, - 72, 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, - 79, 76, 65, 84, 69, 128, 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, 82, 79, 68, 85, - 67, 69, 82, 128, 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, 78, 128, 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, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 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, 48, - 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, 128, - 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, 73, - 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, 89, - 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, 69, - 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, 89, - 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, 128, - 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, 45, 65, - 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, 80, 128, - 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, 84, 128, - 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, 89, 80, 79, - 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, 65, 84, 73, - 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, 72, 89, 80, - 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, 71, 128, 72, 88, - 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, 80, 128, 72, - 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, 72, 88, 79, - 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, 84, 128, 72, - 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, 84, 128, 72, - 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, 72, 88, 69, - 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, 88, 128, 72, - 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, 87, 85, 128, - 72, 87, 65, 73, 82, 128, 72, 86, 128, 72, 85, 83, 72, 69, 196, 72, 85, - 82, 65, 78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 128, - 72, 85, 78, 68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, 65, 78, 128, - 72, 85, 77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, - 72, 85, 66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, - 65, 68, 68, 79, 128, 72, 84, 83, 128, 72, 84, 74, 128, 72, 82, 89, 86, - 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, 65, 128, 72, 80, 128, 72, 79, - 85, 83, 197, 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, 85, 82, 71, - 76, 65, 83, 211, 72, 79, 85, 82, 128, 72, 79, 85, 210, 72, 79, 84, 69, - 76, 128, 72, 79, 84, 65, 128, 72, 79, 83, 80, 73, 84, 65, 76, 128, 72, - 79, 82, 83, 69, 128, 72, 79, 82, 83, 197, 72, 79, 82, 78, 83, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 54, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 54, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 54, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 54, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, - 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, - 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, - 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 52, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 51, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 51, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 51, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, - 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, - 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, - 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, - 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, - 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, - 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, - 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, - 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, - 78, 84, 65, 76, 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, - 84, 65, 76, 45, 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 76, 45, 48, 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, - 76, 45, 48, 49, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, - 45, 48, 49, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, - 48, 49, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, - 49, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, - 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, - 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, - 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, - 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, - 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 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, 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, + 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 83, 84, + 73, 67, 75, 128, 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, 88, + 128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 89, 73, 78, 128, + 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, 74, 72, 65, 65, 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, 78, 128, 74, 65, 89, 73, 78, 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, 72, 128, + 74, 65, 68, 69, 128, 74, 65, 67, 75, 83, 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, 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, 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, 83, 67, 69, 76, 69, 211, 73, 83, 79, 78, + 128, 73, 83, 79, 206, 73, 83, 79, 76, 65, 84, 69, 128, 73, 83, 76, 65, + 78, 68, 128, 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, 82, 66, 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, 82, 79, + 68, 85, 67, 69, 82, 128, 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, 82, 79, 66, 65, 78, 199, 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, 73, 68, 197, 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, 216, 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, 82, 69, 65, 83, 197, 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, 78, 128, 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, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 69, 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, 79, 78, 128, 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, + 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, 54, + 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, 128, + 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, 45, + 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, 89, + 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, 45, + 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, 85, + 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, 73, + 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, 90, + 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, 90, + 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, 72, + 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, 78, + 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, 128, + 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, 71, + 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, 79, + 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, 128, + 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, 73, + 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, 69, + 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, 128, + 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, 65, + 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, 72, + 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 87, 65, 72, 128, 72, 86, 128, + 72, 85, 86, 65, 128, 72, 85, 83, 72, 69, 196, 72, 85, 83, 72, 128, 72, + 85, 82, 65, 78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 83, + 128, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, 78, 68, 82, 69, 196, 72, + 85, 78, 128, 72, 85, 77, 65, 78, 128, 72, 85, 77, 65, 206, 72, 85, 76, + 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, 66, 50, 128, 72, 85, 66, + 178, 72, 85, 66, 128, 72, 85, 65, 82, 65, 68, 68, 79, 128, 72, 85, 65, + 78, 128, 72, 84, 83, 128, 72, 84, 74, 128, 72, 82, 89, 86, 78, 73, 193, + 72, 80, 87, 71, 128, 72, 80, 65, 128, 72, 80, 128, 72, 79, 85, 83, 197, + 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, 85, 82, 71, 76, 65, 83, + 211, 72, 79, 85, 82, 128, 72, 79, 85, 210, 72, 79, 84, 69, 76, 128, 72, + 79, 84, 65, 128, 72, 79, 83, 80, 73, 84, 65, 76, 128, 72, 79, 82, 83, 69, + 128, 72, 79, 82, 83, 197, 72, 79, 82, 82, 128, 72, 79, 82, 78, 83, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 54, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 54, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 54, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 54, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 54, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, + 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, + 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, + 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 52, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 51, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 51, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 51, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 51, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, + 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, + 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, + 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, + 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, + 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, + 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, + 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, + 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, + 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, + 78, 84, 65, 76, 45, 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, + 84, 65, 76, 45, 48, 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 76, 45, 48, 49, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, + 76, 45, 48, 49, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, + 45, 48, 49, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, + 48, 49, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, + 48, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, + 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, + 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, + 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, + 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 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, 85, 128, 72, 79, 79, 82, 85, 128, 72, 79, 79, 80, 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, 79, 128, 72, + 79, 76, 76, 79, 215, 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, 82, 79, 71, 76, 89, 80, 72, 73, 195, 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, 69, 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, + 79, 67, 72, 79, 128, 72, 78, 85, 84, 128, 72, 78, 85, 79, 88, 128, 72, + 78, 85, 79, 128, 72, 78, 85, 66, 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, 85, 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, 85, 128, 72, 76, 65, + 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, 128, 72, 76, 128, 72, 75, 128, + 72, 73, 90, 66, 128, 72, 73, 89, 79, 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, 76, 79, 215, 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, 82, 79, + 71, 76, 89, 80, 72, 73, 195, 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, + 89, 84, 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, 69, 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, 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, 87, 74, + 128, 72, 65, 86, 69, 128, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, + 128, 72, 65, 213, 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, 90, 193, 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, 45, 67, 73, 82, 67, 76, 197, 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, 72, 65, 73, 211, 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, 65, 78, 71, 128, 71, 86, 128, 71, 85, 82, 85, 83, + 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 77, 85, 75, 72, 201, 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, 68, 69, 196, 71, 85, - 65, 82, 68, 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, - 73, 77, 65, 67, 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, + 82, 128, 71, 85, 199, 71, 85, 69, 73, 128, 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, + 68, 69, 196, 71, 85, 65, 82, 68, 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, 73, 77, 65, 67, 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, 70, 69, 82, 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, 211, 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, + 71, 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, 77, 69, 76, 128, 71, 72, 73, 128, 71, + 72, 72, 65, 128, 71, 72, 69, 89, 83, 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, 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, 86, 83, 51, 128, 70, 86, 83, 50, 128, 70, 86, 83, 49, 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, 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, 83, 73, 128, 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, 87, 65, - 82, 68, 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, 207, 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, 71, 72, 65, 77, 77, 65, 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, 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, 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, 69, 77, 128, 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, 69, 50, 50, 128, 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, 86, 83, 51, + 128, 70, 86, 83, 50, 128, 70, 86, 83, 49, 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, + 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, 85, 65, 128, 70, 84, 72, 79, 82, 193, + 70, 83, 73, 128, 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, 75, 211, 70, + 82, 65, 78, 195, 70, 82, 65, 77, 69, 83, 128, 70, 82, 65, 77, 69, 128, + 70, 82, 65, 77, 197, 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, 85, 78, 84, 65, 73, 206, 70, 79, 83, 84, 69, 82, 73, 78, 71, + 128, 70, 79, 82, 87, 65, 82, 68, 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, 77, 65, 212, 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, 76, 128, 70, 79, 79, + 68, 128, 70, 79, 79, 128, 70, 79, 78, 212, 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, 79, 71, 128, 70, 207, 70, 77, 128, 70, 76, + 89, 73, 78, 199, 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, 82, 83, 128, 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, 79, 78, + 128, 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, 83, 72, 128, 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, 82, 69, 83, 83, 73, 79, 78, 76, 69, 83, 211, - 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, 88, 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, 84, 66, 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, 67, - 128, 69, 83, 65, 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, + 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, 83, 128, 70, 73, 78, 71, 69, + 82, 211, 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, + 69, 82, 69, 196, 70, 73, 78, 71, 69, 82, 45, 80, 79, 83, 212, 70, 73, 78, + 71, 69, 210, 70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 78, 65, 76, + 128, 70, 73, 76, 205, 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, 77, 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, 77, 128, 70, 65, 76, 76, + 69, 206, 70, 65, 74, 128, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, + 72, 85, 128, 70, 65, 73, 66, 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, 89, 89, 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, 69, 77, + 69, 76, 217, 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, 68, 128, 69, 88, 84, 69, 78, 68, 69, 196, 69, 88, 80, 82, 69, 83, 83, + 73, 79, 78, 76, 69, 83, 211, 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, 88, 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, 84, 69, 82, + 78, 73, 84, 217, 69, 84, 66, 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, 49, + 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 67, 128, 69, 83, 65, 128, + 69, 83, 45, 84, 69, 128, 69, 83, 45, 51, 128, 69, 83, 45, 50, 128, 69, + 83, 45, 49, 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, 76, 65, 84, 69, + 82, 65, 204, 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, 84, 128, 69, 79, - 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 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, 81, 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, 84, 73, 195, 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, 72, 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, 90, 65, 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, 205, 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, + 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 80, 65, 67, 212, 69, + 79, 84, 128, 69, 79, 77, 128, 69, 79, 76, 72, 88, 128, 69, 79, 76, 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, 81, 128, 69, 78, 79, 211, 69, 78, + 78, 73, 128, 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, 84, 73, 195, 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, 66, 65, 83, 65, 206, 69, 76, 65, 77, 73, 84, 69, 128, + 69, 76, 65, 77, 73, 84, 197, 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, 75, 65, 77, 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, + 72, 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, 84, 128, 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, 72, 69, 128, 68, 90, + 90, 69, 128, 68, 90, 90, 65, 128, 68, 90, 89, 65, 89, 128, 68, 90, 87, + 69, 128, 68, 90, 85, 128, 68, 90, 79, 128, 68, 90, 74, 69, 128, 68, 90, + 73, 84, 65, 128, 68, 90, 73, 128, 68, 90, 72, 79, 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, 89, 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, 89, 65, 78, 128, 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, 205, 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, 45, 80, 79, 73, 78, + 84, 73, 78, 199, 68, 79, 87, 78, 128, 68, 79, 86, 69, 128, 68, 79, 86, + 197, 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, @@ -3952,99 +4150,106 @@ 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, 72, 89, 65, 128, 68, 76, 72, 65, 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, 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, 65, 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, 79, 73, 128, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, 211, 68, + 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 67, 85, 77, 69, 78, 84, 128, 68, + 79, 67, 85, 77, 69, 78, 212, 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, 72, 89, 65, 128, 68, 76, + 72, 65, 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, 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, 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, 83, 69, + 204, 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, 45, 82, 73, 78, 71, 128, 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, + 73, 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, 77, 69, 68, 72, 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, 65, 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, 75, 84, 79, 208, 68, 69, 83, 203, 68, 69, 83, 73, 71, + 78, 128, 68, 69, 83, 73, 128, 68, 69, 83, 69, 82, 84, 128, 68, 69, 83, + 69, 82, 212, 68, 69, 83, 69, 82, 69, 212, 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, 82, 69, 76, 73, 67, 212, 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, 69, + 83, 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, - 67, 83, 128, 68, 67, 52, 128, 68, 67, 51, 128, 68, 67, 50, 128, 68, 67, - 49, 128, 68, 194, 68, 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, 217, + 69, 67, 82, 69, 65, 83, 197, 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, 67, 83, 128, 68, 67, 72, 69, 128, 68, 67, + 52, 128, 68, 67, 51, 128, 68, 67, 50, 128, 68, 67, 49, 128, 68, 194, 68, + 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, 217, 68, 65, 87, 66, 128, 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, @@ -4061,285 +4266,310 @@ 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, 71, 69, 210, 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, - 83, 73, 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, 83, 73, 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, 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, 85, 83, 69, 196, 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, 78, 68, 128, 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, 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, + 68, 65, 73, 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, 71, 69, 210, 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, 71, 51, 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, 89, 128, 67, 89, 65, 87, 128, 67, 89, 65, 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, 83, 80, 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, 83, 73, 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, 65, 205, 67, 85, 128, 67, 83, 73, + 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, 70, 79, 82, 205, 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, 89, 79, 78, 128, 67, 82, 65, 67, 75, 69, + 82, 128, 67, 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, 85, 67, + 200, 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, 73, 78, 85, 73, 78, 199, 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, 78, 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, 85, 83, 69, 196, 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, 77, 80, 85, 84, 69, 82, 83, 128, + 67, 79, 77, 80, 85, 84, 69, 82, 128, 67, 79, 77, 80, 82, 69, 83, 83, 73, + 79, 78, 128, 67, 79, 77, 80, 82, 69, 83, 83, 69, 196, 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, + 78, 68, 128, 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, 83, 83, 73, 67, 65, 204, 67, 76, 65, 80, 80, 73, 78, + 199, 67, 76, 65, 80, 80, 69, 210, 67, 76, 65, 78, 128, 67, 76, 65, 206, + 67, 76, 65, 77, 83, 72, 69, 76, 204, 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, 69, 128, 67, 73, 84, 89, 83, 67, 65, 80, 197, 67, 73, + 84, 65, 84, 73, 79, 206, 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, + 73, 78, 199, 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, 206, 67, 73, 205, 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, 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, 87, 86, 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, 89, + 128, 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, 80, 77, 85, 78, 75, 128, 67, 72, 73, 78, + 79, 79, 203, 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, 89, + 128, 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, 72, 69, 73, 75, 72, 65, 78, 128, 67, 72, 69, 69, 82, 73, 78, 199, 67, 72, - 69, 69, 128, 67, 72, 69, 67, 75, 128, 67, 72, 69, 67, 203, 67, 72, 197, - 67, 72, 65, 88, 128, 67, 72, 65, 86, 73, 89, 65, 78, 73, 128, 67, 72, 65, - 84, 84, 65, 87, 65, 128, 67, 72, 65, 84, 128, 67, 72, 65, 82, 84, 128, - 67, 72, 65, 82, 212, 67, 72, 65, 82, 73, 79, 84, 128, 67, 72, 65, 82, 73, - 79, 212, 67, 72, 65, 82, 65, 67, 84, 69, 82, 83, 128, 67, 72, 65, 82, 65, - 67, 84, 69, 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 128, 67, 72, - 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, 77, 75, 79, 128, 67, - 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, 76, 73, 128, 67, 72, - 65, 75, 77, 193, 67, 72, 65, 73, 82, 128, 67, 72, 65, 73, 78, 83, 128, - 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, 65, 65, 128, 67, 71, - 74, 128, 67, 69, 88, 128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 77, - 79, 78, 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, 87, 65, 128, - 67, 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, 83, 83, 65, - 78, 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, - 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, - 73, 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, - 85, 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, - 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, 73, 65, 204, - 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, 69, 196, 67, - 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, 128, 67, - 69, 76, 83, 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, 65, 84, 73, 79, 78, - 128, 67, 69, 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 69, - 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, 67, 69, 68, 73, 76, 76, 193, - 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, 67, 69, 67, 65, 75, 128, 67, - 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, 67, 67, 85, 128, 67, 67, 79, - 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, 67, 67, 72, 79, 128, 67, 67, - 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, 67, 72, 72, 79, 128, 67, 67, - 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, 128, 67, 67, 72, 72, 69, 128, - 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, 72, 65, 128, 67, 67, 72, 69, 69, - 128, 67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 65, 128, - 67, 67, 72, 128, 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, 85, + 69, 69, 77, 128, 67, 72, 69, 69, 128, 67, 72, 69, 67, 75, 69, 210, 67, + 72, 69, 67, 75, 128, 67, 72, 69, 67, 203, 67, 72, 197, 67, 72, 65, 88, + 128, 67, 72, 65, 86, 73, 89, 65, 78, 73, 128, 67, 72, 65, 84, 84, 65, 87, + 65, 128, 67, 72, 65, 84, 128, 67, 72, 65, 82, 84, 128, 67, 72, 65, 82, + 212, 67, 72, 65, 82, 73, 79, 84, 128, 67, 72, 65, 82, 73, 79, 212, 67, + 72, 65, 82, 65, 67, 84, 69, 82, 83, 128, 67, 72, 65, 82, 65, 67, 84, 69, + 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 84, 69, 82, 128, 67, 72, + 65, 80, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, + 77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, + 76, 73, 128, 67, 72, 65, 75, 77, 193, 67, 72, 65, 73, 82, 128, 67, 72, + 65, 73, 78, 83, 128, 67, 72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, + 65, 65, 128, 67, 71, 74, 128, 67, 69, 88, 128, 67, 69, 82, 69, 83, 128, + 67, 69, 82, 69, 77, 79, 78, 89, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, + 45, 87, 65, 128, 67, 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, + 77, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, + 73, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, + 78, 71, 67, 72, 73, 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, + 67, 72, 73, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, + 72, 73, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, + 82, 73, 65, 204, 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, + 82, 69, 68, 128, 67, 69, 78, 84, 82, 69, 196, 67, 69, 78, 84, 82, 69, + 128, 67, 69, 78, 84, 82, 197, 67, 69, 78, 84, 82, 65, 76, 73, 90, 65, 84, + 73, 79, 206, 67, 69, 78, 128, 67, 69, 76, 84, 73, 195, 67, 69, 76, 83, + 73, 85, 83, 128, 67, 69, 76, 69, 66, 82, 65, 84, 73, 79, 78, 128, 67, 69, + 73, 82, 84, 128, 67, 69, 73, 76, 73, 78, 71, 128, 67, 69, 69, 86, 128, + 67, 69, 69, 66, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, 128, + 67, 69, 68, 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, 128, + 67, 69, 67, 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, 128, + 67, 67, 85, 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, 128, + 67, 67, 72, 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 72, 85, 128, 67, + 67, 72, 72, 79, 128, 67, 67, 72, 72, 73, 128, 67, 67, 72, 72, 69, 69, + 128, 67, 67, 72, 72, 69, 128, 67, 67, 72, 72, 65, 65, 128, 67, 67, 72, + 72, 65, 128, 67, 67, 72, 69, 69, 128, 67, 67, 72, 69, 128, 67, 67, 72, + 65, 65, 128, 67, 67, 72, 65, 128, 67, 67, 72, 128, 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, 85, 67, 65, 83, 73, 65, 206, 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, - 72, 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, 84, 197, 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, + 83, 84, 76, 69, 128, 67, 65, 83, 75, 69, 212, 67, 65, 82, 89, 83, 84, 73, + 65, 206, 67, 65, 82, 84, 82, 73, 68, 71, 69, 128, 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, 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, 80, 69, 196, 67, 65, 80, 79, + 128, 67, 65, 80, 73, 84, 85, 76, 85, 77, 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, 68, 76, 69, 128, 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, 80, + 73, 78, 71, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77, 69, 82, 65, 128, + 67, 65, 77, 69, 82, 193, 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, 69, 78, 68, 65, 210, 67, 65, + 76, 67, 85, 76, 65, 84, 79, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, + 65, 128, 67, 65, 75, 197, 67, 65, 73, 128, 67, 65, 72, 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, 73, 78, 69, 84, 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, 84, 197, 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, 84, 84, 79, + 206, 66, 85, 212, 66, 85, 83, 84, 211, 66, 85, 83, 212, 66, 85, 83, 83, + 89, 69, 82, 85, 128, 66, 85, 83, 73, 78, 69, 83, 211, 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, + 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 72, 79, 82, 78, + 128, 66, 85, 76, 76, 72, 79, 82, 206, 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, 73, 76, 68, 73, 78, 199, 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, 68, 128, 66, 85, 67, 75, 76, 69, 128, 66, 85, 66, 66, + 76, 69, 83, 128, 66, 85, 66, 66, 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, 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, 80, 72, 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, 80, 79, 77, 79, 70, - 207, 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, 77, 128, 66, 79, 76, 84, 128, 66, 79, 76, 212, 66, - 79, 72, 65, 73, 82, 73, 195, 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, + 66, 80, 72, 128, 66, 79, 89, 211, 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, 81, 85, 69, 212, 66, 79, 85, 78, 68, 65, 82, + 217, 66, 79, 84, 84, 79, 77, 45, 83, 72, 65, 68, 69, 196, 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, 80, 79, 77, 79, 70, 207, 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, 77, 128, 66, 79, 76, 84, + 128, 66, 79, 76, 212, 66, 79, 72, 65, 73, 82, 73, 195, 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, 73, 78, 199, 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, 76, 69, 84, 84, 69, 210, 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, 79, 78, 83, 128, + 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, @@ -4351,15487 +4581,17201 @@ 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, 76, 128, 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, 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, 72, 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, 87, 65, 82, 68, 128, 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, 65, 45, 50, 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, 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, + 66, 69, 78, 90, 69, 78, 197, 66, 69, 78, 84, 207, 66, 69, 78, 212, 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, 72, 79, 208, + 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, 69, + 65, 67, 200, 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, 83, 193, 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, 76, 73, 78, 197, 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, 80, 79, 73, 78, 212, 66, 65, 76, 76, 79, 84, + 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, 72, 128, 66, + 65, 71, 83, 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, 87, 65, 82, 68, 128, 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, 83, 76, 65, 78, 84, 69, 196, 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, 65, 45, 50, 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, 84, 65, 67, 72, 69, + 196, 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, 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, 51, 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, 69, 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, 80, 76, 73, 67, 65, 84, 73, 79, 206, 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, 204, 65, 80, - 73, 78, 128, 65, 80, 69, 83, 207, 65, 80, 67, 128, 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, 74, 73, 128, 65, 78, 72, - 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 85, 73, 83, 72, 69, - 196, 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, 197, 65, 76, 84, 69, 82, 78, 65, 84, - 73, 79, 206, 65, 76, 84, 69, 82, 78, 65, 84, 197, 65, 76, 84, 65, 128, - 65, 76, 80, 72, 65, 128, 65, 76, 80, 72, 193, 65, 76, 80, 65, 80, 82, 65, - 78, 65, 128, 65, 76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65, - 128, 65, 76, 77, 79, 83, 212, 65, 76, 77, 128, 65, 76, 76, 79, 128, 65, - 76, 76, 73, 65, 78, 67, 69, 128, 65, 76, 76, 201, 65, 76, 76, 65, 200, - 65, 76, 75, 65, 76, 73, 45, 50, 128, 65, 76, 75, 65, 76, 73, 128, 65, 76, - 73, 71, 78, 69, 196, 65, 76, 73, 70, 85, 128, 65, 76, 73, 69, 78, 128, - 65, 76, 73, 69, 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, - 69, 85, 212, 65, 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, - 69, 77, 66, 73, 67, 128, 65, 76, 69, 70, 128, 65, 76, 65, 89, 72, 69, - 128, 65, 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, 76, 65, 80, 72, - 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, 69, 83, 69, - 76, 83, 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, 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, 78, 199, 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, + 84, 65, 73, 76, 128, 65, 82, 82, 73, 86, 73, 78, 71, 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, 69, + 65, 128, 65, 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 68, + 72, 65, 67, 65, 78, 68, 82, 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, 80, 76, 73, 67, 65, 84, 73, 79, 206, 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, 204, 65, + 80, 73, 78, 128, 65, 80, 69, 83, 207, 65, 80, 67, 128, 65, 80, 65, 82, + 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, 79, 85, 128, 65, 79, 82, 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, 69, 128, 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, 74, 73, + 128, 65, 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, + 85, 73, 83, 72, 69, 196, 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, 80, 69, 82, + 83, 65, 78, 196, 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, 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, 76, + 84, 69, 82, 78, 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, + 128, 65, 76, 80, 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, + 76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, + 83, 212, 65, 76, 77, 128, 65, 76, 76, 79, 128, 65, 76, 76, 73, 65, 78, + 67, 69, 128, 65, 76, 76, 201, 65, 76, 76, 65, 200, 65, 76, 75, 65, 76, + 73, 45, 50, 128, 65, 76, 75, 65, 76, 73, 128, 65, 76, 73, 71, 78, 69, + 196, 65, 76, 73, 70, 85, 128, 65, 76, 73, 69, 78, 128, 65, 76, 73, 69, + 206, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, 85, 212, 65, + 76, 69, 82, 84, 128, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, 67, + 128, 65, 76, 69, 70, 128, 65, 76, 66, 65, 78, 73, 65, 206, 65, 76, 65, + 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, 65, 76, 65, 82, 205, 65, 76, + 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, 84, 73, + 69, 83, 69, 76, 83, 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, + 82, 80, 76, 65, 78, 197, 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, 78, 199, 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, 70, 70, 73, + 216, 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, + 128, 65, 68, 77, 73, 83, 83, 73, 79, 206, 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, 79, 77, 77, 79, 68, 65, 84, 73, 79, 78, 128, 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, 66, + 49, 57, 49, 128, 65, 66, 49, 56, 56, 128, 65, 66, 49, 56, 48, 128, 65, + 66, 49, 55, 49, 128, 65, 66, 49, 54, 52, 128, 65, 66, 49, 51, 49, 66, + 128, 65, 66, 49, 51, 49, 65, 128, 65, 66, 49, 50, 51, 128, 65, 66, 49, + 50, 50, 128, 65, 66, 49, 50, 48, 128, 65, 66, 49, 49, 56, 128, 65, 66, + 48, 56, 55, 128, 65, 66, 48, 56, 54, 128, 65, 66, 48, 56, 53, 128, 65, + 66, 48, 56, 50, 128, 65, 66, 48, 56, 49, 128, 65, 66, 48, 56, 48, 128, + 65, 66, 48, 55, 57, 128, 65, 66, 48, 55, 56, 128, 65, 66, 48, 55, 55, + 128, 65, 66, 48, 55, 54, 128, 65, 66, 48, 55, 52, 128, 65, 66, 48, 55, + 51, 128, 65, 66, 48, 55, 48, 128, 65, 66, 48, 54, 57, 128, 65, 66, 48, + 54, 55, 128, 65, 66, 48, 54, 54, 128, 65, 66, 48, 54, 53, 128, 65, 66, + 48, 54, 49, 128, 65, 66, 48, 54, 48, 128, 65, 66, 48, 53, 57, 128, 65, + 66, 48, 53, 56, 128, 65, 66, 48, 53, 55, 128, 65, 66, 48, 53, 54, 128, + 65, 66, 48, 53, 53, 128, 65, 66, 48, 53, 52, 128, 65, 66, 48, 53, 51, + 128, 65, 66, 48, 53, 49, 128, 65, 66, 48, 53, 48, 128, 65, 66, 48, 52, + 57, 128, 65, 66, 48, 52, 56, 128, 65, 66, 48, 52, 55, 128, 65, 66, 48, + 52, 54, 128, 65, 66, 48, 52, 53, 128, 65, 66, 48, 52, 52, 128, 65, 66, + 48, 52, 49, 128, 65, 66, 48, 52, 48, 128, 65, 66, 48, 51, 57, 128, 65, + 66, 48, 51, 56, 128, 65, 66, 48, 51, 55, 128, 65, 66, 48, 51, 52, 128, + 65, 66, 48, 51, 49, 128, 65, 66, 48, 51, 48, 128, 65, 66, 48, 50, 57, + 128, 65, 66, 48, 50, 56, 128, 65, 66, 48, 50, 55, 128, 65, 66, 48, 50, + 54, 128, 65, 66, 48, 50, 52, 128, 65, 66, 48, 50, 51, 77, 128, 65, 66, + 48, 50, 51, 128, 65, 66, 48, 50, 50, 77, 128, 65, 66, 48, 50, 50, 70, + 128, 65, 66, 48, 50, 50, 128, 65, 66, 48, 50, 49, 77, 128, 65, 66, 48, + 50, 49, 70, 128, 65, 66, 48, 50, 49, 128, 65, 66, 48, 50, 48, 128, 65, + 66, 48, 49, 55, 128, 65, 66, 48, 49, 54, 128, 65, 66, 48, 49, 51, 128, + 65, 66, 48, 49, 49, 128, 65, 66, 48, 49, 48, 128, 65, 66, 48, 48, 57, + 128, 65, 66, 48, 48, 56, 128, 65, 66, 48, 48, 55, 128, 65, 66, 48, 48, + 54, 128, 65, 66, 48, 48, 53, 128, 65, 66, 48, 48, 52, 128, 65, 66, 48, + 48, 51, 128, 65, 66, 48, 48, 50, 128, 65, 66, 48, 48, 49, 128, 65, 65, + 89, 73, 78, 128, 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, 56, 48, 55, 128, 65, 56, 48, 54, 128, 65, + 56, 48, 53, 128, 65, 56, 48, 52, 128, 65, 56, 48, 51, 128, 65, 56, 48, + 50, 128, 65, 56, 48, 49, 128, 65, 56, 48, 48, 128, 65, 55, 51, 178, 65, + 55, 50, 182, 65, 55, 49, 183, 65, 55, 49, 181, 65, 55, 49, 180, 65, 55, + 49, 179, 65, 55, 49, 178, 65, 55, 49, 177, 65, 55, 49, 176, 65, 55, 48, + 57, 45, 182, 65, 55, 48, 57, 45, 180, 65, 55, 48, 57, 45, 179, 65, 55, + 48, 57, 45, 178, 65, 55, 48, 185, 65, 55, 48, 184, 65, 55, 48, 183, 65, + 55, 48, 182, 65, 55, 48, 181, 65, 55, 48, 180, 65, 55, 48, 179, 65, 55, + 48, 178, 65, 55, 48, 177, 65, 54, 54, 52, 128, 65, 54, 54, 51, 128, 65, + 54, 54, 50, 128, 65, 54, 54, 49, 128, 65, 54, 54, 48, 128, 65, 54, 53, + 57, 128, 65, 54, 53, 56, 128, 65, 54, 53, 55, 128, 65, 54, 53, 54, 128, + 65, 54, 53, 53, 128, 65, 54, 53, 52, 128, 65, 54, 53, 51, 128, 65, 54, + 53, 50, 128, 65, 54, 53, 49, 128, 65, 54, 52, 57, 128, 65, 54, 52, 56, + 128, 65, 54, 52, 54, 128, 65, 54, 52, 53, 128, 65, 54, 52, 52, 128, 65, + 54, 52, 51, 128, 65, 54, 52, 50, 128, 65, 54, 52, 48, 128, 65, 54, 51, + 56, 128, 65, 54, 51, 55, 128, 65, 54, 51, 52, 128, 65, 54, 50, 57, 128, + 65, 54, 50, 56, 128, 65, 54, 50, 55, 128, 65, 54, 50, 54, 128, 65, 54, + 50, 52, 128, 65, 54, 50, 51, 128, 65, 54, 50, 50, 128, 65, 54, 50, 49, + 128, 65, 54, 50, 48, 128, 65, 54, 49, 57, 128, 65, 54, 49, 56, 128, 65, + 54, 49, 55, 128, 65, 54, 49, 54, 128, 65, 54, 49, 53, 128, 65, 54, 49, + 52, 128, 65, 54, 49, 51, 128, 65, 54, 49, 50, 128, 65, 54, 49, 49, 128, + 65, 54, 49, 48, 128, 65, 54, 48, 57, 128, 65, 54, 48, 56, 128, 65, 54, + 48, 54, 128, 65, 54, 48, 52, 128, 65, 54, 48, 51, 128, 65, 54, 48, 50, + 128, 65, 54, 48, 49, 128, 65, 54, 48, 48, 128, 65, 53, 57, 56, 128, 65, + 53, 57, 54, 128, 65, 53, 57, 53, 128, 65, 53, 57, 52, 128, 65, 53, 57, + 50, 128, 65, 53, 57, 49, 128, 65, 53, 56, 57, 128, 65, 53, 56, 56, 128, + 65, 53, 56, 55, 128, 65, 53, 56, 54, 128, 65, 53, 56, 53, 128, 65, 53, + 56, 52, 128, 65, 53, 56, 51, 128, 65, 53, 56, 50, 128, 65, 53, 56, 49, + 128, 65, 53, 56, 48, 128, 65, 53, 55, 57, 128, 65, 53, 55, 56, 128, 65, + 53, 55, 55, 128, 65, 53, 55, 54, 128, 65, 53, 55, 53, 128, 65, 53, 55, + 52, 128, 65, 53, 55, 51, 128, 65, 53, 55, 50, 128, 65, 53, 55, 49, 128, + 65, 53, 55, 48, 128, 65, 53, 54, 57, 128, 65, 53, 54, 56, 128, 65, 53, + 54, 54, 128, 65, 53, 54, 53, 128, 65, 53, 54, 52, 128, 65, 53, 54, 51, + 128, 65, 53, 53, 57, 128, 65, 53, 53, 55, 128, 65, 53, 53, 54, 128, 65, + 53, 53, 53, 128, 65, 53, 53, 52, 128, 65, 53, 53, 51, 128, 65, 53, 53, + 50, 128, 65, 53, 53, 49, 128, 65, 53, 53, 48, 128, 65, 53, 52, 57, 128, + 65, 53, 52, 56, 128, 65, 53, 52, 55, 128, 65, 53, 52, 53, 128, 65, 53, + 52, 50, 128, 65, 53, 52, 49, 128, 65, 53, 52, 48, 128, 65, 53, 51, 57, + 128, 65, 53, 51, 56, 128, 65, 53, 51, 55, 128, 65, 53, 51, 54, 128, 65, + 53, 51, 53, 128, 65, 53, 51, 52, 128, 65, 53, 51, 50, 128, 65, 53, 51, + 49, 128, 65, 53, 51, 48, 128, 65, 53, 50, 57, 128, 65, 53, 50, 56, 128, + 65, 53, 50, 55, 128, 65, 53, 50, 54, 128, 65, 53, 50, 53, 128, 65, 53, + 50, 52, 128, 65, 53, 50, 51, 128, 65, 53, 50, 49, 128, 65, 53, 50, 48, + 128, 65, 53, 49, 54, 128, 65, 53, 49, 53, 128, 65, 53, 49, 51, 128, 65, + 53, 49, 50, 128, 65, 53, 49, 49, 128, 65, 53, 49, 48, 128, 65, 53, 48, + 57, 128, 65, 53, 48, 56, 128, 65, 53, 48, 54, 128, 65, 53, 48, 53, 128, + 65, 53, 48, 52, 128, 65, 53, 48, 51, 128, 65, 53, 48, 50, 128, 65, 53, + 48, 49, 128, 65, 52, 49, 56, 45, 86, 65, 83, 128, 65, 52, 49, 55, 45, 86, + 65, 83, 128, 65, 52, 49, 54, 45, 86, 65, 83, 128, 65, 52, 49, 53, 45, 86, + 65, 83, 128, 65, 52, 49, 52, 45, 86, 65, 83, 128, 65, 52, 49, 51, 45, 86, + 65, 83, 128, 65, 52, 49, 50, 45, 86, 65, 83, 128, 65, 52, 49, 49, 45, 86, + 65, 83, 128, 65, 52, 49, 48, 45, 86, 65, 83, 128, 65, 52, 48, 57, 45, 86, + 65, 83, 128, 65, 52, 48, 56, 45, 86, 65, 83, 128, 65, 52, 48, 55, 45, 86, + 65, 83, 128, 65, 52, 48, 54, 45, 86, 65, 83, 128, 65, 52, 48, 53, 45, 86, + 65, 83, 128, 65, 52, 48, 52, 45, 86, 65, 83, 128, 65, 52, 48, 51, 45, 86, + 65, 83, 128, 65, 52, 48, 50, 45, 86, 65, 83, 128, 65, 52, 48, 49, 45, 86, + 65, 83, 128, 65, 52, 48, 48, 45, 86, 65, 83, 128, 65, 51, 55, 49, 128, + 65, 51, 55, 48, 128, 65, 51, 54, 57, 128, 65, 51, 54, 56, 128, 65, 51, + 54, 55, 128, 65, 51, 54, 54, 128, 65, 51, 54, 53, 128, 65, 51, 54, 52, + 128, 65, 51, 54, 51, 128, 65, 51, 54, 50, 128, 65, 51, 54, 49, 128, 65, + 51, 54, 48, 128, 65, 51, 53, 57, 128, 65, 51, 53, 56, 128, 65, 51, 53, + 55, 128, 65, 51, 53, 54, 128, 65, 51, 53, 53, 128, 65, 51, 53, 52, 128, + 65, 51, 53, 51, 128, 65, 51, 53, 50, 128, 65, 51, 53, 49, 128, 65, 51, + 53, 48, 128, 65, 51, 52, 57, 128, 65, 51, 52, 56, 128, 65, 51, 52, 55, + 128, 65, 51, 52, 54, 128, 65, 51, 52, 53, 128, 65, 51, 52, 52, 128, 65, + 51, 52, 51, 128, 65, 51, 52, 50, 128, 65, 51, 52, 49, 128, 65, 51, 52, + 48, 128, 65, 51, 51, 57, 128, 65, 51, 51, 56, 128, 65, 51, 51, 55, 128, + 65, 51, 51, 54, 128, 65, 51, 51, 53, 128, 65, 51, 51, 52, 128, 65, 51, + 51, 51, 128, 65, 51, 51, 50, 128, 65, 51, 51, 49, 128, 65, 51, 51, 48, + 128, 65, 51, 50, 57, 128, 65, 51, 50, 56, 128, 65, 51, 50, 55, 128, 65, + 51, 50, 54, 128, 65, 51, 50, 53, 128, 65, 51, 50, 52, 128, 65, 51, 50, + 51, 128, 65, 51, 50, 50, 128, 65, 51, 50, 49, 128, 65, 51, 50, 48, 128, + 65, 51, 49, 57, 128, 65, 51, 49, 56, 128, 65, 51, 49, 55, 128, 65, 51, + 49, 54, 128, 65, 51, 49, 53, 128, 65, 51, 49, 52, 128, 65, 51, 49, 51, + 67, 128, 65, 51, 49, 51, 66, 128, 65, 51, 49, 51, 65, 128, 65, 51, 49, + 50, 128, 65, 51, 49, 49, 128, 65, 51, 49, 48, 128, 65, 51, 48, 57, 67, + 128, 65, 51, 48, 57, 66, 128, 65, 51, 48, 57, 65, 128, 65, 51, 48, 56, + 128, 65, 51, 48, 55, 128, 65, 51, 48, 54, 128, 65, 51, 48, 53, 128, 65, + 51, 48, 52, 128, 65, 51, 48, 51, 128, 65, 51, 48, 50, 128, 65, 51, 48, + 49, 128, 65, 49, 51, 49, 67, 128, 65, 49, 50, 48, 66, 128, 65, 49, 48, + 48, 45, 49, 48, 50, 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, 50, 56, 66, 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, 18, 23, 27, 34, 39, 41, 47, 50, 62, 70, 80, 93, 102, 108, - 113, 121, 130, 135, 140, 143, 147, 153, 158, 163, 171, 178, 186, 191, - 194, 200, 208, 215, 225, 230, 237, 246, 249, 254, 257, 263, 267, 272, - 281, 288, 295, 301, 310, 315, 321, 327, 335, 144, 341, 349, 350, 358, - 361, 367, 369, 375, 382, 384, 391, 395, 403, 410, 412, 417, 422, 427, - 434, 436, 299, 442, 445, 447, 452, 457, 463, 470, 479, 489, 494, 498, - 505, 518, 522, 531, 538, 545, 548, 554, 558, 562, 572, 580, 588, 596, - 605, 613, 618, 619, 623, 631, 638, 648, 652, 663, 667, 670, 673, 678, - 348, 682, 691, 697, 703, 705, 708, 711, 714, 718, 722, 731, 739, 744, - 747, 751, 757, 764, 771, 776, 785, 794, 801, 805, 818, 827, 835, 841, - 557, 850, 860, 867, 873, 879, 886, 894, 898, 749, 906, 915, 503, 923, - 928, 934, 17, 943, 948, 951, 955, 959, 966, 969, 976, 980, 988, 992, - 1000, 1004, 1007, 1014, 1021, 192, 1024, 1029, 1039, 1048, 1055, 1060, - 1066, 1072, 1080, 1083, 1088, 1094, 1102, 1107, 1110, 1113, 111, 1118, - 1122, 1128, 1134, 1137, 1143, 1147, 1152, 1158, 1168, 1172, 1175, 1178, - 1187, 1191, 1194, 1199, 1204, 1210, 1215, 1220, 1225, 1229, 1234, 1240, - 1245, 1250, 1254, 1260, 1265, 1270, 1275, 1279, 1284, 1289, 1294, 1300, - 1306, 1312, 1317, 1321, 1326, 1331, 1336, 1340, 1345, 1350, 1355, 1360, - 1195, 1200, 1205, 1211, 1216, 1364, 1226, 1370, 1375, 1380, 1387, 1391, - 1400, 1230, 1404, 1235, 1241, 1246, 1408, 1413, 1418, 1422, 1426, 1432, - 1436, 1251, 1439, 1261, 1444, 1448, 1266, 1454, 1271, 1458, 1462, 1276, - 1466, 1471, 1475, 1478, 1482, 1280, 1285, 1487, 1290, 1493, 1499, 1505, - 1511, 1295, 1307, 1313, 1515, 1519, 1523, 1526, 1318, 1530, 1532, 1537, - 1542, 1548, 1553, 1558, 1562, 1567, 1572, 1577, 1582, 1588, 1593, 1598, - 1604, 1610, 1615, 1619, 1624, 1629, 1634, 1639, 1643, 1651, 1655, 1660, - 1665, 1670, 1675, 1679, 1682, 1687, 1692, 1697, 1702, 1708, 1713, 1717, - 1322, 1720, 1725, 1730, 1327, 1734, 1738, 1745, 1332, 1752, 1337, 1756, - 1758, 1763, 1769, 1341, 1774, 1783, 1346, 1788, 1794, 1351, 1799, 1804, - 1807, 1812, 1816, 1820, 1824, 1827, 1831, 1356, 1361, 1058, 1836, 1842, - 1848, 1854, 1860, 1866, 1872, 1878, 1884, 1889, 1895, 1901, 1907, 1913, - 1919, 1925, 1931, 1937, 1943, 1948, 1953, 1958, 1963, 1968, 1973, 1978, - 1983, 1988, 1993, 1999, 2004, 2010, 2015, 2021, 2027, 2032, 2038, 2044, - 2050, 2056, 2061, 2066, 2068, 2069, 2073, 2077, 2082, 2086, 2090, 2094, - 2099, 2103, 2106, 2111, 2115, 2120, 2124, 2128, 2133, 2137, 2140, 2144, - 2150, 2164, 2168, 2172, 2176, 2179, 2184, 2188, 2192, 2195, 2199, 2204, - 2209, 2214, 2219, 2223, 2227, 2231, 2236, 2240, 2245, 2249, 2254, 2260, - 2267, 2273, 2278, 2283, 2288, 2294, 2299, 2305, 2310, 2313, 1212, 2315, - 2322, 2330, 2340, 2349, 2363, 2367, 2371, 2384, 2392, 2396, 2401, 2405, - 2408, 2412, 2416, 2421, 2426, 2431, 2435, 2438, 2442, 2449, 2456, 2462, - 2467, 2472, 2478, 2484, 2489, 2492, 1760, 2494, 2500, 2504, 2509, 2513, - 2517, 1765, 1771, 2522, 2526, 2529, 2534, 2539, 2544, 2549, 2553, 2560, - 2565, 2568, 2575, 2581, 2585, 2589, 2593, 2598, 2605, 2610, 2615, 2622, - 2628, 2634, 2640, 2654, 2671, 2686, 2701, 2710, 2715, 2719, 2724, 2729, - 2733, 2745, 2752, 2758, 2263, 2764, 2771, 2777, 2781, 2784, 2791, 2797, - 2801, 2805, 2809, 2091, 2813, 2818, 2823, 2827, 2835, 2839, 2843, 2847, - 2851, 2856, 2861, 2866, 2870, 2875, 2880, 2884, 2889, 2893, 2896, 2900, - 2904, 2912, 2917, 2921, 2925, 2931, 2940, 2944, 2948, 2954, 2959, 2966, - 2970, 2980, 2984, 2988, 2993, 2997, 3002, 3008, 3013, 3017, 3021, 3025, - 2452, 3033, 3038, 3044, 3049, 3053, 3058, 3063, 3067, 3073, 3078, 2095, - 3084, 3090, 3095, 3100, 3105, 3110, 3115, 3120, 3125, 3130, 3135, 3141, - 3146, 1227, 92, 3152, 3156, 3160, 3164, 3169, 3173, 3177, 3181, 3185, - 3190, 3194, 3199, 3203, 3206, 3210, 3215, 3219, 3224, 3228, 3232, 3236, - 3241, 3245, 3248, 3261, 3265, 3269, 3273, 3277, 3281, 3284, 3288, 3292, - 3297, 3301, 3306, 3311, 3316, 3320, 3323, 3326, 3332, 3336, 3340, 3343, - 3347, 3351, 3354, 3360, 3365, 3370, 3376, 3381, 3386, 3392, 3398, 3403, - 3408, 3413, 1120, 547, 3418, 3421, 3426, 3430, 3433, 3437, 3442, 3447, - 3451, 3456, 3460, 3465, 3469, 3473, 3479, 3485, 3488, 3491, 3497, 3504, - 3511, 3517, 3524, 3529, 3533, 3540, 3547, 3552, 3556, 3566, 3570, 3574, - 3579, 3584, 3594, 2107, 3599, 3603, 3606, 3612, 3617, 3623, 3629, 3634, - 3641, 3645, 3649, 620, 671, 1388, 3653, 3660, 3667, 3674, 3681, 3687, - 3693, 3698, 3702, 3708, 3713, 3717, 2116, 3721, 3729, 600, 3735, 3746, - 3750, 3760, 2121, 3766, 3771, 3786, 3792, 3799, 3809, 3815, 3820, 3826, - 3832, 3835, 3839, 3844, 3851, 3856, 3860, 3864, 3868, 3872, 3877, 3883, - 3894, 3211, 3899, 3911, 3919, 3924, 1564, 3931, 3934, 3937, 3941, 3944, - 3950, 3954, 3968, 3972, 3975, 3979, 3985, 3991, 3996, 4000, 4004, 4010, - 4021, 4027, 4032, 4038, 4042, 4050, 4060, 4066, 4071, 4080, 4088, 4095, - 4099, 4105, 4114, 4123, 4127, 4132, 4137, 4141, 4149, 4153, 4158, 4162, - 2129, 1401, 4168, 4173, 4179, 4184, 4189, 4194, 4199, 4204, 4209, 4215, - 4220, 4226, 4231, 4236, 4241, 4247, 4252, 4257, 4262, 4267, 4273, 4278, - 4284, 4289, 4294, 4299, 4304, 4309, 4314, 4320, 4325, 4330, 319, 456, - 4335, 4341, 4345, 4349, 4354, 4358, 4362, 4365, 4369, 4373, 4377, 4381, - 4386, 4390, 4394, 4400, 4165, 4405, 4409, 4412, 4417, 4422, 4427, 4432, - 4437, 4442, 4447, 4452, 4457, 4462, 4466, 4471, 4476, 4481, 4486, 4491, - 4496, 4501, 4506, 4511, 4516, 4520, 4525, 4530, 4535, 4540, 4545, 4550, - 4555, 4560, 4565, 4570, 4574, 4579, 4584, 4589, 4594, 4599, 4604, 4609, - 4614, 4619, 4624, 4628, 4633, 4638, 4643, 4648, 4653, 4658, 4663, 4668, - 4673, 4678, 4682, 4687, 4692, 4697, 4702, 4707, 4712, 4717, 4722, 4727, - 4732, 4736, 4741, 4746, 4751, 4756, 4761, 4766, 4771, 4776, 4781, 4786, - 4790, 4795, 4800, 4805, 4810, 4816, 4822, 4828, 4834, 4840, 4846, 4852, - 4857, 4863, 4869, 4875, 4881, 4887, 4893, 4899, 4905, 4911, 4917, 4922, - 4928, 4934, 4940, 4946, 4952, 4958, 4964, 4970, 4976, 4982, 4987, 4993, - 4999, 5005, 5011, 5017, 5023, 5029, 5035, 5041, 5047, 5052, 5058, 5064, - 5070, 5076, 5082, 5088, 5094, 5100, 5106, 5112, 5117, 5123, 5129, 5135, - 5141, 5147, 5153, 5159, 5165, 5171, 5177, 5182, 5186, 5192, 5198, 5204, - 5210, 5216, 5222, 5228, 5234, 5240, 5246, 5251, 5257, 5263, 5269, 5275, - 5281, 5287, 5293, 5299, 5305, 5311, 5316, 5322, 5328, 5334, 5340, 5346, - 5352, 5358, 5364, 5370, 5376, 5381, 5387, 5393, 5399, 5405, 5411, 5417, - 5423, 5429, 5435, 5441, 5446, 5452, 5458, 5464, 5470, 5476, 5482, 5488, - 5494, 5500, 5506, 5511, 5517, 5523, 5529, 5535, 5541, 5547, 5553, 5559, - 5565, 5571, 5576, 5582, 5588, 5594, 5600, 5606, 5612, 5618, 5624, 5630, - 5636, 5641, 5647, 5653, 5659, 5665, 5671, 5677, 5683, 5689, 5695, 5701, - 5706, 5712, 5718, 5724, 5730, 5736, 5742, 5748, 5754, 5760, 5766, 5771, - 5777, 5783, 5789, 5795, 5801, 5807, 5813, 5819, 5825, 5831, 5836, 5840, - 5843, 5850, 5854, 5867, 5871, 5875, 5879, 5883, 5887, 5891, 5897, 5904, - 5912, 5916, 5924, 5933, 5939, 5951, 5956, 5959, 5963, 5973, 5981, 5989, - 5995, 5999, 6009, 6019, 6027, 6034, 6041, 6047, 6053, 6060, 6064, 6071, - 6081, 6091, 6099, 6106, 6111, 6115, 6123, 6127, 6132, 6139, 6147, 6152, - 6157, 6161, 6168, 6173, 6187, 6192, 6197, 6204, 6213, 6216, 6220, 6224, - 6228, 6231, 6236, 6241, 6250, 6256, 6262, 6268, 6272, 6283, 6293, 6308, - 6323, 6338, 6353, 6368, 6383, 6398, 6413, 6428, 6443, 6458, 6473, 6488, - 6503, 6518, 6533, 6548, 6563, 6578, 6593, 6608, 6623, 6638, 6653, 6668, - 6683, 6698, 6713, 6728, 6743, 6758, 6773, 6788, 6803, 6818, 6833, 6848, - 6863, 6878, 6893, 6908, 6923, 6938, 6953, 6968, 6983, 6998, 7013, 7028, - 7037, 7046, 7051, 7057, 7067, 7071, 7076, 7081, 7089, 7093, 7096, 7100, - 2975, 7103, 7108, 298, 425, 7114, 7122, 7126, 7130, 7133, 7137, 7143, - 7147, 7155, 7161, 7166, 7173, 7180, 7186, 7191, 7198, 7204, 7212, 7216, - 7221, 7233, 7244, 7251, 7255, 7259, 7265, 3233, 7269, 7275, 7280, 7285, - 7290, 7296, 7301, 7306, 7311, 7316, 7322, 7327, 7332, 7338, 7343, 7349, - 7354, 7360, 7365, 7371, 7376, 7381, 7386, 7391, 7396, 7402, 7407, 7412, - 7417, 7423, 7429, 7435, 7441, 7447, 7453, 7459, 7465, 7471, 7477, 7483, - 7489, 7494, 7499, 7504, 7509, 7514, 7519, 7524, 7529, 7535, 7541, 7546, - 7552, 7558, 7564, 7569, 7574, 7579, 7584, 7590, 7596, 7601, 7606, 7611, - 7616, 7621, 7627, 7632, 7638, 7644, 7650, 7656, 7662, 7668, 7674, 7680, - 7686, 2138, 7132, 7691, 7695, 7699, 7702, 7709, 7712, 7720, 7725, 7730, - 7721, 7735, 2165, 7739, 7745, 7751, 7756, 7761, 7768, 7776, 7781, 7785, - 7788, 7792, 7798, 7804, 7808, 2173, 560, 7811, 7815, 7820, 7826, 7831, - 7835, 7838, 7842, 7848, 7853, 7857, 7864, 7868, 7872, 7876, 945, 769, - 7879, 7887, 7894, 7901, 7907, 7914, 7922, 7929, 7936, 7941, 7953, 1247, - 1409, 1414, 7964, 1419, 7968, 7972, 7981, 7989, 7998, 8004, 8009, 8013, - 8019, 8024, 2706, 8031, 8035, 8044, 8053, 8062, 8071, 8076, 8081, 8093, - 8098, 8106, 2224, 8110, 8112, 8117, 8121, 8130, 8138, 1423, 133, 3461, - 3466, 8144, 8148, 8157, 8163, 8168, 8171, 8180, 2698, 8186, 8194, 8198, - 8202, 8206, 2237, 8210, 8215, 8222, 8228, 8234, 8237, 8239, 8242, 8250, - 8258, 8266, 8269, 8274, 2250, 8279, 7732, 8282, 8284, 8289, 8294, 8299, - 8304, 8309, 8314, 8319, 8324, 8329, 8334, 8340, 8345, 8350, 8355, 8361, - 8366, 8371, 8376, 8381, 8386, 8391, 8397, 8402, 8407, 8412, 8417, 8422, - 8427, 8432, 8437, 8442, 8447, 8452, 8457, 8462, 8467, 8472, 8477, 8482, - 8488, 8494, 8499, 8504, 8509, 8514, 8519, 2261, 2268, 2274, 8524, 8530, - 8538, 2300, 2306, 8546, 8550, 8555, 8559, 8563, 8567, 8572, 8576, 8581, - 8585, 8588, 8591, 8597, 8603, 8609, 8615, 8621, 8627, 8633, 8637, 8641, - 8645, 8649, 8653, 8658, 8665, 8676, 8684, 8694, 8700, 8707, 8712, 8716, - 8727, 8740, 8751, 8764, 8775, 8787, 8799, 8811, 8824, 8837, 8844, 8850, - 8864, 8871, 8877, 8881, 8886, 8890, 8897, 8905, 8909, 8915, 8919, 8925, - 8935, 8939, 8944, 8949, 8956, 8962, 8972, 7909, 8978, 8982, 8989, 8996, - 768, 9000, 9004, 9009, 9014, 9019, 9023, 9029, 9037, 9043, 9047, 9053, - 9063, 9067, 9073, 9078, 9082, 9088, 9094, 2161, 9099, 9101, 9106, 9114, - 9123, 9127, 9133, 9138, 9143, 9148, 9153, 9159, 9164, 9169, 4006, 9174, - 9179, 9183, 9189, 9194, 9200, 9205, 9210, 9216, 9221, 9128, 9227, 9231, - 9238, 9244, 9249, 9253, 6183, 9258, 9267, 9272, 9277, 8218, 8225, 9282, - 2853, 9286, 9291, 9296, 9139, 9300, 9305, 9144, 9149, 9310, 9317, 9324, - 9330, 9336, 9342, 9347, 9352, 9357, 9154, 9160, 9363, 9369, 9374, 9382, - 9165, 9387, 990, 9390, 9398, 9404, 9410, 9419, 9427, 9432, 9438, 9446, - 9453, 9468, 9485, 9504, 9513, 9521, 9536, 9547, 9557, 9567, 9575, 9581, - 9593, 9602, 9610, 9617, 9624, 9630, 9635, 9643, 9653, 9660, 9670, 9680, - 9690, 9698, 9705, 9714, 9724, 9738, 9753, 9762, 9770, 9775, 9779, 9788, - 9794, 9799, 9809, 9819, 9829, 9834, 9838, 9847, 9852, 9862, 9873, 9886, - 9894, 9907, 9919, 9927, 9932, 9936, 9942, 9947, 9955, 9963, 9970, 9975, - 9983, 9989, 9992, 9996, 10002, 10010, 10015, 10019, 10027, 10036, 10044, - 10050, 10054, 10061, 10072, 10076, 10079, 10085, 9170, 10090, 10096, - 10103, 10109, 10114, 10121, 10128, 10135, 10142, 10149, 10156, 10163, - 10170, 10175, 9481, 10180, 10186, 10193, 10200, 10205, 10212, 10221, - 10225, 10237, 8256, 10241, 10244, 10248, 10252, 10256, 10260, 10266, - 10272, 10277, 10283, 10288, 10293, 10299, 10304, 10309, 8952, 10314, - 10318, 10322, 10326, 10331, 10336, 10344, 10350, 10354, 10358, 10365, - 10370, 10378, 10383, 10387, 10390, 10396, 10403, 10407, 10410, 10415, - 10419, 4045, 10425, 10434, 36, 10442, 10448, 10453, 8967, 10458, 10463, - 10467, 10470, 10485, 10504, 10516, 10529, 10542, 10555, 10569, 10582, - 10597, 10604, 9175, 10610, 10624, 10629, 10635, 10640, 10648, 10653, - 8040, 10658, 10661, 10668, 10673, 10677, 2858, 998, 10683, 10687, 10693, - 10699, 10704, 10710, 10715, 9184, 10721, 10727, 10732, 10737, 10745, - 10751, 10764, 10772, 10779, 9190, 10785, 10793, 10801, 10808, 10821, - 10833, 10843, 10851, 10858, 10865, 10874, 10883, 10891, 10898, 10903, - 10909, 9195, 10914, 10920, 9201, 10925, 10928, 10935, 10941, 10954, 8669, - 10965, 10971, 10980, 10988, 10995, 11001, 11007, 11012, 11016, 11021, - 10477, 11027, 9206, 11034, 11039, 11046, 11052, 11058, 11063, 11071, - 11079, 11086, 11090, 11104, 11114, 11119, 11123, 11134, 11140, 11145, - 11150, 9211, 9217, 11154, 11157, 11162, 11174, 11181, 11186, 11190, - 11195, 11199, 11206, 11212, 9222, 9129, 11219, 2863, 8, 11226, 11231, - 11235, 11241, 11249, 11259, 11264, 11269, 11276, 11283, 11287, 11298, - 11308, 11317, 11329, 11334, 11338, 11346, 11360, 11364, 11367, 11375, - 11382, 11390, 11394, 11405, 11409, 11416, 11421, 11425, 11431, 11436, - 11440, 11446, 11451, 11462, 11466, 11469, 11475, 11480, 11486, 11492, - 11499, 11510, 11520, 11530, 11539, 11546, 11555, 9232, 9239, 9245, 9250, - 11561, 11567, 9254, 11573, 11576, 11583, 11588, 11603, 11619, 11634, - 11642, 11648, 11653, 838, 420, 11658, 11666, 11673, 11679, 11684, 11689, - 9259, 11691, 11695, 11700, 11704, 11714, 11719, 11723, 11732, 11736, - 11739, 9268, 11746, 11749, 11757, 11764, 11772, 11776, 11783, 11792, - 11795, 11799, 11803, 11809, 11813, 11817, 11821, 11827, 11837, 11841, - 11849, 11853, 11860, 11864, 11869, 11873, 11880, 11886, 11894, 11900, - 11905, 11915, 11920, 11925, 11929, 11937, 3905, 11945, 11950, 9273, - 11954, 11958, 11961, 11969, 11976, 11980, 5991, 11984, 11989, 11993, - 12004, 12014, 12019, 12025, 12029, 12032, 12040, 12045, 12050, 12057, - 12062, 9278, 12067, 12071, 12078, 1722, 6145, 12083, 12088, 12093, 12098, - 12104, 12109, 12115, 12120, 12125, 12130, 12135, 12140, 12145, 12150, - 12155, 12160, 12165, 12170, 12175, 12180, 12185, 12190, 12195, 12201, - 12206, 12211, 12216, 12221, 12226, 12232, 12237, 12242, 12248, 12253, - 12259, 12264, 12270, 12275, 12280, 12285, 12290, 12296, 12301, 12306, - 12311, 737, 139, 12319, 12323, 12328, 12333, 12337, 12341, 12345, 12350, - 12354, 12359, 12363, 12366, 12370, 12374, 12380, 12385, 12395, 12401, - 12409, 12413, 12417, 12424, 12432, 12441, 12452, 12459, 12466, 12470, - 12479, 12488, 12496, 12505, 12514, 12523, 12532, 12542, 12552, 12562, - 12572, 12582, 12591, 12601, 12611, 12621, 12631, 12641, 12651, 12661, - 12670, 12680, 12690, 12700, 12710, 12720, 12730, 12739, 12749, 12759, - 12769, 12779, 12789, 12799, 12809, 12819, 12829, 12838, 12848, 12858, - 12868, 12878, 12888, 12898, 12908, 12918, 12928, 12938, 12947, 1256, - 12953, 12956, 12960, 12965, 12972, 12978, 12983, 12987, 12992, 13001, - 13009, 13014, 13018, 13022, 13028, 13033, 13039, 9287, 13044, 13049, - 13058, 9292, 13063, 13066, 13072, 13080, 9297, 13087, 13091, 13095, - 13099, 13109, 13115, 13121, 13126, 13135, 13143, 13150, 13157, 13162, - 13169, 13174, 13178, 13181, 13192, 13202, 13211, 13219, 13230, 13242, - 13252, 13257, 13261, 13266, 13271, 13275, 13281, 13289, 13296, 13307, - 13312, 13322, 13326, 13329, 13336, 13346, 13355, 13362, 13366, 13373, - 13379, 13384, 13389, 13393, 13402, 13407, 13413, 13417, 13422, 13426, - 13435, 13443, 13451, 13458, 13466, 13478, 13489, 13499, 13506, 13512, - 13521, 13532, 13541, 13553, 13565, 13577, 13587, 13596, 13605, 13613, - 13620, 13629, 13637, 13641, 13647, 13653, 13658, 7753, 13662, 13664, - 13668, 13673, 13679, 13688, 13692, 13698, 13706, 13713, 13722, 13731, - 13740, 13749, 13758, 13767, 13776, 13785, 13795, 13805, 13814, 13820, - 13827, 13834, 13840, 13854, 13861, 13869, 13878, 13884, 13893, 13902, - 13913, 13923, 13931, 13938, 13946, 13955, 13968, 13976, 13983, 13996, - 14002, 14008, 14018, 14027, 14036, 14041, 14045, 14051, 14057, 14064, - 8966, 14069, 14074, 14081, 14086, 12376, 14091, 14099, 14105, 14110, - 14118, 14126, 14133, 14141, 14147, 14155, 14163, 14169, 14174, 14180, - 14187, 14193, 14198, 14202, 14213, 14221, 14227, 14232, 14241, 14247, - 14252, 14261, 14275, 3853, 14279, 14284, 14289, 14295, 14300, 14305, - 14309, 14314, 14319, 14324, 7752, 14329, 14334, 14339, 14344, 14349, - 14353, 14358, 14363, 14368, 14373, 14379, 14385, 14390, 14394, 14399, - 14404, 14409, 9301, 14414, 14419, 14424, 14429, 14434, 14451, 14469, - 14481, 14494, 14511, 14527, 14544, 14554, 14573, 14584, 14595, 14606, - 14617, 14629, 14640, 14651, 14668, 14679, 14690, 14695, 9306, 14700, - 14704, 2381, 14708, 14711, 14717, 14725, 14733, 14738, 14746, 14754, - 14761, 14766, 14772, 14779, 14787, 14794, 14806, 14814, 14819, 11597, - 14825, 14834, 14843, 14851, 14858, 14864, 14872, 14879, 14885, 14892, - 14898, 14907, 14915, 14925, 14932, 14938, 14946, 14952, 14960, 14967, - 14980, 14987, 14996, 15005, 15014, 15022, 15032, 15039, 15044, 3560, - 15051, 15056, 1372, 15060, 14330, 15064, 15070, 15074, 15082, 15094, - 15099, 15106, 15112, 15117, 15124, 14335, 15128, 15132, 15136, 14340, - 15140, 14345, 15144, 15151, 15156, 15160, 15167, 15171, 15179, 15186, - 15190, 15197, 15214, 15223, 15227, 15230, 15238, 15244, 15249, 3638, - 15253, 15255, 15263, 15270, 15280, 15292, 15297, 15303, 15308, 15312, - 15318, 15323, 15329, 15332, 15339, 15347, 15354, 15360, 15366, 15371, - 15378, 15384, 15389, 15396, 15400, 15406, 15410, 15417, 15423, 15429, - 15437, 15443, 15448, 15454, 15462, 15470, 15476, 15482, 15487, 15494, - 15499, 15503, 15509, 15514, 15521, 15526, 15532, 15535, 15541, 15547, - 15550, 15554, 15566, 15572, 15577, 15584, 15590, 15596, 15607, 15617, - 15626, 15634, 15641, 15652, 15662, 15672, 15680, 15683, 14359, 15688, - 15693, 14364, 14499, 15701, 15714, 15729, 15740, 14516, 15758, 15771, - 15784, 15795, 10492, 15806, 15819, 15838, 15849, 15860, 15871, 2649, - 15884, 15888, 15896, 15911, 15926, 15937, 15944, 15950, 15958, 15962, - 15968, 15971, 15981, 15989, 15996, 16004, 16014, 16019, 16026, 16031, - 16038, 16049, 16059, 16065, 16070, 16075, 14369, 16079, 16085, 16091, - 16096, 16101, 16106, 16110, 14374, 14380, 16114, 14386, 16119, 16127, - 16136, 16143, 9150, 16147, 16149, 16154, 16159, 16165, 16170, 16175, - 16180, 16185, 16189, 16195, 16201, 16206, 16212, 16217, 16222, 16228, - 16233, 16238, 16243, 16248, 16254, 16259, 16264, 16270, 16276, 16281, - 16286, 16293, 16299, 16310, 16317, 16322, 16326, 16330, 16333, 16341, - 16346, 16353, 16360, 16366, 16371, 16376, 16383, 16393, 16398, 16405, - 16411, 16421, 16431, 16445, 16459, 16473, 16487, 16502, 16517, 16534, - 16552, 16565, 16571, 16576, 16581, 16585, 16590, 16598, 16604, 16609, - 16614, 16618, 16623, 16627, 16632, 16636, 16647, 16653, 16658, 16663, - 16670, 16675, 16679, 16684, 16689, 16695, 16702, 16708, 16713, 16717, - 16723, 16728, 16733, 16737, 16743, 16748, 16753, 16760, 16765, 13111, - 16769, 16774, 16778, 16783, 16789, 16795, 16802, 16812, 16820, 16827, - 16832, 16836, 16845, 16853, 16860, 16867, 16873, 16879, 16884, 16889, - 16895, 16900, 16906, 16911, 16917, 16923, 16930, 16936, 16941, 16946, - 9348, 16955, 16958, 16964, 16969, 16974, 16984, 16991, 16997, 17002, - 17007, 17013, 17018, 17024, 17029, 17035, 17041, 17046, 17054, 17061, - 17066, 17071, 17077, 17082, 17086, 17095, 17106, 17113, 17118, 17126, - 17132, 17139, 17145, 17150, 17154, 17160, 17165, 17170, 17175, 1440, - 7777, 2877, 17179, 17183, 17187, 17191, 17195, 17199, 17202, 17209, - 17217, 14400, 17224, 17234, 17242, 17249, 17257, 17267, 17276, 17289, - 17294, 17299, 17307, 17314, 13207, 13216, 17321, 17331, 17346, 17352, - 17359, 17366, 17372, 17380, 17390, 17400, 14405, 17409, 17415, 17421, - 17429, 17437, 17442, 17451, 17459, 17471, 17481, 17491, 17501, 17510, - 17522, 17532, 17542, 17553, 17558, 17570, 17582, 17594, 17606, 17618, - 17630, 17642, 17654, 17666, 17678, 17689, 17701, 17713, 17725, 17737, - 17749, 17761, 17773, 17785, 17797, 17809, 17820, 17832, 17844, 17856, - 17868, 17880, 17892, 17904, 17916, 17928, 17940, 17951, 17963, 17975, - 17987, 17999, 18011, 18023, 18035, 18047, 18059, 18071, 18082, 18094, - 18106, 18118, 18130, 18142, 18154, 18166, 18178, 18190, 18202, 18213, - 18225, 18237, 18249, 18261, 18273, 18285, 18297, 18309, 18321, 18333, - 18344, 18356, 18368, 18380, 18392, 18404, 18416, 18428, 18440, 18452, - 18464, 18475, 18487, 18499, 18511, 18523, 18536, 18549, 18562, 18575, - 18588, 18601, 18614, 18626, 18639, 18652, 18665, 18678, 18691, 18704, - 18717, 18730, 18743, 18756, 18768, 18781, 18794, 18807, 18820, 18833, - 18846, 18859, 18872, 18885, 18898, 18910, 18923, 18936, 18949, 18962, - 18975, 18988, 19001, 19014, 19027, 19040, 19052, 19065, 19078, 19091, - 19104, 19117, 19130, 19143, 19156, 19169, 19182, 19194, 19207, 19220, - 19233, 19246, 19259, 19272, 19285, 19298, 19311, 19324, 19336, 19347, - 19360, 19373, 19386, 19399, 19412, 19425, 19438, 19451, 19464, 19477, - 19489, 19502, 19515, 19528, 19541, 19554, 19567, 19580, 19593, 19606, - 19619, 19631, 19644, 19657, 19670, 19683, 19696, 19709, 19722, 19735, - 19748, 19761, 19773, 19786, 19799, 19812, 19825, 19838, 19851, 19864, - 19877, 19890, 19903, 19915, 19928, 19941, 19954, 19967, 19980, 19993, - 20006, 20019, 20032, 20045, 20057, 20070, 20083, 20096, 20109, 20122, - 20135, 20148, 20161, 20174, 20187, 20199, 20212, 20225, 20238, 20251, - 20264, 20277, 20290, 20303, 20316, 20329, 20341, 20354, 20367, 20380, - 20393, 20406, 20419, 20432, 20445, 20458, 20471, 20483, 20496, 20509, - 20522, 20535, 20548, 20561, 20574, 20587, 20600, 20613, 20625, 20638, - 20651, 20664, 20677, 20690, 20703, 20716, 20729, 20742, 20755, 20767, - 20778, 20786, 20794, 20801, 20807, 20811, 20817, 20823, 20831, 20837, - 20842, 20846, 20855, 9155, 20866, 20873, 20881, 20888, 20895, 10948, - 20902, 20911, 20916, 20921, 7805, 20928, 20933, 20936, 20941, 20949, - 20956, 20963, 20970, 20976, 20985, 20994, 21000, 21009, 21013, 21019, - 21024, 21034, 21041, 21047, 21055, 21061, 21068, 21078, 21087, 21091, - 21098, 21102, 21107, 21113, 21121, 21125, 21135, 14415, 21144, 21150, - 21154, 21163, 14420, 21169, 21176, 21187, 21195, 21204, 21212, 8931, - 21220, 21225, 21231, 21236, 21240, 21244, 21248, 9639, 21253, 21261, - 21268, 21277, 21284, 21291, 10878, 21298, 21304, 21308, 21314, 21321, - 21327, 21335, 21341, 21348, 21354, 21360, 21369, 21373, 21381, 21390, - 21397, 21402, 21406, 21417, 21422, 21427, 21432, 21445, 7995, 21449, - 21455, 21463, 21467, 21474, 21483, 21488, 14691, 21496, 21500, 21512, - 21517, 21521, 21524, 21530, 21536, 21541, 21545, 21548, 21559, 21564, - 9383, 21571, 21576, 9388, 21581, 21586, 21591, 21596, 21601, 21606, - 21611, 21616, 21621, 21626, 21631, 21636, 21642, 21647, 21652, 21657, - 21662, 21667, 21672, 21677, 21682, 21687, 21693, 21699, 21704, 21709, - 21714, 21719, 21724, 21729, 21734, 21739, 21744, 21750, 21755, 21760, - 21765, 21771, 21777, 21782, 21787, 21792, 21797, 21802, 21807, 21812, - 21817, 21823, 21828, 21833, 21838, 21843, 21849, 21854, 21859, 21863, - 1368, 129, 21871, 21875, 21879, 21883, 21888, 21892, 13117, 12476, 21896, - 21901, 21905, 21910, 21914, 21919, 21923, 21929, 21934, 21938, 21942, - 21950, 21954, 21958, 21963, 21968, 21972, 21978, 21983, 21987, 21992, - 21997, 22001, 22008, 22015, 22022, 22026, 22030, 22035, 22039, 22042, - 22048, 22061, 22066, 22075, 22080, 9428, 22085, 22088, 2712, 2717, 22092, - 22098, 22104, 7209, 22109, 22114, 22119, 22125, 22130, 13909, 22135, - 22140, 22145, 22150, 22156, 22161, 22166, 22172, 22177, 22181, 22186, - 22191, 22196, 22201, 22205, 22210, 22214, 22219, 22224, 22229, 22234, - 22238, 22243, 22247, 22252, 22257, 22262, 22267, 2886, 22182, 22271, - 22279, 22286, 9733, 22298, 22306, 22187, 22313, 22318, 22326, 22192, - 22331, 22336, 22344, 22349, 22197, 22354, 22359, 22363, 22369, 22377, - 22380, 22387, 22391, 22395, 22401, 22408, 22413, 8958, 1727, 1732, 22417, - 22423, 22429, 22434, 22438, 22442, 22446, 22450, 22454, 22458, 22462, - 22466, 22469, 22475, 22482, 22490, 22496, 22502, 22507, 22512, 22516, - 13829, 13836, 22521, 22533, 22536, 22543, 16362, 22550, 22558, 22569, - 22578, 22591, 22601, 22615, 22627, 22641, 22653, 22663, 22675, 22681, - 22696, 22720, 22738, 22757, 22770, 22784, 22802, 22818, 22835, 22853, - 22864, 22883, 22900, 22920, 22938, 22950, 22964, 22978, 22990, 23007, - 23026, 23044, 23056, 23074, 23093, 14559, 23106, 23126, 23138, 10523, - 23150, 23155, 23160, 23165, 23171, 23176, 23180, 23187, 2398, 23191, - 23197, 23201, 23204, 23208, 23216, 23222, 22215, 23226, 23235, 23246, - 23252, 23258, 23267, 23275, 23282, 23287, 23291, 23298, 23304, 23313, - 23321, 23328, 23338, 23347, 23357, 23362, 23371, 23380, 23391, 23402, - 3963, 23412, 23416, 23426, 23434, 23444, 23455, 23460, 23470, 23478, - 23485, 23491, 23498, 23503, 22225, 23507, 23516, 23520, 23523, 23528, - 23535, 23544, 23552, 23560, 23570, 23579, 23585, 23591, 22230, 22235, - 23595, 23605, 23615, 23625, 23633, 23640, 23650, 23658, 23666, 23672, - 23680, 930, 23689, 14750, 542, 23703, 23712, 23720, 23731, 23742, 23752, - 23761, 23773, 23782, 23791, 23797, 23806, 23815, 23825, 23833, 23841, - 9360, 23847, 23850, 23854, 23859, 23864, 9848, 22248, 22253, 23872, - 23878, 23884, 23889, 23894, 23898, 23906, 23912, 23918, 23922, 3525, - 23930, 23935, 23940, 23944, 23948, 9928, 23955, 23963, 23977, 23984, - 23990, 9937, 9943, 23998, 24006, 24013, 24018, 24023, 22258, 24029, - 24040, 24044, 24049, 2601, 24054, 24065, 24071, 24076, 24080, 24084, - 24087, 24094, 24101, 24108, 24114, 24118, 22263, 24123, 24127, 24131, - 1037, 24136, 24141, 24146, 24151, 24156, 24161, 24166, 24171, 24176, - 24181, 24186, 24191, 24196, 24201, 24207, 24212, 24217, 24222, 24227, - 24232, 24237, 24243, 24248, 24253, 24258, 24263, 24268, 24273, 24278, - 24284, 24290, 24295, 24301, 24306, 24311, 5, 24317, 24321, 24325, 24329, - 24334, 24338, 24342, 24346, 24350, 24355, 24359, 24364, 24368, 24371, - 24375, 24380, 24384, 24389, 24393, 24397, 24401, 24406, 24410, 24414, - 24424, 24429, 24433, 24437, 24442, 24447, 24456, 24461, 24466, 24470, - 24474, 24487, 24499, 24508, 24517, 24523, 24528, 24532, 24536, 24546, - 24555, 24563, 24569, 24574, 24578, 24585, 24595, 24604, 24612, 24620, - 24627, 24635, 24644, 24653, 24661, 24666, 24670, 24674, 24677, 24679, - 24683, 24687, 24692, 24697, 24701, 24705, 24708, 24712, 24715, 24719, - 24722, 24725, 24729, 24735, 24739, 24743, 24747, 24752, 24757, 24762, - 24766, 24769, 24774, 24780, 24785, 24791, 24796, 24800, 24804, 24808, - 24813, 24817, 24822, 24826, 24830, 24837, 24841, 24844, 24848, 24854, - 24860, 24864, 24868, 24873, 24880, 24886, 24890, 24899, 24903, 24907, - 24910, 24916, 24921, 24927, 1489, 1791, 24932, 24937, 24942, 24947, - 24952, 24957, 24962, 2148, 2194, 24967, 24970, 24974, 24978, 24983, - 24987, 24991, 24994, 24999, 25004, 25008, 25011, 25016, 25020, 25025, - 25029, 14762, 25034, 25037, 25040, 25044, 25049, 25053, 25066, 25070, - 25073, 25081, 25090, 25097, 25102, 25108, 25114, 25122, 25129, 25136, - 25140, 25144, 25148, 25153, 25158, 25162, 25170, 25175, 25187, 25198, - 25203, 25207, 25211, 25217, 25222, 25227, 25231, 25235, 25238, 25244, - 7915, 2316, 25248, 25253, 25269, 9475, 25289, 25298, 25314, 25318, 25321, - 25327, 25337, 25343, 25352, 25367, 25379, 25390, 25398, 25407, 25413, - 25422, 25432, 25443, 25454, 25463, 25470, 25479, 25487, 25494, 25502, - 25509, 25516, 25529, 25536, 25542, 25547, 25556, 25562, 25567, 25575, - 25582, 23436, 25594, 25606, 25620, 25628, 25635, 25647, 25656, 25665, - 25673, 25681, 25689, 25696, 25705, 25713, 25723, 25732, 25742, 25751, - 25760, 25768, 25773, 25777, 25780, 25784, 25788, 25792, 25796, 25800, - 25806, 25812, 25820, 14807, 25827, 25832, 25839, 25845, 25852, 14815, - 25859, 25862, 25874, 25882, 25888, 25893, 25897, 9878, 25908, 25918, - 25927, 25934, 25938, 14820, 25941, 25948, 25952, 25958, 25961, 25968, - 25974, 25981, 25987, 25991, 25996, 26000, 26009, 26016, 26022, 7956, - 26029, 26037, 26044, 26050, 26055, 26061, 26067, 26075, 26079, 26082, - 26084, 25785, 26093, 26099, 26109, 26114, 26121, 26127, 26132, 26137, - 26142, 26146, 26151, 26158, 26167, 26171, 26178, 26187, 26193, 26198, - 26204, 26209, 26216, 26227, 26232, 26236, 26246, 26252, 26256, 26261, - 26271, 26280, 26284, 26291, 26299, 26306, 26312, 26317, 26325, 26332, - 26344, 26353, 26357, 13053, 26365, 26375, 26379, 25077, 26390, 26395, - 26399, 26406, 26413, 21974, 25710, 26418, 26422, 26425, 22870, 26430, - 26444, 26460, 26478, 26497, 26514, 26532, 22889, 26549, 26569, 22906, - 26581, 26593, 15745, 26605, 22926, 26619, 26631, 10536, 26645, 26650, - 26655, 26660, 26666, 26672, 26678, 26682, 26689, 26694, 26704, 26710, - 10183, 26716, 26718, 26723, 26731, 26735, 26154, 26741, 26748, 11524, - 11534, 26755, 26765, 26770, 26774, 26777, 26783, 26791, 26803, 26813, - 26829, 26842, 26856, 15763, 26870, 26877, 26881, 26884, 26889, 26893, - 26900, 26907, 26917, 26922, 26927, 26932, 26940, 26948, 26957, 26962, - 9572, 26966, 26969, 26972, 26977, 26984, 26989, 27005, 27013, 27021, - 9423, 27029, 27034, 27038, 27044, 27050, 27053, 27059, 27071, 27079, - 27086, 27092, 27099, 27110, 27124, 27137, 27146, 27155, 27167, 27178, - 27188, 27197, 27206, 27214, 27225, 7938, 27232, 27238, 27243, 27249, - 27256, 27266, 27276, 27285, 27291, 27298, 27303, 27310, 27318, 27326, - 27338, 6246, 27345, 27354, 27362, 27368, 27374, 27379, 27383, 27386, - 27392, 27399, 27404, 27409, 27413, 27425, 27436, 27445, 27453, 14947, - 27458, 27464, 27470, 11517, 8635, 27475, 27479, 27483, 27486, 27489, - 27495, 27503, 27511, 27515, 27519, 27524, 27527, 27536, 27540, 27548, - 27559, 27563, 27569, 27575, 27579, 27585, 27593, 27615, 27639, 27646, - 27653, 27659, 27667, 27673, 27678, 27689, 27707, 27714, 27722, 27726, - 27735, 27748, 27756, 27768, 27779, 27789, 27803, 27812, 27820, 27832, - 9492, 27843, 27854, 27866, 27876, 27885, 27890, 27894, 27902, 27912, - 27917, 27921, 27924, 27927, 27935, 27943, 27952, 27962, 27971, 27977, - 27991, 2663, 28013, 28024, 28033, 28043, 28055, 28064, 28073, 28083, - 28091, 28099, 28108, 28113, 28124, 28129, 28140, 28144, 28154, 28163, - 28171, 28181, 28191, 28199, 28208, 28215, 28223, 28230, 28239, 28243, - 28251, 28258, 28266, 28273, 28284, 28299, 28306, 28312, 28322, 28331, - 28337, 28341, 28348, 28352, 14031, 28358, 28362, 28367, 28374, 28378, - 28382, 28390, 28398, 28404, 28413, 28420, 28425, 28430, 28440, 23505, - 28444, 28447, 28452, 28457, 28462, 28467, 28472, 28477, 28482, 28487, - 28493, 28498, 28503, 28509, 1218, 704, 28514, 28523, 2364, 28530, 28535, - 28539, 28545, 1267, 546, 318, 28550, 28559, 28567, 28576, 28584, 28595, - 28604, 28612, 28616, 28619, 28627, 28635, 28640, 14775, 28646, 28652, - 28658, 5872, 28663, 28667, 28673, 28677, 28684, 1455, 28690, 28697, 9579, - 28701, 28711, 28719, 28725, 28734, 28742, 28748, 28756, 28763, 11110, - 28769, 28776, 28781, 28788, 1496, 2147, 28794, 28800, 28807, 28818, - 28829, 28837, 28844, 28854, 28863, 28871, 28880, 28887, 28894, 28907, - 28918, 1272, 28937, 28942, 28950, 3575, 28954, 28959, 28963, 1459, 24706, - 28973, 28977, 28982, 28986, 3493, 28992, 29000, 29007, 29018, 29026, - 29034, 3576, 279, 29039, 29047, 29055, 29062, 29068, 29073, 2216, 29080, - 29086, 25992, 26222, 29092, 106, 29096, 29100, 29106, 615, 9328, 29111, - 29118, 29124, 2327, 29128, 29132, 15187, 29135, 29140, 29147, 29153, - 29158, 29166, 29173, 29179, 22351, 29183, 29187, 3646, 16625, 29191, - 29196, 29199, 29207, 29215, 29220, 29223, 29230, 29240, 29252, 29257, - 29261, 29269, 29276, 29282, 29289, 29296, 29299, 29303, 29307, 1463, - 29317, 29319, 29324, 29330, 29336, 29341, 29346, 29351, 29356, 29361, - 29366, 29371, 29376, 29381, 29386, 29391, 29396, 29401, 29406, 29412, - 29418, 29424, 29430, 29435, 29440, 29445, 29451, 29456, 29461, 29466, - 29472, 29477, 29483, 29488, 29493, 29498, 29503, 29509, 29514, 29520, - 29525, 29530, 29535, 29540, 29546, 29551, 29557, 29562, 29567, 29572, - 29577, 29582, 29587, 29592, 29597, 29602, 29608, 29614, 29620, 29625, - 29630, 29635, 29640, 29646, 29652, 29658, 29664, 29670, 29676, 29681, - 29687, 29692, 29697, 29702, 29707, 29713, 2443, 29718, 2450, 2457, 2754, - 29723, 2463, 2473, 29729, 29733, 29738, 29743, 29749, 29754, 29759, - 29763, 29768, 29774, 29779, 29784, 29789, 29795, 29800, 29804, 29808, - 29813, 29818, 29823, 29828, 29833, 29839, 29845, 29850, 29854, 29859, - 29865, 29869, 29874, 29879, 29884, 29889, 29893, 29896, 29901, 29906, - 29911, 29916, 29921, 29927, 29933, 29938, 29943, 29947, 29952, 29957, - 29962, 29967, 29972, 29976, 29981, 29986, 29991, 29995, 29999, 30003, - 30008, 30016, 30021, 30027, 30033, 30039, 30044, 30048, 30051, 30056, - 30061, 30065, 30070, 30074, 30079, 30083, 30086, 30091, 17302, 30096, - 30101, 30106, 30114, 21280, 28694, 9026, 30119, 30124, 30128, 30133, - 30137, 30141, 30146, 30150, 30153, 30156, 30160, 30165, 30169, 30177, - 30181, 30184, 30189, 30193, 30197, 30202, 30207, 30211, 30217, 30222, - 30227, 30234, 30241, 30245, 30248, 30254, 30263, 30270, 30278, 30285, - 30289, 30294, 30298, 30302, 30308, 30314, 30318, 30324, 30329, 30334, - 30338, 30345, 30351, 30357, 30363, 30369, 30376, 30382, 30388, 30394, - 30400, 30406, 30412, 30418, 30425, 30431, 30438, 30444, 30450, 30456, - 30462, 30468, 30474, 30480, 30486, 30492, 11418, 30498, 30503, 30508, - 30511, 30519, 30524, 30533, 30539, 30544, 30549, 30554, 30558, 30563, - 30568, 30573, 30578, 30583, 30590, 30597, 30603, 30609, 30614, 16303, - 30621, 30627, 30634, 30640, 30646, 30651, 30659, 30664, 16082, 30668, - 30673, 30678, 30684, 30689, 30694, 30698, 30703, 30708, 30714, 30719, - 30724, 30728, 30733, 30738, 30742, 30747, 30752, 30757, 30761, 30766, - 30771, 30776, 30780, 30784, 15293, 30788, 30797, 30803, 30809, 30818, - 30826, 30835, 30843, 30848, 30852, 30859, 30865, 30869, 30872, 30877, - 30886, 30894, 30899, 1495, 30905, 30908, 30912, 22424, 22430, 30918, - 30922, 30933, 30944, 30955, 30967, 30974, 30981, 30986, 30990, 5909, 755, - 21279, 30998, 31003, 31007, 31012, 31016, 31022, 31027, 31033, 31038, - 31044, 31049, 31055, 31060, 31066, 31072, 31078, 31083, 31039, 31045, - 31087, 31092, 31098, 31103, 31109, 31114, 31120, 31125, 31050, 10421, - 31129, 31061, 31067, 31073, 2831, 3423, 31135, 31138, 31144, 31150, - 31156, 31163, 31169, 31175, 31181, 31187, 31193, 31199, 31205, 31211, - 31217, 31223, 31229, 31235, 31242, 31248, 31254, 31260, 31266, 31272, - 31275, 31280, 31283, 31290, 31298, 31303, 31308, 31314, 31319, 31324, - 31328, 31333, 31339, 31344, 31350, 31355, 31361, 31366, 31372, 31378, - 31382, 31387, 31392, 31397, 31402, 31406, 31411, 31416, 31421, 31427, - 31433, 31439, 31445, 31450, 31454, 31457, 31463, 31469, 31478, 31486, - 31493, 31498, 31502, 31506, 31511, 15146, 31516, 31524, 31530, 3683, - 1377, 31535, 31539, 8005, 31545, 31551, 31558, 8014, 31562, 31568, 31575, - 31581, 31590, 31598, 31610, 31614, 31621, 31627, 31631, 31634, 31643, - 31651, 31040, 31656, 31666, 31676, 31686, 31692, 31697, 31707, 31712, - 31725, 31739, 31750, 31762, 31774, 31788, 31801, 31813, 31825, 14600, - 31839, 31844, 31849, 31853, 31857, 31861, 1780, 27176, 31865, 31870, - 31088, 31875, 31878, 31883, 31888, 31893, 31899, 31905, 10098, 31910, - 31917, 15697, 31923, 31928, 31933, 31937, 31942, 31947, 31093, 31952, - 31957, 31962, 31968, 31099, 31973, 31976, 31983, 31991, 31997, 32003, - 32009, 32020, 32025, 32032, 32039, 32046, 32054, 32063, 32072, 32078, - 32084, 32092, 31104, 32097, 32103, 32109, 31110, 32114, 32119, 32127, - 32135, 32141, 32148, 32154, 32161, 32168, 32174, 32182, 32192, 32199, - 32204, 32210, 32215, 32220, 32227, 32236, 32244, 32249, 32255, 32262, - 32270, 32276, 32281, 32287, 32296, 27957, 32303, 32307, 32312, 32321, - 32326, 32331, 32336, 12405, 32344, 32349, 32354, 32359, 32363, 32368, - 32373, 32380, 32385, 32390, 32395, 31115, 21216, 32401, 2519, 244, 32404, - 32407, 32411, 32415, 32425, 32433, 32437, 32444, 32451, 32455, 32458, - 32464, 32472, 32480, 32484, 32488, 32491, 32498, 32502, 32506, 32513, - 32521, 31051, 32528, 32536, 10158, 664, 308, 32548, 32553, 32558, 32564, - 32569, 32574, 3704, 32579, 32582, 32587, 32592, 32597, 32602, 32607, - 32614, 22529, 32619, 32624, 32629, 32634, 32639, 32645, 32650, 32656, - 31286, 32662, 32667, 32673, 32679, 32689, 32694, 32699, 32703, 32708, - 32713, 32718, 32723, 32736, 32741, 22302, 16705, 3710, 32745, 32750, - 32755, 32761, 32766, 32771, 32775, 32780, 32785, 32791, 32796, 32801, - 1382, 32805, 32810, 32815, 32820, 32824, 32829, 32834, 32839, 32845, - 32851, 32856, 32860, 32864, 32869, 32874, 32879, 32883, 32891, 32895, - 32901, 32905, 32912, 16498, 31062, 32918, 32925, 32933, 32940, 32946, - 32959, 32971, 32977, 32981, 2773, 32985, 32989, 32493, 32998, 33009, - 33014, 33019, 33024, 33028, 33033, 22435, 33037, 33041, 33046, 31068, - 21300, 33050, 33055, 33061, 33066, 33070, 33074, 33077, 33081, 33087, - 33098, 33110, 31074, 33115, 33118, 33122, 347, 33127, 33132, 33137, - 33142, 33147, 33152, 33158, 33163, 33168, 33174, 33179, 33185, 33190, - 33196, 33201, 33206, 33211, 33216, 33221, 33226, 33231, 33236, 33242, - 33247, 33252, 33257, 33262, 33267, 33272, 33277, 33283, 33289, 33294, - 33299, 33304, 33309, 33314, 33319, 33324, 33329, 33334, 33339, 33344, - 33349, 33354, 33359, 33364, 33369, 33374, 33379, 33385, 313, 26, 33390, - 33394, 33398, 33406, 33410, 33414, 33417, 33420, 33422, 33427, 33431, - 33436, 33440, 33445, 33449, 33454, 33458, 33461, 33463, 33467, 33472, - 33476, 33487, 33490, 33492, 33496, 33508, 33517, 33521, 33525, 33531, - 33536, 33545, 33551, 33556, 33561, 33565, 33570, 33577, 33582, 33588, - 33593, 33597, 33604, 25718, 25728, 33608, 33613, 33618, 33623, 33630, - 33634, 33641, 8113, 33647, 33656, 33664, 33679, 33693, 33701, 33712, - 33721, 33726, 7227, 33736, 33741, 33746, 33750, 33753, 33757, 33762, - 33766, 33773, 33778, 33783, 8912, 33793, 33795, 33798, 33802, 33808, - 33812, 33817, 33822, 33828, 33833, 33839, 33844, 33854, 33863, 33871, - 33876, 33882, 33887, 33894, 33898, 33906, 33913, 33926, 33934, 33938, - 33948, 33953, 33957, 33965, 33973, 33977, 33986, 33992, 33997, 34005, - 34015, 34024, 34033, 34042, 34053, 34061, 34072, 34081, 34088, 34094, - 34099, 34110, 34115, 34119, 34122, 34126, 34134, 34140, 34148, 34155, - 34161, 34166, 34172, 2418, 34176, 34178, 34183, 34188, 34193, 34196, - 34198, 34202, 34205, 34212, 34216, 9891, 34220, 34226, 34236, 34241, - 34247, 34251, 34256, 34269, 26104, 34275, 34284, 17475, 34291, 34300, - 31672, 34308, 34313, 34317, 34325, 34332, 34337, 34341, 34346, 34350, - 34358, 34364, 34370, 34375, 34379, 34382, 34387, 34400, 34416, 22996, - 34433, 34445, 34462, 34474, 34488, 23013, 23032, 34500, 34512, 2680, - 34526, 34531, 34536, 34541, 34545, 34552, 34564, 34570, 34573, 34584, - 34595, 34600, 32089, 695, 34604, 34608, 34612, 34615, 34620, 34625, - 34631, 34636, 34641, 34647, 34653, 34658, 34662, 34667, 34672, 34677, - 34681, 34684, 34690, 34695, 34700, 34705, 34709, 34714, 34720, 34728, - 26337, 34733, 34738, 34745, 34751, 34757, 34762, 34770, 22538, 34777, - 34782, 34787, 34792, 34796, 34799, 34804, 34808, 34812, 34819, 34825, - 34831, 34837, 34844, 34849, 34855, 33968, 34859, 34863, 34868, 34881, - 34886, 34892, 34900, 34907, 34915, 34925, 34931, 34937, 34943, 34947, - 34956, 34964, 34971, 34976, 34981, 10444, 34986, 34994, 35001, 35007, - 35017, 35022, 35028, 35036, 3608, 35043, 35050, 3614, 35054, 35059, - 35070, 35077, 35083, 35092, 35096, 4015, 35099, 35106, 35112, 35118, - 35126, 35136, 29063, 35143, 35151, 35156, 35162, 35167, 25964, 35173, - 35180, 35186, 35195, 23677, 35202, 35207, 35211, 35219, 35227, 9607, - 5895, 35234, 35238, 35240, 35244, 35249, 35251, 35257, 35262, 35267, - 35274, 32610, 35280, 35285, 35289, 35294, 35298, 35307, 35311, 35317, - 35324, 35330, 35337, 35342, 35351, 35356, 35360, 35365, 35372, 35380, - 35388, 35393, 21356, 35397, 35400, 35404, 35408, 35412, 35415, 35417, - 35425, 35429, 35436, 35440, 35444, 35452, 35459, 35469, 35473, 35477, - 35485, 35493, 35499, 35504, 35513, 13357, 35519, 35528, 35533, 35540, - 35548, 35556, 35564, 35571, 35578, 35585, 35592, 35599, 35604, 35610, - 35627, 35635, 35645, 35653, 35660, 407, 35664, 35670, 35674, 35679, - 33717, 35685, 35688, 35692, 35700, 3619, 35708, 35714, 35720, 35729, - 35739, 35746, 35752, 3625, 3631, 35761, 35768, 35776, 35781, 35785, - 35792, 35800, 35807, 35813, 35822, 35832, 35838, 35846, 35855, 35862, - 35870, 35877, 22032, 35881, 35888, 35894, 35904, 35913, 35924, 35928, - 35938, 35944, 35951, 35959, 35968, 35977, 35987, 35998, 36005, 36010, - 36017, 3029, 36025, 36031, 36036, 36042, 36048, 36053, 36066, 36079, - 36092, 36099, 36105, 36113, 36121, 36126, 36130, 1469, 36134, 36139, - 36144, 36149, 36154, 36160, 36165, 36170, 36175, 36180, 36185, 36190, - 36195, 36201, 36207, 36212, 36217, 36223, 36228, 36233, 36238, 36244, - 36249, 36254, 36259, 36264, 36270, 36275, 36280, 36286, 36291, 36296, - 36301, 36306, 36311, 36317, 36322, 36328, 36333, 36339, 36344, 36349, - 36354, 36360, 36366, 36372, 36378, 36384, 36390, 36396, 36402, 36407, - 36412, 36418, 36423, 36428, 36433, 36438, 36443, 36448, 36453, 36459, - 36464, 36469, 36475, 36481, 101, 36486, 36488, 36492, 36496, 36500, - 36505, 36509, 9528, 36513, 36519, 1741, 6280, 36525, 36528, 36533, 36537, - 36542, 36546, 36550, 36555, 10245, 36559, 36563, 36567, 36571, 15385, - 36576, 36580, 36585, 36590, 36595, 36599, 36606, 26128, 36612, 36615, - 36619, 36624, 36630, 36634, 36642, 36648, 36653, 36657, 36663, 36667, - 36671, 3462, 3467, 29255, 36674, 36678, 36682, 36686, 36690, 36698, - 36705, 36709, 36716, 36721, 317, 36726, 36730, 36736, 36748, 36754, - 36760, 36764, 36770, 36779, 36783, 36787, 36792, 36798, 36803, 36807, - 36812, 36816, 36820, 36827, 36833, 36838, 36853, 36868, 36883, 36899, - 36917, 10195, 36931, 36938, 36942, 36945, 36954, 36959, 36963, 36971, - 33919, 36979, 36983, 36993, 37004, 29225, 37017, 37021, 37030, 37038, - 9785, 14913, 37042, 22447, 37045, 30173, 37050, 9784, 37055, 37061, - 37066, 37072, 37077, 37083, 37088, 37094, 37099, 37105, 37111, 37117, - 37122, 37078, 37084, 37089, 37095, 37100, 37106, 37112, 8126, 3874, - 37126, 37134, 37138, 37141, 37145, 37150, 37155, 37161, 37167, 37172, - 37176, 25976, 37180, 37184, 37190, 37194, 9049, 37203, 37210, 37214, - 11875, 37221, 37227, 37232, 37239, 37246, 37253, 28571, 8049, 37260, - 37267, 37274, 37280, 37285, 37292, 37303, 37309, 37314, 37319, 37324, - 37331, 37079, 37335, 37345, 37356, 37362, 37367, 37372, 37377, 37382, - 37387, 37391, 37395, 37401, 37409, 2319, 865, 10261, 10273, 10278, 10284, - 37418, 10289, 10294, 10300, 37423, 37433, 37437, 10305, 37442, 16903, - 37445, 37450, 37454, 37459, 37464, 37471, 37478, 37482, 37485, 37493, - 10208, 37500, 37503, 37509, 37519, 5929, 37528, 37532, 37540, 37544, - 37554, 37560, 37571, 37577, 37583, 37588, 37594, 37600, 37606, 37611, - 37614, 37621, 37627, 37632, 37639, 37646, 37650, 37660, 37673, 37682, - 37691, 37702, 37715, 37726, 37735, 37746, 37751, 37760, 37765, 10310, - 37771, 37778, 37786, 37791, 37795, 37802, 37809, 3829, 16, 37813, 37818, - 16757, 37822, 37825, 37828, 28077, 37832, 28580, 37840, 37844, 37848, - 37851, 37857, 37101, 37863, 37871, 37877, 37884, 28060, 37888, 28254, - 37892, 37901, 37907, 37913, 37918, 37922, 37928, 37932, 37940, 37948, - 26194, 37954, 37961, 37967, 37972, 37977, 37981, 37987, 37992, 37998, - 4056, 791, 38005, 38009, 38012, 15275, 38024, 35851, 38035, 38038, 38045, - 38049, 38055, 38059, 38065, 38070, 38076, 38081, 38086, 38090, 38094, - 38099, 38104, 38114, 38120, 38133, 38139, 38145, 38152, 38157, 38163, - 38168, 16643, 1472, 1019, 31218, 31224, 38173, 31230, 31243, 31249, - 31255, 38179, 31261, 31267, 38185, 38191, 22, 38199, 38206, 38210, 38214, - 38222, 31978, 38226, 38230, 38237, 38242, 38246, 38251, 38257, 38262, - 38268, 38273, 38277, 38281, 38285, 38290, 38294, 38299, 38303, 38310, - 38315, 38319, 38324, 38328, 38333, 38337, 38342, 38348, 15495, 15500, - 38353, 38357, 38360, 38364, 21183, 38369, 38373, 38379, 38386, 38391, - 38401, 38406, 38414, 38418, 38421, 31993, 38425, 4109, 38430, 38435, - 38439, 38444, 38448, 38453, 13375, 38464, 38468, 38471, 38476, 38480, - 38484, 38487, 38491, 8145, 13391, 38494, 38497, 38503, 38508, 38514, - 38519, 38525, 38530, 38536, 38541, 38547, 38553, 38559, 38564, 38568, - 38572, 38581, 38597, 38613, 38623, 27967, 38630, 38634, 38639, 38644, - 38648, 38652, 35972, 38658, 38663, 38667, 38674, 38679, 38683, 38687, - 26996, 38693, 21451, 38698, 38705, 38713, 38719, 38726, 38734, 38740, - 38744, 38750, 38758, 38762, 38771, 9509, 38779, 38783, 38791, 38798, - 38803, 38808, 38812, 38815, 38819, 38822, 38826, 38833, 38838, 38844, - 26415, 31281, 38848, 38855, 38861, 38867, 38872, 38875, 38877, 38884, - 38891, 38897, 38901, 38904, 38908, 38912, 38916, 38921, 38925, 38929, - 38932, 38936, 38950, 23062, 38969, 38982, 38995, 39008, 23080, 39023, - 10497, 39038, 39044, 39048, 39052, 39059, 39064, 39068, 39075, 39081, - 39086, 39092, 39102, 39114, 39125, 39130, 39137, 39141, 39145, 39148, - 15891, 3677, 39156, 15522, 39169, 39176, 39180, 39184, 39189, 39194, - 39200, 39204, 39208, 39211, 7742, 15533, 39216, 39220, 39226, 39235, - 39240, 39247, 35828, 39253, 39258, 39262, 39267, 39274, 39278, 39281, - 39285, 39290, 14565, 39297, 39304, 1077, 39308, 39313, 39318, 39324, - 39329, 39334, 39338, 39348, 39353, 39359, 39364, 39370, 39375, 39381, - 39391, 39396, 39401, 39405, 7229, 7241, 39410, 39413, 39420, 39426, - 34084, 34091, 39435, 39439, 32041, 39447, 39458, 39466, 36020, 39473, - 39478, 39483, 39494, 39501, 39512, 32065, 21457, 39520, 735, 39525, - 39531, 28051, 39537, 39542, 39552, 39561, 39568, 39574, 39578, 39581, - 39588, 39594, 39601, 39607, 39617, 39625, 39631, 39637, 39642, 39646, - 39653, 39659, 39666, 38917, 535, 13818, 39672, 39677, 39680, 39686, - 39694, 1396, 39699, 39703, 39708, 39715, 39721, 39725, 39729, 39734, - 39743, 39750, 39760, 39766, 28095, 39783, 39792, 39800, 39806, 39811, - 39818, 39824, 39832, 39841, 39849, 39853, 39858, 39866, 32074, 39872, - 39891, 15824, 39905, 39921, 39935, 39941, 39946, 39951, 39956, 39962, - 32080, 39967, 39974, 39979, 39983, 345, 2936, 39990, 39995, 40000, 27322, - 39821, 40004, 40009, 40017, 40021, 40024, 40030, 40036, 40040, 28150, - 40043, 40048, 40052, 40055, 40060, 40064, 40069, 40074, 40078, 40083, - 40087, 40091, 21179, 21190, 40095, 40100, 40106, 26953, 40111, 40115, - 21266, 16072, 40118, 40123, 40128, 40133, 40138, 40143, 40148, 40153, - 450, 49, 31299, 31304, 31309, 31315, 31320, 31325, 40158, 31329, 40162, - 40166, 40170, 31334, 31340, 40184, 31351, 31356, 40192, 40197, 31362, - 40202, 40207, 40212, 40217, 40223, 40229, 40235, 31379, 40248, 40254, - 31383, 40258, 31388, 40263, 31393, 31398, 40266, 40271, 40275, 30948, - 40281, 13599, 40288, 40293, 31403, 40297, 40302, 40307, 40312, 40316, - 40321, 40326, 40332, 40337, 40342, 40348, 40354, 40359, 40363, 40368, - 40373, 40378, 40382, 40387, 40392, 40397, 40403, 40409, 40415, 40420, - 40424, 40429, 40433, 31407, 31412, 31417, 40437, 40441, 40445, 31422, - 31428, 31434, 31446, 40457, 26013, 40461, 40465, 40470, 40475, 40480, - 40485, 40489, 40493, 40503, 40508, 40513, 40517, 40521, 40524, 40532, - 31494, 40537, 1479, 40543, 40551, 40560, 40564, 40568, 40576, 40582, - 40590, 40606, 40610, 40614, 40619, 40634, 31531, 1749, 12055, 40638, - 1378, 40650, 40651, 40659, 40666, 40671, 40678, 40683, 9379, 1119, 10332, - 40690, 40695, 40698, 40701, 40710, 1286, 40715, 39065, 40722, 40727, - 40731, 22503, 2557, 40739, 10741, 40749, 40755, 2337, 2347, 40764, 40773, - 40783, 40794, 3293, 34237, 10384, 3807, 16681, 1291, 40799, 40807, 40814, - 40819, 40823, 40827, 23875, 10411, 40835, 40844, 40853, 40861, 40868, - 40879, 40884, 40897, 40910, 40922, 40934, 40946, 40959, 40970, 40981, - 40991, 40999, 41007, 41019, 41031, 41042, 41051, 41059, 41066, 41078, - 41085, 41094, 41101, 41114, 41119, 41129, 41134, 41140, 41145, 37211, - 41149, 41156, 41160, 41167, 41175, 2518, 41182, 41193, 41203, 41212, - 41220, 41230, 41238, 41248, 41257, 41262, 41268, 41274, 3709, 41285, - 41295, 41304, 41313, 41323, 41331, 41340, 41345, 41350, 41355, 1705, 37, - 41363, 41371, 41382, 41393, 16356, 41403, 41407, 41414, 41420, 41425, - 41429, 41440, 41450, 41459, 41470, 16730, 16735, 41475, 41484, 41489, - 41499, 41504, 41512, 41520, 41527, 41533, 7078, 228, 41537, 41543, 41548, - 41551, 2117, 39181, 41559, 41563, 41566, 1512, 41572, 13980, 1296, 41577, - 41590, 41604, 2643, 41622, 41634, 41646, 2657, 2674, 41660, 41673, 2689, - 41687, 41699, 2704, 41713, 1302, 1308, 1314, 10659, 41718, 41723, 41728, - 41732, 41747, 41762, 41777, 41792, 41807, 41822, 41837, 41852, 41867, - 41882, 41897, 41912, 41927, 41942, 41957, 41972, 41987, 42002, 42017, - 42032, 42047, 42062, 42077, 42092, 42107, 42122, 42137, 42152, 42167, - 42182, 42197, 42212, 42227, 42242, 42257, 42272, 42287, 42302, 42317, - 42332, 42347, 42362, 42377, 42392, 42407, 42422, 42437, 42452, 42467, - 42482, 42497, 42512, 42527, 42542, 42557, 42572, 42587, 42602, 42617, - 42632, 42647, 42662, 42677, 42692, 42707, 42722, 42737, 42752, 42767, - 42782, 42797, 42812, 42827, 42842, 42857, 42872, 42887, 42902, 42917, - 42932, 42947, 42962, 42977, 42992, 43007, 43022, 43037, 43052, 43067, - 43082, 43097, 43112, 43127, 43142, 43157, 43172, 43187, 43202, 43217, - 43232, 43247, 43262, 43277, 43292, 43307, 43322, 43337, 43352, 43367, - 43382, 43397, 43412, 43427, 43442, 43457, 43472, 43487, 43502, 43517, - 43532, 43547, 43562, 43577, 43592, 43607, 43622, 43637, 43652, 43667, - 43682, 43697, 43712, 43727, 43742, 43757, 43772, 43787, 43802, 43817, - 43832, 43847, 43862, 43877, 43892, 43907, 43922, 43937, 43952, 43967, - 43982, 43997, 44012, 44027, 44042, 44057, 44072, 44087, 44102, 44117, - 44132, 44147, 44162, 44177, 44192, 44207, 44222, 44237, 44252, 44267, - 44282, 44297, 44312, 44327, 44342, 44357, 44372, 44387, 44402, 44417, - 44432, 44447, 44462, 44477, 44492, 44507, 44522, 44537, 44552, 44567, - 44582, 44597, 44612, 44627, 44642, 44657, 44672, 44687, 44702, 44717, - 44732, 44747, 44762, 44777, 44792, 44807, 44822, 44837, 44852, 44867, - 44882, 44897, 44912, 44927, 44942, 44957, 44972, 44987, 45002, 45017, - 45032, 45047, 45062, 45077, 45092, 45107, 45122, 45137, 45152, 45167, - 45182, 45197, 45212, 45227, 45242, 45257, 45272, 45287, 45302, 45317, - 45332, 45347, 45362, 45377, 45392, 45407, 45422, 45437, 45452, 45467, - 45482, 45497, 45512, 45527, 45542, 45557, 45572, 45587, 45602, 45617, - 45632, 45647, 45662, 45677, 45692, 45707, 45722, 45737, 45752, 45767, - 45782, 45797, 45812, 45827, 45842, 45857, 45872, 45887, 45902, 45917, - 45932, 45947, 45962, 45977, 45992, 46007, 46022, 46037, 46052, 46067, - 46082, 46097, 46112, 46127, 46142, 46157, 46172, 46187, 46202, 46217, - 46232, 46247, 46262, 46277, 46292, 46307, 46322, 46337, 46352, 46367, - 46382, 46397, 46412, 46427, 46442, 46457, 46472, 46487, 46502, 46517, - 46532, 46547, 46562, 46577, 46592, 46607, 46622, 46637, 46652, 46667, - 46682, 46697, 46712, 46727, 46742, 46757, 46772, 46787, 46802, 46817, - 46832, 46847, 46862, 46877, 46892, 46907, 46922, 46937, 46952, 46967, - 46982, 46997, 47012, 47027, 47042, 47057, 47072, 47087, 47102, 47117, - 47132, 47147, 47162, 47177, 47192, 47207, 47222, 47237, 47252, 47267, - 47282, 47297, 47312, 47327, 47342, 47357, 47372, 47387, 47402, 47417, - 47432, 47447, 47462, 47477, 47492, 47507, 47522, 47537, 47552, 47567, - 47582, 47597, 47612, 47627, 47642, 47657, 47672, 47687, 47702, 47717, - 47732, 47747, 47762, 47777, 47792, 47807, 47822, 47837, 47852, 47867, - 47882, 47897, 47912, 47927, 47942, 47957, 47972, 47987, 48002, 48017, - 48032, 48047, 48062, 48077, 48092, 48107, 48122, 48137, 48152, 48167, - 48182, 48197, 48212, 48227, 48242, 48257, 48272, 48287, 48302, 48317, - 48332, 48347, 48362, 48377, 48392, 48407, 48422, 48437, 48452, 48467, - 48482, 48497, 48512, 48527, 48542, 48557, 48572, 48587, 48602, 48617, - 48632, 48647, 48662, 48677, 48692, 48707, 48722, 48737, 48752, 48767, - 48782, 48797, 48812, 48827, 48842, 48857, 48872, 48887, 48902, 48917, - 48932, 48947, 48962, 48977, 48992, 49007, 49022, 49037, 49052, 49067, - 49082, 49097, 49112, 49127, 49142, 49157, 49172, 49187, 49202, 49217, - 49232, 49247, 49262, 49277, 49292, 49307, 49322, 49337, 49352, 49367, - 49382, 49397, 49412, 49427, 49442, 49457, 49472, 49487, 49502, 49517, - 49532, 49548, 49564, 49580, 49596, 49612, 49628, 49644, 49660, 49676, - 49692, 49708, 49724, 49740, 49756, 49772, 49788, 49804, 49820, 49836, - 49852, 49868, 49884, 49900, 49916, 49932, 49948, 49964, 49980, 49996, - 50012, 50028, 50044, 50060, 50076, 50092, 50108, 50124, 50140, 50156, - 50172, 50188, 50204, 50220, 50236, 50252, 50268, 50284, 50300, 50316, - 50332, 50348, 50364, 50380, 50396, 50412, 50428, 50444, 50460, 50476, - 50492, 50508, 50524, 50540, 50556, 50572, 50588, 50604, 50620, 50636, - 50652, 50668, 50684, 50700, 50716, 50732, 50748, 50764, 50780, 50796, - 50812, 50828, 50844, 50860, 50876, 50892, 50908, 50924, 50940, 50956, - 50972, 50988, 51004, 51020, 51036, 51052, 51068, 51084, 51100, 51116, - 51132, 51148, 51164, 51180, 51196, 51212, 51228, 51244, 51260, 51276, - 51292, 51308, 51324, 51340, 51356, 51372, 51388, 51404, 51420, 51436, - 51452, 51468, 51484, 51500, 51516, 51532, 51548, 51564, 51580, 51596, - 51612, 51628, 51644, 51660, 51676, 51692, 51708, 51724, 51740, 51756, - 51772, 51788, 51804, 51820, 51836, 51852, 51868, 51884, 51900, 51916, - 51932, 51948, 51964, 51980, 51996, 52012, 52028, 52044, 52060, 52076, - 52092, 52108, 52124, 52140, 52156, 52172, 52188, 52204, 52220, 52236, - 52252, 52268, 52284, 52300, 52316, 52332, 52348, 52364, 52380, 52396, - 52412, 52428, 52444, 52460, 52476, 52492, 52508, 52524, 52540, 52556, - 52572, 52588, 52604, 52620, 52636, 52652, 52668, 52684, 52700, 52716, - 52732, 52748, 52764, 52780, 52796, 52812, 52828, 52844, 52860, 52876, - 52892, 52908, 52924, 52940, 52956, 52972, 52988, 53004, 53020, 53036, - 53052, 53068, 53084, 53100, 53116, 53132, 53148, 53164, 53180, 53196, - 53212, 53228, 53244, 53260, 53276, 53292, 53308, 53324, 53340, 53356, - 53372, 53388, 53404, 53420, 53436, 53452, 53468, 53484, 53500, 53516, - 53532, 53548, 53564, 53580, 53596, 53612, 53628, 53644, 53660, 53676, - 53692, 53708, 53724, 53740, 53756, 53772, 53788, 53804, 53820, 53836, - 53852, 53868, 53884, 53900, 53916, 53932, 53948, 53964, 53980, 53996, - 54012, 54028, 54044, 54060, 54076, 54092, 54108, 54124, 54140, 54156, - 54172, 54188, 54204, 54220, 54236, 54252, 54268, 54284, 54300, 54316, - 54332, 54348, 54364, 54380, 54396, 54412, 54428, 54444, 54460, 54476, - 54492, 54508, 54524, 54540, 54556, 54572, 54588, 54604, 54620, 54636, - 54652, 54668, 54684, 54700, 54716, 54732, 54748, 54764, 54780, 54796, - 54812, 54828, 54844, 54860, 54876, 54892, 54908, 54924, 54940, 54956, - 54972, 54988, 55004, 55020, 55036, 55052, 55068, 55084, 55100, 55116, - 55132, 55148, 55164, 55180, 55196, 55212, 55228, 55244, 55260, 55276, - 55292, 55308, 55324, 55340, 55356, 55372, 55388, 55404, 55420, 55436, - 55452, 55468, 55484, 55500, 55516, 55532, 55548, 55564, 55580, 55596, - 55612, 55628, 55644, 55660, 55676, 55692, 55708, 55724, 55740, 55756, - 55772, 55788, 55804, 55820, 55836, 55852, 55868, 55884, 55900, 55916, - 55932, 55948, 55964, 55980, 55996, 56012, 56028, 56044, 56060, 56076, - 56092, 56108, 56124, 56140, 56156, 56172, 56188, 56204, 56220, 56236, - 56252, 56268, 56284, 56300, 56316, 56332, 56348, 56364, 56380, 56396, - 56412, 56428, 56444, 56460, 56476, 56492, 56508, 56524, 56540, 56556, - 56572, 56588, 56604, 56620, 56636, 56652, 56668, 56684, 56700, 56716, - 56732, 56748, 56764, 56780, 56796, 56812, 56828, 56844, 56860, 56876, - 56892, 56908, 56924, 56940, 56956, 56972, 56988, 57004, 57020, 57036, - 57052, 57068, 57084, 57100, 57116, 57132, 57148, 57164, 57180, 57196, - 57212, 57228, 57244, 57260, 57276, 57292, 57308, 57324, 57340, 57356, - 57372, 57388, 57404, 57420, 57436, 57452, 57468, 57484, 57500, 57516, - 57532, 57548, 57564, 57580, 57596, 57612, 57628, 57644, 57660, 57676, - 57692, 57708, 57724, 57740, 57756, 57772, 57788, 57804, 57820, 57836, - 57852, 57868, 57884, 57900, 57916, 57932, 57948, 57964, 57980, 57996, - 58012, 58028, 58044, 58060, 58076, 58092, 58108, 58124, 58140, 58156, - 58172, 58188, 58204, 58219, 16762, 58228, 58234, 58240, 58250, 58258, - 14894, 15445, 9960, 58271, 1520, 58279, 3761, 27432, 7183, 58285, 58290, - 58295, 58300, 58305, 58311, 58316, 58322, 58327, 58333, 58338, 58343, - 58348, 58353, 58359, 58364, 58369, 58374, 58379, 58384, 58389, 58394, - 58400, 58405, 58411, 58418, 2561, 58423, 58429, 8526, 58433, 58438, - 58445, 58453, 40, 58457, 58463, 58468, 58473, 58477, 58482, 58486, 58490, - 10684, 58494, 58504, 58517, 58528, 58541, 58548, 58554, 58559, 58565, - 58571, 58577, 58582, 58587, 58592, 58597, 58601, 58606, 58611, 58616, - 58622, 58628, 58634, 58639, 58643, 58648, 58653, 58657, 58662, 58667, - 58672, 58676, 10700, 10711, 10716, 1563, 58680, 1568, 58686, 16239, - 58689, 58695, 1599, 58701, 1605, 1611, 10746, 58706, 58714, 58721, 58725, - 58731, 58736, 30977, 58741, 58748, 58753, 58757, 58761, 1616, 16331, - 58770, 58774, 16342, 1125, 58778, 58785, 58790, 58794, 16367, 1620, - 37350, 58797, 58802, 58812, 58821, 58826, 58830, 58836, 1625, 39259, - 58841, 58850, 58856, 58861, 10904, 10910, 58867, 58879, 58896, 58913, - 58930, 58947, 58964, 58981, 58998, 59015, 59032, 59049, 59066, 59083, - 59100, 59117, 59134, 59151, 59168, 59185, 59202, 59219, 59236, 59253, - 59270, 59287, 59304, 59321, 59338, 59355, 59372, 59389, 59406, 59423, - 59440, 59457, 59474, 59491, 59508, 59525, 59542, 59559, 59576, 59593, - 59610, 59627, 59644, 59661, 59678, 59695, 59712, 59723, 59728, 1630, - 59732, 59738, 59743, 59748, 9326, 1635, 59754, 59763, 27731, 59768, - 59779, 59789, 59794, 59801, 59807, 59812, 59817, 16619, 59821, 10921, - 1640, 10926, 59827, 59832, 59838, 59843, 59848, 59853, 59858, 59863, - 59868, 59873, 59879, 59885, 59891, 59896, 59900, 59905, 59910, 59914, - 59919, 59924, 59929, 59933, 59938, 59944, 59949, 59954, 59958, 59963, - 59968, 59974, 59979, 59984, 59990, 59996, 60001, 60005, 60010, 60015, - 60020, 60024, 60029, 60034, 60039, 60045, 60051, 60056, 60060, 60064, - 60069, 60074, 60079, 29129, 60083, 60088, 60093, 60099, 60104, 60109, - 60113, 60118, 60123, 60129, 60134, 60139, 60145, 60151, 60156, 60160, - 60165, 60170, 60174, 60179, 60184, 60189, 60195, 60201, 60206, 60210, - 60215, 60220, 60224, 60229, 60234, 60239, 60243, 60246, 31639, 60251, - 60259, 16685, 3663, 11017, 60265, 60275, 60290, 11022, 60301, 60306, - 60317, 60329, 60341, 60353, 2695, 60365, 60370, 60382, 60386, 60392, - 60398, 60403, 1652, 1078, 60412, 60417, 39309, 60421, 60425, 60430, - 60434, 16770, 60439, 60442, 60450, 60458, 1656, 11047, 11053, 1661, - 60466, 60473, 60478, 60487, 60497, 60504, 60509, 60514, 1666, 60521, - 60526, 16885, 60530, 60535, 60542, 60548, 60552, 60563, 60573, 16907, - 9234, 9241, 1671, 60580, 60586, 60594, 60601, 60607, 60614, 60626, 60632, - 60637, 60649, 60660, 60669, 60679, 3740, 30813, 30822, 16947, 1676, 1680, - 60687, 60698, 60703, 1683, 60711, 60716, 16998, 60728, 60734, 60739, - 60747, 1688, 60752, 60757, 60765, 60773, 60780, 60789, 60797, 60806, - 1693, 60810, 1698, 60815, 60822, 17072, 60830, 60836, 60841, 60849, - 60856, 60864, 22574, 60869, 11182, 60878, 60884, 60891, 60898, 60904, - 60914, 60920, 60925, 60936, 60941, 60949, 11191, 11196, 60957, 60963, - 60971, 3805, 17114, 39397, 60976, 60982, 60987, 60995, 61002, 12036, - 61007, 61013, 1709, 61018, 61021, 1132, 61027, 61032, 61037, 61043, - 61048, 61053, 61058, 61063, 61068, 61073, 1718, 9, 61079, 61083, 61088, - 61092, 61096, 61100, 31879, 61105, 61110, 61115, 61119, 61122, 61126, - 61130, 61135, 61139, 61144, 61148, 34616, 34621, 34626, 61151, 61158, - 61164, 39118, 61174, 34632, 32137, 31894, 31900, 34648, 31906, 61179, - 61184, 32170, 61188, 61191, 61195, 61202, 61205, 61210, 61214, 61218, - 61221, 61231, 61243, 61250, 61256, 61263, 33573, 61266, 8543, 877, 61269, - 61273, 61278, 3690, 61282, 61285, 13632, 61292, 61299, 61312, 61320, - 61329, 61338, 61343, 61353, 61366, 61378, 61385, 61390, 61399, 61412, - 36060, 61430, 61435, 61442, 61448, 656, 61453, 61461, 61468, 27271, 627, - 61474, 61480, 61490, 61496, 61501, 31924, 6003, 31938, 61505, 61515, - 61520, 61530, 61545, 61551, 61557, 31948, 61562, 31094, 61566, 61571, - 61576, 61580, 61585, 16950, 61592, 61597, 61601, 6044, 31974, 61605, - 61611, 312, 61621, 61628, 61635, 61640, 61649, 58806, 61655, 61663, - 61667, 61671, 61675, 61679, 61684, 61688, 61694, 61702, 61707, 61712, - 61716, 61721, 61725, 61729, 61735, 61741, 61746, 61750, 32098, 61755, - 32104, 32110, 61760, 61766, 61773, 61778, 61782, 31111, 16612, 61785, - 61789, 61794, 61801, 61807, 61811, 61816, 38828, 61822, 61826, 61830, - 61835, 61841, 61847, 61859, 61868, 61878, 61884, 61891, 61896, 61901, - 61905, 61908, 61914, 61921, 61926, 61931, 61938, 61945, 61951, 61956, - 61961, 61969, 32115, 2423, 61974, 61979, 61985, 61990, 61996, 62001, - 62006, 62011, 62017, 32136, 62022, 62028, 62034, 62040, 32200, 62045, - 62050, 62055, 32211, 62060, 62065, 62070, 62076, 62082, 32216, 62087, - 62092, 62097, 32271, 32277, 62102, 62107, 32282, 62112, 27958, 32304, - 32308, 62117, 62093, 62121, 62129, 62135, 62143, 62150, 62156, 62166, - 62172, 62179, 10631, 32322, 62185, 62198, 62207, 62213, 62222, 62228, - 23512, 62235, 62242, 62252, 32272, 62255, 62262, 62267, 62271, 62275, - 62280, 6120, 62284, 62289, 62294, 34710, 34715, 62298, 34729, 62303, - 34734, 62308, 62314, 34746, 34752, 34758, 62319, 62325, 22539, 62336, - 62339, 62351, 62359, 32345, 62363, 62372, 62382, 62391, 32355, 62396, - 62403, 62412, 62418, 62426, 62433, 6095, 4397, 62438, 32283, 62444, - 62447, 62453, 62460, 62465, 62470, 23422, 62474, 62480, 62486, 62491, - 62496, 62500, 62506, 62512, 33483, 863, 35723, 36644, 36650, 32391, - 62517, 62521, 62525, 62528, 62541, 62547, 62551, 62554, 62559, 33786, - 62563, 31116, 21287, 62569, 6024, 6032, 9075, 62572, 62577, 62582, 62587, - 62592, 62597, 62602, 62607, 62612, 62617, 62623, 62628, 62633, 62639, - 62644, 62649, 62654, 62659, 62664, 62669, 62675, 62680, 62686, 62691, - 62696, 62701, 62706, 62711, 62716, 62721, 62726, 62731, 62736, 62742, - 62747, 62752, 62757, 62762, 62767, 62772, 62778, 62783, 62788, 62793, - 62798, 62803, 62808, 62813, 62818, 62823, 62829, 62834, 62839, 62844, - 62849, 62855, 62861, 62866, 62872, 62877, 62882, 62887, 62892, 62897, - 1513, 245, 62902, 62906, 62910, 62914, 25133, 62918, 62922, 62927, 62931, - 62936, 62940, 62945, 62950, 62955, 62959, 62963, 62968, 62972, 13369, - 62977, 62981, 62988, 62998, 15206, 63007, 63016, 63020, 63025, 63030, - 63034, 24924, 3019, 63038, 63044, 17363, 63048, 63057, 63065, 63071, - 63083, 63095, 63099, 63104, 63108, 63114, 63120, 63125, 63135, 63145, - 63151, 63156, 63160, 63165, 63171, 63180, 63189, 63197, 15560, 63201, - 63210, 63218, 63230, 63241, 63252, 63261, 63265, 63274, 63284, 63292, - 63298, 63303, 63309, 63314, 98, 30925, 63325, 26266, 26276, 63331, 63338, - 63344, 63348, 63358, 63369, 63377, 63386, 63391, 63396, 63400, 17317, - 63408, 63412, 63418, 63428, 63435, 63441, 34809, 63447, 63449, 63452, - 63456, 63466, 63472, 63479, 13315, 63486, 63492, 63501, 63510, 63516, - 63522, 63528, 63533, 63540, 63547, 63553, 63566, 63575, 63584, 63589, - 63593, 63599, 63606, 63613, 63620, 63627, 63634, 63639, 63643, 63647, - 63650, 63660, 63664, 63676, 63685, 63689, 63694, 63698, 63704, 63709, - 63716, 63725, 63733, 63741, 63746, 63750, 63755, 63760, 63770, 63778, - 63783, 63787, 63791, 63797, 63809, 63817, 63827, 63834, 63840, 63845, - 63849, 63853, 63857, 63866, 63875, 63884, 63890, 63896, 63902, 63907, - 63914, 63920, 63928, 63935, 12463, 63941, 63947, 63951, 14244, 63955, - 63960, 63970, 63979, 63985, 63991, 63999, 64006, 64010, 64014, 64020, - 64028, 64035, 64041, 64052, 64056, 64060, 64064, 64067, 64073, 64078, - 64082, 64086, 64095, 64103, 64110, 64116, 64123, 24046, 38870, 64128, - 64136, 64140, 64144, 64147, 64155, 64162, 64168, 64177, 64185, 64191, - 64196, 64200, 64205, 64209, 64213, 64218, 64227, 64231, 64238, 64245, - 64251, 64259, 64265, 64276, 64284, 64290, 22669, 64299, 64306, 64313, - 64320, 64327, 64334, 41907, 13153, 64341, 64348, 64353, 34845, 6217, - 64359, 64364, 64369, 64375, 64381, 64387, 64392, 64397, 64402, 64407, - 64413, 64418, 64424, 64429, 64435, 64440, 64445, 64450, 64455, 64460, - 64465, 64470, 64476, 64481, 64487, 64492, 64497, 64502, 64507, 64512, - 64517, 64523, 64528, 64533, 64538, 64543, 64548, 64553, 64558, 64563, - 64568, 64573, 64579, 64584, 64589, 64594, 64599, 64604, 64609, 64614, - 64619, 64625, 64630, 64635, 64640, 64645, 64650, 64655, 64660, 64665, - 64670, 64675, 64680, 64685, 64691, 1834, 224, 37446, 64696, 64699, 64704, - 64708, 64711, 64716, 63737, 64727, 64737, 64744, 64760, 64769, 64779, - 64789, 64797, 64811, 64819, 64823, 64826, 64833, 64839, 64850, 64862, - 64873, 64882, 64889, 1297, 23311, 64899, 2590, 64903, 64912, 1138, 17290, - 38083, 64920, 64928, 64942, 64955, 64959, 64964, 64969, 64974, 64980, - 64986, 64991, 8535, 64996, 65000, 65008, 11048, 65013, 65019, 65028, - 1721, 11060, 736, 65032, 65041, 65051, 27030, 65060, 65066, 16862, 65072, - 65076, 3964, 11391, 65082, 65089, 60693, 65093, 65097, 3988, 189, 14159, - 65103, 65115, 65119, 65125, 27751, 65129, 11379, 2730, 4, 65134, 65144, - 65150, 65161, 65168, 65174, 65180, 65188, 65195, 65201, 65211, 65221, - 65231, 23499, 1309, 65240, 65244, 65248, 65254, 65258, 2753, 2759, 8532, - 2264, 65262, 65266, 65275, 65283, 65294, 65302, 65310, 65316, 65321, - 65332, 65343, 65351, 65357, 9694, 65362, 65370, 65374, 65378, 65382, - 65394, 28136, 65401, 65411, 65417, 65423, 9796, 65433, 65444, 65454, - 65463, 65467, 65474, 1140, 1170, 65484, 65489, 65497, 65505, 65516, - 65523, 65537, 14088, 393, 65547, 65551, 65559, 65568, 65576, 65582, - 65596, 65603, 65609, 65618, 65625, 65635, 65643, 3812, 156, 65651, 65662, - 65666, 65678, 27949, 161, 65684, 65689, 65693, 65700, 65706, 65714, - 65721, 8818, 65728, 65737, 65745, 3878, 65758, 8199, 65762, 2798, 443, - 65767, 65780, 65785, 1833, 650, 65789, 3895, 65797, 65803, 65807, 931, - 65817, 65826, 65831, 14928, 14935, 45269, 65835, 3822, 13041, 65843, - 65850, 23555, 65854, 65861, 65867, 65872, 65877, 14948, 372, 65882, - 65894, 65900, 65908, 2810, 1753, 65916, 65918, 65923, 65928, 65933, - 65939, 65944, 65949, 65954, 65959, 65964, 65969, 65975, 65980, 65985, - 65990, 65995, 66000, 66005, 66010, 66015, 66021, 66026, 66031, 66036, - 66042, 66047, 66053, 66058, 66063, 66068, 66073, 66078, 66083, 66088, - 66094, 66099, 66105, 66110, 66115, 66120, 66125, 66130, 66135, 66140, - 66145, 66151, 66156, 66161, 66166, 66170, 66174, 66179, 66183, 66188, - 66193, 66199, 66204, 66208, 66213, 66217, 66220, 66222, 66226, 66229, - 66234, 66238, 66242, 66246, 66250, 66259, 66263, 32549, 66266, 32554, - 66273, 66278, 32559, 66287, 66296, 32565, 66301, 32570, 66310, 66315, - 11578, 66319, 66324, 66329, 32575, 66333, 40225, 66337, 66340, 66344, - 8211, 66350, 66355, 66359, 3705, 32580, 66362, 66366, 66369, 66374, - 66378, 66384, 66392, 66405, 66414, 66420, 66425, 66431, 66435, 66441, - 66449, 66454, 66458, 66465, 66471, 66479, 66488, 66496, 32583, 66503, - 66513, 66522, 66535, 66540, 66545, 66554, 66560, 66567, 66578, 66590, - 66597, 66606, 66615, 66624, 66631, 66637, 66644, 66652, 66659, 66667, - 66676, 66684, 66691, 66699, 66708, 66716, 66725, 66735, 66744, 66752, - 66759, 66767, 66776, 66784, 66793, 66803, 66812, 66820, 66829, 66839, - 66848, 66858, 66869, 66879, 66888, 66896, 66903, 66911, 66920, 66928, - 66937, 66947, 66956, 66964, 66973, 66983, 66992, 67002, 67013, 67023, - 67032, 67040, 67049, 67059, 67068, 67078, 67089, 67099, 67108, 67118, - 67129, 67139, 67150, 67162, 67173, 67183, 67192, 67200, 67207, 67215, - 67224, 67232, 67241, 67251, 67260, 67268, 67277, 67287, 67296, 67306, - 67317, 67327, 67336, 67344, 67353, 67363, 67372, 67382, 67393, 67403, - 67412, 67422, 67433, 67443, 67454, 67466, 67477, 67487, 67496, 67504, - 67513, 67523, 67532, 67542, 67553, 67563, 67572, 67582, 67593, 67603, - 67614, 67626, 67637, 67647, 67656, 67666, 67677, 67687, 67698, 67710, - 67721, 67731, 67742, 67754, 67765, 67777, 67790, 67802, 67813, 67823, - 67832, 67840, 67847, 67855, 67864, 67872, 67881, 67891, 67900, 67908, - 67917, 67927, 67936, 67946, 67957, 67967, 67976, 67984, 67993, 68003, - 68012, 68022, 68033, 68043, 68052, 68062, 68073, 68083, 68094, 68106, - 68117, 68127, 68136, 68144, 68153, 68163, 68172, 68182, 68193, 68203, - 68212, 68222, 68233, 68243, 68254, 68266, 68277, 68287, 68296, 68306, - 68317, 68327, 68338, 68350, 68361, 68371, 68382, 68394, 68405, 68417, - 68430, 68442, 68453, 68463, 68472, 68480, 68489, 68499, 68508, 68518, - 68529, 68539, 68548, 68558, 68569, 68579, 68590, 68602, 68613, 68623, - 68632, 68642, 68653, 68663, 68674, 68686, 68697, 68707, 68718, 68730, - 68741, 68753, 68766, 68778, 68789, 68799, 68808, 68818, 68829, 68839, - 68850, 68862, 68873, 68883, 68894, 68906, 68917, 68929, 68942, 68954, - 68965, 68975, 68986, 68998, 69009, 69021, 69034, 69046, 69057, 69069, - 69082, 69094, 69107, 69121, 69134, 69146, 69157, 69167, 69176, 69184, - 69191, 69196, 8058, 69203, 32593, 69208, 69213, 32598, 69219, 20929, - 32603, 69224, 69230, 69238, 69244, 69250, 69257, 69264, 69269, 69273, - 69276, 69280, 69289, 69295, 69307, 69318, 69322, 3081, 8033, 69327, - 69330, 69332, 69336, 69340, 69344, 69350, 69355, 25944, 69360, 69364, - 69367, 69372, 69376, 69383, 69389, 69393, 6170, 69397, 32620, 69402, - 69409, 69418, 69426, 69437, 69445, 69453, 69460, 69467, 69473, 69484, - 32625, 69489, 69500, 69512, 69520, 69531, 69540, 69551, 69556, 69564, - 2556, 69569, 34295, 69582, 69586, 69598, 69606, 69611, 69619, 17485, - 69630, 69636, 69643, 69651, 69657, 32635, 69662, 3914, 58254, 69669, - 69672, 69680, 69693, 69706, 69719, 69732, 69739, 69750, 69759, 41724, - 41729, 69764, 69768, 69776, 69783, 69792, 69800, 69806, 69815, 69823, - 69831, 69835, 69844, 69853, 69863, 69876, 69889, 69899, 32640, 69905, - 69912, 69918, 32646, 69923, 69926, 69930, 69938, 69947, 41462, 69955, - 69964, 69972, 69979, 69987, 69997, 70006, 70015, 70024, 70032, 70043, - 70053, 9366, 21567, 70062, 70067, 70072, 70076, 70080, 70085, 70091, - 70096, 70101, 70107, 70112, 70117, 21532, 70122, 70129, 70137, 70145, - 70150, 70157, 70164, 70169, 70173, 70177, 70185, 70193, 32663, 70199, - 70205, 70217, 70223, 70227, 70234, 70239, 70250, 70260, 70270, 70282, - 70288, 70298, 70308, 32690, 70317, 70326, 70332, 70344, 70355, 70362, - 70367, 70371, 70379, 70385, 70390, 70395, 70402, 70410, 70422, 70432, - 70441, 70450, 70457, 34157, 23851, 70463, 70468, 70472, 70476, 70481, - 70487, 70498, 70511, 70516, 70523, 32695, 70528, 70540, 70549, 70559, - 70570, 70583, 70590, 70599, 70608, 70616, 70621, 70627, 1069, 70632, - 70637, 70642, 70647, 70653, 70658, 70663, 70669, 70675, 70680, 70684, - 70689, 70694, 70699, 58766, 70704, 70709, 70714, 70719, 70725, 70731, - 70736, 70740, 70745, 70750, 70755, 70761, 70766, 70772, 70777, 70782, - 70787, 70792, 70796, 70802, 70807, 70816, 70821, 70826, 70831, 70836, - 70840, 70847, 70853, 17135, 17142, 70858, 70862, 70866, 70870, 70874, - 45524, 70878, 70808, 70880, 70890, 32704, 70893, 70902, 70908, 6143, - 32709, 70912, 70918, 70923, 70929, 70934, 70938, 70945, 70950, 70960, - 70969, 70973, 70979, 70985, 70991, 70995, 71003, 71010, 71018, 71026, - 32714, 71033, 71036, 71043, 71049, 71054, 71058, 71064, 71071, 71076, - 71080, 71089, 71097, 71103, 71108, 32719, 71115, 71122, 71128, 71133, - 71139, 71146, 71152, 21294, 27455, 71158, 71163, 71169, 71181, 70841, - 70848, 21470, 71191, 71196, 71203, 71209, 71216, 71222, 71233, 71238, - 9110, 71246, 71249, 71255, 71259, 71263, 71266, 71272, 32468, 6194, 964, - 13419, 71279, 71285, 71291, 71297, 71303, 71309, 71315, 71321, 71327, - 71332, 71337, 71342, 71347, 71352, 71357, 71362, 71367, 71372, 71377, - 71382, 71387, 71392, 71398, 71403, 71408, 71414, 71419, 71424, 71430, - 71436, 71442, 71448, 71454, 71460, 71466, 71472, 71478, 71483, 71488, - 71494, 71499, 71504, 71510, 71515, 71520, 71525, 71530, 71535, 71540, - 71545, 71550, 71555, 71560, 71565, 71570, 71576, 71581, 71586, 71591, - 71597, 71602, 71607, 71612, 71617, 71623, 71628, 71633, 71638, 71643, - 71648, 71653, 71658, 71663, 71668, 71673, 71678, 71683, 71688, 71693, - 71698, 71703, 71708, 71713, 71718, 71724, 71729, 71734, 71739, 71744, - 71749, 71754, 71759, 1864, 142, 71764, 71768, 71772, 71777, 71785, 71789, - 71796, 71804, 71808, 71821, 71829, 71833, 71836, 71841, 71845, 71850, - 71854, 71862, 71866, 20937, 71871, 71875, 60967, 71879, 71882, 71890, - 71898, 71906, 71911, 71918, 71924, 71930, 71935, 71942, 71947, 71955, - 64947, 71962, 71967, 71972, 71976, 11645, 71980, 71985, 71990, 71994, - 71997, 72003, 72007, 72017, 72026, 72029, 72033, 72040, 72053, 72059, - 72067, 72078, 72089, 72100, 72111, 72120, 72126, 72135, 72143, 72153, - 72166, 72173, 72184, 72190, 72195, 72200, 72206, 72212, 72222, 72231, - 70530, 72239, 72245, 72253, 72259, 72267, 72270, 72274, 72278, 72281, - 72287, 72293, 72301, 72313, 72325, 72332, 72336, 72347, 72355, 72362, - 72374, 72382, 72390, 72397, 72403, 72413, 72422, 72427, 72437, 72446, - 40788, 72453, 72457, 72462, 72470, 72477, 72483, 72487, 72497, 72508, - 72516, 72523, 72535, 72547, 72556, 69572, 72563, 72574, 72588, 72596, - 72606, 72613, 72621, 72633, 72642, 72650, 72660, 72671, 72683, 72692, - 72702, 72709, 72718, 72733, 72741, 72751, 72760, 72768, 72781, 72796, - 72800, 72809, 72821, 72832, 72843, 72854, 72864, 72875, 72883, 72889, - 72899, 72907, 72913, 29028, 72918, 72924, 72929, 72936, 9708, 17505, - 72942, 72951, 72956, 72960, 72967, 72973, 72978, 72983, 72991, 72999, - 73003, 73006, 73009, 73011, 73018, 73024, 73035, 73040, 73044, 73051, - 73057, 73062, 73070, 65446, 65456, 73076, 73083, 73093, 10618, 73100, - 73105, 29224, 73114, 73119, 73126, 73136, 73144, 73152, 73161, 73167, - 73173, 73180, 73187, 73192, 73196, 73204, 73209, 73214, 73222, 73229, - 73234, 73240, 73243, 73247, 73256, 71816, 73265, 73269, 73275, 73286, - 73296, 17514, 73307, 73315, 17526, 73322, 73326, 73335, 27341, 73342, - 73346, 73351, 73368, 73380, 10576, 73392, 73397, 73402, 73407, 21010, - 73411, 73416, 73421, 73427, 73432, 5846, 21014, 73437, 73442, 73448, - 73455, 73460, 73465, 73471, 73477, 73483, 73488, 73494, 73498, 73512, - 73520, 73528, 73534, 73539, 73546, 73556, 73565, 73570, 73575, 73583, - 73588, 73594, 73599, 73608, 59823, 73613, 73616, 73634, 73653, 73666, - 73680, 73696, 73703, 73710, 73716, 73723, 73728, 73734, 73740, 73748, - 73754, 73759, 73764, 73780, 10589, 73794, 73801, 73809, 73815, 73819, - 73822, 73827, 73832, 73839, 73844, 73853, 73858, 73864, 73873, 73882, - 73887, 73891, 73899, 73908, 11674, 73917, 73925, 73930, 73936, 11685, - 73941, 73944, 73949, 73959, 73968, 73973, 73979, 73984, 73992, 73999, - 74010, 74020, 74025, 64875, 74030, 74036, 74041, 74048, 74057, 74065, - 74071, 74077, 74084, 74090, 74094, 16960, 3055, 74099, 74103, 74107, - 74113, 74122, 74128, 74135, 74139, 74160, 74182, 74198, 74215, 74234, - 74243, 74253, 74260, 74267, 27228, 74273, 74277, 74285, 74297, 74303, - 74311, 74315, 74323, 74330, 74334, 74340, 74346, 74351, 3563, 41924, - 74357, 74361, 74365, 74369, 74374, 74379, 74384, 74390, 74396, 74402, - 74409, 74415, 74422, 74428, 74434, 74439, 74445, 74450, 74454, 74459, - 74463, 74468, 41939, 74472, 74477, 74485, 74489, 74494, 74501, 74510, - 74516, 74520, 74527, 74531, 74534, 74541, 74550, 74555, 74559, 74567, - 74576, 74580, 74588, 74594, 74599, 74604, 74610, 74616, 74621, 74625, - 74631, 74636, 74640, 74644, 74647, 74652, 74660, 74670, 74675, 39416, - 74683, 74695, 74699, 74705, 74717, 74728, 74735, 74741, 74748, 74760, - 74767, 74773, 21088, 74777, 74783, 74790, 74796, 74802, 74807, 74812, - 74817, 74826, 7033, 74831, 16426, 74837, 74841, 74845, 74849, 74857, - 74866, 74870, 74877, 74886, 74899, 74905, 74464, 30088, 74910, 74912, - 74917, 74922, 74927, 74932, 74937, 74942, 74947, 74952, 74957, 74962, - 74967, 74972, 74977, 74982, 74988, 74993, 74998, 75003, 75008, 75013, - 75018, 75023, 75028, 75034, 75040, 75046, 75051, 75056, 75068, 75073, - 1870, 46, 75078, 75083, 32746, 75087, 32751, 32756, 32762, 32767, 75091, - 32772, 22083, 75113, 75117, 75121, 75126, 75130, 32776, 75134, 75142, - 32781, 75149, 75152, 75157, 75161, 9543, 75170, 32786, 21945, 75173, - 75177, 1428, 75182, 32797, 75185, 75190, 25737, 25747, 35258, 75195, - 75200, 75205, 75210, 75216, 75221, 75230, 75235, 75242, 75248, 75253, - 75258, 75263, 75273, 75282, 75287, 75295, 75299, 75307, 32611, 37317, - 75314, 75320, 75325, 75330, 12016, 75335, 75341, 75346, 75353, 75359, - 75364, 75372, 75382, 75392, 75398, 75403, 75409, 17536, 75416, 36073, - 75429, 75434, 75440, 30993, 75453, 75459, 75463, 75472, 75479, 75485, - 75493, 75502, 75509, 75515, 75518, 75522, 25878, 75526, 75533, 75539, - 75547, 75552, 23994, 75558, 75561, 75569, 75577, 75591, 75598, 75604, - 75611, 75617, 32811, 75621, 75628, 75636, 75644, 75650, 32816, 75658, - 75664, 75669, 75679, 75685, 75694, 30830, 34716, 75702, 75707, 75712, - 75716, 75721, 75725, 75733, 14920, 39429, 75738, 75743, 32821, 62269, - 75747, 75752, 75756, 75765, 75773, 75779, 75784, 75790, 75797, 75803, - 75808, 75813, 75822, 75834, 75849, 33083, 75855, 16545, 32825, 75859, - 75866, 24104, 75872, 75879, 75888, 75895, 75904, 75910, 75915, 75923, - 75929, 32835, 75934, 75943, 74723, 75952, 75959, 75965, 75971, 75981, - 75989, 75996, 76000, 32840, 76003, 32846, 32852, 76008, 76016, 76024, - 76034, 76043, 76051, 76058, 76068, 32857, 76072, 76074, 76078, 76083, - 76087, 76091, 76097, 76102, 76106, 76117, 76122, 76127, 3060, 76131, - 76138, 76142, 76151, 76159, 76166, 76171, 76176, 62315, 76180, 76183, - 76189, 76197, 76203, 76207, 76212, 76219, 76224, 76230, 34747, 76235, - 76238, 76243, 76247, 76252, 76257, 76261, 76269, 76273, 25756, 25765, - 76279, 76285, 76291, 76296, 76300, 76303, 76313, 76322, 76327, 76333, - 76340, 76346, 76350, 76358, 76363, 34753, 76367, 76375, 76381, 76388, - 76393, 76397, 76402, 58440, 34759, 76408, 76413, 76417, 76422, 76427, - 76432, 76436, 76441, 76446, 76452, 76457, 76462, 76468, 76474, 76479, - 76483, 76488, 76493, 76498, 76502, 24103, 76507, 76512, 76518, 76524, - 76530, 76535, 76539, 76544, 76549, 76554, 76558, 76563, 76568, 76573, - 76578, 76582, 32865, 76590, 76594, 76602, 76610, 76621, 76626, 76630, - 22397, 76635, 76641, 76651, 76658, 76663, 76672, 76677, 76681, 76686, - 76694, 76702, 76709, 65109, 76715, 76723, 76730, 76741, 76747, 76751, - 76757, 32875, 76760, 76767, 76775, 76780, 39620, 76784, 76789, 76796, - 76801, 8992, 76805, 76813, 76820, 76827, 76833, 76847, 63381, 76855, - 76861, 76865, 76868, 76876, 76883, 76888, 76901, 76908, 76912, 76919, - 76924, 60860, 76929, 76932, 76939, 76945, 76949, 76957, 76966, 76976, - 76986, 76995, 77003, 77014, 77019, 77023, 77028, 77032, 35389, 77040, - 21357, 35398, 77045, 77050, 77055, 77060, 77065, 77070, 77075, 77079, - 77084, 77089, 77094, 77099, 77104, 77109, 77113, 77118, 77123, 77127, - 77131, 77135, 77139, 77144, 77149, 77153, 77158, 77162, 77166, 77171, - 77176, 77181, 77186, 77190, 77195, 77200, 77204, 77209, 77214, 77219, - 77224, 77229, 77234, 77239, 77244, 77249, 77254, 77259, 77264, 77269, - 77274, 77279, 77284, 77289, 77294, 77299, 77304, 77308, 77313, 77318, - 77323, 77328, 77333, 77338, 77343, 77348, 77353, 77358, 77363, 77367, - 77372, 77376, 77381, 77386, 77391, 77396, 77401, 77406, 77411, 77416, - 77421, 77425, 77429, 77434, 77439, 77443, 77448, 77453, 77457, 77462, - 77467, 77472, 77477, 77481, 77486, 77491, 77495, 77500, 77504, 77508, - 77512, 77516, 77521, 77525, 77529, 77533, 77537, 77541, 77545, 77549, - 77553, 77557, 77562, 77567, 77572, 77577, 77582, 77587, 77592, 77597, - 77602, 77607, 77611, 77615, 77619, 77623, 77627, 77631, 77636, 77640, - 77645, 77649, 77654, 77659, 77663, 77667, 77672, 77676, 77680, 77684, - 77688, 77692, 77696, 77700, 77704, 77708, 77712, 77716, 77720, 77724, - 77728, 77733, 77738, 77742, 77746, 77750, 77754, 77758, 77762, 77767, - 77771, 77775, 77779, 77783, 77787, 77791, 77796, 77800, 77805, 77809, - 77813, 77817, 77821, 77825, 77829, 77833, 77837, 77841, 77845, 77849, - 77854, 77858, 77862, 77866, 77870, 77874, 77878, 77882, 77886, 77890, - 77894, 77898, 77903, 77907, 77911, 77916, 77921, 77925, 77929, 77933, - 77937, 77941, 77945, 77949, 77953, 77958, 77962, 77967, 77971, 77976, - 77980, 77985, 77989, 77995, 78000, 78004, 78009, 78013, 78018, 78022, - 78027, 78031, 78036, 1521, 78040, 2824, 1759, 1764, 78044, 78048, 2828, - 78052, 1397, 78057, 1342, 78061, 2840, 78065, 78072, 78079, 78093, 2844, - 7131, 78102, 78110, 78117, 78128, 78137, 78144, 78156, 78169, 78182, - 78193, 78198, 78205, 78217, 78221, 2848, 11747, 78231, 78236, 78245, - 78255, 2852, 78260, 78264, 78269, 78276, 78282, 78290, 78302, 1347, - 13042, 78312, 78316, 78322, 78336, 78348, 78360, 78370, 78379, 78388, - 78397, 78405, 78416, 78424, 4051, 78434, 78445, 78454, 78460, 78475, - 78482, 78488, 35514, 78493, 2876, 13046, 78497, 78504, 8930, 78513, 2881, - 32361, 78519, 60609, 78526, 78532, 78543, 78549, 78556, 78562, 78570, - 78577, 78583, 78593, 78602, 78613, 78620, 78626, 78636, 78644, 78650, - 78665, 78671, 78676, 78683, 78686, 78692, 78699, 78705, 78713, 78722, - 78730, 78736, 78745, 41464, 78759, 78764, 78770, 14757, 78775, 78788, - 78797, 78805, 78812, 78816, 78820, 78823, 78830, 78837, 78845, 78853, - 78862, 78870, 14684, 78878, 78883, 78887, 78899, 78906, 78915, 748, - 78925, 78934, 78945, 2897, 78949, 78953, 78959, 78972, 78984, 78994, - 79003, 79015, 26369, 79026, 79034, 79043, 79054, 79065, 79075, 79085, - 79094, 79102, 11312, 79109, 79113, 79116, 79121, 79126, 79130, 79136, - 1352, 11818, 79143, 79154, 79163, 79171, 79180, 79188, 79204, 79215, - 79224, 79232, 79244, 79255, 79271, 79281, 79302, 79315, 79323, 79330, - 14868, 79343, 79348, 79354, 5908, 79360, 79363, 79370, 79380, 8176, - 79387, 79392, 79397, 79402, 79410, 79419, 79427, 9756, 9765, 79432, - 79443, 79448, 79454, 2913, 2918, 79460, 10879, 79466, 79473, 79480, - 79493, 2251, 68, 79498, 79503, 79513, 79519, 79528, 79536, 79546, 79550, - 79555, 79559, 79571, 2941, 79579, 79587, 79592, 79603, 79614, 79623, - 79628, 79634, 79639, 79649, 79659, 79664, 79670, 79674, 79679, 79688, - 21410, 79692, 4128, 20, 79697, 79706, 79713, 79720, 79726, 79732, 864, - 79737, 79742, 60937, 79747, 79752, 79758, 79764, 79772, 79777, 79784, - 79790, 79795, 38030, 41358, 79801, 2945, 32, 79811, 79824, 79829, 79837, - 79842, 79848, 2967, 28310, 79853, 79861, 79868, 79873, 58682, 61940, - 79882, 79886, 1704, 1813, 79891, 79896, 79903, 1817, 247, 79910, 79916, - 2989, 79921, 79926, 79933, 1821, 79938, 79944, 79949, 79961, 6119, 79971, - 1828, 79977, 79982, 79989, 79996, 80011, 80018, 80029, 80037, 2618, - 80041, 80053, 80058, 80062, 80068, 28135, 2256, 80072, 80083, 80087, - 80091, 80097, 80101, 80110, 80114, 80125, 80129, 2302, 32190, 80133, - 80143, 3080, 9371, 80151, 80156, 80160, 80169, 80176, 80182, 3050, 17152, - 80186, 80199, 80217, 80222, 80230, 80238, 80248, 9985, 13154, 80260, - 80273, 80280, 80287, 80303, 80310, 80316, 1064, 80323, 80330, 80340, - 80349, 80361, 42328, 80369, 3064, 12030, 80372, 80380, 80384, 78272, - 3068, 80388, 21191, 12046, 3756, 80392, 3074, 80396, 80406, 80412, 80418, - 80424, 80430, 80436, 80442, 80448, 80454, 80460, 80466, 80472, 80478, - 80484, 80490, 80496, 80502, 80508, 80514, 80520, 80526, 80532, 80538, - 80544, 80550, 80556, 80563, 80570, 80576, 80582, 80588, 80594, 80600, - 80606, 1357, 16062, 12068, 80612, 80617, 80622, 80627, 80632, 80637, - 80642, 80647, 80652, 80657, 80662, 80667, 80672, 80677, 80682, 80687, - 80692, 80697, 80702, 80707, 80712, 80717, 80722, 80727, 80732, 80737, - 80743, 80748, 80753, 80759, 80764, 80770, 80775, 80780, 80786, 80791, - 80796, 80801, 80806, 80811, 80816, 80821, 80826, 80407, 80413, 80419, - 80425, 80431, 80437, 80443, 80449, 80455, 80461, 80467, 80473, 80479, - 80485, 80491, 80832, 80497, 80503, 80509, 80838, 80515, 80521, 80527, - 80533, 80539, 80545, 80551, 80571, 80844, 80850, 80577, 80856, 80583, - 80589, 80595, 80601, 80607, 3091, 3096, 80862, 80867, 80870, 80876, - 80882, 80889, 80894, 80899, 2307, + 0, 0, 6, 10, 14, 22, 27, 34, 39, 45, 47, 50, 62, 70, 80, 89, 102, 108, + 113, 118, 126, 135, 140, 145, 148, 152, 158, 164, 169, 177, 182, 189, + 197, 198, 201, 209, 215, 224, 231, 241, 248, 253, 256, 261, 149, 267, + 273, 276, 280, 285, 291, 297, 302, 308, 313, 322, 328, 335, 342, 351, + 356, 361, 369, 371, 372, 380, 388, 395, 398, 404, 411, 416, 418, 425, + 427, 306, 429, 431, 436, 443, 451, 455, 461, 466, 471, 476, 483, 493, + 496, 503, 513, 522, 529, 538, 545, 549, 557, 560, 573, 580, 584, 593, + 597, 601, 607, 611, 615, 616, 625, 633, 638, 646, 651, 657, 665, 668, + 675, 684, 692, 695, 698, 700, 706, 714, 721, 724, 734, 738, 742, 753, + 758, 762, 766, 773, 780, 784, 788, 782, 794, 798, 803, 806, 810, 816, + 821, 830, 838, 843, 610, 543, 848, 851, 857, 861, 867, 874, 877, 886, + 895, 902, 915, 919, 927, 936, 942, 950, 957, 967, 974, 979, 985, 993, + 997, 1000, 21, 1009, 1018, 1026, 1030, 1035, 1038, 1047, 1052, 1054, + 1061, 1065, 1068, 1071, 1078, 1083, 1087, 1090, 1094, 1102, 1108, 1118, + 1124, 1131, 1135, 1143, 1146, 1151, 1157, 1163, 1167, 1174, 1179, 1184, + 1190, 1195, 1200, 1205, 1209, 1214, 1220, 1225, 1230, 1234, 1240, 1245, + 1250, 1255, 1259, 1264, 1269, 1274, 1280, 1286, 1292, 1297, 1301, 1306, + 1311, 1316, 1320, 1325, 1330, 1335, 1340, 1175, 1180, 1185, 1191, 1196, + 1344, 1206, 1350, 1355, 1360, 1367, 1371, 1374, 1383, 1210, 1387, 1215, + 1221, 1226, 1391, 1396, 1401, 1405, 1409, 1415, 1419, 1231, 1422, 1241, + 1427, 1431, 1246, 1437, 1251, 1441, 1445, 1256, 1449, 1454, 1458, 1461, + 1465, 1260, 1265, 1470, 1270, 1476, 1482, 1488, 1494, 1275, 1287, 1293, + 1498, 1502, 1506, 1509, 1298, 1513, 1515, 1520, 1525, 1531, 1536, 1541, + 1545, 1550, 1555, 1560, 1565, 1571, 1576, 1581, 1587, 1593, 1598, 1602, + 1607, 1612, 1617, 1622, 1627, 1631, 1639, 1644, 1648, 1653, 1658, 1663, + 1668, 1672, 1675, 1682, 1687, 1692, 1697, 1702, 1708, 1713, 1717, 1302, + 1720, 1725, 1730, 1307, 1734, 1738, 1745, 1312, 1752, 1317, 1756, 1758, + 1763, 1769, 1321, 1774, 1783, 1326, 1788, 1794, 1799, 1331, 1804, 1809, + 1812, 1817, 1821, 1825, 1829, 1832, 1836, 1336, 1341, 1841, 1843, 1849, + 1855, 1861, 1867, 1873, 1879, 1885, 1891, 1896, 1902, 1908, 1914, 1920, + 1926, 1932, 1938, 1944, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, + 1990, 1995, 2000, 2006, 2011, 2017, 2022, 2028, 2034, 2039, 2045, 2051, + 2057, 2063, 2068, 2073, 2075, 2076, 2080, 2084, 2089, 2093, 2097, 2101, + 2106, 2110, 2113, 2118, 2122, 2127, 2131, 2135, 2140, 2144, 2147, 2151, + 2157, 2171, 2175, 2179, 2183, 2186, 2191, 2195, 2199, 2202, 2206, 2211, + 2216, 2221, 2226, 2230, 2234, 2238, 2242, 2247, 2251, 2256, 2260, 2265, + 2271, 2278, 2284, 2289, 2294, 2299, 2305, 2310, 2316, 2321, 2324, 2326, + 1192, 2330, 2337, 2345, 2355, 2364, 2378, 2382, 2386, 2391, 2404, 2412, + 2416, 2421, 2425, 2428, 2432, 2436, 2441, 2446, 2451, 2455, 2458, 2462, + 2469, 2476, 2482, 2487, 2492, 2498, 2504, 2509, 2512, 1760, 2514, 2520, + 2524, 2529, 2533, 2537, 1678, 1771, 2542, 2546, 2549, 2554, 2559, 2564, + 2569, 2573, 2580, 2585, 2588, 2595, 2601, 2605, 2609, 2613, 2618, 2625, + 2630, 2635, 2642, 2648, 2654, 2660, 2674, 2691, 2706, 2721, 2730, 2735, + 2739, 2744, 2749, 2753, 2765, 2772, 2778, 2274, 2784, 2791, 2797, 2801, + 2804, 2811, 2817, 2822, 2826, 2831, 2835, 2839, 2098, 2843, 2848, 2853, + 2857, 2862, 2870, 2874, 2878, 2882, 2886, 2891, 2896, 2901, 2905, 2910, + 2915, 2919, 2924, 2928, 2931, 2935, 2939, 2947, 2952, 2956, 2960, 2966, + 2975, 2979, 2983, 2989, 2994, 3001, 3005, 3015, 3019, 3023, 3028, 3032, + 3037, 3043, 3048, 3052, 3056, 3060, 2472, 3068, 3073, 3079, 3084, 3088, + 3093, 3098, 3102, 3108, 3113, 2102, 3119, 3125, 3130, 3135, 3140, 3145, + 3150, 3155, 3160, 3165, 3170, 3176, 3181, 1207, 101, 3187, 3191, 3195, + 3199, 3204, 3208, 3212, 3218, 3223, 3227, 3231, 3236, 3241, 3245, 3250, + 3254, 3257, 3261, 3266, 3270, 3275, 3279, 3282, 3286, 3290, 3295, 3299, + 3302, 3315, 3319, 3323, 3327, 3332, 3336, 3340, 3343, 3347, 3351, 3356, + 3360, 3365, 3370, 3375, 3379, 3384, 3387, 3390, 3395, 3401, 3405, 3409, + 3412, 3417, 3421, 3426, 3430, 3434, 3437, 3443, 3448, 3453, 3459, 3464, + 3469, 3475, 3481, 3486, 3491, 3496, 3501, 1063, 559, 3504, 3507, 3512, + 3516, 3520, 3524, 3528, 3531, 3535, 3540, 3545, 3549, 3554, 3558, 3563, + 3567, 3571, 3575, 3581, 3587, 3590, 3593, 3599, 3606, 3613, 3619, 3626, + 3631, 3635, 3639, 3646, 3651, 3658, 3663, 3667, 3677, 3681, 3685, 3690, + 3695, 3705, 2114, 3710, 3714, 3717, 3723, 3728, 3734, 3740, 3745, 3752, + 3756, 3760, 612, 693, 1368, 3764, 3771, 3778, 3784, 3789, 3796, 3803, + 3809, 3815, 3820, 3824, 3830, 3837, 3842, 3846, 2123, 3850, 3858, 679, + 3864, 3875, 3879, 3889, 2128, 3895, 3900, 3915, 3921, 3928, 3938, 3944, + 3949, 3955, 3961, 3964, 3967, 3971, 3976, 3983, 3988, 3992, 3996, 4000, + 4004, 4009, 4015, 4026, 4030, 3262, 4035, 4047, 4055, 4059, 4064, 1547, + 4071, 4074, 4077, 4081, 4084, 4090, 4094, 4108, 4112, 4115, 4119, 4125, + 4131, 4136, 4140, 4144, 4150, 4161, 4167, 4172, 4178, 4182, 4190, 4202, + 4212, 4218, 4223, 4232, 4240, 4247, 4251, 4257, 4266, 4275, 4279, 4284, + 4289, 4293, 4301, 4305, 4310, 4314, 4320, 2136, 1384, 4326, 4331, 4337, + 4342, 4347, 4352, 4357, 4362, 4367, 4373, 4378, 4384, 4389, 4394, 4399, + 4405, 4410, 4415, 4420, 4425, 4431, 4436, 4442, 4447, 4452, 4457, 4462, + 4467, 4472, 4478, 4483, 4488, 271, 301, 4493, 4499, 4503, 4507, 4512, + 4516, 4520, 4523, 4527, 4531, 4535, 4539, 4543, 4548, 4552, 4556, 4562, + 4323, 4567, 4571, 4574, 4579, 4584, 4589, 4594, 4599, 4604, 4609, 4614, + 4619, 4624, 4628, 4633, 4638, 4643, 4648, 4653, 4658, 4663, 4668, 4673, + 4678, 4682, 4687, 4692, 4697, 4702, 4707, 4712, 4717, 4722, 4727, 4732, + 4736, 4741, 4746, 4751, 4756, 4761, 4766, 4771, 4776, 4781, 4786, 4790, + 4795, 4800, 4805, 4810, 4815, 4820, 4825, 4830, 4835, 4840, 4844, 4849, + 4854, 4859, 4864, 4869, 4874, 4879, 4884, 4889, 4894, 4898, 4903, 4908, + 4913, 4918, 4923, 4928, 4933, 4938, 4943, 4948, 4952, 4957, 4962, 4967, + 4972, 4978, 4984, 4990, 4996, 5002, 5008, 5014, 5019, 5025, 5031, 5037, + 5043, 5049, 5055, 5061, 5067, 5073, 5079, 5084, 5090, 5096, 5102, 5108, + 5114, 5120, 5126, 5132, 5138, 5144, 5149, 5155, 5161, 5167, 5173, 5179, + 5185, 5191, 5197, 5203, 5209, 5214, 5220, 5226, 5232, 5238, 5244, 5250, + 5256, 5262, 5268, 5274, 5279, 5285, 5291, 5297, 5303, 5309, 5315, 5321, + 5327, 5333, 5339, 5344, 5348, 5354, 5360, 5366, 5372, 5378, 5384, 5390, + 5396, 5402, 5408, 5413, 5419, 5425, 5431, 5437, 5443, 5449, 5455, 5461, + 5467, 5473, 5478, 5484, 5490, 5496, 5502, 5508, 5514, 5520, 5526, 5532, + 5538, 5543, 5549, 5555, 5561, 5567, 5573, 5579, 5585, 5591, 5597, 5603, + 5608, 5614, 5620, 5626, 5632, 5638, 5644, 5650, 5656, 5662, 5668, 5673, + 5679, 5685, 5691, 5697, 5703, 5709, 5715, 5721, 5727, 5733, 5738, 5744, + 5750, 5756, 5762, 5768, 5774, 5780, 5786, 5792, 5798, 5803, 5809, 5815, + 5821, 5827, 5833, 5839, 5845, 5851, 5857, 5863, 5868, 5874, 5880, 5886, + 5892, 5898, 5904, 5910, 5916, 5922, 5928, 5933, 5939, 5945, 5951, 5957, + 5963, 5969, 5975, 5981, 5987, 5993, 5998, 6002, 6005, 6012, 6016, 6029, + 6033, 6037, 6041, 6044, 6048, 6053, 6057, 6061, 6067, 6074, 6082, 6089, + 6093, 6101, 6110, 6116, 6128, 6133, 6136, 6141, 6145, 6155, 6163, 6171, + 6177, 6181, 6191, 6201, 6209, 6216, 6223, 6229, 6235, 6242, 6246, 6253, + 6263, 6273, 6281, 6288, 6293, 6297, 6301, 6309, 6313, 6318, 6325, 6333, + 6338, 6342, 6347, 6351, 6358, 6363, 6377, 6382, 6387, 6394, 3517, 6403, + 6407, 6412, 6416, 6420, 6423, 6428, 6433, 6442, 6448, 6454, 6460, 6464, + 6475, 6485, 6500, 6515, 6530, 6545, 6560, 6575, 6590, 6605, 6620, 6635, + 6650, 6665, 6680, 6695, 6710, 6725, 6740, 6755, 6770, 6785, 6800, 6815, + 6830, 6845, 6860, 6875, 6890, 6905, 6920, 6935, 6950, 6965, 6980, 6995, + 7010, 7025, 7040, 7055, 7070, 7085, 7100, 7115, 7130, 7145, 7160, 7175, + 7190, 7205, 7220, 7229, 7238, 7243, 7249, 7259, 7263, 7267, 7272, 7277, + 7285, 7289, 7292, 7296, 3010, 7299, 7304, 305, 474, 7310, 7318, 7322, + 7326, 7329, 7333, 7339, 7343, 7351, 7357, 7362, 7369, 7377, 7384, 7390, + 7395, 7402, 7408, 7416, 7420, 7425, 7437, 7448, 7455, 7459, 7463, 7467, + 7470, 7476, 3287, 7480, 7486, 7491, 7496, 7501, 7507, 7512, 7517, 7522, + 7527, 7533, 7538, 7543, 7549, 7554, 7560, 7565, 7571, 7576, 7582, 7587, + 7592, 7597, 7602, 7607, 7613, 7618, 7623, 7628, 7634, 7640, 7646, 7652, + 7658, 7664, 7670, 7676, 7682, 7688, 7694, 7700, 7705, 7710, 7715, 7720, + 7725, 7730, 7735, 7740, 7746, 7752, 7757, 7763, 7769, 7775, 7780, 7785, + 7790, 7795, 7801, 7807, 7812, 7817, 7822, 7827, 7832, 7838, 7843, 7849, + 7855, 7861, 7867, 7873, 7879, 7885, 7891, 7897, 2145, 7328, 7902, 7906, + 7910, 7913, 7920, 7923, 7927, 7935, 7940, 7945, 7936, 7950, 2172, 7954, + 7960, 7966, 7971, 7976, 7983, 7991, 7996, 8000, 8003, 8007, 8013, 8019, + 8023, 2180, 595, 8026, 8030, 8035, 8041, 8046, 8050, 8053, 8057, 8063, + 8068, 8072, 8079, 8083, 8087, 8091, 800, 872, 8094, 8102, 8109, 8115, + 8122, 8130, 8137, 8144, 8149, 8161, 1227, 1392, 1397, 8172, 1402, 8176, + 8180, 8189, 8197, 8206, 8212, 8217, 8221, 8227, 8232, 2726, 8239, 8243, + 8252, 8261, 8270, 8279, 8284, 8289, 8300, 8312, 8317, 8325, 2231, 8329, + 8331, 8336, 8340, 8349, 8357, 1406, 138, 3559, 3564, 8363, 8367, 8376, + 8382, 8387, 8390, 8399, 3568, 2718, 8405, 8413, 8417, 8421, 8425, 2248, + 8429, 8434, 8441, 8447, 8453, 8456, 8458, 8461, 8469, 8477, 8485, 8488, + 8493, 2261, 8498, 7947, 8501, 8503, 8508, 8513, 8518, 8523, 8528, 8533, + 8538, 8543, 8548, 8553, 8559, 8564, 8569, 8574, 8580, 8585, 8590, 8595, + 8600, 8605, 8610, 8616, 8621, 8626, 8631, 8636, 8641, 8646, 8651, 8656, + 8661, 8666, 8671, 8676, 8681, 8686, 8691, 8696, 8701, 8707, 8713, 8718, + 8723, 8728, 8733, 8738, 2272, 2279, 2285, 8743, 8751, 8757, 8765, 2311, + 2317, 8773, 8777, 8782, 8786, 8790, 8794, 8799, 8803, 8808, 8812, 8815, + 8818, 8824, 8830, 8836, 8842, 8848, 8854, 8860, 8864, 8868, 8872, 8876, + 8881, 8885, 8890, 8894, 8900, 8905, 8912, 8923, 8931, 8941, 8947, 8954, + 8959, 8963, 8974, 8987, 8998, 9011, 9022, 9034, 9046, 9058, 9071, 9084, + 9091, 9097, 9111, 9118, 9124, 9128, 9133, 9137, 9144, 9152, 9156, 9162, + 9166, 9172, 9182, 9186, 9191, 9196, 9203, 9209, 8117, 9219, 9223, 9230, + 9236, 9243, 871, 9247, 9251, 9256, 9261, 9266, 9270, 9276, 9284, 9290, + 9294, 9300, 9310, 9314, 9320, 9325, 9329, 9333, 9339, 9345, 2168, 9350, + 9352, 9357, 9365, 9374, 9378, 9384, 9389, 9394, 9399, 9404, 9410, 9415, + 9420, 4146, 9425, 9430, 9434, 9440, 9445, 9451, 9456, 9461, 9467, 9472, + 9379, 9478, 9482, 9489, 9495, 9500, 9504, 6373, 9509, 9518, 9523, 9528, + 8437, 8444, 9533, 2888, 9537, 9542, 9547, 9552, 9390, 9556, 9561, 9566, + 9395, 9570, 9400, 9575, 9582, 9589, 9595, 9602, 9608, 9614, 9619, 9626, + 9631, 9636, 9641, 9647, 9405, 9411, 9653, 9659, 9664, 9669, 9677, 9416, + 9682, 1028, 9685, 9693, 9699, 9705, 9714, 9722, 9730, 9738, 9746, 9754, + 9762, 9770, 9778, 9787, 9796, 9804, 9813, 9822, 9831, 9840, 9849, 9858, + 9867, 9876, 9885, 9894, 9902, 9907, 9913, 9921, 9928, 9943, 9960, 9979, + 9988, 9996, 10011, 10022, 10032, 10042, 10050, 10056, 10068, 10077, + 10085, 10092, 10099, 10105, 10110, 10120, 10128, 10138, 10145, 10155, + 10165, 10175, 10183, 10190, 10199, 10209, 10223, 10238, 10247, 10255, + 10260, 10264, 10273, 10279, 10284, 10294, 10304, 10314, 10319, 10323, + 10332, 10337, 10347, 10358, 10371, 10379, 10392, 10404, 10412, 10417, + 10421, 10427, 10432, 10440, 10448, 10455, 10460, 10468, 10478, 10484, + 10488, 10491, 10495, 10501, 10505, 10513, 10522, 10527, 10531, 10535, + 10543, 10551, 10560, 10568, 10574, 10578, 10585, 10596, 10600, 10603, + 10609, 9421, 10614, 10620, 10627, 10633, 10638, 10645, 10652, 10659, + 10666, 10673, 10680, 10687, 10694, 10699, 9956, 10704, 10710, 10717, + 10724, 10729, 10736, 10745, 10749, 10761, 8475, 10765, 10768, 10772, + 10776, 10780, 10784, 10790, 10796, 10801, 10807, 10812, 10817, 10823, + 10828, 10833, 9199, 10838, 10842, 10846, 10850, 10855, 10860, 10865, + 10873, 10879, 10883, 10887, 10894, 10899, 10907, 10914, 10919, 10923, + 10926, 10932, 10939, 10943, 10946, 10951, 10955, 4185, 10961, 10970, 36, + 10978, 10984, 10989, 10994, 9214, 11000, 11006, 11011, 11015, 11018, + 11033, 11052, 11064, 11077, 11090, 11103, 11117, 11130, 11145, 11152, + 9426, 11158, 11172, 11177, 11183, 11188, 11196, 11201, 8248, 11206, + 11209, 11217, 11224, 11229, 11233, 11239, 2893, 1133, 11243, 11247, + 11253, 11259, 11264, 11270, 11275, 9435, 11281, 11287, 11292, 11297, + 11305, 11311, 11324, 11332, 11339, 9441, 11345, 11353, 11361, 11368, + 11381, 11393, 11403, 11411, 11418, 11425, 11435, 11444, 11453, 11461, + 11468, 11473, 11479, 9446, 11484, 11490, 11495, 11500, 9452, 11505, + 11508, 11515, 11521, 11534, 8916, 11545, 11551, 11560, 11568, 11575, + 11581, 11592, 11598, 3780, 11603, 11608, 11025, 11614, 11621, 11626, + 9457, 11632, 11637, 11644, 11650, 11656, 11661, 11669, 11677, 11684, + 11688, 11700, 11714, 11724, 11729, 11733, 11744, 11750, 11755, 11760, + 9462, 11764, 9468, 11769, 11772, 11777, 11789, 11796, 11801, 11805, + 11813, 11818, 11822, 11827, 11834, 11840, 9473, 9380, 11847, 2898, 8, + 11854, 11859, 11863, 11867, 11873, 11881, 11891, 11896, 11901, 11908, + 11915, 11919, 11930, 11940, 11949, 11958, 11970, 11975, 11979, 11987, + 12001, 12005, 12008, 12016, 12023, 12031, 12035, 12046, 12050, 12057, + 12062, 12066, 12072, 12077, 12082, 12086, 12092, 12097, 12108, 12112, + 12115, 12121, 12126, 12132, 12138, 12145, 12156, 12166, 12176, 12185, + 12192, 12201, 12205, 9483, 9490, 9496, 9501, 12211, 12217, 12223, 9505, + 12229, 12232, 12239, 12244, 12259, 12275, 12290, 12298, 12304, 12309, + 864, 354, 12314, 12322, 12329, 12335, 12340, 12345, 9510, 12347, 12351, + 12356, 12360, 12370, 12375, 12379, 12388, 12392, 12395, 12402, 9519, + 12407, 12410, 12418, 12425, 12433, 12437, 12441, 12448, 12457, 12464, + 12460, 12471, 12475, 12481, 12485, 12489, 12493, 12499, 12509, 12517, + 12524, 12528, 12536, 12540, 12547, 12551, 12556, 12560, 12567, 12573, + 12581, 12587, 12592, 12602, 12607, 12612, 12616, 12624, 4041, 12632, + 12637, 9524, 12641, 12645, 12648, 12656, 12663, 12667, 6173, 12671, + 12676, 12680, 12691, 12701, 12706, 12712, 12716, 12719, 12727, 12732, + 12737, 12744, 12749, 9529, 12754, 12758, 12765, 1722, 6331, 12770, 12775, + 12780, 12785, 12791, 12796, 12802, 12807, 12812, 12817, 12822, 12827, + 12832, 12837, 12842, 12847, 12852, 12857, 12862, 12867, 12872, 12877, + 12882, 12888, 12893, 12898, 12903, 12908, 12913, 12919, 12924, 12929, + 12935, 12940, 12946, 12951, 12957, 12962, 12967, 12972, 12977, 12983, + 12988, 12993, 12998, 836, 117, 13006, 13010, 13015, 13020, 13024, 13028, + 13032, 13037, 13041, 13046, 13050, 13053, 13057, 13061, 13067, 13072, + 13082, 13088, 13096, 13102, 13106, 13110, 13117, 13125, 13134, 13145, + 13152, 13159, 13163, 13172, 13181, 13189, 13198, 13207, 13216, 13225, + 13235, 13245, 13255, 13265, 13275, 13284, 13294, 13304, 13314, 13324, + 13334, 13344, 13354, 13363, 13373, 13383, 13393, 13403, 13413, 13423, + 13432, 13442, 13452, 13462, 13472, 13482, 13492, 13502, 13512, 13522, + 13531, 13541, 13551, 13561, 13571, 13581, 13591, 13601, 13611, 13621, + 13631, 13640, 1236, 13646, 13649, 13653, 13658, 13665, 13671, 13676, + 13680, 13685, 13694, 13702, 13707, 13711, 13715, 13721, 13726, 13732, + 9538, 13737, 13742, 13751, 9548, 13756, 13759, 13765, 13773, 9553, 13780, + 13784, 13788, 13793, 13797, 13807, 13813, 13819, 13824, 13833, 13841, + 13848, 13855, 13860, 13867, 13872, 13876, 13879, 13890, 13900, 13909, + 13917, 13928, 13940, 13950, 13955, 13959, 13964, 13969, 13973, 13979, + 13987, 13994, 14005, 14010, 14020, 14029, 14033, 14036, 14043, 14053, + 14062, 14069, 14073, 14080, 14086, 14091, 14096, 14100, 14109, 14114, + 14118, 14124, 14128, 14133, 14137, 14146, 14154, 14162, 14169, 14177, + 14189, 14200, 14210, 14217, 14223, 14232, 14243, 14252, 14264, 14276, + 14288, 14298, 14307, 14316, 14324, 14331, 14340, 14348, 14352, 14357, + 14363, 14369, 14374, 14379, 7968, 14383, 14385, 14389, 14394, 14400, + 14406, 14415, 14419, 14425, 14433, 14440, 14449, 14458, 14467, 14476, + 14485, 14494, 14503, 14512, 14522, 14532, 14541, 14547, 14554, 14561, + 14567, 14581, 14588, 14596, 14605, 14611, 14620, 14629, 14640, 14650, + 14658, 14665, 14673, 14682, 14695, 14703, 14710, 14723, 14729, 14735, + 14745, 14754, 14763, 14768, 14772, 14778, 14784, 14789, 14796, 14803, + 9213, 14808, 14813, 14820, 14827, 14832, 14844, 13063, 14849, 14857, + 14863, 14868, 14876, 14884, 14891, 14899, 14905, 14913, 14921, 14927, + 14932, 14938, 14945, 14951, 14956, 14960, 14971, 14979, 14985, 14990, + 14997, 15006, 15012, 15017, 15025, 15034, 15048, 3985, 15052, 15057, + 15062, 15068, 15073, 15078, 15082, 15087, 15092, 15097, 7967, 15102, + 15107, 15112, 15117, 15122, 15126, 15131, 15136, 15141, 15146, 15152, + 15158, 15163, 15167, 15173, 15178, 15183, 15188, 9557, 15193, 15198, + 15203, 15208, 15213, 15230, 15248, 15260, 15273, 15290, 15306, 15323, + 15333, 15352, 15363, 15374, 15385, 15396, 15408, 15419, 15430, 15447, + 15458, 15469, 15474, 9562, 15479, 15483, 2401, 15487, 15490, 15496, + 15504, 15512, 15517, 15525, 15533, 15540, 15544, 15549, 15555, 15562, + 15570, 15577, 15589, 15597, 15602, 15608, 12253, 15614, 15623, 15631, + 15640, 15648, 15655, 15661, 15669, 15676, 15682, 15689, 15696, 15702, + 15708, 15717, 15725, 15735, 15742, 15748, 15756, 15762, 15770, 15778, + 15785, 15798, 15805, 15814, 15823, 15832, 15840, 15850, 15857, 15862, + 3671, 15869, 15874, 1352, 15878, 15103, 15882, 15888, 15892, 15900, + 15912, 15919, 15925, 15930, 15937, 15108, 15941, 15945, 15949, 15113, + 15953, 15118, 15957, 15964, 15969, 15973, 15980, 15984, 15992, 15999, + 16004, 16008, 16015, 16032, 16041, 16045, 16048, 16056, 16062, 16067, + 3749, 16071, 16073, 16081, 16088, 16098, 16110, 16115, 16119, 16125, + 16130, 16134, 16140, 16145, 16151, 16154, 16161, 16169, 16176, 16182, + 16188, 16193, 16200, 16206, 16211, 16218, 16222, 16228, 16232, 16239, + 16245, 16250, 16256, 16264, 16272, 16279, 16285, 16290, 16296, 16302, + 16310, 16318, 16324, 16330, 16335, 16342, 16347, 16351, 16357, 16362, + 16369, 16374, 16380, 16383, 16389, 16395, 16398, 16402, 16406, 16418, + 16424, 16429, 16436, 16442, 16448, 16459, 16469, 16478, 16486, 16493, + 16504, 16514, 16524, 16532, 16535, 15132, 16540, 16545, 15137, 15278, + 16553, 16566, 16581, 16592, 15295, 16610, 16623, 16636, 16647, 11040, + 16658, 16671, 16690, 16701, 16712, 16723, 2669, 16736, 16740, 16748, + 16756, 16771, 16786, 16797, 16804, 16810, 16818, 16822, 16828, 16831, + 16841, 16849, 16856, 16864, 16874, 16879, 16886, 16891, 16898, 16909, + 16919, 16925, 16930, 16935, 15142, 16939, 16945, 16951, 16956, 16961, + 16966, 16970, 15147, 15153, 16974, 15159, 16979, 16987, 16995, 17002, + 17011, 17018, 17022, 9401, 17026, 17028, 17033, 17038, 17044, 17049, + 17054, 17059, 17064, 17068, 17074, 17080, 17085, 17091, 17096, 17101, + 17105, 17111, 17116, 17121, 17126, 17131, 17137, 17142, 17147, 17153, + 17159, 17164, 17169, 17174, 17181, 17187, 17198, 17205, 17210, 17214, + 17218, 17221, 17229, 17234, 17241, 17248, 17254, 17259, 17264, 17269, + 17276, 17286, 17291, 17298, 17304, 17313, 17323, 17333, 17347, 17361, + 17375, 17389, 17404, 17419, 17436, 17454, 17467, 17473, 17478, 17483, + 17487, 17495, 17500, 17508, 17514, 17520, 17525, 17530, 17534, 17539, + 17543, 17548, 17552, 17563, 17569, 17574, 17579, 17586, 17591, 17595, + 17600, 17605, 17611, 17618, 15168, 17624, 17628, 17634, 17639, 17644, + 17648, 17654, 17659, 17664, 17671, 17676, 13809, 17680, 17685, 17689, + 17694, 17700, 17706, 17713, 17723, 17731, 17738, 17743, 17747, 17756, + 17764, 17771, 17778, 17784, 17790, 17795, 17800, 17806, 17811, 17817, + 17822, 17828, 17834, 17841, 17847, 17852, 17857, 9627, 17866, 17869, + 17877, 17883, 17888, 17893, 17903, 17910, 17916, 17921, 17926, 17932, + 17937, 17943, 17948, 17954, 17960, 17965, 17973, 17980, 17985, 17990, + 17996, 18001, 18005, 18014, 18025, 18032, 18037, 18042, 18048, 18053, + 18061, 18067, 18073, 18080, 18086, 18091, 18095, 18101, 18106, 18111, + 18116, 1423, 7992, 2912, 18120, 18124, 18128, 18132, 18136, 18140, 18143, + 18148, 18155, 18163, 15179, 18170, 18180, 18188, 18195, 18203, 18213, + 18222, 18235, 18240, 18245, 18253, 18260, 13905, 13914, 18267, 18277, + 18292, 18298, 18305, 18312, 18318, 18324, 18332, 18342, 18352, 15184, + 18361, 18367, 18373, 18381, 18389, 18394, 18403, 18411, 18423, 18433, + 18443, 18453, 18462, 18474, 18484, 18494, 18505, 18510, 18522, 18534, + 18546, 18558, 18570, 18582, 18594, 18606, 18618, 18630, 18641, 18653, + 18665, 18677, 18689, 18701, 18713, 18725, 18737, 18749, 18761, 18772, + 18784, 18796, 18808, 18820, 18832, 18844, 18856, 18868, 18880, 18892, + 18903, 18915, 18927, 18939, 18951, 18963, 18975, 18987, 18999, 19011, + 19023, 19034, 19046, 19058, 19070, 19082, 19094, 19106, 19118, 19130, + 19142, 19154, 19165, 19177, 19189, 19201, 19213, 19225, 19237, 19249, + 19261, 19273, 19285, 19296, 19308, 19320, 19332, 19344, 19356, 19368, + 19380, 19392, 19404, 19416, 19427, 19439, 19451, 19463, 19475, 19488, + 19501, 19514, 19527, 19540, 19553, 19566, 19578, 19591, 19604, 19617, + 19630, 19643, 19656, 19669, 19682, 19695, 19708, 19720, 19733, 19746, + 19759, 19772, 19785, 19798, 19811, 19824, 19837, 19850, 19862, 19875, + 19888, 19901, 19914, 19927, 19940, 19953, 19966, 19979, 19992, 20004, + 20017, 20030, 20043, 20056, 20069, 20082, 20095, 20108, 20121, 20134, + 20146, 20159, 20172, 20185, 20198, 20211, 20224, 20237, 20250, 20263, + 20276, 20288, 20299, 20312, 20325, 20338, 20351, 20364, 20377, 20390, + 20403, 20416, 20429, 20441, 20454, 20467, 20480, 20493, 20506, 20519, + 20532, 20545, 20558, 20571, 20583, 20596, 20609, 20622, 20635, 20648, + 20661, 20674, 20687, 20700, 20713, 20725, 20738, 20751, 20764, 20777, + 20790, 20803, 20816, 20829, 20842, 20855, 20867, 20880, 20893, 20906, + 20919, 20932, 20945, 20958, 20971, 20984, 20997, 21009, 21022, 21035, + 21048, 21061, 21074, 21087, 21100, 21113, 21126, 21139, 21151, 21164, + 21177, 21190, 21203, 21216, 21229, 21242, 21255, 21268, 21281, 21293, + 21306, 21319, 21332, 21345, 21358, 21371, 21384, 21397, 21410, 21423, + 21435, 21448, 21461, 21474, 21487, 21500, 21513, 21526, 21539, 21552, + 21565, 21577, 21590, 21603, 21616, 21629, 21642, 21655, 21668, 21681, + 21694, 21707, 21719, 21730, 21739, 21747, 21755, 21762, 21768, 21772, + 21778, 21784, 21792, 21797, 21803, 21808, 21812, 21821, 9406, 21832, + 21839, 21847, 21854, 21861, 11528, 21868, 21875, 21884, 21889, 21894, + 8020, 21901, 21906, 21909, 21914, 21922, 21929, 21936, 21943, 21949, + 21958, 21967, 21973, 21982, 21986, 21992, 21997, 22007, 22014, 22020, + 22028, 22034, 22041, 22051, 22060, 22064, 22071, 22075, 22080, 22086, + 22094, 22098, 22108, 15194, 22117, 22123, 22127, 22136, 22146, 15199, + 22152, 22159, 22170, 22178, 22188, 22197, 22205, 9178, 22213, 22218, + 22224, 22229, 22233, 22237, 22241, 10124, 22246, 22254, 22261, 22270, + 22277, 22284, 22290, 11448, 22297, 22303, 22307, 22313, 22320, 22326, + 22334, 22340, 22347, 22353, 22359, 22368, 22372, 22380, 22389, 22396, + 22401, 22405, 22416, 22421, 22426, 22431, 22444, 8203, 22448, 22454, + 22462, 22466, 22473, 22482, 22487, 15470, 22495, 22499, 22511, 22516, + 22520, 22523, 22529, 22535, 22541, 22546, 22550, 22553, 22564, 22569, + 9678, 22576, 22581, 1242, 9683, 22586, 22591, 22596, 22601, 22606, 22611, + 22616, 22621, 22626, 22631, 22636, 22641, 22647, 22652, 22657, 22662, + 22667, 22672, 22677, 22682, 22687, 22692, 22698, 22704, 22709, 22714, + 22719, 22724, 22729, 22734, 22739, 22744, 22749, 22755, 22760, 22765, + 22770, 22776, 22782, 22787, 22792, 22797, 22802, 22807, 22812, 22817, + 22822, 22828, 22833, 22838, 22843, 22848, 22854, 22859, 22864, 22868, + 134, 22876, 22880, 22884, 22888, 22893, 22897, 13815, 2327, 22901, 22906, + 22910, 22915, 22919, 22924, 22928, 22934, 22939, 22943, 22947, 22955, + 22959, 22963, 22968, 22973, 22977, 22983, 22988, 22992, 22997, 23002, + 23006, 23013, 23020, 23027, 23031, 23035, 23040, 23044, 23047, 23053, + 23066, 23071, 23080, 23085, 9903, 23090, 23095, 23098, 2732, 2737, 23102, + 23108, 23114, 7413, 23119, 23124, 23129, 23135, 23140, 14636, 23145, + 23150, 23155, 23160, 23166, 23171, 23176, 23182, 23187, 23191, 23196, + 23201, 23206, 23211, 23215, 23220, 23224, 23229, 23234, 23239, 23244, + 23248, 23253, 23257, 23262, 23267, 23272, 23277, 2921, 23192, 23281, + 23289, 23296, 10218, 23308, 23316, 23197, 23323, 23328, 23336, 23202, + 23341, 23346, 23354, 23359, 23207, 23364, 23372, 23377, 23381, 23387, + 23396, 23404, 23408, 23411, 23418, 23422, 23426, 23432, 23439, 23444, + 9205, 1727, 1732, 23448, 23454, 23460, 23465, 23469, 23473, 23477, 23481, + 23485, 23489, 23493, 23497, 23500, 23506, 23513, 23521, 23527, 23533, + 23538, 23543, 23547, 23552, 14556, 14563, 23559, 23571, 23574, 23581, + 17250, 23588, 23596, 23607, 23616, 23629, 23639, 23653, 23665, 23679, + 23692, 23704, 23714, 23726, 23732, 23747, 23771, 23789, 23808, 23821, + 23835, 23853, 23869, 23886, 23904, 23915, 23934, 23951, 23971, 23989, + 24001, 24015, 24029, 24041, 24058, 24077, 24095, 24107, 24125, 24144, + 15338, 24157, 24177, 24189, 11071, 24201, 24206, 24211, 24216, 24222, + 24227, 24231, 24238, 24244, 2418, 24248, 24254, 24258, 24261, 24265, + 24268, 24276, 24282, 23225, 24286, 24295, 24306, 24312, 24318, 24333, + 24342, 24350, 24357, 24362, 24366, 24373, 24379, 24388, 24396, 24403, + 24413, 24422, 24432, 24437, 24446, 24455, 24466, 24477, 4103, 24487, + 24491, 24501, 24509, 24519, 24530, 24535, 24545, 24553, 24560, 24566, + 24573, 24578, 23235, 24582, 24591, 24595, 24598, 24603, 24611, 24618, + 24627, 24635, 24643, 24653, 24662, 24668, 24674, 24678, 23240, 23245, + 24682, 24692, 24702, 24712, 24720, 24727, 24737, 24745, 24753, 24759, + 24767, 812, 24776, 15529, 577, 24790, 24799, 24807, 24818, 24829, 24839, + 24848, 24860, 24869, 24878, 24885, 24891, 24900, 24909, 24917, 24927, + 24935, 24943, 9644, 24949, 24952, 24956, 24961, 24966, 24970, 10333, + 23258, 23263, 24978, 24984, 24990, 24995, 25000, 25004, 25012, 25018, + 25024, 25028, 3627, 25036, 25041, 25046, 25050, 25054, 10413, 25061, + 25069, 25083, 25090, 25096, 10422, 10428, 25104, 25112, 25119, 25124, + 25129, 23268, 25135, 25146, 25150, 25155, 2621, 25160, 25171, 25177, + 25182, 25186, 25190, 25193, 25200, 25207, 25213, 25220, 25226, 25230, + 23273, 25235, 25239, 25243, 1428, 8385, 25248, 25253, 25258, 25263, + 25268, 25273, 25278, 25283, 25288, 25293, 25298, 25303, 25308, 25313, + 25319, 25324, 25329, 25334, 25339, 25344, 25349, 25355, 25360, 25365, + 25370, 25375, 25380, 25385, 25390, 25396, 25402, 25407, 25413, 25418, + 25423, 5, 25429, 25433, 25437, 25441, 25446, 25450, 25454, 25458, 25462, + 25467, 25471, 25476, 25480, 25483, 25487, 25492, 25496, 25501, 25505, + 25509, 25513, 25518, 25522, 25526, 25536, 25541, 25545, 25549, 25554, + 25559, 25568, 25573, 25578, 25582, 25586, 25599, 25611, 25620, 25629, + 25634, 25640, 25645, 25649, 25653, 25663, 25672, 25680, 25686, 25691, + 25695, 25702, 25712, 25721, 25729, 25737, 25744, 25752, 25761, 25770, + 25778, 25788, 25793, 25797, 25801, 25804, 25806, 25810, 25814, 25819, + 25824, 25828, 25832, 25835, 25839, 25842, 25846, 25849, 25852, 25856, + 25862, 25866, 25870, 25874, 25879, 25884, 25889, 25893, 25896, 25901, + 25907, 25912, 25918, 25923, 25927, 25933, 25937, 25941, 25946, 25950, + 25955, 25960, 25964, 25968, 25975, 25979, 25982, 25986, 25990, 25996, + 26002, 26006, 26010, 26015, 26022, 26028, 26032, 26041, 26045, 26049, + 26052, 26058, 26063, 26069, 1472, 1791, 26074, 26079, 26084, 26089, + 26094, 26099, 26104, 2155, 2201, 26109, 26112, 26116, 26120, 26125, + 26129, 15541, 26133, 26138, 26143, 26147, 26150, 26155, 26159, 26164, + 26168, 15545, 26173, 26176, 26179, 26183, 26188, 26192, 26205, 26209, + 26212, 26220, 26229, 26236, 26241, 26247, 26253, 26261, 26268, 26275, + 26279, 26283, 26287, 26292, 26297, 26301, 26309, 26314, 26326, 26337, + 26342, 26346, 26350, 26356, 26359, 26364, 26369, 26373, 26377, 26380, + 26386, 8123, 2331, 26390, 26395, 26411, 9950, 26431, 26440, 26456, 26460, + 26467, 26470, 26476, 26486, 26492, 26501, 26516, 26528, 26539, 26547, + 26556, 26562, 26571, 26581, 26591, 26602, 26613, 26623, 26632, 26639, + 26648, 26656, 26663, 26671, 26678, 26685, 26698, 26705, 26713, 26720, + 26726, 26731, 26740, 26746, 26751, 26759, 26766, 24511, 26778, 26790, + 26804, 26812, 26819, 26831, 26840, 26849, 26857, 26865, 26873, 26880, + 26889, 26897, 26907, 26916, 26926, 26935, 26944, 26952, 26957, 26961, + 26964, 26968, 26972, 26976, 26980, 26984, 26990, 26996, 27004, 15590, + 27011, 27016, 27023, 27029, 27036, 15598, 27043, 27046, 27058, 27066, + 27072, 27077, 27081, 10363, 27092, 27100, 27110, 27119, 27126, 27130, + 15609, 27133, 27140, 27144, 27150, 27153, 27160, 27166, 27173, 27179, + 27183, 27188, 27192, 27201, 27208, 27214, 8164, 27221, 27229, 27236, + 27242, 27247, 27253, 27259, 27267, 27273, 27277, 27280, 27282, 26969, + 27291, 27297, 27303, 27313, 27318, 27325, 27331, 27336, 27341, 27346, + 27350, 27355, 27362, 27368, 27377, 27381, 27388, 27394, 27403, 27409, + 27414, 27420, 27425, 27432, 27443, 27448, 27452, 27462, 27468, 27472, + 27477, 27487, 27496, 27500, 27507, 27515, 27522, 27528, 27533, 27541, + 27548, 27553, 27560, 27572, 27581, 27585, 13746, 27593, 27603, 27607, + 26216, 27618, 27623, 27627, 27634, 27641, 22979, 26894, 27646, 27650, + 27653, 23921, 27658, 27672, 27688, 27706, 27725, 27742, 27760, 23940, + 27777, 27797, 23957, 27809, 27821, 16597, 27833, 23977, 27847, 27859, + 11084, 27873, 27878, 27883, 27888, 27894, 27900, 27906, 27910, 27918, + 27925, 27930, 27940, 27946, 10707, 27952, 27954, 27959, 27967, 27971, + 27358, 27977, 27984, 12170, 12180, 27991, 28001, 28006, 28010, 28013, + 28019, 28027, 28039, 28049, 28065, 28078, 28092, 16615, 28106, 28113, + 28117, 28120, 28125, 28129, 28136, 28143, 28153, 28158, 28163, 28168, + 28176, 28184, 28189, 28198, 28203, 3329, 28207, 28210, 28213, 28218, + 28225, 28230, 28246, 28254, 28262, 9718, 28270, 28275, 28279, 28285, + 28290, 28296, 28299, 28305, 28317, 28325, 28332, 28338, 28345, 28356, + 28370, 28383, 28389, 28398, 28404, 28413, 28425, 28436, 28446, 28455, + 28464, 28472, 28483, 8146, 28490, 28497, 28503, 28508, 28514, 28521, + 28531, 28541, 28550, 28556, 28563, 28568, 28576, 28583, 28591, 28599, + 28611, 6438, 28618, 28621, 28630, 28638, 28644, 28650, 28655, 28659, + 28662, 28668, 28675, 28680, 28685, 28690, 28694, 28706, 28717, 28726, + 28734, 15757, 28739, 28745, 28751, 12163, 8862, 28756, 28760, 28764, + 28767, 28770, 28776, 28784, 28792, 28796, 28800, 28805, 28808, 28817, + 28821, 28824, 28832, 28843, 28847, 28853, 28859, 28863, 28869, 28877, + 28899, 28923, 28932, 28939, 28946, 28952, 28960, 28966, 28971, 28982, + 29000, 29007, 29015, 29019, 29024, 29033, 29046, 29054, 29066, 29077, + 29088, 29098, 29112, 29121, 29129, 29141, 9967, 29152, 29163, 29175, + 29185, 29194, 29199, 29203, 29211, 29222, 29232, 29237, 29241, 29244, + 29247, 29255, 29263, 29272, 29282, 29291, 29297, 29311, 2683, 29333, + 29344, 29353, 29363, 29375, 29384, 29393, 29403, 29411, 29419, 29428, + 29433, 29444, 29449, 29460, 29464, 29474, 29483, 29491, 29501, 29511, + 29519, 29528, 29535, 29543, 29550, 29559, 29568, 29572, 29580, 29587, + 29595, 29602, 29613, 29628, 29635, 29641, 29651, 29660, 29666, 29677, + 29681, 29688, 29692, 29698, 14758, 29704, 29708, 29713, 29720, 29724, + 29728, 29736, 29744, 29750, 29759, 29766, 29771, 29776, 29786, 24580, + 29790, 29793, 29798, 29803, 29808, 29813, 29818, 29823, 29828, 29833, + 29839, 29844, 29849, 29855, 1198, 699, 29860, 29869, 2379, 29876, 29881, + 29885, 29891, 1247, 558, 270, 29896, 29905, 29913, 29922, 29930, 29941, + 29949, 29958, 29966, 10502, 29970, 29978, 29986, 29991, 15558, 29997, + 30003, 30009, 6034, 30014, 30018, 30024, 30028, 30035, 1438, 30041, + 30048, 1347, 6042, 30052, 30062, 30070, 30076, 30085, 30093, 30099, + 30107, 30114, 11720, 30120, 30127, 30132, 30139, 1479, 199, 2154, 30145, + 30151, 30158, 30169, 30180, 30188, 30195, 30205, 30214, 30222, 30231, + 30238, 30245, 30258, 30265, 30271, 30282, 30301, 1252, 30305, 30310, + 30318, 3686, 30322, 30327, 30331, 30335, 1442, 25833, 30345, 30349, + 30354, 30358, 3595, 30364, 30372, 30379, 30390, 30398, 30406, 3687, 320, + 30411, 30419, 30427, 30434, 30440, 30445, 2223, 11251, 30452, 30458, + 27184, 27438, 30464, 542, 106, 30468, 30472, 30478, 635, 9593, 30483, + 30490, 30496, 30500, 1624, 30503, 30507, 16005, 30510, 30515, 30522, + 30528, 30533, 30541, 30548, 30554, 23361, 30558, 30562, 3757, 17541, + 30566, 30571, 30575, 30578, 30586, 30594, 30599, 30607, 30610, 30617, + 30627, 30639, 30644, 30648, 30656, 30663, 30669, 30676, 30683, 30686, + 30690, 30694, 1446, 30704, 30706, 30711, 30717, 30723, 30728, 30733, + 30738, 30743, 30748, 30753, 30758, 30763, 30768, 30773, 30778, 30783, + 30788, 30793, 30799, 30805, 30811, 30817, 30822, 30827, 30832, 30838, + 30843, 30848, 30853, 30859, 30864, 30870, 30875, 30880, 30885, 30890, + 30896, 30901, 30907, 30912, 30917, 30922, 30927, 30933, 30938, 30944, + 30949, 30954, 30959, 30964, 30969, 30974, 30979, 30984, 30989, 30995, + 31001, 31007, 31012, 31017, 31022, 31027, 31033, 31039, 31045, 31051, + 31057, 31063, 31068, 31074, 31079, 31084, 31089, 31094, 31100, 2463, + 31105, 2470, 2477, 2774, 31110, 2483, 2493, 31116, 31120, 31125, 31130, + 31136, 31141, 31146, 31150, 31155, 31161, 31166, 31171, 31176, 31182, + 31187, 31191, 31195, 31200, 31205, 31210, 31215, 31220, 31226, 31232, + 31237, 31241, 31246, 31252, 31256, 31261, 31266, 31271, 31276, 31280, + 31283, 31288, 31293, 31298, 31303, 31308, 31314, 31320, 31325, 31330, + 31335, 31339, 31344, 31349, 31354, 31359, 31364, 31369, 31373, 31378, + 31383, 31388, 31392, 31396, 31400, 31405, 31413, 31418, 31423, 31429, + 31435, 31441, 31446, 31450, 31453, 31458, 31463, 31467, 31472, 31477, + 31481, 31486, 31490, 31493, 31498, 3853, 18248, 31503, 31508, 31513, + 31521, 22273, 30045, 9273, 31526, 31531, 31535, 31540, 31544, 31548, + 31553, 31557, 31560, 31563, 31567, 31572, 31576, 31584, 31588, 31591, + 31596, 31600, 31604, 31609, 31614, 31618, 31624, 31629, 31634, 31641, + 31648, 31652, 31655, 31661, 31670, 31677, 31685, 31692, 31696, 31701, + 31705, 31709, 31715, 31721, 31725, 31731, 31736, 31741, 31745, 31752, + 31758, 31764, 31770, 31776, 31783, 31789, 31795, 31801, 31807, 31813, + 31819, 31825, 31832, 31838, 31845, 31851, 31857, 31863, 31869, 31875, + 31881, 31887, 31893, 31899, 12059, 31905, 31911, 31916, 31921, 31926, + 31929, 31935, 31943, 31948, 31952, 31957, 31963, 31972, 31978, 31983, + 31988, 31993, 31997, 32002, 32007, 32012, 32017, 32022, 32029, 32036, + 32042, 32048, 32053, 17191, 32060, 32066, 32073, 32079, 32085, 32090, + 32098, 32103, 10117, 32107, 32112, 32117, 32123, 32128, 32133, 32137, + 32142, 32147, 32153, 32158, 32163, 32168, 32172, 32177, 32182, 32186, + 32191, 32196, 32200, 32205, 32209, 32214, 32219, 32224, 32228, 32233, + 32237, 32241, 16111, 32246, 32255, 32261, 32267, 32276, 32284, 32293, + 32301, 32306, 32310, 32317, 32323, 32331, 32335, 32338, 32343, 32352, + 32360, 32378, 32384, 1478, 32390, 32393, 32397, 23455, 23461, 32403, + 32407, 32418, 32429, 32440, 32452, 32456, 32463, 32470, 32475, 32479, + 6079, 855, 22272, 32487, 32492, 32496, 32501, 32505, 32511, 32516, 32522, + 32527, 32533, 32538, 32544, 32549, 32555, 32561, 32567, 32572, 32528, + 32534, 32576, 32581, 32587, 32592, 32598, 32603, 32609, 32614, 32539, + 10957, 32618, 32550, 32556, 32562, 2866, 3509, 32624, 32627, 32632, + 32638, 32644, 32650, 32657, 32663, 32669, 32675, 32681, 32687, 32693, + 32699, 32705, 32711, 32717, 32723, 32729, 32736, 32742, 32748, 32754, + 32760, 32766, 32769, 32774, 32777, 32784, 32789, 32797, 32802, 32807, + 32813, 32818, 32823, 32827, 32832, 32838, 32843, 32849, 32854, 32860, + 32865, 32871, 32877, 32881, 32886, 32891, 32896, 32901, 32905, 32910, + 32915, 32920, 32926, 32932, 32938, 32944, 32949, 32953, 32956, 32962, + 32968, 32977, 32985, 32992, 32997, 33001, 33005, 33010, 15959, 33015, + 33023, 33029, 3805, 1357, 33034, 33038, 8213, 33044, 33050, 33057, 8222, + 33061, 33067, 33074, 33080, 33089, 33097, 33109, 33113, 33120, 33126, + 33131, 33135, 33139, 33142, 33151, 33159, 32529, 33164, 33174, 33184, + 33194, 33200, 33205, 33215, 33220, 33233, 33247, 33258, 33270, 33282, + 33296, 33309, 33321, 33333, 15379, 33347, 33352, 33357, 33361, 33365, + 33369, 1780, 28434, 33373, 33378, 32577, 33383, 33386, 33391, 33396, + 33401, 33407, 33413, 10622, 33418, 33424, 33431, 16549, 33437, 33442, + 33447, 33451, 33456, 33461, 32582, 33466, 33471, 33476, 33482, 32588, + 33487, 33490, 33497, 33505, 33511, 33517, 33523, 33534, 33539, 33546, + 33553, 33560, 33568, 33577, 33586, 33592, 33598, 33606, 32593, 33611, + 33617, 33623, 32599, 33628, 33633, 33641, 33649, 33655, 33662, 33668, + 33675, 33682, 33688, 33696, 33706, 33713, 33719, 33724, 33730, 33735, + 33740, 33747, 33756, 33764, 33769, 33775, 33782, 33790, 33796, 33801, + 33807, 33816, 33823, 29277, 33829, 33833, 33838, 33847, 33852, 33857, + 33862, 13092, 33870, 33875, 33880, 33885, 33889, 33894, 33899, 33906, + 33911, 33916, 33921, 32604, 22209, 33927, 2539, 222, 33930, 33933, 33937, + 33941, 33951, 33959, 33966, 33970, 33977, 33984, 33993, 33997, 34000, + 34006, 34014, 34022, 34026, 34030, 34033, 34039, 34046, 34050, 34054, + 34061, 34069, 32540, 34076, 34084, 10682, 598, 349, 34096, 34101, 34106, + 34112, 34117, 34122, 3826, 34127, 34130, 34135, 34140, 34145, 34150, + 34155, 34162, 23567, 34167, 34172, 34177, 34182, 34187, 34193, 34198, + 34204, 32780, 34210, 34215, 34221, 34227, 34237, 34242, 34247, 34251, + 34256, 34261, 34266, 34271, 34284, 34289, 23312, 17621, 3839, 34293, + 34299, 34304, 34309, 34315, 34320, 34325, 34329, 34334, 34339, 34345, + 34350, 34355, 1362, 34359, 34364, 34369, 34374, 34378, 34383, 34388, + 34393, 34399, 34405, 34410, 34414, 34418, 34423, 34428, 34433, 34437, + 34445, 34449, 34455, 34459, 34466, 17400, 32551, 34472, 34479, 34487, + 34494, 34500, 34513, 34525, 34530, 34536, 34540, 2793, 34544, 34548, + 34041, 34557, 34568, 34573, 29340, 34578, 34583, 34587, 34592, 23466, + 34596, 34600, 34605, 32557, 22299, 34609, 34614, 34620, 34625, 34629, + 34633, 34636, 34640, 34646, 34655, 34666, 34678, 32563, 34683, 34686, + 34690, 34694, 378, 34699, 34704, 34709, 34714, 34719, 34724, 34730, + 34735, 34740, 34746, 34751, 34757, 34762, 34768, 34773, 34778, 34783, + 34788, 34793, 34798, 34803, 34808, 34814, 34819, 34824, 34829, 34834, + 34839, 34844, 34849, 34855, 34861, 34866, 34871, 34876, 34881, 34886, + 34891, 34896, 34901, 34906, 34911, 34916, 34921, 34926, 34931, 34936, + 34941, 34946, 34951, 34957, 311, 13, 34962, 34966, 34970, 34978, 34982, + 34986, 34989, 34992, 34994, 34999, 35003, 35008, 35012, 35017, 35021, + 35026, 35030, 35033, 35035, 35039, 35044, 35048, 35059, 35062, 35064, + 35068, 35080, 35089, 35093, 35097, 35103, 35108, 35117, 35123, 35128, + 35133, 35137, 35141, 35146, 35153, 35158, 35164, 35169, 35173, 35180, + 26902, 26912, 35184, 35189, 35194, 35199, 35206, 35210, 35217, 35223, + 8332, 35227, 35236, 35244, 35259, 35273, 35281, 35292, 35301, 35306, + 7431, 35316, 35321, 35326, 35330, 35333, 35338, 35342, 35347, 35351, + 35358, 35363, 35368, 35373, 9159, 35383, 35385, 35388, 35391, 35395, + 35401, 35405, 35410, 35415, 35421, 35426, 35432, 35437, 35447, 35456, + 35464, 35469, 35475, 35480, 35489, 35500, 35505, 35512, 35516, 35524, + 35531, 35544, 35552, 35556, 35566, 35571, 35575, 35583, 35591, 35596, + 35600, 35604, 35613, 35619, 35624, 35632, 35642, 35651, 35660, 35669, + 35680, 35688, 35699, 35708, 35715, 35721, 35726, 35737, 35742, 35746, + 35749, 35753, 35761, 35767, 35771, 35779, 35785, 35792, 35798, 35803, + 35809, 2438, 35813, 35815, 35820, 35825, 35830, 35833, 35835, 35839, + 35842, 35849, 35853, 10376, 35857, 35863, 35873, 35878, 35884, 35888, + 35893, 35906, 27308, 35912, 35921, 35930, 18427, 35937, 35946, 33180, + 35954, 35959, 35963, 35972, 35980, 35987, 35992, 35996, 36001, 36009, + 36013, 36021, 36027, 36033, 36038, 36042, 36045, 36050, 36063, 36079, + 24047, 36096, 36108, 36125, 36137, 36151, 24064, 24083, 36163, 36175, + 2700, 36189, 36194, 36199, 36204, 36208, 36215, 36227, 36233, 36242, + 36245, 36256, 36267, 36272, 33603, 792, 36276, 36280, 36284, 36287, + 36292, 36297, 36303, 36308, 36313, 36319, 36325, 36330, 36334, 36339, + 36344, 36349, 36353, 36356, 36362, 36367, 36372, 36377, 36381, 36386, + 36392, 36400, 27565, 36405, 36410, 36417, 36423, 36429, 36434, 36442, + 23576, 36449, 36454, 36459, 36464, 36468, 36471, 36476, 36480, 36484, + 36491, 36497, 36503, 36509, 36516, 36521, 36527, 35586, 36531, 36535, + 36540, 36553, 36558, 36564, 36572, 36579, 36587, 36597, 36603, 36609, + 36615, 36619, 36628, 36636, 36643, 36648, 36653, 10980, 36658, 36666, + 36673, 36679, 36689, 36694, 36700, 36708, 3719, 36715, 36721, 36728, + 3725, 36732, 36737, 36748, 36755, 36761, 36770, 36774, 4155, 36777, + 36784, 36790, 36796, 36804, 36814, 30435, 36821, 36829, 36835, 36840, + 36846, 36851, 36855, 27156, 36861, 36868, 36874, 36883, 36890, 24764, + 36896, 36901, 36905, 36913, 36921, 10082, 6065, 36928, 36932, 36934, + 36938, 36943, 36945, 36950, 36956, 36961, 36966, 36973, 34158, 36979, + 36984, 36988, 36993, 36997, 37006, 37010, 37016, 37023, 37029, 37036, + 37041, 37050, 37055, 37059, 37064, 37071, 37079, 37087, 37092, 22355, + 37096, 37099, 37103, 37107, 37111, 37114, 37116, 37121, 37129, 37133, + 37142, 37149, 37153, 37157, 37165, 37172, 37182, 37186, 37190, 37198, + 37206, 37212, 37217, 37226, 14064, 37232, 37241, 37246, 37253, 37260, + 37268, 37276, 37284, 37289, 37296, 37303, 37310, 37317, 37324, 37329, + 37335, 37352, 37360, 37370, 37378, 37385, 392, 37389, 37395, 37399, + 37404, 35297, 37410, 37413, 37417, 37428, 37436, 3730, 37444, 37450, + 37456, 37466, 37475, 37485, 37492, 37498, 37503, 3736, 3742, 37512, + 37519, 37527, 37532, 37536, 37543, 37551, 37558, 37564, 37573, 37583, + 37589, 37597, 37606, 37613, 37621, 37628, 23037, 37632, 37639, 37645, + 37655, 37664, 37672, 37683, 37687, 37697, 37703, 37710, 37718, 37727, + 37736, 37746, 37757, 37764, 37769, 37776, 3064, 37784, 37790, 37795, + 37801, 37807, 37812, 37825, 37838, 37851, 37858, 37864, 37872, 37880, + 37885, 37889, 1452, 37893, 37897, 37901, 37905, 37909, 37913, 37917, + 37921, 37925, 37929, 37933, 37937, 37941, 37945, 37949, 37953, 37957, + 37961, 37965, 37969, 37973, 37977, 37981, 37985, 37989, 37993, 37997, + 38001, 38005, 38009, 38013, 38017, 38021, 38025, 38029, 38033, 38037, + 38041, 38045, 38049, 38053, 38057, 38061, 38065, 38069, 38073, 38077, + 38081, 38085, 38089, 38093, 38097, 38101, 38105, 38109, 38113, 38117, + 38121, 38125, 38129, 38133, 38137, 38141, 38145, 38149, 38153, 38157, + 38161, 38165, 38169, 38173, 38177, 38181, 38185, 38189, 38193, 38197, + 38201, 38205, 38209, 38213, 38217, 38221, 38225, 38229, 38233, 38237, + 38241, 38245, 38249, 38253, 38257, 38261, 38265, 38269, 38273, 38277, + 38281, 38285, 38289, 38293, 38297, 38301, 38305, 38309, 38313, 38317, + 38321, 38325, 38329, 38333, 38337, 38341, 38345, 38349, 38353, 38357, + 38361, 38365, 38369, 38373, 38377, 38381, 38385, 38389, 38393, 38397, + 38401, 38405, 38409, 38413, 38417, 38421, 38425, 38429, 38433, 38437, + 38441, 38445, 38449, 38453, 38457, 38461, 38465, 38469, 38473, 38477, + 38481, 38485, 38489, 38493, 38497, 38501, 38505, 38510, 38514, 38519, + 38523, 38528, 38532, 38537, 38541, 38547, 38552, 38556, 38561, 38565, + 38570, 38574, 38579, 38583, 38588, 38592, 38597, 38601, 38606, 38610, + 38616, 38622, 38627, 38631, 38636, 38640, 38646, 38651, 38655, 38660, + 38664, 38669, 38673, 38679, 38684, 38688, 38693, 38697, 38702, 38706, + 38711, 38715, 38721, 38726, 38730, 38735, 38739, 38745, 38750, 38754, + 38759, 38763, 38768, 38772, 38777, 38781, 38786, 38790, 38796, 38801, + 38805, 38811, 38816, 38820, 38826, 38831, 38835, 38840, 38844, 38849, + 38853, 38859, 38865, 38871, 38877, 38883, 38889, 38895, 38901, 38906, + 38910, 38915, 38919, 38925, 38930, 38934, 38939, 38943, 38948, 38952, + 38957, 38961, 38966, 38970, 38975, 38979, 38984, 38988, 38994, 38999, + 39003, 39008, 39012, 39018, 39024, 39029, 111, 88, 39033, 39035, 39039, + 39043, 39047, 39052, 39056, 39060, 10003, 39065, 39071, 1741, 6472, + 39077, 39080, 39085, 39089, 39094, 39098, 39102, 39107, 10769, 39111, + 39115, 39119, 594, 39123, 16207, 39128, 39132, 39137, 39142, 39147, + 39151, 39158, 27332, 39164, 39167, 39171, 39176, 39182, 39186, 39194, + 39200, 39205, 39209, 39212, 39216, 39222, 39226, 39230, 3560, 3565, + 30642, 39233, 39237, 39241, 39245, 39249, 39257, 39264, 39268, 39275, + 39280, 39294, 39301, 39312, 324, 39317, 39321, 39327, 39339, 39345, + 39351, 30679, 39355, 39361, 39370, 39374, 39378, 39383, 39389, 39394, + 39398, 39403, 39407, 39411, 39418, 39424, 39429, 39444, 39459, 39474, + 39490, 39508, 10719, 39522, 39529, 39533, 39536, 39545, 39550, 39554, + 39562, 35537, 39570, 39574, 39584, 39595, 30612, 39608, 39612, 39621, + 39629, 10270, 15723, 39633, 23478, 39636, 31580, 39641, 10269, 39646, + 39652, 39657, 39663, 39668, 39674, 39679, 39685, 39690, 39696, 39702, + 39708, 39713, 39669, 39675, 39680, 39686, 39691, 39697, 39703, 8345, + 4006, 39717, 39725, 39729, 39732, 39736, 39741, 39746, 39752, 39758, + 39763, 39767, 39771, 27168, 39775, 39779, 39783, 39789, 39793, 29217, + 9296, 39802, 39809, 39815, 39819, 12562, 39826, 39832, 39837, 39844, + 39851, 39858, 29917, 8257, 39865, 39872, 39879, 39885, 39890, 39897, + 39908, 39914, 39919, 39924, 39929, 39936, 39670, 39940, 39950, 39959, + 39970, 39976, 39983, 39988, 39993, 39998, 40003, 40008, 40012, 40016, + 40022, 40030, 2334, 955, 10785, 10797, 10802, 10808, 40039, 10813, 10818, + 10824, 40044, 40054, 40058, 10829, 40063, 17814, 40066, 40071, 40075, + 36237, 40086, 40091, 40098, 40105, 40109, 40112, 40120, 10732, 40127, + 40130, 40136, 40146, 6106, 40155, 40161, 40165, 40173, 40177, 40187, + 40193, 40198, 40209, 40215, 40221, 40226, 40232, 40238, 40244, 40249, + 40252, 40259, 40265, 40269, 40274, 40281, 40288, 40292, 40295, 40305, + 40318, 40327, 40336, 40347, 40360, 40372, 40383, 40392, 40403, 40408, + 40417, 40422, 10834, 40428, 40435, 40443, 40448, 40452, 40459, 40466, + 3958, 20, 40470, 40475, 17668, 40479, 40482, 40485, 29397, 40489, 29926, + 40497, 40501, 40505, 40508, 40514, 40520, 32628, 40525, 40533, 40539, + 40546, 29380, 40550, 29583, 40554, 40563, 40569, 40575, 40580, 40584, + 29945, 40590, 40593, 40601, 40609, 27410, 40615, 40619, 40624, 40631, + 40637, 40642, 40647, 40651, 40657, 40662, 40668, 4208, 883, 40675, 40679, + 40682, 16093, 40694, 40705, 37602, 40710, 40713, 40720, 40724, 40730, + 40734, 40740, 40745, 40751, 40756, 40761, 40765, 40769, 40774, 40779, + 40789, 40795, 40808, 40814, 40820, 40826, 40833, 40838, 40844, 40849, + 17559, 1455, 771, 40854, 40857, 40860, 40863, 32712, 32718, 40866, 32724, + 32737, 32743, 32749, 40872, 32755, 32761, 40878, 40884, 26, 40892, 40899, + 40903, 40907, 40915, 33492, 40919, 40923, 40930, 40935, 40939, 40944, + 40950, 40955, 40961, 40966, 40970, 40974, 40978, 40983, 40987, 40992, + 40996, 41000, 41007, 41012, 41016, 41020, 41025, 41029, 41034, 41038, + 41042, 41047, 41053, 16343, 16348, 41058, 41062, 41065, 41069, 41073, + 22166, 41078, 41082, 41088, 41095, 41100, 41110, 41115, 41123, 41127, + 41130, 33507, 41134, 4261, 41139, 41144, 41148, 41153, 41157, 41162, + 14082, 41173, 41177, 41180, 41184, 41189, 41193, 41198, 41203, 41207, + 41211, 41215, 41218, 41222, 8364, 14098, 41225, 41228, 41234, 41239, + 41245, 41250, 41256, 41261, 41267, 41272, 41278, 41284, 41290, 41295, + 41299, 41303, 41312, 41328, 41344, 41354, 29287, 41361, 41365, 41370, + 41375, 41379, 41383, 37731, 41389, 41394, 41398, 41405, 41410, 41415, + 41419, 41423, 41429, 28237, 41433, 22450, 41438, 41445, 41453, 41459, + 41466, 41474, 41480, 41484, 41489, 41495, 41503, 41508, 41512, 41521, + 9984, 41529, 41533, 41541, 41548, 41553, 41558, 41563, 41567, 41570, + 41574, 41577, 41581, 41588, 41593, 41597, 41603, 27643, 32775, 41607, + 41613, 41620, 41626, 41632, 41637, 41640, 41642, 41649, 41656, 41662, + 41666, 41669, 41673, 41677, 41681, 41686, 41690, 41694, 41697, 41701, + 41715, 24113, 41734, 41747, 41760, 41773, 24131, 41788, 11045, 41803, + 41809, 41813, 41817, 41821, 41825, 41832, 41837, 41841, 41848, 41854, + 41859, 41865, 41875, 41887, 41898, 41903, 41910, 41914, 41918, 41921, + 16751, 3799, 41929, 16370, 41942, 41949, 41953, 41957, 41962, 41967, + 41973, 41977, 41981, 41984, 41989, 41993, 41998, 7957, 16381, 42003, + 42007, 42013, 42022, 42027, 42036, 42043, 37579, 42049, 42054, 42058, + 42063, 42070, 42076, 42080, 42083, 42087, 42092, 15344, 42099, 42106, + 42110, 42113, 42118, 42123, 42129, 42134, 42139, 42143, 42148, 42158, + 42163, 42169, 42174, 42180, 42185, 42191, 42201, 42206, 42211, 42215, + 42220, 7433, 7445, 42225, 42228, 42235, 42241, 42250, 35711, 35718, + 42258, 42262, 42266, 33555, 42274, 42285, 42293, 37779, 42300, 42305, + 42310, 42321, 42328, 42339, 33579, 22456, 42347, 834, 42352, 14429, + 42358, 29371, 42364, 42369, 42379, 42388, 42395, 42401, 42405, 42408, + 42415, 42421, 42428, 42434, 42444, 42452, 42458, 42464, 42469, 42473, + 42480, 42485, 42491, 42498, 42504, 41682, 42509, 42513, 526, 14545, + 42519, 42524, 42527, 42533, 42541, 1379, 42546, 42550, 42555, 42560, + 42565, 42572, 42576, 42581, 42587, 42591, 32785, 42596, 42601, 42610, + 42617, 42627, 42633, 29415, 42650, 42659, 42667, 42673, 42678, 42685, + 42691, 42699, 42708, 42716, 42720, 42725, 42733, 30360, 33588, 42739, + 42758, 16676, 42772, 42788, 42802, 42808, 42813, 42818, 42823, 42829, + 33594, 42834, 42837, 42844, 42849, 42853, 376, 2971, 42860, 42865, 42870, + 28595, 42688, 42874, 42879, 42887, 42891, 42894, 42899, 42905, 42911, + 42916, 42920, 29470, 42923, 42928, 42932, 42935, 42940, 42944, 42949, + 42954, 42958, 42963, 42967, 42971, 42975, 22162, 22173, 42980, 42985, + 42991, 42996, 28194, 43001, 43005, 22259, 16932, 43008, 43013, 43018, + 43023, 43028, 43033, 43038, 43043, 469, 49, 32798, 32803, 32808, 32814, + 32819, 32824, 43048, 32828, 43052, 43056, 43060, 32833, 32839, 43074, + 32850, 32855, 43082, 43087, 32861, 43092, 43097, 43102, 43107, 43113, + 43119, 43125, 32878, 43138, 43147, 43153, 32882, 43157, 32887, 43162, + 32892, 32897, 43165, 43170, 43174, 32433, 43180, 14310, 43187, 43192, + 32902, 43196, 43201, 43206, 43211, 43215, 43220, 43225, 43231, 43236, + 43241, 43247, 43253, 43258, 43262, 43267, 43272, 43277, 43281, 43286, + 43291, 43296, 43302, 43308, 43314, 43319, 43323, 43328, 43332, 32906, + 32911, 32916, 43336, 43340, 43344, 32921, 32927, 32933, 32945, 43356, + 27205, 43360, 43365, 43369, 43374, 43381, 43386, 43391, 43396, 43400, + 43404, 43414, 43419, 43424, 43428, 43432, 43435, 43443, 32993, 43448, + 1462, 43454, 43459, 43465, 43473, 43482, 43486, 43490, 43498, 43504, + 43512, 43528, 43532, 43536, 43541, 43547, 43562, 33030, 1749, 12742, + 43566, 1358, 1373, 43578, 43586, 43593, 43598, 43605, 43610, 9674, 1062, + 2525, 10861, 43617, 9572, 43622, 43625, 43634, 1266, 43639, 41838, 43646, + 43655, 43660, 43664, 43672, 23534, 2577, 43679, 11301, 43689, 43695, + 2352, 2362, 43704, 43713, 43723, 43734, 3352, 35874, 43739, 10920, 3936, + 17597, 1271, 43743, 43751, 43758, 43763, 43767, 43771, 24981, 42094, + 10947, 43779, 43788, 43797, 43805, 43812, 43823, 43828, 43841, 43854, + 43866, 43878, 43890, 43901, 43914, 43925, 43936, 43946, 43954, 43962, + 43974, 43986, 43997, 44006, 44014, 44021, 44033, 44040, 44046, 44055, + 44062, 44075, 44080, 44090, 44095, 44101, 44106, 39816, 44110, 44117, + 44121, 44128, 44136, 2538, 44143, 44154, 44164, 44173, 44181, 44191, + 44199, 44209, 44218, 44223, 44229, 44235, 44240, 3838, 44251, 44261, + 44270, 44279, 44287, 44297, 44305, 44314, 44319, 44324, 44329, 1679, 37, + 44337, 44345, 44356, 44367, 17244, 44377, 44381, 44388, 44394, 44399, + 44403, 44414, 44424, 44433, 44444, 17641, 17646, 44449, 44458, 44463, + 44473, 44478, 44486, 44494, 44501, 44507, 1641, 251, 44511, 44517, 44522, + 44525, 2124, 41954, 44533, 44537, 44540, 1495, 44546, 14707, 1276, 44551, + 44564, 44578, 2663, 44596, 44608, 44620, 2677, 2694, 44634, 44647, 2709, + 44661, 44673, 2724, 44687, 1282, 1288, 1294, 11207, 44692, 44697, 44702, + 44706, 44721, 44736, 44751, 44766, 44781, 44796, 44811, 44826, 44841, + 44856, 44871, 44886, 44901, 44916, 44931, 44946, 44961, 44976, 44991, + 45006, 45021, 45036, 45051, 45066, 45081, 45096, 45111, 45126, 45141, + 45156, 45171, 45186, 45201, 45216, 45231, 45246, 45261, 45276, 45291, + 45306, 45321, 45336, 45351, 45366, 45381, 45396, 45411, 45426, 45441, + 45456, 45471, 45486, 45501, 45516, 45531, 45546, 45561, 45576, 45591, + 45606, 45621, 45636, 45651, 45666, 45681, 45696, 45711, 45726, 45741, + 45756, 45771, 45786, 45801, 45816, 45831, 45846, 45861, 45876, 45891, + 45906, 45921, 45936, 45951, 45966, 45981, 45996, 46011, 46026, 46041, + 46056, 46071, 46086, 46101, 46116, 46131, 46146, 46161, 46176, 46191, + 46206, 46221, 46236, 46251, 46266, 46281, 46296, 46311, 46326, 46341, + 46356, 46371, 46386, 46401, 46416, 46431, 46446, 46461, 46476, 46491, + 46506, 46521, 46536, 46551, 46566, 46581, 46596, 46611, 46626, 46641, + 46656, 46671, 46686, 46701, 46716, 46731, 46746, 46761, 46776, 46791, + 46806, 46821, 46836, 46851, 46866, 46881, 46896, 46911, 46926, 46941, + 46956, 46971, 46986, 47001, 47016, 47031, 47046, 47061, 47076, 47091, + 47106, 47121, 47136, 47151, 47166, 47181, 47196, 47211, 47226, 47241, + 47256, 47271, 47286, 47301, 47316, 47331, 47346, 47361, 47376, 47391, + 47406, 47421, 47436, 47451, 47466, 47481, 47496, 47511, 47526, 47541, + 47556, 47571, 47586, 47601, 47616, 47631, 47646, 47661, 47676, 47691, + 47706, 47721, 47736, 47751, 47766, 47781, 47796, 47811, 47826, 47841, + 47856, 47871, 47886, 47901, 47916, 47931, 47946, 47961, 47976, 47991, + 48006, 48021, 48036, 48051, 48066, 48081, 48096, 48111, 48126, 48141, + 48156, 48171, 48186, 48201, 48216, 48231, 48246, 48261, 48276, 48291, + 48306, 48321, 48336, 48351, 48366, 48381, 48396, 48411, 48426, 48441, + 48456, 48471, 48486, 48501, 48516, 48531, 48546, 48561, 48576, 48591, + 48606, 48621, 48636, 48651, 48666, 48681, 48696, 48711, 48726, 48741, + 48756, 48771, 48786, 48801, 48816, 48831, 48846, 48861, 48876, 48891, + 48906, 48921, 48936, 48951, 48966, 48981, 48996, 49011, 49026, 49041, + 49056, 49071, 49086, 49101, 49116, 49131, 49146, 49161, 49176, 49191, + 49206, 49221, 49236, 49251, 49266, 49281, 49296, 49311, 49326, 49341, + 49356, 49371, 49386, 49401, 49416, 49431, 49446, 49461, 49476, 49491, + 49506, 49521, 49536, 49551, 49566, 49581, 49596, 49611, 49626, 49641, + 49656, 49671, 49686, 49701, 49716, 49731, 49746, 49761, 49776, 49791, + 49806, 49821, 49836, 49851, 49866, 49881, 49896, 49911, 49926, 49941, + 49956, 49971, 49986, 50001, 50016, 50031, 50046, 50061, 50076, 50091, + 50106, 50121, 50136, 50151, 50166, 50181, 50196, 50211, 50226, 50241, + 50256, 50271, 50286, 50301, 50316, 50331, 50346, 50361, 50376, 50391, + 50406, 50421, 50436, 50451, 50466, 50481, 50496, 50511, 50526, 50541, + 50556, 50571, 50586, 50601, 50616, 50631, 50646, 50661, 50676, 50691, + 50706, 50721, 50736, 50751, 50766, 50781, 50796, 50811, 50826, 50841, + 50856, 50871, 50886, 50901, 50916, 50931, 50946, 50961, 50976, 50991, + 51006, 51021, 51036, 51051, 51066, 51081, 51096, 51111, 51126, 51141, + 51156, 51171, 51186, 51201, 51216, 51231, 51246, 51261, 51276, 51291, + 51306, 51321, 51336, 51351, 51366, 51381, 51396, 51411, 51426, 51441, + 51456, 51471, 51486, 51501, 51516, 51531, 51546, 51561, 51576, 51591, + 51606, 51621, 51636, 51651, 51666, 51681, 51696, 51711, 51726, 51741, + 51756, 51771, 51786, 51801, 51816, 51831, 51846, 51861, 51876, 51891, + 51906, 51921, 51936, 51951, 51966, 51981, 51996, 52011, 52026, 52041, + 52056, 52071, 52086, 52101, 52116, 52131, 52146, 52161, 52176, 52191, + 52206, 52221, 52236, 52251, 52266, 52281, 52296, 52311, 52326, 52341, + 52356, 52371, 52386, 52401, 52416, 52431, 52446, 52461, 52476, 52491, + 52506, 52522, 52538, 52554, 52570, 52586, 52602, 52618, 52634, 52650, + 52666, 52682, 52698, 52714, 52730, 52746, 52762, 52778, 52794, 52810, + 52826, 52842, 52858, 52874, 52890, 52906, 52922, 52938, 52954, 52970, + 52986, 53002, 53018, 53034, 53050, 53066, 53082, 53098, 53114, 53130, + 53146, 53162, 53178, 53194, 53210, 53226, 53242, 53258, 53274, 53290, + 53306, 53322, 53338, 53354, 53370, 53386, 53402, 53418, 53434, 53450, + 53466, 53482, 53498, 53514, 53530, 53546, 53562, 53578, 53594, 53610, + 53626, 53642, 53658, 53674, 53690, 53706, 53722, 53738, 53754, 53770, + 53786, 53802, 53818, 53834, 53850, 53866, 53882, 53898, 53914, 53930, + 53946, 53962, 53978, 53994, 54010, 54026, 54042, 54058, 54074, 54090, + 54106, 54122, 54138, 54154, 54170, 54186, 54202, 54218, 54234, 54250, + 54266, 54282, 54298, 54314, 54330, 54346, 54362, 54378, 54394, 54410, + 54426, 54442, 54458, 54474, 54490, 54506, 54522, 54538, 54554, 54570, + 54586, 54602, 54618, 54634, 54650, 54666, 54682, 54698, 54714, 54730, + 54746, 54762, 54778, 54794, 54810, 54826, 54842, 54858, 54874, 54890, + 54906, 54922, 54938, 54954, 54970, 54986, 55002, 55018, 55034, 55050, + 55066, 55082, 55098, 55114, 55130, 55146, 55162, 55178, 55194, 55210, + 55226, 55242, 55258, 55274, 55290, 55306, 55322, 55338, 55354, 55370, + 55386, 55402, 55418, 55434, 55450, 55466, 55482, 55498, 55514, 55530, + 55546, 55562, 55578, 55594, 55610, 55626, 55642, 55658, 55674, 55690, + 55706, 55722, 55738, 55754, 55770, 55786, 55802, 55818, 55834, 55850, + 55866, 55882, 55898, 55914, 55930, 55946, 55962, 55978, 55994, 56010, + 56026, 56042, 56058, 56074, 56090, 56106, 56122, 56138, 56154, 56170, + 56186, 56202, 56218, 56234, 56250, 56266, 56282, 56298, 56314, 56330, + 56346, 56362, 56378, 56394, 56410, 56426, 56442, 56458, 56474, 56490, + 56506, 56522, 56538, 56554, 56570, 56586, 56602, 56618, 56634, 56650, + 56666, 56682, 56698, 56714, 56730, 56746, 56762, 56778, 56794, 56810, + 56826, 56842, 56858, 56874, 56890, 56906, 56922, 56938, 56954, 56970, + 56986, 57002, 57018, 57034, 57050, 57066, 57082, 57098, 57114, 57130, + 57146, 57162, 57178, 57194, 57210, 57226, 57242, 57258, 57274, 57290, + 57306, 57322, 57338, 57354, 57370, 57386, 57402, 57418, 57434, 57450, + 57466, 57482, 57498, 57514, 57530, 57546, 57562, 57578, 57594, 57610, + 57626, 57642, 57658, 57674, 57690, 57706, 57722, 57738, 57754, 57770, + 57786, 57802, 57818, 57834, 57850, 57866, 57882, 57898, 57914, 57930, + 57946, 57962, 57978, 57994, 58010, 58026, 58042, 58058, 58074, 58090, + 58106, 58122, 58138, 58154, 58170, 58186, 58202, 58218, 58234, 58250, + 58266, 58282, 58298, 58314, 58330, 58346, 58362, 58378, 58394, 58410, + 58426, 58442, 58458, 58474, 58490, 58506, 58522, 58538, 58554, 58570, + 58586, 58602, 58618, 58634, 58650, 58666, 58682, 58698, 58714, 58730, + 58746, 58762, 58778, 58794, 58810, 58826, 58842, 58858, 58874, 58890, + 58906, 58922, 58938, 58954, 58970, 58986, 59002, 59018, 59034, 59050, + 59066, 59082, 59098, 59114, 59130, 59146, 59162, 59178, 59194, 59210, + 59226, 59242, 59258, 59274, 59290, 59306, 59322, 59338, 59354, 59370, + 59386, 59402, 59418, 59434, 59450, 59466, 59482, 59498, 59514, 59530, + 59546, 59562, 59578, 59594, 59610, 59626, 59642, 59658, 59674, 59690, + 59706, 59722, 59738, 59754, 59770, 59786, 59802, 59818, 59834, 59850, + 59866, 59882, 59898, 59914, 59930, 59946, 59962, 59978, 59994, 60010, + 60026, 60042, 60058, 60074, 60090, 60106, 60122, 60138, 60154, 60170, + 60186, 60202, 60218, 60234, 60250, 60266, 60282, 60298, 60314, 60330, + 60346, 60362, 60378, 60394, 60410, 60426, 60442, 60458, 60474, 60490, + 60506, 60522, 60538, 60554, 60570, 60586, 60602, 60618, 60634, 60650, + 60666, 60682, 60698, 60714, 60730, 60746, 60762, 60778, 60794, 60810, + 60826, 60842, 60858, 60874, 60890, 60906, 60922, 60938, 60954, 60970, + 60986, 61002, 61018, 61034, 61050, 61066, 61082, 61098, 61114, 61130, + 61146, 61162, 61178, 61193, 17673, 61202, 61207, 61213, 61219, 61229, + 61237, 15704, 16287, 10445, 61250, 1503, 1507, 61258, 3890, 28713, 7387, + 61264, 61269, 61274, 61279, 61284, 61290, 61295, 61301, 61306, 61312, + 61317, 61322, 61327, 61332, 61338, 61343, 61348, 61353, 61358, 61363, + 61368, 61373, 61379, 61384, 61390, 61397, 2581, 61402, 61408, 8753, + 61412, 61417, 61424, 61432, 46, 61436, 61442, 61447, 61452, 61456, 61461, + 61465, 61469, 11244, 61473, 61483, 61496, 61507, 61520, 61527, 61533, + 61538, 61544, 61550, 61556, 61561, 61566, 61571, 61576, 61580, 61585, + 61590, 61595, 61601, 61607, 61613, 61618, 61622, 61627, 61632, 61636, + 61641, 61646, 61651, 61655, 11260, 11271, 11276, 1546, 61659, 61665, + 1551, 61670, 61673, 17122, 61678, 61684, 61689, 1582, 61695, 1588, 1594, + 11306, 61700, 61709, 61717, 61724, 61728, 61734, 61739, 32466, 61744, + 61751, 61756, 61760, 61764, 61773, 1599, 17219, 61778, 61782, 17230, + 1105, 61786, 61793, 61798, 61802, 17260, 1603, 39964, 61805, 61810, + 61820, 61829, 61834, 61838, 61844, 1608, 42055, 61849, 61858, 61864, + 61869, 61874, 11474, 11480, 61880, 61892, 61909, 61926, 61943, 61960, + 61977, 61994, 62011, 62028, 62045, 62062, 62079, 62096, 62113, 62130, + 62147, 62164, 62181, 62198, 62215, 62232, 62249, 62266, 62283, 62300, + 62317, 62334, 62351, 62368, 62385, 62402, 62419, 62436, 62453, 62470, + 62487, 62504, 62521, 62538, 62555, 62572, 62589, 62606, 62623, 62640, + 62657, 62674, 62691, 62708, 62725, 62736, 62741, 1613, 62745, 62750, + 62756, 62761, 62766, 9591, 1618, 62772, 62781, 29029, 62786, 62797, + 11491, 62807, 62812, 62818, 62823, 62830, 62836, 62841, 1623, 17535, + 62846, 11501, 1628, 11506, 62852, 62857, 62863, 62868, 62873, 62878, + 62883, 62888, 62893, 62898, 62903, 62909, 62915, 62921, 62926, 62930, + 62935, 62940, 62944, 62949, 62954, 62959, 62964, 62968, 62973, 62979, + 62984, 62989, 62993, 62998, 63003, 63009, 63014, 63019, 63025, 63031, + 63036, 63040, 63045, 63050, 63055, 63059, 63064, 63069, 63074, 63080, + 63086, 63091, 63095, 63099, 63104, 63109, 63114, 30504, 63118, 63123, + 63128, 63134, 63139, 63144, 63148, 63153, 63158, 63164, 63169, 63174, + 63180, 63186, 63191, 63195, 63200, 63205, 63209, 63214, 63219, 63224, + 63230, 63236, 63241, 63245, 63250, 63255, 63259, 63264, 63269, 63274, + 63279, 63283, 63286, 63289, 63294, 33147, 63299, 63307, 17601, 3774, + 11604, 63313, 63323, 63338, 63346, 11609, 63357, 63362, 63373, 63385, + 63397, 63409, 2715, 63421, 63426, 63438, 63442, 63448, 63454, 63459, + 1645, 16826, 63468, 63473, 42114, 63477, 63481, 63486, 63490, 17681, + 63495, 63498, 63503, 63511, 63519, 1649, 11645, 11651, 1654, 63527, + 63534, 63539, 63548, 63558, 63565, 63570, 63575, 1659, 63582, 63587, + 17796, 63591, 63596, 63603, 63609, 63613, 63624, 63634, 17818, 9485, + 9492, 63641, 1664, 63646, 63652, 63660, 63667, 63673, 63680, 63692, + 63698, 63703, 63715, 63726, 63735, 63745, 3869, 32271, 32280, 17858, + 1669, 1673, 63753, 63764, 63769, 1683, 63777, 63782, 63787, 17917, 63799, + 63802, 63808, 63813, 63821, 1688, 63826, 63831, 63839, 63847, 63854, + 63863, 63871, 63880, 1693, 63884, 1698, 22330, 63889, 63896, 17991, + 63904, 63910, 63915, 63923, 63930, 63938, 17309, 63943, 11797, 63952, + 63958, 63963, 63970, 63977, 63983, 16991, 63993, 63999, 64004, 64015, + 64020, 64028, 11814, 11819, 64036, 64042, 64046, 64054, 3934, 18038, + 42207, 64059, 64065, 64070, 64078, 64085, 12723, 64090, 64096, 1709, + 64101, 64104, 1172, 64110, 64115, 64120, 64126, 64131, 64136, 64141, + 64146, 64151, 64156, 1718, 9, 64162, 64166, 64171, 64175, 64179, 64183, + 33387, 64188, 24277, 64193, 64198, 64202, 64205, 64209, 64213, 64218, + 64222, 64227, 64231, 64237, 36288, 36293, 36298, 64240, 64247, 64253, + 64261, 41891, 64271, 36304, 33651, 33402, 33408, 36320, 33414, 64276, + 64281, 33684, 64285, 64288, 64292, 64299, 64302, 64307, 64312, 64316, + 64320, 64323, 64333, 64345, 64352, 64358, 33419, 64365, 35149, 64368, + 8770, 940, 64371, 64375, 64380, 3812, 64384, 64387, 14343, 64394, 64401, + 64414, 64422, 64431, 64440, 64445, 64455, 64468, 64480, 64487, 64492, + 64501, 64514, 37819, 64532, 64537, 64544, 64550, 746, 64555, 64563, + 64570, 28536, 710, 64576, 64582, 64592, 64598, 64603, 33438, 6185, 33452, + 64607, 64617, 64622, 64632, 64647, 64653, 64659, 33462, 64664, 32583, + 64668, 64673, 64680, 64685, 64689, 64694, 17861, 64701, 64706, 64710, + 6226, 33488, 64714, 64720, 310, 64730, 64737, 64744, 64749, 64758, 61814, + 64764, 64772, 64776, 64780, 64784, 64788, 64793, 64797, 64803, 64811, + 64816, 64821, 64826, 64830, 64835, 64839, 64843, 64849, 64855, 64860, + 64864, 64869, 33612, 64873, 33618, 33624, 64878, 64884, 64891, 64896, + 64900, 32600, 17528, 64903, 64907, 64912, 64919, 64925, 64929, 64934, + 41583, 64940, 64944, 64951, 64955, 64960, 64966, 64972, 64978, 64990, + 64999, 65009, 65015, 65022, 65027, 65032, 65036, 65039, 65045, 65052, + 65057, 65062, 65069, 65076, 65083, 65089, 65094, 65099, 65107, 33629, + 2443, 65112, 65117, 65123, 65128, 65134, 65139, 65144, 65149, 65155, + 33650, 65160, 65166, 65172, 65178, 33720, 65183, 65188, 65193, 33731, + 65198, 65203, 65208, 65214, 65220, 33736, 65225, 65230, 65235, 33791, + 33797, 65240, 65245, 33802, 33824, 29278, 33830, 33834, 65250, 12467, + 65254, 65262, 65268, 65276, 65283, 65289, 65299, 65305, 65312, 11179, + 33848, 65318, 65331, 65340, 65346, 65355, 65361, 24587, 65368, 65375, + 65385, 65388, 33792, 65393, 65400, 65405, 65409, 65413, 65418, 65422, + 6306, 65427, 65432, 65437, 36382, 36387, 65441, 36401, 65446, 36406, + 65451, 65457, 36418, 36424, 36430, 65462, 65468, 23577, 65479, 65482, + 65494, 65502, 33871, 65506, 65515, 65525, 65534, 33881, 65539, 65546, + 65555, 65561, 65569, 65576, 6277, 4559, 65581, 33803, 65587, 65590, + 65596, 65603, 65608, 65613, 24497, 65617, 65623, 65629, 65634, 65639, + 65643, 65649, 65655, 35055, 953, 37469, 39196, 39202, 33912, 33917, + 65660, 65664, 65668, 65671, 65684, 65690, 65694, 65697, 65702, 35376, + 65706, 32605, 22280, 65712, 6206, 6214, 9322, 65715, 65720, 65725, 65730, + 65735, 65740, 65745, 65750, 65755, 65760, 65766, 65771, 65776, 65782, + 65787, 65792, 65797, 65802, 65807, 65812, 65818, 65823, 65829, 65834, + 65839, 65844, 65849, 65854, 65859, 65864, 65869, 65874, 65879, 65885, + 65890, 65895, 65900, 65905, 65910, 65915, 65921, 65926, 65931, 65936, + 65941, 65946, 65951, 65956, 65961, 65966, 65972, 65977, 65982, 65987, + 65992, 65998, 66004, 66009, 66015, 66020, 66025, 66030, 66035, 66040, + 1496, 223, 66045, 66049, 66053, 66057, 26272, 66061, 66065, 66070, 66074, + 66079, 66083, 66088, 66093, 66098, 66102, 66106, 66111, 66115, 14076, + 66120, 66124, 66131, 66141, 16024, 66150, 66159, 66163, 66168, 66173, + 66177, 66181, 26066, 3054, 66185, 66191, 18309, 66195, 66204, 66212, + 66218, 66230, 66242, 66246, 66251, 66255, 66261, 66267, 66272, 66282, + 66292, 66298, 66303, 66307, 66313, 66318, 66325, 66331, 66336, 66345, + 66354, 66362, 16412, 66366, 66375, 66383, 66395, 66406, 66417, 66426, + 66430, 66439, 66447, 66457, 66465, 66471, 66476, 66482, 66487, 66498, 85, + 32410, 66504, 27482, 27492, 66510, 66517, 66523, 66527, 66537, 66548, + 66556, 66565, 66570, 66575, 66580, 66584, 66588, 18263, 66596, 66600, + 66606, 66616, 66623, 66629, 66635, 36481, 66639, 66641, 66644, 66650, + 66654, 66664, 66670, 66677, 66684, 14013, 66692, 66698, 66707, 66716, + 66722, 66728, 66734, 66739, 66746, 66753, 66759, 66767, 66780, 66789, + 66798, 66803, 66807, 66813, 66819, 66826, 66833, 66840, 66847, 66854, + 66859, 66863, 66867, 66870, 66880, 66884, 66896, 66905, 66909, 66914, + 66918, 66924, 66929, 66936, 66945, 66953, 66961, 66966, 66970, 66975, + 66980, 66990, 66998, 67003, 67007, 67011, 67017, 67025, 67032, 67044, + 67052, 67063, 67069, 67079, 67085, 67089, 67096, 67102, 67107, 67111, + 67115, 67119, 67128, 67137, 67146, 67152, 67158, 67164, 67169, 67176, + 67182, 67190, 67197, 13156, 67203, 67209, 67213, 15009, 67217, 67222, + 67232, 67241, 67247, 67253, 67261, 67268, 67272, 67276, 67282, 67290, + 67297, 67303, 67314, 67318, 67322, 67326, 67329, 67335, 67340, 67345, + 67349, 67353, 67362, 67370, 67377, 67383, 67390, 25152, 41635, 67395, + 67403, 67407, 67411, 67414, 67422, 67429, 67435, 67444, 67452, 67458, + 67463, 67467, 67472, 67476, 67480, 67485, 67494, 67498, 67505, 39305, + 67509, 67515, 67519, 67527, 67533, 67538, 67549, 67557, 67563, 23720, + 67572, 67579, 67586, 67593, 67600, 67607, 44881, 13851, 67614, 67621, + 67626, 36517, 6404, 67632, 67637, 67642, 67648, 67654, 67660, 67665, + 67670, 67675, 67680, 67686, 67691, 67697, 67702, 67708, 67713, 67718, + 67723, 67728, 67733, 67738, 67743, 67749, 67754, 67760, 67765, 67770, + 67775, 67780, 67785, 67790, 67796, 67801, 67806, 67811, 67816, 67821, + 67826, 67831, 67836, 67841, 67846, 67852, 67857, 67862, 67867, 67872, + 67877, 67882, 67887, 67892, 67898, 67903, 67908, 67913, 67918, 67923, + 67928, 67933, 67938, 67943, 67948, 67953, 67958, 67964, 1839, 240, 40067, + 67969, 67972, 67977, 67981, 67984, 3391, 67989, 67994, 66957, 68005, + 68015, 68022, 68031, 68047, 68056, 68066, 68076, 68085, 68093, 68107, + 68115, 68119, 68122, 68129, 68135, 68146, 68158, 68169, 68178, 68185, + 1277, 24386, 68195, 2610, 68199, 68208, 1119, 18236, 21794, 68216, 68224, + 68238, 68251, 68255, 68260, 68265, 68270, 68276, 68282, 68287, 8762, + 68292, 68296, 68304, 11646, 68309, 68315, 68324, 68332, 1721, 11658, 835, + 6340, 68336, 68345, 68355, 2400, 28271, 68364, 68370, 17773, 28286, + 68376, 4104, 12032, 68382, 68389, 63759, 68393, 68397, 68403, 68408, + 68413, 4128, 180, 14917, 68418, 68430, 68434, 68440, 29049, 68444, 12020, + 2750, 4, 68449, 68459, 68470, 68476, 68487, 68494, 68500, 68506, 68514, + 68521, 68527, 68537, 68547, 68557, 68566, 24574, 1289, 68571, 68575, + 68579, 68585, 68589, 2773, 2779, 8759, 2275, 68593, 68597, 68606, 68614, + 68625, 68633, 68641, 68647, 68652, 68663, 68674, 68682, 68688, 10179, + 68693, 68701, 68705, 68709, 68714, 68718, 68730, 29456, 15977, 68737, + 68747, 68753, 68759, 10281, 68769, 68780, 68790, 68799, 68803, 68810, + 1121, 2603, 68820, 68825, 68833, 68841, 68852, 68859, 68873, 14846, 453, + 68883, 68887, 68895, 68904, 68912, 68918, 68932, 68939, 68945, 68954, + 68961, 68971, 68979, 68986, 68994, 69001, 3941, 143, 69009, 69020, 69024, + 69036, 69042, 12202, 167, 69047, 69052, 69056, 69063, 69069, 69077, + 69084, 9065, 69091, 69100, 69108, 4010, 69121, 4027, 69125, 2823, 494, + 69130, 69143, 69148, 1838, 736, 69152, 4031, 69160, 69166, 69170, 813, + 69180, 69189, 69194, 15738, 15745, 48243, 69198, 4056, 3951, 13734, + 69206, 69213, 69218, 24638, 69222, 69229, 69235, 69240, 69245, 15758, + 161, 69250, 69262, 69268, 69276, 2840, 1753, 69284, 69286, 69291, 69296, + 69301, 69307, 69312, 69317, 69322, 69327, 69332, 69337, 69343, 69348, + 69353, 69358, 69363, 69368, 69373, 69378, 69383, 69389, 69394, 69399, + 69404, 69410, 69415, 69421, 69426, 69431, 69436, 69441, 69446, 69451, + 69456, 69462, 69467, 69473, 69478, 69483, 69488, 69493, 69498, 69503, + 69508, 69513, 69519, 69525, 69530, 69535, 69541, 69546, 69550, 69554, + 69559, 69565, 69569, 69575, 69580, 69585, 69591, 69596, 69600, 69605, + 69610, 69614, 69617, 69619, 69623, 69626, 69631, 69635, 69640, 69644, + 69648, 69652, 69661, 69665, 34097, 69668, 34102, 69675, 69680, 34107, + 69689, 69698, 34113, 69703, 34118, 69712, 69717, 12234, 69721, 69726, + 69731, 34123, 69735, 43115, 69739, 69742, 69746, 8430, 69752, 69757, + 69761, 3827, 34128, 69764, 69768, 69771, 69776, 69780, 69786, 69794, + 69807, 69816, 69822, 69827, 69833, 69837, 69843, 69851, 69856, 69860, + 69867, 69873, 69881, 69890, 69898, 34131, 69905, 69915, 69928, 69933, + 69938, 69942, 69951, 69957, 69964, 69975, 69987, 69994, 70003, 70012, + 70021, 70028, 70034, 70041, 70049, 70056, 70064, 70073, 70081, 70088, + 70096, 70105, 70113, 70122, 70132, 70141, 70149, 70156, 70164, 70173, + 70181, 70190, 70200, 70209, 70217, 70226, 70236, 70245, 70255, 70266, + 70276, 70285, 70293, 70300, 70308, 70317, 70325, 70334, 70344, 70353, + 70361, 70370, 70380, 70389, 70399, 70410, 70420, 70429, 70437, 70446, + 70456, 70465, 70475, 70486, 70496, 70505, 70515, 70526, 70536, 70547, + 70559, 70570, 70580, 70589, 70597, 70604, 70612, 70621, 70629, 70638, + 70648, 70657, 70665, 70674, 70684, 70693, 70703, 70714, 70724, 70733, + 70741, 70750, 70760, 70769, 70779, 70790, 70800, 70809, 70819, 70830, + 70840, 70851, 70863, 70874, 70884, 70893, 70901, 70910, 70920, 70929, + 70939, 70950, 70960, 70969, 70979, 70990, 71000, 71011, 71023, 71034, + 71044, 71053, 71063, 71074, 71084, 71095, 71107, 71118, 71128, 71139, + 71151, 71162, 71174, 71187, 71199, 71210, 71220, 71229, 71237, 71244, + 71252, 71261, 71269, 71278, 71288, 71297, 71305, 71314, 71324, 71333, + 71343, 71354, 71364, 71373, 71381, 71390, 71400, 71409, 71419, 71430, + 71440, 71449, 71459, 71470, 71480, 71491, 71503, 71514, 71524, 71533, + 71541, 71550, 71560, 71569, 71579, 71590, 71600, 71609, 71619, 71630, + 71640, 71651, 71663, 71674, 71684, 71693, 71703, 71714, 71724, 71735, + 71747, 71758, 71768, 71779, 71791, 71802, 71814, 71827, 71839, 71850, + 71860, 71869, 71877, 71886, 71896, 71905, 71915, 71926, 71936, 71945, + 71955, 71966, 71976, 71987, 71999, 72010, 72020, 72029, 72039, 72050, + 72060, 72071, 72083, 72094, 72104, 72115, 72127, 72138, 72150, 72163, + 72175, 72186, 72196, 72205, 72215, 72226, 72236, 72247, 72259, 72270, + 72280, 72291, 72303, 72314, 72326, 72339, 72351, 72362, 72372, 72383, + 72395, 72406, 72418, 72431, 72443, 72454, 72466, 72479, 72491, 72504, + 72518, 72531, 72543, 72554, 72564, 72573, 72581, 72588, 72593, 8266, + 72600, 34141, 72605, 72610, 34146, 72616, 21902, 34151, 72621, 72627, + 72635, 72641, 72647, 72654, 72661, 72666, 72670, 72674, 72677, 72681, + 72690, 72699, 72707, 72713, 72725, 72736, 72740, 3116, 8241, 72745, + 72748, 72750, 72754, 72758, 72762, 72768, 72773, 27136, 72778, 72782, + 72785, 72790, 72794, 72801, 72807, 72811, 6360, 72815, 34168, 72820, + 72827, 72836, 72844, 72855, 72863, 72872, 72880, 72887, 72894, 72900, + 72911, 34173, 72916, 72927, 72939, 72947, 72958, 72967, 72978, 72983, + 72991, 2576, 72996, 35941, 73009, 73013, 73025, 73033, 73038, 73046, + 18437, 73057, 73063, 73070, 73078, 73084, 34183, 73089, 4050, 61233, + 73096, 73099, 73107, 73120, 73133, 73146, 73159, 73166, 73177, 73186, + 44698, 44703, 73191, 73195, 73203, 73210, 73219, 73227, 73233, 73242, + 73250, 73258, 73262, 73271, 73280, 73290, 73303, 73316, 73326, 34188, + 73332, 73339, 73345, 73351, 34194, 73356, 73359, 73363, 73371, 73380, + 44436, 73388, 73397, 73405, 73412, 73420, 73430, 73439, 73448, 73457, + 73465, 73476, 73491, 73501, 9656, 22572, 73510, 73515, 73520, 73524, + 73529, 73533, 73538, 73544, 73549, 73554, 73560, 73565, 73570, 22537, + 73575, 73582, 73590, 73598, 73606, 73611, 73618, 73625, 73630, 2253, + 73634, 73638, 73646, 73654, 34211, 73660, 73666, 73678, 73684, 73691, + 73695, 73702, 73707, 73714, 73720, 73727, 73738, 73748, 73758, 73770, + 73776, 73784, 73794, 73804, 34238, 73813, 73822, 73828, 73840, 73851, + 73858, 73863, 73867, 73875, 73881, 73886, 73891, 73898, 73906, 73918, + 73928, 73937, 73946, 73953, 35794, 24953, 73959, 73964, 73968, 73972, + 73977, 73985, 73991, 74002, 74015, 74020, 74027, 34243, 74032, 74044, + 74053, 74061, 74071, 74082, 74095, 74102, 74111, 74120, 74128, 74133, + 74139, 1485, 74144, 74149, 74154, 74159, 74165, 74170, 74175, 74181, + 74187, 74192, 74196, 74201, 74206, 74211, 61769, 74216, 74221, 74226, + 74231, 74237, 74243, 74248, 74252, 74257, 74262, 74267, 74273, 74278, + 74284, 74289, 74294, 74299, 74304, 74308, 74314, 74319, 74328, 74333, + 74338, 74343, 74348, 74352, 74359, 74365, 4316, 18083, 3081, 74370, + 74374, 74379, 74383, 74387, 74391, 48498, 74395, 74320, 74397, 74407, + 34252, 74410, 74415, 74424, 74430, 6329, 34257, 74434, 74440, 74445, + 74451, 74456, 74460, 74467, 74472, 74482, 74491, 74495, 74501, 74507, + 74513, 74517, 74525, 74532, 74540, 74548, 34262, 74555, 74558, 74565, + 74571, 74576, 74580, 74586, 74593, 74598, 74602, 74611, 74619, 74625, + 74630, 34267, 74637, 74644, 74650, 74655, 74661, 74668, 74674, 22293, + 28736, 74680, 74685, 74691, 74695, 74707, 74353, 74360, 22469, 74717, + 74722, 74729, 74735, 74742, 74748, 74759, 74764, 74772, 9361, 74777, + 74780, 74786, 74790, 74794, 74797, 74803, 34010, 4317, 1059, 14130, + 74810, 74816, 74822, 74828, 74834, 74840, 74846, 74852, 74858, 74863, + 74868, 74873, 74878, 74883, 74888, 74893, 74898, 74903, 74908, 74913, + 74918, 74923, 74929, 74934, 74939, 74945, 74950, 74955, 74961, 74967, + 74973, 74979, 74985, 74991, 74997, 75003, 75009, 75014, 75019, 75025, + 75030, 75035, 75041, 75046, 75051, 75056, 75061, 75066, 75071, 75076, + 75081, 75086, 75091, 75096, 75101, 75107, 75112, 75117, 75122, 75128, + 75133, 75138, 75143, 75148, 75154, 75159, 75164, 75169, 75174, 75179, + 75184, 75189, 75194, 75199, 75204, 75209, 75214, 75219, 75224, 75229, + 75234, 75239, 75244, 75249, 75255, 75260, 75265, 75270, 75275, 75280, + 75285, 75290, 1871, 147, 75295, 75299, 75303, 75308, 75316, 75320, 75327, + 75335, 75339, 75352, 75360, 75365, 75370, 27545, 75374, 75379, 75383, + 75388, 75392, 75400, 75404, 21910, 75409, 75413, 64050, 75417, 75420, + 75428, 75436, 75444, 75449, 75454, 75461, 75467, 75473, 75478, 75485, + 75490, 75498, 68243, 75505, 75510, 75515, 75519, 12301, 75523, 75528, + 75533, 75537, 75540, 75546, 75550, 75560, 75569, 75573, 75576, 75580, + 75587, 75600, 75606, 75614, 75623, 75634, 75645, 75656, 75667, 75676, + 75682, 75691, 75699, 75709, 75722, 75729, 75740, 75746, 75751, 75756, + 75762, 75768, 75778, 75787, 74034, 75795, 75801, 75809, 75815, 75822, + 75830, 75833, 75837, 75841, 75844, 75850, 75856, 75864, 75876, 75888, + 75895, 75900, 75904, 75915, 75923, 75930, 75942, 75950, 75958, 75965, + 75971, 75981, 75990, 75995, 76005, 76014, 43728, 76021, 76025, 76030, + 76038, 76045, 76051, 76055, 76065, 76076, 76084, 76091, 76103, 76115, + 76124, 72999, 76131, 76141, 76152, 76166, 76174, 76184, 76191, 76199, + 76212, 76224, 76233, 76241, 76251, 76262, 76274, 76283, 76293, 76300, + 76309, 76324, 76332, 76342, 76351, 76359, 76372, 61203, 76387, 76397, + 76406, 76418, 76428, 76440, 76451, 76462, 76473, 76483, 76494, 76502, + 76508, 76518, 76526, 76532, 30400, 76537, 76543, 76548, 76555, 10193, + 18457, 76561, 76570, 76575, 76579, 76586, 76592, 76597, 76602, 76610, + 76618, 76622, 76625, 76628, 76630, 76637, 76643, 76654, 76659, 76663, + 76670, 76676, 76681, 76689, 68782, 68792, 76695, 76702, 76712, 11166, + 76719, 76724, 30611, 76733, 76738, 76745, 76755, 76763, 76771, 76780, + 76786, 76792, 76799, 76806, 76811, 76815, 76823, 76828, 76833, 76842, + 76850, 76857, 76862, 76866, 76875, 76881, 76884, 76888, 76897, 76907, + 75347, 76916, 76924, 76928, 76934, 76945, 76955, 18466, 76966, 76974, + 76982, 18478, 76989, 76993, 77002, 77009, 77012, 28614, 77015, 77019, + 77024, 77041, 77053, 11124, 77065, 77070, 77075, 77080, 21983, 77084, + 77089, 77094, 77100, 77105, 6008, 77110, 21987, 77115, 77120, 77126, + 77133, 77138, 77143, 77149, 77155, 77161, 77166, 77172, 77176, 77190, + 77198, 77206, 77212, 77217, 77224, 77234, 77243, 77248, 77253, 77258, + 77266, 77271, 77277, 77282, 77291, 62848, 77296, 77299, 77317, 77336, + 77349, 77363, 77379, 77386, 77393, 77402, 77409, 77415, 77422, 77427, + 77433, 77439, 77447, 77453, 77458, 77463, 77479, 11137, 77493, 77500, + 77508, 77514, 77518, 77521, 77526, 77531, 77538, 77543, 77552, 77557, + 77563, 77569, 77578, 77587, 77592, 77596, 77604, 77613, 12330, 77622, + 77630, 77636, 77641, 77648, 77654, 12341, 77659, 77662, 77667, 34294, + 77677, 77686, 77691, 77697, 77702, 77710, 77717, 77728, 77738, 77743, + 77751, 68171, 77756, 77762, 77767, 77774, 77783, 77791, 77797, 77803, + 77810, 77816, 77820, 17879, 3090, 77825, 77829, 77833, 77839, 77848, + 77854, 77861, 77865, 77886, 77908, 77924, 77941, 77960, 77969, 77979, + 77987, 77994, 78001, 78007, 28486, 78021, 78025, 78031, 78039, 78051, + 78057, 78065, 78070, 78075, 78079, 78087, 78094, 78098, 78104, 78110, + 78115, 3674, 44898, 78121, 78125, 78129, 78133, 78138, 78143, 78148, + 78154, 78160, 78166, 78173, 78179, 78186, 78192, 78198, 78203, 78209, + 78214, 78218, 78223, 78227, 78232, 44913, 78236, 78241, 78249, 78253, + 78258, 78265, 78274, 78280, 78289, 78293, 78300, 78304, 78307, 78314, + 78320, 78329, 78339, 78344, 78348, 78356, 78365, 78369, 78377, 78383, + 78388, 78393, 78399, 78405, 78410, 78414, 78420, 78425, 78429, 78432, + 78437, 78445, 78455, 78461, 78466, 78476, 42231, 78484, 78496, 78500, + 78506, 78518, 78529, 78536, 78542, 78549, 78556, 78568, 78575, 78581, + 22061, 78585, 78593, 78599, 78606, 78612, 78618, 78624, 78629, 78634, + 78639, 78648, 78656, 78667, 7225, 78672, 17328, 78678, 78682, 78686, + 78690, 78698, 78707, 78711, 78718, 78727, 78735, 78748, 78754, 78228, + 31495, 78759, 78761, 78766, 78771, 78776, 78781, 78786, 78791, 78796, + 78801, 78806, 78811, 78816, 78821, 78826, 78831, 78837, 78842, 78847, + 78852, 78857, 78862, 78867, 78872, 78877, 78883, 78889, 78895, 78900, + 78905, 78917, 78922, 1877, 44, 78927, 78932, 34300, 78936, 34305, 34310, + 34316, 34321, 78940, 34326, 23088, 78962, 78966, 78970, 78975, 78979, + 34330, 78983, 78991, 78998, 34335, 79004, 79007, 79012, 79016, 79025, + 10018, 79033, 34340, 22950, 79036, 79040, 1411, 79045, 34351, 79048, + 79053, 26921, 26931, 36957, 79058, 79063, 79068, 79073, 79079, 79084, + 79093, 79098, 79107, 79115, 79122, 79128, 79133, 79138, 79143, 79153, + 79162, 79170, 79175, 79183, 79187, 79195, 79199, 79206, 79214, 34159, + 39922, 79221, 79227, 79232, 79237, 12703, 29671, 79242, 79247, 79254, + 79260, 79265, 79273, 79283, 79293, 79299, 79304, 79310, 18488, 79317, + 37832, 79330, 79335, 79341, 32482, 79354, 79360, 79364, 79373, 79380, + 79386, 79394, 79403, 79410, 79416, 79419, 79423, 79427, 27062, 79431, + 79438, 79444, 79452, 79457, 25100, 79463, 79466, 79474, 79481, 79489, + 79502, 79516, 79523, 79529, 79536, 79542, 34365, 79546, 79553, 79561, + 79569, 79575, 34370, 79583, 79589, 79594, 79604, 79610, 79619, 32288, + 36388, 79627, 79632, 79637, 79641, 79646, 79650, 79658, 15730, 42244, + 79663, 79668, 34375, 65407, 79672, 79677, 79681, 79688, 79697, 79705, + 79711, 79716, 79722, 79729, 79735, 79740, 79745, 79756, 79765, 79777, + 79792, 34642, 79798, 17447, 34379, 79802, 79809, 25216, 79815, 79822, + 79831, 79838, 79847, 79853, 79858, 79866, 79872, 34389, 79877, 79886, + 78524, 79895, 79902, 79908, 79914, 79923, 79933, 79941, 79948, 79952, + 34394, 79955, 34400, 34406, 79960, 79968, 79976, 79986, 79995, 80003, + 80010, 80020, 34411, 80024, 80026, 80030, 80035, 80039, 80043, 80049, + 80054, 80058, 80069, 80074, 80079, 3095, 80083, 80090, 80094, 80103, + 80111, 80118, 80123, 80128, 65458, 80132, 80135, 80141, 80149, 80155, + 80159, 80164, 80171, 80176, 80180, 80186, 36419, 80191, 80194, 80199, + 80203, 80208, 80215, 80220, 80224, 40816, 80232, 26940, 26949, 80238, + 80244, 80250, 80255, 80259, 80262, 80272, 80281, 80286, 80292, 80299, + 80305, 80309, 80317, 80322, 36425, 75542, 80326, 80334, 80340, 80347, + 80352, 80356, 80361, 61419, 80367, 36431, 80372, 80377, 80381, 80386, + 80391, 80396, 80400, 80405, 80410, 80416, 80421, 80426, 80432, 80438, + 80443, 80447, 80452, 80457, 80462, 80466, 25215, 80471, 80476, 80482, + 80488, 80494, 80499, 80503, 80508, 80513, 80518, 80522, 80527, 80532, + 80537, 80542, 45168, 80546, 34419, 80554, 80558, 80566, 80574, 80585, + 80590, 80594, 23428, 80599, 80605, 80610, 80620, 80627, 80632, 80640, + 80649, 80654, 80658, 80663, 80671, 80679, 80686, 68424, 80692, 80700, + 80707, 80718, 80724, 80730, 34429, 80733, 80740, 80748, 80753, 42447, + 80757, 80762, 80769, 80774, 9239, 80778, 80786, 80793, 80800, 80809, + 80816, 80822, 80836, 10473, 80844, 80850, 80854, 80857, 80865, 80872, + 80877, 80890, 80897, 80901, 80906, 80913, 80918, 63934, 80923, 80926, + 80933, 80939, 80943, 80951, 80960, 80970, 80980, 80989, 81000, 81008, + 81019, 81024, 81028, 81033, 81037, 37088, 81045, 22356, 37097, 81050, + 81055, 81060, 81065, 81070, 81075, 81080, 81084, 81089, 81094, 81099, + 81104, 81109, 81114, 81118, 81123, 81128, 81132, 81136, 81140, 81144, + 81149, 81154, 81158, 81163, 81167, 81171, 81176, 81181, 81186, 81191, + 81195, 81200, 81205, 81209, 81214, 81219, 81224, 81229, 81234, 81239, + 81244, 81249, 81254, 81259, 81264, 81269, 81274, 81279, 81284, 81289, + 81294, 81299, 81304, 81309, 81313, 81318, 81323, 81328, 81333, 81338, + 81343, 81348, 81353, 81358, 81363, 81368, 81372, 81377, 81381, 81386, + 81391, 81396, 81401, 81406, 81411, 81416, 81421, 81426, 81430, 81434, + 81439, 81444, 81448, 81453, 81458, 81462, 81467, 81472, 81477, 81482, + 81486, 81491, 81496, 81500, 81505, 81509, 81513, 81517, 81521, 81526, + 81530, 81534, 81538, 81542, 81546, 81550, 81554, 81558, 81562, 81567, + 81572, 81577, 81582, 81587, 81592, 81597, 81602, 81607, 81612, 81616, + 81620, 81624, 81628, 81632, 81636, 81641, 81645, 81650, 81654, 81659, + 81664, 81668, 81672, 81677, 81681, 81685, 81689, 81693, 81697, 81701, + 81705, 81709, 81713, 81717, 81721, 81725, 81729, 81733, 81738, 81743, + 81747, 81751, 81755, 81759, 81763, 81767, 81772, 81776, 81780, 81784, + 81788, 81792, 81796, 81801, 81805, 81810, 81814, 81818, 81822, 81826, + 81830, 81834, 81838, 81842, 81846, 81850, 81854, 81859, 81863, 81867, + 81871, 81875, 81879, 81883, 81887, 81891, 81895, 81899, 81903, 81908, + 81912, 81916, 81921, 81926, 81930, 81934, 81938, 81942, 81946, 81950, + 81954, 81958, 81963, 81967, 81972, 81976, 81981, 81985, 81990, 81994, + 82000, 82005, 82009, 82014, 82018, 82023, 82027, 82032, 82036, 82041, + 1504, 82045, 2854, 1759, 1677, 82049, 82053, 2863, 82057, 1380, 82062, + 1322, 82066, 2875, 82070, 82077, 82084, 82098, 2879, 7327, 82107, 82115, + 82122, 82133, 82142, 82149, 82161, 82174, 82187, 82198, 82203, 82210, + 82222, 82226, 2883, 12408, 82236, 82241, 82250, 82260, 82265, 2887, + 82273, 82277, 82282, 82289, 82295, 82303, 82315, 1327, 13735, 82325, + 82329, 82335, 82349, 82361, 82373, 82383, 82392, 82401, 82410, 82418, + 82429, 82437, 4203, 82447, 82458, 82467, 82473, 82488, 82495, 82501, + 82506, 37227, 82511, 2911, 13739, 82515, 82522, 9177, 82531, 2916, 33887, + 82537, 63675, 82544, 82550, 82561, 82567, 82574, 82580, 82588, 82595, + 82601, 82611, 82620, 82631, 82640, 82647, 82653, 82663, 82671, 82677, + 82692, 82698, 82703, 82710, 82713, 82719, 82726, 82732, 82740, 82749, + 82757, 82763, 82772, 44438, 82786, 82791, 82797, 15536, 82802, 82815, + 82827, 82836, 82844, 82851, 82855, 82859, 82862, 82869, 82876, 82884, + 82892, 82901, 82909, 15463, 82917, 82922, 82926, 82938, 82945, 82954, + 781, 82964, 82973, 82984, 2932, 82988, 82992, 82998, 83011, 83023, 83033, + 83042, 83054, 27597, 83065, 83073, 83082, 83093, 83104, 83114, 83124, + 83133, 83141, 11944, 83148, 83152, 83155, 83160, 83165, 83169, 83175, + 1332, 83182, 83186, 12490, 83190, 83201, 83210, 83218, 83227, 83235, + 83251, 83262, 83271, 83279, 83291, 83302, 83318, 83328, 83349, 83363, + 83376, 83384, 83391, 7373, 83404, 83409, 83415, 6078, 83421, 83424, + 83431, 83441, 8395, 83448, 83453, 83458, 83463, 83471, 83480, 83488, + 10241, 10250, 83493, 83504, 83509, 83515, 2948, 1160, 83521, 11449, + 83527, 83534, 83541, 83554, 2262, 68, 83559, 83564, 83574, 83583, 83589, + 83598, 83606, 83616, 83620, 83625, 83629, 83641, 2976, 83649, 83657, + 83662, 83673, 83684, 83693, 22397, 83698, 83704, 83709, 83719, 83729, + 83734, 83740, 83744, 83749, 83758, 22409, 83762, 4280, 24, 83767, 83776, + 83783, 83790, 83796, 83802, 954, 83807, 83812, 64016, 83817, 83822, + 83828, 83834, 83842, 83847, 83855, 83862, 83868, 83873, 40700, 44332, + 83879, 2980, 32, 83889, 83902, 83907, 83915, 83920, 83926, 3002, 29639, + 83931, 83939, 83946, 83951, 83960, 61661, 65078, 83968, 83972, 1704, + 1818, 83977, 83982, 83989, 1822, 254, 83996, 84002, 3024, 84007, 84012, + 84019, 1826, 84024, 84030, 84035, 84047, 6305, 84057, 1833, 84063, 84068, + 84075, 84082, 84097, 84104, 84115, 84120, 84128, 2638, 84132, 84144, + 84149, 84153, 84159, 29455, 2267, 84163, 84174, 84178, 84182, 84188, + 84192, 84201, 84205, 84216, 84220, 2313, 33704, 84224, 84234, 3115, + 84242, 9661, 84251, 84256, 84260, 84269, 84276, 84282, 3085, 18093, + 84286, 84299, 84317, 84322, 84330, 84338, 84348, 10480, 13852, 84360, + 84373, 84380, 84394, 84401, 84417, 84424, 84430, 22441, 13100, 84437, + 84444, 84454, 84463, 45167, 84475, 45302, 84483, 84486, 84492, 84498, + 84504, 84510, 84516, 84523, 84530, 84536, 84542, 84548, 84554, 84560, + 84566, 84572, 84578, 84584, 84590, 84596, 84602, 84608, 84614, 84620, + 84626, 84632, 84638, 84644, 84650, 84656, 84662, 84668, 84674, 84680, + 84686, 84692, 84698, 84704, 84710, 84716, 84722, 84728, 84734, 84740, + 84746, 84752, 84758, 84764, 84770, 84776, 84782, 84788, 84794, 84800, + 84806, 84812, 84818, 84824, 84830, 84836, 84843, 84849, 84856, 84863, + 84869, 84876, 84883, 84889, 84895, 84901, 84907, 84913, 84919, 84925, + 84931, 84937, 84943, 84949, 84955, 84961, 84967, 84973, 3099, 9634, + 84979, 84985, 84993, 84997, 82285, 3103, 85001, 22174, 12733, 3885, + 85005, 3109, 85009, 85019, 85025, 85031, 85037, 85043, 85049, 85055, + 85061, 85067, 85073, 85079, 85085, 85091, 85097, 85103, 85109, 85115, + 85121, 85127, 85133, 85139, 85145, 85151, 85157, 85163, 85169, 85176, + 85183, 85189, 85195, 85201, 85207, 85213, 85219, 1337, 85225, 85230, + 85235, 85240, 85245, 85250, 85255, 85260, 85265, 85269, 85273, 85277, + 85281, 85285, 85289, 85293, 85297, 85301, 85307, 85313, 85319, 85325, + 85329, 85333, 85337, 85341, 85345, 85349, 85353, 85357, 85361, 85366, + 85371, 85376, 85381, 85386, 85391, 85396, 85401, 85406, 85411, 85416, + 85421, 85426, 85431, 85436, 85441, 85446, 85451, 85456, 85461, 85466, + 85471, 85476, 85481, 85486, 85491, 85496, 85501, 85506, 85511, 85516, + 85521, 85526, 85531, 85536, 85541, 85546, 85551, 85556, 85561, 85566, + 85571, 85576, 85581, 85586, 85591, 85596, 85601, 85606, 85611, 85616, + 85621, 85626, 85631, 85636, 85641, 85646, 85651, 85656, 85661, 85666, + 85671, 85676, 85681, 85686, 85691, 85696, 85701, 85706, 85711, 85716, + 85721, 85726, 85731, 85736, 85741, 85746, 85751, 85756, 85761, 85766, + 85771, 85776, 85781, 85786, 85791, 85796, 85801, 85806, 85811, 85816, + 85821, 85826, 85831, 85836, 85841, 85846, 85851, 85856, 85861, 85866, + 85871, 85876, 85881, 85886, 85891, 85896, 85901, 85906, 85911, 85916, + 85921, 85926, 85931, 85936, 85941, 85946, 85951, 85956, 85961, 85966, + 85971, 85976, 85981, 85986, 85991, 85996, 86001, 86006, 86011, 86016, + 86021, 86030, 86039, 86048, 86057, 86066, 86075, 86084, 86093, 86102, + 86111, 86120, 86129, 86138, 86147, 86156, 86165, 86174, 86183, 86192, + 86197, 86202, 86207, 86212, 86217, 86222, 86227, 86232, 86237, 86242, + 86247, 86252, 86257, 86262, 86267, 86272, 86277, 86282, 86287, 86292, + 86297, 86302, 86307, 86312, 86317, 86322, 86327, 86332, 86337, 86342, + 86347, 86352, 86357, 86362, 86367, 86372, 86377, 86382, 86387, 86392, + 86397, 86402, 86407, 86412, 86417, 86422, 86427, 86432, 86437, 86442, + 86447, 86452, 86457, 86462, 86467, 86472, 86477, 86482, 86488, 86494, + 86500, 86505, 86510, 86515, 86521, 86527, 86533, 86538, 86543, 86548, + 86553, 86558, 86563, 86568, 16922, 12755, 86573, 86579, 86585, 86594, + 86599, 86604, 86609, 86614, 86619, 86624, 86629, 86634, 86639, 86644, + 86649, 86654, 86659, 86664, 86669, 86674, 86679, 86684, 86689, 86694, + 86699, 86704, 86709, 86714, 86719, 86725, 86730, 86735, 86741, 86746, + 86752, 86757, 86762, 86768, 86773, 86778, 86783, 86788, 86793, 86798, + 86803, 86808, 85020, 85026, 85032, 85038, 86814, 85044, 85050, 85056, + 85062, 85068, 85074, 85080, 85086, 85092, 85098, 85104, 86820, 85110, + 85116, 85122, 86826, 85128, 85134, 85140, 85146, 85152, 85158, 85164, + 85184, 86832, 86838, 85190, 86844, 85196, 85202, 85208, 85214, 85220, + 3126, 3131, 86850, 86855, 86858, 86864, 86870, 86877, 86882, 86887, 2318, }; /* code->name phrasebook */ -#define phrasebook_shift 7 -#define phrasebook_short 209 +#define phrasebook_shift 8 +#define phrasebook_short 204 static unsigned char phrasebook[] = { - 0, 219, 20, 245, 39, 79, 224, 1, 79, 54, 50, 247, 140, 50, 225, 185, 50, - 254, 134, 254, 65, 43, 226, 7, 44, 226, 7, 253, 224, 96, 50, 249, 227, - 240, 174, 243, 236, 218, 131, 219, 48, 21, 210, 86, 21, 111, 21, 105, 21, - 158, 21, 161, 21, 190, 21, 195, 21, 199, 21, 196, 21, 201, 249, 234, 220, - 152, 233, 21, 50, 245, 106, 50, 242, 137, 50, 224, 16, 79, 249, 225, 253, - 214, 7, 6, 1, 61, 7, 6, 1, 253, 166, 7, 6, 1, 251, 74, 7, 6, 1, 249, 68, - 7, 6, 1, 76, 7, 6, 1, 245, 14, 7, 6, 1, 243, 209, 7, 6, 1, 242, 67, 7, 6, - 1, 74, 7, 6, 1, 235, 150, 7, 6, 1, 235, 29, 7, 6, 1, 156, 7, 6, 1, 194, - 7, 6, 1, 230, 30, 7, 6, 1, 78, 7, 6, 1, 226, 109, 7, 6, 1, 224, 99, 7, 6, - 1, 153, 7, 6, 1, 222, 93, 7, 6, 1, 217, 153, 7, 6, 1, 69, 7, 6, 1, 214, - 105, 7, 6, 1, 212, 98, 7, 6, 1, 211, 178, 7, 6, 1, 211, 117, 7, 6, 1, - 210, 159, 43, 42, 127, 223, 53, 219, 48, 44, 42, 127, 250, 39, 255, 23, - 121, 232, 219, 242, 144, 255, 23, 7, 4, 1, 61, 7, 4, 1, 253, 166, 7, 4, - 1, 251, 74, 7, 4, 1, 249, 68, 7, 4, 1, 76, 7, 4, 1, 245, 14, 7, 4, 1, - 243, 209, 7, 4, 1, 242, 67, 7, 4, 1, 74, 7, 4, 1, 235, 150, 7, 4, 1, 235, - 29, 7, 4, 1, 156, 7, 4, 1, 194, 7, 4, 1, 230, 30, 7, 4, 1, 78, 7, 4, 1, - 226, 109, 7, 4, 1, 224, 99, 7, 4, 1, 153, 7, 4, 1, 222, 93, 7, 4, 1, 217, - 153, 7, 4, 1, 69, 7, 4, 1, 214, 105, 7, 4, 1, 212, 98, 7, 4, 1, 211, 178, - 7, 4, 1, 211, 117, 7, 4, 1, 210, 159, 43, 249, 107, 127, 67, 232, 219, - 44, 249, 107, 127, 184, 228, 78, 219, 20, 235, 200, 245, 39, 79, 250, - 184, 50, 224, 231, 50, 249, 106, 50, 211, 40, 50, 251, 143, 130, 221, - 175, 50, 248, 9, 249, 171, 50, 244, 144, 226, 158, 235, 245, 233, 48, 52, - 254, 118, 224, 1, 79, 228, 57, 50, 219, 54, 240, 175, 223, 105, 50, 231, - 237, 248, 79, 50, 225, 24, 50, 218, 24, 105, 218, 24, 158, 255, 12, 255, - 23, 230, 233, 50, 225, 71, 50, 230, 229, 247, 128, 250, 191, 218, 24, - 111, 231, 153, 226, 158, 235, 245, 222, 250, 52, 254, 118, 224, 1, 79, - 212, 114, 244, 10, 123, 224, 24, 212, 114, 244, 10, 123, 242, 34, 212, - 114, 244, 10, 134, 224, 22, 235, 200, 224, 16, 79, 7, 6, 1, 116, 2, 242, - 143, 7, 6, 1, 116, 2, 142, 7, 6, 1, 116, 2, 250, 38, 7, 6, 1, 116, 2, - 184, 7, 6, 1, 116, 2, 248, 9, 7, 6, 1, 116, 2, 222, 237, 48, 7, 6, 1, - 254, 252, 7, 6, 1, 251, 75, 2, 250, 191, 7, 6, 1, 160, 2, 242, 143, 7, 6, - 1, 160, 2, 142, 7, 6, 1, 160, 2, 250, 38, 7, 6, 1, 160, 2, 248, 9, 7, 6, - 1, 240, 161, 2, 242, 143, 7, 6, 1, 240, 161, 2, 142, 7, 6, 1, 240, 161, - 2, 250, 38, 7, 6, 1, 240, 161, 2, 248, 9, 7, 6, 1, 245, 67, 7, 6, 1, 230, - 31, 2, 184, 7, 6, 1, 144, 2, 242, 143, 7, 6, 1, 144, 2, 142, 7, 6, 1, - 144, 2, 250, 38, 7, 6, 1, 144, 2, 184, 7, 6, 1, 144, 2, 248, 9, 230, 89, - 50, 7, 6, 1, 144, 2, 91, 7, 6, 1, 104, 2, 242, 143, 7, 6, 1, 104, 2, 142, - 7, 6, 1, 104, 2, 250, 38, 7, 6, 1, 104, 2, 248, 9, 7, 6, 1, 211, 118, 2, - 142, 7, 6, 1, 216, 152, 7, 4, 1, 220, 78, 222, 93, 7, 4, 1, 116, 2, 242, - 143, 7, 4, 1, 116, 2, 142, 7, 4, 1, 116, 2, 250, 38, 7, 4, 1, 116, 2, - 184, 7, 4, 1, 116, 2, 248, 9, 7, 4, 1, 116, 2, 222, 237, 48, 7, 4, 1, - 254, 252, 7, 4, 1, 251, 75, 2, 250, 191, 7, 4, 1, 160, 2, 242, 143, 7, 4, - 1, 160, 2, 142, 7, 4, 1, 160, 2, 250, 38, 7, 4, 1, 160, 2, 248, 9, 7, 4, - 1, 240, 161, 2, 242, 143, 7, 4, 1, 240, 161, 2, 142, 7, 4, 1, 240, 161, - 2, 250, 38, 7, 4, 1, 240, 161, 2, 248, 9, 7, 4, 1, 245, 67, 7, 4, 1, 230, - 31, 2, 184, 7, 4, 1, 144, 2, 242, 143, 7, 4, 1, 144, 2, 142, 7, 4, 1, - 144, 2, 250, 38, 7, 4, 1, 144, 2, 184, 7, 4, 1, 144, 2, 248, 9, 247, 177, - 50, 7, 4, 1, 144, 2, 91, 7, 4, 1, 104, 2, 242, 143, 7, 4, 1, 104, 2, 142, - 7, 4, 1, 104, 2, 250, 38, 7, 4, 1, 104, 2, 248, 9, 7, 4, 1, 211, 118, 2, - 142, 7, 4, 1, 216, 152, 7, 4, 1, 211, 118, 2, 248, 9, 7, 6, 1, 116, 2, - 231, 237, 7, 4, 1, 116, 2, 231, 237, 7, 6, 1, 116, 2, 251, 154, 7, 4, 1, - 116, 2, 251, 154, 7, 6, 1, 116, 2, 226, 228, 7, 4, 1, 116, 2, 226, 228, - 7, 6, 1, 251, 75, 2, 142, 7, 4, 1, 251, 75, 2, 142, 7, 6, 1, 251, 75, 2, - 250, 38, 7, 4, 1, 251, 75, 2, 250, 38, 7, 6, 1, 251, 75, 2, 59, 48, 7, 4, - 1, 251, 75, 2, 59, 48, 7, 6, 1, 251, 75, 2, 250, 242, 7, 4, 1, 251, 75, - 2, 250, 242, 7, 6, 1, 249, 69, 2, 250, 242, 7, 4, 1, 249, 69, 2, 250, - 242, 7, 6, 1, 249, 69, 2, 91, 7, 4, 1, 249, 69, 2, 91, 7, 6, 1, 160, 2, - 231, 237, 7, 4, 1, 160, 2, 231, 237, 7, 6, 1, 160, 2, 251, 154, 7, 4, 1, - 160, 2, 251, 154, 7, 6, 1, 160, 2, 59, 48, 7, 4, 1, 160, 2, 59, 48, 7, 6, - 1, 160, 2, 226, 228, 7, 4, 1, 160, 2, 226, 228, 7, 6, 1, 160, 2, 250, - 242, 7, 4, 1, 160, 2, 250, 242, 7, 6, 1, 243, 210, 2, 250, 38, 7, 4, 1, - 243, 210, 2, 250, 38, 7, 6, 1, 243, 210, 2, 251, 154, 7, 4, 1, 243, 210, - 2, 251, 154, 7, 6, 1, 243, 210, 2, 59, 48, 7, 4, 1, 243, 210, 2, 59, 48, - 7, 6, 1, 243, 210, 2, 250, 191, 7, 4, 1, 243, 210, 2, 250, 191, 7, 6, 1, - 242, 68, 2, 250, 38, 7, 4, 1, 242, 68, 2, 250, 38, 7, 6, 1, 242, 68, 2, - 91, 7, 4, 1, 242, 68, 2, 91, 7, 6, 1, 240, 161, 2, 184, 7, 4, 1, 240, - 161, 2, 184, 7, 6, 1, 240, 161, 2, 231, 237, 7, 4, 1, 240, 161, 2, 231, - 237, 7, 6, 1, 240, 161, 2, 251, 154, 7, 4, 1, 240, 161, 2, 251, 154, 7, - 6, 1, 240, 161, 2, 226, 228, 7, 4, 1, 240, 161, 2, 226, 228, 7, 6, 1, - 240, 161, 2, 59, 48, 7, 4, 1, 247, 127, 74, 7, 6, 27, 236, 38, 7, 4, 27, - 236, 38, 7, 6, 1, 235, 151, 2, 250, 38, 7, 4, 1, 235, 151, 2, 250, 38, 7, - 6, 1, 235, 30, 2, 250, 191, 7, 4, 1, 235, 30, 2, 250, 191, 7, 4, 1, 233, - 245, 7, 6, 1, 233, 155, 2, 142, 7, 4, 1, 233, 155, 2, 142, 7, 6, 1, 233, - 155, 2, 250, 191, 7, 4, 1, 233, 155, 2, 250, 191, 7, 6, 1, 233, 155, 2, - 250, 242, 7, 4, 1, 233, 155, 2, 250, 242, 7, 6, 1, 233, 155, 2, 230, 229, - 247, 128, 7, 4, 1, 233, 155, 2, 230, 229, 247, 128, 7, 6, 1, 233, 155, 2, - 91, 7, 4, 1, 233, 155, 2, 91, 7, 6, 1, 230, 31, 2, 142, 7, 4, 1, 230, 31, - 2, 142, 7, 6, 1, 230, 31, 2, 250, 191, 7, 4, 1, 230, 31, 2, 250, 191, 7, - 6, 1, 230, 31, 2, 250, 242, 7, 4, 1, 230, 31, 2, 250, 242, 7, 4, 1, 230, - 31, 224, 207, 251, 86, 254, 65, 7, 6, 1, 245, 146, 7, 4, 1, 245, 146, 7, - 6, 1, 144, 2, 231, 237, 7, 4, 1, 144, 2, 231, 237, 7, 6, 1, 144, 2, 251, - 154, 7, 4, 1, 144, 2, 251, 154, 7, 6, 1, 144, 2, 52, 142, 7, 4, 1, 144, - 2, 52, 142, 7, 6, 27, 226, 238, 7, 4, 27, 226, 238, 7, 6, 1, 223, 227, 2, - 142, 7, 4, 1, 223, 227, 2, 142, 7, 6, 1, 223, 227, 2, 250, 191, 7, 4, 1, - 223, 227, 2, 250, 191, 7, 6, 1, 223, 227, 2, 250, 242, 7, 4, 1, 223, 227, - 2, 250, 242, 7, 6, 1, 222, 94, 2, 142, 7, 4, 1, 222, 94, 2, 142, 7, 6, 1, - 222, 94, 2, 250, 38, 7, 4, 1, 222, 94, 2, 250, 38, 7, 6, 1, 222, 94, 2, - 250, 191, 7, 4, 1, 222, 94, 2, 250, 191, 7, 6, 1, 222, 94, 2, 250, 242, - 7, 4, 1, 222, 94, 2, 250, 242, 7, 6, 1, 217, 154, 2, 250, 191, 7, 4, 1, - 217, 154, 2, 250, 191, 7, 6, 1, 217, 154, 2, 250, 242, 7, 4, 1, 217, 154, - 2, 250, 242, 7, 6, 1, 217, 154, 2, 91, 7, 4, 1, 217, 154, 2, 91, 7, 6, 1, - 104, 2, 184, 7, 4, 1, 104, 2, 184, 7, 6, 1, 104, 2, 231, 237, 7, 4, 1, - 104, 2, 231, 237, 7, 6, 1, 104, 2, 251, 154, 7, 4, 1, 104, 2, 251, 154, - 7, 6, 1, 104, 2, 222, 237, 48, 7, 4, 1, 104, 2, 222, 237, 48, 7, 6, 1, - 104, 2, 52, 142, 7, 4, 1, 104, 2, 52, 142, 7, 6, 1, 104, 2, 226, 228, 7, - 4, 1, 104, 2, 226, 228, 7, 6, 1, 212, 99, 2, 250, 38, 7, 4, 1, 212, 99, - 2, 250, 38, 7, 6, 1, 211, 118, 2, 250, 38, 7, 4, 1, 211, 118, 2, 250, 38, - 7, 6, 1, 211, 118, 2, 248, 9, 7, 6, 1, 210, 160, 2, 142, 7, 4, 1, 210, - 160, 2, 142, 7, 6, 1, 210, 160, 2, 59, 48, 7, 4, 1, 210, 160, 2, 59, 48, - 7, 6, 1, 210, 160, 2, 250, 242, 7, 4, 1, 210, 160, 2, 250, 242, 7, 4, 1, - 200, 222, 93, 7, 4, 1, 57, 2, 91, 7, 6, 1, 57, 2, 103, 7, 6, 1, 57, 2, - 216, 12, 7, 4, 1, 57, 2, 216, 12, 7, 6, 1, 138, 195, 7, 4, 1, 138, 195, - 7, 6, 1, 204, 78, 7, 6, 1, 251, 75, 2, 103, 7, 4, 1, 251, 75, 2, 103, 7, - 6, 1, 254, 228, 249, 68, 7, 6, 1, 249, 69, 2, 103, 7, 6, 1, 249, 69, 2, - 216, 12, 7, 4, 1, 249, 69, 2, 216, 12, 7, 4, 1, 215, 94, 248, 62, 7, 6, - 1, 223, 52, 76, 7, 6, 1, 221, 197, 7, 6, 1, 204, 76, 7, 6, 1, 245, 15, 2, - 103, 7, 4, 1, 245, 15, 2, 103, 7, 6, 1, 243, 210, 2, 103, 7, 6, 1, 243, - 114, 7, 4, 1, 240, 208, 7, 6, 1, 235, 192, 7, 6, 1, 240, 161, 2, 91, 7, - 6, 1, 235, 30, 2, 103, 7, 4, 1, 235, 30, 2, 103, 7, 4, 1, 233, 155, 2, - 130, 7, 4, 1, 233, 106, 2, 91, 7, 6, 1, 215, 94, 194, 7, 6, 1, 230, 31, - 2, 43, 103, 7, 4, 1, 230, 31, 2, 200, 44, 233, 42, 7, 6, 1, 144, 2, 230, - 229, 184, 7, 6, 1, 144, 2, 240, 255, 7, 4, 1, 144, 2, 240, 255, 7, 6, 1, - 226, 223, 7, 4, 1, 226, 223, 7, 6, 1, 226, 110, 2, 103, 7, 4, 1, 226, - 110, 2, 103, 7, 1, 210, 214, 7, 6, 1, 138, 105, 7, 4, 1, 138, 105, 7, 6, - 1, 245, 83, 7, 1, 223, 52, 245, 84, 232, 129, 7, 4, 1, 217, 154, 2, 226, - 70, 103, 7, 6, 1, 217, 154, 2, 103, 7, 4, 1, 217, 154, 2, 103, 7, 6, 1, - 217, 154, 2, 223, 58, 103, 7, 6, 1, 104, 2, 240, 255, 7, 4, 1, 104, 2, - 240, 255, 7, 6, 1, 214, 157, 7, 6, 1, 214, 106, 2, 103, 7, 6, 1, 211, - 118, 2, 103, 7, 4, 1, 211, 118, 2, 103, 7, 6, 1, 210, 160, 2, 91, 7, 4, - 1, 210, 160, 2, 91, 7, 6, 1, 245, 16, 7, 6, 1, 245, 17, 223, 51, 7, 4, 1, - 245, 17, 223, 51, 7, 4, 1, 245, 17, 2, 217, 78, 7, 1, 113, 2, 91, 7, 6, - 1, 138, 190, 7, 4, 1, 138, 190, 7, 1, 235, 200, 242, 187, 218, 132, 2, - 91, 7, 1, 211, 181, 7, 1, 248, 55, 250, 19, 7, 1, 233, 83, 250, 19, 7, 1, - 254, 145, 250, 19, 7, 1, 223, 58, 250, 19, 7, 6, 1, 246, 48, 2, 250, 242, - 7, 6, 1, 249, 69, 2, 4, 1, 210, 160, 2, 250, 242, 7, 4, 1, 246, 48, 2, - 250, 242, 7, 6, 1, 232, 194, 7, 6, 1, 233, 155, 2, 4, 1, 235, 150, 7, 4, - 1, 232, 194, 7, 6, 1, 228, 191, 7, 6, 1, 230, 31, 2, 4, 1, 235, 150, 7, - 4, 1, 228, 191, 7, 6, 1, 116, 2, 250, 242, 7, 4, 1, 116, 2, 250, 242, 7, - 6, 1, 240, 161, 2, 250, 242, 7, 4, 1, 240, 161, 2, 250, 242, 7, 6, 1, - 144, 2, 250, 242, 7, 4, 1, 144, 2, 250, 242, 7, 6, 1, 104, 2, 250, 242, - 7, 4, 1, 104, 2, 250, 242, 7, 6, 1, 104, 2, 248, 10, 22, 231, 237, 7, 4, - 1, 104, 2, 248, 10, 22, 231, 237, 7, 6, 1, 104, 2, 248, 10, 22, 142, 7, - 4, 1, 104, 2, 248, 10, 22, 142, 7, 6, 1, 104, 2, 248, 10, 22, 250, 242, - 7, 4, 1, 104, 2, 248, 10, 22, 250, 242, 7, 6, 1, 104, 2, 248, 10, 22, - 242, 143, 7, 4, 1, 104, 2, 248, 10, 22, 242, 143, 7, 4, 1, 215, 94, 76, - 7, 6, 1, 116, 2, 248, 10, 22, 231, 237, 7, 4, 1, 116, 2, 248, 10, 22, - 231, 237, 7, 6, 1, 116, 2, 59, 72, 22, 231, 237, 7, 4, 1, 116, 2, 59, 72, - 22, 231, 237, 7, 6, 1, 254, 253, 2, 231, 237, 7, 4, 1, 254, 253, 2, 231, - 237, 7, 6, 1, 243, 210, 2, 91, 7, 4, 1, 243, 210, 2, 91, 7, 6, 1, 243, - 210, 2, 250, 242, 7, 4, 1, 243, 210, 2, 250, 242, 7, 6, 1, 235, 30, 2, - 250, 242, 7, 4, 1, 235, 30, 2, 250, 242, 7, 6, 1, 144, 2, 226, 228, 7, 4, - 1, 144, 2, 226, 228, 7, 6, 1, 144, 2, 226, 229, 22, 231, 237, 7, 4, 1, - 144, 2, 226, 229, 22, 231, 237, 7, 6, 1, 245, 17, 2, 250, 242, 7, 4, 1, - 245, 17, 2, 250, 242, 7, 4, 1, 235, 151, 2, 250, 242, 7, 6, 1, 246, 47, - 7, 6, 1, 249, 69, 2, 4, 1, 210, 159, 7, 4, 1, 246, 47, 7, 6, 1, 243, 210, - 2, 142, 7, 4, 1, 243, 210, 2, 142, 7, 6, 1, 240, 206, 7, 6, 1, 211, 181, - 7, 6, 1, 230, 31, 2, 242, 143, 7, 4, 1, 230, 31, 2, 242, 143, 7, 6, 1, - 116, 2, 222, 237, 72, 22, 142, 7, 4, 1, 116, 2, 222, 237, 72, 22, 142, 7, - 6, 1, 254, 253, 2, 142, 7, 4, 1, 254, 253, 2, 142, 7, 6, 1, 144, 2, 218, - 105, 22, 142, 7, 4, 1, 144, 2, 218, 105, 22, 142, 7, 6, 1, 116, 2, 52, - 242, 143, 7, 4, 1, 116, 2, 52, 242, 143, 7, 6, 1, 116, 2, 235, 200, 251, - 154, 7, 4, 1, 116, 2, 235, 200, 251, 154, 7, 6, 1, 160, 2, 52, 242, 143, - 7, 4, 1, 160, 2, 52, 242, 143, 7, 6, 1, 160, 2, 235, 200, 251, 154, 7, 4, - 1, 160, 2, 235, 200, 251, 154, 7, 6, 1, 240, 161, 2, 52, 242, 143, 7, 4, - 1, 240, 161, 2, 52, 242, 143, 7, 6, 1, 240, 161, 2, 235, 200, 251, 154, - 7, 4, 1, 240, 161, 2, 235, 200, 251, 154, 7, 6, 1, 144, 2, 52, 242, 143, - 7, 4, 1, 144, 2, 52, 242, 143, 7, 6, 1, 144, 2, 235, 200, 251, 154, 7, 4, - 1, 144, 2, 235, 200, 251, 154, 7, 6, 1, 223, 227, 2, 52, 242, 143, 7, 4, - 1, 223, 227, 2, 52, 242, 143, 7, 6, 1, 223, 227, 2, 235, 200, 251, 154, - 7, 4, 1, 223, 227, 2, 235, 200, 251, 154, 7, 6, 1, 104, 2, 52, 242, 143, - 7, 4, 1, 104, 2, 52, 242, 143, 7, 6, 1, 104, 2, 235, 200, 251, 154, 7, 4, - 1, 104, 2, 235, 200, 251, 154, 7, 6, 1, 222, 94, 2, 249, 228, 51, 7, 4, - 1, 222, 94, 2, 249, 228, 51, 7, 6, 1, 217, 154, 2, 249, 228, 51, 7, 4, 1, - 217, 154, 2, 249, 228, 51, 7, 6, 1, 210, 231, 7, 4, 1, 210, 231, 7, 6, 1, - 242, 68, 2, 250, 242, 7, 4, 1, 242, 68, 2, 250, 242, 7, 6, 1, 230, 31, 2, - 200, 44, 233, 42, 7, 4, 1, 249, 69, 2, 249, 108, 7, 6, 1, 226, 138, 7, 4, - 1, 226, 138, 7, 6, 1, 210, 160, 2, 103, 7, 4, 1, 210, 160, 2, 103, 7, 6, - 1, 116, 2, 59, 48, 7, 4, 1, 116, 2, 59, 48, 7, 6, 1, 160, 2, 250, 191, 7, - 4, 1, 160, 2, 250, 191, 7, 6, 1, 144, 2, 248, 10, 22, 231, 237, 7, 4, 1, - 144, 2, 248, 10, 22, 231, 237, 7, 6, 1, 144, 2, 216, 90, 22, 231, 237, 7, - 4, 1, 144, 2, 216, 90, 22, 231, 237, 7, 6, 1, 144, 2, 59, 48, 7, 4, 1, - 144, 2, 59, 48, 7, 6, 1, 144, 2, 59, 72, 22, 231, 237, 7, 4, 1, 144, 2, - 59, 72, 22, 231, 237, 7, 6, 1, 211, 118, 2, 231, 237, 7, 4, 1, 211, 118, - 2, 231, 237, 7, 4, 1, 233, 155, 2, 249, 108, 7, 4, 1, 230, 31, 2, 249, - 108, 7, 4, 1, 217, 154, 2, 249, 108, 7, 4, 1, 247, 127, 235, 150, 7, 4, - 1, 248, 151, 247, 228, 7, 4, 1, 224, 34, 247, 228, 7, 6, 1, 116, 2, 91, - 7, 6, 1, 251, 75, 2, 91, 7, 4, 1, 251, 75, 2, 91, 7, 6, 1, 233, 155, 2, - 130, 7, 6, 1, 217, 154, 2, 248, 7, 91, 7, 4, 1, 222, 94, 2, 217, 251, - 217, 78, 7, 4, 1, 210, 160, 2, 217, 251, 217, 78, 7, 6, 1, 242, 187, 218, - 131, 7, 4, 1, 242, 187, 218, 131, 7, 6, 1, 57, 2, 91, 7, 6, 1, 104, 130, - 7, 6, 1, 215, 94, 214, 105, 7, 6, 1, 160, 2, 91, 7, 4, 1, 160, 2, 91, 7, - 6, 1, 235, 151, 2, 91, 7, 4, 1, 235, 151, 2, 91, 7, 6, 1, 4, 224, 100, 2, - 241, 59, 217, 78, 7, 4, 1, 224, 100, 2, 241, 59, 217, 78, 7, 6, 1, 223, - 227, 2, 91, 7, 4, 1, 223, 227, 2, 91, 7, 6, 1, 211, 118, 2, 91, 7, 4, 1, - 211, 118, 2, 91, 7, 4, 1, 215, 94, 61, 7, 4, 1, 254, 151, 7, 4, 1, 215, - 94, 254, 151, 7, 4, 1, 57, 2, 103, 7, 4, 1, 204, 78, 7, 4, 1, 251, 75, 2, - 249, 108, 7, 4, 1, 249, 69, 2, 217, 78, 7, 4, 1, 249, 69, 2, 103, 7, 4, - 1, 223, 52, 76, 7, 4, 1, 221, 197, 7, 4, 1, 221, 198, 2, 103, 7, 4, 1, - 204, 76, 7, 4, 1, 223, 52, 204, 76, 7, 4, 1, 223, 52, 204, 160, 2, 103, - 7, 4, 1, 250, 8, 223, 52, 204, 76, 7, 4, 1, 247, 127, 235, 151, 2, 91, 7, - 4, 1, 243, 210, 2, 103, 7, 4, 1, 119, 243, 209, 7, 1, 4, 6, 243, 209, 7, - 4, 1, 243, 114, 7, 4, 1, 223, 154, 240, 255, 7, 4, 1, 215, 94, 242, 67, - 7, 4, 1, 242, 68, 2, 103, 7, 4, 1, 241, 215, 2, 103, 7, 4, 1, 240, 161, - 2, 91, 7, 4, 1, 235, 192, 7, 1, 4, 6, 74, 7, 4, 1, 233, 155, 2, 230, 229, - 184, 7, 4, 1, 233, 155, 2, 252, 49, 7, 4, 1, 233, 155, 2, 223, 58, 103, - 7, 4, 1, 233, 7, 7, 4, 1, 215, 94, 194, 7, 4, 1, 215, 94, 232, 55, 2, - 200, 233, 42, 7, 4, 1, 232, 55, 2, 103, 7, 4, 1, 230, 31, 2, 43, 103, 7, - 4, 1, 230, 31, 2, 223, 58, 103, 7, 1, 4, 6, 230, 30, 7, 4, 1, 252, 142, - 78, 7, 1, 4, 6, 226, 238, 7, 4, 1, 250, 8, 226, 205, 7, 4, 1, 225, 136, - 7, 4, 1, 215, 94, 153, 7, 4, 1, 215, 94, 223, 227, 2, 200, 233, 42, 7, 4, - 1, 215, 94, 223, 227, 2, 103, 7, 4, 1, 223, 227, 2, 200, 233, 42, 7, 4, - 1, 223, 227, 2, 217, 78, 7, 4, 1, 223, 227, 2, 244, 95, 7, 4, 1, 223, 52, - 223, 227, 2, 244, 95, 7, 1, 4, 6, 153, 7, 1, 4, 6, 235, 200, 153, 7, 4, - 1, 222, 94, 2, 103, 7, 4, 1, 245, 83, 7, 4, 1, 247, 127, 235, 151, 2, - 218, 105, 22, 103, 7, 4, 1, 218, 233, 223, 52, 245, 83, 7, 4, 1, 245, 84, - 2, 249, 108, 7, 4, 1, 215, 94, 217, 153, 7, 4, 1, 217, 154, 2, 223, 58, - 103, 7, 4, 1, 104, 130, 7, 4, 1, 214, 157, 7, 4, 1, 214, 106, 2, 103, 7, - 4, 1, 215, 94, 214, 105, 7, 4, 1, 215, 94, 212, 98, 7, 4, 1, 215, 94, - 211, 117, 7, 1, 4, 6, 211, 117, 7, 4, 1, 210, 160, 2, 223, 58, 103, 7, 4, - 1, 210, 160, 2, 249, 108, 7, 4, 1, 245, 16, 7, 4, 1, 245, 17, 2, 249, - 108, 7, 1, 242, 187, 218, 131, 7, 1, 225, 142, 213, 135, 244, 1, 7, 1, - 235, 200, 242, 187, 218, 131, 7, 1, 218, 112, 251, 74, 7, 1, 251, 254, - 250, 19, 7, 1, 4, 6, 253, 166, 7, 4, 1, 250, 8, 204, 76, 7, 1, 4, 6, 243, - 210, 2, 103, 7, 1, 4, 6, 242, 67, 7, 4, 1, 235, 151, 2, 249, 135, 7, 4, - 1, 215, 94, 235, 29, 7, 1, 4, 6, 156, 7, 4, 1, 224, 100, 2, 103, 7, 1, - 242, 187, 218, 132, 2, 91, 7, 1, 223, 52, 242, 187, 218, 132, 2, 91, 7, - 4, 1, 246, 48, 247, 228, 7, 4, 1, 248, 34, 247, 228, 7, 4, 1, 246, 48, - 247, 229, 2, 249, 108, 7, 4, 1, 215, 186, 247, 228, 7, 4, 1, 216, 236, - 247, 228, 7, 4, 1, 217, 30, 247, 229, 2, 249, 108, 7, 4, 1, 244, 142, - 247, 228, 7, 4, 1, 232, 105, 247, 228, 7, 4, 1, 232, 56, 247, 228, 7, 1, - 251, 254, 225, 184, 7, 1, 252, 6, 225, 184, 7, 4, 1, 215, 94, 242, 68, 2, - 244, 95, 7, 4, 1, 215, 94, 242, 68, 2, 244, 96, 22, 217, 78, 58, 1, 4, - 242, 67, 58, 1, 4, 242, 68, 2, 103, 58, 1, 4, 235, 150, 58, 1, 4, 153, - 58, 1, 4, 215, 94, 153, 58, 1, 4, 215, 94, 223, 227, 2, 103, 58, 1, 4, 6, - 235, 200, 153, 58, 1, 4, 212, 98, 58, 1, 4, 211, 117, 58, 1, 224, 193, - 58, 1, 52, 224, 193, 58, 1, 215, 94, 249, 227, 58, 1, 254, 65, 58, 1, - 223, 52, 249, 227, 58, 1, 44, 163, 222, 236, 58, 1, 43, 163, 222, 236, - 58, 1, 242, 187, 218, 131, 58, 1, 223, 52, 242, 187, 218, 131, 58, 1, 43, - 254, 1, 58, 1, 44, 254, 1, 58, 1, 120, 254, 1, 58, 1, 124, 254, 1, 58, 1, - 250, 39, 255, 23, 250, 242, 58, 1, 67, 232, 219, 58, 1, 231, 237, 58, 1, - 255, 12, 255, 23, 58, 1, 242, 144, 255, 23, 58, 1, 121, 67, 232, 219, 58, - 1, 121, 231, 237, 58, 1, 121, 242, 144, 255, 23, 58, 1, 121, 255, 12, - 255, 23, 58, 1, 215, 223, 249, 234, 58, 1, 163, 215, 223, 249, 234, 58, - 1, 250, 181, 44, 163, 222, 236, 58, 1, 250, 181, 43, 163, 222, 236, 58, - 1, 120, 217, 88, 58, 1, 124, 217, 88, 58, 1, 96, 50, 58, 1, 230, 187, 50, - 251, 154, 59, 48, 222, 237, 48, 226, 228, 4, 184, 52, 255, 12, 255, 23, - 58, 1, 223, 39, 103, 58, 1, 249, 139, 255, 23, 58, 1, 4, 243, 114, 58, 1, - 4, 156, 58, 1, 4, 222, 93, 58, 1, 4, 211, 178, 58, 1, 4, 223, 52, 242, - 187, 218, 131, 58, 1, 245, 28, 138, 130, 58, 1, 125, 138, 130, 58, 1, - 230, 230, 138, 130, 58, 1, 121, 138, 130, 58, 1, 245, 27, 138, 130, 58, - 1, 210, 254, 248, 52, 138, 79, 58, 1, 211, 70, 248, 52, 138, 79, 58, 1, - 213, 133, 58, 1, 214, 186, 58, 1, 52, 254, 65, 58, 1, 121, 124, 254, 1, - 58, 1, 121, 120, 254, 1, 58, 1, 121, 43, 254, 1, 58, 1, 121, 44, 254, 1, - 58, 1, 121, 222, 236, 58, 1, 230, 229, 242, 144, 255, 23, 58, 1, 230, - 229, 52, 242, 144, 255, 23, 58, 1, 230, 229, 52, 255, 12, 255, 23, 58, 1, - 121, 184, 58, 1, 223, 160, 249, 234, 58, 1, 252, 66, 125, 216, 31, 58, 1, - 245, 151, 125, 216, 31, 58, 1, 252, 66, 121, 216, 31, 58, 1, 245, 151, - 121, 216, 31, 58, 1, 220, 56, 58, 1, 204, 220, 56, 58, 1, 121, 43, 75, - 38, 242, 144, 255, 23, 38, 255, 12, 255, 23, 38, 250, 39, 255, 23, 38, - 184, 38, 231, 237, 38, 226, 123, 38, 251, 154, 38, 59, 48, 38, 248, 9, - 38, 241, 59, 48, 38, 222, 237, 48, 38, 52, 255, 12, 255, 23, 38, 250, - 242, 38, 67, 232, 220, 48, 38, 52, 67, 232, 220, 48, 38, 52, 242, 144, - 255, 23, 38, 251, 7, 38, 235, 200, 251, 154, 38, 215, 94, 249, 228, 48, - 38, 249, 228, 48, 38, 223, 52, 249, 228, 48, 38, 249, 228, 72, 222, 254, - 38, 242, 144, 255, 24, 51, 38, 255, 12, 255, 24, 51, 38, 43, 217, 89, 51, - 38, 44, 217, 89, 51, 38, 43, 254, 118, 48, 38, 240, 255, 38, 43, 163, - 222, 237, 51, 38, 120, 217, 89, 51, 38, 124, 217, 89, 51, 38, 96, 5, 51, - 38, 230, 187, 5, 51, 38, 226, 68, 241, 59, 51, 38, 223, 58, 241, 59, 51, - 38, 59, 51, 38, 248, 10, 51, 38, 222, 237, 51, 38, 249, 228, 51, 38, 250, - 191, 38, 226, 228, 38, 67, 232, 220, 51, 38, 251, 148, 51, 38, 235, 200, - 52, 254, 32, 51, 38, 250, 243, 51, 38, 250, 39, 255, 24, 51, 38, 251, - 155, 51, 38, 235, 200, 251, 155, 51, 38, 216, 90, 51, 38, 231, 238, 51, - 38, 121, 232, 219, 38, 52, 121, 232, 219, 38, 216, 90, 226, 124, 38, 219, - 253, 218, 105, 226, 124, 38, 200, 218, 105, 226, 124, 38, 219, 253, 219, - 49, 226, 124, 38, 200, 219, 49, 226, 124, 38, 44, 163, 222, 237, 51, 38, - 235, 200, 251, 148, 51, 38, 42, 51, 38, 221, 182, 51, 38, 211, 179, 48, - 38, 67, 184, 38, 52, 226, 123, 38, 242, 144, 138, 79, 38, 255, 12, 138, - 79, 38, 26, 225, 178, 38, 26, 234, 8, 38, 26, 248, 4, 216, 19, 38, 26, - 210, 219, 38, 251, 148, 48, 38, 245, 106, 5, 51, 38, 52, 67, 232, 220, - 51, 38, 43, 254, 118, 51, 38, 228, 57, 216, 90, 48, 38, 241, 65, 48, 38, - 254, 156, 128, 216, 43, 48, 38, 43, 44, 80, 51, 38, 214, 153, 80, 51, 38, - 242, 149, 235, 69, 38, 44, 254, 2, 48, 38, 43, 163, 222, 237, 48, 38, - 244, 139, 38, 211, 179, 51, 38, 43, 254, 2, 51, 38, 44, 254, 2, 51, 38, - 44, 254, 2, 22, 120, 254, 2, 51, 38, 44, 163, 222, 237, 48, 38, 59, 72, - 222, 254, 38, 253, 225, 51, 38, 52, 222, 237, 51, 38, 210, 35, 48, 38, - 52, 251, 155, 51, 38, 52, 251, 154, 38, 52, 231, 237, 38, 52, 231, 238, - 51, 38, 52, 184, 38, 52, 235, 200, 251, 154, 38, 52, 97, 80, 51, 38, 7, - 4, 1, 61, 38, 7, 4, 1, 76, 38, 7, 4, 1, 74, 38, 7, 4, 1, 78, 38, 7, 4, 1, - 69, 38, 7, 4, 1, 251, 74, 38, 7, 4, 1, 249, 68, 38, 7, 4, 1, 242, 67, 38, - 7, 4, 1, 194, 38, 7, 4, 1, 153, 38, 7, 4, 1, 217, 153, 38, 7, 4, 1, 214, - 105, 38, 7, 4, 1, 211, 178, 26, 6, 1, 241, 203, 26, 4, 1, 241, 203, 26, - 6, 1, 254, 31, 221, 248, 26, 4, 1, 254, 31, 221, 248, 26, 227, 202, 50, - 26, 232, 114, 227, 202, 50, 26, 6, 1, 226, 55, 247, 235, 26, 4, 1, 226, - 55, 247, 235, 26, 210, 219, 26, 4, 223, 52, 232, 88, 219, 180, 87, 26, 4, - 246, 126, 232, 88, 219, 180, 87, 26, 4, 223, 52, 246, 126, 232, 88, 219, - 180, 87, 26, 224, 16, 79, 26, 216, 19, 26, 248, 4, 216, 19, 26, 6, 1, - 254, 152, 2, 216, 19, 26, 254, 105, 217, 3, 26, 6, 1, 245, 109, 2, 216, - 19, 26, 6, 1, 245, 72, 2, 216, 19, 26, 6, 1, 235, 193, 2, 216, 19, 26, 6, - 1, 226, 204, 2, 216, 19, 26, 6, 1, 214, 158, 2, 216, 19, 26, 6, 1, 226, - 206, 2, 216, 19, 26, 4, 1, 235, 193, 2, 248, 4, 22, 216, 19, 26, 6, 1, - 254, 151, 26, 6, 1, 252, 34, 26, 6, 1, 243, 114, 26, 6, 1, 248, 62, 26, - 6, 1, 245, 108, 26, 6, 1, 210, 85, 26, 6, 1, 245, 71, 26, 6, 1, 216, 180, - 26, 6, 1, 235, 192, 26, 6, 1, 234, 228, 26, 6, 1, 233, 104, 26, 6, 1, - 230, 107, 26, 6, 1, 227, 242, 26, 6, 1, 211, 157, 26, 6, 1, 226, 203, 26, - 6, 1, 225, 111, 26, 6, 1, 223, 40, 26, 6, 1, 219, 179, 26, 6, 1, 217, 42, - 26, 6, 1, 214, 157, 26, 6, 1, 225, 136, 26, 6, 1, 250, 118, 26, 6, 1, - 224, 164, 26, 6, 1, 226, 205, 26, 6, 1, 235, 193, 2, 248, 3, 26, 6, 1, - 214, 158, 2, 248, 3, 26, 4, 1, 254, 152, 2, 216, 19, 26, 4, 1, 245, 109, - 2, 216, 19, 26, 4, 1, 245, 72, 2, 216, 19, 26, 4, 1, 235, 193, 2, 216, - 19, 26, 4, 1, 214, 158, 2, 248, 4, 22, 216, 19, 26, 4, 1, 254, 151, 26, - 4, 1, 252, 34, 26, 4, 1, 243, 114, 26, 4, 1, 248, 62, 26, 4, 1, 245, 108, - 26, 4, 1, 210, 85, 26, 4, 1, 245, 71, 26, 4, 1, 216, 180, 26, 4, 1, 235, - 192, 26, 4, 1, 234, 228, 26, 4, 1, 233, 104, 26, 4, 1, 230, 107, 26, 4, - 1, 227, 242, 26, 4, 1, 211, 157, 26, 4, 1, 226, 203, 26, 4, 1, 225, 111, - 26, 4, 1, 223, 40, 26, 4, 1, 40, 219, 179, 26, 4, 1, 219, 179, 26, 4, 1, - 217, 42, 26, 4, 1, 214, 157, 26, 4, 1, 225, 136, 26, 4, 1, 250, 118, 26, - 4, 1, 224, 164, 26, 4, 1, 226, 205, 26, 4, 1, 235, 193, 2, 248, 3, 26, 4, - 1, 214, 158, 2, 248, 3, 26, 4, 1, 226, 204, 2, 216, 19, 26, 4, 1, 214, - 158, 2, 216, 19, 26, 4, 1, 226, 206, 2, 216, 19, 26, 6, 234, 253, 87, 26, - 252, 35, 87, 26, 216, 181, 87, 26, 214, 158, 2, 241, 59, 87, 26, 214, - 158, 2, 255, 12, 22, 241, 59, 87, 26, 214, 158, 2, 248, 10, 22, 241, 59, - 87, 26, 225, 137, 87, 26, 225, 112, 87, 26, 234, 253, 87, 26, 1, 254, 31, - 234, 12, 26, 4, 1, 254, 31, 234, 12, 26, 1, 218, 139, 26, 4, 1, 218, 139, - 26, 1, 247, 235, 26, 4, 1, 247, 235, 26, 1, 234, 12, 26, 4, 1, 234, 12, - 26, 1, 221, 248, 26, 4, 1, 221, 248, 81, 6, 1, 220, 57, 81, 4, 1, 220, - 57, 81, 6, 1, 244, 148, 81, 4, 1, 244, 148, 81, 6, 1, 234, 123, 81, 4, 1, - 234, 123, 81, 6, 1, 241, 52, 81, 4, 1, 241, 52, 81, 6, 1, 243, 109, 81, - 4, 1, 243, 109, 81, 6, 1, 220, 24, 81, 4, 1, 220, 24, 81, 6, 1, 248, 77, - 81, 4, 1, 248, 77, 26, 234, 229, 87, 26, 223, 41, 87, 26, 232, 88, 219, - 180, 87, 26, 1, 210, 224, 26, 6, 216, 181, 87, 26, 232, 88, 245, 109, 87, - 26, 223, 52, 232, 88, 245, 109, 87, 26, 6, 1, 220, 9, 26, 4, 1, 220, 9, - 26, 6, 232, 88, 219, 180, 87, 26, 6, 1, 221, 245, 26, 4, 1, 221, 245, 26, - 223, 41, 2, 218, 105, 87, 26, 6, 223, 52, 232, 88, 219, 180, 87, 26, 6, - 246, 126, 232, 88, 219, 180, 87, 26, 6, 223, 52, 246, 126, 232, 88, 219, - 180, 87, 33, 6, 1, 236, 68, 2, 242, 143, 33, 6, 1, 235, 196, 33, 6, 1, - 247, 170, 33, 6, 1, 242, 194, 33, 6, 1, 214, 202, 236, 67, 33, 6, 1, 246, - 44, 33, 6, 1, 251, 84, 74, 33, 6, 1, 211, 8, 33, 6, 1, 235, 132, 33, 6, - 1, 232, 193, 33, 6, 1, 228, 183, 33, 6, 1, 215, 175, 33, 6, 1, 234, 54, - 33, 6, 1, 240, 161, 2, 242, 143, 33, 6, 1, 219, 253, 69, 33, 6, 1, 246, - 40, 33, 6, 1, 61, 33, 6, 1, 252, 83, 33, 6, 1, 213, 255, 33, 6, 1, 242, - 243, 33, 6, 1, 248, 98, 33, 6, 1, 236, 67, 33, 6, 1, 210, 74, 33, 6, 1, - 210, 94, 33, 6, 1, 74, 33, 6, 1, 219, 253, 74, 33, 6, 1, 176, 33, 6, 1, - 245, 182, 33, 6, 1, 245, 167, 33, 6, 1, 245, 158, 33, 6, 1, 78, 33, 6, 1, - 225, 224, 33, 6, 1, 245, 100, 33, 6, 1, 245, 90, 33, 6, 1, 217, 23, 33, - 6, 1, 69, 33, 6, 1, 245, 210, 33, 6, 1, 162, 33, 6, 1, 215, 179, 33, 6, - 1, 250, 139, 33, 6, 1, 220, 104, 33, 6, 1, 220, 67, 33, 6, 1, 242, 10, - 50, 33, 6, 1, 211, 27, 33, 6, 1, 219, 54, 50, 33, 6, 1, 76, 33, 6, 1, - 210, 212, 33, 6, 1, 192, 33, 4, 1, 61, 33, 4, 1, 252, 83, 33, 4, 1, 213, - 255, 33, 4, 1, 242, 243, 33, 4, 1, 248, 98, 33, 4, 1, 236, 67, 33, 4, 1, - 210, 74, 33, 4, 1, 210, 94, 33, 4, 1, 74, 33, 4, 1, 219, 253, 74, 33, 4, - 1, 176, 33, 4, 1, 245, 182, 33, 4, 1, 245, 167, 33, 4, 1, 245, 158, 33, - 4, 1, 78, 33, 4, 1, 225, 224, 33, 4, 1, 245, 100, 33, 4, 1, 245, 90, 33, - 4, 1, 217, 23, 33, 4, 1, 69, 33, 4, 1, 245, 210, 33, 4, 1, 162, 33, 4, 1, - 215, 179, 33, 4, 1, 250, 139, 33, 4, 1, 220, 104, 33, 4, 1, 220, 67, 33, - 4, 1, 242, 10, 50, 33, 4, 1, 211, 27, 33, 4, 1, 219, 54, 50, 33, 4, 1, - 76, 33, 4, 1, 210, 212, 33, 4, 1, 192, 33, 4, 1, 236, 68, 2, 242, 143, - 33, 4, 1, 235, 196, 33, 4, 1, 247, 170, 33, 4, 1, 242, 194, 33, 4, 1, - 214, 202, 236, 67, 33, 4, 1, 246, 44, 33, 4, 1, 251, 84, 74, 33, 4, 1, - 211, 8, 33, 4, 1, 235, 132, 33, 4, 1, 232, 193, 33, 4, 1, 228, 183, 33, - 4, 1, 215, 175, 33, 4, 1, 234, 54, 33, 4, 1, 240, 161, 2, 242, 143, 33, - 4, 1, 219, 253, 69, 33, 4, 1, 246, 40, 33, 6, 1, 226, 205, 33, 4, 1, 226, - 205, 33, 6, 1, 211, 59, 33, 4, 1, 211, 59, 33, 6, 1, 235, 190, 76, 33, 4, - 1, 235, 190, 76, 33, 6, 1, 232, 198, 210, 183, 33, 4, 1, 232, 198, 210, - 183, 33, 6, 1, 235, 190, 232, 198, 210, 183, 33, 4, 1, 235, 190, 232, - 198, 210, 183, 33, 6, 1, 252, 1, 210, 183, 33, 4, 1, 252, 1, 210, 183, - 33, 6, 1, 235, 190, 252, 1, 210, 183, 33, 4, 1, 235, 190, 252, 1, 210, - 183, 33, 6, 1, 233, 239, 33, 4, 1, 233, 239, 33, 6, 1, 224, 164, 33, 4, - 1, 224, 164, 33, 6, 1, 244, 90, 33, 4, 1, 244, 90, 33, 6, 1, 235, 152, - 33, 4, 1, 235, 152, 33, 6, 1, 235, 153, 2, 52, 242, 144, 255, 23, 33, 4, - 1, 235, 153, 2, 52, 242, 144, 255, 23, 33, 6, 1, 214, 205, 33, 4, 1, 214, - 205, 33, 6, 1, 222, 187, 226, 205, 33, 4, 1, 222, 187, 226, 205, 33, 6, - 1, 226, 206, 2, 216, 66, 33, 4, 1, 226, 206, 2, 216, 66, 33, 6, 1, 226, - 144, 33, 4, 1, 226, 144, 33, 6, 1, 234, 12, 33, 4, 1, 234, 12, 33, 216, - 147, 50, 38, 33, 216, 66, 38, 33, 226, 69, 38, 33, 248, 162, 225, 21, 38, - 33, 224, 158, 225, 21, 38, 33, 225, 6, 38, 33, 240, 218, 216, 147, 50, - 38, 33, 230, 196, 50, 33, 6, 1, 219, 253, 240, 161, 2, 217, 78, 33, 4, 1, - 219, 253, 240, 161, 2, 217, 78, 33, 6, 1, 220, 148, 50, 33, 4, 1, 220, - 148, 50, 33, 6, 1, 245, 101, 2, 216, 115, 33, 4, 1, 245, 101, 2, 216, - 115, 33, 6, 1, 242, 244, 2, 214, 156, 33, 4, 1, 242, 244, 2, 214, 156, - 33, 6, 1, 242, 244, 2, 91, 33, 4, 1, 242, 244, 2, 91, 33, 6, 1, 242, 244, - 2, 230, 229, 103, 33, 4, 1, 242, 244, 2, 230, 229, 103, 33, 6, 1, 210, - 75, 2, 248, 47, 33, 4, 1, 210, 75, 2, 248, 47, 33, 6, 1, 210, 95, 2, 248, - 47, 33, 4, 1, 210, 95, 2, 248, 47, 33, 6, 1, 235, 19, 2, 248, 47, 33, 4, - 1, 235, 19, 2, 248, 47, 33, 6, 1, 235, 19, 2, 67, 91, 33, 4, 1, 235, 19, - 2, 67, 91, 33, 6, 1, 235, 19, 2, 91, 33, 4, 1, 235, 19, 2, 91, 33, 6, 1, - 252, 132, 176, 33, 4, 1, 252, 132, 176, 33, 6, 1, 245, 159, 2, 248, 47, - 33, 4, 1, 245, 159, 2, 248, 47, 33, 6, 27, 245, 159, 242, 243, 33, 4, 27, - 245, 159, 242, 243, 33, 6, 1, 225, 225, 2, 230, 229, 103, 33, 4, 1, 225, - 225, 2, 230, 229, 103, 33, 6, 1, 255, 29, 162, 33, 4, 1, 255, 29, 162, - 33, 6, 1, 245, 91, 2, 248, 47, 33, 4, 1, 245, 91, 2, 248, 47, 33, 6, 1, - 217, 24, 2, 248, 47, 33, 4, 1, 217, 24, 2, 248, 47, 33, 6, 1, 218, 123, - 69, 33, 4, 1, 218, 123, 69, 33, 6, 1, 218, 123, 104, 2, 91, 33, 4, 1, - 218, 123, 104, 2, 91, 33, 6, 1, 242, 56, 2, 248, 47, 33, 4, 1, 242, 56, - 2, 248, 47, 33, 6, 27, 217, 24, 215, 179, 33, 4, 27, 217, 24, 215, 179, - 33, 6, 1, 250, 140, 2, 248, 47, 33, 4, 1, 250, 140, 2, 248, 47, 33, 6, 1, - 250, 140, 2, 67, 91, 33, 4, 1, 250, 140, 2, 67, 91, 33, 6, 1, 220, 35, - 33, 4, 1, 220, 35, 33, 6, 1, 255, 29, 250, 139, 33, 4, 1, 255, 29, 250, - 139, 33, 6, 1, 255, 29, 250, 140, 2, 248, 47, 33, 4, 1, 255, 29, 250, - 140, 2, 248, 47, 33, 1, 226, 62, 33, 6, 1, 210, 75, 2, 251, 154, 33, 4, - 1, 210, 75, 2, 251, 154, 33, 6, 1, 235, 19, 2, 103, 33, 4, 1, 235, 19, 2, - 103, 33, 6, 1, 245, 183, 2, 217, 78, 33, 4, 1, 245, 183, 2, 217, 78, 33, - 6, 1, 245, 159, 2, 103, 33, 4, 1, 245, 159, 2, 103, 33, 6, 1, 245, 159, - 2, 217, 78, 33, 4, 1, 245, 159, 2, 217, 78, 33, 6, 1, 234, 133, 250, 139, - 33, 4, 1, 234, 133, 250, 139, 33, 6, 1, 245, 168, 2, 217, 78, 33, 4, 1, - 245, 168, 2, 217, 78, 33, 4, 1, 226, 62, 33, 6, 1, 116, 2, 251, 154, 33, - 4, 1, 116, 2, 251, 154, 33, 6, 1, 116, 2, 248, 9, 33, 4, 1, 116, 2, 248, - 9, 33, 6, 27, 116, 236, 67, 33, 4, 27, 116, 236, 67, 33, 6, 1, 236, 68, - 2, 251, 154, 33, 4, 1, 236, 68, 2, 251, 154, 33, 6, 1, 221, 197, 33, 4, - 1, 221, 197, 33, 6, 1, 221, 198, 2, 248, 9, 33, 4, 1, 221, 198, 2, 248, - 9, 33, 6, 1, 210, 75, 2, 248, 9, 33, 4, 1, 210, 75, 2, 248, 9, 33, 6, 1, - 210, 95, 2, 248, 9, 33, 4, 1, 210, 95, 2, 248, 9, 33, 6, 1, 255, 29, 246, - 44, 33, 4, 1, 255, 29, 246, 44, 33, 6, 1, 240, 161, 2, 231, 237, 33, 4, - 1, 240, 161, 2, 231, 237, 33, 6, 1, 240, 161, 2, 248, 9, 33, 4, 1, 240, - 161, 2, 248, 9, 33, 6, 1, 144, 2, 248, 9, 33, 4, 1, 144, 2, 248, 9, 33, - 6, 1, 252, 142, 78, 33, 4, 1, 252, 142, 78, 33, 6, 1, 252, 142, 144, 2, - 248, 9, 33, 4, 1, 252, 142, 144, 2, 248, 9, 33, 6, 1, 160, 2, 248, 9, 33, - 4, 1, 160, 2, 248, 9, 33, 6, 1, 104, 2, 231, 237, 33, 4, 1, 104, 2, 231, - 237, 33, 6, 1, 104, 2, 248, 9, 33, 4, 1, 104, 2, 248, 9, 33, 6, 1, 104, - 2, 52, 142, 33, 4, 1, 104, 2, 52, 142, 33, 6, 1, 250, 140, 2, 248, 9, 33, - 4, 1, 250, 140, 2, 248, 9, 33, 6, 1, 242, 244, 2, 248, 47, 33, 4, 1, 242, - 244, 2, 248, 47, 33, 6, 1, 211, 28, 2, 248, 9, 33, 4, 1, 211, 28, 2, 248, - 9, 33, 6, 1, 242, 244, 2, 218, 105, 22, 103, 33, 4, 1, 242, 244, 2, 218, - 105, 22, 103, 33, 6, 1, 242, 56, 2, 103, 33, 4, 1, 242, 56, 2, 103, 33, - 6, 1, 242, 56, 2, 91, 33, 4, 1, 242, 56, 2, 91, 33, 6, 1, 234, 20, 248, - 98, 33, 4, 1, 234, 20, 248, 98, 33, 6, 1, 234, 20, 247, 170, 33, 4, 1, - 234, 20, 247, 170, 33, 6, 1, 234, 20, 210, 27, 33, 4, 1, 234, 20, 210, - 27, 33, 6, 1, 234, 20, 246, 38, 33, 4, 1, 234, 20, 246, 38, 33, 6, 1, - 234, 20, 232, 193, 33, 4, 1, 234, 20, 232, 193, 33, 6, 1, 234, 20, 228, - 183, 33, 4, 1, 234, 20, 228, 183, 33, 6, 1, 234, 20, 219, 111, 33, 4, 1, - 234, 20, 219, 111, 33, 6, 1, 234, 20, 216, 61, 33, 4, 1, 234, 20, 216, - 61, 33, 6, 1, 223, 52, 210, 94, 33, 4, 1, 223, 52, 210, 94, 33, 6, 1, - 245, 183, 2, 103, 33, 4, 1, 245, 183, 2, 103, 33, 6, 1, 233, 4, 33, 4, 1, - 233, 4, 33, 6, 1, 223, 42, 33, 4, 1, 223, 42, 33, 6, 1, 211, 92, 33, 4, - 1, 211, 92, 33, 6, 1, 224, 91, 33, 4, 1, 224, 91, 33, 6, 1, 212, 22, 33, - 4, 1, 212, 22, 33, 6, 1, 254, 175, 176, 33, 4, 1, 254, 175, 176, 33, 6, - 1, 245, 183, 2, 230, 229, 103, 33, 4, 1, 245, 183, 2, 230, 229, 103, 33, - 6, 1, 245, 159, 2, 230, 229, 103, 33, 4, 1, 245, 159, 2, 230, 229, 103, - 33, 6, 1, 225, 225, 2, 248, 47, 33, 4, 1, 225, 225, 2, 248, 47, 33, 6, 1, - 220, 36, 2, 248, 47, 33, 4, 1, 220, 36, 2, 248, 47, 150, 6, 1, 253, 172, - 150, 6, 1, 252, 47, 150, 6, 1, 242, 210, 150, 6, 1, 248, 229, 150, 6, 1, - 245, 221, 150, 6, 1, 210, 116, 150, 6, 1, 245, 205, 150, 6, 1, 245, 73, - 150, 6, 1, 112, 150, 6, 1, 210, 74, 150, 6, 1, 235, 234, 150, 6, 1, 232, - 196, 150, 6, 1, 211, 160, 150, 6, 1, 251, 41, 150, 6, 1, 234, 171, 150, - 6, 1, 241, 75, 150, 6, 1, 235, 147, 150, 6, 1, 242, 253, 150, 6, 1, 250, - 134, 150, 6, 1, 231, 63, 150, 6, 1, 211, 8, 150, 6, 1, 228, 44, 150, 6, - 1, 220, 104, 150, 6, 1, 213, 138, 150, 6, 1, 250, 165, 150, 6, 1, 225, - 208, 150, 6, 1, 235, 116, 150, 6, 1, 205, 150, 6, 1, 221, 163, 150, 6, 1, - 213, 179, 150, 6, 1, 216, 63, 150, 6, 1, 223, 98, 150, 6, 1, 249, 246, - 150, 6, 1, 210, 249, 150, 6, 1, 225, 49, 150, 6, 1, 234, 182, 150, 6, 1, - 226, 226, 150, 6, 1, 244, 150, 150, 58, 1, 43, 163, 222, 236, 150, 254, - 65, 150, 245, 162, 79, 150, 245, 39, 79, 150, 249, 227, 150, 224, 16, 79, - 150, 255, 30, 79, 150, 4, 1, 253, 172, 150, 4, 1, 252, 47, 150, 4, 1, - 242, 210, 150, 4, 1, 248, 229, 150, 4, 1, 245, 221, 150, 4, 1, 210, 116, - 150, 4, 1, 245, 205, 150, 4, 1, 245, 73, 150, 4, 1, 112, 150, 4, 1, 210, - 74, 150, 4, 1, 235, 234, 150, 4, 1, 232, 196, 150, 4, 1, 211, 160, 150, - 4, 1, 251, 41, 150, 4, 1, 234, 171, 150, 4, 1, 241, 75, 150, 4, 1, 235, - 147, 150, 4, 1, 242, 253, 150, 4, 1, 250, 134, 150, 4, 1, 231, 63, 150, - 4, 1, 211, 8, 150, 4, 1, 228, 44, 150, 4, 1, 220, 104, 150, 4, 1, 213, - 138, 150, 4, 1, 250, 165, 150, 4, 1, 225, 208, 150, 4, 1, 235, 116, 150, - 4, 1, 205, 150, 4, 1, 221, 163, 150, 4, 1, 213, 179, 150, 4, 1, 216, 63, - 150, 4, 1, 223, 98, 150, 4, 1, 249, 246, 150, 4, 1, 210, 249, 150, 4, 1, - 225, 49, 150, 4, 1, 234, 182, 150, 4, 1, 226, 226, 150, 4, 1, 244, 150, - 150, 4, 27, 245, 222, 210, 249, 150, 243, 236, 218, 131, 150, 240, 175, - 150, 246, 103, 50, 94, 255, 24, 245, 65, 94, 255, 24, 221, 164, 94, 255, - 24, 220, 90, 94, 255, 24, 210, 104, 224, 74, 94, 255, 24, 210, 104, 243, - 132, 94, 255, 24, 216, 76, 94, 255, 24, 223, 50, 94, 255, 24, 210, 103, - 94, 255, 24, 225, 249, 94, 255, 24, 211, 20, 94, 255, 24, 216, 215, 94, - 255, 24, 243, 48, 94, 255, 24, 243, 49, 230, 74, 94, 255, 24, 243, 46, - 94, 255, 24, 224, 75, 226, 20, 94, 255, 24, 216, 254, 243, 63, 94, 255, - 24, 225, 230, 94, 255, 24, 253, 208, 242, 48, 94, 255, 24, 230, 84, 94, - 255, 24, 231, 213, 94, 255, 24, 231, 54, 94, 255, 24, 231, 55, 234, 183, - 94, 255, 24, 248, 171, 94, 255, 24, 224, 86, 94, 255, 24, 216, 254, 224, - 70, 94, 255, 24, 211, 30, 252, 48, 210, 230, 94, 255, 24, 226, 211, 94, - 255, 24, 236, 26, 94, 255, 24, 248, 78, 94, 255, 24, 210, 33, 94, 164, - 231, 148, 250, 43, 94, 225, 14, 220, 38, 94, 225, 14, 242, 1, 221, 164, - 94, 225, 14, 242, 1, 225, 243, 94, 225, 14, 242, 1, 224, 79, 94, 225, 14, - 241, 165, 94, 225, 14, 215, 177, 94, 225, 14, 221, 164, 94, 225, 14, 225, - 243, 94, 225, 14, 224, 79, 94, 225, 14, 241, 68, 94, 225, 14, 241, 69, - 242, 3, 31, 214, 3, 94, 225, 14, 224, 20, 94, 225, 14, 248, 216, 177, - 231, 176, 94, 225, 14, 231, 43, 94, 224, 144, 231, 173, 94, 225, 14, 223, - 172, 94, 224, 144, 225, 251, 94, 225, 14, 220, 23, 247, 128, 94, 225, 14, - 219, 161, 247, 128, 94, 224, 144, 219, 55, 225, 245, 94, 164, 214, 160, - 247, 128, 94, 164, 232, 114, 247, 128, 94, 224, 144, 227, 199, 242, 47, - 94, 225, 14, 224, 80, 224, 74, 94, 1, 254, 179, 94, 1, 252, 36, 94, 1, - 242, 208, 94, 1, 248, 197, 94, 1, 241, 245, 94, 1, 214, 3, 94, 1, 210, - 97, 94, 1, 241, 204, 94, 1, 216, 231, 94, 1, 210, 233, 94, 1, 40, 235, 0, - 94, 1, 235, 0, 94, 1, 233, 100, 94, 1, 40, 231, 70, 94, 1, 231, 70, 94, - 1, 40, 227, 198, 94, 1, 227, 198, 94, 1, 221, 251, 94, 1, 253, 170, 94, - 1, 40, 225, 224, 94, 1, 225, 224, 94, 1, 40, 215, 180, 94, 1, 215, 180, - 94, 1, 224, 42, 94, 1, 223, 70, 94, 1, 220, 22, 94, 1, 217, 39, 94, 27, - 211, 6, 52, 214, 3, 94, 27, 211, 6, 214, 4, 210, 233, 94, 27, 211, 6, 52, - 210, 233, 94, 224, 144, 243, 48, 94, 224, 144, 243, 46, 9, 54, 50, 9, 5, - 221, 244, 9, 244, 38, 231, 159, 9, 5, 222, 25, 9, 5, 221, 247, 254, 45, - 249, 117, 222, 195, 254, 45, 244, 12, 222, 195, 9, 223, 137, 254, 45, - 225, 186, 230, 198, 50, 254, 45, 225, 186, 216, 249, 216, 149, 50, 254, - 230, 50, 9, 249, 227, 9, 248, 158, 220, 139, 9, 225, 16, 213, 241, 50, 9, - 5, 230, 179, 9, 5, 222, 5, 254, 181, 212, 45, 9, 5, 254, 181, 253, 229, - 9, 5, 223, 170, 254, 180, 9, 5, 223, 178, 254, 161, 254, 112, 9, 5, 217, - 71, 9, 4, 125, 217, 81, 9, 4, 125, 27, 109, 2, 233, 109, 2, 211, 43, 9, - 4, 125, 210, 108, 9, 4, 244, 173, 9, 4, 248, 192, 9, 4, 234, 211, 9, 220, - 152, 9, 1, 79, 9, 215, 212, 59, 224, 144, 79, 9, 224, 16, 79, 9, 1, 234, - 215, 211, 43, 9, 1, 242, 26, 9, 1, 109, 2, 231, 233, 48, 9, 1, 109, 2, - 182, 48, 9, 1, 212, 31, 2, 182, 48, 9, 1, 109, 2, 182, 51, 9, 1, 77, 2, - 182, 48, 9, 1, 254, 179, 9, 1, 252, 62, 9, 1, 217, 9, 231, 169, 9, 1, - 217, 8, 9, 1, 216, 193, 9, 1, 235, 129, 9, 1, 242, 44, 9, 1, 234, 135, 9, - 1, 248, 203, 9, 1, 216, 203, 9, 1, 223, 98, 9, 1, 210, 108, 9, 1, 221, - 168, 9, 1, 220, 61, 9, 1, 222, 28, 9, 1, 248, 224, 9, 1, 217, 81, 9, 1, - 210, 111, 9, 1, 254, 205, 9, 1, 242, 251, 9, 1, 234, 181, 2, 113, 170, - 48, 9, 1, 234, 181, 2, 134, 170, 51, 9, 1, 244, 176, 77, 2, 235, 200, - 214, 105, 9, 1, 244, 176, 77, 2, 113, 170, 48, 9, 1, 244, 176, 77, 2, - 134, 170, 48, 9, 217, 44, 9, 1, 244, 150, 9, 1, 224, 84, 9, 1, 235, 0, 9, - 1, 233, 108, 9, 1, 231, 83, 9, 1, 228, 67, 9, 1, 241, 225, 9, 1, 212, 30, - 9, 1, 109, 231, 197, 9, 1, 211, 43, 9, 244, 171, 9, 248, 190, 9, 234, - 209, 9, 244, 173, 9, 248, 192, 9, 234, 211, 9, 220, 95, 9, 218, 46, 9, - 231, 231, 48, 9, 182, 48, 9, 182, 51, 9, 218, 66, 254, 179, 9, 235, 200, - 248, 192, 9, 164, 228, 68, 242, 225, 9, 209, 255, 9, 25, 5, 4, 214, 106, - 48, 9, 25, 5, 235, 200, 4, 214, 106, 48, 9, 25, 5, 59, 51, 9, 223, 52, - 248, 192, 9, 244, 174, 2, 113, 247, 126, 9, 212, 32, 182, 51, 254, 45, - 21, 210, 86, 254, 45, 21, 111, 254, 45, 21, 105, 254, 45, 21, 158, 254, - 45, 21, 161, 254, 45, 21, 190, 254, 45, 21, 195, 254, 45, 21, 199, 254, - 45, 21, 196, 254, 45, 21, 201, 9, 225, 185, 50, 9, 248, 91, 220, 139, 9, - 216, 147, 220, 139, 9, 244, 89, 225, 12, 218, 158, 9, 1, 247, 127, 252, - 62, 9, 1, 247, 127, 224, 84, 9, 1, 218, 24, 254, 179, 9, 1, 109, 212, 46, - 9, 1, 109, 2, 212, 32, 182, 48, 9, 1, 109, 2, 212, 32, 182, 51, 9, 1, - 125, 242, 26, 9, 1, 125, 182, 254, 179, 9, 1, 125, 182, 212, 30, 9, 1, - 104, 2, 182, 48, 9, 1, 125, 182, 211, 43, 9, 1, 215, 149, 9, 1, 215, 147, - 9, 1, 252, 72, 9, 1, 217, 9, 2, 222, 236, 9, 1, 217, 9, 2, 134, 170, 72, - 246, 111, 9, 1, 225, 208, 9, 1, 217, 6, 9, 1, 252, 60, 9, 1, 122, 2, 182, - 48, 9, 1, 122, 2, 113, 170, 67, 48, 9, 1, 227, 157, 9, 1, 246, 51, 9, 1, - 122, 2, 134, 170, 48, 9, 1, 217, 27, 9, 1, 217, 25, 9, 1, 248, 138, 9, 1, - 248, 204, 2, 222, 236, 9, 1, 248, 204, 2, 59, 51, 9, 1, 248, 204, 2, 59, - 252, 51, 22, 4, 217, 81, 9, 1, 248, 209, 9, 1, 248, 140, 9, 1, 246, 78, - 9, 1, 248, 204, 2, 134, 170, 72, 246, 111, 9, 1, 248, 204, 2, 244, 19, - 170, 48, 9, 1, 222, 173, 9, 1, 223, 99, 2, 4, 214, 105, 9, 1, 223, 99, 2, - 222, 236, 9, 1, 223, 99, 2, 59, 51, 9, 1, 223, 99, 2, 4, 214, 106, 51, 9, - 1, 223, 99, 2, 59, 252, 51, 22, 59, 48, 9, 1, 223, 99, 2, 113, 170, 48, - 9, 1, 235, 126, 9, 1, 223, 99, 2, 244, 19, 170, 48, 9, 1, 221, 169, 2, - 59, 252, 51, 22, 59, 48, 9, 1, 221, 169, 2, 134, 170, 51, 9, 1, 221, 169, - 2, 134, 170, 252, 51, 22, 134, 170, 48, 9, 1, 222, 29, 2, 113, 170, 51, - 9, 1, 222, 29, 2, 134, 170, 48, 9, 1, 217, 82, 2, 134, 170, 48, 9, 1, - 254, 206, 2, 134, 170, 48, 9, 1, 247, 127, 244, 150, 9, 1, 244, 151, 2, - 59, 230, 114, 51, 9, 1, 244, 151, 2, 59, 51, 9, 1, 213, 248, 9, 1, 244, - 151, 2, 134, 170, 51, 9, 1, 225, 206, 9, 1, 224, 85, 2, 59, 48, 9, 1, - 224, 85, 2, 134, 170, 48, 9, 1, 234, 180, 9, 1, 217, 251, 235, 0, 9, 1, - 235, 1, 2, 222, 236, 9, 1, 235, 1, 2, 59, 48, 9, 1, 229, 84, 9, 1, 235, - 1, 2, 134, 170, 51, 9, 1, 243, 129, 9, 1, 243, 130, 2, 222, 236, 9, 1, - 229, 7, 9, 1, 243, 130, 2, 113, 170, 51, 9, 1, 242, 108, 9, 1, 243, 130, - 2, 134, 170, 48, 9, 1, 233, 109, 2, 4, 214, 105, 9, 1, 233, 109, 2, 59, - 48, 9, 1, 233, 109, 2, 134, 170, 48, 9, 1, 233, 109, 2, 134, 170, 51, 9, - 1, 228, 68, 2, 59, 51, 9, 1, 228, 68, 242, 225, 9, 1, 222, 216, 9, 1, - 228, 68, 2, 222, 236, 9, 1, 228, 68, 2, 134, 170, 48, 9, 1, 241, 226, - 247, 149, 9, 1, 217, 28, 2, 59, 48, 9, 1, 241, 226, 2, 77, 48, 9, 1, 241, - 226, 242, 178, 9, 1, 241, 226, 242, 179, 2, 182, 48, 9, 1, 217, 9, 231, - 170, 242, 178, 9, 1, 212, 31, 2, 222, 236, 9, 1, 234, 79, 226, 238, 9, 1, - 226, 238, 9, 1, 69, 9, 1, 210, 212, 9, 1, 234, 79, 210, 212, 9, 1, 212, - 31, 2, 113, 170, 48, 9, 1, 213, 255, 9, 1, 244, 176, 211, 43, 9, 1, 77, - 2, 217, 78, 9, 1, 77, 2, 4, 214, 105, 9, 1, 212, 31, 2, 59, 48, 9, 1, 76, - 9, 1, 77, 2, 134, 170, 51, 9, 1, 77, 252, 140, 9, 1, 77, 252, 141, 2, - 182, 48, 9, 243, 236, 218, 131, 9, 1, 254, 252, 9, 4, 125, 27, 222, 29, - 2, 233, 109, 2, 109, 231, 197, 9, 4, 125, 27, 224, 85, 2, 233, 109, 2, - 109, 231, 197, 9, 4, 125, 66, 65, 17, 9, 4, 125, 233, 109, 254, 179, 9, - 4, 125, 235, 129, 9, 4, 125, 134, 247, 126, 9, 4, 125, 221, 168, 9, 245, - 151, 64, 253, 174, 9, 218, 154, 64, 222, 140, 245, 183, 241, 162, 9, 4, - 125, 222, 185, 210, 86, 9, 4, 125, 214, 159, 223, 118, 210, 86, 9, 4, - 125, 247, 127, 241, 243, 64, 234, 135, 9, 4, 125, 66, 53, 17, 9, 4, 121, - 221, 168, 9, 4, 125, 231, 232, 9, 4, 212, 30, 9, 4, 211, 43, 9, 4, 125, - 211, 43, 9, 4, 125, 228, 67, 9, 225, 44, 64, 222, 15, 9, 245, 160, 250, - 183, 121, 218, 131, 9, 245, 160, 250, 183, 125, 218, 131, 9, 222, 185, - 125, 218, 132, 2, 244, 112, 250, 182, 9, 4, 121, 231, 83, 9, 1, 248, 204, - 2, 235, 200, 214, 105, 9, 1, 223, 99, 2, 235, 200, 214, 105, 245, 30, - 254, 45, 21, 210, 86, 245, 30, 254, 45, 21, 111, 245, 30, 254, 45, 21, - 105, 245, 30, 254, 45, 21, 158, 245, 30, 254, 45, 21, 161, 245, 30, 254, - 45, 21, 190, 245, 30, 254, 45, 21, 195, 245, 30, 254, 45, 21, 199, 245, - 30, 254, 45, 21, 196, 245, 30, 254, 45, 21, 201, 9, 1, 220, 62, 2, 59, - 51, 9, 1, 248, 225, 2, 59, 51, 9, 1, 242, 252, 2, 59, 51, 9, 5, 219, 160, - 254, 134, 9, 5, 219, 160, 224, 238, 231, 63, 9, 1, 241, 226, 2, 235, 200, - 214, 105, 183, 245, 151, 64, 226, 18, 183, 218, 20, 243, 236, 218, 131, - 183, 218, 68, 243, 236, 218, 131, 183, 218, 20, 249, 234, 183, 218, 68, - 249, 234, 183, 203, 249, 234, 183, 249, 235, 219, 108, 233, 52, 183, 249, - 235, 219, 108, 222, 254, 183, 218, 20, 249, 235, 219, 108, 233, 52, 183, - 218, 68, 249, 235, 219, 108, 222, 254, 183, 249, 188, 183, 242, 8, 226, - 254, 183, 242, 8, 231, 41, 183, 242, 8, 253, 226, 183, 255, 30, 79, 183, - 1, 254, 183, 183, 1, 218, 24, 254, 183, 183, 1, 252, 33, 183, 1, 243, - 120, 183, 1, 243, 121, 243, 98, 183, 1, 248, 200, 183, 1, 247, 127, 248, - 201, 222, 232, 183, 1, 241, 245, 183, 1, 212, 30, 183, 1, 210, 108, 183, - 1, 241, 202, 183, 1, 216, 227, 183, 1, 216, 228, 243, 98, 183, 1, 210, - 199, 183, 1, 210, 200, 241, 245, 183, 1, 234, 231, 183, 1, 233, 107, 183, - 1, 230, 195, 183, 1, 227, 198, 183, 1, 220, 145, 183, 1, 40, 220, 145, - 183, 1, 76, 183, 1, 225, 224, 183, 1, 223, 52, 225, 224, 183, 1, 222, 26, - 183, 1, 224, 78, 183, 1, 222, 232, 183, 1, 220, 22, 183, 1, 217, 37, 183, - 1, 225, 172, 252, 20, 183, 1, 225, 172, 242, 249, 183, 1, 225, 172, 248, - 28, 183, 224, 154, 48, 183, 224, 154, 51, 183, 224, 154, 246, 125, 183, - 210, 17, 48, 183, 210, 17, 51, 183, 210, 17, 246, 125, 183, 223, 134, 48, - 183, 223, 134, 51, 183, 246, 126, 210, 24, 241, 51, 183, 246, 126, 210, - 24, 254, 113, 183, 241, 248, 48, 183, 241, 248, 51, 183, 241, 247, 246, - 125, 183, 245, 87, 48, 183, 245, 87, 51, 183, 222, 109, 183, 244, 144, - 247, 128, 183, 223, 251, 183, 222, 136, 183, 113, 67, 170, 48, 183, 113, - 67, 170, 51, 183, 134, 170, 48, 183, 134, 170, 51, 183, 226, 252, 232, - 220, 48, 183, 226, 252, 232, 220, 51, 183, 230, 61, 183, 252, 139, 183, - 1, 219, 51, 210, 80, 183, 1, 219, 51, 234, 128, 183, 1, 219, 51, 244, - 162, 9, 1, 252, 63, 2, 134, 170, 241, 1, 51, 9, 1, 252, 63, 2, 59, 252, - 51, 22, 134, 170, 48, 9, 1, 252, 63, 2, 134, 170, 225, 10, 214, 153, 51, - 9, 1, 252, 63, 2, 134, 170, 225, 10, 214, 153, 252, 51, 22, 113, 170, 48, - 9, 1, 252, 63, 2, 113, 170, 252, 51, 22, 59, 48, 9, 1, 252, 63, 2, 235, - 200, 4, 214, 106, 51, 9, 1, 252, 63, 2, 4, 214, 105, 9, 1, 122, 2, 113, - 170, 48, 9, 1, 122, 2, 134, 170, 225, 10, 214, 153, 51, 9, 1, 248, 204, - 2, 113, 170, 213, 189, 252, 51, 22, 4, 217, 81, 9, 1, 248, 204, 2, 235, - 200, 4, 214, 106, 51, 9, 1, 223, 99, 2, 91, 9, 1, 221, 169, 2, 244, 19, - 170, 48, 9, 1, 254, 206, 2, 113, 170, 48, 9, 1, 254, 206, 2, 134, 170, - 225, 10, 246, 112, 48, 9, 1, 254, 206, 2, 113, 170, 213, 189, 48, 9, 1, - 244, 151, 2, 113, 170, 51, 9, 1, 244, 151, 2, 134, 170, 225, 10, 214, - 153, 51, 9, 1, 234, 181, 2, 59, 48, 9, 1, 234, 181, 2, 134, 170, 48, 9, - 1, 234, 181, 2, 134, 170, 225, 10, 214, 153, 51, 9, 1, 66, 2, 59, 48, 9, - 1, 66, 2, 59, 51, 9, 1, 228, 68, 2, 113, 170, 51, 9, 1, 228, 68, 2, 4, - 217, 81, 9, 1, 228, 68, 2, 4, 214, 105, 9, 1, 233, 109, 2, 130, 9, 1, - 223, 99, 2, 113, 170, 213, 189, 48, 9, 1, 223, 99, 2, 182, 48, 9, 1, 221, - 169, 2, 113, 170, 213, 189, 48, 9, 1, 122, 2, 4, 9, 1, 217, 82, 51, 9, 1, - 122, 2, 4, 9, 1, 217, 82, 22, 113, 247, 126, 9, 1, 221, 169, 2, 4, 9, 1, - 217, 82, 22, 113, 247, 126, 9, 1, 223, 99, 2, 4, 9, 1, 217, 82, 22, 113, - 247, 126, 9, 1, 122, 2, 4, 9, 1, 217, 82, 48, 9, 1, 109, 2, 245, 30, 254, - 45, 21, 113, 48, 9, 1, 109, 2, 245, 30, 254, 45, 21, 134, 48, 9, 1, 244, - 176, 77, 2, 245, 30, 254, 45, 21, 113, 48, 9, 1, 244, 176, 77, 2, 245, - 30, 254, 45, 21, 134, 48, 9, 1, 244, 176, 77, 2, 245, 30, 254, 45, 21, - 244, 19, 51, 9, 1, 212, 31, 2, 245, 30, 254, 45, 21, 113, 48, 9, 1, 212, - 31, 2, 245, 30, 254, 45, 21, 134, 48, 9, 1, 77, 252, 141, 2, 245, 30, - 254, 45, 21, 113, 48, 9, 1, 77, 252, 141, 2, 245, 30, 254, 45, 21, 134, - 48, 9, 1, 122, 2, 245, 30, 254, 45, 21, 244, 19, 51, 9, 1, 221, 169, 2, - 245, 30, 254, 45, 21, 244, 19, 48, 9, 1, 221, 169, 2, 235, 200, 214, 105, - 9, 1, 235, 1, 2, 113, 170, 48, 216, 206, 1, 242, 53, 216, 206, 1, 220, - 70, 216, 206, 1, 228, 66, 216, 206, 1, 223, 187, 216, 206, 1, 252, 197, - 216, 206, 1, 233, 1, 216, 206, 1, 235, 14, 216, 206, 1, 254, 168, 216, - 206, 1, 214, 25, 216, 206, 1, 231, 82, 216, 206, 1, 244, 202, 216, 206, - 1, 248, 31, 216, 206, 1, 216, 208, 216, 206, 1, 233, 137, 216, 206, 1, - 243, 138, 216, 206, 1, 242, 184, 216, 206, 1, 221, 167, 216, 206, 1, 248, - 156, 216, 206, 1, 210, 100, 216, 206, 1, 217, 38, 216, 206, 1, 211, 103, - 216, 206, 1, 225, 237, 216, 206, 1, 235, 134, 216, 206, 1, 250, 142, 216, - 206, 1, 215, 156, 216, 206, 1, 241, 195, 216, 206, 1, 234, 137, 216, 206, - 1, 216, 207, 216, 206, 1, 210, 115, 216, 206, 1, 220, 60, 216, 206, 1, - 222, 32, 216, 206, 1, 248, 227, 216, 206, 1, 112, 216, 206, 1, 210, 23, - 216, 206, 1, 254, 202, 216, 206, 1, 242, 250, 216, 206, 1, 224, 88, 216, - 206, 1, 212, 63, 216, 206, 255, 31, 216, 206, 255, 47, 216, 206, 240, - 121, 216, 206, 245, 216, 216, 206, 214, 222, 216, 206, 226, 186, 216, - 206, 245, 224, 216, 206, 245, 24, 216, 206, 226, 251, 216, 206, 227, 3, - 216, 206, 218, 46, 216, 206, 1, 229, 230, 228, 142, 21, 210, 86, 228, - 142, 21, 111, 228, 142, 21, 105, 228, 142, 21, 158, 228, 142, 21, 161, - 228, 142, 21, 190, 228, 142, 21, 195, 228, 142, 21, 199, 228, 142, 21, - 196, 228, 142, 21, 201, 228, 142, 1, 61, 228, 142, 1, 245, 217, 228, 142, - 1, 74, 228, 142, 1, 76, 228, 142, 1, 69, 228, 142, 1, 226, 187, 228, 142, - 1, 78, 228, 142, 1, 248, 217, 228, 142, 1, 230, 30, 228, 142, 1, 252, - 199, 228, 142, 1, 191, 228, 142, 1, 217, 106, 228, 142, 1, 235, 147, 228, - 142, 1, 250, 165, 228, 142, 1, 248, 229, 228, 142, 1, 205, 228, 142, 1, - 222, 181, 228, 142, 1, 206, 228, 142, 1, 243, 86, 228, 142, 1, 244, 204, - 228, 142, 1, 176, 228, 142, 1, 233, 141, 228, 142, 1, 229, 234, 211, 223, - 228, 142, 1, 186, 228, 142, 1, 227, 169, 228, 142, 1, 198, 228, 142, 1, - 162, 228, 142, 1, 212, 65, 228, 142, 1, 192, 228, 142, 1, 227, 170, 211, - 223, 228, 142, 1, 235, 67, 235, 147, 228, 142, 1, 235, 67, 250, 165, 228, - 142, 1, 235, 67, 205, 228, 142, 38, 219, 253, 125, 216, 31, 228, 142, 38, - 219, 253, 121, 216, 31, 228, 142, 38, 219, 253, 222, 231, 216, 31, 228, - 142, 38, 200, 248, 46, 216, 31, 228, 142, 38, 200, 125, 216, 31, 228, - 142, 38, 200, 121, 216, 31, 228, 142, 38, 200, 222, 231, 216, 31, 228, - 142, 38, 229, 198, 79, 228, 142, 38, 52, 59, 48, 228, 142, 125, 138, 254, - 65, 228, 142, 121, 138, 254, 65, 228, 142, 16, 226, 188, 248, 58, 228, - 142, 16, 243, 85, 228, 142, 249, 227, 228, 142, 245, 39, 79, 228, 142, - 233, 114, 221, 254, 1, 254, 185, 221, 254, 1, 251, 236, 221, 254, 1, 243, - 119, 221, 254, 1, 248, 202, 221, 254, 1, 235, 158, 221, 254, 1, 252, 197, - 221, 254, 1, 210, 89, 221, 254, 1, 235, 166, 221, 254, 1, 216, 68, 221, - 254, 1, 210, 182, 221, 254, 1, 235, 15, 221, 254, 1, 233, 134, 221, 254, - 1, 230, 195, 221, 254, 1, 227, 198, 221, 254, 1, 219, 158, 221, 254, 1, - 236, 6, 221, 254, 1, 244, 129, 221, 254, 1, 215, 182, 221, 254, 1, 224, - 13, 221, 254, 1, 222, 232, 221, 254, 1, 220, 87, 221, 254, 1, 217, 101, - 221, 254, 164, 236, 6, 221, 254, 164, 236, 5, 221, 254, 164, 226, 247, - 221, 254, 164, 248, 215, 221, 254, 58, 1, 245, 113, 210, 182, 221, 254, - 164, 245, 113, 210, 182, 221, 254, 25, 5, 200, 76, 221, 254, 25, 5, 76, - 221, 254, 25, 5, 226, 122, 255, 82, 221, 254, 25, 5, 200, 255, 82, 221, - 254, 25, 5, 255, 82, 221, 254, 25, 5, 226, 122, 61, 221, 254, 25, 5, 200, - 61, 221, 254, 25, 5, 61, 221, 254, 58, 1, 219, 253, 61, 221, 254, 25, 5, - 219, 253, 61, 221, 254, 25, 5, 200, 69, 221, 254, 25, 5, 69, 221, 254, - 58, 1, 74, 221, 254, 25, 5, 200, 74, 221, 254, 25, 5, 74, 221, 254, 25, - 5, 78, 221, 254, 25, 5, 218, 46, 221, 254, 164, 229, 97, 221, 254, 224, - 144, 229, 97, 221, 254, 224, 144, 254, 227, 221, 254, 224, 144, 254, 122, - 221, 254, 224, 144, 252, 122, 221, 254, 224, 144, 253, 209, 221, 254, - 224, 144, 220, 10, 221, 254, 255, 30, 79, 221, 254, 224, 144, 231, 73, - 224, 48, 221, 254, 224, 144, 210, 31, 221, 254, 224, 144, 224, 48, 221, - 254, 224, 144, 210, 114, 221, 254, 224, 144, 215, 90, 221, 254, 224, 144, - 254, 17, 221, 254, 224, 144, 219, 55, 231, 150, 221, 254, 224, 144, 254, - 108, 231, 187, 1, 242, 31, 231, 187, 1, 255, 34, 231, 187, 1, 254, 225, - 231, 187, 1, 255, 8, 231, 187, 1, 254, 218, 231, 187, 1, 214, 124, 231, - 187, 1, 253, 168, 231, 187, 1, 235, 166, 231, 187, 1, 253, 206, 231, 187, - 1, 254, 190, 231, 187, 1, 254, 195, 231, 187, 1, 254, 187, 231, 187, 1, - 254, 144, 231, 187, 1, 254, 131, 231, 187, 1, 253, 245, 231, 187, 1, 236, - 6, 231, 187, 1, 254, 80, 231, 187, 1, 253, 216, 231, 187, 1, 254, 53, - 231, 187, 1, 254, 49, 231, 187, 1, 253, 239, 231, 187, 1, 253, 214, 231, - 187, 1, 246, 63, 231, 187, 1, 235, 8, 231, 187, 1, 254, 205, 231, 187, - 254, 231, 79, 231, 187, 213, 136, 79, 231, 187, 243, 60, 79, 231, 187, - 224, 143, 9, 1, 252, 63, 2, 4, 214, 106, 51, 9, 1, 151, 2, 113, 170, 48, - 9, 1, 217, 82, 2, 113, 170, 48, 9, 1, 244, 151, 2, 59, 252, 51, 22, 134, - 170, 48, 9, 1, 224, 85, 2, 59, 51, 9, 1, 233, 109, 2, 52, 130, 9, 1, 66, - 2, 134, 170, 48, 9, 1, 77, 2, 113, 170, 252, 51, 22, 182, 48, 9, 1, 77, - 2, 113, 170, 252, 51, 22, 59, 48, 9, 1, 223, 99, 2, 232, 129, 9, 1, 212, - 31, 2, 59, 211, 231, 9, 1, 222, 203, 211, 43, 9, 249, 107, 244, 173, 9, - 249, 107, 248, 192, 9, 249, 107, 234, 211, 9, 249, 107, 244, 171, 9, 249, - 107, 248, 190, 9, 249, 107, 234, 209, 9, 138, 123, 59, 48, 9, 138, 113, - 170, 48, 9, 138, 232, 130, 48, 9, 138, 123, 59, 51, 9, 138, 113, 170, 51, - 9, 138, 232, 130, 51, 9, 204, 244, 171, 9, 204, 248, 190, 9, 204, 234, - 209, 9, 4, 125, 212, 30, 9, 244, 174, 2, 222, 236, 9, 244, 174, 2, 59, - 48, 9, 234, 212, 2, 59, 51, 9, 43, 254, 2, 48, 9, 44, 254, 2, 48, 9, 43, - 254, 2, 51, 9, 44, 254, 2, 51, 9, 52, 44, 254, 2, 48, 9, 52, 44, 254, 2, - 72, 2, 247, 128, 9, 44, 254, 2, 72, 2, 247, 128, 9, 248, 193, 2, 247, - 128, 84, 5, 235, 200, 251, 7, 84, 5, 251, 7, 84, 5, 254, 83, 84, 5, 213, - 147, 84, 1, 219, 253, 61, 84, 1, 61, 84, 1, 255, 82, 84, 1, 74, 84, 1, - 236, 40, 84, 1, 69, 84, 1, 214, 118, 84, 1, 149, 153, 84, 1, 149, 156, - 84, 1, 251, 10, 76, 84, 1, 219, 253, 76, 84, 1, 76, 84, 1, 254, 210, 84, - 1, 251, 10, 78, 84, 1, 219, 253, 78, 84, 1, 78, 84, 1, 253, 200, 84, 1, - 176, 84, 1, 234, 138, 84, 1, 243, 142, 84, 1, 243, 0, 84, 1, 229, 82, 84, - 1, 251, 41, 84, 1, 250, 165, 84, 1, 235, 147, 84, 1, 235, 120, 84, 1, - 227, 169, 84, 1, 215, 157, 84, 1, 215, 145, 84, 1, 248, 143, 84, 1, 248, - 127, 84, 1, 228, 115, 84, 1, 217, 106, 84, 1, 216, 209, 84, 1, 248, 229, - 84, 1, 248, 33, 84, 1, 198, 84, 1, 228, 97, 84, 1, 191, 84, 1, 225, 150, - 84, 1, 252, 199, 84, 1, 252, 26, 84, 1, 186, 84, 1, 192, 84, 1, 205, 84, - 1, 222, 181, 84, 1, 233, 141, 84, 1, 232, 190, 84, 1, 232, 181, 84, 1, - 214, 27, 84, 1, 220, 104, 84, 1, 218, 225, 84, 1, 206, 84, 1, 162, 84, - 25, 5, 226, 238, 84, 25, 5, 226, 185, 84, 5, 227, 209, 84, 5, 253, 183, - 84, 25, 5, 255, 82, 84, 25, 5, 74, 84, 25, 5, 236, 40, 84, 25, 5, 69, 84, - 25, 5, 214, 118, 84, 25, 5, 149, 153, 84, 25, 5, 149, 222, 182, 84, 25, - 5, 251, 10, 76, 84, 25, 5, 219, 253, 76, 84, 25, 5, 76, 84, 25, 5, 254, - 210, 84, 25, 5, 251, 10, 78, 84, 25, 5, 219, 253, 78, 84, 25, 5, 78, 84, - 25, 5, 253, 200, 84, 5, 213, 152, 84, 25, 5, 224, 188, 76, 84, 25, 5, - 253, 179, 84, 226, 208, 84, 218, 113, 5, 214, 216, 84, 218, 113, 5, 254, - 85, 84, 242, 144, 255, 23, 84, 255, 12, 255, 23, 84, 25, 5, 251, 10, 200, - 76, 84, 25, 5, 214, 214, 84, 25, 5, 214, 117, 84, 1, 224, 91, 84, 1, 234, - 121, 84, 1, 242, 233, 84, 1, 210, 116, 84, 1, 248, 132, 84, 1, 223, 42, - 84, 1, 244, 204, 84, 1, 210, 168, 84, 1, 149, 222, 182, 84, 1, 149, 232, - 191, 84, 25, 5, 149, 156, 84, 25, 5, 149, 232, 191, 84, 248, 186, 84, 52, - 248, 186, 84, 21, 210, 86, 84, 21, 111, 84, 21, 105, 84, 21, 158, 84, 21, - 161, 84, 21, 190, 84, 21, 195, 84, 21, 199, 84, 21, 196, 84, 21, 201, 84, - 255, 30, 50, 84, 5, 125, 219, 19, 247, 128, 84, 1, 251, 10, 61, 84, 1, - 226, 238, 84, 1, 226, 185, 84, 1, 253, 179, 84, 1, 214, 214, 84, 1, 214, - 117, 84, 1, 210, 82, 84, 1, 114, 192, 84, 1, 243, 36, 84, 1, 235, 102, - 84, 1, 242, 187, 218, 131, 84, 1, 248, 133, 84, 1, 252, 119, 146, 5, 251, - 7, 146, 5, 254, 83, 146, 5, 213, 147, 146, 1, 61, 146, 1, 255, 82, 146, - 1, 74, 146, 1, 236, 40, 146, 1, 69, 146, 1, 214, 118, 146, 1, 149, 153, - 146, 1, 149, 156, 146, 1, 76, 146, 1, 254, 210, 146, 1, 78, 146, 1, 253, - 200, 146, 1, 176, 146, 1, 234, 138, 146, 1, 243, 142, 146, 1, 243, 0, - 146, 1, 229, 82, 146, 1, 251, 41, 146, 1, 250, 165, 146, 1, 235, 147, - 146, 1, 235, 120, 146, 1, 227, 169, 146, 1, 215, 157, 146, 1, 215, 145, - 146, 1, 248, 143, 146, 1, 248, 127, 146, 1, 228, 115, 146, 1, 217, 106, - 146, 1, 216, 209, 146, 1, 248, 229, 146, 1, 248, 33, 146, 1, 198, 146, 1, - 191, 146, 1, 225, 150, 146, 1, 252, 199, 146, 1, 252, 26, 146, 1, 186, - 146, 1, 192, 146, 1, 205, 146, 1, 233, 141, 146, 1, 220, 104, 146, 1, - 218, 225, 146, 1, 206, 146, 1, 162, 146, 5, 227, 209, 146, 5, 253, 183, - 146, 25, 5, 255, 82, 146, 25, 5, 74, 146, 25, 5, 236, 40, 146, 25, 5, 69, - 146, 25, 5, 214, 118, 146, 25, 5, 149, 153, 146, 25, 5, 149, 222, 182, - 146, 25, 5, 76, 146, 25, 5, 254, 210, 146, 25, 5, 78, 146, 25, 5, 253, - 200, 146, 5, 213, 152, 146, 1, 234, 130, 217, 106, 146, 253, 201, 233, - 29, 79, 146, 1, 222, 181, 146, 1, 223, 42, 146, 1, 210, 168, 146, 1, 149, - 222, 182, 146, 1, 149, 232, 191, 146, 25, 5, 149, 156, 146, 25, 5, 149, - 232, 191, 146, 21, 210, 86, 146, 21, 111, 146, 21, 105, 146, 21, 158, - 146, 21, 161, 146, 21, 190, 146, 21, 195, 146, 21, 199, 146, 21, 196, - 146, 21, 201, 146, 1, 223, 191, 2, 230, 229, 248, 6, 146, 1, 223, 191, 2, - 232, 114, 248, 6, 146, 222, 120, 79, 146, 222, 120, 50, 146, 249, 106, - 227, 201, 111, 146, 249, 106, 227, 201, 105, 146, 249, 106, 227, 201, - 158, 146, 249, 106, 227, 201, 161, 146, 249, 106, 227, 201, 123, 233, 22, - 216, 202, 216, 197, 248, 56, 146, 249, 106, 248, 57, 219, 121, 146, 235, - 167, 146, 243, 110, 79, 185, 5, 255, 7, 251, 251, 185, 5, 251, 251, 185, - 5, 213, 147, 185, 1, 61, 185, 1, 255, 82, 185, 1, 74, 185, 1, 236, 40, - 185, 1, 69, 185, 1, 214, 118, 185, 1, 245, 217, 185, 1, 254, 210, 185, 1, - 226, 187, 185, 1, 253, 200, 185, 1, 176, 185, 1, 234, 138, 185, 1, 243, - 142, 185, 1, 243, 0, 185, 1, 229, 82, 185, 1, 251, 41, 185, 1, 250, 165, - 185, 1, 235, 147, 185, 1, 235, 120, 185, 1, 227, 169, 185, 1, 215, 157, - 185, 1, 215, 145, 185, 1, 248, 143, 185, 1, 248, 127, 185, 1, 228, 115, - 185, 1, 217, 106, 185, 1, 216, 209, 185, 1, 248, 229, 185, 1, 248, 33, - 185, 1, 198, 185, 1, 191, 185, 1, 225, 150, 185, 1, 252, 199, 185, 1, - 252, 26, 185, 1, 186, 185, 1, 192, 185, 1, 205, 185, 1, 233, 141, 185, 1, - 232, 190, 185, 1, 214, 27, 185, 1, 220, 104, 185, 1, 206, 185, 1, 162, - 185, 5, 227, 209, 185, 25, 5, 255, 82, 185, 25, 5, 74, 185, 25, 5, 236, - 40, 185, 25, 5, 69, 185, 25, 5, 214, 118, 185, 25, 5, 245, 217, 185, 25, - 5, 254, 210, 185, 25, 5, 226, 187, 185, 25, 5, 253, 200, 185, 5, 213, - 152, 185, 5, 214, 218, 185, 1, 234, 121, 185, 1, 242, 233, 185, 1, 210, - 116, 185, 1, 222, 181, 185, 1, 244, 204, 185, 21, 210, 86, 185, 21, 111, - 185, 21, 105, 185, 21, 158, 185, 21, 161, 185, 21, 190, 185, 21, 195, - 185, 21, 199, 185, 21, 196, 185, 21, 201, 185, 216, 75, 185, 255, 6, 185, - 235, 185, 185, 214, 146, 185, 245, 189, 226, 192, 185, 5, 211, 78, 171, - 5, 251, 7, 171, 5, 254, 83, 171, 5, 213, 147, 171, 1, 61, 171, 1, 255, - 82, 171, 1, 74, 171, 1, 236, 40, 171, 1, 69, 171, 1, 214, 118, 171, 1, - 149, 153, 171, 1, 149, 156, 171, 25, 251, 10, 76, 171, 1, 76, 171, 1, - 254, 210, 171, 25, 251, 10, 78, 171, 1, 78, 171, 1, 253, 200, 171, 1, - 176, 171, 1, 234, 138, 171, 1, 243, 142, 171, 1, 243, 0, 171, 1, 229, 82, - 171, 1, 251, 41, 171, 1, 250, 165, 171, 1, 235, 147, 171, 1, 235, 120, - 171, 1, 227, 169, 171, 1, 215, 157, 171, 1, 215, 145, 171, 1, 248, 143, - 171, 1, 248, 127, 171, 1, 228, 115, 171, 1, 217, 106, 171, 1, 216, 209, - 171, 1, 248, 229, 171, 1, 248, 33, 171, 1, 198, 171, 1, 191, 171, 1, 225, - 150, 171, 1, 252, 199, 171, 1, 252, 26, 171, 1, 186, 171, 1, 192, 171, 1, - 205, 171, 1, 233, 141, 171, 1, 232, 190, 171, 1, 214, 27, 171, 1, 220, - 104, 171, 1, 218, 225, 171, 1, 206, 171, 1, 162, 171, 5, 227, 209, 171, - 5, 253, 183, 171, 25, 5, 255, 82, 171, 25, 5, 74, 171, 25, 5, 236, 40, - 171, 25, 5, 69, 171, 25, 5, 214, 118, 171, 25, 5, 149, 153, 171, 25, 5, - 149, 222, 182, 171, 25, 5, 251, 10, 76, 171, 25, 5, 76, 171, 25, 5, 254, - 210, 171, 25, 5, 251, 10, 78, 171, 25, 5, 78, 171, 25, 5, 253, 200, 171, - 5, 213, 152, 171, 226, 208, 171, 1, 149, 222, 182, 171, 1, 149, 232, 191, - 171, 25, 5, 149, 156, 171, 25, 5, 149, 232, 191, 171, 21, 210, 86, 171, - 21, 111, 171, 21, 105, 171, 21, 158, 171, 21, 161, 171, 21, 190, 171, 21, - 195, 171, 21, 199, 171, 21, 196, 171, 21, 201, 171, 255, 30, 50, 171, - 222, 120, 50, 157, 5, 251, 7, 157, 5, 254, 83, 157, 5, 213, 147, 157, 1, - 61, 157, 1, 255, 82, 157, 1, 74, 157, 1, 236, 40, 157, 1, 69, 157, 1, - 214, 118, 157, 1, 149, 153, 157, 1, 149, 156, 157, 1, 76, 157, 1, 254, - 210, 157, 1, 78, 157, 1, 253, 200, 157, 1, 176, 157, 1, 234, 138, 157, 1, - 243, 142, 157, 1, 243, 0, 157, 1, 229, 82, 157, 1, 251, 41, 157, 1, 250, - 165, 157, 1, 235, 147, 157, 1, 235, 120, 157, 1, 227, 169, 157, 1, 215, - 157, 157, 1, 215, 145, 157, 1, 248, 143, 157, 1, 248, 127, 157, 1, 228, - 115, 157, 1, 217, 106, 157, 1, 216, 209, 157, 1, 248, 229, 157, 1, 248, - 33, 157, 1, 198, 157, 1, 191, 157, 1, 225, 150, 157, 1, 252, 199, 157, 1, - 252, 26, 157, 1, 186, 157, 1, 192, 157, 1, 205, 157, 1, 233, 141, 157, 1, - 232, 190, 157, 1, 214, 27, 157, 1, 220, 104, 157, 1, 218, 225, 157, 1, - 206, 157, 1, 162, 157, 5, 227, 209, 157, 5, 253, 183, 157, 25, 5, 255, - 82, 157, 25, 5, 74, 157, 25, 5, 236, 40, 157, 25, 5, 69, 157, 25, 5, 214, - 118, 157, 25, 5, 149, 153, 157, 25, 5, 149, 222, 182, 157, 25, 5, 76, - 157, 25, 5, 254, 210, 157, 25, 5, 78, 157, 25, 5, 253, 200, 157, 5, 213, - 152, 157, 254, 211, 233, 29, 79, 157, 253, 201, 233, 29, 79, 157, 1, 222, - 181, 157, 1, 223, 42, 157, 1, 210, 168, 157, 1, 149, 222, 182, 157, 1, - 149, 232, 191, 157, 25, 5, 149, 156, 157, 25, 5, 149, 232, 191, 157, 21, - 210, 86, 157, 21, 111, 157, 21, 105, 157, 21, 158, 157, 21, 161, 157, 21, - 190, 157, 21, 195, 157, 21, 199, 157, 21, 196, 157, 21, 201, 157, 235, - 167, 157, 1, 212, 65, 157, 244, 10, 123, 224, 24, 157, 244, 10, 123, 242, - 34, 157, 244, 10, 134, 224, 22, 157, 244, 10, 123, 219, 119, 157, 244, - 10, 123, 245, 196, 157, 244, 10, 134, 219, 118, 36, 5, 254, 83, 36, 5, - 213, 147, 36, 1, 61, 36, 1, 255, 82, 36, 1, 74, 36, 1, 236, 40, 36, 1, - 69, 36, 1, 214, 118, 36, 1, 76, 36, 1, 245, 217, 36, 1, 254, 210, 36, 1, - 78, 36, 1, 226, 187, 36, 1, 253, 200, 36, 1, 176, 36, 1, 229, 82, 36, 1, - 251, 41, 36, 1, 235, 147, 36, 1, 227, 169, 36, 1, 215, 157, 36, 1, 228, - 115, 36, 1, 217, 106, 36, 1, 198, 36, 1, 228, 97, 36, 1, 191, 36, 1, 186, - 36, 1, 192, 36, 1, 205, 36, 1, 222, 181, 36, 1, 233, 141, 36, 1, 232, - 190, 36, 1, 232, 181, 36, 1, 214, 27, 36, 1, 220, 104, 36, 1, 218, 225, - 36, 1, 206, 36, 1, 162, 36, 25, 5, 255, 82, 36, 25, 5, 74, 36, 25, 5, - 236, 40, 36, 25, 5, 69, 36, 25, 5, 214, 118, 36, 25, 5, 76, 36, 25, 5, - 245, 217, 36, 25, 5, 254, 210, 36, 25, 5, 78, 36, 25, 5, 226, 187, 36, - 25, 5, 253, 200, 36, 5, 213, 152, 36, 226, 208, 36, 253, 201, 233, 29, - 79, 36, 21, 210, 86, 36, 21, 111, 36, 21, 105, 36, 21, 158, 36, 21, 161, - 36, 21, 190, 36, 21, 195, 36, 21, 199, 36, 21, 196, 36, 21, 201, 36, 54, - 216, 248, 36, 54, 123, 240, 217, 36, 54, 123, 216, 148, 36, 248, 154, 50, - 36, 230, 140, 50, 36, 211, 45, 50, 36, 248, 95, 50, 36, 249, 147, 50, 36, - 253, 246, 72, 50, 36, 222, 120, 50, 36, 54, 50, 148, 5, 251, 7, 148, 5, - 254, 83, 148, 5, 213, 147, 148, 1, 61, 148, 1, 255, 82, 148, 1, 74, 148, - 1, 236, 40, 148, 1, 69, 148, 1, 214, 118, 148, 1, 149, 153, 148, 1, 149, - 156, 148, 1, 76, 148, 1, 245, 217, 148, 1, 254, 210, 148, 1, 78, 148, 1, - 226, 187, 148, 1, 253, 200, 148, 1, 176, 148, 1, 234, 138, 148, 1, 243, - 142, 148, 1, 243, 0, 148, 1, 229, 82, 148, 1, 251, 41, 148, 1, 250, 165, - 148, 1, 235, 147, 148, 1, 235, 120, 148, 1, 227, 169, 148, 1, 215, 157, - 148, 1, 215, 145, 148, 1, 248, 143, 148, 1, 248, 127, 148, 1, 228, 115, - 148, 1, 217, 106, 148, 1, 216, 209, 148, 1, 248, 229, 148, 1, 248, 33, - 148, 1, 198, 148, 1, 191, 148, 1, 225, 150, 148, 1, 252, 199, 148, 1, - 252, 26, 148, 1, 186, 148, 1, 192, 148, 1, 205, 148, 1, 222, 181, 148, 1, - 233, 141, 148, 1, 232, 190, 148, 1, 214, 27, 148, 1, 220, 104, 148, 1, - 218, 225, 148, 1, 206, 148, 1, 162, 148, 5, 253, 183, 148, 25, 5, 255, - 82, 148, 25, 5, 74, 148, 25, 5, 236, 40, 148, 25, 5, 69, 148, 25, 5, 214, - 118, 148, 25, 5, 149, 153, 148, 25, 5, 149, 222, 182, 148, 25, 5, 76, - 148, 25, 5, 245, 217, 148, 25, 5, 254, 210, 148, 25, 5, 78, 148, 25, 5, - 226, 187, 148, 25, 5, 253, 200, 148, 5, 213, 152, 148, 233, 29, 79, 148, - 254, 211, 233, 29, 79, 148, 1, 215, 184, 148, 1, 246, 46, 148, 1, 149, - 222, 182, 148, 1, 149, 232, 191, 148, 25, 5, 149, 156, 148, 25, 5, 149, - 232, 191, 148, 21, 210, 86, 148, 21, 111, 148, 21, 105, 148, 21, 158, - 148, 21, 161, 148, 21, 190, 148, 21, 195, 148, 21, 199, 148, 21, 196, - 148, 21, 201, 148, 244, 10, 21, 210, 87, 31, 226, 241, 224, 226, 64, 161, - 148, 244, 10, 21, 123, 31, 226, 241, 224, 226, 64, 161, 148, 244, 10, 21, - 113, 31, 226, 241, 224, 226, 64, 161, 148, 244, 10, 21, 134, 31, 226, - 241, 224, 226, 64, 161, 148, 244, 10, 21, 123, 31, 245, 50, 224, 226, 64, - 161, 148, 244, 10, 21, 113, 31, 245, 50, 224, 226, 64, 161, 148, 244, 10, - 21, 134, 31, 245, 50, 224, 226, 64, 161, 148, 5, 215, 84, 165, 5, 254, - 83, 165, 5, 213, 147, 165, 1, 61, 165, 1, 255, 82, 165, 1, 74, 165, 1, - 236, 40, 165, 1, 69, 165, 1, 214, 118, 165, 1, 149, 153, 165, 1, 149, - 156, 165, 1, 76, 165, 1, 245, 217, 165, 1, 254, 210, 165, 1, 78, 165, 1, - 226, 187, 165, 1, 253, 200, 165, 1, 176, 165, 1, 234, 138, 165, 1, 243, - 142, 165, 1, 243, 0, 165, 1, 229, 82, 165, 1, 251, 41, 165, 1, 250, 165, - 165, 1, 235, 147, 165, 1, 235, 120, 165, 1, 227, 169, 165, 1, 215, 157, - 165, 1, 215, 145, 165, 1, 248, 143, 165, 1, 248, 127, 165, 1, 228, 115, - 165, 1, 217, 106, 165, 1, 216, 209, 165, 1, 248, 229, 165, 1, 248, 33, - 165, 1, 198, 165, 1, 191, 165, 1, 225, 150, 165, 1, 252, 199, 165, 1, - 252, 26, 165, 1, 186, 165, 1, 192, 165, 1, 205, 165, 1, 222, 181, 165, 1, - 233, 141, 165, 1, 232, 190, 165, 1, 214, 27, 165, 1, 220, 104, 165, 1, - 218, 225, 165, 1, 206, 165, 1, 162, 165, 5, 227, 209, 165, 5, 253, 183, - 165, 25, 5, 255, 82, 165, 25, 5, 74, 165, 25, 5, 236, 40, 165, 25, 5, 69, - 165, 25, 5, 214, 118, 165, 25, 5, 149, 153, 165, 25, 5, 149, 222, 182, - 165, 25, 5, 76, 165, 25, 5, 245, 217, 165, 25, 5, 254, 210, 165, 25, 5, - 78, 165, 25, 5, 226, 187, 165, 25, 5, 253, 200, 165, 5, 213, 152, 165, - 233, 29, 79, 165, 254, 211, 233, 29, 79, 165, 1, 244, 204, 165, 1, 149, - 222, 182, 165, 1, 149, 232, 191, 165, 25, 5, 149, 156, 165, 25, 5, 149, - 232, 191, 165, 21, 210, 86, 165, 21, 111, 165, 21, 105, 165, 21, 158, - 165, 21, 161, 165, 21, 190, 165, 21, 195, 165, 21, 199, 165, 21, 196, - 165, 21, 201, 165, 5, 235, 108, 165, 5, 214, 161, 136, 5, 254, 83, 136, - 5, 213, 147, 136, 1, 61, 136, 1, 255, 82, 136, 1, 74, 136, 1, 236, 40, - 136, 1, 69, 136, 1, 214, 118, 136, 1, 149, 153, 136, 1, 149, 156, 136, 1, - 76, 136, 1, 245, 217, 136, 1, 254, 210, 136, 1, 78, 136, 1, 226, 187, - 136, 1, 253, 200, 136, 1, 176, 136, 1, 234, 138, 136, 1, 243, 142, 136, - 1, 243, 0, 136, 1, 229, 82, 136, 1, 251, 41, 136, 1, 250, 165, 136, 1, - 235, 147, 136, 1, 235, 120, 136, 1, 227, 169, 136, 1, 215, 157, 136, 1, - 215, 145, 136, 1, 248, 143, 136, 1, 248, 127, 136, 1, 228, 115, 136, 1, - 217, 106, 136, 1, 216, 209, 136, 1, 248, 229, 136, 1, 248, 33, 136, 1, - 198, 136, 1, 228, 97, 136, 1, 191, 136, 1, 225, 150, 136, 1, 252, 199, - 136, 1, 252, 26, 136, 1, 186, 136, 1, 192, 136, 1, 205, 136, 1, 222, 181, - 136, 1, 233, 141, 136, 1, 232, 190, 136, 1, 232, 181, 136, 1, 214, 27, - 136, 1, 220, 104, 136, 1, 218, 225, 136, 1, 206, 136, 1, 162, 136, 1, - 215, 126, 136, 5, 253, 183, 136, 25, 5, 255, 82, 136, 25, 5, 74, 136, 25, - 5, 236, 40, 136, 25, 5, 69, 136, 25, 5, 214, 118, 136, 25, 5, 149, 153, - 136, 25, 5, 149, 222, 182, 136, 25, 5, 76, 136, 25, 5, 245, 217, 136, 25, - 5, 254, 210, 136, 25, 5, 78, 136, 25, 5, 226, 187, 136, 25, 5, 253, 200, - 136, 5, 213, 152, 136, 1, 59, 223, 76, 136, 253, 201, 233, 29, 79, 136, - 1, 149, 222, 182, 136, 1, 149, 232, 191, 136, 25, 5, 149, 156, 136, 25, - 5, 149, 232, 191, 136, 21, 210, 86, 136, 21, 111, 136, 21, 105, 136, 21, - 158, 136, 21, 161, 136, 21, 190, 136, 21, 195, 136, 21, 199, 136, 21, - 196, 136, 21, 201, 136, 54, 216, 248, 136, 54, 123, 240, 217, 136, 54, - 123, 216, 148, 136, 244, 10, 123, 224, 24, 136, 244, 10, 123, 242, 34, - 136, 244, 10, 134, 224, 22, 136, 248, 158, 79, 136, 1, 250, 107, 228, - 116, 136, 1, 250, 107, 230, 30, 136, 1, 250, 107, 222, 182, 136, 1, 250, - 107, 156, 136, 1, 250, 107, 232, 191, 136, 1, 250, 107, 235, 29, 175, 5, - 254, 82, 175, 5, 213, 146, 175, 1, 253, 173, 175, 1, 255, 36, 175, 1, - 254, 232, 175, 1, 254, 247, 175, 1, 235, 157, 175, 1, 236, 39, 175, 1, - 214, 110, 175, 1, 214, 112, 175, 1, 235, 180, 175, 1, 235, 181, 175, 1, - 236, 25, 175, 1, 236, 27, 175, 1, 245, 25, 175, 1, 245, 212, 175, 1, 254, - 197, 175, 1, 226, 112, 175, 1, 226, 181, 175, 1, 253, 186, 175, 1, 254, - 154, 234, 193, 175, 1, 231, 214, 234, 193, 175, 1, 254, 154, 243, 89, - 175, 1, 231, 214, 243, 89, 175, 1, 234, 235, 229, 227, 175, 1, 221, 238, - 243, 89, 175, 1, 254, 154, 250, 224, 175, 1, 231, 214, 250, 224, 175, 1, - 254, 154, 235, 133, 175, 1, 231, 214, 235, 133, 175, 1, 217, 99, 229, - 227, 175, 1, 217, 99, 221, 237, 229, 228, 175, 1, 221, 238, 235, 133, - 175, 1, 254, 154, 215, 153, 175, 1, 231, 214, 215, 153, 175, 1, 254, 154, - 248, 134, 175, 1, 231, 214, 248, 134, 175, 1, 230, 58, 229, 185, 175, 1, - 221, 238, 248, 134, 175, 1, 254, 154, 217, 31, 175, 1, 231, 214, 217, 31, - 175, 1, 254, 154, 248, 152, 175, 1, 231, 214, 248, 152, 175, 1, 248, 182, - 229, 185, 175, 1, 221, 238, 248, 152, 175, 1, 254, 154, 225, 232, 175, 1, - 231, 214, 225, 232, 175, 1, 254, 154, 252, 120, 175, 1, 231, 214, 252, - 120, 175, 1, 231, 136, 175, 1, 254, 139, 252, 120, 175, 1, 211, 51, 175, - 1, 223, 136, 175, 1, 248, 182, 233, 73, 175, 1, 214, 1, 175, 1, 217, 99, - 221, 212, 175, 1, 230, 58, 221, 212, 175, 1, 248, 182, 221, 212, 175, 1, - 241, 249, 175, 1, 230, 58, 233, 73, 175, 1, 244, 164, 175, 5, 254, 186, - 175, 25, 5, 254, 242, 175, 25, 5, 234, 161, 254, 249, 175, 25, 5, 247, - 236, 254, 249, 175, 25, 5, 234, 161, 235, 177, 175, 25, 5, 247, 236, 235, - 177, 175, 25, 5, 234, 161, 226, 92, 175, 25, 5, 247, 236, 226, 92, 175, - 25, 5, 243, 131, 175, 25, 5, 234, 21, 175, 25, 5, 247, 236, 234, 21, 175, - 25, 5, 234, 23, 248, 75, 175, 25, 5, 234, 22, 242, 54, 254, 242, 175, 25, - 5, 234, 22, 242, 54, 247, 236, 254, 242, 175, 25, 5, 234, 22, 242, 54, - 243, 88, 175, 25, 5, 243, 88, 175, 25, 5, 247, 236, 243, 131, 175, 25, 5, - 247, 236, 243, 88, 175, 224, 144, 233, 213, 168, 135, 234, 35, 234, 252, - 168, 135, 234, 112, 234, 134, 168, 135, 234, 112, 234, 105, 168, 135, - 234, 112, 234, 101, 168, 135, 234, 112, 234, 109, 168, 135, 234, 112, - 223, 157, 168, 135, 229, 10, 228, 253, 168, 135, 250, 95, 250, 155, 168, - 135, 250, 95, 250, 103, 168, 135, 250, 95, 250, 154, 168, 135, 219, 61, - 219, 60, 168, 135, 250, 95, 250, 91, 168, 135, 210, 245, 210, 252, 168, - 135, 247, 154, 250, 162, 168, 135, 216, 43, 225, 242, 168, 135, 216, 158, - 216, 201, 168, 135, 216, 158, 229, 206, 168, 135, 216, 158, 225, 114, - 168, 135, 228, 80, 229, 103, 168, 135, 247, 154, 248, 76, 168, 135, 216, - 43, 217, 56, 168, 135, 216, 158, 216, 132, 168, 135, 216, 158, 216, 205, - 168, 135, 216, 158, 216, 155, 168, 135, 228, 80, 227, 242, 168, 135, 251, - 214, 252, 172, 168, 135, 225, 20, 225, 45, 168, 135, 225, 125, 225, 116, - 168, 135, 244, 52, 244, 204, 168, 135, 225, 125, 225, 144, 168, 135, 244, - 52, 244, 181, 168, 135, 225, 125, 221, 249, 168, 135, 230, 167, 186, 168, - 135, 210, 245, 211, 79, 168, 135, 222, 214, 222, 141, 168, 135, 222, 142, - 168, 135, 232, 163, 232, 212, 168, 135, 232, 103, 168, 135, 211, 228, - 212, 61, 168, 135, 219, 61, 222, 8, 168, 135, 219, 61, 222, 116, 168, - 135, 219, 61, 218, 83, 168, 135, 241, 76, 241, 166, 168, 135, 232, 163, - 250, 76, 168, 135, 144, 254, 123, 168, 135, 241, 76, 228, 75, 168, 135, - 226, 72, 168, 135, 221, 232, 61, 168, 135, 231, 209, 242, 24, 168, 135, - 221, 232, 255, 82, 168, 135, 221, 232, 254, 144, 168, 135, 221, 232, 74, - 168, 135, 221, 232, 236, 40, 168, 135, 221, 232, 214, 214, 168, 135, 221, - 232, 214, 212, 168, 135, 221, 232, 69, 168, 135, 221, 232, 214, 118, 168, - 135, 225, 127, 168, 249, 106, 16, 252, 173, 168, 135, 221, 232, 76, 168, - 135, 221, 232, 254, 252, 168, 135, 221, 232, 78, 168, 135, 221, 232, 254, - 211, 231, 203, 168, 135, 221, 232, 254, 211, 231, 204, 168, 135, 233, - 112, 168, 135, 231, 200, 168, 135, 231, 201, 168, 135, 231, 209, 245, - 188, 168, 135, 231, 209, 216, 157, 168, 135, 231, 209, 215, 229, 168, - 135, 231, 209, 250, 143, 168, 135, 216, 199, 168, 135, 228, 210, 168, - 135, 211, 73, 168, 135, 244, 43, 168, 21, 210, 86, 168, 21, 111, 168, 21, - 105, 168, 21, 158, 168, 21, 161, 168, 21, 190, 168, 21, 195, 168, 21, - 199, 168, 21, 196, 168, 21, 201, 168, 135, 254, 119, 168, 135, 234, 110, - 209, 209, 1, 234, 34, 209, 209, 1, 234, 112, 218, 36, 209, 209, 1, 234, - 112, 217, 63, 209, 209, 1, 229, 9, 209, 209, 1, 249, 246, 209, 209, 1, - 219, 61, 217, 63, 209, 209, 1, 227, 138, 209, 209, 1, 247, 153, 209, 209, - 1, 112, 209, 209, 1, 216, 158, 218, 36, 209, 209, 1, 216, 158, 217, 63, - 209, 209, 1, 228, 79, 209, 209, 1, 251, 213, 209, 209, 1, 225, 19, 209, - 209, 1, 225, 125, 218, 36, 209, 209, 1, 244, 52, 217, 63, 209, 209, 1, - 225, 125, 217, 63, 209, 209, 1, 244, 52, 218, 36, 209, 209, 1, 230, 166, - 209, 209, 1, 210, 244, 209, 209, 1, 232, 163, 232, 212, 209, 209, 1, 232, - 163, 232, 127, 209, 209, 1, 211, 227, 209, 209, 1, 219, 61, 218, 36, 209, - 209, 1, 241, 76, 218, 36, 209, 209, 1, 78, 209, 209, 1, 241, 76, 217, 63, - 209, 209, 245, 171, 209, 209, 25, 5, 61, 209, 209, 25, 5, 231, 209, 234, - 240, 209, 209, 25, 5, 255, 82, 209, 209, 25, 5, 254, 144, 209, 209, 25, - 5, 74, 209, 209, 25, 5, 236, 40, 209, 209, 25, 5, 211, 117, 209, 209, 25, - 5, 210, 169, 209, 209, 25, 5, 69, 209, 209, 25, 5, 214, 118, 209, 209, - 25, 5, 231, 209, 234, 19, 209, 209, 220, 147, 5, 232, 162, 209, 209, 220, - 147, 5, 227, 138, 209, 209, 25, 5, 76, 209, 209, 25, 5, 245, 203, 209, - 209, 25, 5, 78, 209, 209, 25, 5, 253, 175, 209, 209, 25, 5, 254, 210, - 209, 209, 234, 35, 233, 141, 209, 209, 138, 231, 209, 245, 188, 209, 209, - 138, 231, 209, 216, 157, 209, 209, 138, 231, 209, 216, 118, 209, 209, - 138, 231, 209, 250, 231, 209, 209, 251, 12, 79, 209, 209, 228, 219, 209, - 209, 21, 210, 86, 209, 209, 21, 111, 209, 209, 21, 105, 209, 209, 21, - 158, 209, 209, 21, 161, 209, 209, 21, 190, 209, 209, 21, 195, 209, 209, - 21, 199, 209, 209, 21, 196, 209, 209, 21, 201, 209, 209, 241, 76, 228, - 79, 209, 209, 241, 76, 230, 166, 209, 209, 1, 234, 113, 242, 181, 209, - 209, 1, 234, 113, 227, 138, 63, 3, 226, 208, 63, 164, 242, 122, 211, 0, - 230, 253, 215, 190, 61, 63, 164, 242, 122, 211, 0, 230, 253, 255, 168, - 222, 218, 252, 85, 186, 63, 164, 242, 122, 211, 0, 230, 253, 255, 168, - 242, 122, 215, 174, 186, 63, 164, 65, 211, 0, 230, 253, 231, 98, 186, 63, - 164, 250, 4, 211, 0, 230, 253, 220, 111, 186, 63, 164, 250, 247, 211, 0, - 230, 253, 225, 115, 220, 98, 186, 63, 164, 211, 0, 230, 253, 215, 174, - 220, 98, 186, 63, 164, 221, 210, 220, 97, 63, 164, 251, 136, 211, 0, 230, - 252, 63, 164, 251, 231, 220, 5, 211, 0, 230, 252, 63, 164, 235, 204, 215, - 173, 63, 164, 248, 69, 215, 174, 251, 135, 63, 164, 220, 97, 63, 164, - 227, 143, 220, 97, 63, 164, 215, 174, 220, 97, 63, 164, 227, 143, 215, - 174, 220, 97, 63, 164, 222, 239, 250, 130, 218, 238, 220, 97, 63, 164, - 223, 45, 242, 153, 220, 97, 63, 164, 250, 247, 255, 172, 222, 146, 231, - 97, 200, 251, 15, 63, 164, 242, 122, 215, 173, 63, 232, 150, 5, 250, 163, - 222, 145, 63, 232, 150, 5, 233, 2, 222, 145, 63, 253, 220, 5, 220, 107, - 243, 72, 255, 173, 222, 145, 63, 253, 220, 5, 255, 170, 191, 63, 253, - 220, 5, 221, 184, 215, 169, 63, 5, 223, 133, 247, 167, 243, 71, 63, 5, - 223, 133, 247, 167, 242, 183, 63, 5, 223, 133, 247, 167, 242, 123, 63, 5, - 223, 133, 229, 224, 243, 71, 63, 5, 223, 133, 229, 224, 242, 183, 63, 5, - 223, 133, 247, 167, 223, 133, 229, 223, 63, 21, 210, 86, 63, 21, 111, 63, - 21, 105, 63, 21, 158, 63, 21, 161, 63, 21, 190, 63, 21, 195, 63, 21, 199, - 63, 21, 196, 63, 21, 201, 63, 21, 163, 111, 63, 21, 163, 105, 63, 21, - 163, 158, 63, 21, 163, 161, 63, 21, 163, 190, 63, 21, 163, 195, 63, 21, - 163, 199, 63, 21, 163, 196, 63, 21, 163, 201, 63, 21, 163, 210, 86, 63, - 164, 251, 138, 222, 145, 63, 164, 229, 73, 251, 76, 227, 153, 210, 25, - 63, 164, 250, 247, 255, 172, 222, 146, 251, 77, 230, 207, 251, 15, 63, - 164, 229, 73, 251, 76, 220, 108, 222, 145, 63, 164, 250, 140, 230, 252, - 63, 164, 215, 185, 255, 169, 63, 164, 242, 107, 222, 146, 242, 70, 63, - 164, 242, 107, 222, 146, 242, 76, 63, 164, 254, 124, 234, 129, 242, 70, - 63, 164, 254, 124, 234, 129, 242, 76, 63, 5, 211, 65, 215, 172, 63, 5, - 231, 172, 215, 172, 63, 1, 176, 63, 1, 234, 138, 63, 1, 243, 142, 63, 1, - 243, 0, 63, 1, 229, 82, 63, 1, 251, 41, 63, 1, 250, 165, 63, 1, 235, 147, - 63, 1, 227, 169, 63, 1, 215, 157, 63, 1, 215, 145, 63, 1, 248, 143, 63, - 1, 248, 127, 63, 1, 228, 115, 63, 1, 217, 106, 63, 1, 216, 209, 63, 1, - 248, 229, 63, 1, 248, 33, 63, 1, 198, 63, 1, 191, 63, 1, 225, 150, 63, 1, - 252, 199, 63, 1, 252, 26, 63, 1, 186, 63, 1, 215, 184, 63, 1, 215, 176, - 63, 1, 246, 46, 63, 1, 246, 41, 63, 1, 212, 65, 63, 1, 210, 82, 63, 1, - 210, 116, 63, 1, 255, 175, 63, 1, 192, 63, 1, 205, 63, 1, 233, 141, 63, - 1, 220, 104, 63, 1, 218, 225, 63, 1, 206, 63, 1, 162, 63, 1, 61, 63, 1, - 233, 237, 63, 1, 244, 85, 205, 63, 1, 234, 52, 63, 1, 222, 181, 63, 25, - 5, 255, 82, 63, 25, 5, 74, 63, 25, 5, 236, 40, 63, 25, 5, 69, 63, 25, 5, - 214, 118, 63, 25, 5, 149, 153, 63, 25, 5, 149, 222, 182, 63, 25, 5, 149, - 156, 63, 25, 5, 149, 232, 191, 63, 25, 5, 76, 63, 25, 5, 245, 217, 63, - 25, 5, 78, 63, 25, 5, 226, 187, 63, 5, 222, 224, 218, 85, 229, 83, 222, - 213, 63, 5, 222, 218, 252, 84, 63, 25, 5, 223, 52, 74, 63, 25, 5, 223, - 52, 236, 40, 63, 5, 227, 153, 210, 26, 229, 231, 248, 229, 63, 5, 219, - 73, 233, 66, 63, 164, 242, 36, 63, 164, 226, 61, 63, 5, 233, 69, 222, - 145, 63, 5, 211, 70, 222, 145, 63, 5, 233, 70, 215, 185, 251, 15, 63, 5, - 231, 100, 251, 15, 63, 5, 242, 126, 251, 16, 223, 43, 63, 5, 242, 126, - 231, 90, 223, 43, 63, 5, 235, 200, 231, 100, 251, 15, 63, 218, 74, 5, - 233, 70, 215, 185, 251, 15, 63, 218, 74, 5, 231, 100, 251, 15, 63, 218, - 74, 5, 235, 200, 231, 100, 251, 15, 63, 218, 74, 1, 176, 63, 218, 74, 1, - 234, 138, 63, 218, 74, 1, 243, 142, 63, 218, 74, 1, 243, 0, 63, 218, 74, - 1, 229, 82, 63, 218, 74, 1, 251, 41, 63, 218, 74, 1, 250, 165, 63, 218, - 74, 1, 235, 147, 63, 218, 74, 1, 227, 169, 63, 218, 74, 1, 215, 157, 63, - 218, 74, 1, 215, 145, 63, 218, 74, 1, 248, 143, 63, 218, 74, 1, 248, 127, - 63, 218, 74, 1, 228, 115, 63, 218, 74, 1, 217, 106, 63, 218, 74, 1, 216, - 209, 63, 218, 74, 1, 248, 229, 63, 218, 74, 1, 248, 33, 63, 218, 74, 1, - 198, 63, 218, 74, 1, 191, 63, 218, 74, 1, 225, 150, 63, 218, 74, 1, 252, - 199, 63, 218, 74, 1, 252, 26, 63, 218, 74, 1, 186, 63, 218, 74, 1, 215, - 184, 63, 218, 74, 1, 215, 176, 63, 218, 74, 1, 246, 46, 63, 218, 74, 1, - 246, 41, 63, 218, 74, 1, 212, 65, 63, 218, 74, 1, 210, 82, 63, 218, 74, - 1, 210, 116, 63, 218, 74, 1, 255, 175, 63, 218, 74, 1, 192, 63, 218, 74, - 1, 205, 63, 218, 74, 1, 233, 141, 63, 218, 74, 1, 220, 104, 63, 218, 74, - 1, 218, 225, 63, 218, 74, 1, 206, 63, 218, 74, 1, 162, 63, 218, 74, 1, - 61, 63, 218, 74, 1, 233, 237, 63, 218, 74, 1, 244, 85, 212, 65, 63, 218, - 74, 1, 244, 85, 192, 63, 218, 74, 1, 244, 85, 205, 63, 233, 224, 222, - 143, 234, 138, 63, 233, 224, 222, 143, 234, 139, 251, 77, 230, 207, 251, - 15, 63, 251, 4, 5, 114, 252, 78, 63, 251, 4, 5, 193, 252, 78, 63, 251, 4, - 5, 251, 5, 217, 21, 63, 251, 4, 5, 221, 209, 255, 174, 63, 16, 246, 99, - 251, 133, 63, 16, 223, 132, 222, 225, 63, 16, 226, 81, 243, 70, 63, 16, - 223, 132, 222, 226, 223, 45, 242, 152, 63, 16, 225, 115, 191, 63, 16, - 228, 64, 251, 133, 63, 16, 228, 64, 251, 134, 227, 143, 255, 171, 63, 16, - 228, 64, 251, 134, 242, 124, 255, 171, 63, 16, 228, 64, 251, 134, 251, - 77, 255, 171, 63, 5, 223, 133, 229, 224, 223, 133, 247, 166, 63, 5, 223, - 133, 229, 224, 242, 123, 63, 164, 251, 137, 220, 5, 242, 222, 230, 253, - 223, 44, 63, 164, 230, 168, 211, 0, 242, 222, 230, 253, 223, 44, 63, 164, - 227, 143, 215, 173, 63, 164, 65, 251, 160, 222, 215, 211, 0, 230, 253, - 231, 98, 186, 63, 164, 250, 4, 251, 160, 222, 215, 211, 0, 230, 253, 220, - 111, 186, 222, 253, 218, 0, 50, 233, 51, 218, 0, 50, 222, 253, 218, 0, 5, - 2, 247, 126, 233, 51, 218, 0, 5, 2, 247, 126, 63, 164, 233, 61, 231, 101, - 222, 145, 63, 164, 215, 251, 231, 101, 222, 145, 68, 1, 176, 68, 1, 234, - 138, 68, 1, 243, 142, 68, 1, 243, 0, 68, 1, 229, 82, 68, 1, 251, 41, 68, - 1, 250, 165, 68, 1, 235, 147, 68, 1, 235, 120, 68, 1, 227, 169, 68, 1, - 228, 81, 68, 1, 215, 157, 68, 1, 215, 145, 68, 1, 248, 143, 68, 1, 248, - 127, 68, 1, 228, 115, 68, 1, 217, 106, 68, 1, 216, 209, 68, 1, 248, 229, - 68, 1, 248, 33, 68, 1, 198, 68, 1, 191, 68, 1, 225, 150, 68, 1, 252, 199, - 68, 1, 252, 26, 68, 1, 186, 68, 1, 192, 68, 1, 205, 68, 1, 233, 141, 68, - 1, 212, 65, 68, 1, 206, 68, 1, 162, 68, 1, 232, 190, 68, 1, 61, 68, 1, - 220, 88, 61, 68, 1, 74, 68, 1, 236, 40, 68, 1, 69, 68, 1, 214, 118, 68, - 1, 76, 68, 1, 230, 156, 76, 68, 1, 78, 68, 1, 253, 200, 68, 25, 5, 217, - 65, 255, 82, 68, 25, 5, 255, 82, 68, 25, 5, 74, 68, 25, 5, 236, 40, 68, - 25, 5, 69, 68, 25, 5, 214, 118, 68, 25, 5, 76, 68, 25, 5, 254, 210, 68, - 25, 5, 230, 156, 236, 40, 68, 25, 5, 230, 156, 78, 68, 25, 5, 160, 48, - 68, 5, 254, 83, 68, 5, 59, 51, 68, 5, 213, 147, 68, 5, 213, 152, 68, 5, - 253, 243, 68, 117, 5, 147, 192, 68, 117, 5, 147, 205, 68, 117, 5, 147, - 212, 65, 68, 117, 5, 147, 162, 68, 1, 242, 139, 206, 68, 21, 210, 86, 68, - 21, 111, 68, 21, 105, 68, 21, 158, 68, 21, 161, 68, 21, 190, 68, 21, 195, - 68, 21, 199, 68, 21, 196, 68, 21, 201, 68, 5, 232, 198, 221, 174, 68, 5, - 221, 174, 68, 16, 232, 159, 68, 16, 249, 221, 68, 16, 254, 229, 68, 16, - 243, 55, 68, 1, 220, 104, 68, 1, 218, 225, 68, 1, 149, 153, 68, 1, 149, - 222, 182, 68, 1, 149, 156, 68, 1, 149, 232, 191, 68, 25, 5, 149, 153, 68, - 25, 5, 149, 222, 182, 68, 25, 5, 149, 156, 68, 25, 5, 149, 232, 191, 68, - 1, 230, 156, 229, 82, 68, 1, 230, 156, 235, 120, 68, 1, 230, 156, 252, - 119, 68, 1, 230, 156, 252, 114, 68, 117, 5, 230, 156, 147, 198, 68, 117, - 5, 230, 156, 147, 186, 68, 117, 5, 230, 156, 147, 233, 141, 68, 1, 220, - 110, 234, 219, 220, 104, 68, 25, 5, 220, 110, 234, 219, 245, 63, 68, 138, - 164, 220, 110, 234, 219, 241, 254, 68, 138, 164, 220, 110, 234, 219, 234, - 189, 225, 124, 68, 1, 212, 7, 224, 111, 234, 219, 216, 209, 68, 1, 212, - 7, 224, 111, 234, 219, 224, 117, 68, 25, 5, 212, 7, 224, 111, 234, 219, - 245, 63, 68, 25, 5, 212, 7, 224, 111, 234, 219, 214, 214, 68, 5, 212, 7, - 224, 111, 234, 219, 216, 30, 68, 5, 212, 7, 224, 111, 234, 219, 216, 29, - 68, 5, 212, 7, 224, 111, 234, 219, 216, 28, 68, 5, 212, 7, 224, 111, 234, - 219, 216, 27, 68, 5, 212, 7, 224, 111, 234, 219, 216, 26, 68, 1, 245, - 227, 224, 111, 234, 219, 228, 115, 68, 1, 245, 227, 224, 111, 234, 219, - 210, 176, 68, 1, 245, 227, 224, 111, 234, 219, 242, 224, 68, 25, 5, 243, - 66, 234, 219, 74, 68, 25, 5, 234, 194, 226, 238, 68, 25, 5, 234, 194, 69, - 68, 25, 5, 234, 194, 245, 217, 68, 1, 220, 88, 176, 68, 1, 220, 88, 234, - 138, 68, 1, 220, 88, 243, 142, 68, 1, 220, 88, 251, 41, 68, 1, 220, 88, - 210, 116, 68, 1, 220, 88, 227, 169, 68, 1, 220, 88, 248, 229, 68, 1, 220, - 88, 198, 68, 1, 220, 88, 225, 150, 68, 1, 220, 88, 244, 204, 68, 1, 220, - 88, 252, 199, 68, 1, 220, 88, 216, 209, 68, 1, 220, 88, 162, 68, 117, 5, - 220, 88, 147, 212, 65, 68, 25, 5, 220, 88, 255, 82, 68, 25, 5, 220, 88, - 76, 68, 25, 5, 220, 88, 160, 48, 68, 25, 5, 220, 88, 40, 211, 117, 68, 5, - 220, 88, 216, 29, 68, 5, 220, 88, 216, 28, 68, 5, 220, 88, 216, 26, 68, - 5, 220, 88, 216, 25, 68, 5, 220, 88, 249, 160, 216, 29, 68, 5, 220, 88, - 249, 160, 216, 28, 68, 5, 220, 88, 249, 160, 245, 161, 216, 31, 68, 1, - 222, 130, 226, 67, 244, 204, 68, 5, 222, 130, 226, 67, 216, 26, 68, 220, - 88, 21, 210, 86, 68, 220, 88, 21, 111, 68, 220, 88, 21, 105, 68, 220, 88, - 21, 158, 68, 220, 88, 21, 161, 68, 220, 88, 21, 190, 68, 220, 88, 21, - 195, 68, 220, 88, 21, 199, 68, 220, 88, 21, 196, 68, 220, 88, 21, 201, - 68, 5, 234, 132, 216, 30, 68, 5, 234, 132, 216, 28, 68, 25, 5, 254, 199, - 61, 68, 25, 5, 254, 199, 254, 210, 68, 16, 220, 88, 111, 68, 16, 220, 88, - 245, 38, 98, 6, 1, 254, 131, 98, 6, 1, 252, 160, 98, 6, 1, 243, 113, 98, - 6, 1, 247, 136, 98, 6, 1, 245, 158, 98, 6, 1, 213, 160, 98, 6, 1, 210, - 89, 98, 6, 1, 217, 61, 98, 6, 1, 236, 6, 98, 6, 1, 234, 240, 98, 6, 1, - 233, 87, 98, 6, 1, 231, 190, 98, 6, 1, 229, 200, 98, 6, 1, 226, 200, 98, - 6, 1, 226, 21, 98, 6, 1, 210, 78, 98, 6, 1, 223, 174, 98, 6, 1, 221, 245, - 98, 6, 1, 217, 51, 98, 6, 1, 214, 190, 98, 6, 1, 225, 143, 98, 6, 1, 234, - 127, 98, 6, 1, 242, 248, 98, 6, 1, 224, 76, 98, 6, 1, 220, 22, 98, 6, 1, - 250, 105, 98, 6, 1, 251, 15, 98, 6, 1, 235, 106, 98, 6, 1, 250, 48, 98, - 6, 1, 250, 151, 98, 6, 1, 211, 163, 98, 6, 1, 235, 117, 98, 6, 1, 242, - 50, 98, 6, 1, 241, 245, 98, 6, 1, 241, 182, 98, 6, 1, 212, 22, 98, 6, 1, - 242, 11, 98, 6, 1, 241, 72, 98, 6, 1, 210, 246, 98, 6, 1, 254, 241, 98, - 1, 254, 131, 98, 1, 252, 160, 98, 1, 243, 113, 98, 1, 247, 136, 98, 1, - 245, 158, 98, 1, 213, 160, 98, 1, 210, 89, 98, 1, 217, 61, 98, 1, 236, 6, - 98, 1, 234, 240, 98, 1, 233, 87, 98, 1, 231, 190, 98, 1, 229, 200, 98, 1, - 226, 200, 98, 1, 226, 21, 98, 1, 210, 78, 98, 1, 223, 174, 98, 1, 221, - 245, 98, 1, 217, 51, 98, 1, 214, 190, 98, 1, 225, 143, 98, 1, 234, 127, - 98, 1, 242, 248, 98, 1, 224, 76, 98, 1, 220, 22, 98, 1, 250, 105, 98, 1, - 251, 15, 98, 1, 235, 106, 98, 1, 250, 48, 98, 1, 250, 151, 98, 1, 211, - 163, 98, 1, 235, 117, 98, 1, 242, 50, 98, 1, 241, 245, 98, 1, 241, 182, - 98, 1, 212, 22, 98, 1, 242, 11, 98, 1, 241, 72, 98, 1, 244, 129, 98, 1, - 210, 246, 98, 1, 245, 173, 98, 1, 215, 94, 243, 113, 98, 1, 254, 205, 98, - 226, 19, 220, 139, 58, 1, 98, 229, 200, 98, 1, 254, 241, 98, 1, 242, 10, - 50, 98, 1, 233, 133, 50, 24, 100, 234, 64, 24, 100, 218, 217, 24, 100, - 228, 231, 24, 100, 216, 102, 24, 100, 218, 206, 24, 100, 223, 29, 24, - 100, 230, 222, 24, 100, 225, 98, 24, 100, 218, 214, 24, 100, 219, 150, - 24, 100, 218, 211, 24, 100, 236, 63, 24, 100, 250, 54, 24, 100, 218, 221, - 24, 100, 250, 114, 24, 100, 234, 116, 24, 100, 216, 174, 24, 100, 225, - 134, 24, 100, 241, 179, 24, 100, 228, 227, 24, 100, 218, 215, 24, 100, - 228, 221, 24, 100, 228, 225, 24, 100, 216, 99, 24, 100, 223, 17, 24, 100, - 218, 213, 24, 100, 223, 27, 24, 100, 234, 224, 24, 100, 230, 215, 24, - 100, 234, 227, 24, 100, 225, 93, 24, 100, 225, 91, 24, 100, 225, 79, 24, - 100, 225, 87, 24, 100, 225, 85, 24, 100, 225, 82, 24, 100, 225, 84, 24, - 100, 225, 81, 24, 100, 225, 86, 24, 100, 225, 96, 24, 100, 225, 97, 24, - 100, 225, 80, 24, 100, 225, 90, 24, 100, 234, 225, 24, 100, 234, 223, 24, - 100, 219, 143, 24, 100, 219, 141, 24, 100, 219, 133, 24, 100, 219, 136, - 24, 100, 219, 142, 24, 100, 219, 138, 24, 100, 219, 137, 24, 100, 219, - 135, 24, 100, 219, 146, 24, 100, 219, 148, 24, 100, 219, 149, 24, 100, - 219, 144, 24, 100, 219, 134, 24, 100, 219, 139, 24, 100, 219, 147, 24, - 100, 250, 98, 24, 100, 250, 96, 24, 100, 250, 176, 24, 100, 250, 174, 24, - 100, 226, 36, 24, 100, 236, 58, 24, 100, 236, 49, 24, 100, 236, 57, 24, - 100, 236, 54, 24, 100, 236, 52, 24, 100, 236, 56, 24, 100, 218, 218, 24, - 100, 236, 61, 24, 100, 236, 62, 24, 100, 236, 50, 24, 100, 236, 55, 24, - 100, 211, 26, 24, 100, 250, 53, 24, 100, 250, 99, 24, 100, 250, 97, 24, - 100, 250, 177, 24, 100, 250, 175, 24, 100, 250, 112, 24, 100, 250, 113, - 24, 100, 250, 100, 24, 100, 250, 178, 24, 100, 225, 132, 24, 100, 234, - 226, 24, 100, 218, 219, 24, 100, 211, 32, 24, 100, 234, 55, 24, 100, 228, - 223, 24, 100, 228, 229, 24, 100, 228, 228, 24, 100, 216, 96, 24, 100, - 244, 111, 24, 143, 244, 111, 24, 143, 61, 24, 143, 254, 252, 24, 143, - 192, 24, 143, 211, 92, 24, 143, 245, 125, 24, 143, 76, 24, 143, 211, 36, - 24, 143, 211, 47, 24, 143, 78, 24, 143, 212, 65, 24, 143, 212, 62, 24, - 143, 226, 238, 24, 143, 210, 244, 24, 143, 69, 24, 143, 212, 11, 24, 143, - 212, 22, 24, 143, 211, 250, 24, 143, 210, 212, 24, 143, 245, 63, 24, 143, - 211, 8, 24, 143, 74, 24, 143, 255, 166, 24, 143, 255, 165, 24, 143, 211, - 106, 24, 143, 211, 104, 24, 143, 245, 123, 24, 143, 245, 122, 24, 143, - 245, 124, 24, 143, 211, 35, 24, 143, 211, 34, 24, 143, 227, 88, 24, 143, - 227, 89, 24, 143, 227, 82, 24, 143, 227, 87, 24, 143, 227, 85, 24, 143, - 210, 238, 24, 143, 210, 237, 24, 143, 210, 236, 24, 143, 210, 239, 24, - 143, 210, 240, 24, 143, 215, 30, 24, 143, 215, 29, 24, 143, 215, 27, 24, - 143, 215, 24, 24, 143, 215, 25, 24, 143, 210, 211, 24, 143, 210, 208, 24, - 143, 210, 209, 24, 143, 210, 203, 24, 143, 210, 204, 24, 143, 210, 205, - 24, 143, 210, 207, 24, 143, 245, 57, 24, 143, 245, 59, 24, 143, 211, 7, - 24, 143, 240, 160, 24, 143, 240, 152, 24, 143, 240, 155, 24, 143, 240, - 153, 24, 143, 240, 157, 24, 143, 240, 159, 24, 143, 254, 42, 24, 143, - 254, 39, 24, 143, 254, 37, 24, 143, 254, 38, 24, 143, 218, 222, 24, 143, - 255, 167, 24, 143, 211, 105, 24, 143, 211, 33, 24, 143, 227, 84, 24, 143, - 227, 83, 24, 90, 234, 64, 24, 90, 218, 217, 24, 90, 234, 57, 24, 90, 228, - 231, 24, 90, 228, 229, 24, 90, 228, 228, 24, 90, 216, 102, 24, 90, 223, - 29, 24, 90, 223, 24, 24, 90, 223, 21, 24, 90, 223, 14, 24, 90, 223, 9, - 24, 90, 223, 4, 24, 90, 223, 15, 24, 90, 223, 27, 24, 90, 230, 222, 24, - 90, 225, 98, 24, 90, 225, 87, 24, 90, 219, 150, 24, 90, 218, 211, 24, 90, - 236, 63, 24, 90, 250, 54, 24, 90, 250, 114, 24, 90, 234, 116, 24, 90, - 216, 174, 24, 90, 225, 134, 24, 90, 241, 179, 24, 90, 234, 58, 24, 90, - 234, 56, 24, 90, 228, 227, 24, 90, 228, 221, 24, 90, 228, 223, 24, 90, - 228, 226, 24, 90, 228, 222, 24, 90, 216, 99, 24, 90, 216, 96, 24, 90, - 223, 22, 24, 90, 223, 17, 24, 90, 223, 3, 24, 90, 223, 2, 24, 90, 218, - 213, 24, 90, 223, 19, 24, 90, 223, 18, 24, 90, 223, 11, 24, 90, 223, 13, - 24, 90, 223, 26, 24, 90, 223, 6, 24, 90, 223, 16, 24, 90, 223, 25, 24, - 90, 223, 1, 24, 90, 230, 218, 24, 90, 230, 213, 24, 90, 230, 215, 24, 90, - 230, 212, 24, 90, 230, 210, 24, 90, 230, 216, 24, 90, 230, 221, 24, 90, - 230, 219, 24, 90, 234, 227, 24, 90, 225, 89, 24, 90, 225, 90, 24, 90, - 225, 95, 24, 90, 234, 225, 24, 90, 219, 143, 24, 90, 219, 133, 24, 90, - 219, 136, 24, 90, 219, 138, 24, 90, 226, 36, 24, 90, 236, 58, 24, 90, - 236, 51, 24, 90, 218, 218, 24, 90, 236, 59, 24, 90, 211, 26, 24, 90, 211, - 22, 24, 90, 211, 23, 24, 90, 225, 132, 24, 90, 234, 226, 24, 90, 241, - 177, 24, 90, 241, 175, 24, 90, 241, 178, 24, 90, 241, 176, 24, 90, 211, - 32, 24, 90, 234, 60, 24, 90, 234, 59, 24, 90, 234, 63, 24, 90, 234, 61, - 24, 90, 234, 62, 24, 90, 218, 215, 29, 3, 162, 29, 3, 240, 229, 29, 3, - 241, 187, 29, 3, 242, 53, 29, 3, 241, 227, 29, 3, 241, 245, 29, 3, 241, - 75, 29, 3, 241, 74, 29, 3, 233, 141, 29, 3, 232, 103, 29, 3, 232, 247, - 29, 3, 233, 140, 29, 3, 233, 56, 29, 3, 233, 64, 29, 3, 232, 162, 29, 3, - 232, 75, 29, 3, 241, 196, 29, 3, 241, 190, 29, 3, 241, 192, 29, 3, 241, - 195, 29, 3, 241, 193, 29, 3, 241, 194, 29, 3, 241, 191, 29, 3, 241, 189, - 29, 3, 186, 29, 3, 230, 107, 29, 3, 230, 235, 29, 3, 231, 242, 29, 3, - 231, 85, 29, 3, 231, 96, 29, 3, 230, 166, 29, 3, 230, 47, 29, 3, 217, - 164, 29, 3, 217, 158, 29, 3, 217, 160, 29, 3, 217, 163, 29, 3, 217, 161, - 29, 3, 217, 162, 29, 3, 217, 159, 29, 3, 217, 157, 29, 3, 205, 29, 3, - 222, 142, 29, 3, 223, 38, 29, 3, 223, 187, 29, 3, 223, 111, 29, 3, 223, - 131, 29, 3, 222, 213, 29, 3, 222, 111, 29, 3, 206, 29, 3, 218, 84, 29, 3, - 219, 193, 29, 3, 222, 33, 29, 3, 221, 172, 29, 3, 221, 183, 29, 3, 219, - 60, 29, 3, 217, 254, 29, 3, 220, 104, 29, 3, 219, 227, 29, 3, 220, 34, - 29, 3, 220, 100, 29, 3, 220, 63, 29, 3, 220, 65, 29, 3, 220, 9, 29, 3, - 219, 210, 29, 3, 224, 91, 29, 3, 224, 33, 29, 3, 224, 56, 29, 3, 224, 90, - 29, 3, 224, 71, 29, 3, 224, 72, 29, 3, 224, 45, 29, 3, 224, 44, 29, 3, - 223, 245, 29, 3, 223, 241, 29, 3, 223, 244, 29, 3, 223, 242, 29, 3, 223, - 243, 29, 3, 224, 68, 29, 3, 224, 62, 29, 3, 224, 64, 29, 3, 224, 67, 29, - 3, 224, 65, 29, 3, 224, 66, 29, 3, 224, 63, 29, 3, 224, 61, 29, 3, 224, - 57, 29, 3, 224, 60, 29, 3, 224, 58, 29, 3, 224, 59, 29, 3, 252, 199, 29, - 3, 251, 133, 29, 3, 252, 14, 29, 3, 252, 197, 29, 3, 252, 74, 29, 3, 252, - 83, 29, 3, 251, 213, 29, 3, 251, 91, 29, 3, 214, 27, 29, 3, 212, 116, 29, - 3, 213, 176, 29, 3, 214, 26, 29, 3, 213, 250, 29, 3, 213, 255, 29, 3, - 213, 138, 29, 3, 212, 107, 29, 3, 217, 106, 29, 3, 215, 119, 29, 3, 216, - 118, 29, 3, 217, 102, 29, 3, 217, 12, 29, 3, 217, 23, 29, 3, 112, 29, 3, - 215, 80, 29, 3, 251, 41, 29, 3, 249, 120, 29, 3, 250, 59, 29, 3, 251, 40, - 29, 3, 250, 190, 29, 3, 250, 198, 29, 3, 249, 246, 29, 3, 249, 89, 29, 3, - 211, 165, 29, 3, 211, 141, 29, 3, 211, 157, 29, 3, 211, 164, 29, 3, 211, - 161, 29, 3, 211, 162, 29, 3, 211, 148, 29, 3, 211, 147, 29, 3, 211, 136, - 29, 3, 211, 132, 29, 3, 211, 135, 29, 3, 211, 133, 29, 3, 211, 134, 29, - 3, 198, 29, 3, 227, 242, 29, 3, 228, 238, 29, 3, 229, 230, 29, 3, 229, - 108, 29, 3, 229, 112, 29, 3, 228, 79, 29, 3, 227, 178, 29, 3, 227, 169, - 29, 3, 227, 132, 29, 3, 227, 152, 29, 3, 227, 168, 29, 3, 227, 159, 29, - 3, 227, 160, 29, 3, 227, 138, 29, 3, 227, 123, 29, 3, 242, 187, 61, 29, - 3, 242, 187, 69, 29, 3, 242, 187, 74, 29, 3, 242, 187, 255, 82, 29, 3, - 242, 187, 245, 217, 29, 3, 242, 187, 76, 29, 3, 242, 187, 78, 29, 3, 242, - 187, 212, 65, 29, 3, 176, 29, 3, 233, 223, 29, 3, 234, 98, 29, 3, 235, - 16, 29, 3, 234, 187, 29, 3, 234, 188, 29, 3, 234, 34, 29, 3, 234, 33, 29, - 3, 233, 188, 29, 3, 233, 182, 29, 3, 233, 187, 29, 3, 233, 183, 29, 3, - 233, 184, 29, 3, 233, 177, 29, 3, 233, 171, 29, 3, 233, 173, 29, 3, 233, - 176, 29, 3, 233, 174, 29, 3, 233, 175, 29, 3, 233, 172, 29, 3, 233, 170, - 29, 3, 233, 166, 29, 3, 233, 169, 29, 3, 233, 167, 29, 3, 233, 168, 29, - 3, 212, 65, 29, 3, 211, 195, 29, 3, 211, 250, 29, 3, 212, 64, 29, 3, 212, - 17, 29, 3, 212, 22, 29, 3, 211, 227, 29, 3, 211, 226, 29, 3, 225, 142, - 61, 29, 3, 225, 142, 69, 29, 3, 225, 142, 74, 29, 3, 225, 142, 255, 82, - 29, 3, 225, 142, 245, 217, 29, 3, 225, 142, 76, 29, 3, 225, 142, 78, 29, - 3, 210, 116, 29, 3, 210, 13, 29, 3, 210, 44, 29, 3, 210, 115, 29, 3, 210, - 92, 29, 3, 210, 94, 29, 3, 210, 23, 29, 3, 210, 0, 29, 3, 210, 82, 29, 3, - 210, 62, 29, 3, 210, 69, 29, 3, 210, 81, 29, 3, 210, 73, 29, 3, 210, 74, - 29, 3, 210, 67, 29, 3, 210, 53, 29, 3, 192, 29, 3, 210, 212, 29, 3, 211, - 8, 29, 3, 211, 103, 29, 3, 211, 44, 29, 3, 211, 47, 29, 3, 210, 244, 29, - 3, 210, 235, 29, 3, 248, 229, 29, 3, 246, 86, 29, 3, 248, 11, 29, 3, 248, - 228, 29, 3, 248, 85, 29, 3, 248, 98, 29, 3, 247, 153, 29, 3, 246, 55, 29, - 3, 248, 143, 29, 3, 248, 108, 29, 3, 248, 120, 29, 3, 248, 142, 29, 3, - 248, 130, 29, 3, 248, 131, 29, 3, 248, 113, 29, 3, 248, 99, 29, 3, 235, - 147, 29, 3, 235, 57, 29, 3, 235, 114, 29, 3, 235, 146, 29, 3, 235, 130, - 29, 3, 235, 132, 29, 3, 235, 74, 29, 3, 235, 37, 29, 3, 243, 142, 29, 3, - 242, 120, 29, 3, 242, 221, 29, 3, 243, 139, 29, 3, 243, 62, 29, 3, 243, - 69, 29, 3, 242, 181, 29, 3, 242, 180, 29, 3, 242, 85, 29, 3, 242, 81, 29, - 3, 242, 84, 29, 3, 242, 82, 29, 3, 242, 83, 29, 3, 243, 36, 29, 3, 243, - 16, 29, 3, 243, 26, 29, 3, 243, 35, 29, 3, 243, 30, 29, 3, 243, 31, 29, - 3, 243, 20, 29, 3, 243, 5, 29, 3, 216, 209, 29, 3, 216, 137, 29, 3, 216, - 176, 29, 3, 216, 208, 29, 3, 216, 195, 29, 3, 216, 196, 29, 3, 216, 157, - 29, 3, 216, 129, 29, 3, 250, 165, 29, 3, 250, 77, 29, 3, 250, 118, 29, 3, - 250, 164, 29, 3, 250, 136, 29, 3, 250, 139, 29, 3, 250, 94, 29, 3, 250, - 66, 29, 3, 225, 150, 29, 3, 225, 117, 29, 3, 225, 136, 29, 3, 225, 149, - 29, 3, 225, 138, 29, 3, 225, 139, 29, 3, 225, 124, 29, 3, 225, 113, 29, - 3, 215, 184, 29, 3, 215, 164, 29, 3, 215, 168, 29, 3, 215, 183, 29, 3, - 215, 178, 29, 3, 215, 179, 29, 3, 215, 167, 29, 3, 215, 162, 29, 3, 215, - 39, 29, 3, 215, 31, 29, 3, 215, 35, 29, 3, 215, 38, 29, 3, 215, 36, 29, - 3, 215, 37, 29, 3, 215, 33, 29, 3, 215, 32, 29, 3, 244, 204, 29, 3, 243, - 241, 29, 3, 244, 129, 29, 3, 244, 203, 29, 3, 244, 155, 29, 3, 244, 162, - 29, 3, 244, 51, 29, 3, 243, 220, 29, 3, 191, 29, 3, 224, 153, 29, 3, 225, - 111, 29, 3, 226, 93, 29, 3, 225, 214, 29, 3, 225, 224, 29, 3, 225, 19, - 29, 3, 224, 117, 29, 3, 222, 101, 29, 3, 230, 36, 29, 3, 243, 214, 29, - 38, 243, 60, 22, 25, 233, 29, 79, 29, 38, 25, 233, 29, 79, 29, 38, 243, - 60, 79, 29, 221, 175, 79, 29, 211, 208, 29, 243, 236, 218, 131, 29, 249, - 227, 29, 220, 152, 29, 249, 234, 29, 224, 202, 249, 234, 29, 224, 16, 79, - 29, 226, 19, 220, 139, 29, 21, 111, 29, 21, 105, 29, 21, 158, 29, 21, - 161, 29, 21, 190, 29, 21, 195, 29, 21, 199, 29, 21, 196, 29, 21, 201, 29, - 54, 216, 248, 29, 54, 215, 73, 29, 54, 216, 163, 29, 54, 244, 23, 29, 54, - 244, 122, 29, 54, 219, 113, 29, 54, 220, 118, 29, 54, 245, 192, 29, 54, - 228, 200, 29, 54, 240, 217, 29, 54, 216, 249, 216, 148, 29, 3, 221, 179, - 230, 47, 29, 3, 230, 43, 29, 3, 230, 44, 29, 3, 230, 45, 29, 3, 221, 179, - 251, 91, 29, 3, 251, 88, 29, 3, 251, 89, 29, 3, 251, 90, 29, 3, 221, 179, - 243, 220, 29, 3, 243, 216, 29, 3, 243, 217, 29, 3, 243, 218, 29, 3, 221, - 179, 224, 117, 29, 3, 224, 113, 29, 3, 224, 114, 29, 3, 224, 115, 29, - 216, 32, 164, 210, 247, 29, 216, 32, 164, 248, 49, 29, 216, 32, 164, 222, - 241, 29, 216, 32, 164, 219, 253, 222, 241, 29, 216, 32, 164, 247, 243, - 29, 216, 32, 164, 234, 170, 29, 216, 32, 164, 250, 102, 29, 216, 32, 164, - 241, 184, 29, 216, 32, 164, 248, 48, 29, 216, 32, 164, 233, 200, 169, 1, - 61, 169, 1, 76, 169, 1, 74, 169, 1, 78, 169, 1, 69, 169, 1, 214, 105, - 169, 1, 243, 142, 169, 1, 176, 169, 1, 243, 69, 169, 1, 242, 221, 169, 1, - 242, 181, 169, 1, 242, 120, 169, 1, 242, 86, 169, 1, 162, 169, 1, 241, - 245, 169, 1, 241, 187, 169, 1, 241, 75, 169, 1, 240, 229, 169, 1, 240, - 208, 169, 1, 233, 141, 169, 1, 233, 64, 169, 1, 232, 247, 169, 1, 232, - 162, 169, 1, 232, 103, 169, 1, 232, 76, 169, 1, 186, 169, 1, 231, 96, - 169, 1, 230, 235, 169, 1, 230, 166, 169, 1, 230, 107, 169, 1, 198, 169, - 1, 241, 97, 169, 1, 229, 218, 169, 1, 229, 112, 169, 1, 228, 238, 169, 1, - 228, 79, 169, 1, 227, 242, 169, 1, 227, 180, 169, 1, 224, 32, 169, 1, - 224, 19, 169, 1, 224, 12, 169, 1, 224, 4, 169, 1, 223, 249, 169, 1, 223, - 247, 169, 1, 206, 169, 1, 222, 93, 169, 1, 221, 183, 169, 1, 219, 193, - 169, 1, 219, 60, 169, 1, 218, 84, 169, 1, 218, 3, 169, 1, 248, 229, 169, - 1, 217, 106, 169, 1, 248, 98, 169, 1, 217, 23, 169, 1, 248, 11, 169, 1, - 216, 118, 169, 1, 247, 153, 169, 1, 246, 86, 169, 1, 246, 58, 169, 1, - 247, 164, 169, 1, 216, 60, 169, 1, 216, 59, 169, 1, 216, 48, 169, 1, 216, - 47, 169, 1, 216, 46, 169, 1, 216, 45, 169, 1, 215, 184, 169, 1, 215, 179, - 169, 1, 215, 168, 169, 1, 215, 167, 169, 1, 215, 164, 169, 1, 215, 163, - 169, 1, 212, 65, 169, 1, 212, 22, 169, 1, 211, 250, 169, 1, 211, 227, - 169, 1, 211, 195, 169, 1, 211, 183, 169, 1, 192, 169, 1, 211, 47, 169, 1, - 211, 8, 169, 1, 210, 244, 169, 1, 210, 212, 169, 1, 210, 177, 18, 19, - 240, 175, 18, 19, 76, 18, 19, 255, 46, 18, 19, 74, 18, 19, 236, 40, 18, - 19, 78, 18, 19, 226, 187, 18, 19, 211, 116, 226, 187, 18, 19, 73, 245, - 217, 18, 19, 73, 74, 18, 19, 61, 18, 19, 255, 82, 18, 19, 212, 22, 18, - 19, 159, 212, 22, 18, 19, 211, 250, 18, 19, 159, 211, 250, 18, 19, 211, - 242, 18, 19, 159, 211, 242, 18, 19, 211, 227, 18, 19, 159, 211, 227, 18, - 19, 211, 215, 18, 19, 159, 211, 215, 18, 19, 229, 195, 211, 215, 18, 19, - 212, 65, 18, 19, 159, 212, 65, 18, 19, 212, 64, 18, 19, 159, 212, 64, 18, - 19, 229, 195, 212, 64, 18, 19, 254, 210, 18, 19, 211, 116, 212, 98, 18, - 19, 242, 187, 218, 131, 18, 19, 40, 142, 18, 19, 40, 242, 143, 18, 19, - 40, 251, 183, 163, 222, 236, 18, 19, 40, 216, 15, 163, 222, 236, 18, 19, - 40, 44, 163, 222, 236, 18, 19, 40, 222, 236, 18, 19, 40, 52, 142, 18, 19, - 40, 52, 219, 253, 67, 218, 92, 18, 19, 40, 230, 229, 247, 128, 18, 19, - 40, 219, 253, 203, 91, 18, 19, 40, 225, 25, 18, 19, 40, 124, 217, 88, 18, - 19, 245, 158, 18, 19, 236, 6, 18, 19, 226, 200, 18, 19, 254, 131, 18, 19, - 225, 224, 18, 19, 226, 91, 18, 19, 225, 111, 18, 19, 225, 74, 18, 19, - 225, 19, 18, 19, 224, 252, 18, 19, 211, 116, 224, 252, 18, 19, 73, 241, - 227, 18, 19, 73, 241, 187, 18, 19, 191, 18, 19, 226, 93, 18, 19, 224, - 115, 18, 19, 159, 224, 115, 18, 19, 224, 113, 18, 19, 159, 224, 113, 18, - 19, 224, 112, 18, 19, 159, 224, 112, 18, 19, 224, 110, 18, 19, 159, 224, - 110, 18, 19, 224, 109, 18, 19, 159, 224, 109, 18, 19, 224, 117, 18, 19, - 159, 224, 117, 18, 19, 224, 116, 18, 19, 159, 224, 116, 18, 19, 211, 116, - 224, 116, 18, 19, 226, 109, 18, 19, 159, 226, 109, 18, 19, 73, 242, 67, - 18, 19, 217, 23, 18, 19, 217, 100, 18, 19, 216, 118, 18, 19, 216, 104, - 18, 19, 112, 18, 19, 216, 18, 18, 19, 211, 116, 216, 18, 18, 19, 73, 248, - 85, 18, 19, 73, 248, 11, 18, 19, 217, 106, 18, 19, 217, 102, 18, 19, 215, - 78, 18, 19, 159, 215, 78, 18, 19, 215, 62, 18, 19, 159, 215, 62, 18, 19, - 215, 61, 18, 19, 159, 215, 61, 18, 19, 105, 18, 19, 159, 105, 18, 19, - 215, 54, 18, 19, 159, 215, 54, 18, 19, 215, 80, 18, 19, 159, 215, 80, 18, - 19, 215, 79, 18, 19, 159, 215, 79, 18, 19, 229, 195, 215, 79, 18, 19, - 217, 153, 18, 19, 215, 152, 18, 19, 215, 136, 18, 19, 215, 134, 18, 19, - 215, 157, 18, 19, 234, 188, 18, 19, 235, 13, 18, 19, 234, 98, 18, 19, - 234, 89, 18, 19, 234, 34, 18, 19, 234, 16, 18, 19, 211, 116, 234, 16, 18, - 19, 176, 18, 19, 235, 16, 18, 19, 233, 184, 18, 19, 159, 233, 184, 18, - 19, 233, 182, 18, 19, 159, 233, 182, 18, 19, 233, 181, 18, 19, 159, 233, - 181, 18, 19, 233, 180, 18, 19, 159, 233, 180, 18, 19, 233, 179, 18, 19, - 159, 233, 179, 18, 19, 233, 188, 18, 19, 159, 233, 188, 18, 19, 233, 187, - 18, 19, 159, 233, 187, 18, 19, 229, 195, 233, 187, 18, 19, 235, 29, 18, - 19, 233, 189, 18, 19, 219, 29, 234, 182, 18, 19, 219, 29, 234, 90, 18, - 19, 219, 29, 234, 29, 18, 19, 219, 29, 234, 254, 18, 19, 250, 198, 18, - 19, 251, 39, 18, 19, 250, 59, 18, 19, 250, 49, 18, 19, 249, 246, 18, 19, - 249, 182, 18, 19, 211, 116, 249, 182, 18, 19, 251, 41, 18, 19, 251, 40, - 18, 19, 249, 87, 18, 19, 159, 249, 87, 18, 19, 249, 85, 18, 19, 159, 249, - 85, 18, 19, 249, 84, 18, 19, 159, 249, 84, 18, 19, 249, 83, 18, 19, 159, - 249, 83, 18, 19, 249, 82, 18, 19, 159, 249, 82, 18, 19, 249, 89, 18, 19, - 159, 249, 89, 18, 19, 249, 88, 18, 19, 159, 249, 88, 18, 19, 229, 195, - 249, 88, 18, 19, 251, 74, 18, 19, 221, 211, 216, 211, 18, 19, 231, 96, - 18, 19, 231, 241, 18, 19, 230, 235, 18, 19, 230, 206, 18, 19, 230, 166, - 18, 19, 230, 137, 18, 19, 211, 116, 230, 137, 18, 19, 186, 18, 19, 231, - 242, 18, 19, 230, 45, 18, 19, 159, 230, 45, 18, 19, 230, 43, 18, 19, 159, - 230, 43, 18, 19, 230, 42, 18, 19, 159, 230, 42, 18, 19, 230, 41, 18, 19, - 159, 230, 41, 18, 19, 230, 40, 18, 19, 159, 230, 40, 18, 19, 230, 47, 18, - 19, 159, 230, 47, 18, 19, 230, 46, 18, 19, 159, 230, 46, 18, 19, 229, - 195, 230, 46, 18, 19, 194, 18, 19, 159, 194, 18, 19, 230, 239, 18, 19, - 253, 213, 194, 18, 19, 221, 211, 194, 18, 19, 229, 112, 18, 19, 229, 229, - 18, 19, 228, 238, 18, 19, 228, 213, 18, 19, 228, 79, 18, 19, 228, 69, 18, - 19, 211, 116, 228, 69, 18, 19, 198, 18, 19, 229, 230, 18, 19, 227, 176, - 18, 19, 159, 227, 176, 18, 19, 227, 178, 18, 19, 159, 227, 178, 18, 19, - 227, 177, 18, 19, 159, 227, 177, 18, 19, 229, 195, 227, 177, 18, 19, 230, - 30, 18, 19, 73, 229, 84, 18, 19, 228, 243, 18, 19, 233, 64, 18, 19, 233, - 139, 18, 19, 232, 247, 18, 19, 232, 233, 18, 19, 232, 162, 18, 19, 232, - 133, 18, 19, 211, 116, 232, 133, 18, 19, 233, 141, 18, 19, 233, 140, 18, - 19, 232, 73, 18, 19, 159, 232, 73, 18, 19, 232, 72, 18, 19, 159, 232, 72, - 18, 19, 232, 71, 18, 19, 159, 232, 71, 18, 19, 232, 70, 18, 19, 159, 232, - 70, 18, 19, 232, 69, 18, 19, 159, 232, 69, 18, 19, 232, 75, 18, 19, 159, - 232, 75, 18, 19, 232, 74, 18, 19, 159, 232, 74, 18, 19, 156, 18, 19, 159, - 156, 18, 19, 147, 156, 18, 19, 221, 183, 18, 19, 222, 31, 18, 19, 219, - 193, 18, 19, 219, 177, 18, 19, 219, 60, 18, 19, 219, 42, 18, 19, 211, - 116, 219, 42, 18, 19, 206, 18, 19, 222, 33, 18, 19, 217, 250, 18, 19, - 159, 217, 250, 18, 19, 217, 244, 18, 19, 159, 217, 244, 18, 19, 217, 243, - 18, 19, 159, 217, 243, 18, 19, 217, 239, 18, 19, 159, 217, 239, 18, 19, - 217, 238, 18, 19, 159, 217, 238, 18, 19, 217, 254, 18, 19, 159, 217, 254, - 18, 19, 217, 253, 18, 19, 159, 217, 253, 18, 19, 229, 195, 217, 253, 18, - 19, 222, 93, 18, 19, 253, 213, 222, 93, 18, 19, 217, 255, 18, 19, 251, - 226, 222, 93, 18, 19, 230, 132, 219, 110, 18, 19, 229, 195, 219, 101, 18, - 19, 229, 195, 222, 91, 18, 19, 229, 195, 218, 237, 18, 19, 229, 195, 218, - 87, 18, 19, 229, 195, 219, 100, 18, 19, 229, 195, 221, 186, 18, 19, 220, - 65, 18, 19, 220, 34, 18, 19, 220, 29, 18, 19, 220, 9, 18, 19, 220, 3, 18, - 19, 220, 104, 18, 19, 220, 100, 18, 19, 219, 208, 18, 19, 159, 219, 208, - 18, 19, 219, 207, 18, 19, 159, 219, 207, 18, 19, 219, 206, 18, 19, 159, - 219, 206, 18, 19, 219, 205, 18, 19, 159, 219, 205, 18, 19, 219, 204, 18, - 19, 159, 219, 204, 18, 19, 219, 210, 18, 19, 159, 219, 210, 18, 19, 219, - 209, 18, 19, 159, 219, 209, 18, 19, 220, 106, 18, 19, 211, 47, 18, 19, - 211, 101, 18, 19, 211, 8, 18, 19, 210, 255, 18, 19, 210, 244, 18, 19, - 210, 229, 18, 19, 211, 116, 210, 229, 18, 19, 192, 18, 19, 211, 103, 18, - 19, 210, 174, 18, 19, 159, 210, 174, 18, 19, 210, 173, 18, 19, 159, 210, - 173, 18, 19, 210, 172, 18, 19, 159, 210, 172, 18, 19, 210, 171, 18, 19, - 159, 210, 171, 18, 19, 210, 170, 18, 19, 159, 210, 170, 18, 19, 210, 176, - 18, 19, 159, 210, 176, 18, 19, 210, 175, 18, 19, 159, 210, 175, 18, 19, - 229, 195, 210, 175, 18, 19, 211, 117, 18, 19, 252, 12, 211, 117, 18, 19, - 159, 211, 117, 18, 19, 221, 211, 211, 8, 18, 19, 223, 131, 18, 19, 223, - 226, 223, 131, 18, 19, 159, 233, 64, 18, 19, 223, 186, 18, 19, 223, 38, - 18, 19, 222, 242, 18, 19, 222, 213, 18, 19, 222, 199, 18, 19, 159, 232, - 162, 18, 19, 205, 18, 19, 223, 187, 18, 19, 159, 233, 141, 18, 19, 222, - 110, 18, 19, 159, 222, 110, 18, 19, 153, 18, 19, 159, 153, 18, 19, 147, - 153, 18, 19, 244, 162, 18, 19, 244, 201, 18, 19, 244, 129, 18, 19, 244, - 116, 18, 19, 244, 51, 18, 19, 244, 42, 18, 19, 244, 204, 18, 19, 244, - 203, 18, 19, 243, 219, 18, 19, 159, 243, 219, 18, 19, 245, 14, 18, 19, - 216, 196, 18, 19, 230, 28, 216, 196, 18, 19, 216, 176, 18, 19, 230, 28, - 216, 176, 18, 19, 216, 172, 18, 19, 230, 28, 216, 172, 18, 19, 216, 157, - 18, 19, 216, 154, 18, 19, 216, 209, 18, 19, 216, 208, 18, 19, 216, 128, - 18, 19, 159, 216, 128, 18, 19, 216, 211, 18, 19, 215, 143, 18, 19, 215, - 141, 18, 19, 215, 140, 18, 19, 215, 145, 18, 19, 215, 146, 18, 19, 215, - 52, 18, 19, 215, 51, 18, 19, 215, 50, 18, 19, 215, 53, 18, 19, 227, 197, - 241, 245, 18, 19, 227, 197, 241, 187, 18, 19, 227, 197, 241, 168, 18, 19, - 227, 197, 241, 75, 18, 19, 227, 197, 241, 60, 18, 19, 227, 197, 162, 18, - 19, 227, 197, 242, 53, 18, 19, 227, 197, 242, 67, 18, 19, 227, 196, 242, - 67, 18, 19, 241, 161, 18, 19, 224, 87, 18, 19, 224, 56, 18, 19, 224, 51, - 18, 19, 224, 45, 18, 19, 224, 40, 18, 19, 224, 91, 18, 19, 224, 90, 18, - 19, 224, 99, 18, 19, 216, 56, 18, 19, 216, 54, 18, 19, 216, 53, 18, 19, - 216, 57, 18, 19, 159, 223, 131, 18, 19, 159, 223, 38, 18, 19, 159, 222, - 213, 18, 19, 159, 205, 18, 19, 229, 80, 18, 19, 229, 32, 18, 19, 229, 28, - 18, 19, 229, 9, 18, 19, 229, 4, 18, 19, 229, 82, 18, 19, 229, 81, 18, 19, - 229, 84, 18, 19, 228, 108, 18, 19, 221, 211, 220, 65, 18, 19, 221, 211, - 220, 34, 18, 19, 221, 211, 220, 9, 18, 19, 221, 211, 220, 104, 18, 19, - 211, 213, 216, 196, 18, 19, 211, 213, 216, 176, 18, 19, 211, 213, 216, - 157, 18, 19, 211, 213, 216, 209, 18, 19, 211, 213, 216, 211, 18, 19, 232, - 254, 18, 19, 232, 253, 18, 19, 232, 252, 18, 19, 232, 251, 18, 19, 233, - 4, 18, 19, 233, 3, 18, 19, 233, 5, 18, 19, 216, 210, 216, 196, 18, 19, - 216, 210, 216, 176, 18, 19, 216, 210, 216, 172, 18, 19, 216, 210, 216, - 157, 18, 19, 216, 210, 216, 154, 18, 19, 216, 210, 216, 209, 18, 19, 216, - 210, 216, 208, 18, 19, 216, 210, 216, 211, 18, 19, 254, 198, 253, 166, - 18, 19, 251, 226, 76, 18, 19, 251, 226, 74, 18, 19, 251, 226, 78, 18, 19, - 251, 226, 61, 18, 19, 251, 226, 212, 22, 18, 19, 251, 226, 211, 250, 18, - 19, 251, 226, 211, 227, 18, 19, 251, 226, 212, 65, 18, 19, 251, 226, 229, - 112, 18, 19, 251, 226, 228, 238, 18, 19, 251, 226, 228, 79, 18, 19, 251, - 226, 198, 18, 19, 251, 226, 234, 188, 18, 19, 251, 226, 234, 98, 18, 19, - 251, 226, 234, 34, 18, 19, 251, 226, 176, 18, 19, 221, 211, 241, 245, 18, - 19, 221, 211, 241, 187, 18, 19, 221, 211, 241, 75, 18, 19, 221, 211, 162, - 18, 19, 73, 242, 227, 18, 19, 73, 242, 231, 18, 19, 73, 242, 243, 18, 19, - 73, 242, 242, 18, 19, 73, 242, 232, 18, 19, 73, 243, 0, 18, 19, 73, 222, - 142, 18, 19, 73, 222, 213, 18, 19, 73, 223, 131, 18, 19, 73, 223, 111, - 18, 19, 73, 223, 38, 18, 19, 73, 205, 18, 19, 73, 211, 195, 18, 19, 73, - 211, 227, 18, 19, 73, 212, 22, 18, 19, 73, 212, 17, 18, 19, 73, 211, 250, - 18, 19, 73, 212, 65, 18, 19, 73, 240, 201, 18, 19, 73, 240, 202, 18, 19, - 73, 240, 205, 18, 19, 73, 240, 204, 18, 19, 73, 240, 203, 18, 19, 73, - 240, 207, 18, 19, 73, 216, 137, 18, 19, 73, 216, 157, 18, 19, 73, 216, - 196, 18, 19, 73, 216, 195, 18, 19, 73, 216, 176, 18, 19, 73, 216, 209, - 18, 19, 73, 215, 124, 18, 19, 73, 215, 134, 18, 19, 73, 215, 152, 18, 19, - 73, 215, 151, 18, 19, 73, 215, 136, 18, 19, 73, 215, 157, 18, 19, 73, - 224, 153, 18, 19, 73, 225, 19, 18, 19, 73, 225, 224, 18, 19, 73, 225, - 214, 18, 19, 73, 225, 111, 18, 19, 73, 191, 18, 19, 73, 226, 109, 18, 19, - 73, 242, 120, 18, 19, 73, 242, 181, 18, 19, 73, 243, 69, 18, 19, 73, 243, - 62, 18, 19, 73, 242, 221, 18, 19, 73, 243, 142, 18, 19, 73, 234, 106, 18, - 19, 73, 234, 111, 18, 19, 73, 234, 125, 18, 19, 73, 234, 124, 18, 19, 73, - 234, 118, 18, 19, 73, 234, 138, 18, 19, 73, 234, 47, 18, 19, 73, 234, 48, - 18, 19, 73, 234, 51, 18, 19, 73, 234, 50, 18, 19, 73, 234, 49, 18, 19, - 73, 234, 52, 18, 19, 73, 234, 53, 18, 19, 73, 227, 242, 18, 19, 73, 228, - 79, 18, 19, 73, 229, 112, 18, 19, 73, 229, 108, 18, 19, 73, 228, 238, 18, - 19, 73, 198, 18, 19, 73, 230, 107, 18, 19, 73, 230, 166, 18, 19, 73, 231, - 96, 18, 19, 73, 231, 85, 18, 19, 73, 230, 235, 18, 19, 73, 186, 18, 19, - 73, 210, 212, 18, 19, 73, 210, 244, 18, 19, 73, 211, 47, 18, 19, 73, 211, - 44, 18, 19, 73, 211, 8, 18, 19, 73, 192, 18, 19, 73, 235, 57, 18, 19, - 221, 211, 235, 57, 18, 19, 73, 235, 74, 18, 19, 73, 235, 132, 18, 19, 73, - 235, 130, 18, 19, 73, 235, 114, 18, 19, 221, 211, 235, 114, 18, 19, 73, - 235, 147, 18, 19, 73, 235, 87, 18, 19, 73, 235, 91, 18, 19, 73, 235, 101, - 18, 19, 73, 235, 100, 18, 19, 73, 235, 99, 18, 19, 73, 235, 102, 18, 19, - 73, 232, 103, 18, 19, 73, 232, 162, 18, 19, 73, 233, 64, 18, 19, 73, 233, - 56, 18, 19, 73, 232, 247, 18, 19, 73, 233, 141, 18, 19, 73, 247, 157, 18, - 19, 73, 247, 158, 18, 19, 73, 247, 163, 18, 19, 73, 247, 162, 18, 19, 73, - 247, 159, 18, 19, 73, 247, 164, 18, 19, 73, 232, 250, 18, 19, 73, 232, - 252, 18, 19, 73, 233, 0, 18, 19, 73, 232, 255, 18, 19, 73, 232, 254, 18, - 19, 73, 233, 4, 18, 19, 73, 216, 51, 18, 19, 73, 216, 53, 18, 19, 73, - 216, 56, 18, 19, 73, 216, 55, 18, 19, 73, 216, 54, 18, 19, 73, 216, 57, - 18, 19, 73, 216, 46, 18, 19, 73, 216, 47, 18, 19, 73, 216, 59, 18, 19, - 73, 216, 58, 18, 19, 73, 216, 48, 18, 19, 73, 216, 60, 18, 19, 73, 210, - 13, 18, 19, 73, 210, 23, 18, 19, 73, 210, 94, 18, 19, 73, 210, 92, 18, - 19, 73, 210, 44, 18, 19, 73, 210, 116, 18, 19, 73, 210, 159, 18, 19, 73, - 65, 210, 159, 18, 19, 73, 246, 36, 18, 19, 73, 246, 37, 18, 19, 73, 246, - 44, 18, 19, 73, 246, 43, 18, 19, 73, 246, 39, 18, 19, 73, 246, 46, 18, - 19, 73, 218, 84, 18, 19, 73, 219, 60, 18, 19, 73, 221, 183, 18, 19, 73, - 221, 172, 18, 19, 73, 219, 193, 18, 19, 73, 206, 18, 19, 73, 219, 227, - 18, 19, 73, 220, 9, 18, 19, 73, 220, 65, 18, 19, 73, 220, 63, 18, 19, 73, - 220, 34, 18, 19, 73, 220, 104, 18, 19, 73, 220, 106, 18, 19, 73, 215, - 164, 18, 19, 73, 215, 167, 18, 19, 73, 215, 179, 18, 19, 73, 215, 178, - 18, 19, 73, 215, 168, 18, 19, 73, 215, 184, 18, 19, 73, 250, 77, 18, 19, - 73, 250, 94, 18, 19, 73, 250, 139, 18, 19, 73, 250, 136, 18, 19, 73, 250, - 118, 18, 19, 73, 250, 165, 18, 19, 73, 215, 127, 18, 19, 73, 215, 128, - 18, 19, 73, 215, 131, 18, 19, 73, 215, 130, 18, 19, 73, 215, 129, 18, 19, - 73, 215, 132, 18, 19, 250, 119, 50, 18, 19, 243, 236, 218, 131, 18, 19, - 224, 83, 18, 19, 229, 78, 18, 19, 228, 105, 18, 19, 228, 104, 18, 19, - 228, 103, 18, 19, 228, 102, 18, 19, 228, 107, 18, 19, 228, 106, 18, 19, - 211, 213, 216, 126, 18, 19, 211, 213, 216, 125, 18, 19, 211, 213, 216, - 124, 18, 19, 211, 213, 216, 123, 18, 19, 211, 213, 216, 122, 18, 19, 211, - 213, 216, 129, 18, 19, 211, 213, 216, 128, 18, 19, 211, 213, 40, 216, - 211, 18, 19, 251, 226, 212, 98, 226, 230, 219, 21, 79, 226, 230, 1, 252, - 56, 226, 230, 1, 232, 92, 226, 230, 1, 244, 159, 226, 230, 1, 222, 17, - 226, 230, 1, 228, 198, 226, 230, 1, 214, 226, 226, 230, 1, 248, 205, 226, - 230, 1, 216, 81, 226, 230, 1, 249, 237, 226, 230, 1, 250, 188, 226, 230, - 1, 230, 96, 226, 230, 1, 242, 163, 226, 230, 1, 229, 68, 226, 230, 1, - 218, 124, 226, 230, 1, 222, 137, 226, 230, 1, 254, 207, 226, 230, 1, 226, - 191, 226, 230, 1, 214, 150, 226, 230, 1, 245, 239, 226, 230, 1, 235, 195, - 226, 230, 1, 245, 240, 226, 230, 1, 226, 162, 226, 230, 1, 214, 206, 226, - 230, 1, 236, 46, 226, 230, 1, 245, 237, 226, 230, 1, 225, 205, 226, 230, - 244, 158, 79, 226, 230, 223, 52, 244, 158, 79, 178, 1, 244, 149, 244, - 141, 244, 163, 245, 14, 178, 1, 214, 105, 178, 1, 214, 135, 214, 151, 69, - 178, 1, 210, 214, 178, 1, 211, 117, 178, 1, 212, 98, 178, 1, 216, 131, - 216, 130, 216, 152, 178, 1, 245, 67, 178, 1, 254, 101, 61, 178, 1, 226, - 147, 78, 178, 1, 255, 26, 61, 178, 1, 254, 236, 178, 1, 232, 139, 78, - 178, 1, 219, 246, 78, 178, 1, 78, 178, 1, 226, 238, 178, 1, 226, 200, - 178, 1, 223, 167, 223, 180, 223, 97, 153, 178, 1, 234, 199, 178, 1, 250, - 185, 178, 1, 234, 200, 235, 29, 178, 1, 243, 209, 178, 1, 245, 146, 178, - 1, 243, 65, 242, 73, 243, 209, 178, 1, 243, 103, 178, 1, 211, 188, 211, - 182, 212, 98, 178, 1, 242, 45, 242, 67, 178, 1, 242, 49, 242, 67, 178, 1, - 232, 141, 242, 67, 178, 1, 219, 249, 242, 67, 178, 1, 229, 190, 227, 161, - 229, 191, 230, 30, 178, 1, 219, 247, 230, 30, 178, 1, 246, 123, 178, 1, - 235, 175, 235, 179, 235, 168, 74, 178, 1, 76, 178, 1, 235, 123, 235, 150, - 178, 1, 243, 50, 178, 1, 232, 142, 254, 252, 178, 1, 219, 251, 61, 178, - 1, 235, 160, 245, 121, 178, 1, 225, 167, 225, 189, 226, 109, 178, 1, 254, - 172, 245, 119, 178, 1, 219, 26, 222, 93, 178, 1, 219, 181, 232, 138, 222, - 93, 178, 1, 219, 245, 222, 93, 178, 1, 251, 74, 178, 1, 210, 159, 178, 1, - 216, 64, 216, 74, 215, 41, 217, 153, 178, 1, 219, 244, 217, 153, 178, 1, - 249, 68, 178, 1, 252, 39, 252, 42, 251, 232, 253, 166, 178, 1, 219, 250, - 253, 166, 178, 1, 246, 122, 178, 1, 226, 175, 178, 1, 245, 204, 245, 206, - 76, 178, 1, 231, 183, 231, 191, 194, 178, 1, 232, 140, 194, 178, 1, 219, - 248, 194, 178, 1, 233, 79, 233, 120, 232, 149, 156, 178, 1, 246, 124, - 178, 1, 235, 237, 178, 1, 235, 238, 178, 1, 248, 218, 248, 223, 249, 68, - 178, 1, 226, 142, 245, 66, 78, 178, 1, 245, 235, 178, 1, 235, 194, 178, - 1, 249, 86, 178, 1, 251, 25, 178, 1, 250, 197, 178, 1, 218, 163, 178, 1, - 232, 137, 178, 1, 219, 243, 178, 1, 240, 117, 178, 1, 224, 99, 178, 1, - 211, 178, 178, 219, 157, 224, 143, 178, 230, 90, 224, 143, 178, 249, 139, - 224, 143, 178, 254, 14, 87, 178, 215, 82, 87, 178, 252, 54, 87, 217, 84, - 1, 61, 217, 84, 1, 74, 217, 84, 1, 69, 217, 84, 1, 176, 217, 84, 1, 243, - 142, 217, 84, 1, 229, 82, 217, 84, 1, 217, 106, 217, 84, 1, 248, 229, - 217, 84, 1, 198, 217, 84, 1, 191, 217, 84, 1, 252, 199, 217, 84, 1, 186, - 217, 84, 1, 192, 217, 84, 1, 233, 141, 217, 84, 1, 212, 65, 217, 84, 1, - 206, 217, 84, 1, 162, 217, 84, 25, 5, 74, 217, 84, 25, 5, 69, 217, 84, 5, - 213, 152, 242, 14, 1, 61, 242, 14, 1, 74, 242, 14, 1, 69, 242, 14, 1, - 176, 242, 14, 1, 243, 142, 242, 14, 1, 229, 82, 242, 14, 1, 217, 106, - 242, 14, 1, 248, 229, 242, 14, 1, 198, 242, 14, 1, 191, 242, 14, 1, 252, - 199, 242, 14, 1, 186, 242, 14, 1, 192, 242, 14, 1, 205, 242, 14, 1, 233, - 141, 242, 14, 1, 212, 65, 242, 14, 1, 206, 242, 14, 1, 162, 242, 14, 25, - 5, 74, 242, 14, 25, 5, 69, 242, 14, 5, 226, 53, 225, 129, 219, 157, 224, - 143, 225, 129, 52, 224, 143, 251, 128, 1, 61, 251, 128, 1, 74, 251, 128, - 1, 69, 251, 128, 1, 176, 251, 128, 1, 243, 142, 251, 128, 1, 229, 82, - 251, 128, 1, 217, 106, 251, 128, 1, 248, 229, 251, 128, 1, 198, 251, 128, - 1, 191, 251, 128, 1, 252, 199, 251, 128, 1, 186, 251, 128, 1, 192, 251, - 128, 1, 205, 251, 128, 1, 233, 141, 251, 128, 1, 212, 65, 251, 128, 1, - 206, 251, 128, 1, 162, 251, 128, 25, 5, 74, 251, 128, 25, 5, 69, 217, 83, - 1, 61, 217, 83, 1, 74, 217, 83, 1, 69, 217, 83, 1, 176, 217, 83, 1, 243, - 142, 217, 83, 1, 229, 82, 217, 83, 1, 217, 106, 217, 83, 1, 248, 229, - 217, 83, 1, 198, 217, 83, 1, 191, 217, 83, 1, 252, 199, 217, 83, 1, 186, - 217, 83, 1, 192, 217, 83, 1, 233, 141, 217, 83, 1, 212, 65, 217, 83, 1, - 206, 217, 83, 25, 5, 74, 217, 83, 25, 5, 69, 70, 1, 176, 70, 1, 234, 138, - 70, 1, 234, 34, 70, 1, 234, 111, 70, 1, 229, 9, 70, 1, 251, 41, 70, 1, - 250, 165, 70, 1, 249, 246, 70, 1, 250, 94, 70, 1, 227, 138, 70, 1, 248, - 229, 70, 1, 215, 145, 70, 1, 247, 153, 70, 1, 215, 140, 70, 1, 228, 85, - 70, 1, 217, 106, 70, 1, 216, 209, 70, 1, 112, 70, 1, 216, 157, 70, 1, - 228, 79, 70, 1, 252, 199, 70, 1, 225, 150, 70, 1, 225, 19, 70, 1, 225, - 124, 70, 1, 230, 166, 70, 1, 210, 244, 70, 1, 222, 213, 70, 1, 232, 162, - 70, 1, 213, 138, 70, 1, 220, 104, 70, 1, 218, 186, 70, 1, 206, 70, 1, - 162, 70, 1, 233, 141, 70, 1, 224, 91, 70, 235, 250, 25, 224, 77, 70, 235, - 250, 25, 224, 90, 70, 235, 250, 25, 224, 56, 70, 235, 250, 25, 224, 51, - 70, 235, 250, 25, 224, 33, 70, 235, 250, 25, 224, 5, 70, 235, 250, 25, - 223, 249, 70, 235, 250, 25, 223, 248, 70, 235, 250, 25, 222, 102, 70, - 235, 250, 25, 222, 95, 70, 235, 250, 25, 232, 67, 70, 235, 250, 25, 232, - 57, 70, 235, 250, 25, 224, 72, 70, 235, 250, 25, 224, 83, 70, 235, 250, - 25, 224, 41, 215, 49, 111, 70, 235, 250, 25, 224, 41, 215, 49, 105, 70, - 235, 250, 25, 224, 73, 70, 25, 235, 236, 254, 53, 70, 25, 235, 236, 255, - 82, 70, 25, 5, 255, 82, 70, 25, 5, 74, 70, 25, 5, 236, 40, 70, 25, 5, - 211, 117, 70, 25, 5, 210, 169, 70, 25, 5, 69, 70, 25, 5, 214, 118, 70, - 25, 5, 214, 229, 70, 25, 5, 226, 238, 70, 25, 5, 192, 70, 25, 5, 236, 67, - 70, 25, 5, 76, 70, 25, 5, 254, 252, 70, 25, 5, 254, 210, 70, 25, 5, 226, - 187, 70, 25, 5, 253, 200, 70, 5, 228, 211, 70, 5, 223, 129, 70, 5, 210, - 180, 70, 5, 230, 57, 70, 5, 215, 214, 70, 5, 252, 151, 70, 5, 222, 208, - 70, 5, 216, 41, 70, 5, 234, 247, 70, 5, 254, 212, 70, 5, 221, 246, 221, - 240, 70, 5, 213, 149, 70, 5, 249, 240, 70, 5, 252, 125, 70, 5, 234, 131, - 70, 5, 252, 145, 70, 5, 251, 17, 225, 75, 233, 193, 70, 5, 233, 36, 216, - 18, 70, 5, 252, 28, 70, 5, 225, 126, 230, 104, 70, 5, 234, 15, 70, 249, - 106, 16, 223, 31, 70, 5, 253, 182, 70, 5, 253, 203, 70, 21, 210, 86, 70, - 21, 111, 70, 21, 105, 70, 21, 158, 70, 21, 161, 70, 21, 190, 70, 21, 195, - 70, 21, 199, 70, 21, 196, 70, 21, 201, 70, 16, 233, 36, 253, 205, 219, - 45, 70, 16, 233, 36, 253, 205, 230, 76, 70, 16, 233, 36, 253, 205, 225, - 74, 70, 16, 233, 36, 253, 205, 252, 57, 70, 16, 233, 36, 253, 205, 251, - 111, 70, 16, 233, 36, 253, 205, 224, 218, 70, 16, 233, 36, 253, 205, 224, - 212, 70, 16, 233, 36, 253, 205, 224, 210, 70, 16, 233, 36, 253, 205, 224, - 216, 70, 16, 233, 36, 253, 205, 224, 214, 83, 251, 244, 83, 245, 171, 83, - 249, 227, 83, 243, 236, 218, 131, 83, 249, 234, 83, 244, 19, 247, 126, - 83, 216, 40, 219, 54, 240, 175, 83, 219, 192, 3, 251, 180, 231, 159, 83, - 231, 188, 249, 227, 83, 231, 188, 243, 236, 218, 131, 83, 228, 196, 83, - 244, 5, 45, 221, 159, 111, 83, 244, 5, 45, 221, 159, 105, 83, 244, 5, 45, - 221, 159, 158, 83, 25, 220, 139, 83, 21, 210, 86, 83, 21, 111, 83, 21, - 105, 83, 21, 158, 83, 21, 161, 83, 21, 190, 83, 21, 195, 83, 21, 199, 83, - 21, 196, 83, 21, 201, 83, 1, 61, 83, 1, 76, 83, 1, 74, 83, 1, 78, 83, 1, - 69, 83, 1, 226, 238, 83, 1, 214, 214, 83, 1, 245, 217, 83, 1, 198, 83, 1, - 254, 123, 83, 1, 252, 199, 83, 1, 191, 83, 1, 224, 91, 83, 1, 243, 142, - 83, 1, 186, 83, 1, 233, 141, 83, 1, 206, 83, 1, 220, 104, 83, 1, 217, - 106, 83, 1, 248, 229, 83, 1, 250, 165, 83, 1, 235, 147, 83, 1, 192, 83, - 1, 205, 83, 1, 212, 65, 83, 1, 244, 204, 83, 1, 176, 83, 1, 234, 138, 83, - 1, 215, 184, 83, 1, 210, 116, 83, 1, 242, 53, 83, 1, 210, 16, 83, 1, 233, - 4, 83, 1, 210, 69, 83, 1, 250, 118, 83, 1, 216, 40, 200, 25, 50, 83, 1, - 216, 40, 76, 83, 1, 216, 40, 74, 83, 1, 216, 40, 78, 83, 1, 216, 40, 69, - 83, 1, 216, 40, 226, 238, 83, 1, 216, 40, 214, 214, 83, 1, 216, 40, 254, - 123, 83, 1, 216, 40, 252, 199, 83, 1, 216, 40, 191, 83, 1, 216, 40, 224, - 91, 83, 1, 216, 40, 243, 142, 83, 1, 216, 40, 186, 83, 1, 216, 40, 217, - 106, 83, 1, 216, 40, 248, 229, 83, 1, 216, 40, 250, 165, 83, 1, 216, 40, - 235, 147, 83, 1, 216, 40, 215, 184, 83, 1, 216, 40, 192, 83, 1, 216, 40, - 212, 65, 83, 1, 216, 40, 176, 83, 1, 216, 40, 243, 139, 83, 1, 216, 40, - 242, 53, 83, 1, 216, 40, 235, 113, 83, 1, 216, 40, 228, 236, 83, 1, 216, - 40, 246, 46, 83, 1, 219, 192, 76, 83, 1, 219, 192, 74, 83, 1, 219, 192, - 235, 158, 83, 1, 219, 192, 214, 214, 83, 1, 219, 192, 69, 83, 1, 219, - 192, 254, 123, 83, 1, 219, 192, 176, 83, 1, 219, 192, 243, 142, 83, 1, - 219, 192, 162, 83, 1, 219, 192, 191, 83, 1, 219, 192, 220, 104, 83, 1, - 219, 192, 217, 106, 83, 1, 219, 192, 248, 229, 83, 1, 219, 192, 235, 147, - 83, 1, 219, 192, 244, 204, 83, 1, 219, 192, 243, 139, 83, 1, 219, 192, - 242, 53, 83, 1, 219, 192, 215, 184, 83, 1, 219, 192, 210, 116, 83, 1, - 219, 192, 223, 187, 83, 1, 219, 192, 250, 165, 83, 1, 219, 192, 210, 82, - 83, 1, 231, 188, 74, 83, 1, 231, 188, 176, 83, 1, 231, 188, 205, 83, 1, - 231, 188, 244, 204, 83, 1, 231, 188, 210, 82, 83, 1, 254, 171, 243, 123, - 254, 84, 111, 83, 1, 254, 171, 243, 123, 213, 148, 111, 83, 1, 254, 171, - 243, 123, 248, 194, 83, 1, 254, 171, 243, 123, 214, 224, 83, 1, 254, 171, - 243, 123, 235, 200, 214, 224, 83, 1, 254, 171, 243, 123, 252, 163, 83, 1, - 254, 171, 243, 123, 134, 252, 163, 83, 1, 254, 171, 243, 123, 61, 83, 1, - 254, 171, 243, 123, 74, 83, 1, 254, 171, 243, 123, 176, 83, 1, 254, 171, - 243, 123, 229, 82, 83, 1, 254, 171, 243, 123, 251, 41, 83, 1, 254, 171, - 243, 123, 215, 157, 83, 1, 254, 171, 243, 123, 215, 145, 83, 1, 254, 171, - 243, 123, 248, 143, 83, 1, 254, 171, 243, 123, 228, 115, 83, 1, 254, 171, - 243, 123, 217, 106, 83, 1, 254, 171, 243, 123, 248, 229, 83, 1, 254, 171, - 243, 123, 191, 83, 1, 254, 171, 243, 123, 225, 150, 83, 1, 254, 171, 243, - 123, 218, 225, 83, 1, 254, 171, 243, 123, 210, 82, 83, 1, 254, 171, 243, - 123, 210, 116, 83, 1, 254, 171, 243, 123, 254, 218, 83, 1, 216, 40, 254, - 171, 243, 123, 217, 106, 83, 1, 216, 40, 254, 171, 243, 123, 210, 82, 83, - 1, 231, 188, 254, 171, 243, 123, 243, 0, 83, 1, 231, 188, 254, 171, 243, - 123, 229, 82, 83, 1, 231, 188, 254, 171, 243, 123, 251, 41, 83, 1, 231, - 188, 254, 171, 243, 123, 235, 120, 83, 1, 231, 188, 254, 171, 243, 123, - 215, 157, 83, 1, 231, 188, 254, 171, 243, 123, 248, 127, 83, 1, 231, 188, - 254, 171, 243, 123, 217, 106, 83, 1, 231, 188, 254, 171, 243, 123, 248, - 33, 83, 1, 231, 188, 254, 171, 243, 123, 218, 225, 83, 1, 231, 188, 254, - 171, 243, 123, 249, 80, 83, 1, 231, 188, 254, 171, 243, 123, 210, 82, 83, - 1, 231, 188, 254, 171, 243, 123, 210, 116, 83, 1, 254, 171, 243, 123, - 163, 69, 83, 1, 254, 171, 243, 123, 163, 192, 83, 1, 231, 188, 254, 171, - 243, 123, 252, 26, 83, 1, 254, 171, 243, 123, 248, 219, 83, 1, 231, 188, - 254, 171, 243, 123, 233, 4, 18, 19, 226, 113, 18, 19, 253, 175, 18, 19, - 255, 37, 18, 19, 212, 25, 18, 19, 224, 224, 18, 19, 225, 233, 18, 19, - 224, 108, 18, 19, 217, 32, 18, 19, 234, 195, 18, 19, 233, 185, 18, 19, - 231, 137, 18, 19, 228, 42, 18, 19, 229, 186, 18, 19, 233, 74, 18, 19, - 219, 24, 18, 19, 221, 213, 18, 19, 219, 234, 18, 19, 220, 68, 18, 19, - 219, 203, 18, 19, 210, 220, 18, 19, 211, 52, 18, 19, 223, 137, 18, 19, - 227, 175, 18, 19, 226, 220, 227, 175, 18, 19, 227, 174, 18, 19, 226, 220, - 227, 174, 18, 19, 227, 173, 18, 19, 226, 220, 227, 173, 18, 19, 227, 172, - 18, 19, 226, 220, 227, 172, 18, 19, 222, 107, 18, 19, 222, 106, 18, 19, - 222, 105, 18, 19, 222, 104, 18, 19, 222, 103, 18, 19, 222, 111, 18, 19, - 226, 220, 226, 109, 18, 19, 226, 220, 217, 153, 18, 19, 226, 220, 235, - 29, 18, 19, 226, 220, 251, 74, 18, 19, 226, 220, 194, 18, 19, 226, 220, - 230, 30, 18, 19, 226, 220, 222, 93, 18, 19, 226, 220, 220, 106, 18, 19, - 245, 227, 212, 98, 18, 19, 212, 7, 212, 98, 18, 19, 40, 4, 222, 236, 18, - 19, 40, 223, 160, 247, 128, 18, 19, 223, 226, 222, 108, 18, 19, 159, 232, - 133, 18, 19, 159, 233, 140, 18, 19, 216, 127, 18, 19, 216, 129, 18, 19, - 215, 137, 18, 19, 215, 139, 18, 19, 215, 144, 18, 19, 216, 50, 18, 19, - 216, 52, 18, 19, 221, 211, 219, 208, 18, 19, 221, 211, 220, 3, 18, 19, - 221, 211, 241, 60, 18, 19, 73, 242, 80, 18, 19, 73, 248, 60, 243, 62, 18, - 19, 73, 243, 139, 18, 19, 73, 242, 85, 18, 19, 221, 211, 235, 39, 18, 19, - 73, 235, 37, 18, 19, 252, 76, 248, 60, 156, 18, 19, 252, 76, 248, 60, - 153, 18, 19, 73, 248, 55, 222, 93, 232, 229, 213, 122, 233, 16, 232, 229, - 1, 176, 232, 229, 1, 234, 138, 232, 229, 1, 243, 142, 232, 229, 1, 243, - 0, 232, 229, 1, 229, 82, 232, 229, 1, 251, 41, 232, 229, 1, 250, 165, - 232, 229, 1, 235, 147, 232, 229, 1, 235, 120, 232, 229, 1, 211, 71, 232, - 229, 1, 217, 106, 232, 229, 1, 216, 209, 232, 229, 1, 248, 229, 232, 229, - 1, 248, 33, 232, 229, 1, 198, 232, 229, 1, 191, 232, 229, 1, 225, 150, - 232, 229, 1, 252, 199, 232, 229, 1, 252, 26, 232, 229, 1, 186, 232, 229, - 1, 192, 232, 229, 1, 205, 232, 229, 1, 233, 141, 232, 229, 1, 212, 65, - 232, 229, 1, 220, 104, 232, 229, 1, 218, 225, 232, 229, 1, 206, 232, 229, - 1, 162, 232, 229, 25, 5, 61, 232, 229, 25, 5, 74, 232, 229, 25, 5, 69, - 232, 229, 25, 5, 245, 217, 232, 229, 25, 5, 254, 210, 232, 229, 25, 5, - 226, 187, 232, 229, 25, 5, 253, 200, 232, 229, 25, 5, 76, 232, 229, 25, - 5, 78, 232, 229, 218, 74, 1, 192, 232, 229, 218, 74, 1, 205, 232, 229, - 218, 74, 1, 212, 65, 232, 229, 4, 1, 176, 232, 229, 4, 1, 229, 82, 232, - 229, 4, 1, 254, 83, 232, 229, 4, 1, 217, 106, 232, 229, 4, 1, 198, 232, - 229, 4, 1, 191, 232, 229, 4, 1, 186, 232, 229, 4, 1, 205, 232, 229, 4, 1, - 233, 141, 232, 229, 5, 230, 94, 232, 229, 5, 234, 177, 232, 229, 5, 222, - 34, 232, 229, 5, 232, 133, 232, 229, 245, 39, 79, 232, 229, 224, 16, 79, - 232, 229, 21, 210, 86, 232, 229, 21, 111, 232, 229, 21, 105, 232, 229, - 21, 158, 232, 229, 21, 161, 232, 229, 21, 190, 232, 229, 21, 195, 232, - 229, 21, 199, 232, 229, 21, 196, 232, 229, 21, 201, 39, 233, 65, 1, 176, - 39, 233, 65, 1, 211, 165, 39, 233, 65, 1, 229, 82, 39, 233, 65, 1, 215, - 184, 39, 233, 65, 1, 206, 39, 233, 65, 1, 192, 39, 233, 65, 1, 217, 106, - 39, 233, 65, 1, 216, 209, 39, 233, 65, 1, 233, 141, 39, 233, 65, 1, 191, - 39, 233, 65, 1, 225, 150, 39, 233, 65, 1, 186, 39, 233, 65, 1, 244, 204, - 39, 233, 65, 1, 214, 27, 39, 233, 65, 1, 162, 39, 233, 65, 1, 224, 91, - 39, 233, 65, 1, 234, 138, 39, 233, 65, 1, 215, 176, 39, 233, 65, 1, 198, - 39, 233, 65, 1, 61, 39, 233, 65, 1, 74, 39, 233, 65, 1, 245, 217, 39, - 233, 65, 1, 245, 205, 39, 233, 65, 1, 69, 39, 233, 65, 1, 226, 187, 39, - 233, 65, 1, 78, 39, 233, 65, 1, 214, 214, 39, 233, 65, 1, 76, 39, 233, - 65, 1, 253, 198, 39, 233, 65, 1, 254, 210, 39, 233, 65, 1, 216, 29, 39, - 233, 65, 1, 216, 28, 39, 233, 65, 1, 216, 27, 39, 233, 65, 1, 216, 26, - 39, 233, 65, 1, 216, 25, 166, 39, 173, 1, 125, 224, 91, 166, 39, 173, 1, - 121, 224, 91, 166, 39, 173, 1, 125, 176, 166, 39, 173, 1, 125, 211, 165, - 166, 39, 173, 1, 125, 229, 82, 166, 39, 173, 1, 121, 176, 166, 39, 173, - 1, 121, 211, 165, 166, 39, 173, 1, 121, 229, 82, 166, 39, 173, 1, 125, - 215, 184, 166, 39, 173, 1, 125, 206, 166, 39, 173, 1, 125, 192, 166, 39, - 173, 1, 121, 215, 184, 166, 39, 173, 1, 121, 206, 166, 39, 173, 1, 121, - 192, 166, 39, 173, 1, 125, 217, 106, 166, 39, 173, 1, 125, 216, 209, 166, - 39, 173, 1, 125, 198, 166, 39, 173, 1, 121, 217, 106, 166, 39, 173, 1, - 121, 216, 209, 166, 39, 173, 1, 121, 198, 166, 39, 173, 1, 125, 191, 166, - 39, 173, 1, 125, 225, 150, 166, 39, 173, 1, 125, 186, 166, 39, 173, 1, - 121, 191, 166, 39, 173, 1, 121, 225, 150, 166, 39, 173, 1, 121, 186, 166, - 39, 173, 1, 125, 244, 204, 166, 39, 173, 1, 125, 214, 27, 166, 39, 173, - 1, 125, 233, 141, 166, 39, 173, 1, 121, 244, 204, 166, 39, 173, 1, 121, - 214, 27, 166, 39, 173, 1, 121, 233, 141, 166, 39, 173, 1, 125, 162, 166, - 39, 173, 1, 125, 248, 229, 166, 39, 173, 1, 125, 252, 199, 166, 39, 173, - 1, 121, 162, 166, 39, 173, 1, 121, 248, 229, 166, 39, 173, 1, 121, 252, - 199, 166, 39, 173, 1, 125, 233, 190, 166, 39, 173, 1, 125, 211, 138, 166, - 39, 173, 1, 121, 233, 190, 166, 39, 173, 1, 121, 211, 138, 166, 39, 173, - 1, 125, 218, 83, 166, 39, 173, 1, 121, 218, 83, 166, 39, 173, 25, 5, 25, - 219, 241, 166, 39, 173, 25, 5, 255, 82, 166, 39, 173, 25, 5, 236, 40, - 166, 39, 173, 25, 5, 69, 166, 39, 173, 25, 5, 214, 118, 166, 39, 173, 25, - 5, 76, 166, 39, 173, 25, 5, 254, 252, 166, 39, 173, 25, 5, 78, 166, 39, - 173, 25, 5, 227, 4, 166, 39, 173, 25, 5, 214, 214, 166, 39, 173, 25, 5, - 253, 175, 166, 39, 173, 25, 5, 255, 37, 166, 39, 173, 25, 5, 214, 111, - 166, 39, 173, 25, 5, 226, 113, 166, 39, 173, 25, 5, 227, 1, 166, 39, 173, - 25, 5, 214, 210, 166, 39, 173, 25, 5, 235, 158, 166, 39, 173, 1, 40, 214, - 105, 166, 39, 173, 1, 40, 229, 84, 166, 39, 173, 1, 40, 230, 30, 166, 39, - 173, 1, 40, 194, 166, 39, 173, 1, 40, 235, 29, 166, 39, 173, 1, 40, 249, - 68, 166, 39, 173, 1, 40, 253, 166, 166, 39, 173, 138, 231, 163, 166, 39, - 173, 138, 231, 162, 166, 39, 173, 21, 210, 86, 166, 39, 173, 21, 111, - 166, 39, 173, 21, 105, 166, 39, 173, 21, 158, 166, 39, 173, 21, 161, 166, - 39, 173, 21, 190, 166, 39, 173, 21, 195, 166, 39, 173, 21, 199, 166, 39, - 173, 21, 196, 166, 39, 173, 21, 201, 166, 39, 173, 89, 21, 111, 166, 39, - 173, 5, 233, 126, 166, 39, 173, 5, 233, 125, 70, 16, 225, 240, 70, 16, - 230, 77, 234, 31, 70, 16, 225, 75, 234, 31, 70, 16, 252, 58, 234, 31, 70, - 16, 251, 112, 234, 31, 70, 16, 224, 219, 234, 31, 70, 16, 224, 213, 234, - 31, 70, 16, 224, 211, 234, 31, 70, 16, 224, 217, 234, 31, 70, 16, 224, - 215, 234, 31, 70, 16, 248, 181, 234, 31, 70, 16, 248, 177, 234, 31, 70, - 16, 248, 176, 234, 31, 70, 16, 248, 179, 234, 31, 70, 16, 248, 178, 234, - 31, 70, 16, 248, 175, 234, 31, 70, 16, 215, 87, 70, 16, 230, 77, 222, - 207, 70, 16, 225, 75, 222, 207, 70, 16, 252, 58, 222, 207, 70, 16, 251, - 112, 222, 207, 70, 16, 224, 219, 222, 207, 70, 16, 224, 213, 222, 207, - 70, 16, 224, 211, 222, 207, 70, 16, 224, 217, 222, 207, 70, 16, 224, 215, - 222, 207, 70, 16, 248, 181, 222, 207, 70, 16, 248, 177, 222, 207, 70, 16, - 248, 176, 222, 207, 70, 16, 248, 179, 222, 207, 70, 16, 248, 178, 222, - 207, 70, 16, 248, 175, 222, 207, 251, 129, 1, 176, 251, 129, 1, 243, 142, - 251, 129, 1, 229, 82, 251, 129, 1, 229, 27, 251, 129, 1, 191, 251, 129, - 1, 252, 199, 251, 129, 1, 186, 251, 129, 1, 230, 110, 251, 129, 1, 217, - 106, 251, 129, 1, 248, 229, 251, 129, 1, 198, 251, 129, 1, 228, 41, 251, - 129, 1, 251, 41, 251, 129, 1, 235, 147, 251, 129, 1, 227, 169, 251, 129, - 1, 227, 162, 251, 129, 1, 192, 251, 129, 1, 205, 251, 129, 1, 233, 141, - 251, 129, 1, 214, 27, 251, 129, 1, 206, 251, 129, 1, 61, 251, 129, 1, - 162, 251, 129, 25, 5, 74, 251, 129, 25, 5, 69, 251, 129, 25, 5, 76, 251, - 129, 25, 5, 78, 251, 129, 25, 5, 254, 252, 251, 129, 226, 64, 251, 129, - 245, 151, 64, 221, 174, 39, 89, 1, 125, 176, 39, 89, 1, 125, 234, 138, - 39, 89, 1, 125, 233, 177, 39, 89, 1, 121, 176, 39, 89, 1, 121, 233, 177, - 39, 89, 1, 121, 234, 138, 39, 89, 1, 229, 82, 39, 89, 1, 125, 251, 41, - 39, 89, 1, 125, 250, 165, 39, 89, 1, 121, 251, 41, 39, 89, 1, 121, 206, - 39, 89, 1, 121, 250, 165, 39, 89, 1, 227, 169, 39, 89, 1, 223, 143, 39, - 89, 1, 125, 223, 141, 39, 89, 1, 248, 229, 39, 89, 1, 121, 223, 141, 39, - 89, 1, 223, 152, 39, 89, 1, 125, 217, 106, 39, 89, 1, 125, 216, 209, 39, - 89, 1, 121, 217, 106, 39, 89, 1, 121, 216, 209, 39, 89, 1, 198, 39, 89, - 1, 252, 199, 39, 89, 1, 125, 191, 39, 89, 1, 125, 225, 150, 39, 89, 1, - 125, 244, 204, 39, 89, 1, 121, 191, 39, 89, 1, 121, 244, 204, 39, 89, 1, - 121, 225, 150, 39, 89, 1, 186, 39, 89, 1, 121, 192, 39, 89, 1, 125, 192, - 39, 89, 1, 205, 39, 89, 1, 222, 139, 39, 89, 1, 233, 141, 39, 89, 1, 232, - 98, 39, 89, 1, 212, 65, 39, 89, 1, 125, 220, 104, 39, 89, 1, 125, 218, - 225, 39, 89, 1, 125, 206, 39, 89, 1, 125, 162, 39, 89, 1, 232, 190, 39, - 89, 1, 61, 39, 89, 1, 121, 162, 39, 89, 1, 74, 39, 89, 1, 236, 40, 39, - 89, 1, 69, 39, 89, 1, 214, 118, 39, 89, 1, 245, 217, 39, 89, 1, 226, 187, - 39, 89, 1, 233, 126, 39, 89, 1, 242, 139, 206, 39, 89, 117, 5, 147, 205, - 39, 89, 117, 5, 147, 233, 141, 39, 89, 117, 5, 233, 142, 217, 59, 233, - 115, 39, 89, 5, 231, 209, 234, 237, 233, 115, 39, 89, 117, 5, 40, 229, - 82, 39, 89, 117, 5, 121, 191, 39, 89, 117, 5, 125, 223, 142, 177, 121, - 191, 39, 89, 117, 5, 186, 39, 89, 117, 5, 252, 199, 39, 89, 117, 5, 206, - 39, 89, 5, 222, 12, 39, 89, 25, 5, 61, 39, 89, 25, 5, 231, 209, 221, 228, - 39, 89, 25, 5, 255, 82, 39, 89, 25, 5, 217, 65, 255, 82, 39, 89, 25, 5, - 74, 39, 89, 25, 5, 236, 40, 39, 89, 25, 5, 214, 214, 39, 89, 25, 5, 214, - 117, 39, 89, 25, 5, 69, 39, 89, 25, 5, 214, 118, 39, 89, 25, 5, 78, 39, - 89, 25, 5, 227, 5, 51, 39, 89, 25, 5, 226, 113, 39, 89, 25, 5, 76, 39, - 89, 25, 5, 254, 252, 39, 89, 25, 5, 226, 187, 39, 89, 25, 5, 254, 210, - 39, 89, 25, 5, 89, 254, 210, 39, 89, 25, 5, 227, 5, 48, 39, 89, 5, 231, - 209, 234, 236, 39, 89, 5, 216, 30, 39, 89, 5, 216, 29, 39, 89, 5, 234, - 103, 216, 28, 39, 89, 5, 234, 103, 216, 27, 39, 89, 5, 234, 103, 216, 26, - 39, 89, 5, 223, 191, 242, 52, 39, 89, 5, 231, 209, 221, 255, 39, 89, 5, - 234, 102, 234, 221, 39, 89, 38, 249, 123, 247, 128, 39, 89, 241, 53, 21, - 210, 86, 39, 89, 241, 53, 21, 111, 39, 89, 241, 53, 21, 105, 39, 89, 241, - 53, 21, 158, 39, 89, 241, 53, 21, 161, 39, 89, 241, 53, 21, 190, 39, 89, - 241, 53, 21, 195, 39, 89, 241, 53, 21, 199, 39, 89, 241, 53, 21, 196, 39, - 89, 241, 53, 21, 201, 39, 89, 89, 21, 210, 86, 39, 89, 89, 21, 111, 39, - 89, 89, 21, 105, 39, 89, 89, 21, 158, 39, 89, 89, 21, 161, 39, 89, 89, - 21, 190, 39, 89, 89, 21, 195, 39, 89, 89, 21, 199, 39, 89, 89, 21, 196, - 39, 89, 89, 21, 201, 39, 89, 5, 211, 249, 39, 89, 5, 211, 248, 39, 89, 5, - 221, 217, 39, 89, 5, 234, 166, 39, 89, 5, 240, 239, 39, 89, 5, 247, 142, - 39, 89, 5, 223, 52, 222, 189, 223, 152, 39, 89, 5, 231, 209, 211, 72, 39, - 89, 5, 235, 12, 39, 89, 5, 235, 11, 39, 89, 5, 221, 224, 39, 89, 5, 221, - 223, 39, 89, 5, 242, 16, 39, 89, 5, 251, 38, 102, 5, 214, 200, 223, 33, - 102, 5, 214, 200, 251, 9, 102, 5, 250, 194, 102, 5, 218, 16, 102, 5, 251, - 241, 102, 1, 254, 193, 102, 1, 254, 194, 217, 14, 102, 1, 236, 36, 102, - 1, 236, 37, 217, 14, 102, 1, 214, 203, 102, 1, 214, 204, 217, 14, 102, 1, - 223, 191, 223, 82, 102, 1, 223, 191, 223, 83, 217, 14, 102, 1, 233, 142, - 233, 30, 102, 1, 233, 142, 233, 31, 217, 14, 102, 1, 245, 187, 102, 1, - 254, 208, 102, 1, 226, 216, 102, 1, 226, 217, 217, 14, 102, 1, 176, 102, - 1, 235, 19, 231, 212, 102, 1, 243, 142, 102, 1, 243, 143, 242, 168, 102, - 1, 229, 82, 102, 1, 251, 41, 102, 1, 251, 42, 233, 129, 102, 1, 235, 147, - 102, 1, 235, 148, 235, 124, 102, 1, 227, 169, 102, 1, 217, 107, 233, 82, - 102, 1, 217, 107, 230, 72, 231, 212, 102, 1, 248, 230, 230, 72, 254, 153, - 102, 1, 248, 230, 230, 72, 231, 212, 102, 1, 229, 234, 223, 155, 102, 1, - 217, 106, 102, 1, 217, 107, 217, 36, 102, 1, 248, 229, 102, 1, 248, 230, - 231, 230, 102, 1, 198, 102, 1, 191, 102, 1, 226, 94, 234, 232, 102, 1, - 252, 199, 102, 1, 252, 200, 234, 178, 102, 1, 186, 102, 1, 192, 102, 1, - 205, 102, 1, 233, 141, 102, 1, 212, 65, 102, 1, 222, 36, 222, 22, 102, 1, - 222, 36, 221, 235, 102, 1, 206, 102, 1, 162, 102, 5, 223, 73, 102, 25, 5, - 217, 14, 102, 25, 5, 214, 199, 102, 25, 5, 214, 200, 221, 231, 102, 25, - 5, 218, 48, 102, 25, 5, 218, 49, 236, 28, 102, 25, 5, 223, 191, 223, 82, - 102, 25, 5, 223, 191, 223, 83, 217, 14, 102, 25, 5, 233, 142, 233, 30, - 102, 25, 5, 233, 142, 233, 31, 217, 14, 102, 25, 5, 217, 66, 102, 25, 5, - 217, 67, 223, 82, 102, 25, 5, 217, 67, 217, 14, 102, 25, 5, 217, 67, 223, - 83, 217, 14, 102, 25, 5, 225, 187, 102, 25, 5, 225, 188, 217, 14, 102, - 255, 3, 255, 2, 102, 1, 235, 1, 221, 230, 102, 1, 234, 108, 221, 230, - 102, 1, 215, 34, 221, 230, 102, 1, 245, 211, 221, 230, 102, 1, 214, 0, - 221, 230, 102, 1, 210, 107, 221, 230, 102, 1, 253, 217, 221, 230, 102, - 21, 210, 86, 102, 21, 111, 102, 21, 105, 102, 21, 158, 102, 21, 161, 102, - 21, 190, 102, 21, 195, 102, 21, 199, 102, 21, 196, 102, 21, 201, 102, - 226, 33, 102, 226, 59, 102, 211, 238, 102, 250, 244, 226, 52, 102, 250, - 244, 219, 174, 102, 250, 244, 226, 6, 102, 226, 58, 102, 28, 16, 247, - 134, 102, 28, 16, 248, 59, 102, 28, 16, 246, 72, 102, 28, 16, 248, 184, - 102, 28, 16, 248, 185, 218, 16, 102, 28, 16, 247, 213, 102, 28, 16, 248, - 222, 102, 28, 16, 248, 41, 102, 28, 16, 248, 206, 102, 28, 16, 248, 185, - 243, 64, 102, 28, 16, 38, 217, 10, 102, 28, 16, 38, 245, 149, 102, 28, - 16, 38, 234, 173, 102, 28, 16, 38, 234, 175, 102, 28, 16, 38, 235, 128, - 102, 28, 16, 38, 234, 174, 2, 235, 128, 102, 28, 16, 38, 234, 176, 2, - 235, 128, 102, 28, 16, 38, 252, 45, 102, 28, 16, 38, 242, 172, 102, 28, - 16, 222, 252, 204, 246, 82, 102, 28, 16, 222, 252, 204, 248, 220, 102, - 28, 16, 222, 252, 250, 8, 215, 112, 102, 28, 16, 222, 252, 250, 8, 217, - 74, 102, 28, 16, 233, 50, 204, 226, 47, 102, 28, 16, 233, 50, 204, 224, - 142, 102, 28, 16, 233, 50, 250, 8, 225, 41, 102, 28, 16, 233, 50, 250, 8, - 225, 29, 102, 28, 16, 233, 50, 204, 225, 64, 207, 5, 226, 30, 207, 5, - 226, 43, 207, 5, 226, 39, 207, 1, 61, 207, 1, 74, 207, 1, 69, 207, 1, - 254, 252, 207, 1, 78, 207, 1, 76, 207, 1, 245, 63, 207, 1, 176, 207, 1, - 224, 91, 207, 1, 243, 142, 207, 1, 229, 82, 207, 1, 251, 41, 207, 1, 235, - 147, 207, 1, 210, 116, 207, 1, 227, 169, 207, 1, 217, 106, 207, 1, 248, - 229, 207, 1, 198, 207, 1, 191, 207, 1, 244, 204, 207, 1, 214, 27, 207, 1, - 252, 199, 207, 1, 186, 207, 1, 192, 207, 1, 205, 207, 1, 233, 141, 207, - 1, 212, 65, 207, 1, 206, 207, 1, 211, 165, 207, 1, 162, 207, 117, 5, 226, - 56, 207, 117, 5, 226, 32, 207, 117, 5, 226, 29, 207, 25, 5, 226, 46, 207, - 25, 5, 226, 28, 207, 25, 5, 226, 50, 207, 25, 5, 226, 38, 207, 25, 5, - 226, 57, 207, 25, 5, 226, 48, 207, 5, 226, 60, 207, 5, 213, 152, 207, - 117, 5, 225, 252, 186, 207, 117, 5, 225, 252, 212, 65, 207, 1, 234, 138, - 207, 1, 217, 232, 207, 21, 210, 86, 207, 21, 111, 207, 21, 105, 207, 21, - 158, 207, 21, 161, 207, 21, 190, 207, 21, 195, 207, 21, 199, 207, 21, - 196, 207, 21, 201, 207, 253, 183, 207, 1, 223, 55, 207, 1, 233, 13, 207, - 1, 252, 26, 207, 1, 40, 235, 29, 207, 1, 40, 194, 252, 128, 1, 61, 252, - 128, 1, 219, 166, 61, 252, 128, 1, 162, 252, 128, 1, 219, 166, 162, 252, - 128, 1, 231, 186, 162, 252, 128, 1, 252, 199, 252, 128, 1, 234, 218, 252, - 199, 252, 128, 1, 191, 252, 128, 1, 219, 166, 191, 252, 128, 1, 198, 252, - 128, 1, 231, 186, 198, 252, 128, 1, 212, 65, 252, 128, 1, 219, 166, 212, - 65, 252, 128, 1, 226, 71, 212, 65, 252, 128, 1, 243, 142, 252, 128, 1, - 219, 166, 243, 142, 252, 128, 1, 235, 147, 252, 128, 1, 248, 229, 252, - 128, 1, 205, 252, 128, 1, 219, 166, 205, 252, 128, 1, 186, 252, 128, 1, - 219, 166, 186, 252, 128, 1, 219, 28, 217, 106, 252, 128, 1, 228, 60, 217, - 106, 252, 128, 1, 206, 252, 128, 1, 219, 166, 206, 252, 128, 1, 231, 186, - 206, 252, 128, 1, 192, 252, 128, 1, 219, 166, 192, 252, 128, 1, 229, 82, - 252, 128, 1, 233, 141, 252, 128, 1, 219, 166, 233, 141, 252, 128, 1, 227, - 169, 252, 128, 1, 251, 41, 252, 128, 1, 229, 153, 252, 128, 1, 231, 129, - 252, 128, 1, 74, 252, 128, 1, 69, 252, 128, 5, 216, 34, 252, 128, 25, 5, - 76, 252, 128, 25, 5, 226, 71, 76, 252, 128, 25, 5, 245, 217, 252, 128, - 25, 5, 74, 252, 128, 25, 5, 234, 218, 74, 252, 128, 25, 5, 78, 252, 128, - 25, 5, 234, 218, 78, 252, 128, 25, 5, 69, 252, 128, 25, 5, 104, 31, 219, - 166, 206, 252, 128, 117, 5, 229, 84, 252, 128, 117, 5, 242, 67, 252, 128, - 226, 41, 252, 128, 226, 37, 252, 128, 16, 251, 249, 229, 234, 231, 42, - 252, 128, 16, 251, 249, 225, 67, 252, 128, 16, 251, 249, 235, 54, 252, - 128, 16, 251, 249, 226, 41, 197, 1, 176, 197, 1, 234, 45, 197, 1, 234, - 138, 197, 1, 243, 142, 197, 1, 242, 193, 197, 1, 229, 82, 197, 1, 251, - 41, 197, 1, 250, 165, 197, 1, 235, 147, 197, 1, 227, 169, 197, 1, 217, - 106, 197, 1, 216, 209, 197, 1, 248, 229, 197, 1, 198, 197, 1, 191, 197, - 1, 225, 45, 197, 1, 225, 150, 197, 1, 244, 204, 197, 1, 244, 83, 197, 1, - 252, 199, 197, 1, 251, 230, 197, 1, 186, 197, 1, 230, 173, 197, 1, 215, - 184, 197, 1, 215, 176, 197, 1, 246, 46, 197, 1, 192, 197, 1, 205, 197, 1, - 233, 141, 197, 1, 162, 197, 1, 241, 160, 197, 1, 214, 27, 197, 1, 206, - 197, 1, 220, 104, 197, 1, 212, 65, 197, 1, 61, 197, 218, 74, 1, 192, 197, - 218, 74, 1, 205, 197, 25, 5, 255, 82, 197, 25, 5, 74, 197, 25, 5, 78, - 197, 25, 5, 226, 187, 197, 25, 5, 69, 197, 25, 5, 214, 118, 197, 25, 5, - 76, 197, 117, 5, 235, 29, 197, 117, 5, 194, 197, 117, 5, 156, 197, 117, - 5, 230, 30, 197, 117, 5, 226, 109, 197, 117, 5, 153, 197, 117, 5, 217, - 153, 197, 117, 5, 227, 146, 197, 117, 5, 234, 236, 197, 5, 223, 153, 197, - 5, 227, 209, 197, 224, 144, 217, 104, 197, 224, 144, 227, 156, 216, 121, - 217, 104, 197, 224, 144, 250, 172, 197, 224, 144, 215, 171, 250, 172, - 197, 224, 144, 215, 170, 197, 21, 210, 86, 197, 21, 111, 197, 21, 105, - 197, 21, 158, 197, 21, 161, 197, 21, 190, 197, 21, 195, 197, 21, 199, - 197, 21, 196, 197, 21, 201, 197, 1, 215, 157, 197, 1, 215, 145, 197, 1, - 248, 143, 226, 214, 250, 111, 21, 210, 86, 226, 214, 250, 111, 21, 111, - 226, 214, 250, 111, 21, 105, 226, 214, 250, 111, 21, 158, 226, 214, 250, - 111, 21, 161, 226, 214, 250, 111, 21, 190, 226, 214, 250, 111, 21, 195, - 226, 214, 250, 111, 21, 199, 226, 214, 250, 111, 21, 196, 226, 214, 250, - 111, 21, 201, 226, 214, 250, 111, 1, 233, 141, 226, 214, 250, 111, 1, - 253, 214, 226, 214, 250, 111, 1, 254, 225, 226, 214, 250, 111, 1, 254, - 123, 226, 214, 250, 111, 1, 254, 187, 226, 214, 250, 111, 1, 233, 140, - 226, 214, 250, 111, 1, 255, 44, 226, 214, 250, 111, 1, 255, 45, 226, 214, - 250, 111, 1, 255, 43, 226, 214, 250, 111, 1, 255, 38, 226, 214, 250, 111, - 1, 232, 247, 226, 214, 250, 111, 1, 235, 178, 226, 214, 250, 111, 1, 236, - 41, 226, 214, 250, 111, 1, 235, 197, 226, 214, 250, 111, 1, 235, 186, - 226, 214, 250, 111, 1, 232, 103, 226, 214, 250, 111, 1, 214, 221, 226, - 214, 250, 111, 1, 214, 219, 226, 214, 250, 111, 1, 214, 168, 226, 214, - 250, 111, 1, 214, 111, 226, 214, 250, 111, 1, 233, 64, 226, 214, 250, - 111, 1, 245, 116, 226, 214, 250, 111, 1, 245, 220, 226, 214, 250, 111, 1, - 245, 158, 226, 214, 250, 111, 1, 245, 94, 226, 214, 250, 111, 1, 232, - 162, 226, 214, 250, 111, 1, 226, 141, 226, 214, 250, 111, 1, 227, 0, 226, - 214, 250, 111, 1, 226, 129, 226, 214, 250, 111, 1, 226, 226, 226, 214, - 250, 111, 230, 108, 215, 122, 226, 214, 250, 111, 243, 137, 215, 123, - 226, 214, 250, 111, 230, 106, 215, 123, 226, 214, 250, 111, 223, 95, 226, - 214, 250, 111, 225, 148, 226, 214, 250, 111, 254, 217, 226, 214, 250, - 111, 224, 144, 230, 103, 226, 214, 250, 111, 224, 144, 52, 230, 103, 207, - 224, 144, 251, 249, 218, 9, 207, 224, 144, 251, 249, 226, 42, 207, 224, - 144, 251, 249, 224, 132, 207, 224, 144, 251, 249, 251, 27, 207, 224, 144, - 251, 249, 233, 14, 221, 227, 207, 224, 144, 251, 249, 235, 19, 221, 227, - 207, 224, 144, 251, 249, 248, 230, 221, 227, 207, 224, 144, 251, 249, - 252, 200, 221, 227, 213, 252, 138, 234, 216, 213, 252, 138, 220, 79, 213, - 252, 138, 224, 201, 213, 252, 5, 228, 214, 213, 252, 5, 211, 80, 230, - 227, 218, 1, 213, 252, 138, 211, 80, 254, 222, 235, 250, 218, 1, 213, - 252, 138, 211, 80, 235, 250, 218, 1, 213, 252, 138, 211, 80, 234, 204, - 235, 250, 218, 1, 213, 252, 138, 251, 10, 51, 213, 252, 138, 211, 80, - 234, 204, 235, 250, 218, 2, 221, 199, 213, 252, 138, 52, 218, 1, 213, - 252, 138, 215, 212, 218, 1, 213, 252, 138, 234, 204, 254, 85, 213, 252, - 138, 59, 51, 213, 252, 138, 113, 170, 51, 213, 252, 138, 134, 170, 51, - 213, 252, 138, 222, 243, 234, 215, 235, 250, 218, 1, 213, 252, 138, 253, - 212, 235, 250, 218, 1, 213, 252, 5, 213, 148, 218, 1, 213, 252, 5, 213, - 148, 214, 216, 213, 252, 5, 223, 52, 213, 148, 214, 216, 213, 252, 5, - 213, 148, 254, 85, 213, 252, 5, 223, 52, 213, 148, 254, 85, 213, 252, 5, - 213, 148, 214, 217, 2, 217, 78, 213, 252, 5, 213, 148, 254, 86, 2, 217, - 78, 213, 252, 5, 254, 84, 254, 99, 213, 252, 5, 254, 84, 252, 174, 213, - 252, 5, 254, 84, 214, 20, 213, 252, 5, 254, 84, 214, 21, 2, 217, 78, 213, - 252, 5, 216, 69, 213, 252, 5, 241, 198, 200, 254, 83, 213, 252, 5, 200, - 254, 83, 213, 252, 5, 222, 144, 200, 254, 83, 213, 252, 5, 254, 84, 214, - 223, 230, 95, 213, 252, 5, 254, 28, 213, 252, 5, 222, 189, 254, 28, 213, - 252, 138, 251, 10, 48, 213, 252, 5, 235, 108, 213, 252, 5, 214, 161, 7, - 1, 4, 6, 61, 7, 1, 4, 6, 254, 252, 7, 4, 1, 215, 94, 254, 252, 7, 1, 4, - 6, 252, 142, 253, 166, 7, 1, 4, 6, 251, 74, 7, 1, 4, 6, 249, 68, 7, 1, 4, - 6, 245, 67, 7, 1, 4, 6, 76, 7, 4, 1, 215, 94, 204, 76, 7, 4, 1, 215, 94, - 74, 7, 1, 4, 6, 235, 150, 7, 1, 4, 6, 235, 29, 7, 1, 4, 6, 233, 155, 2, - 91, 7, 1, 4, 6, 194, 7, 1, 4, 6, 223, 52, 230, 30, 7, 1, 4, 6, 78, 7, 1, - 4, 6, 204, 78, 7, 4, 1, 219, 189, 78, 7, 4, 1, 219, 189, 204, 78, 7, 4, - 1, 219, 189, 144, 2, 91, 7, 4, 1, 215, 94, 226, 238, 7, 1, 4, 6, 226, - 138, 7, 4, 1, 216, 15, 163, 78, 7, 4, 1, 251, 183, 163, 78, 7, 1, 4, 6, - 226, 109, 7, 1, 4, 6, 223, 52, 153, 7, 1, 4, 6, 215, 94, 153, 7, 1, 4, 6, - 217, 153, 7, 1, 4, 6, 69, 7, 4, 1, 219, 189, 69, 7, 4, 1, 219, 189, 248, - 8, 69, 7, 4, 1, 219, 189, 215, 94, 194, 7, 1, 4, 6, 214, 105, 7, 1, 4, 6, - 212, 98, 7, 1, 4, 6, 210, 159, 7, 1, 4, 6, 245, 16, 7, 1, 213, 135, 233, - 88, 218, 252, 7, 1, 254, 205, 26, 1, 4, 6, 243, 114, 26, 1, 4, 6, 233, - 104, 26, 1, 4, 6, 225, 111, 26, 1, 4, 6, 223, 40, 26, 1, 4, 6, 224, 164, - 33, 1, 4, 6, 245, 182, 58, 1, 6, 61, 58, 1, 6, 254, 252, 58, 1, 6, 253, - 166, 58, 1, 6, 252, 142, 253, 166, 58, 1, 6, 249, 68, 58, 1, 6, 76, 58, - 1, 6, 223, 52, 76, 58, 1, 6, 243, 209, 58, 1, 6, 242, 67, 58, 1, 6, 74, - 58, 1, 6, 235, 150, 58, 1, 6, 235, 29, 58, 1, 6, 156, 58, 1, 6, 194, 58, - 1, 6, 230, 30, 58, 1, 6, 223, 52, 230, 30, 58, 1, 6, 78, 58, 1, 6, 226, - 138, 58, 1, 6, 226, 109, 58, 1, 6, 153, 58, 1, 6, 217, 153, 58, 1, 6, 69, - 58, 1, 6, 212, 98, 58, 1, 4, 61, 58, 1, 4, 215, 94, 61, 58, 1, 4, 254, - 151, 58, 1, 4, 215, 94, 254, 252, 58, 1, 4, 253, 166, 58, 1, 4, 249, 68, - 58, 1, 4, 76, 58, 1, 4, 221, 197, 58, 1, 4, 204, 76, 58, 1, 4, 215, 94, - 204, 76, 58, 1, 4, 243, 209, 58, 1, 4, 215, 94, 74, 58, 1, 4, 235, 29, - 58, 1, 4, 194, 58, 1, 4, 245, 146, 58, 1, 4, 78, 58, 1, 4, 204, 78, 58, - 1, 4, 216, 15, 163, 78, 58, 1, 4, 251, 183, 163, 78, 58, 1, 4, 226, 109, - 58, 1, 4, 217, 153, 58, 1, 4, 69, 58, 1, 4, 219, 189, 69, 58, 1, 4, 215, - 94, 194, 58, 1, 4, 214, 105, 58, 1, 4, 254, 205, 58, 1, 4, 252, 34, 58, - 1, 4, 26, 243, 114, 58, 1, 4, 248, 62, 58, 1, 4, 26, 225, 136, 58, 1, 4, - 250, 118, 7, 218, 66, 4, 1, 74, 7, 218, 66, 4, 1, 153, 7, 218, 66, 4, 1, - 69, 7, 218, 66, 4, 1, 214, 105, 26, 218, 66, 4, 1, 252, 34, 26, 218, 66, - 4, 1, 243, 114, 26, 218, 66, 4, 1, 223, 40, 26, 218, 66, 4, 1, 225, 136, - 26, 218, 66, 4, 1, 250, 118, 7, 4, 1, 214, 214, 7, 4, 1, 57, 2, 230, 229, - 184, 7, 4, 1, 249, 69, 2, 230, 229, 184, 7, 4, 1, 245, 15, 2, 230, 229, - 184, 7, 4, 1, 232, 55, 2, 230, 229, 184, 7, 4, 1, 230, 31, 2, 230, 229, - 184, 7, 4, 1, 226, 110, 2, 230, 229, 184, 7, 4, 1, 223, 227, 2, 230, 229, - 184, 7, 4, 1, 223, 227, 2, 244, 96, 22, 230, 229, 184, 7, 4, 1, 222, 94, - 2, 230, 229, 184, 7, 4, 1, 217, 154, 2, 230, 229, 184, 7, 4, 1, 210, 160, - 2, 230, 229, 184, 7, 4, 1, 215, 94, 243, 209, 58, 1, 33, 245, 158, 7, 4, - 1, 235, 220, 243, 209, 7, 4, 1, 216, 212, 2, 218, 109, 7, 4, 6, 1, 240, - 161, 2, 91, 7, 4, 1, 235, 193, 2, 91, 7, 4, 1, 226, 110, 2, 91, 7, 4, 6, - 1, 104, 2, 91, 7, 4, 1, 214, 158, 2, 91, 7, 4, 1, 57, 2, 226, 70, 103, 7, - 4, 1, 249, 69, 2, 226, 70, 103, 7, 4, 1, 245, 15, 2, 226, 70, 103, 7, 4, - 1, 243, 210, 2, 226, 70, 103, 7, 4, 1, 235, 30, 2, 226, 70, 103, 7, 4, 1, - 233, 155, 2, 226, 70, 103, 7, 4, 1, 232, 55, 2, 226, 70, 103, 7, 4, 1, - 230, 31, 2, 226, 70, 103, 7, 4, 1, 226, 110, 2, 226, 70, 103, 7, 4, 1, - 223, 227, 2, 226, 70, 103, 7, 4, 1, 222, 94, 2, 226, 70, 103, 7, 4, 1, - 245, 84, 2, 226, 70, 103, 7, 4, 1, 214, 106, 2, 226, 70, 103, 7, 4, 1, - 211, 179, 2, 226, 70, 103, 7, 4, 1, 210, 160, 2, 226, 70, 103, 7, 4, 1, - 116, 2, 223, 58, 103, 7, 4, 1, 254, 152, 2, 223, 58, 103, 7, 4, 1, 249, - 69, 2, 241, 59, 22, 217, 78, 7, 4, 1, 160, 2, 223, 58, 103, 7, 4, 1, 204, - 160, 2, 223, 58, 103, 7, 4, 1, 223, 52, 204, 160, 2, 223, 58, 103, 7, 4, - 1, 221, 198, 2, 223, 58, 103, 7, 4, 1, 240, 161, 2, 223, 58, 103, 7, 4, - 1, 204, 144, 2, 223, 58, 103, 7, 4, 1, 245, 84, 2, 223, 58, 103, 7, 4, 1, - 104, 2, 223, 58, 103, 7, 4, 1, 245, 17, 2, 223, 58, 103, 58, 1, 4, 215, - 94, 254, 151, 58, 1, 4, 251, 74, 58, 1, 4, 251, 75, 2, 249, 108, 58, 1, - 4, 245, 67, 58, 1, 4, 223, 52, 204, 76, 58, 1, 4, 245, 14, 58, 1, 4, 247, - 127, 235, 151, 2, 91, 58, 1, 4, 119, 243, 209, 58, 1, 4, 215, 94, 242, - 67, 58, 1, 4, 240, 161, 2, 91, 58, 1, 4, 235, 192, 58, 1, 4, 6, 74, 58, - 1, 4, 6, 240, 161, 2, 91, 58, 1, 4, 235, 151, 2, 249, 135, 58, 1, 4, 233, - 155, 2, 223, 58, 103, 58, 1, 4, 233, 155, 2, 226, 70, 103, 58, 1, 4, 6, - 156, 58, 1, 4, 232, 55, 2, 103, 58, 1, 4, 215, 94, 232, 55, 2, 200, 233, - 42, 58, 1, 4, 230, 31, 2, 43, 103, 58, 1, 4, 230, 31, 2, 223, 58, 103, - 58, 1, 4, 6, 230, 30, 58, 1, 4, 252, 142, 78, 58, 1, 4, 225, 136, 58, 1, - 4, 222, 94, 2, 103, 58, 1, 4, 245, 83, 58, 1, 4, 217, 154, 2, 226, 70, - 103, 58, 1, 4, 104, 130, 58, 1, 4, 214, 157, 58, 1, 4, 6, 69, 58, 1, 4, - 214, 106, 2, 103, 58, 1, 4, 215, 94, 214, 105, 58, 1, 4, 210, 159, 58, 1, - 4, 210, 160, 2, 223, 58, 103, 58, 1, 4, 210, 160, 2, 249, 108, 58, 1, 4, - 245, 16, 58, 1, 4, 216, 180, 38, 246, 126, 242, 144, 255, 23, 38, 246, - 126, 255, 12, 255, 23, 38, 219, 71, 51, 38, 218, 7, 79, 38, 231, 236, 38, - 242, 141, 38, 231, 234, 38, 255, 10, 38, 242, 142, 38, 255, 11, 38, 7, 4, - 1, 223, 227, 51, 38, 251, 153, 38, 231, 235, 38, 52, 250, 39, 48, 38, - 226, 229, 48, 38, 210, 35, 51, 38, 235, 179, 51, 38, 214, 151, 48, 38, - 214, 134, 48, 38, 7, 4, 1, 244, 71, 204, 116, 48, 38, 7, 4, 1, 254, 252, - 38, 7, 4, 1, 254, 81, 38, 7, 4, 1, 253, 184, 38, 7, 4, 1, 251, 75, 250, - 191, 38, 7, 4, 1, 235, 220, 249, 68, 38, 7, 4, 1, 245, 67, 38, 7, 4, 1, - 243, 209, 38, 7, 1, 4, 6, 243, 209, 38, 7, 4, 1, 235, 29, 38, 7, 4, 1, - 156, 38, 7, 1, 4, 6, 156, 38, 7, 1, 4, 6, 194, 38, 7, 4, 1, 230, 30, 38, - 7, 1, 4, 6, 230, 30, 38, 7, 1, 4, 6, 153, 38, 7, 4, 1, 223, 227, 222, - 188, 38, 7, 4, 1, 222, 93, 38, 7, 4, 1, 200, 222, 93, 38, 7, 4, 1, 210, - 159, 38, 52, 235, 200, 251, 155, 51, 38, 254, 156, 128, 216, 43, 51, 38, - 43, 254, 2, 48, 38, 44, 254, 2, 22, 124, 254, 2, 51, 7, 6, 1, 116, 2, - 222, 237, 51, 7, 4, 1, 116, 2, 222, 237, 51, 7, 6, 1, 57, 2, 59, 48, 7, - 4, 1, 57, 2, 59, 48, 7, 6, 1, 57, 2, 59, 51, 7, 4, 1, 57, 2, 59, 51, 7, - 6, 1, 57, 2, 232, 220, 51, 7, 4, 1, 57, 2, 232, 220, 51, 7, 6, 1, 251, - 75, 2, 250, 192, 22, 142, 7, 4, 1, 251, 75, 2, 250, 192, 22, 142, 7, 6, - 1, 249, 69, 2, 59, 48, 7, 4, 1, 249, 69, 2, 59, 48, 7, 6, 1, 249, 69, 2, - 59, 51, 7, 4, 1, 249, 69, 2, 59, 51, 7, 6, 1, 249, 69, 2, 232, 220, 51, - 7, 4, 1, 249, 69, 2, 232, 220, 51, 7, 6, 1, 249, 69, 2, 250, 191, 7, 4, - 1, 249, 69, 2, 250, 191, 7, 6, 1, 249, 69, 2, 250, 39, 51, 7, 4, 1, 249, - 69, 2, 250, 39, 51, 7, 6, 1, 160, 2, 231, 238, 22, 242, 143, 7, 4, 1, - 160, 2, 231, 238, 22, 242, 143, 7, 6, 1, 160, 2, 231, 238, 22, 142, 7, 4, - 1, 160, 2, 231, 238, 22, 142, 7, 6, 1, 160, 2, 250, 39, 51, 7, 4, 1, 160, - 2, 250, 39, 51, 7, 6, 1, 160, 2, 216, 90, 51, 7, 4, 1, 160, 2, 216, 90, - 51, 7, 6, 1, 160, 2, 250, 192, 22, 251, 154, 7, 4, 1, 160, 2, 250, 192, - 22, 251, 154, 7, 6, 1, 245, 15, 2, 59, 48, 7, 4, 1, 245, 15, 2, 59, 48, - 7, 6, 1, 243, 210, 2, 231, 237, 7, 4, 1, 243, 210, 2, 231, 237, 7, 6, 1, - 242, 68, 2, 59, 48, 7, 4, 1, 242, 68, 2, 59, 48, 7, 6, 1, 242, 68, 2, 59, - 51, 7, 4, 1, 242, 68, 2, 59, 51, 7, 6, 1, 242, 68, 2, 248, 9, 7, 4, 1, - 242, 68, 2, 248, 9, 7, 6, 1, 242, 68, 2, 250, 191, 7, 4, 1, 242, 68, 2, - 250, 191, 7, 6, 1, 242, 68, 2, 251, 155, 51, 7, 4, 1, 242, 68, 2, 251, - 155, 51, 7, 6, 1, 240, 161, 2, 216, 90, 51, 7, 4, 1, 240, 161, 2, 216, - 90, 51, 7, 6, 1, 240, 161, 2, 248, 10, 22, 142, 7, 4, 1, 240, 161, 2, - 248, 10, 22, 142, 7, 6, 1, 235, 30, 2, 142, 7, 4, 1, 235, 30, 2, 142, 7, - 6, 1, 235, 30, 2, 59, 51, 7, 4, 1, 235, 30, 2, 59, 51, 7, 6, 1, 235, 30, - 2, 232, 220, 51, 7, 4, 1, 235, 30, 2, 232, 220, 51, 7, 6, 1, 233, 155, 2, - 59, 51, 7, 4, 1, 233, 155, 2, 59, 51, 7, 6, 1, 233, 155, 2, 59, 252, 51, - 22, 231, 237, 7, 4, 1, 233, 155, 2, 59, 252, 51, 22, 231, 237, 7, 6, 1, - 233, 155, 2, 232, 220, 51, 7, 4, 1, 233, 155, 2, 232, 220, 51, 7, 6, 1, - 233, 155, 2, 250, 39, 51, 7, 4, 1, 233, 155, 2, 250, 39, 51, 7, 6, 1, - 232, 55, 2, 142, 7, 4, 1, 232, 55, 2, 142, 7, 6, 1, 232, 55, 2, 59, 48, - 7, 4, 1, 232, 55, 2, 59, 48, 7, 6, 1, 232, 55, 2, 59, 51, 7, 4, 1, 232, - 55, 2, 59, 51, 7, 6, 1, 230, 31, 2, 59, 48, 7, 4, 1, 230, 31, 2, 59, 48, - 7, 6, 1, 230, 31, 2, 59, 51, 7, 4, 1, 230, 31, 2, 59, 51, 7, 6, 1, 230, - 31, 2, 232, 220, 51, 7, 4, 1, 230, 31, 2, 232, 220, 51, 7, 6, 1, 230, 31, - 2, 250, 39, 51, 7, 4, 1, 230, 31, 2, 250, 39, 51, 7, 6, 1, 144, 2, 216, - 90, 22, 142, 7, 4, 1, 144, 2, 216, 90, 22, 142, 7, 6, 1, 144, 2, 216, 90, - 22, 248, 9, 7, 4, 1, 144, 2, 216, 90, 22, 248, 9, 7, 6, 1, 144, 2, 231, - 238, 22, 242, 143, 7, 4, 1, 144, 2, 231, 238, 22, 242, 143, 7, 6, 1, 144, - 2, 231, 238, 22, 142, 7, 4, 1, 144, 2, 231, 238, 22, 142, 7, 6, 1, 226, - 110, 2, 142, 7, 4, 1, 226, 110, 2, 142, 7, 6, 1, 226, 110, 2, 59, 48, 7, - 4, 1, 226, 110, 2, 59, 48, 7, 6, 1, 223, 227, 2, 59, 48, 7, 4, 1, 223, - 227, 2, 59, 48, 7, 6, 1, 223, 227, 2, 59, 51, 7, 4, 1, 223, 227, 2, 59, - 51, 7, 6, 1, 223, 227, 2, 59, 252, 51, 22, 231, 237, 7, 4, 1, 223, 227, - 2, 59, 252, 51, 22, 231, 237, 7, 6, 1, 223, 227, 2, 232, 220, 51, 7, 4, - 1, 223, 227, 2, 232, 220, 51, 7, 6, 1, 222, 94, 2, 59, 48, 7, 4, 1, 222, - 94, 2, 59, 48, 7, 6, 1, 222, 94, 2, 59, 51, 7, 4, 1, 222, 94, 2, 59, 51, - 7, 6, 1, 222, 94, 2, 255, 12, 22, 59, 48, 7, 4, 1, 222, 94, 2, 255, 12, - 22, 59, 48, 7, 6, 1, 222, 94, 2, 250, 243, 22, 59, 48, 7, 4, 1, 222, 94, - 2, 250, 243, 22, 59, 48, 7, 6, 1, 222, 94, 2, 59, 252, 51, 22, 59, 48, 7, - 4, 1, 222, 94, 2, 59, 252, 51, 22, 59, 48, 7, 6, 1, 217, 154, 2, 59, 48, - 7, 4, 1, 217, 154, 2, 59, 48, 7, 6, 1, 217, 154, 2, 59, 51, 7, 4, 1, 217, - 154, 2, 59, 51, 7, 6, 1, 217, 154, 2, 232, 220, 51, 7, 4, 1, 217, 154, 2, - 232, 220, 51, 7, 6, 1, 217, 154, 2, 250, 39, 51, 7, 4, 1, 217, 154, 2, - 250, 39, 51, 7, 6, 1, 104, 2, 248, 10, 51, 7, 4, 1, 104, 2, 248, 10, 51, - 7, 6, 1, 104, 2, 216, 90, 51, 7, 4, 1, 104, 2, 216, 90, 51, 7, 6, 1, 104, - 2, 250, 39, 51, 7, 4, 1, 104, 2, 250, 39, 51, 7, 6, 1, 104, 2, 216, 90, - 22, 142, 7, 4, 1, 104, 2, 216, 90, 22, 142, 7, 6, 1, 104, 2, 231, 238, - 22, 248, 9, 7, 4, 1, 104, 2, 231, 238, 22, 248, 9, 7, 6, 1, 214, 106, 2, - 184, 7, 4, 1, 214, 106, 2, 184, 7, 6, 1, 214, 106, 2, 59, 51, 7, 4, 1, - 214, 106, 2, 59, 51, 7, 6, 1, 212, 99, 2, 242, 143, 7, 4, 1, 212, 99, 2, - 242, 143, 7, 6, 1, 212, 99, 2, 142, 7, 4, 1, 212, 99, 2, 142, 7, 6, 1, - 212, 99, 2, 248, 9, 7, 4, 1, 212, 99, 2, 248, 9, 7, 6, 1, 212, 99, 2, 59, - 48, 7, 4, 1, 212, 99, 2, 59, 48, 7, 6, 1, 212, 99, 2, 59, 51, 7, 4, 1, - 212, 99, 2, 59, 51, 7, 6, 1, 211, 179, 2, 59, 48, 7, 4, 1, 211, 179, 2, - 59, 48, 7, 6, 1, 211, 179, 2, 248, 9, 7, 4, 1, 211, 179, 2, 248, 9, 7, 6, - 1, 211, 118, 2, 59, 48, 7, 4, 1, 211, 118, 2, 59, 48, 7, 6, 1, 210, 160, - 2, 250, 38, 7, 4, 1, 210, 160, 2, 250, 38, 7, 6, 1, 210, 160, 2, 59, 51, - 7, 4, 1, 210, 160, 2, 59, 51, 7, 6, 1, 210, 160, 2, 232, 220, 51, 7, 4, - 1, 210, 160, 2, 232, 220, 51, 7, 4, 1, 242, 68, 2, 232, 220, 51, 7, 4, 1, - 217, 154, 2, 248, 9, 7, 4, 1, 212, 99, 2, 222, 237, 48, 7, 4, 1, 211, - 118, 2, 222, 237, 48, 7, 4, 1, 116, 2, 44, 163, 222, 236, 7, 4, 1, 200, - 222, 94, 2, 59, 48, 7, 4, 1, 200, 222, 94, 2, 248, 7, 91, 7, 4, 1, 200, - 222, 94, 2, 125, 91, 7, 6, 1, 220, 78, 222, 93, 7, 4, 1, 248, 62, 7, 6, - 1, 116, 2, 59, 51, 7, 4, 1, 116, 2, 59, 51, 7, 6, 1, 116, 2, 241, 59, 48, - 7, 4, 1, 116, 2, 241, 59, 48, 7, 6, 1, 116, 2, 250, 39, 22, 142, 7, 4, 1, - 116, 2, 250, 39, 22, 142, 7, 6, 1, 116, 2, 250, 39, 22, 242, 143, 7, 4, - 1, 116, 2, 250, 39, 22, 242, 143, 7, 6, 1, 116, 2, 250, 39, 22, 241, 59, - 48, 7, 4, 1, 116, 2, 250, 39, 22, 241, 59, 48, 7, 6, 1, 116, 2, 250, 39, - 22, 184, 7, 4, 1, 116, 2, 250, 39, 22, 184, 7, 6, 1, 116, 2, 250, 39, 22, - 59, 51, 7, 4, 1, 116, 2, 250, 39, 22, 59, 51, 7, 6, 1, 116, 2, 251, 155, - 22, 142, 7, 4, 1, 116, 2, 251, 155, 22, 142, 7, 6, 1, 116, 2, 251, 155, - 22, 242, 143, 7, 4, 1, 116, 2, 251, 155, 22, 242, 143, 7, 6, 1, 116, 2, - 251, 155, 22, 241, 59, 48, 7, 4, 1, 116, 2, 251, 155, 22, 241, 59, 48, 7, - 6, 1, 116, 2, 251, 155, 22, 184, 7, 4, 1, 116, 2, 251, 155, 22, 184, 7, - 6, 1, 116, 2, 251, 155, 22, 59, 51, 7, 4, 1, 116, 2, 251, 155, 22, 59, - 51, 7, 6, 1, 160, 2, 59, 51, 7, 4, 1, 160, 2, 59, 51, 7, 6, 1, 160, 2, - 241, 59, 48, 7, 4, 1, 160, 2, 241, 59, 48, 7, 6, 1, 160, 2, 184, 7, 4, 1, - 160, 2, 184, 7, 6, 1, 160, 2, 250, 39, 22, 142, 7, 4, 1, 160, 2, 250, 39, - 22, 142, 7, 6, 1, 160, 2, 250, 39, 22, 242, 143, 7, 4, 1, 160, 2, 250, - 39, 22, 242, 143, 7, 6, 1, 160, 2, 250, 39, 22, 241, 59, 48, 7, 4, 1, - 160, 2, 250, 39, 22, 241, 59, 48, 7, 6, 1, 160, 2, 250, 39, 22, 184, 7, - 4, 1, 160, 2, 250, 39, 22, 184, 7, 6, 1, 160, 2, 250, 39, 22, 59, 51, 7, - 4, 1, 160, 2, 250, 39, 22, 59, 51, 7, 6, 1, 240, 161, 2, 241, 59, 48, 7, - 4, 1, 240, 161, 2, 241, 59, 48, 7, 6, 1, 240, 161, 2, 59, 51, 7, 4, 1, - 240, 161, 2, 59, 51, 7, 6, 1, 144, 2, 59, 51, 7, 4, 1, 144, 2, 59, 51, 7, - 6, 1, 144, 2, 241, 59, 48, 7, 4, 1, 144, 2, 241, 59, 48, 7, 6, 1, 144, 2, - 250, 39, 22, 142, 7, 4, 1, 144, 2, 250, 39, 22, 142, 7, 6, 1, 144, 2, - 250, 39, 22, 242, 143, 7, 4, 1, 144, 2, 250, 39, 22, 242, 143, 7, 6, 1, - 144, 2, 250, 39, 22, 241, 59, 48, 7, 4, 1, 144, 2, 250, 39, 22, 241, 59, - 48, 7, 6, 1, 144, 2, 250, 39, 22, 184, 7, 4, 1, 144, 2, 250, 39, 22, 184, - 7, 6, 1, 144, 2, 250, 39, 22, 59, 51, 7, 4, 1, 144, 2, 250, 39, 22, 59, - 51, 7, 6, 1, 144, 2, 241, 0, 22, 142, 7, 4, 1, 144, 2, 241, 0, 22, 142, - 7, 6, 1, 144, 2, 241, 0, 22, 242, 143, 7, 4, 1, 144, 2, 241, 0, 22, 242, - 143, 7, 6, 1, 144, 2, 241, 0, 22, 241, 59, 48, 7, 4, 1, 144, 2, 241, 0, - 22, 241, 59, 48, 7, 6, 1, 144, 2, 241, 0, 22, 184, 7, 4, 1, 144, 2, 241, - 0, 22, 184, 7, 6, 1, 144, 2, 241, 0, 22, 59, 51, 7, 4, 1, 144, 2, 241, 0, - 22, 59, 51, 7, 6, 1, 104, 2, 59, 51, 7, 4, 1, 104, 2, 59, 51, 7, 6, 1, - 104, 2, 241, 59, 48, 7, 4, 1, 104, 2, 241, 59, 48, 7, 6, 1, 104, 2, 241, - 0, 22, 142, 7, 4, 1, 104, 2, 241, 0, 22, 142, 7, 6, 1, 104, 2, 241, 0, - 22, 242, 143, 7, 4, 1, 104, 2, 241, 0, 22, 242, 143, 7, 6, 1, 104, 2, - 241, 0, 22, 241, 59, 48, 7, 4, 1, 104, 2, 241, 0, 22, 241, 59, 48, 7, 6, - 1, 104, 2, 241, 0, 22, 184, 7, 4, 1, 104, 2, 241, 0, 22, 184, 7, 6, 1, - 104, 2, 241, 0, 22, 59, 51, 7, 4, 1, 104, 2, 241, 0, 22, 59, 51, 7, 6, 1, - 211, 118, 2, 242, 143, 7, 4, 1, 211, 118, 2, 242, 143, 7, 6, 1, 211, 118, - 2, 59, 51, 7, 4, 1, 211, 118, 2, 59, 51, 7, 6, 1, 211, 118, 2, 241, 59, - 48, 7, 4, 1, 211, 118, 2, 241, 59, 48, 7, 6, 1, 211, 118, 2, 184, 7, 4, - 1, 211, 118, 2, 184, 7, 6, 1, 230, 228, 232, 191, 7, 4, 1, 230, 228, 232, - 191, 7, 6, 1, 230, 228, 214, 105, 7, 4, 1, 230, 228, 214, 105, 7, 6, 1, - 211, 118, 2, 232, 129, 7, 4, 1, 211, 118, 2, 232, 129, 26, 4, 1, 254, - 152, 2, 224, 157, 26, 4, 1, 254, 152, 2, 248, 161, 26, 4, 1, 254, 152, 2, - 224, 158, 22, 214, 13, 26, 4, 1, 254, 152, 2, 248, 162, 22, 214, 13, 26, - 4, 1, 254, 152, 2, 224, 158, 22, 226, 114, 26, 4, 1, 254, 152, 2, 248, - 162, 22, 226, 114, 26, 4, 1, 254, 152, 2, 224, 158, 22, 225, 178, 26, 4, - 1, 254, 152, 2, 248, 162, 22, 225, 178, 26, 6, 1, 254, 152, 2, 224, 157, - 26, 6, 1, 254, 152, 2, 248, 161, 26, 6, 1, 254, 152, 2, 224, 158, 22, - 214, 13, 26, 6, 1, 254, 152, 2, 248, 162, 22, 214, 13, 26, 6, 1, 254, - 152, 2, 224, 158, 22, 226, 114, 26, 6, 1, 254, 152, 2, 248, 162, 22, 226, - 114, 26, 6, 1, 254, 152, 2, 224, 158, 22, 225, 178, 26, 6, 1, 254, 152, - 2, 248, 162, 22, 225, 178, 26, 4, 1, 245, 109, 2, 224, 157, 26, 4, 1, - 245, 109, 2, 248, 161, 26, 4, 1, 245, 109, 2, 224, 158, 22, 214, 13, 26, - 4, 1, 245, 109, 2, 248, 162, 22, 214, 13, 26, 4, 1, 245, 109, 2, 224, - 158, 22, 226, 114, 26, 4, 1, 245, 109, 2, 248, 162, 22, 226, 114, 26, 6, - 1, 245, 109, 2, 224, 157, 26, 6, 1, 245, 109, 2, 248, 161, 26, 6, 1, 245, - 109, 2, 224, 158, 22, 214, 13, 26, 6, 1, 245, 109, 2, 248, 162, 22, 214, - 13, 26, 6, 1, 245, 109, 2, 224, 158, 22, 226, 114, 26, 6, 1, 245, 109, 2, - 248, 162, 22, 226, 114, 26, 4, 1, 245, 72, 2, 224, 157, 26, 4, 1, 245, - 72, 2, 248, 161, 26, 4, 1, 245, 72, 2, 224, 158, 22, 214, 13, 26, 4, 1, - 245, 72, 2, 248, 162, 22, 214, 13, 26, 4, 1, 245, 72, 2, 224, 158, 22, - 226, 114, 26, 4, 1, 245, 72, 2, 248, 162, 22, 226, 114, 26, 4, 1, 245, - 72, 2, 224, 158, 22, 225, 178, 26, 4, 1, 245, 72, 2, 248, 162, 22, 225, - 178, 26, 6, 1, 245, 72, 2, 224, 157, 26, 6, 1, 245, 72, 2, 248, 161, 26, - 6, 1, 245, 72, 2, 224, 158, 22, 214, 13, 26, 6, 1, 245, 72, 2, 248, 162, - 22, 214, 13, 26, 6, 1, 245, 72, 2, 224, 158, 22, 226, 114, 26, 6, 1, 245, - 72, 2, 248, 162, 22, 226, 114, 26, 6, 1, 245, 72, 2, 224, 158, 22, 225, - 178, 26, 6, 1, 245, 72, 2, 248, 162, 22, 225, 178, 26, 4, 1, 235, 193, 2, - 224, 157, 26, 4, 1, 235, 193, 2, 248, 161, 26, 4, 1, 235, 193, 2, 224, - 158, 22, 214, 13, 26, 4, 1, 235, 193, 2, 248, 162, 22, 214, 13, 26, 4, 1, - 235, 193, 2, 224, 158, 22, 226, 114, 26, 4, 1, 235, 193, 2, 248, 162, 22, - 226, 114, 26, 4, 1, 235, 193, 2, 224, 158, 22, 225, 178, 26, 4, 1, 235, - 193, 2, 248, 162, 22, 225, 178, 26, 6, 1, 235, 193, 2, 224, 157, 26, 6, - 1, 235, 193, 2, 248, 161, 26, 6, 1, 235, 193, 2, 224, 158, 22, 214, 13, - 26, 6, 1, 235, 193, 2, 248, 162, 22, 214, 13, 26, 6, 1, 235, 193, 2, 224, - 158, 22, 226, 114, 26, 6, 1, 235, 193, 2, 248, 162, 22, 226, 114, 26, 6, - 1, 235, 193, 2, 224, 158, 22, 225, 178, 26, 6, 1, 235, 193, 2, 248, 162, - 22, 225, 178, 26, 4, 1, 226, 204, 2, 224, 157, 26, 4, 1, 226, 204, 2, - 248, 161, 26, 4, 1, 226, 204, 2, 224, 158, 22, 214, 13, 26, 4, 1, 226, - 204, 2, 248, 162, 22, 214, 13, 26, 4, 1, 226, 204, 2, 224, 158, 22, 226, - 114, 26, 4, 1, 226, 204, 2, 248, 162, 22, 226, 114, 26, 6, 1, 226, 204, - 2, 224, 157, 26, 6, 1, 226, 204, 2, 248, 161, 26, 6, 1, 226, 204, 2, 224, - 158, 22, 214, 13, 26, 6, 1, 226, 204, 2, 248, 162, 22, 214, 13, 26, 6, 1, - 226, 204, 2, 224, 158, 22, 226, 114, 26, 6, 1, 226, 204, 2, 248, 162, 22, - 226, 114, 26, 4, 1, 214, 158, 2, 224, 157, 26, 4, 1, 214, 158, 2, 248, - 161, 26, 4, 1, 214, 158, 2, 224, 158, 22, 214, 13, 26, 4, 1, 214, 158, 2, - 248, 162, 22, 214, 13, 26, 4, 1, 214, 158, 2, 224, 158, 22, 226, 114, 26, - 4, 1, 214, 158, 2, 248, 162, 22, 226, 114, 26, 4, 1, 214, 158, 2, 224, - 158, 22, 225, 178, 26, 4, 1, 214, 158, 2, 248, 162, 22, 225, 178, 26, 6, - 1, 214, 158, 2, 248, 161, 26, 6, 1, 214, 158, 2, 248, 162, 22, 214, 13, - 26, 6, 1, 214, 158, 2, 248, 162, 22, 226, 114, 26, 6, 1, 214, 158, 2, - 248, 162, 22, 225, 178, 26, 4, 1, 226, 206, 2, 224, 157, 26, 4, 1, 226, - 206, 2, 248, 161, 26, 4, 1, 226, 206, 2, 224, 158, 22, 214, 13, 26, 4, 1, - 226, 206, 2, 248, 162, 22, 214, 13, 26, 4, 1, 226, 206, 2, 224, 158, 22, - 226, 114, 26, 4, 1, 226, 206, 2, 248, 162, 22, 226, 114, 26, 4, 1, 226, - 206, 2, 224, 158, 22, 225, 178, 26, 4, 1, 226, 206, 2, 248, 162, 22, 225, - 178, 26, 6, 1, 226, 206, 2, 224, 157, 26, 6, 1, 226, 206, 2, 248, 161, - 26, 6, 1, 226, 206, 2, 224, 158, 22, 214, 13, 26, 6, 1, 226, 206, 2, 248, - 162, 22, 214, 13, 26, 6, 1, 226, 206, 2, 224, 158, 22, 226, 114, 26, 6, - 1, 226, 206, 2, 248, 162, 22, 226, 114, 26, 6, 1, 226, 206, 2, 224, 158, - 22, 225, 178, 26, 6, 1, 226, 206, 2, 248, 162, 22, 225, 178, 26, 4, 1, - 254, 152, 2, 214, 13, 26, 4, 1, 254, 152, 2, 226, 114, 26, 4, 1, 245, - 109, 2, 214, 13, 26, 4, 1, 245, 109, 2, 226, 114, 26, 4, 1, 245, 72, 2, - 214, 13, 26, 4, 1, 245, 72, 2, 226, 114, 26, 4, 1, 235, 193, 2, 214, 13, - 26, 4, 1, 235, 193, 2, 226, 114, 26, 4, 1, 226, 204, 2, 214, 13, 26, 4, - 1, 226, 204, 2, 226, 114, 26, 4, 1, 214, 158, 2, 214, 13, 26, 4, 1, 214, - 158, 2, 226, 114, 26, 4, 1, 226, 206, 2, 214, 13, 26, 4, 1, 226, 206, 2, - 226, 114, 26, 4, 1, 254, 152, 2, 224, 158, 22, 210, 219, 26, 4, 1, 254, - 152, 2, 248, 162, 22, 210, 219, 26, 4, 1, 254, 152, 2, 224, 158, 22, 214, - 14, 22, 210, 219, 26, 4, 1, 254, 152, 2, 248, 162, 22, 214, 14, 22, 210, - 219, 26, 4, 1, 254, 152, 2, 224, 158, 22, 226, 115, 22, 210, 219, 26, 4, - 1, 254, 152, 2, 248, 162, 22, 226, 115, 22, 210, 219, 26, 4, 1, 254, 152, - 2, 224, 158, 22, 225, 179, 22, 210, 219, 26, 4, 1, 254, 152, 2, 248, 162, - 22, 225, 179, 22, 210, 219, 26, 6, 1, 254, 152, 2, 224, 158, 22, 224, - 170, 26, 6, 1, 254, 152, 2, 248, 162, 22, 224, 170, 26, 6, 1, 254, 152, - 2, 224, 158, 22, 214, 14, 22, 224, 170, 26, 6, 1, 254, 152, 2, 248, 162, - 22, 214, 14, 22, 224, 170, 26, 6, 1, 254, 152, 2, 224, 158, 22, 226, 115, - 22, 224, 170, 26, 6, 1, 254, 152, 2, 248, 162, 22, 226, 115, 22, 224, - 170, 26, 6, 1, 254, 152, 2, 224, 158, 22, 225, 179, 22, 224, 170, 26, 6, - 1, 254, 152, 2, 248, 162, 22, 225, 179, 22, 224, 170, 26, 4, 1, 245, 72, - 2, 224, 158, 22, 210, 219, 26, 4, 1, 245, 72, 2, 248, 162, 22, 210, 219, - 26, 4, 1, 245, 72, 2, 224, 158, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, - 72, 2, 248, 162, 22, 214, 14, 22, 210, 219, 26, 4, 1, 245, 72, 2, 224, - 158, 22, 226, 115, 22, 210, 219, 26, 4, 1, 245, 72, 2, 248, 162, 22, 226, - 115, 22, 210, 219, 26, 4, 1, 245, 72, 2, 224, 158, 22, 225, 179, 22, 210, - 219, 26, 4, 1, 245, 72, 2, 248, 162, 22, 225, 179, 22, 210, 219, 26, 6, - 1, 245, 72, 2, 224, 158, 22, 224, 170, 26, 6, 1, 245, 72, 2, 248, 162, - 22, 224, 170, 26, 6, 1, 245, 72, 2, 224, 158, 22, 214, 14, 22, 224, 170, - 26, 6, 1, 245, 72, 2, 248, 162, 22, 214, 14, 22, 224, 170, 26, 6, 1, 245, - 72, 2, 224, 158, 22, 226, 115, 22, 224, 170, 26, 6, 1, 245, 72, 2, 248, - 162, 22, 226, 115, 22, 224, 170, 26, 6, 1, 245, 72, 2, 224, 158, 22, 225, - 179, 22, 224, 170, 26, 6, 1, 245, 72, 2, 248, 162, 22, 225, 179, 22, 224, - 170, 26, 4, 1, 226, 206, 2, 224, 158, 22, 210, 219, 26, 4, 1, 226, 206, - 2, 248, 162, 22, 210, 219, 26, 4, 1, 226, 206, 2, 224, 158, 22, 214, 14, - 22, 210, 219, 26, 4, 1, 226, 206, 2, 248, 162, 22, 214, 14, 22, 210, 219, - 26, 4, 1, 226, 206, 2, 224, 158, 22, 226, 115, 22, 210, 219, 26, 4, 1, - 226, 206, 2, 248, 162, 22, 226, 115, 22, 210, 219, 26, 4, 1, 226, 206, 2, - 224, 158, 22, 225, 179, 22, 210, 219, 26, 4, 1, 226, 206, 2, 248, 162, - 22, 225, 179, 22, 210, 219, 26, 6, 1, 226, 206, 2, 224, 158, 22, 224, - 170, 26, 6, 1, 226, 206, 2, 248, 162, 22, 224, 170, 26, 6, 1, 226, 206, - 2, 224, 158, 22, 214, 14, 22, 224, 170, 26, 6, 1, 226, 206, 2, 248, 162, - 22, 214, 14, 22, 224, 170, 26, 6, 1, 226, 206, 2, 224, 158, 22, 226, 115, - 22, 224, 170, 26, 6, 1, 226, 206, 2, 248, 162, 22, 226, 115, 22, 224, - 170, 26, 6, 1, 226, 206, 2, 224, 158, 22, 225, 179, 22, 224, 170, 26, 6, - 1, 226, 206, 2, 248, 162, 22, 225, 179, 22, 224, 170, 26, 4, 1, 254, 152, - 2, 213, 120, 26, 4, 1, 254, 152, 2, 231, 237, 26, 4, 1, 254, 152, 2, 214, - 14, 22, 210, 219, 26, 4, 1, 254, 152, 2, 210, 219, 26, 4, 1, 254, 152, 2, - 226, 115, 22, 210, 219, 26, 4, 1, 254, 152, 2, 225, 178, 26, 4, 1, 254, - 152, 2, 225, 179, 22, 210, 219, 26, 6, 1, 254, 152, 2, 213, 120, 26, 6, - 1, 254, 152, 2, 231, 237, 26, 6, 1, 254, 152, 2, 214, 13, 26, 6, 1, 254, - 152, 2, 226, 114, 26, 6, 1, 254, 152, 2, 224, 170, 26, 234, 8, 26, 224, - 170, 26, 224, 157, 26, 225, 178, 26, 248, 4, 22, 225, 178, 26, 4, 1, 245, - 72, 2, 214, 14, 22, 210, 219, 26, 4, 1, 245, 72, 2, 210, 219, 26, 4, 1, - 245, 72, 2, 226, 115, 22, 210, 219, 26, 4, 1, 245, 72, 2, 225, 178, 26, - 4, 1, 245, 72, 2, 225, 179, 22, 210, 219, 26, 6, 1, 245, 109, 2, 214, 13, - 26, 6, 1, 245, 109, 2, 226, 114, 26, 6, 1, 245, 72, 2, 214, 13, 26, 6, 1, - 245, 72, 2, 226, 114, 26, 6, 1, 245, 72, 2, 224, 170, 26, 224, 158, 22, - 214, 13, 26, 224, 158, 22, 226, 114, 26, 224, 158, 22, 225, 178, 26, 4, - 1, 235, 193, 2, 213, 120, 26, 4, 1, 235, 193, 2, 231, 237, 26, 4, 1, 235, - 193, 2, 248, 4, 22, 214, 13, 26, 4, 1, 235, 193, 2, 248, 4, 22, 226, 114, - 26, 4, 1, 235, 193, 2, 225, 178, 26, 4, 1, 235, 193, 2, 248, 4, 22, 225, - 178, 26, 6, 1, 235, 193, 2, 213, 120, 26, 6, 1, 235, 193, 2, 231, 237, - 26, 6, 1, 235, 193, 2, 214, 13, 26, 6, 1, 235, 193, 2, 226, 114, 26, 248, - 162, 22, 214, 13, 26, 248, 162, 22, 226, 114, 26, 248, 162, 22, 225, 178, - 26, 4, 1, 214, 158, 2, 213, 120, 26, 4, 1, 214, 158, 2, 231, 237, 26, 4, - 1, 214, 158, 2, 248, 4, 22, 214, 13, 26, 4, 1, 214, 158, 2, 248, 4, 22, - 226, 114, 26, 4, 1, 223, 41, 2, 224, 157, 26, 4, 1, 223, 41, 2, 248, 161, - 26, 4, 1, 214, 158, 2, 225, 178, 26, 4, 1, 214, 158, 2, 248, 4, 22, 225, - 178, 26, 6, 1, 214, 158, 2, 213, 120, 26, 6, 1, 214, 158, 2, 231, 237, - 26, 6, 1, 214, 158, 2, 214, 13, 26, 6, 1, 214, 158, 2, 226, 114, 26, 6, - 1, 223, 41, 2, 248, 161, 26, 248, 4, 22, 214, 13, 26, 248, 4, 22, 226, - 114, 26, 214, 13, 26, 4, 1, 226, 206, 2, 214, 14, 22, 210, 219, 26, 4, 1, - 226, 206, 2, 210, 219, 26, 4, 1, 226, 206, 2, 226, 115, 22, 210, 219, 26, - 4, 1, 226, 206, 2, 225, 178, 26, 4, 1, 226, 206, 2, 225, 179, 22, 210, - 219, 26, 6, 1, 226, 204, 2, 214, 13, 26, 6, 1, 226, 204, 2, 226, 114, 26, - 6, 1, 226, 206, 2, 214, 13, 26, 6, 1, 226, 206, 2, 226, 114, 26, 6, 1, - 226, 206, 2, 224, 170, 26, 226, 114, 26, 248, 161, 245, 159, 224, 30, - 245, 168, 224, 30, 245, 159, 219, 20, 245, 168, 219, 20, 216, 142, 219, - 20, 244, 17, 219, 20, 219, 125, 219, 20, 244, 120, 219, 20, 224, 144, - 219, 20, 216, 171, 219, 20, 242, 42, 219, 20, 210, 87, 211, 245, 219, 20, - 210, 87, 211, 245, 228, 72, 210, 87, 211, 245, 235, 69, 233, 44, 79, 222, - 246, 79, 240, 175, 228, 73, 240, 175, 244, 120, 248, 164, 245, 159, 248, - 164, 245, 168, 248, 164, 203, 130, 52, 67, 232, 219, 52, 121, 232, 219, - 43, 219, 157, 224, 1, 79, 44, 219, 157, 224, 1, 79, 219, 157, 232, 115, - 224, 1, 79, 219, 157, 241, 170, 224, 1, 79, 43, 52, 224, 1, 79, 44, 52, - 224, 1, 79, 52, 232, 115, 224, 1, 79, 52, 241, 170, 224, 1, 79, 248, 213, - 52, 248, 213, 251, 121, 215, 223, 251, 121, 123, 59, 233, 62, 113, 59, - 233, 62, 203, 245, 171, 240, 173, 225, 13, 232, 220, 220, 139, 226, 19, - 220, 139, 233, 44, 245, 166, 222, 246, 245, 166, 224, 249, 247, 204, 244, - 27, 233, 44, 226, 121, 222, 246, 226, 121, 229, 199, 228, 78, 219, 20, - 225, 186, 230, 198, 50, 225, 186, 216, 249, 216, 149, 50, 224, 193, 52, - 224, 193, 215, 212, 224, 193, 223, 52, 224, 193, 223, 52, 52, 224, 193, - 223, 52, 215, 212, 224, 193, 250, 246, 219, 157, 233, 48, 254, 118, 224, - 1, 79, 219, 157, 222, 250, 254, 118, 224, 1, 79, 223, 110, 79, 52, 245, - 39, 79, 235, 208, 226, 123, 214, 180, 135, 216, 112, 250, 247, 235, 223, - 225, 13, 253, 222, 240, 176, 251, 121, 244, 10, 219, 97, 43, 42, 251, - 166, 2, 224, 10, 44, 42, 251, 166, 2, 224, 10, 52, 224, 16, 79, 224, 16, - 245, 39, 79, 245, 39, 224, 16, 79, 216, 71, 5, 245, 73, 223, 52, 225, 71, - 50, 85, 140, 251, 121, 85, 97, 251, 121, 121, 253, 224, 223, 52, 220, - 152, 250, 9, 214, 163, 113, 253, 223, 254, 167, 213, 188, 249, 225, 230, - 187, 50, 217, 235, 248, 164, 235, 200, 214, 180, 244, 60, 224, 144, 79, - 134, 59, 224, 143, 224, 27, 224, 193, 244, 19, 59, 224, 143, 244, 89, 59, - 224, 143, 113, 59, 224, 143, 244, 19, 59, 79, 246, 126, 249, 138, 215, - 222, 67, 244, 19, 247, 126, 231, 87, 11, 219, 20, 211, 209, 235, 69, 243, - 234, 254, 60, 235, 198, 216, 86, 235, 198, 220, 139, 235, 198, 225, 25, - 233, 44, 235, 171, 222, 246, 235, 171, 244, 100, 218, 91, 235, 171, 224, - 249, 247, 204, 235, 171, 235, 235, 217, 183, 217, 252, 255, 14, 217, 183, - 217, 252, 235, 235, 9, 244, 28, 220, 82, 255, 14, 9, 244, 28, 220, 82, - 229, 194, 21, 220, 83, 228, 74, 21, 220, 83, 218, 24, 210, 86, 218, 24, - 7, 4, 1, 74, 218, 24, 161, 218, 24, 190, 218, 24, 195, 218, 24, 199, 218, - 24, 196, 218, 24, 201, 218, 24, 96, 50, 218, 24, 230, 186, 218, 24, 245, - 106, 50, 218, 24, 43, 226, 7, 218, 24, 44, 226, 7, 218, 24, 7, 4, 1, 230, - 30, 218, 66, 210, 86, 218, 66, 111, 218, 66, 105, 218, 66, 158, 218, 66, - 161, 218, 66, 190, 218, 66, 195, 218, 66, 199, 218, 66, 196, 218, 66, - 201, 218, 66, 96, 50, 218, 66, 230, 186, 218, 66, 245, 106, 50, 218, 66, - 43, 226, 7, 218, 66, 44, 226, 7, 7, 218, 66, 4, 1, 61, 7, 218, 66, 4, 1, - 76, 7, 218, 66, 4, 1, 78, 7, 218, 66, 4, 1, 211, 178, 7, 218, 66, 4, 1, - 221, 197, 7, 218, 66, 4, 1, 242, 67, 7, 218, 66, 4, 1, 235, 29, 7, 218, - 66, 4, 1, 156, 7, 218, 66, 4, 1, 194, 7, 218, 66, 4, 1, 230, 30, 7, 218, - 66, 4, 1, 226, 109, 7, 218, 66, 4, 1, 222, 93, 7, 218, 66, 4, 1, 217, - 153, 245, 54, 50, 249, 235, 50, 249, 125, 50, 244, 3, 244, 6, 50, 232, - 204, 50, 230, 199, 50, 229, 215, 50, 225, 165, 50, 222, 120, 50, 211, - 217, 50, 166, 220, 51, 50, 247, 135, 50, 245, 55, 50, 234, 82, 50, 215, - 113, 50, 246, 109, 50, 243, 47, 225, 196, 50, 225, 163, 50, 242, 116, 50, - 253, 190, 50, 240, 235, 50, 250, 193, 50, 232, 197, 216, 4, 50, 219, 2, - 50, 216, 246, 50, 235, 248, 222, 120, 50, 215, 97, 232, 204, 50, 38, 43, - 242, 6, 48, 38, 44, 242, 6, 48, 38, 200, 67, 232, 220, 226, 124, 38, 219, - 253, 67, 232, 220, 226, 124, 38, 254, 96, 80, 48, 38, 250, 10, 80, 48, - 38, 43, 80, 48, 38, 44, 80, 48, 38, 222, 237, 226, 124, 38, 250, 10, 222, - 237, 226, 124, 38, 254, 96, 222, 237, 226, 124, 38, 134, 170, 48, 38, - 244, 19, 170, 48, 38, 245, 154, 250, 43, 38, 245, 154, 218, 236, 38, 245, - 154, 248, 0, 38, 245, 154, 250, 44, 252, 188, 38, 43, 44, 80, 48, 38, - 245, 154, 221, 190, 38, 245, 154, 234, 141, 38, 245, 154, 214, 155, 225, - 10, 215, 226, 38, 223, 53, 219, 49, 226, 124, 38, 52, 67, 218, 105, 226, - 124, 38, 254, 106, 87, 38, 215, 212, 214, 182, 38, 211, 247, 251, 148, - 48, 38, 140, 80, 226, 124, 38, 200, 52, 219, 49, 226, 124, 38, 97, 242, - 6, 2, 252, 147, 246, 111, 38, 140, 242, 6, 2, 252, 147, 246, 111, 38, 43, - 80, 51, 38, 44, 80, 51, 38, 253, 225, 48, 255, 20, 226, 235, 255, 4, 216, - 43, 216, 197, 218, 75, 139, 6, 251, 74, 248, 79, 250, 186, 250, 183, 232, - 220, 87, 250, 248, 226, 235, 251, 34, 214, 189, 245, 56, 249, 199, 221, - 187, 248, 79, 244, 187, 119, 4, 243, 209, 119, 6, 242, 67, 251, 227, 6, - 242, 67, 139, 6, 242, 67, 225, 40, 249, 199, 225, 40, 249, 200, 115, 113, - 225, 111, 119, 6, 74, 251, 227, 6, 74, 119, 6, 156, 119, 4, 156, 233, - 155, 57, 252, 149, 87, 139, 6, 230, 30, 227, 200, 50, 219, 33, 223, 122, - 249, 170, 119, 6, 226, 109, 139, 6, 226, 109, 139, 6, 224, 99, 119, 6, - 153, 251, 227, 6, 153, 139, 6, 153, 224, 199, 217, 72, 223, 65, 220, 134, - 79, 217, 2, 50, 215, 254, 164, 50, 213, 240, 139, 6, 210, 159, 226, 137, - 50, 226, 225, 50, 235, 200, 226, 225, 50, 251, 227, 6, 210, 159, 215, 94, - 26, 4, 1, 235, 192, 234, 179, 50, 254, 115, 50, 119, 6, 253, 166, 251, - 227, 6, 251, 74, 245, 76, 87, 119, 4, 76, 119, 6, 76, 119, 6, 245, 14, - 215, 94, 6, 245, 14, 119, 6, 194, 119, 4, 78, 109, 87, 252, 37, 87, 242, - 209, 87, 248, 198, 87, 235, 239, 219, 31, 222, 189, 6, 224, 99, 244, 190, - 50, 139, 4, 225, 111, 139, 4, 243, 114, 139, 6, 243, 114, 139, 6, 225, - 111, 139, 230, 29, 218, 41, 215, 94, 35, 6, 243, 209, 215, 94, 35, 6, - 156, 223, 52, 35, 6, 156, 215, 94, 35, 6, 211, 117, 139, 32, 6, 249, 68, - 139, 32, 4, 249, 68, 139, 32, 4, 76, 139, 32, 4, 74, 139, 32, 4, 235, - 150, 224, 173, 232, 219, 215, 94, 254, 134, 225, 186, 50, 254, 189, 215, - 94, 4, 245, 14, 16, 31, 221, 254, 219, 31, 212, 114, 244, 10, 123, 220, - 120, 212, 114, 244, 10, 123, 228, 199, 212, 114, 244, 10, 123, 216, 242, - 212, 114, 244, 10, 123, 216, 169, 212, 114, 244, 10, 113, 216, 167, 212, - 114, 244, 10, 123, 244, 125, 212, 114, 244, 10, 113, 244, 124, 212, 114, - 244, 10, 134, 244, 124, 212, 114, 244, 10, 244, 19, 244, 124, 212, 114, - 244, 10, 123, 219, 117, 212, 114, 244, 10, 244, 89, 219, 115, 212, 114, - 244, 10, 123, 245, 196, 212, 114, 244, 10, 134, 245, 194, 212, 114, 244, - 10, 244, 89, 245, 194, 212, 114, 244, 10, 220, 124, 245, 194, 244, 10, - 227, 201, 111, 222, 200, 227, 202, 111, 222, 200, 227, 202, 105, 222, - 200, 227, 202, 158, 222, 200, 227, 202, 161, 222, 200, 227, 202, 190, - 222, 200, 227, 202, 195, 222, 200, 227, 202, 199, 222, 200, 227, 202, - 196, 222, 200, 227, 202, 201, 222, 200, 227, 202, 216, 248, 222, 200, - 227, 202, 245, 175, 222, 200, 227, 202, 215, 76, 222, 200, 227, 202, 244, - 122, 222, 200, 227, 202, 123, 240, 217, 222, 200, 227, 202, 244, 89, 240, - 217, 222, 200, 227, 202, 123, 216, 148, 4, 222, 200, 227, 202, 111, 4, - 222, 200, 227, 202, 105, 4, 222, 200, 227, 202, 158, 4, 222, 200, 227, - 202, 161, 4, 222, 200, 227, 202, 190, 4, 222, 200, 227, 202, 195, 4, 222, - 200, 227, 202, 199, 4, 222, 200, 227, 202, 196, 4, 222, 200, 227, 202, - 201, 4, 222, 200, 227, 202, 216, 248, 4, 222, 200, 227, 202, 245, 175, 4, - 222, 200, 227, 202, 215, 76, 4, 222, 200, 227, 202, 244, 122, 4, 222, - 200, 227, 202, 123, 240, 217, 4, 222, 200, 227, 202, 244, 89, 240, 217, - 4, 222, 200, 227, 202, 123, 216, 148, 222, 200, 227, 202, 123, 216, 149, - 251, 75, 249, 68, 222, 200, 227, 202, 244, 89, 216, 148, 222, 200, 227, - 202, 216, 249, 216, 148, 222, 200, 227, 202, 223, 52, 123, 240, 217, 7, - 4, 1, 223, 52, 251, 74, 222, 200, 227, 202, 219, 127, 233, 84, 17, 222, - 200, 227, 202, 244, 123, 245, 234, 17, 222, 200, 227, 202, 244, 123, 216, - 148, 222, 200, 227, 202, 123, 240, 218, 216, 148, 212, 114, 244, 10, 210, - 87, 216, 167, 140, 75, 214, 153, 75, 97, 75, 246, 112, 75, 43, 44, 75, - 120, 124, 75, 228, 61, 212, 9, 75, 228, 61, 245, 228, 75, 219, 30, 245, - 228, 75, 219, 30, 212, 9, 75, 140, 80, 2, 91, 97, 80, 2, 91, 140, 212, - 36, 75, 97, 212, 36, 75, 140, 113, 241, 241, 75, 214, 153, 113, 241, 241, - 75, 97, 113, 241, 241, 75, 246, 112, 113, 241, 241, 75, 140, 80, 2, 217, - 78, 97, 80, 2, 217, 78, 140, 80, 243, 251, 130, 214, 153, 80, 243, 251, - 130, 97, 80, 243, 251, 130, 246, 112, 80, 243, 251, 130, 120, 124, 80, 2, - 252, 135, 140, 80, 2, 103, 97, 80, 2, 103, 140, 80, 2, 232, 129, 97, 80, - 2, 232, 129, 43, 44, 212, 36, 75, 43, 44, 80, 2, 91, 246, 112, 210, 35, - 75, 214, 153, 80, 2, 216, 78, 233, 43, 214, 153, 80, 2, 216, 78, 222, - 244, 246, 112, 80, 2, 216, 78, 233, 43, 246, 112, 80, 2, 216, 78, 222, - 244, 97, 80, 2, 249, 169, 246, 111, 246, 112, 80, 2, 249, 169, 233, 43, - 254, 96, 216, 15, 220, 155, 75, 250, 10, 216, 15, 220, 155, 75, 228, 61, - 212, 9, 80, 216, 43, 200, 130, 140, 80, 216, 43, 252, 149, 115, 97, 80, - 216, 43, 130, 254, 96, 204, 250, 44, 75, 250, 10, 204, 250, 44, 75, 140, - 242, 6, 2, 252, 147, 214, 152, 140, 242, 6, 2, 252, 147, 246, 111, 214, - 153, 242, 6, 2, 252, 147, 222, 244, 214, 153, 242, 6, 2, 252, 147, 233, - 43, 97, 242, 6, 2, 252, 147, 214, 152, 97, 242, 6, 2, 252, 147, 246, 111, - 246, 112, 242, 6, 2, 252, 147, 222, 244, 246, 112, 242, 6, 2, 252, 147, - 233, 43, 97, 80, 115, 140, 75, 214, 153, 80, 140, 64, 246, 112, 75, 140, - 80, 115, 97, 75, 140, 226, 74, 253, 255, 214, 153, 226, 74, 253, 255, 97, - 226, 74, 253, 255, 246, 112, 226, 74, 253, 255, 140, 242, 6, 115, 97, - 242, 5, 97, 242, 6, 115, 140, 242, 5, 140, 52, 80, 2, 91, 43, 44, 52, 80, - 2, 91, 97, 52, 80, 2, 91, 140, 52, 75, 214, 153, 52, 75, 97, 52, 75, 246, - 112, 52, 75, 43, 44, 52, 75, 120, 124, 52, 75, 228, 61, 212, 9, 52, 75, - 228, 61, 245, 228, 52, 75, 219, 30, 245, 228, 52, 75, 219, 30, 212, 9, - 52, 75, 140, 215, 212, 75, 97, 215, 212, 75, 140, 218, 232, 75, 97, 218, - 232, 75, 214, 153, 80, 2, 52, 91, 246, 112, 80, 2, 52, 91, 140, 248, 163, - 75, 214, 153, 248, 163, 75, 97, 248, 163, 75, 246, 112, 248, 163, 75, - 140, 80, 216, 43, 130, 97, 80, 216, 43, 130, 140, 71, 75, 214, 153, 71, - 75, 97, 71, 75, 246, 112, 71, 75, 214, 153, 71, 80, 243, 251, 130, 214, - 153, 71, 80, 226, 201, 225, 217, 214, 153, 71, 80, 226, 201, 225, 218, 2, - 203, 130, 214, 153, 71, 80, 226, 201, 225, 218, 2, 67, 130, 214, 153, 71, - 52, 75, 214, 153, 71, 52, 80, 226, 201, 225, 217, 97, 71, 80, 243, 251, - 212, 56, 228, 61, 212, 9, 80, 216, 43, 249, 168, 219, 30, 245, 228, 80, - 216, 43, 249, 168, 120, 124, 71, 75, 44, 80, 2, 4, 250, 43, 246, 112, 80, - 140, 64, 214, 153, 75, 134, 97, 253, 255, 140, 80, 2, 67, 91, 97, 80, 2, - 67, 91, 43, 44, 80, 2, 67, 91, 140, 80, 2, 52, 67, 91, 97, 80, 2, 52, 67, - 91, 43, 44, 80, 2, 52, 67, 91, 140, 226, 177, 75, 97, 226, 177, 75, 43, - 44, 226, 177, 75, 31, 254, 163, 249, 222, 226, 1, 247, 241, 216, 188, - 245, 35, 216, 188, 247, 146, 228, 57, 245, 36, 245, 160, 220, 129, 235, - 252, 229, 226, 245, 178, 226, 235, 228, 57, 254, 132, 245, 178, 226, 235, - 4, 245, 178, 226, 235, 249, 194, 253, 246, 231, 67, 247, 146, 228, 57, - 249, 196, 253, 246, 231, 67, 4, 249, 194, 253, 246, 231, 67, 245, 151, - 64, 224, 175, 230, 29, 224, 183, 230, 29, 249, 173, 230, 29, 218, 41, - 230, 187, 50, 230, 185, 50, 59, 225, 25, 247, 177, 219, 97, 220, 130, - 230, 186, 253, 225, 226, 171, 222, 237, 226, 171, 251, 122, 226, 171, 42, - 222, 195, 249, 117, 222, 195, 244, 12, 222, 195, 224, 171, 112, 235, 241, - 44, 254, 117, 254, 117, 231, 93, 254, 117, 219, 1, 254, 117, 247, 179, - 247, 146, 228, 57, 247, 182, 226, 12, 112, 228, 57, 226, 12, 112, 232, - 152, 254, 126, 232, 152, 226, 162, 235, 205, 214, 175, 235, 218, 52, 235, - 218, 215, 212, 235, 218, 249, 190, 235, 218, 218, 14, 235, 218, 213, 129, - 235, 218, 250, 10, 235, 218, 250, 10, 249, 190, 235, 218, 254, 96, 249, - 190, 235, 218, 216, 187, 252, 75, 223, 140, 224, 172, 59, 230, 186, 245, - 41, 243, 53, 224, 172, 241, 64, 216, 90, 226, 171, 223, 52, 184, 235, - 200, 233, 71, 222, 93, 219, 159, 212, 35, 211, 200, 224, 183, 228, 57, - 184, 230, 187, 184, 253, 218, 128, 112, 228, 57, 253, 218, 128, 112, 254, - 56, 128, 112, 254, 56, 251, 96, 228, 57, 255, 13, 128, 112, 229, 105, - 254, 56, 228, 64, 255, 13, 128, 112, 254, 156, 128, 112, 228, 57, 254, - 156, 128, 112, 254, 156, 128, 177, 128, 112, 215, 212, 184, 254, 164, - 128, 112, 245, 102, 112, 243, 52, 245, 102, 112, 247, 242, 252, 31, 254, - 58, 216, 197, 232, 227, 243, 52, 128, 112, 254, 56, 128, 216, 43, 177, - 216, 197, 236, 22, 226, 235, 236, 22, 64, 177, 254, 56, 128, 112, 249, - 235, 245, 105, 245, 106, 249, 234, 222, 237, 236, 7, 128, 112, 222, 237, - 128, 112, 249, 162, 112, 245, 75, 245, 104, 112, 218, 159, 245, 105, 248, - 63, 128, 112, 128, 216, 43, 251, 86, 248, 80, 231, 93, 251, 85, 224, 14, - 128, 112, 228, 57, 128, 112, 240, 111, 112, 228, 57, 240, 111, 112, 218, - 111, 245, 102, 112, 233, 21, 177, 128, 112, 242, 137, 177, 128, 112, 233, - 21, 115, 128, 112, 242, 137, 115, 128, 112, 233, 21, 251, 96, 228, 57, - 128, 112, 242, 137, 251, 96, 228, 57, 128, 112, 230, 102, 233, 20, 230, - 102, 242, 136, 252, 31, 228, 57, 245, 102, 112, 228, 57, 233, 20, 228, - 57, 242, 136, 229, 105, 233, 21, 228, 64, 128, 112, 229, 105, 242, 137, - 228, 64, 128, 112, 233, 21, 177, 245, 102, 112, 242, 137, 177, 245, 102, - 112, 229, 105, 233, 21, 228, 64, 245, 102, 112, 229, 105, 242, 137, 228, - 64, 245, 102, 112, 233, 21, 177, 242, 136, 242, 137, 177, 233, 20, 229, - 105, 233, 21, 228, 64, 242, 136, 229, 105, 242, 137, 228, 64, 233, 20, - 224, 205, 218, 56, 224, 206, 177, 128, 112, 218, 57, 177, 128, 112, 224, - 206, 177, 245, 102, 112, 218, 57, 177, 245, 102, 112, 247, 146, 228, 57, - 224, 208, 247, 146, 228, 57, 218, 58, 218, 65, 226, 235, 218, 23, 226, - 235, 228, 57, 116, 218, 65, 226, 235, 228, 57, 116, 218, 23, 226, 235, - 218, 65, 64, 177, 128, 112, 218, 23, 64, 177, 128, 112, 229, 105, 116, - 218, 65, 64, 228, 64, 128, 112, 229, 105, 116, 218, 23, 64, 228, 64, 128, - 112, 218, 65, 64, 2, 228, 57, 128, 112, 218, 23, 64, 2, 228, 57, 128, - 112, 230, 86, 230, 87, 230, 88, 230, 87, 214, 175, 42, 236, 22, 226, 235, - 42, 226, 154, 226, 235, 42, 236, 22, 64, 177, 128, 112, 42, 226, 154, 64, - 177, 128, 112, 42, 251, 3, 42, 249, 110, 37, 225, 25, 37, 230, 186, 37, - 216, 86, 37, 247, 177, 219, 97, 37, 59, 226, 171, 37, 222, 237, 226, 171, - 37, 253, 225, 226, 171, 37, 245, 105, 37, 248, 164, 92, 225, 25, 92, 230, - 186, 92, 216, 86, 92, 59, 226, 171, 44, 217, 88, 43, 217, 88, 124, 217, - 88, 120, 217, 88, 253, 228, 230, 161, 215, 192, 244, 33, 215, 212, 67, - 252, 149, 44, 215, 93, 52, 67, 252, 149, 52, 44, 215, 93, 247, 146, 228, - 57, 224, 166, 228, 57, 215, 192, 247, 146, 228, 57, 244, 34, 229, 107, - 52, 67, 252, 149, 52, 44, 215, 93, 224, 206, 214, 184, 223, 94, 218, 57, - 214, 184, 223, 94, 228, 62, 218, 78, 226, 235, 249, 194, 253, 246, 228, - 62, 218, 77, 228, 62, 218, 78, 64, 177, 128, 112, 249, 194, 253, 246, - 228, 62, 218, 78, 177, 128, 112, 226, 154, 226, 235, 236, 22, 226, 235, - 230, 92, 241, 207, 249, 204, 231, 142, 235, 215, 211, 145, 229, 207, 228, - 63, 44, 254, 118, 2, 254, 33, 44, 215, 226, 230, 29, 232, 152, 254, 126, - 230, 29, 232, 152, 226, 162, 230, 29, 235, 205, 230, 29, 214, 175, 248, - 1, 226, 171, 59, 226, 171, 218, 159, 226, 171, 247, 177, 216, 86, 251, - 172, 43, 228, 62, 244, 189, 220, 151, 224, 183, 44, 228, 62, 244, 189, - 220, 151, 224, 183, 43, 220, 151, 224, 183, 44, 220, 151, 224, 183, 223, - 52, 216, 90, 245, 105, 249, 107, 232, 152, 226, 162, 249, 107, 232, 152, - 254, 126, 52, 218, 64, 52, 218, 22, 52, 235, 205, 52, 214, 175, 225, 50, - 128, 22, 226, 12, 112, 233, 21, 2, 247, 128, 242, 137, 2, 247, 128, 213, - 187, 230, 102, 233, 20, 213, 187, 230, 102, 242, 136, 233, 21, 128, 216, - 43, 177, 242, 136, 242, 137, 128, 216, 43, 177, 233, 20, 128, 216, 43, - 177, 233, 20, 128, 216, 43, 177, 242, 136, 128, 216, 43, 177, 224, 205, - 128, 216, 43, 177, 218, 56, 247, 146, 228, 57, 224, 209, 177, 245, 107, - 247, 146, 228, 57, 218, 59, 177, 245, 107, 228, 57, 42, 236, 22, 64, 177, - 128, 112, 228, 57, 42, 226, 154, 64, 177, 128, 112, 42, 236, 22, 64, 177, - 228, 57, 128, 112, 42, 226, 154, 64, 177, 228, 57, 128, 112, 233, 21, - 251, 96, 228, 57, 245, 102, 112, 242, 137, 251, 96, 228, 57, 245, 102, - 112, 224, 206, 251, 96, 228, 57, 245, 102, 112, 218, 57, 251, 96, 228, - 57, 245, 102, 112, 228, 57, 228, 62, 218, 78, 226, 235, 247, 146, 228, - 57, 249, 196, 253, 246, 228, 62, 218, 77, 228, 57, 228, 62, 218, 78, 64, - 177, 128, 112, 247, 146, 228, 57, 249, 196, 253, 246, 228, 62, 218, 78, - 177, 245, 107, 67, 245, 171, 230, 227, 203, 245, 171, 120, 44, 248, 7, - 245, 171, 124, 44, 248, 7, 245, 171, 245, 178, 64, 2, 200, 203, 91, 245, - 178, 64, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, 4, 245, 178, - 64, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, 245, 178, 64, 2, - 59, 48, 245, 178, 64, 2, 226, 127, 4, 245, 178, 64, 2, 226, 127, 245, - 178, 64, 2, 214, 183, 245, 178, 64, 2, 113, 203, 218, 92, 249, 194, 2, - 200, 203, 91, 249, 194, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, - 4, 249, 194, 2, 67, 252, 149, 253, 215, 245, 151, 64, 203, 91, 249, 194, - 2, 226, 127, 4, 249, 194, 2, 226, 127, 210, 160, 189, 252, 181, 231, 66, - 248, 2, 50, 245, 180, 75, 240, 241, 120, 254, 1, 124, 254, 1, 224, 178, - 225, 168, 212, 32, 232, 219, 43, 250, 189, 44, 250, 189, 43, 244, 65, 44, - 244, 65, 251, 183, 44, 249, 140, 251, 183, 43, 249, 140, 216, 15, 44, - 249, 140, 216, 15, 43, 249, 140, 223, 52, 228, 57, 50, 42, 232, 110, 254, - 33, 221, 166, 221, 173, 217, 2, 223, 123, 224, 244, 235, 245, 213, 165, - 218, 236, 225, 44, 64, 235, 214, 50, 215, 94, 228, 57, 50, 212, 42, 240, - 243, 216, 15, 43, 249, 168, 216, 15, 44, 249, 168, 251, 183, 43, 249, - 168, 251, 183, 44, 249, 168, 216, 15, 163, 235, 218, 251, 183, 163, 235, - 218, 243, 248, 219, 77, 120, 254, 2, 252, 32, 113, 203, 252, 137, 226, - 164, 234, 144, 245, 98, 216, 43, 216, 197, 222, 254, 211, 179, 236, 7, - 116, 223, 120, 251, 171, 234, 143, 233, 48, 254, 118, 127, 222, 250, 254, - 118, 127, 245, 98, 216, 43, 216, 197, 233, 52, 252, 43, 222, 236, 249, - 78, 254, 164, 254, 9, 217, 182, 216, 5, 222, 125, 247, 223, 226, 155, - 249, 206, 217, 53, 219, 88, 249, 159, 249, 158, 254, 74, 243, 232, 16, - 240, 158, 254, 74, 243, 232, 16, 218, 230, 224, 30, 254, 74, 243, 232, - 16, 224, 31, 245, 107, 254, 74, 243, 232, 16, 224, 31, 247, 182, 254, 74, - 243, 232, 16, 224, 31, 248, 0, 254, 74, 243, 232, 16, 224, 31, 235, 62, - 254, 74, 243, 232, 16, 224, 31, 250, 43, 254, 74, 243, 232, 16, 250, 44, - 218, 137, 254, 74, 243, 232, 16, 250, 44, 235, 62, 254, 74, 243, 232, 16, - 219, 98, 130, 254, 74, 243, 232, 16, 252, 189, 130, 254, 74, 243, 232, - 16, 224, 31, 219, 97, 254, 74, 243, 232, 16, 224, 31, 252, 188, 254, 74, - 243, 232, 16, 224, 31, 233, 20, 254, 74, 243, 232, 16, 224, 31, 242, 136, - 254, 74, 243, 232, 16, 140, 214, 19, 254, 74, 243, 232, 16, 97, 214, 19, - 254, 74, 243, 232, 16, 224, 31, 140, 75, 254, 74, 243, 232, 16, 224, 31, - 97, 75, 254, 74, 243, 232, 16, 250, 44, 252, 188, 254, 74, 243, 232, 16, - 124, 217, 89, 214, 183, 254, 74, 243, 232, 16, 248, 63, 218, 137, 254, - 74, 243, 232, 16, 224, 31, 124, 250, 246, 254, 74, 243, 232, 16, 224, 31, - 248, 62, 254, 74, 243, 232, 16, 124, 217, 89, 235, 62, 254, 74, 243, 232, - 16, 214, 153, 214, 19, 254, 74, 243, 232, 16, 224, 31, 214, 153, 75, 254, - 74, 243, 232, 16, 120, 217, 89, 226, 127, 254, 74, 243, 232, 16, 248, 74, - 218, 137, 254, 74, 243, 232, 16, 224, 31, 120, 250, 246, 254, 74, 243, - 232, 16, 224, 31, 248, 73, 254, 74, 243, 232, 16, 120, 217, 89, 235, 62, - 254, 74, 243, 232, 16, 246, 112, 214, 19, 254, 74, 243, 232, 16, 224, 31, - 246, 112, 75, 254, 74, 243, 232, 16, 224, 0, 214, 183, 254, 74, 243, 232, - 16, 248, 63, 214, 183, 254, 74, 243, 232, 16, 248, 1, 214, 183, 254, 74, - 243, 232, 16, 235, 63, 214, 183, 254, 74, 243, 232, 16, 250, 44, 214, - 183, 254, 74, 243, 232, 16, 120, 220, 7, 235, 62, 254, 74, 243, 232, 16, - 224, 0, 224, 30, 254, 74, 243, 232, 16, 250, 44, 218, 158, 254, 74, 243, - 232, 16, 224, 31, 249, 234, 254, 74, 243, 232, 16, 120, 217, 89, 248, 9, - 254, 74, 243, 232, 16, 248, 74, 248, 9, 254, 74, 243, 232, 16, 218, 159, - 248, 9, 254, 74, 243, 232, 16, 235, 63, 248, 9, 254, 74, 243, 232, 16, - 250, 44, 248, 9, 254, 74, 243, 232, 16, 124, 220, 7, 218, 137, 254, 74, - 243, 232, 16, 43, 220, 7, 218, 137, 254, 74, 243, 232, 16, 216, 90, 248, - 9, 254, 74, 243, 232, 16, 242, 137, 248, 9, 254, 74, 243, 232, 16, 249, - 228, 130, 254, 74, 243, 232, 16, 248, 74, 184, 254, 74, 243, 232, 16, - 210, 34, 254, 74, 243, 232, 16, 218, 138, 184, 254, 74, 243, 232, 16, - 220, 153, 214, 183, 254, 74, 243, 232, 16, 224, 31, 228, 57, 245, 107, - 254, 74, 243, 232, 16, 224, 31, 224, 15, 254, 74, 243, 232, 16, 124, 250, - 247, 184, 254, 74, 243, 232, 16, 120, 250, 247, 184, 254, 74, 243, 232, - 16, 235, 192, 254, 74, 243, 232, 16, 223, 40, 254, 74, 243, 232, 16, 226, - 205, 254, 74, 243, 232, 16, 254, 152, 214, 183, 254, 74, 243, 232, 16, - 245, 109, 214, 183, 254, 74, 243, 232, 16, 235, 193, 214, 183, 254, 74, - 243, 232, 16, 226, 206, 214, 183, 254, 74, 243, 232, 16, 254, 151, 228, - 57, 250, 138, 79, 44, 254, 118, 2, 246, 112, 210, 35, 75, 219, 237, 204, - 251, 171, 252, 53, 87, 67, 232, 220, 2, 230, 229, 247, 128, 235, 223, 87, - 249, 191, 214, 181, 87, 247, 197, 214, 181, 87, 245, 162, 87, 249, 218, - 87, 71, 42, 2, 250, 183, 67, 232, 219, 245, 138, 87, 254, 147, 234, 145, - 87, 241, 220, 87, 37, 203, 252, 149, 2, 228, 55, 37, 215, 227, 246, 114, - 251, 143, 250, 44, 2, 228, 59, 75, 214, 179, 87, 230, 142, 87, 240, 171, - 87, 226, 178, 242, 66, 87, 226, 178, 233, 153, 87, 225, 248, 87, 225, - 247, 87, 247, 205, 249, 105, 16, 244, 28, 105, 219, 52, 87, 254, 74, 243, - 232, 16, 224, 30, 248, 91, 220, 140, 234, 145, 87, 224, 195, 226, 79, - 229, 87, 226, 79, 224, 191, 221, 191, 87, 250, 25, 221, 191, 87, 43, 226, - 8, 214, 160, 103, 43, 226, 8, 245, 29, 43, 226, 8, 232, 114, 103, 44, - 226, 8, 214, 160, 103, 44, 226, 8, 245, 29, 44, 226, 8, 232, 114, 103, - 43, 42, 251, 166, 214, 160, 249, 168, 43, 42, 251, 166, 245, 29, 43, 42, - 251, 166, 232, 114, 249, 168, 44, 42, 251, 166, 214, 160, 249, 168, 44, - 42, 251, 166, 245, 29, 44, 42, 251, 166, 232, 114, 249, 168, 43, 249, - 107, 251, 166, 214, 160, 103, 43, 249, 107, 251, 166, 230, 229, 225, 104, - 43, 249, 107, 251, 166, 232, 114, 103, 249, 107, 251, 166, 245, 29, 44, - 249, 107, 251, 166, 214, 160, 103, 44, 249, 107, 251, 166, 230, 229, 225, - 104, 44, 249, 107, 251, 166, 232, 114, 103, 235, 219, 245, 29, 203, 232, - 220, 245, 29, 214, 160, 43, 177, 232, 114, 44, 249, 107, 251, 166, 221, - 174, 214, 160, 44, 177, 232, 114, 43, 249, 107, 251, 166, 221, 174, 218, - 42, 216, 14, 218, 42, 251, 182, 216, 15, 42, 127, 251, 183, 42, 127, 251, - 183, 42, 251, 166, 115, 216, 15, 42, 127, 34, 16, 251, 182, 43, 67, 93, - 232, 219, 44, 67, 93, 232, 219, 203, 221, 207, 232, 218, 203, 221, 207, - 232, 217, 203, 221, 207, 232, 216, 203, 221, 207, 232, 215, 248, 54, 16, - 193, 67, 22, 216, 15, 222, 254, 248, 54, 16, 193, 67, 22, 251, 183, 222, - 254, 248, 54, 16, 193, 67, 2, 250, 43, 248, 54, 16, 193, 124, 22, 203, 2, - 250, 43, 248, 54, 16, 193, 120, 22, 203, 2, 250, 43, 248, 54, 16, 193, - 67, 2, 215, 226, 248, 54, 16, 193, 124, 22, 203, 2, 215, 226, 248, 54, - 16, 193, 120, 22, 203, 2, 215, 226, 248, 54, 16, 193, 67, 22, 212, 35, - 248, 54, 16, 193, 124, 22, 203, 2, 212, 35, 248, 54, 16, 193, 120, 22, - 203, 2, 212, 35, 248, 54, 16, 193, 124, 22, 241, 51, 248, 54, 16, 193, - 120, 22, 241, 51, 248, 54, 16, 193, 67, 22, 216, 15, 233, 52, 248, 54, - 16, 193, 67, 22, 251, 183, 233, 52, 42, 244, 40, 223, 57, 87, 245, 190, - 87, 67, 232, 220, 245, 29, 231, 38, 251, 154, 231, 38, 200, 115, 219, - 252, 231, 38, 219, 253, 115, 232, 143, 231, 38, 200, 115, 113, 219, 239, - 231, 38, 113, 219, 240, 115, 232, 143, 231, 38, 113, 219, 240, 235, 70, - 231, 38, 215, 209, 231, 38, 216, 224, 231, 38, 225, 191, 245, 232, 242, - 129, 243, 226, 216, 15, 226, 7, 251, 183, 226, 7, 216, 15, 249, 107, 127, - 251, 183, 249, 107, 127, 216, 15, 216, 7, 220, 55, 127, 251, 183, 216, 7, - 220, 55, 127, 71, 215, 240, 252, 43, 222, 237, 2, 250, 43, 218, 122, 244, - 72, 255, 26, 249, 104, 245, 179, 235, 205, 248, 91, 245, 32, 87, 85, 222, - 250, 52, 215, 226, 85, 233, 48, 52, 215, 226, 85, 214, 162, 52, 215, 226, - 85, 246, 113, 52, 215, 226, 85, 222, 250, 52, 215, 227, 2, 67, 130, 85, - 233, 48, 52, 215, 227, 2, 67, 130, 85, 222, 250, 215, 227, 2, 52, 67, - 130, 254, 182, 250, 11, 218, 128, 216, 87, 250, 11, 240, 244, 2, 244, 58, - 221, 243, 16, 31, 227, 206, 16, 31, 218, 154, 64, 241, 240, 16, 31, 218, - 154, 64, 216, 213, 16, 31, 245, 151, 64, 216, 213, 16, 31, 245, 151, 64, - 215, 244, 16, 31, 245, 140, 16, 31, 255, 16, 16, 31, 252, 52, 16, 31, - 252, 187, 16, 31, 203, 217, 90, 16, 31, 232, 220, 244, 153, 16, 31, 67, - 217, 90, 16, 31, 244, 28, 244, 153, 16, 31, 250, 238, 223, 56, 16, 31, - 220, 30, 226, 134, 16, 31, 220, 30, 236, 6, 16, 31, 248, 159, 232, 210, - 245, 85, 16, 31, 248, 39, 249, 186, 111, 16, 31, 248, 39, 249, 186, 105, - 16, 31, 248, 39, 249, 186, 158, 16, 31, 248, 39, 249, 186, 161, 16, 31, - 152, 255, 16, 16, 31, 217, 178, 236, 69, 16, 31, 245, 151, 64, 215, 245, - 251, 221, 16, 31, 251, 13, 16, 31, 245, 151, 64, 231, 86, 16, 31, 218, - 62, 16, 31, 245, 85, 16, 31, 244, 115, 220, 139, 16, 31, 242, 128, 220, - 139, 16, 31, 223, 124, 220, 139, 16, 31, 214, 174, 220, 139, 16, 31, 219, - 20, 16, 31, 248, 71, 251, 224, 87, 204, 251, 171, 16, 31, 229, 90, 16, - 31, 248, 72, 244, 28, 105, 16, 31, 218, 63, 244, 28, 105, 226, 245, 103, - 226, 245, 250, 160, 226, 245, 244, 31, 226, 245, 235, 200, 244, 31, 226, - 245, 252, 50, 251, 132, 226, 245, 251, 178, 216, 112, 226, 245, 251, 163, - 252, 154, 240, 110, 226, 245, 254, 135, 64, 250, 137, 226, 245, 248, 164, - 226, 245, 249, 95, 255, 20, 227, 204, 226, 245, 52, 252, 188, 37, 21, - 111, 37, 21, 105, 37, 21, 158, 37, 21, 161, 37, 21, 190, 37, 21, 195, 37, - 21, 199, 37, 21, 196, 37, 21, 201, 37, 54, 216, 248, 37, 54, 245, 175, - 37, 54, 215, 76, 37, 54, 216, 165, 37, 54, 244, 13, 37, 54, 244, 126, 37, - 54, 219, 121, 37, 54, 220, 121, 37, 54, 245, 198, 37, 54, 228, 202, 37, - 54, 215, 73, 88, 21, 111, 88, 21, 105, 88, 21, 158, 88, 21, 161, 88, 21, - 190, 88, 21, 195, 88, 21, 199, 88, 21, 196, 88, 21, 201, 88, 54, 216, - 248, 88, 54, 245, 175, 88, 54, 215, 76, 88, 54, 216, 165, 88, 54, 244, - 13, 88, 54, 244, 126, 88, 54, 219, 121, 88, 54, 220, 121, 88, 54, 245, - 198, 88, 54, 228, 202, 88, 54, 215, 73, 21, 123, 243, 236, 218, 131, 21, - 113, 243, 236, 218, 131, 21, 134, 243, 236, 218, 131, 21, 244, 19, 243, - 236, 218, 131, 21, 244, 89, 243, 236, 218, 131, 21, 219, 127, 243, 236, - 218, 131, 21, 220, 124, 243, 236, 218, 131, 21, 245, 201, 243, 236, 218, - 131, 21, 228, 205, 243, 236, 218, 131, 54, 216, 249, 243, 236, 218, 131, - 54, 245, 176, 243, 236, 218, 131, 54, 215, 77, 243, 236, 218, 131, 54, - 216, 166, 243, 236, 218, 131, 54, 244, 14, 243, 236, 218, 131, 54, 244, - 127, 243, 236, 218, 131, 54, 219, 122, 243, 236, 218, 131, 54, 220, 122, - 243, 236, 218, 131, 54, 245, 199, 243, 236, 218, 131, 54, 228, 203, 243, - 236, 218, 131, 54, 215, 74, 243, 236, 218, 131, 88, 7, 4, 1, 61, 88, 7, - 4, 1, 253, 166, 88, 7, 4, 1, 251, 74, 88, 7, 4, 1, 249, 68, 88, 7, 4, 1, - 76, 88, 7, 4, 1, 245, 14, 88, 7, 4, 1, 243, 209, 88, 7, 4, 1, 242, 67, - 88, 7, 4, 1, 74, 88, 7, 4, 1, 235, 150, 88, 7, 4, 1, 235, 29, 88, 7, 4, - 1, 156, 88, 7, 4, 1, 194, 88, 7, 4, 1, 230, 30, 88, 7, 4, 1, 78, 88, 7, - 4, 1, 226, 109, 88, 7, 4, 1, 224, 99, 88, 7, 4, 1, 153, 88, 7, 4, 1, 222, - 93, 88, 7, 4, 1, 217, 153, 88, 7, 4, 1, 69, 88, 7, 4, 1, 214, 105, 88, 7, - 4, 1, 212, 98, 88, 7, 4, 1, 211, 178, 88, 7, 4, 1, 211, 117, 88, 7, 4, 1, - 210, 159, 37, 7, 6, 1, 61, 37, 7, 6, 1, 253, 166, 37, 7, 6, 1, 251, 74, - 37, 7, 6, 1, 249, 68, 37, 7, 6, 1, 76, 37, 7, 6, 1, 245, 14, 37, 7, 6, 1, - 243, 209, 37, 7, 6, 1, 242, 67, 37, 7, 6, 1, 74, 37, 7, 6, 1, 235, 150, - 37, 7, 6, 1, 235, 29, 37, 7, 6, 1, 156, 37, 7, 6, 1, 194, 37, 7, 6, 1, - 230, 30, 37, 7, 6, 1, 78, 37, 7, 6, 1, 226, 109, 37, 7, 6, 1, 224, 99, - 37, 7, 6, 1, 153, 37, 7, 6, 1, 222, 93, 37, 7, 6, 1, 217, 153, 37, 7, 6, - 1, 69, 37, 7, 6, 1, 214, 105, 37, 7, 6, 1, 212, 98, 37, 7, 6, 1, 211, - 178, 37, 7, 6, 1, 211, 117, 37, 7, 6, 1, 210, 159, 37, 7, 4, 1, 61, 37, - 7, 4, 1, 253, 166, 37, 7, 4, 1, 251, 74, 37, 7, 4, 1, 249, 68, 37, 7, 4, - 1, 76, 37, 7, 4, 1, 245, 14, 37, 7, 4, 1, 243, 209, 37, 7, 4, 1, 242, 67, - 37, 7, 4, 1, 74, 37, 7, 4, 1, 235, 150, 37, 7, 4, 1, 235, 29, 37, 7, 4, - 1, 156, 37, 7, 4, 1, 194, 37, 7, 4, 1, 230, 30, 37, 7, 4, 1, 78, 37, 7, - 4, 1, 226, 109, 37, 7, 4, 1, 224, 99, 37, 7, 4, 1, 153, 37, 7, 4, 1, 222, - 93, 37, 7, 4, 1, 217, 153, 37, 7, 4, 1, 69, 37, 7, 4, 1, 214, 105, 37, 7, - 4, 1, 212, 98, 37, 7, 4, 1, 211, 178, 37, 7, 4, 1, 211, 117, 37, 7, 4, 1, - 210, 159, 37, 21, 210, 86, 152, 37, 54, 245, 175, 152, 37, 54, 215, 76, - 152, 37, 54, 216, 165, 152, 37, 54, 244, 13, 152, 37, 54, 244, 126, 152, - 37, 54, 219, 121, 152, 37, 54, 220, 121, 152, 37, 54, 245, 198, 152, 37, - 54, 228, 202, 152, 37, 54, 215, 73, 52, 37, 21, 111, 52, 37, 21, 105, 52, - 37, 21, 158, 52, 37, 21, 161, 52, 37, 21, 190, 52, 37, 21, 195, 52, 37, - 21, 199, 52, 37, 21, 196, 52, 37, 21, 201, 52, 37, 54, 216, 248, 152, 37, - 21, 210, 86, 93, 99, 193, 241, 51, 93, 99, 114, 241, 51, 93, 99, 193, - 213, 239, 93, 99, 114, 213, 239, 93, 99, 193, 215, 212, 248, 165, 241, - 51, 93, 99, 114, 215, 212, 248, 165, 241, 51, 93, 99, 193, 215, 212, 248, - 165, 213, 239, 93, 99, 114, 215, 212, 248, 165, 213, 239, 93, 99, 193, - 224, 27, 248, 165, 241, 51, 93, 99, 114, 224, 27, 248, 165, 241, 51, 93, - 99, 193, 224, 27, 248, 165, 213, 239, 93, 99, 114, 224, 27, 248, 165, - 213, 239, 93, 99, 193, 124, 22, 222, 254, 93, 99, 124, 193, 22, 44, 241, - 228, 93, 99, 124, 114, 22, 44, 232, 236, 93, 99, 114, 124, 22, 222, 254, - 93, 99, 193, 124, 22, 233, 52, 93, 99, 124, 193, 22, 43, 241, 228, 93, - 99, 124, 114, 22, 43, 232, 236, 93, 99, 114, 124, 22, 233, 52, 93, 99, - 193, 120, 22, 222, 254, 93, 99, 120, 193, 22, 44, 241, 228, 93, 99, 120, - 114, 22, 44, 232, 236, 93, 99, 114, 120, 22, 222, 254, 93, 99, 193, 120, - 22, 233, 52, 93, 99, 120, 193, 22, 43, 241, 228, 93, 99, 120, 114, 22, - 43, 232, 236, 93, 99, 114, 120, 22, 233, 52, 93, 99, 193, 67, 22, 222, - 254, 93, 99, 67, 193, 22, 44, 241, 228, 93, 99, 120, 114, 22, 44, 124, - 232, 236, 93, 99, 124, 114, 22, 44, 120, 232, 236, 93, 99, 67, 114, 22, - 44, 232, 236, 93, 99, 124, 193, 22, 44, 120, 241, 228, 93, 99, 120, 193, - 22, 44, 124, 241, 228, 93, 99, 114, 67, 22, 222, 254, 93, 99, 193, 67, - 22, 233, 52, 93, 99, 67, 193, 22, 43, 241, 228, 93, 99, 120, 114, 22, 43, - 124, 232, 236, 93, 99, 124, 114, 22, 43, 120, 232, 236, 93, 99, 67, 114, - 22, 43, 232, 236, 93, 99, 124, 193, 22, 43, 120, 241, 228, 93, 99, 120, - 193, 22, 43, 124, 241, 228, 93, 99, 114, 67, 22, 233, 52, 93, 99, 193, - 124, 22, 241, 51, 93, 99, 43, 114, 22, 44, 124, 232, 236, 93, 99, 44, - 114, 22, 43, 124, 232, 236, 93, 99, 124, 193, 22, 203, 241, 228, 93, 99, - 124, 114, 22, 203, 232, 236, 93, 99, 44, 193, 22, 43, 124, 241, 228, 93, - 99, 43, 193, 22, 44, 124, 241, 228, 93, 99, 114, 124, 22, 241, 51, 93, - 99, 193, 120, 22, 241, 51, 93, 99, 43, 114, 22, 44, 120, 232, 236, 93, - 99, 44, 114, 22, 43, 120, 232, 236, 93, 99, 120, 193, 22, 203, 241, 228, - 93, 99, 120, 114, 22, 203, 232, 236, 93, 99, 44, 193, 22, 43, 120, 241, - 228, 93, 99, 43, 193, 22, 44, 120, 241, 228, 93, 99, 114, 120, 22, 241, - 51, 93, 99, 193, 67, 22, 241, 51, 93, 99, 43, 114, 22, 44, 67, 232, 236, - 93, 99, 44, 114, 22, 43, 67, 232, 236, 93, 99, 67, 193, 22, 203, 241, - 228, 93, 99, 120, 114, 22, 124, 203, 232, 236, 93, 99, 124, 114, 22, 120, - 203, 232, 236, 93, 99, 67, 114, 22, 203, 232, 236, 93, 99, 43, 120, 114, - 22, 44, 124, 232, 236, 93, 99, 44, 120, 114, 22, 43, 124, 232, 236, 93, - 99, 43, 124, 114, 22, 44, 120, 232, 236, 93, 99, 44, 124, 114, 22, 43, - 120, 232, 236, 93, 99, 124, 193, 22, 120, 203, 241, 228, 93, 99, 120, - 193, 22, 124, 203, 241, 228, 93, 99, 44, 193, 22, 43, 67, 241, 228, 93, - 99, 43, 193, 22, 44, 67, 241, 228, 93, 99, 114, 67, 22, 241, 51, 93, 99, - 193, 52, 248, 165, 241, 51, 93, 99, 114, 52, 248, 165, 241, 51, 93, 99, - 193, 52, 248, 165, 213, 239, 93, 99, 114, 52, 248, 165, 213, 239, 93, 99, - 52, 241, 51, 93, 99, 52, 213, 239, 93, 99, 124, 219, 157, 22, 44, 246, - 121, 93, 99, 124, 52, 22, 44, 219, 156, 93, 99, 52, 124, 22, 222, 254, - 93, 99, 124, 219, 157, 22, 43, 246, 121, 93, 99, 124, 52, 22, 43, 219, - 156, 93, 99, 52, 124, 22, 233, 52, 93, 99, 120, 219, 157, 22, 44, 246, - 121, 93, 99, 120, 52, 22, 44, 219, 156, 93, 99, 52, 120, 22, 222, 254, - 93, 99, 120, 219, 157, 22, 43, 246, 121, 93, 99, 120, 52, 22, 43, 219, - 156, 93, 99, 52, 120, 22, 233, 52, 93, 99, 67, 219, 157, 22, 44, 246, - 121, 93, 99, 67, 52, 22, 44, 219, 156, 93, 99, 52, 67, 22, 222, 254, 93, - 99, 67, 219, 157, 22, 43, 246, 121, 93, 99, 67, 52, 22, 43, 219, 156, 93, - 99, 52, 67, 22, 233, 52, 93, 99, 124, 219, 157, 22, 203, 246, 121, 93, - 99, 124, 52, 22, 203, 219, 156, 93, 99, 52, 124, 22, 241, 51, 93, 99, - 120, 219, 157, 22, 203, 246, 121, 93, 99, 120, 52, 22, 203, 219, 156, 93, - 99, 52, 120, 22, 241, 51, 93, 99, 67, 219, 157, 22, 203, 246, 121, 93, - 99, 67, 52, 22, 203, 219, 156, 93, 99, 52, 67, 22, 241, 51, 93, 99, 193, - 254, 34, 124, 22, 222, 254, 93, 99, 193, 254, 34, 124, 22, 233, 52, 93, - 99, 193, 254, 34, 120, 22, 233, 52, 93, 99, 193, 254, 34, 120, 22, 222, - 254, 93, 99, 193, 248, 7, 214, 160, 44, 216, 43, 232, 114, 233, 52, 93, - 99, 193, 248, 7, 214, 160, 43, 216, 43, 232, 114, 222, 254, 93, 99, 193, - 248, 7, 249, 138, 93, 99, 193, 233, 52, 93, 99, 193, 214, 163, 93, 99, - 193, 222, 254, 93, 99, 193, 246, 114, 93, 99, 114, 233, 52, 93, 99, 114, - 214, 163, 93, 99, 114, 222, 254, 93, 99, 114, 246, 114, 93, 99, 193, 43, - 22, 114, 222, 254, 93, 99, 193, 120, 22, 114, 246, 114, 93, 99, 114, 43, - 22, 193, 222, 254, 93, 99, 114, 120, 22, 193, 246, 114, 214, 160, 163, - 251, 221, 232, 114, 123, 245, 197, 251, 221, 232, 114, 123, 224, 25, 251, - 221, 232, 114, 134, 245, 195, 251, 221, 232, 114, 163, 251, 221, 232, - 114, 244, 89, 245, 195, 251, 221, 232, 114, 134, 224, 23, 251, 221, 232, - 114, 220, 124, 245, 195, 251, 221, 243, 236, 251, 221, 43, 220, 124, 245, - 195, 251, 221, 43, 134, 224, 23, 251, 221, 43, 244, 89, 245, 195, 251, - 221, 43, 163, 251, 221, 43, 134, 245, 195, 251, 221, 43, 123, 224, 25, - 251, 221, 43, 123, 245, 197, 251, 221, 44, 163, 251, 221, 193, 220, 94, - 231, 87, 220, 94, 248, 170, 220, 94, 214, 160, 123, 245, 197, 251, 221, - 44, 123, 245, 197, 251, 221, 224, 29, 232, 114, 233, 52, 224, 29, 232, - 114, 222, 254, 224, 29, 214, 160, 233, 52, 224, 29, 214, 160, 43, 22, - 232, 114, 43, 22, 232, 114, 222, 254, 224, 29, 214, 160, 43, 22, 232, - 114, 222, 254, 224, 29, 214, 160, 43, 22, 214, 160, 44, 22, 232, 114, - 233, 52, 224, 29, 214, 160, 43, 22, 214, 160, 44, 22, 232, 114, 222, 254, - 224, 29, 214, 160, 222, 254, 224, 29, 214, 160, 44, 22, 232, 114, 233, - 52, 224, 29, 214, 160, 44, 22, 232, 114, 43, 22, 232, 114, 222, 254, 85, - 218, 236, 71, 218, 236, 71, 42, 2, 222, 185, 249, 167, 71, 42, 249, 195, - 85, 4, 218, 236, 42, 2, 203, 244, 113, 42, 2, 67, 244, 113, 42, 2, 226, - 148, 249, 134, 244, 113, 42, 2, 214, 160, 43, 216, 43, 232, 114, 44, 244, - 113, 42, 2, 214, 160, 44, 216, 43, 232, 114, 43, 244, 113, 42, 2, 248, 7, - 249, 134, 244, 113, 85, 4, 218, 236, 71, 4, 218, 236, 85, 223, 119, 71, - 223, 119, 85, 67, 223, 119, 71, 67, 223, 119, 85, 226, 10, 71, 226, 10, - 85, 214, 162, 215, 226, 71, 214, 162, 215, 226, 85, 214, 162, 4, 215, - 226, 71, 214, 162, 4, 215, 226, 85, 222, 250, 215, 226, 71, 222, 250, - 215, 226, 85, 222, 250, 4, 215, 226, 71, 222, 250, 4, 215, 226, 85, 222, - 250, 225, 11, 71, 222, 250, 225, 11, 85, 246, 113, 215, 226, 71, 246, - 113, 215, 226, 85, 246, 113, 4, 215, 226, 71, 246, 113, 4, 215, 226, 85, - 233, 48, 215, 226, 71, 233, 48, 215, 226, 85, 233, 48, 4, 215, 226, 71, - 233, 48, 4, 215, 226, 85, 233, 48, 225, 11, 71, 233, 48, 225, 11, 85, - 248, 0, 71, 248, 0, 71, 248, 1, 249, 195, 85, 4, 248, 0, 244, 97, 232, - 110, 71, 250, 43, 246, 126, 250, 43, 250, 44, 2, 67, 244, 113, 251, 119, - 85, 250, 43, 250, 44, 2, 43, 163, 251, 229, 250, 44, 2, 44, 163, 251, - 229, 250, 44, 2, 232, 114, 163, 251, 229, 250, 44, 2, 214, 160, 163, 251, - 229, 250, 44, 2, 214, 160, 44, 224, 29, 251, 229, 250, 44, 2, 254, 164, - 251, 96, 214, 160, 43, 224, 29, 251, 229, 43, 163, 85, 250, 43, 44, 163, - 85, 250, 43, 235, 201, 251, 121, 235, 201, 71, 250, 43, 214, 160, 163, - 235, 201, 71, 250, 43, 232, 114, 163, 235, 201, 71, 250, 43, 214, 160, - 43, 224, 29, 250, 41, 254, 33, 214, 160, 44, 224, 29, 250, 41, 254, 33, - 232, 114, 44, 224, 29, 250, 41, 254, 33, 232, 114, 43, 224, 29, 250, 41, - 254, 33, 214, 160, 163, 250, 43, 232, 114, 163, 250, 43, 85, 232, 114, - 44, 215, 226, 85, 232, 114, 43, 215, 226, 85, 214, 160, 43, 215, 226, 85, - 214, 160, 44, 215, 226, 71, 251, 121, 42, 2, 43, 163, 251, 229, 42, 2, - 44, 163, 251, 229, 42, 2, 214, 160, 43, 248, 7, 163, 251, 229, 42, 2, - 232, 114, 44, 248, 7, 163, 251, 229, 71, 42, 2, 67, 251, 240, 232, 219, - 71, 214, 162, 215, 227, 2, 247, 128, 214, 162, 215, 227, 2, 43, 163, 251, - 229, 214, 162, 215, 227, 2, 44, 163, 251, 229, 233, 91, 250, 43, 71, 42, - 2, 214, 160, 43, 224, 28, 71, 42, 2, 232, 114, 43, 224, 28, 71, 42, 2, - 232, 114, 44, 224, 28, 71, 42, 2, 214, 160, 44, 224, 28, 71, 250, 44, 2, - 214, 160, 43, 224, 28, 71, 250, 44, 2, 232, 114, 43, 224, 28, 71, 250, - 44, 2, 232, 114, 44, 224, 28, 71, 250, 44, 2, 214, 160, 44, 224, 28, 214, - 160, 43, 215, 226, 214, 160, 44, 215, 226, 232, 114, 43, 215, 226, 71, - 231, 87, 218, 236, 85, 231, 87, 218, 236, 71, 231, 87, 4, 218, 236, 85, - 231, 87, 4, 218, 236, 232, 114, 44, 215, 226, 85, 218, 39, 2, 223, 135, - 249, 255, 214, 194, 219, 62, 249, 230, 85, 218, 158, 71, 218, 158, 232, - 234, 216, 133, 218, 38, 253, 242, 228, 76, 248, 46, 228, 76, 249, 203, - 226, 167, 85, 217, 1, 71, 217, 1, 252, 164, 251, 171, 252, 164, 93, 2, - 250, 137, 252, 164, 93, 2, 211, 178, 222, 0, 214, 195, 2, 223, 163, 246, - 92, 240, 250, 252, 30, 71, 220, 4, 225, 104, 85, 220, 4, 225, 104, 220, - 89, 223, 52, 222, 189, 244, 63, 241, 235, 251, 121, 85, 43, 225, 10, 235, - 249, 85, 44, 225, 10, 235, 249, 71, 43, 225, 10, 235, 249, 71, 120, 225, - 10, 235, 249, 71, 44, 225, 10, 235, 249, 71, 124, 225, 10, 235, 249, 219, - 103, 22, 249, 137, 250, 227, 50, 223, 175, 50, 251, 247, 50, 251, 33, - 254, 110, 226, 149, 249, 138, 250, 119, 223, 40, 249, 139, 64, 232, 124, - 249, 139, 64, 235, 122, 218, 159, 22, 249, 144, 244, 176, 87, 255, 1, - 220, 91, 242, 29, 22, 219, 191, 225, 223, 87, 210, 254, 211, 69, 215, - 216, 31, 241, 230, 215, 216, 31, 233, 113, 215, 216, 31, 244, 104, 215, - 216, 31, 216, 134, 215, 216, 31, 211, 239, 215, 216, 31, 212, 40, 215, - 216, 31, 230, 120, 215, 216, 31, 245, 231, 212, 1, 64, 248, 26, 71, 243, - 247, 244, 198, 71, 219, 76, 244, 198, 85, 219, 76, 244, 198, 71, 218, 39, - 2, 223, 135, 244, 100, 224, 25, 230, 133, 233, 86, 224, 25, 230, 133, - 231, 59, 244, 146, 50, 245, 231, 231, 195, 50, 235, 44, 221, 222, 214, - 145, 229, 98, 225, 23, 254, 20, 217, 41, 243, 59, 251, 11, 233, 25, 213, - 150, 232, 244, 221, 193, 222, 21, 251, 0, 254, 50, 225, 55, 71, 250, 125, - 234, 84, 71, 250, 125, 224, 17, 71, 250, 125, 222, 197, 71, 250, 125, - 251, 239, 71, 250, 125, 234, 36, 71, 250, 125, 225, 235, 85, 250, 125, - 234, 84, 85, 250, 125, 224, 17, 85, 250, 125, 222, 197, 85, 250, 125, - 251, 239, 85, 250, 125, 234, 36, 85, 250, 125, 225, 235, 85, 219, 18, - 218, 51, 71, 241, 235, 218, 51, 71, 248, 1, 218, 51, 85, 249, 253, 218, - 51, 71, 219, 18, 218, 51, 85, 241, 235, 218, 51, 85, 248, 1, 218, 51, 71, - 249, 253, 218, 51, 240, 250, 218, 240, 224, 25, 228, 52, 245, 197, 228, - 52, 252, 81, 245, 197, 228, 47, 252, 81, 219, 120, 228, 47, 230, 62, 244, - 74, 50, 230, 62, 229, 193, 50, 230, 62, 220, 78, 50, 212, 9, 183, 249, - 138, 245, 228, 183, 249, 138, 214, 171, 223, 115, 87, 223, 115, 16, 31, - 215, 48, 225, 37, 223, 115, 16, 31, 215, 47, 225, 37, 223, 115, 16, 31, - 215, 46, 225, 37, 223, 115, 16, 31, 215, 45, 225, 37, 223, 115, 16, 31, - 215, 44, 225, 37, 223, 115, 16, 31, 215, 43, 225, 37, 223, 115, 16, 31, - 215, 42, 225, 37, 223, 115, 16, 31, 243, 57, 231, 143, 85, 214, 171, 223, - 115, 87, 223, 116, 226, 24, 87, 226, 0, 226, 24, 87, 225, 177, 226, 24, - 50, 211, 255, 87, 247, 249, 244, 197, 247, 249, 244, 196, 247, 249, 244, - 195, 247, 249, 244, 194, 247, 249, 244, 193, 247, 249, 244, 192, 71, 250, - 44, 2, 59, 222, 254, 71, 250, 44, 2, 113, 247, 126, 85, 250, 44, 2, 71, - 59, 222, 254, 85, 250, 44, 2, 113, 71, 247, 126, 230, 147, 31, 211, 69, - 230, 147, 31, 210, 253, 247, 232, 31, 242, 138, 211, 69, 247, 232, 31, - 233, 19, 210, 253, 247, 232, 31, 233, 19, 211, 69, 247, 232, 31, 242, - 138, 210, 253, 71, 244, 81, 85, 244, 81, 242, 29, 22, 225, 107, 254, 128, - 249, 136, 217, 236, 218, 166, 64, 254, 235, 221, 208, 254, 178, 244, 59, - 243, 67, 218, 166, 64, 241, 209, 253, 207, 87, 244, 70, 226, 130, 71, - 218, 158, 134, 232, 214, 249, 183, 222, 254, 134, 232, 214, 249, 183, - 233, 52, 212, 50, 50, 125, 213, 130, 50, 246, 118, 244, 146, 50, 246, - 118, 231, 195, 50, 235, 210, 244, 146, 22, 231, 195, 50, 231, 195, 22, - 244, 146, 50, 231, 195, 2, 218, 105, 50, 231, 195, 2, 218, 105, 22, 231, - 195, 22, 244, 146, 50, 67, 231, 195, 2, 218, 105, 50, 203, 231, 195, 2, - 218, 105, 50, 231, 87, 71, 250, 43, 231, 87, 85, 250, 43, 231, 87, 4, 71, - 250, 43, 231, 158, 87, 247, 175, 87, 214, 169, 225, 255, 87, 249, 239, - 243, 231, 214, 141, 229, 93, 250, 169, 226, 65, 235, 50, 213, 185, 250, - 101, 85, 230, 134, 232, 231, 220, 114, 220, 149, 224, 8, 220, 132, 219, - 57, 252, 167, 252, 134, 92, 234, 144, 71, 246, 101, 231, 190, 71, 246, - 101, 234, 84, 85, 246, 101, 231, 190, 85, 246, 101, 234, 84, 219, 63, - 211, 230, 219, 66, 218, 39, 252, 59, 249, 255, 223, 162, 85, 219, 62, - 216, 135, 250, 0, 22, 223, 162, 215, 94, 71, 220, 4, 225, 104, 215, 94, - 85, 220, 4, 225, 104, 71, 248, 1, 236, 7, 218, 236, 249, 133, 233, 97, - 247, 201, 250, 252, 226, 170, 225, 107, 250, 253, 219, 90, 241, 219, 2, - 71, 249, 138, 37, 249, 133, 233, 97, 250, 161, 228, 80, 245, 132, 254, - 149, 226, 195, 43, 212, 26, 215, 252, 85, 215, 55, 43, 212, 26, 215, 252, - 71, 215, 55, 43, 212, 26, 215, 252, 85, 43, 233, 98, 231, 58, 71, 43, - 233, 98, 231, 58, 246, 97, 219, 84, 50, 114, 71, 246, 113, 215, 226, 43, - 250, 8, 245, 132, 92, 222, 0, 244, 183, 248, 7, 236, 7, 71, 250, 44, 236, - 7, 85, 218, 236, 85, 215, 193, 223, 63, 43, 245, 131, 223, 63, 43, 245, - 130, 253, 219, 16, 31, 214, 145, 114, 250, 44, 2, 218, 105, 22, 113, 170, - 48, 225, 192, 222, 251, 235, 212, 225, 192, 233, 49, 235, 212, 225, 192, - 235, 200, 225, 192, 85, 249, 139, 226, 201, 220, 31, 220, 19, 219, 231, - 250, 69, 250, 234, 241, 164, 219, 128, 243, 68, 211, 230, 240, 227, 243, - 68, 2, 242, 19, 231, 178, 16, 31, 232, 235, 230, 120, 214, 195, 226, 201, - 242, 129, 244, 20, 244, 82, 236, 7, 241, 66, 244, 137, 222, 16, 42, 244, - 19, 249, 167, 219, 106, 240, 119, 219, 109, 225, 171, 2, 252, 167, 216, - 243, 235, 137, 252, 154, 87, 241, 238, 242, 140, 87, 243, 239, 224, 145, - 249, 111, 226, 201, 85, 218, 236, 71, 244, 82, 2, 203, 230, 229, 85, 218, - 106, 214, 160, 251, 225, 221, 195, 85, 221, 195, 232, 114, 251, 225, 221, - 195, 71, 221, 195, 71, 114, 250, 138, 79, 217, 2, 232, 160, 50, 217, 54, - 246, 96, 254, 200, 245, 127, 223, 160, 244, 93, 223, 160, 242, 22, 213, - 174, 242, 22, 211, 198, 242, 22, 232, 114, 44, 225, 201, 225, 201, 214, - 160, 44, 225, 201, 71, 228, 235, 85, 228, 235, 250, 138, 79, 114, 250, - 138, 79, 230, 89, 211, 178, 114, 230, 89, 211, 178, 252, 164, 211, 178, - 114, 252, 164, 211, 178, 226, 130, 26, 249, 138, 114, 26, 249, 138, 204, - 250, 183, 249, 138, 114, 204, 250, 183, 249, 138, 7, 249, 138, 220, 93, - 71, 7, 249, 138, 226, 130, 7, 249, 138, 231, 192, 249, 138, 218, 159, 64, - 248, 157, 244, 19, 217, 16, 253, 224, 244, 19, 252, 165, 253, 224, 114, - 244, 19, 252, 165, 253, 224, 244, 19, 249, 251, 253, 224, 85, 244, 19, - 225, 12, 218, 158, 71, 244, 19, 225, 12, 218, 158, 219, 13, 218, 113, - 226, 130, 71, 218, 158, 37, 71, 218, 158, 204, 250, 183, 85, 218, 158, - 85, 250, 183, 71, 218, 158, 226, 130, 85, 218, 158, 114, 226, 130, 85, - 218, 158, 225, 63, 218, 158, 220, 93, 71, 218, 158, 114, 253, 224, 204, - 250, 183, 253, 224, 245, 201, 218, 246, 253, 224, 245, 201, 225, 12, 85, - 218, 158, 245, 201, 225, 12, 225, 63, 218, 158, 219, 127, 225, 12, 85, - 218, 158, 245, 201, 225, 12, 223, 117, 85, 218, 158, 114, 245, 201, 225, - 12, 223, 117, 85, 218, 158, 215, 77, 225, 12, 85, 218, 158, 219, 122, - 225, 12, 253, 224, 217, 16, 253, 224, 204, 250, 183, 217, 16, 253, 224, - 114, 217, 16, 253, 224, 219, 127, 225, 160, 85, 22, 71, 244, 62, 85, 244, - 62, 71, 244, 62, 245, 201, 225, 160, 226, 130, 85, 244, 62, 37, 204, 250, - 183, 245, 201, 225, 12, 218, 158, 114, 217, 16, 225, 63, 253, 224, 219, - 64, 216, 106, 215, 219, 219, 64, 114, 250, 122, 219, 64, 219, 15, 114, - 219, 15, 252, 165, 253, 224, 245, 201, 217, 16, 224, 174, 253, 224, 114, - 245, 201, 217, 16, 224, 174, 253, 224, 249, 139, 79, 220, 93, 71, 250, - 43, 152, 92, 249, 139, 79, 232, 114, 44, 246, 94, 71, 218, 236, 214, 160, - 44, 246, 94, 71, 218, 236, 232, 114, 44, 220, 93, 71, 218, 236, 214, 160, - 44, 220, 93, 71, 218, 236, 85, 224, 16, 164, 226, 151, 71, 224, 16, 164, - 226, 151, 71, 245, 39, 164, 226, 151, 85, 248, 1, 230, 187, 71, 211, 178, - 114, 245, 39, 164, 87, 193, 67, 130, 231, 87, 67, 130, 114, 67, 130, 114, - 219, 157, 215, 94, 249, 228, 224, 1, 164, 226, 151, 114, 219, 157, 249, - 228, 224, 1, 164, 226, 151, 114, 52, 215, 94, 249, 228, 224, 1, 164, 226, - 151, 114, 52, 249, 228, 224, 1, 164, 226, 151, 114, 121, 219, 157, 249, - 228, 224, 1, 164, 226, 151, 114, 121, 52, 249, 228, 224, 1, 164, 226, - 151, 249, 99, 218, 142, 226, 19, 5, 226, 151, 114, 245, 39, 164, 226, - 151, 114, 241, 235, 245, 39, 164, 226, 151, 114, 85, 241, 234, 222, 189, - 114, 85, 241, 235, 251, 121, 244, 63, 241, 234, 222, 189, 244, 63, 241, - 235, 251, 121, 231, 87, 43, 226, 8, 226, 151, 231, 87, 44, 226, 8, 226, - 151, 231, 87, 244, 71, 43, 226, 8, 226, 151, 231, 87, 244, 71, 44, 226, - 8, 226, 151, 231, 87, 233, 48, 254, 118, 251, 166, 226, 151, 231, 87, - 222, 250, 254, 118, 251, 166, 226, 151, 114, 233, 48, 254, 118, 224, 1, - 164, 226, 151, 114, 222, 250, 254, 118, 224, 1, 164, 226, 151, 114, 233, - 48, 254, 118, 251, 166, 226, 151, 114, 222, 250, 254, 118, 251, 166, 226, - 151, 193, 43, 216, 7, 220, 55, 251, 166, 226, 151, 193, 44, 216, 7, 220, - 55, 251, 166, 226, 151, 231, 87, 43, 249, 107, 251, 166, 226, 151, 231, - 87, 44, 249, 107, 251, 166, 226, 151, 247, 212, 152, 37, 21, 111, 247, - 212, 152, 37, 21, 105, 247, 212, 152, 37, 21, 158, 247, 212, 152, 37, 21, - 161, 247, 212, 152, 37, 21, 190, 247, 212, 152, 37, 21, 195, 247, 212, - 152, 37, 21, 199, 247, 212, 152, 37, 21, 196, 247, 212, 152, 37, 21, 201, - 247, 212, 152, 37, 54, 216, 248, 247, 212, 37, 35, 21, 111, 247, 212, 37, - 35, 21, 105, 247, 212, 37, 35, 21, 158, 247, 212, 37, 35, 21, 161, 247, - 212, 37, 35, 21, 190, 247, 212, 37, 35, 21, 195, 247, 212, 37, 35, 21, - 199, 247, 212, 37, 35, 21, 196, 247, 212, 37, 35, 21, 201, 247, 212, 37, - 35, 54, 216, 248, 247, 212, 152, 37, 35, 21, 111, 247, 212, 152, 37, 35, - 21, 105, 247, 212, 152, 37, 35, 21, 158, 247, 212, 152, 37, 35, 21, 161, - 247, 212, 152, 37, 35, 21, 190, 247, 212, 152, 37, 35, 21, 195, 247, 212, - 152, 37, 35, 21, 199, 247, 212, 152, 37, 35, 21, 196, 247, 212, 152, 37, - 35, 21, 201, 247, 212, 152, 37, 35, 54, 216, 248, 114, 211, 246, 97, 75, - 114, 96, 50, 114, 230, 187, 50, 114, 247, 177, 50, 114, 219, 30, 245, - 228, 75, 114, 97, 75, 114, 228, 61, 245, 228, 75, 246, 106, 225, 14, 97, - 75, 114, 222, 186, 97, 75, 215, 225, 97, 75, 114, 215, 225, 97, 75, 248, - 163, 215, 225, 97, 75, 114, 248, 163, 215, 225, 97, 75, 85, 97, 75, 216, - 145, 216, 13, 97, 254, 1, 216, 145, 251, 181, 97, 254, 1, 85, 97, 254, 1, - 114, 85, 249, 99, 246, 112, 22, 97, 75, 114, 85, 249, 99, 214, 153, 22, - 97, 75, 218, 233, 85, 97, 75, 114, 249, 214, 85, 97, 75, 222, 249, 71, - 97, 75, 233, 47, 71, 97, 75, 252, 191, 220, 93, 71, 97, 75, 243, 249, - 220, 93, 71, 97, 75, 114, 232, 114, 222, 248, 71, 97, 75, 114, 214, 160, - 222, 248, 71, 97, 75, 228, 54, 232, 114, 222, 248, 71, 97, 75, 249, 107, - 232, 129, 228, 54, 214, 160, 222, 248, 71, 97, 75, 37, 114, 71, 97, 75, - 211, 252, 97, 75, 251, 228, 219, 30, 245, 228, 75, 251, 228, 97, 75, 251, - 228, 228, 61, 245, 228, 75, 114, 251, 228, 219, 30, 245, 228, 75, 114, - 251, 228, 97, 75, 114, 251, 228, 228, 61, 245, 228, 75, 217, 18, 97, 75, - 114, 217, 17, 97, 75, 212, 18, 97, 75, 114, 212, 18, 97, 75, 226, 176, - 97, 75, 52, 249, 107, 232, 129, 134, 247, 222, 254, 117, 71, 215, 227, - 249, 195, 4, 71, 215, 226, 225, 174, 204, 218, 64, 204, 218, 22, 43, 222, - 92, 252, 181, 248, 68, 44, 222, 92, 252, 181, 248, 68, 177, 2, 59, 235, - 222, 223, 53, 219, 49, 224, 204, 218, 64, 218, 23, 224, 204, 219, 48, 67, - 252, 149, 2, 203, 91, 11, 222, 231, 248, 6, 200, 247, 176, 11, 244, 183, - 248, 6, 92, 232, 152, 254, 126, 92, 232, 152, 226, 162, 71, 248, 1, 2, - 250, 181, 247, 128, 22, 2, 247, 128, 245, 178, 64, 226, 174, 214, 152, - 232, 114, 44, 249, 169, 2, 247, 128, 214, 160, 43, 249, 169, 2, 247, 128, - 43, 226, 132, 235, 72, 44, 226, 132, 235, 72, 243, 236, 226, 132, 235, - 72, 233, 91, 120, 217, 88, 233, 91, 124, 217, 88, 43, 22, 44, 52, 215, - 93, 43, 22, 44, 217, 88, 43, 230, 92, 200, 44, 217, 88, 200, 43, 217, 88, - 120, 217, 89, 2, 250, 44, 48, 232, 111, 247, 181, 251, 86, 203, 222, 135, - 71, 249, 213, 248, 0, 71, 249, 213, 248, 1, 2, 140, 216, 115, 71, 249, - 213, 248, 1, 2, 97, 216, 115, 71, 42, 2, 140, 216, 115, 71, 42, 2, 97, - 216, 115, 11, 43, 71, 42, 127, 11, 44, 71, 42, 127, 11, 43, 254, 118, - 127, 11, 44, 254, 118, 127, 11, 43, 52, 254, 118, 127, 11, 44, 52, 254, - 118, 127, 11, 43, 71, 216, 7, 220, 55, 127, 11, 44, 71, 216, 7, 220, 55, - 127, 11, 43, 244, 71, 226, 7, 11, 44, 244, 71, 226, 7, 214, 153, 224, 27, - 75, 246, 112, 224, 27, 75, 254, 96, 243, 105, 250, 44, 75, 250, 10, 243, - 105, 250, 44, 75, 44, 80, 2, 37, 225, 25, 200, 140, 75, 200, 97, 75, 200, - 43, 44, 75, 200, 140, 52, 75, 200, 97, 52, 75, 200, 43, 44, 52, 75, 200, - 140, 80, 243, 251, 130, 200, 97, 80, 243, 251, 130, 200, 140, 52, 80, - 243, 251, 130, 200, 97, 52, 80, 243, 251, 130, 200, 97, 218, 232, 75, 46, - 47, 251, 223, 46, 47, 247, 125, 46, 47, 246, 253, 46, 47, 247, 124, 46, - 47, 246, 189, 46, 47, 247, 60, 46, 47, 246, 252, 46, 47, 247, 123, 46, - 47, 246, 157, 46, 47, 247, 28, 46, 47, 246, 220, 46, 47, 247, 91, 46, 47, - 246, 188, 46, 47, 247, 59, 46, 47, 246, 251, 46, 47, 247, 122, 46, 47, - 246, 141, 46, 47, 247, 12, 46, 47, 246, 204, 46, 47, 247, 75, 46, 47, - 246, 172, 46, 47, 247, 43, 46, 47, 246, 235, 46, 47, 247, 106, 46, 47, - 246, 156, 46, 47, 247, 27, 46, 47, 246, 219, 46, 47, 247, 90, 46, 47, - 246, 187, 46, 47, 247, 58, 46, 47, 246, 250, 46, 47, 247, 121, 46, 47, - 246, 133, 46, 47, 247, 4, 46, 47, 246, 196, 46, 47, 247, 67, 46, 47, 246, - 164, 46, 47, 247, 35, 46, 47, 246, 227, 46, 47, 247, 98, 46, 47, 246, - 148, 46, 47, 247, 19, 46, 47, 246, 211, 46, 47, 247, 82, 46, 47, 246, - 179, 46, 47, 247, 50, 46, 47, 246, 242, 46, 47, 247, 113, 46, 47, 246, - 140, 46, 47, 247, 11, 46, 47, 246, 203, 46, 47, 247, 74, 46, 47, 246, - 171, 46, 47, 247, 42, 46, 47, 246, 234, 46, 47, 247, 105, 46, 47, 246, - 155, 46, 47, 247, 26, 46, 47, 246, 218, 46, 47, 247, 89, 46, 47, 246, - 186, 46, 47, 247, 57, 46, 47, 246, 249, 46, 47, 247, 120, 46, 47, 246, - 129, 46, 47, 247, 0, 46, 47, 246, 192, 46, 47, 247, 63, 46, 47, 246, 160, - 46, 47, 247, 31, 46, 47, 246, 223, 46, 47, 247, 94, 46, 47, 246, 144, 46, - 47, 247, 15, 46, 47, 246, 207, 46, 47, 247, 78, 46, 47, 246, 175, 46, 47, - 247, 46, 46, 47, 246, 238, 46, 47, 247, 109, 46, 47, 246, 136, 46, 47, - 247, 7, 46, 47, 246, 199, 46, 47, 247, 70, 46, 47, 246, 167, 46, 47, 247, - 38, 46, 47, 246, 230, 46, 47, 247, 101, 46, 47, 246, 151, 46, 47, 247, - 22, 46, 47, 246, 214, 46, 47, 247, 85, 46, 47, 246, 182, 46, 47, 247, 53, - 46, 47, 246, 245, 46, 47, 247, 116, 46, 47, 246, 132, 46, 47, 247, 3, 46, - 47, 246, 195, 46, 47, 247, 66, 46, 47, 246, 163, 46, 47, 247, 34, 46, 47, - 246, 226, 46, 47, 247, 97, 46, 47, 246, 147, 46, 47, 247, 18, 46, 47, - 246, 210, 46, 47, 247, 81, 46, 47, 246, 178, 46, 47, 247, 49, 46, 47, - 246, 241, 46, 47, 247, 112, 46, 47, 246, 139, 46, 47, 247, 10, 46, 47, - 246, 202, 46, 47, 247, 73, 46, 47, 246, 170, 46, 47, 247, 41, 46, 47, - 246, 233, 46, 47, 247, 104, 46, 47, 246, 154, 46, 47, 247, 25, 46, 47, - 246, 217, 46, 47, 247, 88, 46, 47, 246, 185, 46, 47, 247, 56, 46, 47, - 246, 248, 46, 47, 247, 119, 46, 47, 246, 127, 46, 47, 246, 254, 46, 47, - 246, 190, 46, 47, 247, 61, 46, 47, 246, 158, 46, 47, 247, 29, 46, 47, - 246, 221, 46, 47, 247, 92, 46, 47, 246, 142, 46, 47, 247, 13, 46, 47, - 246, 205, 46, 47, 247, 76, 46, 47, 246, 173, 46, 47, 247, 44, 46, 47, - 246, 236, 46, 47, 247, 107, 46, 47, 246, 134, 46, 47, 247, 5, 46, 47, - 246, 197, 46, 47, 247, 68, 46, 47, 246, 165, 46, 47, 247, 36, 46, 47, - 246, 228, 46, 47, 247, 99, 46, 47, 246, 149, 46, 47, 247, 20, 46, 47, - 246, 212, 46, 47, 247, 83, 46, 47, 246, 180, 46, 47, 247, 51, 46, 47, - 246, 243, 46, 47, 247, 114, 46, 47, 246, 130, 46, 47, 247, 1, 46, 47, - 246, 193, 46, 47, 247, 64, 46, 47, 246, 161, 46, 47, 247, 32, 46, 47, - 246, 224, 46, 47, 247, 95, 46, 47, 246, 145, 46, 47, 247, 16, 46, 47, - 246, 208, 46, 47, 247, 79, 46, 47, 246, 176, 46, 47, 247, 47, 46, 47, - 246, 239, 46, 47, 247, 110, 46, 47, 246, 137, 46, 47, 247, 8, 46, 47, - 246, 200, 46, 47, 247, 71, 46, 47, 246, 168, 46, 47, 247, 39, 46, 47, - 246, 231, 46, 47, 247, 102, 46, 47, 246, 152, 46, 47, 247, 23, 46, 47, - 246, 215, 46, 47, 247, 86, 46, 47, 246, 183, 46, 47, 247, 54, 46, 47, - 246, 246, 46, 47, 247, 117, 46, 47, 246, 128, 46, 47, 246, 255, 46, 47, - 246, 191, 46, 47, 247, 62, 46, 47, 246, 159, 46, 47, 247, 30, 46, 47, - 246, 222, 46, 47, 247, 93, 46, 47, 246, 143, 46, 47, 247, 14, 46, 47, - 246, 206, 46, 47, 247, 77, 46, 47, 246, 174, 46, 47, 247, 45, 46, 47, - 246, 237, 46, 47, 247, 108, 46, 47, 246, 135, 46, 47, 247, 6, 46, 47, - 246, 198, 46, 47, 247, 69, 46, 47, 246, 166, 46, 47, 247, 37, 46, 47, - 246, 229, 46, 47, 247, 100, 46, 47, 246, 150, 46, 47, 247, 21, 46, 47, - 246, 213, 46, 47, 247, 84, 46, 47, 246, 181, 46, 47, 247, 52, 46, 47, - 246, 244, 46, 47, 247, 115, 46, 47, 246, 131, 46, 47, 247, 2, 46, 47, - 246, 194, 46, 47, 247, 65, 46, 47, 246, 162, 46, 47, 247, 33, 46, 47, - 246, 225, 46, 47, 247, 96, 46, 47, 246, 146, 46, 47, 247, 17, 46, 47, - 246, 209, 46, 47, 247, 80, 46, 47, 246, 177, 46, 47, 247, 48, 46, 47, - 246, 240, 46, 47, 247, 111, 46, 47, 246, 138, 46, 47, 247, 9, 46, 47, - 246, 201, 46, 47, 247, 72, 46, 47, 246, 169, 46, 47, 247, 40, 46, 47, - 246, 232, 46, 47, 247, 103, 46, 47, 246, 153, 46, 47, 247, 24, 46, 47, - 246, 216, 46, 47, 247, 87, 46, 47, 246, 184, 46, 47, 247, 55, 46, 47, - 246, 247, 46, 47, 247, 118, 97, 215, 58, 80, 2, 67, 91, 97, 215, 58, 80, - 2, 52, 67, 91, 140, 52, 80, 2, 67, 91, 97, 52, 80, 2, 67, 91, 43, 44, 52, - 80, 2, 67, 91, 97, 215, 58, 80, 243, 251, 130, 140, 52, 80, 243, 251, - 130, 97, 52, 80, 243, 251, 130, 246, 112, 80, 2, 203, 91, 214, 153, 80, - 2, 203, 91, 214, 153, 215, 212, 75, 246, 112, 215, 212, 75, 140, 52, 248, - 165, 75, 97, 52, 248, 165, 75, 140, 215, 212, 248, 165, 75, 97, 215, 212, - 248, 165, 75, 97, 215, 58, 215, 212, 248, 165, 75, 97, 80, 2, 246, 126, - 218, 141, 214, 153, 80, 216, 43, 130, 246, 112, 80, 216, 43, 130, 97, 80, - 2, 217, 79, 2, 67, 91, 97, 80, 2, 217, 79, 2, 52, 67, 91, 97, 215, 58, - 80, 2, 217, 78, 97, 215, 58, 80, 2, 217, 79, 2, 67, 91, 97, 215, 58, 80, - 2, 217, 79, 2, 52, 67, 91, 140, 254, 3, 97, 254, 3, 140, 52, 254, 3, 97, - 52, 254, 3, 140, 80, 216, 43, 85, 248, 0, 97, 80, 216, 43, 85, 248, 0, - 140, 80, 243, 251, 252, 149, 216, 43, 85, 248, 0, 97, 80, 243, 251, 252, - 149, 216, 43, 85, 248, 0, 228, 61, 212, 9, 22, 219, 30, 245, 228, 75, - 228, 61, 245, 228, 22, 219, 30, 212, 9, 75, 228, 61, 212, 9, 80, 2, 103, - 228, 61, 245, 228, 80, 2, 103, 219, 30, 245, 228, 80, 2, 103, 219, 30, - 212, 9, 80, 2, 103, 228, 61, 212, 9, 80, 22, 228, 61, 245, 228, 75, 228, - 61, 245, 228, 80, 22, 219, 30, 245, 228, 75, 219, 30, 245, 228, 80, 22, - 219, 30, 212, 9, 75, 219, 30, 212, 9, 80, 22, 228, 61, 212, 9, 75, 222, - 231, 248, 7, 249, 133, 244, 183, 248, 6, 244, 183, 248, 7, 249, 133, 222, - 231, 248, 6, 219, 30, 245, 228, 80, 249, 133, 228, 61, 245, 228, 75, 228, - 61, 245, 228, 80, 249, 133, 219, 30, 245, 228, 75, 244, 183, 248, 7, 249, - 133, 228, 61, 245, 228, 75, 222, 231, 248, 7, 249, 133, 219, 30, 245, - 228, 75, 228, 61, 245, 228, 80, 249, 133, 228, 61, 212, 9, 75, 228, 61, - 212, 9, 80, 249, 133, 228, 61, 245, 228, 75, 212, 36, 80, 225, 10, 247, - 203, 222, 254, 80, 225, 10, 97, 216, 189, 249, 98, 214, 152, 80, 225, 10, - 97, 216, 189, 249, 98, 246, 111, 80, 225, 10, 246, 112, 216, 189, 249, - 98, 233, 43, 80, 225, 10, 246, 112, 216, 189, 249, 98, 222, 244, 222, - 247, 254, 34, 250, 10, 75, 233, 46, 254, 34, 254, 96, 75, 216, 15, 254, - 34, 254, 96, 75, 251, 183, 254, 34, 254, 96, 75, 216, 15, 254, 34, 250, - 10, 80, 2, 230, 186, 216, 15, 254, 34, 254, 96, 80, 2, 225, 25, 232, 114, - 44, 220, 154, 250, 10, 75, 232, 114, 43, 220, 154, 254, 96, 75, 254, 96, - 250, 8, 250, 44, 75, 250, 10, 250, 8, 250, 44, 75, 97, 80, 72, 219, 253, - 140, 75, 140, 80, 72, 219, 253, 97, 75, 219, 253, 97, 80, 72, 140, 75, - 97, 80, 2, 96, 51, 140, 80, 2, 96, 51, 97, 80, 216, 140, 211, 178, 43, - 44, 80, 216, 140, 4, 250, 43, 214, 153, 215, 58, 80, 243, 251, 4, 250, - 43, 43, 252, 147, 120, 44, 252, 147, 124, 242, 5, 43, 252, 147, 124, 44, - 252, 147, 120, 242, 5, 120, 252, 147, 44, 124, 252, 147, 43, 242, 5, 120, - 252, 147, 43, 124, 252, 147, 44, 242, 5, 43, 252, 147, 120, 44, 252, 147, - 120, 242, 5, 120, 252, 147, 44, 124, 252, 147, 44, 242, 5, 43, 252, 147, - 124, 44, 252, 147, 124, 242, 5, 120, 252, 147, 43, 124, 252, 147, 43, - 242, 5, 140, 242, 6, 2, 252, 147, 120, 216, 43, 130, 97, 242, 6, 2, 252, - 147, 120, 216, 43, 130, 214, 153, 242, 6, 2, 252, 147, 44, 216, 43, 130, - 246, 112, 242, 6, 2, 252, 147, 44, 216, 43, 130, 140, 242, 6, 2, 252, - 147, 124, 216, 43, 130, 97, 242, 6, 2, 252, 147, 124, 216, 43, 130, 214, - 153, 242, 6, 2, 252, 147, 43, 216, 43, 130, 246, 112, 242, 6, 2, 252, - 147, 43, 216, 43, 130, 140, 242, 6, 2, 252, 147, 120, 243, 251, 130, 97, - 242, 6, 2, 252, 147, 120, 243, 251, 130, 214, 153, 242, 6, 2, 252, 147, - 44, 243, 251, 130, 246, 112, 242, 6, 2, 252, 147, 44, 243, 251, 130, 140, - 242, 6, 2, 252, 147, 124, 243, 251, 130, 97, 242, 6, 2, 252, 147, 124, - 243, 251, 130, 214, 153, 242, 6, 2, 252, 147, 43, 243, 251, 130, 246, - 112, 242, 6, 2, 252, 147, 43, 243, 251, 130, 140, 242, 6, 2, 252, 147, - 120, 72, 140, 242, 6, 2, 252, 147, 246, 114, 214, 153, 242, 6, 2, 252, - 147, 43, 252, 38, 214, 153, 242, 6, 2, 252, 147, 222, 254, 97, 242, 6, 2, - 252, 147, 120, 72, 97, 242, 6, 2, 252, 147, 246, 114, 246, 112, 242, 6, - 2, 252, 147, 43, 252, 38, 246, 112, 242, 6, 2, 252, 147, 222, 254, 140, - 242, 6, 2, 252, 147, 120, 72, 97, 242, 6, 2, 252, 147, 214, 163, 140, - 242, 6, 2, 252, 147, 124, 72, 97, 242, 6, 2, 252, 147, 246, 114, 97, 242, - 6, 2, 252, 147, 120, 72, 140, 242, 6, 2, 252, 147, 214, 163, 97, 242, 6, - 2, 252, 147, 124, 72, 140, 242, 6, 2, 252, 147, 246, 114, 140, 242, 6, 2, - 252, 147, 120, 72, 200, 248, 164, 140, 242, 6, 2, 252, 147, 124, 252, 51, - 200, 248, 164, 97, 242, 6, 2, 252, 147, 120, 72, 200, 248, 164, 97, 242, - 6, 2, 252, 147, 124, 252, 51, 200, 248, 164, 214, 153, 242, 6, 2, 252, - 147, 43, 252, 38, 246, 112, 242, 6, 2, 252, 147, 222, 254, 246, 112, 242, - 6, 2, 252, 147, 43, 252, 38, 214, 153, 242, 6, 2, 252, 147, 222, 254, 44, - 52, 80, 2, 222, 185, 241, 242, 245, 106, 5, 72, 97, 75, 216, 90, 226, - 172, 72, 97, 75, 140, 80, 72, 216, 90, 226, 171, 97, 80, 72, 216, 90, - 226, 171, 97, 80, 72, 254, 156, 128, 112, 233, 21, 72, 140, 75, 140, 80, - 216, 140, 233, 20, 242, 137, 72, 97, 75, 218, 65, 72, 97, 75, 140, 80, - 216, 140, 218, 64, 218, 23, 72, 140, 75, 43, 244, 99, 217, 78, 44, 244, - 99, 217, 78, 120, 244, 99, 217, 78, 124, 244, 99, 217, 78, 215, 212, 67, - 252, 149, 248, 68, 210, 160, 189, 218, 244, 210, 160, 189, 215, 49, 249, - 234, 43, 71, 249, 107, 127, 44, 71, 249, 107, 127, 43, 71, 226, 7, 44, - 71, 226, 7, 210, 160, 189, 43, 236, 22, 127, 210, 160, 189, 44, 236, 22, - 127, 210, 160, 189, 43, 251, 250, 127, 210, 160, 189, 44, 251, 250, 127, - 43, 42, 251, 166, 2, 214, 183, 44, 42, 251, 166, 2, 214, 183, 43, 42, - 251, 166, 2, 216, 116, 236, 7, 216, 15, 249, 168, 44, 42, 251, 166, 2, - 216, 116, 236, 7, 251, 183, 249, 168, 43, 42, 251, 166, 2, 216, 116, 236, - 7, 251, 183, 249, 168, 44, 42, 251, 166, 2, 216, 116, 236, 7, 216, 15, - 249, 168, 43, 254, 118, 251, 166, 2, 247, 128, 44, 254, 118, 251, 166, 2, - 247, 128, 43, 254, 34, 233, 21, 127, 44, 254, 34, 242, 137, 127, 52, 43, - 254, 34, 242, 137, 127, 52, 44, 254, 34, 233, 21, 127, 43, 85, 216, 7, - 220, 55, 127, 44, 85, 216, 7, 220, 55, 127, 246, 126, 244, 143, 67, 210, - 35, 232, 219, 231, 93, 254, 118, 226, 174, 233, 52, 44, 254, 118, 214, - 12, 2, 218, 236, 231, 93, 44, 254, 118, 2, 247, 128, 254, 118, 2, 222, - 94, 235, 222, 255, 12, 254, 117, 219, 1, 254, 118, 226, 174, 233, 52, - 219, 1, 254, 118, 226, 174, 214, 163, 215, 94, 254, 117, 223, 52, 254, - 117, 254, 118, 2, 214, 183, 223, 52, 254, 118, 2, 214, 183, 226, 252, - 254, 118, 226, 174, 214, 163, 226, 252, 254, 118, 226, 174, 246, 114, - 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, 10, 120, - 22, 222, 254, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, - 225, 10, 120, 22, 233, 52, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, - 236, 7, 80, 225, 10, 124, 22, 222, 254, 231, 93, 254, 118, 2, 204, 254, - 13, 245, 148, 236, 7, 80, 225, 10, 124, 22, 233, 52, 231, 93, 254, 118, - 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, 10, 44, 22, 214, 163, 231, - 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, 10, 43, 22, - 214, 163, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, 7, 80, 225, - 10, 44, 22, 246, 114, 231, 93, 254, 118, 2, 204, 254, 13, 245, 148, 236, - 7, 80, 225, 10, 43, 22, 246, 114, 223, 52, 245, 160, 220, 129, 245, 160, - 220, 130, 2, 226, 127, 245, 160, 220, 130, 2, 4, 250, 44, 48, 245, 160, - 220, 130, 2, 44, 80, 48, 245, 160, 220, 130, 2, 43, 80, 48, 250, 44, 2, - 203, 130, 37, 67, 130, 37, 226, 11, 37, 223, 53, 219, 48, 37, 225, 174, - 250, 44, 247, 181, 251, 86, 203, 252, 149, 22, 216, 15, 163, 247, 181, - 251, 86, 67, 130, 250, 44, 2, 218, 25, 211, 178, 37, 254, 95, 247, 177, - 50, 120, 80, 216, 140, 250, 43, 37, 71, 251, 121, 37, 251, 121, 37, 233, - 20, 37, 242, 136, 250, 44, 2, 4, 250, 44, 216, 43, 216, 197, 222, 254, - 250, 44, 2, 113, 203, 218, 93, 216, 43, 216, 197, 222, 254, 92, 222, 231, - 248, 7, 219, 97, 92, 244, 183, 248, 7, 219, 97, 92, 253, 224, 92, 4, 250, - 43, 92, 218, 236, 113, 235, 71, 218, 234, 215, 227, 2, 59, 48, 215, 227, - 2, 214, 183, 222, 94, 236, 7, 215, 226, 215, 227, 2, 220, 136, 253, 215, - 251, 182, 44, 215, 227, 72, 43, 215, 226, 43, 215, 227, 252, 38, 67, 130, - 67, 252, 149, 252, 38, 44, 215, 226, 251, 173, 2, 43, 163, 251, 229, 251, - 173, 2, 44, 163, 251, 229, 85, 251, 172, 30, 2, 43, 163, 251, 229, 30, 2, - 44, 163, 251, 229, 71, 240, 243, 85, 240, 243, 43, 211, 244, 244, 143, - 44, 211, 244, 244, 143, 43, 52, 211, 244, 244, 143, 44, 52, 211, 244, - 244, 143, 235, 255, 235, 241, 216, 113, 115, 235, 241, 235, 242, 229, - 107, 2, 67, 130, 246, 120, 230, 92, 42, 2, 249, 189, 226, 131, 235, 253, - 253, 245, 219, 221, 224, 183, 245, 106, 5, 22, 219, 99, 226, 11, 245, - 106, 5, 22, 219, 99, 226, 12, 2, 216, 90, 48, 240, 111, 216, 43, 22, 219, - 99, 226, 11, 242, 190, 218, 157, 216, 186, 246, 113, 215, 227, 2, 43, - 163, 251, 229, 246, 113, 215, 227, 2, 44, 163, 251, 229, 85, 248, 1, 2, - 124, 75, 85, 232, 110, 71, 250, 44, 2, 124, 75, 85, 250, 44, 2, 124, 75, - 245, 93, 71, 218, 236, 245, 93, 85, 218, 236, 245, 93, 71, 248, 0, 245, - 93, 85, 248, 0, 245, 93, 71, 250, 43, 245, 93, 85, 250, 43, 222, 134, - 223, 53, 219, 49, 226, 171, 219, 49, 2, 226, 127, 223, 53, 219, 49, 2, - 203, 91, 252, 1, 219, 48, 252, 1, 223, 53, 219, 48, 52, 225, 25, 215, - 212, 225, 25, 233, 48, 249, 99, 254, 118, 127, 222, 250, 249, 99, 254, - 118, 127, 216, 79, 230, 184, 230, 29, 37, 59, 226, 171, 230, 29, 37, 96, - 226, 171, 230, 29, 37, 30, 226, 171, 230, 29, 214, 176, 226, 172, 2, 247, - 128, 230, 29, 214, 176, 226, 172, 2, 225, 25, 230, 29, 42, 235, 206, 226, - 171, 230, 29, 42, 214, 176, 226, 171, 113, 232, 152, 22, 226, 171, 113, - 232, 152, 177, 226, 171, 230, 29, 30, 226, 171, 230, 159, 113, 218, 44, - 218, 42, 2, 235, 218, 224, 27, 235, 219, 226, 171, 244, 107, 226, 3, 235, - 218, 235, 219, 2, 52, 91, 235, 219, 253, 181, 2, 219, 97, 250, 40, 243, - 233, 254, 96, 235, 216, 232, 220, 235, 217, 2, 223, 118, 225, 241, 254, - 10, 225, 4, 232, 220, 235, 217, 2, 220, 154, 225, 241, 254, 10, 225, 4, - 232, 220, 235, 217, 228, 57, 236, 1, 216, 197, 225, 4, 235, 219, 254, 10, - 116, 225, 14, 226, 171, 224, 21, 235, 219, 226, 171, 235, 219, 2, 140, - 80, 2, 103, 235, 219, 2, 30, 50, 235, 219, 2, 235, 205, 235, 219, 2, 214, - 175, 235, 219, 2, 226, 127, 235, 219, 2, 214, 183, 235, 72, 233, 91, 43, - 215, 227, 226, 171, 210, 160, 189, 221, 203, 249, 217, 210, 160, 189, - 221, 203, 225, 59, 210, 160, 189, 221, 203, 224, 179, 96, 5, 2, 4, 250, - 44, 48, 96, 5, 2, 250, 39, 255, 24, 48, 96, 5, 2, 216, 90, 48, 96, 5, 2, - 59, 51, 96, 5, 2, 216, 90, 51, 96, 5, 2, 218, 66, 105, 96, 5, 2, 85, 215, - 226, 230, 187, 5, 2, 249, 228, 48, 230, 187, 5, 2, 59, 51, 230, 187, 5, - 2, 244, 183, 247, 126, 230, 187, 5, 2, 222, 231, 247, 126, 96, 5, 236, 7, - 43, 163, 250, 43, 96, 5, 236, 7, 44, 163, 250, 43, 213, 254, 177, 249, - 139, 224, 183, 230, 89, 5, 2, 59, 48, 230, 89, 5, 2, 214, 183, 220, 151, - 224, 184, 2, 251, 183, 250, 7, 219, 79, 224, 183, 230, 89, 5, 236, 7, 43, - 163, 250, 43, 230, 89, 5, 236, 7, 44, 163, 250, 43, 37, 230, 89, 5, 2, - 250, 39, 255, 23, 230, 89, 5, 236, 7, 52, 250, 43, 37, 247, 177, 50, 96, - 5, 236, 7, 215, 226, 230, 187, 5, 236, 7, 215, 226, 230, 89, 5, 236, 7, - 215, 226, 235, 213, 224, 183, 222, 245, 235, 213, 224, 183, 210, 160, - 189, 223, 93, 249, 217, 254, 142, 177, 249, 173, 235, 206, 2, 247, 128, - 214, 176, 2, 230, 187, 50, 214, 176, 2, 226, 127, 235, 206, 2, 226, 127, - 235, 206, 2, 232, 152, 254, 126, 214, 176, 2, 232, 152, 226, 162, 214, - 176, 72, 235, 205, 235, 206, 72, 214, 175, 214, 176, 72, 252, 149, 72, - 235, 205, 235, 206, 72, 252, 149, 72, 214, 175, 214, 176, 252, 38, 22, - 235, 71, 2, 214, 175, 235, 206, 252, 38, 22, 235, 71, 2, 235, 205, 250, - 8, 214, 176, 2, 220, 135, 250, 8, 235, 206, 2, 220, 135, 52, 42, 235, - 205, 52, 42, 214, 175, 250, 8, 214, 176, 2, 220, 136, 22, 219, 79, 224, - 183, 232, 152, 22, 2, 59, 48, 232, 152, 177, 2, 59, 48, 52, 232, 152, - 254, 126, 52, 232, 152, 226, 162, 113, 235, 207, 232, 152, 254, 126, 113, - 235, 207, 232, 152, 226, 162, 219, 87, 233, 91, 226, 162, 219, 87, 233, - 91, 254, 126, 232, 152, 177, 226, 125, 232, 152, 254, 126, 232, 152, 22, - 2, 230, 229, 218, 141, 232, 152, 177, 2, 230, 229, 218, 141, 232, 152, - 22, 2, 203, 248, 164, 232, 152, 177, 2, 203, 248, 164, 232, 152, 22, 2, - 52, 226, 127, 232, 152, 22, 2, 214, 183, 232, 152, 22, 2, 52, 214, 183, - 4, 213, 251, 2, 214, 183, 232, 152, 177, 2, 52, 226, 127, 232, 152, 177, - 2, 52, 214, 183, 210, 160, 189, 247, 137, 254, 87, 210, 160, 189, 223, - 151, 254, 87, 245, 106, 5, 2, 59, 51, 240, 111, 2, 59, 48, 215, 212, 203, - 252, 149, 2, 52, 67, 91, 215, 212, 203, 252, 149, 2, 215, 212, 67, 91, - 216, 90, 226, 172, 2, 59, 48, 216, 90, 226, 172, 2, 222, 231, 247, 126, - 219, 164, 230, 187, 219, 163, 249, 207, 2, 59, 48, 245, 106, 2, 253, 224, - 254, 156, 128, 216, 43, 2, 250, 39, 255, 23, 254, 56, 128, 177, 128, 112, - 245, 106, 5, 72, 96, 50, 96, 5, 72, 245, 106, 50, 245, 106, 5, 72, 216, - 90, 226, 171, 52, 249, 235, 245, 107, 113, 249, 202, 245, 106, 219, 178, - 134, 249, 202, 245, 106, 219, 178, 245, 106, 5, 2, 113, 170, 72, 22, 113, - 170, 51, 245, 102, 2, 244, 19, 170, 48, 233, 21, 2, 250, 44, 235, 222, - 242, 137, 2, 250, 44, 235, 222, 233, 21, 2, 224, 16, 164, 48, 242, 137, - 2, 224, 16, 164, 48, 233, 21, 177, 219, 99, 128, 112, 242, 137, 177, 219, - 99, 128, 112, 233, 21, 177, 219, 99, 128, 216, 43, 2, 59, 235, 222, 242, - 137, 177, 219, 99, 128, 216, 43, 2, 59, 235, 222, 233, 21, 177, 219, 99, - 128, 216, 43, 2, 59, 48, 242, 137, 177, 219, 99, 128, 216, 43, 2, 59, 48, - 233, 21, 177, 219, 99, 128, 216, 43, 2, 59, 72, 222, 254, 242, 137, 177, - 219, 99, 128, 216, 43, 2, 59, 72, 233, 52, 233, 21, 177, 254, 57, 242, - 137, 177, 254, 57, 233, 21, 22, 219, 155, 228, 57, 128, 112, 242, 137, - 22, 219, 155, 228, 57, 128, 112, 233, 21, 22, 228, 57, 254, 57, 242, 137, - 22, 228, 57, 254, 57, 233, 21, 72, 246, 119, 128, 72, 242, 136, 242, 137, - 72, 246, 119, 128, 72, 233, 20, 233, 21, 72, 219, 164, 177, 245, 107, - 242, 137, 72, 219, 164, 177, 245, 107, 233, 21, 72, 219, 164, 72, 242, - 136, 242, 137, 72, 219, 164, 72, 233, 20, 233, 21, 72, 242, 137, 72, 246, - 119, 245, 107, 242, 137, 72, 233, 21, 72, 246, 119, 245, 107, 233, 21, - 72, 219, 99, 128, 72, 242, 137, 72, 219, 99, 245, 107, 242, 137, 72, 219, - 99, 128, 72, 233, 21, 72, 219, 99, 245, 107, 219, 99, 128, 216, 43, 177, - 233, 20, 219, 99, 128, 216, 43, 177, 242, 136, 219, 99, 128, 216, 43, - 177, 233, 21, 2, 59, 235, 222, 219, 99, 128, 216, 43, 177, 242, 137, 2, - 59, 235, 222, 246, 119, 128, 216, 43, 177, 233, 20, 246, 119, 128, 216, - 43, 177, 242, 136, 246, 119, 219, 99, 128, 216, 43, 177, 233, 20, 246, - 119, 219, 99, 128, 216, 43, 177, 242, 136, 219, 164, 177, 233, 20, 219, - 164, 177, 242, 136, 219, 164, 72, 233, 21, 72, 245, 106, 50, 219, 164, - 72, 242, 137, 72, 245, 106, 50, 52, 229, 96, 233, 20, 52, 229, 96, 242, - 136, 52, 229, 96, 233, 21, 2, 214, 183, 242, 137, 226, 125, 233, 20, 242, - 137, 252, 38, 233, 20, 233, 21, 250, 8, 251, 86, 249, 100, 242, 137, 250, - 8, 251, 86, 249, 100, 233, 21, 250, 8, 251, 86, 249, 101, 72, 219, 99, - 245, 107, 242, 137, 250, 8, 251, 86, 249, 101, 72, 219, 99, 245, 107, - 219, 80, 216, 201, 233, 89, 216, 201, 219, 80, 216, 202, 177, 128, 112, - 233, 89, 216, 202, 177, 128, 112, 245, 106, 5, 2, 251, 116, 48, 224, 206, - 72, 219, 155, 245, 106, 50, 218, 57, 72, 219, 155, 245, 106, 50, 224, - 206, 72, 219, 155, 228, 57, 128, 112, 218, 57, 72, 219, 155, 228, 57, - 128, 112, 224, 206, 72, 245, 106, 50, 218, 57, 72, 245, 106, 50, 224, - 206, 72, 228, 57, 128, 112, 218, 57, 72, 228, 57, 128, 112, 224, 206, 72, - 254, 156, 128, 112, 218, 57, 72, 254, 156, 128, 112, 224, 206, 72, 228, - 57, 254, 156, 128, 112, 218, 57, 72, 228, 57, 254, 156, 128, 112, 52, - 224, 205, 52, 218, 56, 218, 65, 2, 247, 128, 218, 23, 2, 247, 128, 218, - 65, 2, 96, 5, 51, 218, 23, 2, 96, 5, 51, 218, 65, 2, 230, 89, 5, 51, 218, - 23, 2, 230, 89, 5, 51, 218, 65, 64, 177, 128, 216, 43, 2, 59, 48, 218, - 23, 64, 177, 128, 216, 43, 2, 59, 48, 218, 65, 64, 72, 245, 106, 50, 218, - 23, 64, 72, 245, 106, 50, 218, 65, 64, 72, 216, 90, 226, 171, 218, 23, - 64, 72, 216, 90, 226, 171, 218, 65, 64, 72, 254, 156, 128, 112, 218, 23, - 64, 72, 254, 156, 128, 112, 218, 65, 64, 72, 228, 57, 128, 112, 218, 23, - 64, 72, 228, 57, 128, 112, 42, 43, 204, 93, 226, 171, 42, 44, 204, 93, - 226, 171, 250, 8, 218, 64, 250, 8, 218, 22, 250, 8, 218, 65, 177, 128, - 112, 250, 8, 218, 23, 177, 128, 112, 218, 65, 72, 218, 22, 218, 23, 72, - 218, 64, 218, 65, 72, 218, 64, 218, 23, 72, 218, 22, 218, 23, 252, 38, - 218, 64, 218, 23, 252, 38, 22, 235, 71, 251, 86, 248, 165, 2, 218, 64, - 245, 178, 64, 226, 174, 246, 111, 225, 51, 2, 217, 13, 216, 14, 215, 241, - 235, 205, 244, 29, 228, 70, 219, 253, 43, 217, 88, 219, 253, 124, 217, - 88, 219, 253, 120, 217, 88, 225, 175, 2, 222, 93, 67, 252, 149, 215, 212, - 44, 215, 93, 52, 67, 252, 149, 43, 215, 93, 67, 252, 149, 52, 43, 215, - 93, 52, 67, 252, 149, 52, 43, 215, 93, 200, 248, 165, 243, 251, 43, 231, - 68, 64, 52, 213, 239, 219, 253, 124, 217, 89, 2, 226, 127, 219, 253, 120, - 217, 89, 2, 214, 183, 219, 253, 120, 217, 89, 72, 219, 253, 124, 217, 88, - 52, 124, 217, 88, 52, 120, 217, 88, 52, 218, 105, 228, 57, 50, 223, 52, - 52, 218, 105, 228, 57, 50, 247, 146, 228, 57, 247, 183, 2, 223, 52, 229, - 106, 219, 97, 67, 232, 220, 2, 250, 44, 48, 67, 232, 220, 2, 250, 44, 51, - 124, 217, 89, 2, 250, 44, 51, 226, 12, 2, 203, 91, 226, 12, 2, 216, 90, - 226, 171, 215, 212, 67, 252, 149, 251, 252, 223, 94, 215, 212, 67, 252, - 149, 2, 203, 91, 215, 212, 249, 235, 226, 171, 215, 212, 229, 96, 233, - 20, 215, 212, 229, 96, 242, 136, 246, 119, 219, 99, 233, 21, 177, 128, - 112, 246, 119, 219, 99, 242, 137, 177, 128, 112, 215, 212, 219, 49, 251, - 252, 223, 94, 233, 91, 215, 212, 67, 252, 149, 226, 171, 52, 219, 49, - 226, 171, 71, 67, 130, 230, 29, 71, 67, 130, 228, 61, 245, 228, 71, 75, - 228, 61, 212, 9, 71, 75, 219, 30, 245, 228, 71, 75, 219, 30, 212, 9, 71, - 75, 43, 44, 71, 75, 140, 85, 75, 214, 153, 85, 75, 246, 112, 85, 75, 228, - 61, 245, 228, 85, 75, 228, 61, 212, 9, 85, 75, 219, 30, 245, 228, 85, 75, - 219, 30, 212, 9, 85, 75, 43, 44, 85, 75, 120, 124, 85, 75, 97, 80, 2, - 216, 78, 246, 111, 97, 80, 2, 216, 78, 214, 152, 140, 80, 2, 216, 78, - 246, 111, 140, 80, 2, 216, 78, 214, 152, 42, 2, 216, 15, 163, 251, 229, - 42, 2, 251, 183, 163, 251, 229, 42, 2, 214, 160, 44, 248, 7, 163, 251, - 229, 42, 2, 232, 114, 43, 248, 7, 163, 251, 229, 248, 1, 2, 43, 163, 251, - 229, 248, 1, 2, 44, 163, 251, 229, 248, 1, 2, 216, 15, 163, 251, 229, - 248, 1, 2, 251, 183, 163, 251, 229, 246, 126, 218, 236, 85, 233, 91, 218, - 236, 71, 233, 91, 218, 236, 85, 213, 187, 4, 218, 236, 71, 213, 187, 4, - 218, 236, 85, 225, 193, 71, 225, 193, 71, 241, 200, 85, 241, 200, 203, - 85, 241, 200, 85, 233, 91, 250, 43, 85, 231, 87, 248, 0, 71, 231, 87, - 248, 0, 85, 231, 87, 232, 110, 71, 231, 87, 232, 110, 85, 4, 248, 0, 85, - 4, 232, 110, 71, 4, 232, 110, 85, 203, 245, 172, 71, 203, 245, 172, 85, - 67, 245, 172, 71, 67, 245, 172, 43, 80, 2, 4, 250, 43, 134, 140, 253, - 255, 43, 80, 2, 37, 225, 25, 200, 140, 218, 232, 75, 140, 215, 58, 80, 2, - 67, 91, 140, 215, 58, 80, 2, 52, 67, 91, 140, 215, 58, 80, 243, 251, 130, - 140, 215, 58, 215, 212, 248, 165, 75, 140, 80, 2, 246, 126, 218, 141, - 140, 80, 2, 217, 79, 2, 67, 91, 140, 80, 2, 217, 79, 2, 52, 67, 91, 140, - 215, 58, 80, 2, 217, 78, 140, 215, 58, 80, 2, 217, 79, 2, 67, 91, 140, - 215, 58, 80, 2, 217, 79, 2, 52, 67, 91, 140, 80, 216, 140, 211, 178, 212, - 36, 80, 225, 10, 247, 203, 233, 52, 245, 106, 5, 72, 140, 75, 223, 53, - 216, 90, 226, 172, 72, 140, 75, 140, 80, 72, 223, 53, 254, 156, 128, 112, - 97, 80, 216, 140, 242, 136, 97, 80, 216, 140, 218, 22, 140, 224, 27, 75, - 97, 224, 27, 75, 223, 53, 216, 90, 226, 172, 72, 97, 75, 97, 80, 72, 223, - 53, 254, 156, 128, 112, 216, 90, 226, 172, 72, 140, 75, 140, 80, 72, 254, - 156, 128, 112, 140, 80, 72, 223, 53, 216, 90, 226, 171, 97, 80, 72, 223, - 53, 216, 90, 226, 171, 71, 231, 87, 218, 158, 85, 4, 218, 158, 71, 4, - 218, 158, 85, 222, 250, 225, 193, 71, 222, 250, 225, 193, 114, 233, 91, - 250, 43, 114, 226, 128, 2, 226, 128, 235, 222, 114, 250, 44, 2, 250, 44, - 235, 222, 114, 250, 43, 114, 37, 222, 0, 145, 6, 1, 253, 167, 145, 6, 1, - 251, 125, 145, 6, 1, 213, 253, 145, 6, 1, 242, 192, 145, 6, 1, 247, 148, - 145, 6, 1, 211, 21, 145, 6, 1, 210, 68, 145, 6, 1, 246, 42, 145, 6, 1, - 210, 91, 145, 6, 1, 235, 154, 145, 6, 1, 65, 235, 154, 145, 6, 1, 74, - 145, 6, 1, 247, 168, 145, 6, 1, 234, 246, 145, 6, 1, 232, 192, 145, 6, 1, - 230, 34, 145, 6, 1, 229, 196, 145, 6, 1, 226, 189, 145, 6, 1, 225, 7, - 145, 6, 1, 222, 230, 145, 6, 1, 219, 85, 145, 6, 1, 215, 81, 145, 6, 1, - 214, 201, 145, 6, 1, 243, 254, 145, 6, 1, 241, 206, 145, 6, 1, 226, 139, - 145, 6, 1, 225, 224, 145, 6, 1, 219, 230, 145, 6, 1, 215, 168, 145, 6, 1, - 250, 83, 145, 6, 1, 220, 104, 145, 6, 1, 211, 27, 145, 6, 1, 211, 29, - 145, 6, 1, 211, 57, 145, 6, 1, 218, 255, 162, 145, 6, 1, 210, 212, 145, - 6, 1, 4, 210, 183, 145, 6, 1, 4, 210, 184, 2, 217, 78, 145, 6, 1, 210, - 244, 145, 6, 1, 235, 191, 4, 210, 183, 145, 6, 1, 252, 1, 210, 183, 145, - 6, 1, 235, 191, 252, 1, 210, 183, 145, 6, 1, 244, 90, 145, 6, 1, 235, - 152, 145, 6, 1, 219, 229, 145, 6, 1, 215, 203, 61, 145, 6, 1, 233, 81, - 230, 34, 145, 4, 1, 253, 167, 145, 4, 1, 251, 125, 145, 4, 1, 213, 253, - 145, 4, 1, 242, 192, 145, 4, 1, 247, 148, 145, 4, 1, 211, 21, 145, 4, 1, - 210, 68, 145, 4, 1, 246, 42, 145, 4, 1, 210, 91, 145, 4, 1, 235, 154, - 145, 4, 1, 65, 235, 154, 145, 4, 1, 74, 145, 4, 1, 247, 168, 145, 4, 1, - 234, 246, 145, 4, 1, 232, 192, 145, 4, 1, 230, 34, 145, 4, 1, 229, 196, - 145, 4, 1, 226, 189, 145, 4, 1, 225, 7, 145, 4, 1, 222, 230, 145, 4, 1, - 219, 85, 145, 4, 1, 215, 81, 145, 4, 1, 214, 201, 145, 4, 1, 243, 254, - 145, 4, 1, 241, 206, 145, 4, 1, 226, 139, 145, 4, 1, 225, 224, 145, 4, 1, - 219, 230, 145, 4, 1, 215, 168, 145, 4, 1, 250, 83, 145, 4, 1, 220, 104, - 145, 4, 1, 211, 27, 145, 4, 1, 211, 29, 145, 4, 1, 211, 57, 145, 4, 1, - 218, 255, 162, 145, 4, 1, 210, 212, 145, 4, 1, 4, 210, 183, 145, 4, 1, 4, - 210, 184, 2, 217, 78, 145, 4, 1, 210, 244, 145, 4, 1, 235, 191, 4, 210, - 183, 145, 4, 1, 252, 1, 210, 183, 145, 4, 1, 235, 191, 252, 1, 210, 183, - 145, 4, 1, 244, 90, 145, 4, 1, 235, 152, 145, 4, 1, 219, 229, 145, 4, 1, - 215, 203, 61, 145, 4, 1, 233, 81, 230, 34, 7, 6, 1, 233, 155, 2, 52, 130, - 7, 4, 1, 233, 155, 2, 52, 130, 7, 6, 1, 233, 155, 2, 230, 229, 184, 7, 6, - 1, 226, 110, 2, 91, 7, 6, 1, 223, 227, 2, 217, 78, 7, 4, 1, 116, 2, 91, - 7, 4, 1, 217, 154, 2, 248, 7, 91, 7, 6, 1, 242, 68, 2, 248, 47, 7, 4, 1, - 242, 68, 2, 248, 47, 7, 6, 1, 235, 30, 2, 248, 47, 7, 4, 1, 235, 30, 2, - 248, 47, 7, 6, 1, 210, 160, 2, 248, 47, 7, 4, 1, 210, 160, 2, 248, 47, 7, - 6, 1, 254, 151, 7, 6, 1, 232, 55, 2, 103, 7, 6, 1, 215, 94, 61, 7, 6, 1, - 215, 94, 254, 151, 7, 4, 1, 214, 106, 2, 44, 103, 7, 6, 1, 212, 99, 2, - 103, 7, 4, 1, 212, 99, 2, 103, 7, 4, 1, 214, 106, 2, 249, 108, 7, 6, 1, - 163, 242, 67, 7, 4, 1, 163, 242, 67, 7, 4, 1, 217, 76, 225, 136, 7, 4, 1, - 160, 2, 228, 55, 7, 4, 1, 215, 94, 223, 227, 2, 217, 78, 7, 4, 1, 144, 2, - 121, 222, 237, 235, 222, 7, 1, 4, 6, 215, 94, 76, 7, 218, 66, 4, 1, 235, - 150, 58, 1, 6, 214, 105, 7, 6, 1, 222, 94, 2, 217, 251, 217, 78, 7, 6, 1, - 210, 160, 2, 217, 251, 217, 78, 81, 6, 1, 254, 173, 81, 4, 1, 254, 173, - 81, 6, 1, 213, 173, 81, 4, 1, 213, 173, 81, 6, 1, 243, 114, 81, 4, 1, - 243, 114, 81, 6, 1, 248, 199, 81, 4, 1, 248, 199, 81, 6, 1, 245, 202, 81, - 4, 1, 245, 202, 81, 6, 1, 219, 35, 81, 4, 1, 219, 35, 81, 6, 1, 210, 101, - 81, 4, 1, 210, 101, 81, 6, 1, 241, 255, 81, 4, 1, 241, 255, 81, 6, 1, - 216, 178, 81, 4, 1, 216, 178, 81, 6, 1, 240, 123, 81, 4, 1, 240, 123, 81, - 6, 1, 234, 233, 81, 4, 1, 234, 233, 81, 6, 1, 233, 78, 81, 4, 1, 233, 78, - 81, 6, 1, 230, 235, 81, 4, 1, 230, 235, 81, 6, 1, 228, 238, 81, 4, 1, - 228, 238, 81, 6, 1, 233, 239, 81, 4, 1, 233, 239, 81, 6, 1, 78, 81, 4, 1, - 78, 81, 6, 1, 225, 111, 81, 4, 1, 225, 111, 81, 6, 1, 222, 213, 81, 4, 1, - 222, 213, 81, 6, 1, 219, 167, 81, 4, 1, 219, 167, 81, 6, 1, 217, 42, 81, - 4, 1, 217, 42, 81, 6, 1, 214, 229, 81, 4, 1, 214, 229, 81, 6, 1, 244, - 129, 81, 4, 1, 244, 129, 81, 6, 1, 234, 118, 81, 4, 1, 234, 118, 81, 6, - 1, 224, 164, 81, 4, 1, 224, 164, 81, 6, 1, 226, 182, 81, 4, 1, 226, 182, - 81, 6, 1, 248, 5, 254, 179, 81, 4, 1, 248, 5, 254, 179, 81, 6, 1, 55, 81, - 254, 205, 81, 4, 1, 55, 81, 254, 205, 81, 6, 1, 249, 123, 245, 202, 81, - 4, 1, 249, 123, 245, 202, 81, 6, 1, 248, 5, 234, 233, 81, 4, 1, 248, 5, - 234, 233, 81, 6, 1, 248, 5, 228, 238, 81, 4, 1, 248, 5, 228, 238, 81, 6, - 1, 249, 123, 228, 238, 81, 4, 1, 249, 123, 228, 238, 81, 6, 1, 55, 81, - 226, 182, 81, 4, 1, 55, 81, 226, 182, 81, 6, 1, 221, 248, 81, 4, 1, 221, - 248, 81, 6, 1, 249, 136, 220, 57, 81, 4, 1, 249, 136, 220, 57, 81, 6, 1, - 55, 81, 220, 57, 81, 4, 1, 55, 81, 220, 57, 81, 6, 1, 55, 81, 245, 83, - 81, 4, 1, 55, 81, 245, 83, 81, 6, 1, 254, 191, 234, 123, 81, 4, 1, 254, - 191, 234, 123, 81, 6, 1, 248, 5, 241, 52, 81, 4, 1, 248, 5, 241, 52, 81, - 6, 1, 55, 81, 241, 52, 81, 4, 1, 55, 81, 241, 52, 81, 6, 1, 55, 81, 162, - 81, 4, 1, 55, 81, 162, 81, 6, 1, 233, 154, 162, 81, 4, 1, 233, 154, 162, - 81, 6, 1, 55, 81, 241, 224, 81, 4, 1, 55, 81, 241, 224, 81, 6, 1, 55, 81, - 242, 2, 81, 4, 1, 55, 81, 242, 2, 81, 6, 1, 55, 81, 243, 109, 81, 4, 1, - 55, 81, 243, 109, 81, 6, 1, 55, 81, 247, 171, 81, 4, 1, 55, 81, 247, 171, - 81, 6, 1, 55, 81, 220, 24, 81, 4, 1, 55, 81, 220, 24, 81, 6, 1, 55, 227, - 212, 220, 24, 81, 4, 1, 55, 227, 212, 220, 24, 81, 6, 1, 55, 227, 212, - 229, 32, 81, 4, 1, 55, 227, 212, 229, 32, 81, 6, 1, 55, 227, 212, 227, - 152, 81, 4, 1, 55, 227, 212, 227, 152, 81, 6, 1, 55, 227, 212, 212, 37, - 81, 4, 1, 55, 227, 212, 212, 37, 81, 16, 234, 252, 81, 16, 230, 236, 222, - 213, 81, 16, 225, 112, 222, 213, 81, 16, 218, 149, 81, 16, 217, 43, 222, - 213, 81, 16, 234, 119, 222, 213, 81, 16, 220, 25, 219, 167, 81, 6, 1, - 249, 123, 220, 57, 81, 4, 1, 249, 123, 220, 57, 81, 6, 1, 249, 123, 243, - 109, 81, 4, 1, 249, 123, 243, 109, 81, 38, 228, 239, 48, 81, 38, 218, - 249, 253, 232, 81, 38, 218, 249, 233, 27, 81, 6, 1, 251, 207, 234, 123, - 81, 4, 1, 251, 207, 234, 123, 81, 55, 227, 212, 243, 236, 218, 131, 81, - 55, 227, 212, 247, 205, 224, 16, 79, 81, 55, 227, 212, 235, 244, 224, 16, - 79, 81, 55, 227, 212, 213, 241, 247, 180, 81, 244, 10, 123, 242, 34, 81, - 243, 236, 218, 131, 81, 230, 129, 247, 180, 98, 4, 1, 254, 131, 98, 4, 1, - 252, 160, 98, 4, 1, 243, 113, 98, 4, 1, 247, 136, 98, 4, 1, 245, 158, 98, - 4, 1, 213, 160, 98, 4, 1, 210, 89, 98, 4, 1, 217, 61, 98, 4, 1, 236, 6, - 98, 4, 1, 234, 240, 98, 4, 1, 233, 87, 98, 4, 1, 231, 190, 98, 4, 1, 229, - 200, 98, 4, 1, 226, 200, 98, 4, 1, 226, 21, 98, 4, 1, 210, 78, 98, 4, 1, - 223, 174, 98, 4, 1, 221, 245, 98, 4, 1, 217, 51, 98, 4, 1, 214, 190, 98, - 4, 1, 225, 143, 98, 4, 1, 234, 127, 98, 4, 1, 242, 248, 98, 4, 1, 224, - 76, 98, 4, 1, 220, 22, 98, 4, 1, 250, 105, 98, 4, 1, 251, 15, 98, 4, 1, - 235, 106, 98, 4, 1, 250, 48, 98, 4, 1, 250, 151, 98, 4, 1, 211, 163, 98, - 4, 1, 235, 117, 98, 4, 1, 242, 50, 98, 4, 1, 241, 245, 98, 4, 1, 241, - 182, 98, 4, 1, 212, 22, 98, 4, 1, 242, 11, 98, 4, 1, 241, 72, 98, 4, 1, - 210, 246, 98, 4, 1, 254, 241, 216, 109, 1, 192, 216, 109, 1, 211, 99, - 216, 109, 1, 211, 98, 216, 109, 1, 211, 88, 216, 109, 1, 211, 86, 216, - 109, 1, 252, 40, 255, 25, 211, 81, 216, 109, 1, 211, 81, 216, 109, 1, - 211, 96, 216, 109, 1, 211, 93, 216, 109, 1, 211, 95, 216, 109, 1, 211, - 94, 216, 109, 1, 211, 12, 216, 109, 1, 211, 90, 216, 109, 1, 211, 79, - 216, 109, 1, 215, 116, 211, 79, 216, 109, 1, 211, 76, 216, 109, 1, 211, - 84, 216, 109, 1, 252, 40, 255, 25, 211, 84, 216, 109, 1, 215, 116, 211, - 84, 216, 109, 1, 211, 83, 216, 109, 1, 211, 103, 216, 109, 1, 211, 77, - 216, 109, 1, 215, 116, 211, 77, 216, 109, 1, 211, 66, 216, 109, 1, 215, - 116, 211, 66, 216, 109, 1, 211, 8, 216, 109, 1, 211, 49, 216, 109, 1, - 254, 216, 211, 49, 216, 109, 1, 215, 116, 211, 49, 216, 109, 1, 211, 75, - 216, 109, 1, 211, 74, 216, 109, 1, 211, 71, 216, 109, 1, 215, 116, 211, - 85, 216, 109, 1, 215, 116, 211, 69, 216, 109, 1, 211, 67, 216, 109, 1, - 210, 212, 216, 109, 1, 211, 64, 216, 109, 1, 211, 63, 216, 109, 1, 211, - 87, 216, 109, 1, 215, 116, 211, 87, 216, 109, 1, 253, 171, 211, 87, 216, - 109, 1, 211, 62, 216, 109, 1, 211, 60, 216, 109, 1, 211, 61, 216, 109, 1, - 211, 59, 216, 109, 1, 211, 58, 216, 109, 1, 211, 97, 216, 109, 1, 211, - 56, 216, 109, 1, 211, 54, 216, 109, 1, 211, 53, 216, 109, 1, 211, 52, - 216, 109, 1, 211, 50, 216, 109, 1, 217, 35, 211, 50, 216, 109, 1, 211, - 48, 216, 109, 1, 211, 47, 216, 109, 1, 210, 244, 216, 109, 58, 1, 233, - 132, 79, 216, 109, 220, 140, 79, 216, 109, 117, 235, 69, 29, 3, 232, 161, - 29, 3, 230, 165, 29, 3, 222, 211, 29, 3, 219, 59, 29, 3, 220, 8, 29, 3, - 251, 212, 29, 3, 216, 42, 29, 3, 249, 245, 29, 3, 228, 77, 29, 3, 227, - 137, 29, 3, 242, 187, 227, 4, 29, 3, 210, 22, 29, 3, 247, 151, 29, 3, - 248, 112, 29, 3, 235, 73, 29, 3, 216, 156, 29, 3, 250, 93, 29, 3, 225, - 123, 29, 3, 225, 18, 29, 3, 243, 6, 29, 3, 243, 2, 29, 3, 243, 3, 29, 3, - 243, 4, 29, 3, 218, 225, 29, 3, 218, 181, 29, 3, 218, 194, 29, 3, 218, - 224, 29, 3, 218, 198, 29, 3, 218, 199, 29, 3, 218, 186, 29, 3, 250, 221, - 29, 3, 250, 200, 29, 3, 250, 202, 29, 3, 250, 220, 29, 3, 250, 218, 29, - 3, 250, 219, 29, 3, 250, 201, 29, 3, 209, 243, 29, 3, 209, 221, 29, 3, - 209, 234, 29, 3, 209, 242, 29, 3, 209, 237, 29, 3, 209, 238, 29, 3, 209, - 226, 29, 3, 250, 216, 29, 3, 250, 203, 29, 3, 250, 205, 29, 3, 250, 215, - 29, 3, 250, 213, 29, 3, 250, 214, 29, 3, 250, 204, 29, 3, 223, 239, 29, - 3, 223, 229, 29, 3, 223, 235, 29, 3, 223, 238, 29, 3, 223, 236, 29, 3, - 223, 237, 29, 3, 223, 234, 29, 3, 233, 165, 29, 3, 233, 157, 29, 3, 233, - 160, 29, 3, 233, 164, 29, 3, 233, 161, 29, 3, 233, 162, 29, 3, 233, 158, - 29, 3, 211, 130, 29, 3, 211, 120, 29, 3, 211, 126, 29, 3, 211, 129, 29, - 3, 211, 127, 29, 3, 211, 128, 29, 3, 211, 125, 29, 3, 242, 78, 29, 3, - 242, 69, 29, 3, 242, 72, 29, 3, 242, 77, 29, 3, 242, 74, 29, 3, 242, 75, - 29, 3, 242, 71, 38, 33, 1, 252, 83, 38, 33, 1, 213, 255, 38, 33, 1, 242, - 243, 38, 33, 1, 248, 98, 38, 33, 1, 210, 74, 38, 33, 1, 210, 94, 38, 33, - 1, 176, 38, 33, 1, 245, 182, 38, 33, 1, 245, 167, 38, 33, 1, 245, 158, - 38, 33, 1, 78, 38, 33, 1, 225, 224, 38, 33, 1, 245, 100, 38, 33, 1, 245, - 90, 38, 33, 1, 217, 23, 38, 33, 1, 162, 38, 33, 1, 215, 179, 38, 33, 1, - 250, 139, 38, 33, 1, 220, 104, 38, 33, 1, 220, 67, 38, 33, 1, 244, 90, - 38, 33, 1, 245, 89, 38, 33, 1, 61, 38, 33, 1, 236, 67, 38, 33, 1, 247, - 169, 38, 33, 1, 230, 145, 214, 205, 38, 33, 1, 211, 59, 38, 33, 1, 210, - 212, 38, 33, 1, 235, 190, 61, 38, 33, 1, 232, 198, 210, 183, 38, 33, 1, - 252, 1, 210, 183, 38, 33, 1, 235, 190, 252, 1, 210, 183, 44, 254, 118, - 218, 61, 231, 159, 44, 254, 118, 246, 126, 218, 61, 231, 159, 43, 218, - 61, 127, 44, 218, 61, 127, 43, 246, 126, 218, 61, 127, 44, 246, 126, 218, - 61, 127, 223, 160, 235, 209, 231, 159, 223, 160, 246, 126, 235, 209, 231, - 159, 246, 126, 215, 242, 231, 159, 43, 215, 242, 127, 44, 215, 242, 127, - 223, 160, 218, 236, 43, 223, 160, 226, 202, 127, 44, 223, 160, 226, 202, - 127, 245, 218, 249, 166, 226, 17, 244, 30, 226, 17, 223, 52, 244, 30, - 226, 17, 240, 172, 246, 126, 226, 255, 246, 112, 254, 127, 214, 153, 254, - 127, 246, 126, 222, 250, 254, 117, 52, 226, 252, 240, 175, 235, 200, 235, - 208, 226, 63, 251, 162, 240, 176, 2, 248, 9, 216, 90, 2, 222, 237, 48, - 43, 121, 226, 9, 127, 44, 121, 226, 9, 127, 216, 90, 2, 59, 48, 216, 90, - 2, 59, 51, 43, 67, 252, 149, 2, 224, 10, 44, 67, 252, 149, 2, 224, 10, - 216, 15, 43, 163, 127, 216, 15, 44, 163, 127, 251, 183, 43, 163, 127, - 251, 183, 44, 163, 127, 43, 219, 189, 104, 127, 44, 219, 189, 104, 127, - 43, 52, 226, 7, 44, 52, 226, 7, 113, 170, 115, 123, 59, 224, 143, 123, - 59, 115, 113, 170, 224, 143, 92, 244, 19, 59, 224, 143, 244, 89, 59, 79, - 223, 52, 224, 16, 79, 67, 184, 222, 237, 225, 13, 211, 209, 220, 140, - 230, 229, 247, 128, 215, 94, 249, 227, 223, 160, 247, 128, 223, 160, 249, - 227, 215, 94, 220, 152, 248, 214, 2, 43, 242, 115, 248, 214, 2, 44, 242, - 115, 215, 94, 248, 213, 216, 15, 163, 221, 175, 50, 215, 59, 248, 164, - 216, 144, 248, 164, 10, 34, 223, 79, 10, 34, 250, 18, 10, 34, 221, 178, - 111, 10, 34, 221, 178, 105, 10, 34, 221, 178, 158, 10, 34, 225, 170, 10, - 34, 251, 171, 10, 34, 217, 93, 10, 34, 234, 39, 111, 10, 34, 234, 39, - 105, 10, 34, 247, 178, 10, 34, 221, 181, 10, 34, 4, 111, 10, 34, 4, 105, - 10, 34, 233, 103, 111, 10, 34, 233, 103, 105, 10, 34, 233, 103, 158, 10, - 34, 233, 103, 161, 10, 34, 219, 70, 10, 34, 216, 146, 10, 34, 219, 68, - 111, 10, 34, 219, 68, 105, 10, 34, 241, 235, 111, 10, 34, 241, 235, 105, - 10, 34, 242, 22, 10, 34, 223, 150, 10, 34, 250, 90, 10, 34, 218, 38, 10, - 34, 230, 133, 10, 34, 248, 96, 10, 34, 230, 125, 10, 34, 250, 33, 10, 34, - 212, 41, 111, 10, 34, 212, 41, 105, 10, 34, 244, 104, 10, 34, 225, 236, - 111, 10, 34, 225, 236, 105, 10, 34, 219, 162, 163, 215, 237, 215, 189, - 10, 34, 249, 153, 10, 34, 247, 144, 10, 34, 235, 143, 10, 34, 251, 206, - 64, 250, 2, 10, 34, 245, 23, 10, 34, 218, 251, 111, 10, 34, 218, 251, - 105, 10, 34, 252, 162, 10, 34, 219, 169, 10, 34, 251, 71, 219, 169, 10, - 34, 229, 95, 111, 10, 34, 229, 95, 105, 10, 34, 229, 95, 158, 10, 34, - 229, 95, 161, 10, 34, 231, 51, 10, 34, 220, 59, 10, 34, 223, 156, 10, 34, - 245, 45, 10, 34, 226, 213, 10, 34, 251, 141, 111, 10, 34, 251, 141, 105, - 10, 34, 231, 91, 10, 34, 230, 128, 10, 34, 242, 147, 111, 10, 34, 242, - 147, 105, 10, 34, 242, 147, 158, 10, 34, 216, 107, 10, 34, 250, 1, 10, - 34, 212, 9, 111, 10, 34, 212, 9, 105, 10, 34, 251, 71, 221, 172, 10, 34, - 219, 162, 240, 255, 10, 34, 240, 255, 10, 34, 251, 71, 219, 4, 10, 34, - 251, 71, 220, 54, 10, 34, 244, 40, 10, 34, 251, 71, 250, 236, 10, 34, - 219, 162, 212, 57, 10, 34, 212, 58, 111, 10, 34, 212, 58, 105, 10, 34, - 250, 35, 10, 34, 251, 71, 242, 173, 10, 34, 200, 111, 10, 34, 200, 105, - 10, 34, 251, 71, 232, 143, 10, 34, 251, 71, 243, 95, 10, 34, 230, 124, - 111, 10, 34, 230, 124, 105, 10, 34, 223, 162, 10, 34, 251, 215, 10, 34, - 251, 71, 217, 57, 233, 58, 10, 34, 251, 71, 233, 59, 10, 34, 251, 71, - 211, 239, 10, 34, 251, 71, 244, 54, 10, 34, 245, 226, 111, 10, 34, 245, - 226, 105, 10, 34, 245, 226, 158, 10, 34, 251, 71, 245, 225, 10, 34, 241, - 242, 10, 34, 251, 71, 240, 252, 10, 34, 251, 202, 10, 34, 242, 229, 10, - 34, 251, 71, 244, 98, 10, 34, 251, 71, 251, 245, 10, 34, 251, 71, 222, 3, - 10, 34, 219, 162, 212, 2, 10, 34, 219, 162, 211, 41, 10, 34, 251, 71, - 243, 252, 10, 34, 235, 149, 245, 49, 10, 34, 251, 71, 245, 49, 10, 34, - 235, 149, 216, 16, 10, 34, 251, 71, 216, 16, 10, 34, 235, 149, 246, 104, - 10, 34, 251, 71, 246, 104, 10, 34, 215, 91, 10, 34, 235, 149, 215, 91, - 10, 34, 251, 71, 215, 91, 60, 34, 111, 60, 34, 232, 219, 60, 34, 247, - 128, 60, 34, 219, 97, 60, 34, 221, 177, 60, 34, 103, 60, 34, 105, 60, 34, - 232, 243, 60, 34, 231, 190, 60, 34, 233, 39, 60, 34, 245, 137, 60, 34, - 196, 60, 34, 124, 251, 171, 60, 34, 249, 155, 60, 34, 240, 118, 60, 34, - 217, 93, 60, 34, 204, 251, 171, 60, 34, 234, 38, 60, 34, 224, 227, 60, - 34, 211, 202, 60, 34, 218, 245, 60, 34, 44, 204, 251, 171, 60, 34, 241, - 183, 245, 153, 60, 34, 216, 248, 60, 34, 247, 178, 60, 34, 221, 181, 60, - 34, 250, 18, 60, 34, 224, 185, 60, 34, 254, 224, 60, 34, 230, 115, 60, - 34, 245, 153, 60, 34, 245, 231, 60, 34, 221, 202, 60, 34, 242, 181, 60, - 34, 242, 182, 219, 83, 60, 34, 245, 48, 60, 34, 252, 0, 60, 34, 211, 221, - 60, 34, 250, 109, 60, 34, 222, 198, 60, 34, 236, 2, 60, 34, 219, 81, 60, - 34, 233, 102, 60, 34, 249, 164, 60, 34, 218, 239, 60, 34, 230, 120, 60, - 34, 222, 227, 60, 34, 211, 206, 60, 34, 226, 194, 60, 34, 215, 98, 60, - 34, 246, 88, 60, 34, 219, 253, 216, 146, 60, 34, 246, 126, 250, 18, 60, - 34, 200, 218, 110, 60, 34, 113, 242, 17, 60, 34, 220, 2, 60, 34, 251, - 177, 60, 34, 219, 67, 60, 34, 251, 145, 60, 34, 218, 140, 60, 34, 241, - 234, 60, 34, 242, 35, 60, 34, 247, 131, 60, 34, 242, 22, 60, 34, 251, - 162, 60, 34, 223, 150, 60, 34, 221, 189, 60, 34, 247, 207, 60, 34, 253, - 176, 60, 34, 218, 236, 60, 34, 228, 56, 60, 34, 218, 38, 60, 34, 221, - 213, 60, 34, 230, 133, 60, 34, 215, 236, 60, 34, 233, 128, 60, 34, 218, - 131, 60, 34, 248, 96, 60, 34, 212, 21, 60, 34, 247, 154, 228, 56, 60, 34, - 249, 223, 60, 34, 243, 229, 60, 34, 250, 29, 60, 34, 218, 144, 60, 34, - 212, 40, 60, 34, 244, 104, 60, 34, 250, 26, 60, 34, 244, 169, 60, 34, 52, - 211, 178, 60, 34, 163, 215, 237, 215, 189, 60, 34, 219, 91, 60, 34, 244, - 179, 60, 34, 249, 153, 60, 34, 247, 144, 60, 34, 224, 182, 60, 34, 235, - 143, 60, 34, 231, 72, 60, 34, 216, 89, 60, 34, 217, 246, 60, 34, 232, - 237, 60, 34, 214, 131, 60, 34, 244, 128, 60, 34, 251, 206, 64, 250, 2, - 60, 34, 219, 190, 60, 34, 246, 126, 216, 243, 60, 34, 211, 253, 60, 34, - 219, 105, 60, 34, 247, 195, 60, 34, 245, 23, 60, 34, 219, 7, 60, 34, 75, - 60, 34, 218, 133, 60, 34, 218, 250, 60, 34, 216, 0, 60, 34, 242, 154, 60, - 34, 250, 226, 60, 34, 218, 162, 60, 34, 252, 162, 60, 34, 223, 34, 60, - 34, 219, 169, 60, 34, 235, 136, 60, 34, 229, 94, 60, 34, 220, 59, 60, 34, - 244, 157, 60, 34, 226, 213, 60, 34, 254, 126, 60, 34, 225, 32, 60, 34, - 245, 235, 60, 34, 251, 140, 60, 34, 231, 91, 60, 34, 230, 188, 60, 34, - 220, 158, 60, 34, 254, 4, 60, 34, 230, 128, 60, 34, 216, 20, 60, 34, 226, - 169, 60, 34, 251, 209, 60, 34, 218, 129, 60, 34, 249, 233, 60, 34, 242, - 146, 60, 34, 216, 107, 60, 34, 235, 224, 60, 34, 251, 219, 60, 34, 212, - 58, 245, 153, 60, 34, 250, 1, 60, 34, 212, 8, 60, 34, 221, 172, 60, 34, - 240, 255, 60, 34, 219, 4, 60, 34, 214, 22, 60, 34, 252, 80, 60, 34, 225, - 76, 60, 34, 252, 182, 60, 34, 220, 54, 60, 34, 223, 113, 60, 34, 222, - 128, 60, 34, 244, 40, 60, 34, 251, 208, 60, 34, 250, 236, 60, 34, 251, - 234, 60, 34, 230, 130, 60, 34, 212, 57, 60, 34, 250, 35, 60, 34, 211, - 236, 60, 34, 247, 188, 60, 34, 213, 161, 60, 34, 242, 173, 60, 34, 232, - 143, 60, 34, 243, 95, 60, 34, 230, 123, 60, 34, 219, 96, 60, 34, 219, - 253, 217, 77, 251, 245, 60, 34, 223, 162, 60, 34, 251, 215, 60, 34, 211, - 197, 60, 34, 244, 198, 60, 34, 233, 58, 60, 34, 217, 57, 233, 58, 60, 34, - 233, 54, 60, 34, 219, 32, 60, 34, 233, 59, 60, 34, 211, 239, 60, 34, 244, - 54, 60, 34, 245, 225, 60, 34, 241, 242, 60, 34, 244, 8, 60, 34, 240, 252, - 60, 34, 251, 202, 60, 34, 217, 64, 60, 34, 242, 41, 60, 34, 244, 121, 60, - 34, 222, 30, 211, 236, 60, 34, 250, 228, 60, 34, 242, 229, 60, 34, 244, - 98, 60, 34, 251, 245, 60, 34, 222, 3, 60, 34, 248, 82, 60, 34, 212, 2, - 60, 34, 241, 217, 60, 34, 211, 41, 60, 34, 230, 197, 60, 34, 251, 229, - 60, 34, 245, 163, 60, 34, 243, 252, 60, 34, 215, 210, 60, 34, 246, 90, - 60, 34, 223, 144, 60, 34, 228, 58, 60, 34, 245, 49, 60, 34, 216, 16, 60, - 34, 246, 104, 60, 34, 215, 91, 60, 34, 244, 56, 110, 248, 45, 135, 43, - 216, 43, 222, 254, 110, 248, 45, 135, 72, 216, 43, 51, 110, 248, 45, 135, - 43, 216, 43, 230, 229, 22, 222, 254, 110, 248, 45, 135, 72, 216, 43, 230, - 229, 22, 51, 110, 248, 45, 135, 243, 236, 218, 11, 110, 248, 45, 135, - 218, 12, 243, 251, 48, 110, 248, 45, 135, 218, 12, 243, 251, 51, 110, - 248, 45, 135, 218, 12, 243, 251, 233, 52, 110, 248, 45, 135, 218, 12, - 243, 251, 214, 160, 233, 52, 110, 248, 45, 135, 218, 12, 243, 251, 214, - 160, 222, 254, 110, 248, 45, 135, 218, 12, 243, 251, 232, 114, 233, 52, - 110, 248, 45, 135, 226, 126, 110, 219, 20, 110, 249, 227, 110, 243, 236, - 218, 131, 247, 185, 79, 235, 137, 235, 243, 218, 161, 87, 110, 235, 164, - 79, 110, 250, 4, 79, 110, 54, 210, 86, 43, 254, 118, 127, 44, 254, 118, - 127, 43, 52, 254, 118, 127, 44, 52, 254, 118, 127, 43, 249, 169, 127, 44, - 249, 169, 127, 43, 71, 249, 169, 127, 44, 71, 249, 169, 127, 43, 85, 233, - 26, 127, 44, 85, 233, 26, 127, 224, 240, 79, 243, 39, 79, 43, 216, 7, - 220, 55, 127, 44, 216, 7, 220, 55, 127, 43, 71, 233, 26, 127, 44, 71, - 233, 26, 127, 43, 71, 216, 7, 220, 55, 127, 44, 71, 216, 7, 220, 55, 127, - 43, 71, 42, 127, 44, 71, 42, 127, 212, 36, 248, 164, 223, 52, 52, 224, - 194, 224, 1, 79, 52, 224, 194, 224, 1, 79, 121, 52, 224, 194, 224, 1, 79, - 224, 240, 164, 244, 198, 242, 15, 227, 202, 111, 242, 15, 227, 202, 105, - 242, 15, 227, 202, 158, 242, 15, 227, 202, 161, 242, 15, 227, 202, 190, - 242, 15, 227, 202, 195, 242, 15, 227, 202, 199, 242, 15, 227, 202, 196, - 242, 15, 227, 202, 201, 110, 233, 9, 138, 79, 110, 222, 231, 138, 79, - 110, 248, 52, 138, 79, 110, 245, 136, 138, 79, 24, 219, 157, 59, 138, 79, - 24, 52, 59, 138, 79, 212, 32, 248, 164, 67, 234, 239, 223, 80, 79, 67, - 234, 239, 223, 80, 2, 213, 135, 219, 33, 79, 67, 234, 239, 223, 80, 164, - 214, 160, 242, 34, 67, 234, 239, 223, 80, 2, 213, 135, 219, 33, 164, 214, - 160, 242, 34, 67, 234, 239, 223, 80, 164, 232, 114, 242, 34, 37, 224, - 240, 79, 110, 217, 4, 232, 220, 244, 154, 220, 140, 87, 242, 15, 227, - 202, 216, 248, 242, 15, 227, 202, 215, 73, 242, 15, 227, 202, 216, 163, - 67, 110, 235, 164, 79, 231, 145, 79, 226, 3, 254, 148, 79, 110, 45, 235, - 245, 110, 163, 244, 114, 219, 20, 141, 1, 4, 61, 141, 1, 61, 141, 1, 4, - 74, 141, 1, 74, 141, 1, 4, 69, 141, 1, 69, 141, 1, 4, 76, 141, 1, 76, - 141, 1, 4, 78, 141, 1, 78, 141, 1, 176, 141, 1, 243, 142, 141, 1, 234, - 98, 141, 1, 242, 221, 141, 1, 233, 223, 141, 1, 242, 120, 141, 1, 234, - 188, 141, 1, 243, 69, 141, 1, 234, 34, 141, 1, 242, 181, 141, 1, 206, - 141, 1, 210, 116, 141, 1, 219, 193, 141, 1, 210, 44, 141, 1, 218, 84, - 141, 1, 210, 13, 141, 1, 221, 183, 141, 1, 210, 94, 141, 1, 219, 60, 141, - 1, 210, 23, 141, 1, 217, 106, 141, 1, 248, 229, 141, 1, 216, 118, 141, 1, - 248, 11, 141, 1, 4, 215, 119, 141, 1, 215, 119, 141, 1, 246, 86, 141, 1, - 217, 23, 141, 1, 248, 98, 141, 1, 112, 141, 1, 247, 153, 141, 1, 198, - 141, 1, 228, 238, 141, 1, 227, 242, 141, 1, 229, 112, 141, 1, 228, 79, - 141, 1, 162, 141, 1, 252, 199, 141, 1, 191, 141, 1, 241, 187, 141, 1, - 252, 14, 141, 1, 225, 111, 141, 1, 240, 229, 141, 1, 251, 133, 141, 1, - 224, 153, 141, 1, 241, 245, 141, 1, 252, 83, 141, 1, 225, 224, 141, 1, - 241, 75, 141, 1, 251, 213, 141, 1, 225, 19, 141, 1, 186, 141, 1, 230, - 235, 141, 1, 230, 107, 141, 1, 231, 96, 141, 1, 230, 166, 141, 1, 4, 192, - 141, 1, 192, 141, 1, 4, 210, 212, 141, 1, 210, 212, 141, 1, 4, 210, 244, - 141, 1, 210, 244, 141, 1, 205, 141, 1, 223, 38, 141, 1, 222, 142, 141, 1, - 223, 131, 141, 1, 222, 213, 141, 1, 4, 212, 65, 141, 1, 212, 65, 141, 1, - 211, 250, 141, 1, 212, 22, 141, 1, 211, 227, 141, 1, 230, 30, 141, 1, - 212, 116, 141, 1, 4, 176, 141, 1, 4, 234, 188, 38, 234, 207, 213, 135, - 219, 33, 79, 38, 234, 207, 220, 157, 219, 33, 79, 234, 207, 213, 135, - 219, 33, 79, 234, 207, 220, 157, 219, 33, 79, 141, 235, 164, 79, 141, - 213, 135, 235, 164, 79, 141, 247, 229, 210, 225, 234, 207, 52, 240, 175, - 56, 1, 4, 61, 56, 1, 61, 56, 1, 4, 74, 56, 1, 74, 56, 1, 4, 69, 56, 1, - 69, 56, 1, 4, 76, 56, 1, 76, 56, 1, 4, 78, 56, 1, 78, 56, 1, 176, 56, 1, - 243, 142, 56, 1, 234, 98, 56, 1, 242, 221, 56, 1, 233, 223, 56, 1, 242, - 120, 56, 1, 234, 188, 56, 1, 243, 69, 56, 1, 234, 34, 56, 1, 242, 181, - 56, 1, 206, 56, 1, 210, 116, 56, 1, 219, 193, 56, 1, 210, 44, 56, 1, 218, - 84, 56, 1, 210, 13, 56, 1, 221, 183, 56, 1, 210, 94, 56, 1, 219, 60, 56, - 1, 210, 23, 56, 1, 217, 106, 56, 1, 248, 229, 56, 1, 216, 118, 56, 1, - 248, 11, 56, 1, 4, 215, 119, 56, 1, 215, 119, 56, 1, 246, 86, 56, 1, 217, - 23, 56, 1, 248, 98, 56, 1, 112, 56, 1, 247, 153, 56, 1, 198, 56, 1, 228, - 238, 56, 1, 227, 242, 56, 1, 229, 112, 56, 1, 228, 79, 56, 1, 162, 56, 1, - 252, 199, 56, 1, 191, 56, 1, 241, 187, 56, 1, 252, 14, 56, 1, 225, 111, - 56, 1, 240, 229, 56, 1, 251, 133, 56, 1, 224, 153, 56, 1, 241, 245, 56, - 1, 252, 83, 56, 1, 225, 224, 56, 1, 241, 75, 56, 1, 251, 213, 56, 1, 225, - 19, 56, 1, 186, 56, 1, 230, 235, 56, 1, 230, 107, 56, 1, 231, 96, 56, 1, - 230, 166, 56, 1, 4, 192, 56, 1, 192, 56, 1, 4, 210, 212, 56, 1, 210, 212, - 56, 1, 4, 210, 244, 56, 1, 210, 244, 56, 1, 205, 56, 1, 223, 38, 56, 1, - 222, 142, 56, 1, 223, 131, 56, 1, 222, 213, 56, 1, 4, 212, 65, 56, 1, - 212, 65, 56, 1, 211, 250, 56, 1, 212, 22, 56, 1, 211, 227, 56, 1, 230, - 30, 56, 1, 212, 116, 56, 1, 4, 176, 56, 1, 4, 234, 188, 56, 1, 214, 27, - 56, 1, 213, 176, 56, 1, 213, 255, 56, 1, 213, 138, 56, 230, 229, 247, - 128, 234, 207, 224, 176, 219, 33, 79, 56, 235, 164, 79, 56, 213, 135, - 235, 164, 79, 56, 247, 229, 234, 5, 251, 192, 1, 253, 166, 251, 192, 1, - 226, 109, 251, 192, 1, 194, 251, 192, 1, 245, 14, 251, 192, 1, 249, 68, - 251, 192, 1, 217, 153, 251, 192, 1, 230, 30, 251, 192, 1, 156, 251, 192, - 1, 243, 209, 251, 192, 1, 235, 29, 251, 192, 1, 242, 67, 251, 192, 1, - 235, 150, 251, 192, 1, 224, 99, 251, 192, 1, 211, 178, 251, 192, 1, 210, - 83, 251, 192, 1, 250, 166, 251, 192, 1, 220, 106, 251, 192, 1, 153, 251, - 192, 1, 210, 159, 251, 192, 1, 251, 74, 251, 192, 1, 222, 93, 251, 192, - 1, 61, 251, 192, 1, 78, 251, 192, 1, 76, 251, 192, 1, 245, 205, 251, 192, - 1, 254, 210, 251, 192, 1, 245, 203, 251, 192, 1, 253, 200, 251, 192, 1, - 226, 138, 251, 192, 1, 254, 131, 251, 192, 1, 245, 158, 251, 192, 1, 254, - 123, 251, 192, 1, 245, 146, 251, 192, 1, 245, 100, 251, 192, 1, 74, 251, - 192, 1, 69, 251, 192, 1, 235, 162, 251, 192, 1, 214, 105, 251, 192, 1, - 229, 84, 251, 192, 1, 242, 185, 251, 192, 1, 236, 41, 24, 1, 234, 64, 24, - 1, 218, 217, 24, 1, 234, 57, 24, 1, 228, 231, 24, 1, 228, 229, 24, 1, - 228, 228, 24, 1, 216, 102, 24, 1, 218, 206, 24, 1, 223, 29, 24, 1, 223, - 24, 24, 1, 223, 21, 24, 1, 223, 14, 24, 1, 223, 9, 24, 1, 223, 4, 24, 1, - 223, 15, 24, 1, 223, 27, 24, 1, 230, 222, 24, 1, 225, 98, 24, 1, 218, - 214, 24, 1, 225, 87, 24, 1, 219, 150, 24, 1, 218, 211, 24, 1, 236, 63, - 24, 1, 250, 54, 24, 1, 218, 221, 24, 1, 250, 114, 24, 1, 234, 116, 24, 1, - 216, 174, 24, 1, 225, 134, 24, 1, 241, 179, 24, 1, 61, 24, 1, 254, 252, - 24, 1, 192, 24, 1, 211, 92, 24, 1, 245, 125, 24, 1, 76, 24, 1, 211, 36, - 24, 1, 211, 47, 24, 1, 78, 24, 1, 212, 65, 24, 1, 212, 62, 24, 1, 226, - 238, 24, 1, 210, 244, 24, 1, 69, 24, 1, 212, 11, 24, 1, 212, 22, 24, 1, - 211, 250, 24, 1, 210, 212, 24, 1, 245, 63, 24, 1, 211, 8, 24, 1, 74, 24, - 244, 111, 24, 1, 218, 215, 24, 1, 228, 221, 24, 1, 228, 223, 24, 1, 228, - 226, 24, 1, 223, 22, 24, 1, 223, 3, 24, 1, 223, 11, 24, 1, 223, 16, 24, - 1, 223, 1, 24, 1, 230, 215, 24, 1, 230, 212, 24, 1, 230, 216, 24, 1, 234, - 227, 24, 1, 225, 93, 24, 1, 225, 79, 24, 1, 225, 85, 24, 1, 225, 82, 24, - 1, 225, 96, 24, 1, 225, 80, 24, 1, 234, 225, 24, 1, 234, 223, 24, 1, 219, - 143, 24, 1, 219, 141, 24, 1, 219, 133, 24, 1, 219, 138, 24, 1, 219, 148, - 24, 1, 226, 36, 24, 1, 218, 218, 24, 1, 211, 26, 24, 1, 211, 22, 24, 1, - 211, 23, 24, 1, 234, 226, 24, 1, 218, 219, 24, 1, 211, 32, 24, 1, 210, - 238, 24, 1, 210, 237, 24, 1, 210, 240, 24, 1, 210, 203, 24, 1, 210, 204, - 24, 1, 210, 207, 24, 1, 254, 42, 24, 1, 254, 36, 110, 254, 107, 232, 209, - 79, 110, 254, 107, 223, 53, 79, 110, 254, 107, 123, 79, 110, 254, 107, - 113, 79, 110, 254, 107, 134, 79, 110, 254, 107, 244, 19, 79, 110, 254, - 107, 216, 15, 79, 110, 254, 107, 230, 229, 79, 110, 254, 107, 251, 183, - 79, 110, 254, 107, 244, 100, 79, 110, 254, 107, 221, 178, 79, 110, 254, - 107, 216, 170, 79, 110, 254, 107, 244, 12, 79, 110, 254, 107, 241, 231, - 79, 110, 254, 107, 245, 232, 79, 110, 254, 107, 231, 191, 79, 251, 192, - 1, 251, 133, 251, 192, 1, 210, 44, 251, 192, 1, 235, 114, 251, 192, 1, - 242, 120, 251, 192, 1, 245, 217, 251, 192, 1, 245, 143, 251, 192, 1, 226, - 187, 251, 192, 1, 226, 191, 251, 192, 1, 235, 186, 251, 192, 1, 254, 109, - 251, 192, 1, 235, 231, 251, 192, 1, 214, 168, 251, 192, 1, 236, 23, 251, - 192, 1, 229, 62, 251, 192, 1, 254, 204, 251, 192, 1, 253, 195, 251, 192, - 1, 254, 144, 251, 192, 1, 226, 208, 251, 192, 1, 226, 193, 251, 192, 1, - 235, 228, 251, 192, 40, 1, 226, 109, 251, 192, 40, 1, 217, 153, 251, 192, - 40, 1, 235, 29, 251, 192, 40, 1, 242, 67, 251, 192, 1, 243, 1, 251, 192, - 1, 233, 5, 251, 192, 1, 209, 250, 10, 218, 105, 217, 153, 10, 218, 105, - 212, 4, 10, 218, 105, 211, 158, 10, 218, 105, 251, 87, 10, 218, 105, 217, - 255, 10, 218, 105, 240, 165, 10, 218, 105, 240, 169, 10, 218, 105, 240, - 238, 10, 218, 105, 240, 166, 10, 218, 105, 217, 156, 10, 218, 105, 240, - 168, 10, 218, 105, 240, 164, 10, 218, 105, 240, 236, 10, 218, 105, 240, - 167, 10, 218, 105, 240, 163, 10, 218, 105, 230, 30, 10, 218, 105, 242, - 67, 10, 218, 105, 222, 93, 10, 218, 105, 226, 109, 10, 218, 105, 219, 23, - 10, 218, 105, 249, 68, 10, 218, 105, 240, 170, 10, 218, 105, 241, 197, - 10, 218, 105, 217, 165, 10, 218, 105, 217, 234, 10, 218, 105, 218, 170, - 10, 218, 105, 220, 112, 10, 218, 105, 225, 228, 10, 218, 105, 224, 101, - 10, 218, 105, 216, 44, 10, 218, 105, 217, 155, 10, 218, 105, 217, 245, - 10, 218, 105, 240, 177, 10, 218, 105, 240, 162, 10, 218, 105, 225, 152, - 10, 218, 105, 224, 99, 56, 1, 4, 233, 223, 56, 1, 4, 219, 193, 56, 1, 4, - 218, 84, 56, 1, 4, 112, 56, 1, 4, 227, 242, 56, 1, 4, 162, 56, 1, 4, 241, - 187, 56, 1, 4, 240, 229, 56, 1, 4, 241, 245, 56, 1, 4, 241, 75, 56, 1, 4, - 230, 107, 56, 1, 4, 205, 56, 1, 4, 223, 38, 56, 1, 4, 222, 142, 56, 1, 4, - 223, 131, 56, 1, 4, 222, 213, 88, 24, 234, 64, 88, 24, 228, 231, 88, 24, - 216, 102, 88, 24, 223, 29, 88, 24, 230, 222, 88, 24, 225, 98, 88, 24, - 219, 150, 88, 24, 236, 63, 88, 24, 250, 54, 88, 24, 250, 114, 88, 24, - 234, 116, 88, 24, 216, 174, 88, 24, 225, 134, 88, 24, 241, 179, 88, 24, - 234, 65, 61, 88, 24, 228, 232, 61, 88, 24, 216, 103, 61, 88, 24, 223, 30, - 61, 88, 24, 230, 223, 61, 88, 24, 225, 99, 61, 88, 24, 219, 151, 61, 88, - 24, 236, 64, 61, 88, 24, 250, 55, 61, 88, 24, 250, 115, 61, 88, 24, 234, - 117, 61, 88, 24, 216, 175, 61, 88, 24, 225, 135, 61, 88, 24, 241, 180, - 61, 88, 24, 250, 55, 69, 88, 234, 9, 135, 226, 221, 88, 234, 9, 135, 144, - 240, 229, 88, 154, 111, 88, 154, 105, 88, 154, 158, 88, 154, 161, 88, - 154, 190, 88, 154, 195, 88, 154, 199, 88, 154, 196, 88, 154, 201, 88, - 154, 216, 248, 88, 154, 230, 133, 88, 154, 244, 104, 88, 154, 212, 40, - 88, 154, 211, 214, 88, 154, 231, 44, 88, 154, 245, 231, 88, 154, 218, 38, - 88, 154, 218, 134, 88, 154, 241, 251, 88, 154, 219, 56, 88, 154, 229, - 209, 88, 154, 219, 6, 88, 154, 244, 110, 88, 154, 249, 208, 88, 154, 233, - 131, 88, 154, 223, 74, 88, 154, 251, 23, 88, 154, 218, 88, 88, 154, 218, - 21, 88, 154, 245, 135, 88, 154, 223, 66, 88, 154, 254, 159, 88, 154, 244, - 136, 88, 154, 223, 64, 88, 154, 220, 158, 88, 154, 223, 130, 37, 154, - 224, 15, 37, 154, 234, 86, 37, 154, 221, 200, 37, 154, 234, 5, 37, 54, - 216, 249, 226, 201, 85, 218, 236, 37, 54, 215, 74, 226, 201, 85, 218, - 236, 37, 54, 216, 164, 226, 201, 85, 218, 236, 37, 54, 244, 24, 226, 201, - 85, 218, 236, 37, 54, 244, 123, 226, 201, 85, 218, 236, 37, 54, 219, 114, - 226, 201, 85, 218, 236, 37, 54, 220, 119, 226, 201, 85, 218, 236, 37, 54, - 245, 193, 226, 201, 85, 218, 236, 225, 255, 50, 37, 54, 215, 74, 111, 37, - 54, 215, 74, 105, 37, 54, 215, 74, 158, 37, 54, 215, 74, 161, 37, 54, - 215, 74, 190, 37, 54, 215, 74, 195, 37, 54, 215, 74, 199, 37, 54, 215, - 74, 196, 37, 54, 215, 74, 201, 37, 54, 216, 163, 37, 54, 216, 164, 111, - 37, 54, 216, 164, 105, 37, 54, 216, 164, 158, 37, 54, 216, 164, 161, 37, - 54, 216, 164, 190, 37, 24, 234, 64, 37, 24, 228, 231, 37, 24, 216, 102, - 37, 24, 223, 29, 37, 24, 230, 222, 37, 24, 225, 98, 37, 24, 219, 150, 37, - 24, 236, 63, 37, 24, 250, 54, 37, 24, 250, 114, 37, 24, 234, 116, 37, 24, - 216, 174, 37, 24, 225, 134, 37, 24, 241, 179, 37, 24, 234, 65, 61, 37, - 24, 228, 232, 61, 37, 24, 216, 103, 61, 37, 24, 223, 30, 61, 37, 24, 230, - 223, 61, 37, 24, 225, 99, 61, 37, 24, 219, 151, 61, 37, 24, 236, 64, 61, - 37, 24, 250, 55, 61, 37, 24, 250, 115, 61, 37, 24, 234, 117, 61, 37, 24, - 216, 175, 61, 37, 24, 225, 135, 61, 37, 24, 241, 180, 61, 37, 234, 9, - 135, 250, 156, 37, 234, 9, 135, 235, 53, 37, 24, 236, 64, 69, 234, 9, - 218, 161, 87, 37, 154, 111, 37, 154, 105, 37, 154, 158, 37, 154, 161, 37, - 154, 190, 37, 154, 195, 37, 154, 199, 37, 154, 196, 37, 154, 201, 37, - 154, 216, 248, 37, 154, 230, 133, 37, 154, 244, 104, 37, 154, 212, 40, - 37, 154, 211, 214, 37, 154, 231, 44, 37, 154, 245, 231, 37, 154, 218, 38, - 37, 154, 218, 134, 37, 154, 241, 251, 37, 154, 219, 56, 37, 154, 229, - 209, 37, 154, 219, 6, 37, 154, 244, 110, 37, 154, 249, 208, 37, 154, 233, - 131, 37, 154, 221, 176, 37, 154, 231, 194, 37, 154, 244, 145, 37, 154, - 218, 50, 37, 154, 245, 42, 37, 154, 224, 190, 37, 154, 253, 204, 37, 154, - 235, 165, 37, 154, 223, 64, 37, 154, 249, 172, 37, 154, 249, 163, 37, - 154, 241, 172, 37, 154, 250, 182, 37, 154, 232, 116, 37, 154, 233, 52, - 37, 154, 222, 254, 37, 154, 231, 88, 37, 154, 223, 90, 37, 154, 218, 88, - 37, 154, 218, 21, 37, 154, 245, 135, 37, 154, 223, 66, 37, 154, 254, 159, - 37, 154, 228, 217, 37, 54, 216, 164, 195, 37, 54, 216, 164, 199, 37, 54, - 216, 164, 196, 37, 54, 216, 164, 201, 37, 54, 244, 23, 37, 54, 244, 24, - 111, 37, 54, 244, 24, 105, 37, 54, 244, 24, 158, 37, 54, 244, 24, 161, - 37, 54, 244, 24, 190, 37, 54, 244, 24, 195, 37, 54, 244, 24, 199, 37, 54, - 244, 24, 196, 37, 54, 244, 24, 201, 37, 54, 244, 122, 110, 217, 4, 16, - 31, 235, 139, 110, 217, 4, 16, 31, 244, 156, 110, 217, 4, 16, 31, 231, - 165, 110, 217, 4, 16, 31, 254, 55, 110, 217, 4, 16, 31, 231, 137, 110, - 217, 4, 16, 31, 235, 51, 110, 217, 4, 16, 31, 235, 52, 110, 217, 4, 16, - 31, 253, 196, 110, 217, 4, 16, 31, 220, 138, 110, 217, 4, 16, 31, 226, - 243, 110, 217, 4, 16, 31, 228, 45, 110, 217, 4, 16, 31, 248, 93, 42, 241, - 197, 42, 245, 96, 42, 245, 51, 232, 225, 232, 246, 50, 37, 56, 61, 37, - 56, 74, 37, 56, 69, 37, 56, 76, 37, 56, 78, 37, 56, 176, 37, 56, 234, 98, - 37, 56, 233, 223, 37, 56, 234, 188, 37, 56, 234, 34, 37, 56, 206, 37, 56, - 219, 193, 37, 56, 218, 84, 37, 56, 221, 183, 37, 56, 219, 60, 37, 56, - 217, 106, 37, 56, 216, 118, 37, 56, 215, 119, 37, 56, 217, 23, 37, 56, - 112, 37, 56, 198, 37, 56, 228, 238, 37, 56, 227, 242, 37, 56, 229, 112, - 37, 56, 228, 79, 37, 56, 162, 37, 56, 241, 187, 37, 56, 240, 229, 37, 56, - 241, 245, 37, 56, 241, 75, 37, 56, 186, 37, 56, 230, 235, 37, 56, 230, - 107, 37, 56, 231, 96, 37, 56, 230, 166, 37, 56, 192, 37, 56, 210, 212, - 37, 56, 210, 244, 37, 56, 205, 37, 56, 223, 38, 37, 56, 222, 142, 37, 56, - 223, 131, 37, 56, 222, 213, 37, 56, 212, 65, 37, 56, 211, 250, 37, 56, - 212, 22, 37, 56, 211, 227, 42, 254, 79, 42, 253, 247, 42, 254, 103, 42, - 255, 40, 42, 235, 233, 42, 235, 203, 42, 214, 166, 42, 245, 74, 42, 245, - 214, 42, 226, 190, 42, 226, 184, 42, 234, 251, 42, 234, 220, 42, 234, - 217, 42, 243, 99, 42, 243, 108, 42, 242, 211, 42, 242, 207, 42, 233, 156, - 42, 242, 200, 42, 234, 78, 42, 234, 77, 42, 234, 76, 42, 234, 75, 42, - 242, 93, 42, 242, 92, 42, 233, 199, 42, 233, 201, 42, 234, 184, 42, 234, - 7, 42, 234, 14, 42, 222, 18, 42, 221, 239, 42, 219, 131, 42, 220, 143, - 42, 220, 142, 42, 248, 226, 42, 248, 44, 42, 247, 129, 42, 216, 33, 42, - 229, 205, 42, 228, 46, 42, 242, 39, 42, 226, 88, 42, 226, 87, 42, 252, - 196, 42, 225, 108, 42, 225, 72, 42, 225, 73, 42, 251, 242, 42, 240, 228, - 42, 240, 224, 42, 251, 99, 42, 240, 211, 42, 241, 222, 42, 225, 162, 42, - 225, 197, 42, 241, 205, 42, 225, 194, 42, 225, 210, 42, 252, 69, 42, 225, - 9, 42, 251, 188, 42, 241, 63, 42, 224, 253, 42, 241, 55, 42, 241, 57, 42, - 231, 206, 42, 231, 202, 42, 231, 211, 42, 231, 155, 42, 231, 180, 42, - 230, 202, 42, 230, 181, 42, 230, 180, 42, 231, 79, 42, 231, 76, 42, 231, - 80, 42, 211, 102, 42, 211, 100, 42, 210, 201, 42, 222, 229, 42, 222, 233, - 42, 222, 119, 42, 222, 113, 42, 223, 88, 42, 223, 85, 42, 212, 38, 110, - 217, 4, 16, 31, 240, 246, 210, 86, 110, 217, 4, 16, 31, 240, 246, 111, - 110, 217, 4, 16, 31, 240, 246, 105, 110, 217, 4, 16, 31, 240, 246, 158, - 110, 217, 4, 16, 31, 240, 246, 161, 110, 217, 4, 16, 31, 240, 246, 190, - 110, 217, 4, 16, 31, 240, 246, 195, 110, 217, 4, 16, 31, 240, 246, 199, - 110, 217, 4, 16, 31, 240, 246, 196, 110, 217, 4, 16, 31, 240, 246, 201, - 110, 217, 4, 16, 31, 240, 246, 216, 248, 110, 217, 4, 16, 31, 240, 246, - 245, 175, 110, 217, 4, 16, 31, 240, 246, 215, 76, 110, 217, 4, 16, 31, - 240, 246, 216, 165, 110, 217, 4, 16, 31, 240, 246, 244, 13, 110, 217, 4, - 16, 31, 240, 246, 244, 126, 110, 217, 4, 16, 31, 240, 246, 219, 121, 110, - 217, 4, 16, 31, 240, 246, 220, 121, 110, 217, 4, 16, 31, 240, 246, 245, - 198, 110, 217, 4, 16, 31, 240, 246, 228, 202, 110, 217, 4, 16, 31, 240, - 246, 215, 73, 110, 217, 4, 16, 31, 240, 246, 215, 67, 110, 217, 4, 16, - 31, 240, 246, 215, 63, 110, 217, 4, 16, 31, 240, 246, 215, 64, 110, 217, - 4, 16, 31, 240, 246, 215, 69, 42, 240, 237, 42, 248, 229, 42, 253, 200, - 42, 130, 42, 226, 129, 42, 225, 229, 42, 247, 155, 42, 247, 156, 218, - 235, 42, 247, 156, 249, 116, 42, 235, 162, 42, 245, 99, 229, 210, 241, - 223, 42, 245, 99, 229, 210, 217, 175, 42, 245, 99, 229, 210, 217, 75, 42, - 245, 99, 229, 210, 231, 75, 42, 249, 165, 42, 226, 94, 254, 133, 42, 198, - 42, 230, 108, 61, 42, 186, 42, 176, 42, 234, 191, 42, 231, 134, 42, 243, - 87, 42, 251, 26, 42, 234, 190, 42, 225, 153, 42, 229, 86, 42, 230, 108, - 245, 14, 42, 230, 108, 243, 209, 42, 231, 20, 42, 234, 140, 42, 240, 170, - 42, 234, 100, 42, 230, 237, 42, 242, 223, 42, 216, 120, 42, 230, 108, - 156, 42, 230, 174, 42, 247, 165, 42, 234, 46, 42, 244, 53, 42, 228, 117, - 42, 230, 108, 194, 42, 230, 171, 42, 249, 247, 42, 234, 40, 42, 230, 172, - 218, 235, 42, 249, 248, 218, 235, 42, 232, 55, 218, 235, 42, 234, 41, - 218, 235, 42, 230, 172, 249, 116, 42, 249, 248, 249, 116, 42, 232, 55, - 249, 116, 42, 234, 41, 249, 116, 42, 232, 55, 115, 222, 93, 42, 232, 55, - 115, 222, 94, 218, 235, 42, 191, 42, 234, 1, 42, 230, 110, 42, 242, 158, - 42, 223, 179, 42, 223, 180, 115, 222, 93, 42, 223, 180, 115, 222, 94, - 218, 235, 42, 224, 165, 42, 228, 18, 42, 230, 108, 222, 93, 42, 230, 109, - 42, 224, 119, 42, 227, 180, 42, 230, 108, 214, 105, 42, 230, 54, 42, 233, - 191, 42, 230, 55, 231, 79, 42, 224, 118, 42, 227, 179, 42, 230, 108, 212, - 98, 42, 230, 48, 42, 233, 189, 42, 230, 49, 231, 79, 42, 235, 30, 226, - 224, 42, 232, 55, 226, 224, 42, 254, 144, 42, 251, 168, 42, 250, 222, 42, - 250, 199, 42, 251, 75, 115, 234, 140, 42, 249, 246, 42, 248, 150, 42, - 242, 79, 42, 162, 42, 240, 238, 42, 236, 6, 42, 234, 53, 42, 234, 41, - 251, 2, 42, 233, 225, 42, 232, 165, 42, 232, 164, 42, 232, 153, 42, 232, - 68, 42, 231, 135, 219, 81, 42, 230, 201, 42, 230, 157, 42, 225, 151, 42, - 225, 22, 42, 224, 222, 42, 224, 220, 42, 218, 229, 42, 218, 3, 42, 212, - 24, 42, 214, 106, 115, 194, 42, 116, 115, 194, 110, 217, 4, 16, 31, 248, - 154, 111, 110, 217, 4, 16, 31, 248, 154, 105, 110, 217, 4, 16, 31, 248, - 154, 158, 110, 217, 4, 16, 31, 248, 154, 161, 110, 217, 4, 16, 31, 248, - 154, 190, 110, 217, 4, 16, 31, 248, 154, 195, 110, 217, 4, 16, 31, 248, - 154, 199, 110, 217, 4, 16, 31, 248, 154, 196, 110, 217, 4, 16, 31, 248, - 154, 201, 110, 217, 4, 16, 31, 248, 154, 216, 248, 110, 217, 4, 16, 31, - 248, 154, 245, 175, 110, 217, 4, 16, 31, 248, 154, 215, 76, 110, 217, 4, - 16, 31, 248, 154, 216, 165, 110, 217, 4, 16, 31, 248, 154, 244, 13, 110, - 217, 4, 16, 31, 248, 154, 244, 126, 110, 217, 4, 16, 31, 248, 154, 219, - 121, 110, 217, 4, 16, 31, 248, 154, 220, 121, 110, 217, 4, 16, 31, 248, - 154, 245, 198, 110, 217, 4, 16, 31, 248, 154, 228, 202, 110, 217, 4, 16, - 31, 248, 154, 215, 73, 110, 217, 4, 16, 31, 248, 154, 215, 67, 110, 217, - 4, 16, 31, 248, 154, 215, 63, 110, 217, 4, 16, 31, 248, 154, 215, 64, - 110, 217, 4, 16, 31, 248, 154, 215, 69, 110, 217, 4, 16, 31, 248, 154, - 215, 70, 110, 217, 4, 16, 31, 248, 154, 215, 65, 110, 217, 4, 16, 31, - 248, 154, 215, 66, 110, 217, 4, 16, 31, 248, 154, 215, 72, 110, 217, 4, - 16, 31, 248, 154, 215, 68, 110, 217, 4, 16, 31, 248, 154, 216, 163, 110, - 217, 4, 16, 31, 248, 154, 216, 162, 42, 243, 125, 241, 199, 31, 216, 197, - 249, 148, 241, 230, 241, 199, 31, 216, 197, 223, 125, 245, 231, 241, 199, - 31, 247, 239, 253, 215, 216, 197, 252, 64, 241, 199, 31, 210, 223, 244, - 46, 241, 199, 31, 212, 59, 241, 199, 31, 249, 211, 241, 199, 31, 216, - 197, 254, 11, 241, 199, 31, 241, 67, 216, 39, 241, 199, 31, 4, 217, 62, - 241, 199, 31, 215, 238, 241, 199, 31, 225, 222, 241, 199, 31, 218, 160, - 241, 199, 31, 244, 147, 241, 199, 31, 242, 139, 224, 243, 241, 199, 31, - 230, 160, 241, 199, 31, 245, 134, 241, 199, 31, 244, 47, 241, 199, 31, - 211, 207, 226, 201, 216, 197, 248, 94, 241, 199, 31, 254, 59, 241, 199, - 31, 249, 193, 241, 199, 31, 251, 235, 216, 139, 241, 199, 31, 242, 156, - 241, 199, 31, 218, 247, 254, 78, 241, 199, 31, 223, 56, 241, 199, 31, - 235, 227, 241, 199, 31, 242, 139, 217, 62, 241, 199, 31, 230, 116, 249, - 167, 241, 199, 31, 242, 139, 224, 200, 241, 199, 31, 216, 197, 255, 27, - 212, 40, 241, 199, 31, 216, 197, 250, 16, 244, 104, 241, 199, 31, 235, - 240, 241, 199, 31, 246, 65, 241, 199, 31, 223, 59, 241, 199, 31, 242, - 139, 224, 227, 241, 199, 31, 224, 180, 241, 199, 31, 248, 169, 64, 216, - 197, 232, 236, 241, 199, 31, 216, 197, 244, 182, 241, 199, 31, 226, 167, - 241, 199, 31, 226, 248, 241, 199, 31, 248, 67, 241, 199, 31, 248, 87, - 241, 199, 31, 235, 254, 241, 199, 31, 251, 157, 241, 199, 31, 249, 229, - 216, 43, 231, 81, 241, 199, 31, 243, 94, 216, 39, 241, 199, 31, 224, 128, - 214, 154, 241, 199, 31, 226, 166, 241, 199, 31, 216, 197, 212, 13, 241, - 199, 31, 223, 48, 241, 199, 31, 216, 197, 250, 228, 241, 199, 31, 216, - 197, 254, 7, 216, 134, 241, 199, 31, 216, 197, 234, 185, 218, 136, 230, - 120, 241, 199, 31, 248, 40, 241, 199, 31, 216, 197, 231, 157, 231, 207, - 241, 199, 31, 255, 28, 241, 199, 31, 216, 197, 212, 54, 241, 199, 31, - 216, 197, 243, 54, 211, 239, 241, 199, 31, 216, 197, 235, 58, 233, 113, - 241, 199, 31, 247, 192, 241, 199, 31, 232, 226, 241, 199, 31, 235, 230, - 215, 188, 241, 199, 31, 4, 224, 200, 241, 199, 31, 254, 226, 249, 220, - 241, 199, 31, 252, 67, 249, 220, 8, 3, 235, 166, 8, 3, 235, 159, 8, 3, - 74, 8, 3, 235, 189, 8, 3, 236, 65, 8, 3, 236, 48, 8, 3, 236, 67, 8, 3, - 236, 66, 8, 3, 253, 214, 8, 3, 253, 177, 8, 3, 61, 8, 3, 254, 80, 8, 3, - 214, 164, 8, 3, 214, 167, 8, 3, 214, 165, 8, 3, 226, 144, 8, 3, 226, 118, - 8, 3, 78, 8, 3, 226, 179, 8, 3, 245, 43, 8, 3, 76, 8, 3, 211, 195, 8, 3, - 251, 236, 8, 3, 251, 233, 8, 3, 252, 14, 8, 3, 251, 246, 8, 3, 252, 3, 8, - 3, 252, 2, 8, 3, 252, 5, 8, 3, 252, 4, 8, 3, 252, 129, 8, 3, 252, 121, 8, - 3, 252, 199, 8, 3, 252, 150, 8, 3, 251, 109, 8, 3, 251, 113, 8, 3, 251, - 110, 8, 3, 251, 187, 8, 3, 251, 171, 8, 3, 251, 213, 8, 3, 251, 193, 8, - 3, 252, 29, 8, 3, 252, 83, 8, 3, 252, 41, 8, 3, 251, 95, 8, 3, 251, 92, - 8, 3, 251, 133, 8, 3, 251, 108, 8, 3, 251, 102, 8, 3, 251, 106, 8, 3, - 251, 80, 8, 3, 251, 78, 8, 3, 251, 85, 8, 3, 251, 83, 8, 3, 251, 81, 8, - 3, 251, 82, 8, 3, 225, 52, 8, 3, 225, 48, 8, 3, 225, 111, 8, 3, 225, 62, - 8, 3, 225, 78, 8, 3, 225, 105, 8, 3, 225, 101, 8, 3, 225, 244, 8, 3, 225, - 234, 8, 3, 191, 8, 3, 226, 25, 8, 3, 224, 138, 8, 3, 224, 140, 8, 3, 224, - 139, 8, 3, 224, 236, 8, 3, 224, 225, 8, 3, 225, 19, 8, 3, 224, 248, 8, 3, - 224, 124, 8, 3, 224, 120, 8, 3, 224, 153, 8, 3, 224, 137, 8, 3, 224, 129, - 8, 3, 224, 135, 8, 3, 224, 103, 8, 3, 224, 102, 8, 3, 224, 107, 8, 3, - 224, 106, 8, 3, 224, 104, 8, 3, 224, 105, 8, 3, 252, 104, 8, 3, 252, 103, - 8, 3, 252, 110, 8, 3, 252, 105, 8, 3, 252, 107, 8, 3, 252, 106, 8, 3, - 252, 109, 8, 3, 252, 108, 8, 3, 252, 116, 8, 3, 252, 115, 8, 3, 252, 119, - 8, 3, 252, 117, 8, 3, 252, 95, 8, 3, 252, 97, 8, 3, 252, 96, 8, 3, 252, - 100, 8, 3, 252, 99, 8, 3, 252, 102, 8, 3, 252, 101, 8, 3, 252, 111, 8, 3, - 252, 114, 8, 3, 252, 112, 8, 3, 252, 91, 8, 3, 252, 90, 8, 3, 252, 98, 8, - 3, 252, 94, 8, 3, 252, 92, 8, 3, 252, 93, 8, 3, 252, 87, 8, 3, 252, 86, - 8, 3, 252, 89, 8, 3, 252, 88, 8, 3, 229, 174, 8, 3, 229, 173, 8, 3, 229, - 179, 8, 3, 229, 175, 8, 3, 229, 176, 8, 3, 229, 178, 8, 3, 229, 177, 8, - 3, 229, 182, 8, 3, 229, 181, 8, 3, 229, 184, 8, 3, 229, 183, 8, 3, 229, - 170, 8, 3, 229, 169, 8, 3, 229, 172, 8, 3, 229, 171, 8, 3, 229, 163, 8, - 3, 229, 162, 8, 3, 229, 167, 8, 3, 229, 166, 8, 3, 229, 164, 8, 3, 229, - 165, 8, 3, 229, 157, 8, 3, 229, 156, 8, 3, 229, 161, 8, 3, 229, 160, 8, - 3, 229, 158, 8, 3, 229, 159, 8, 3, 241, 117, 8, 3, 241, 116, 8, 3, 241, - 122, 8, 3, 241, 118, 8, 3, 241, 119, 8, 3, 241, 121, 8, 3, 241, 120, 8, - 3, 241, 125, 8, 3, 241, 124, 8, 3, 241, 127, 8, 3, 241, 126, 8, 3, 241, - 108, 8, 3, 241, 110, 8, 3, 241, 109, 8, 3, 241, 113, 8, 3, 241, 112, 8, - 3, 241, 115, 8, 3, 241, 114, 8, 3, 241, 104, 8, 3, 241, 103, 8, 3, 241, - 111, 8, 3, 241, 107, 8, 3, 241, 105, 8, 3, 241, 106, 8, 3, 241, 98, 8, 3, - 241, 102, 8, 3, 241, 101, 8, 3, 241, 99, 8, 3, 241, 100, 8, 3, 230, 177, - 8, 3, 230, 176, 8, 3, 230, 235, 8, 3, 230, 183, 8, 3, 230, 208, 8, 3, - 230, 226, 8, 3, 230, 224, 8, 3, 231, 144, 8, 3, 231, 139, 8, 3, 186, 8, - 3, 231, 177, 8, 3, 230, 79, 8, 3, 230, 78, 8, 3, 230, 82, 8, 3, 230, 80, - 8, 3, 230, 126, 8, 3, 230, 112, 8, 3, 230, 166, 8, 3, 230, 131, 8, 3, - 231, 31, 8, 3, 231, 96, 8, 3, 230, 60, 8, 3, 230, 56, 8, 3, 230, 107, 8, - 3, 230, 75, 8, 3, 230, 68, 8, 3, 230, 73, 8, 3, 230, 33, 8, 3, 230, 32, - 8, 3, 230, 38, 8, 3, 230, 35, 8, 3, 244, 91, 8, 3, 244, 86, 8, 3, 244, - 129, 8, 3, 244, 106, 8, 3, 244, 175, 8, 3, 244, 166, 8, 3, 244, 204, 8, - 3, 244, 178, 8, 3, 244, 11, 8, 3, 244, 51, 8, 3, 244, 35, 8, 3, 243, 225, - 8, 3, 243, 224, 8, 3, 243, 241, 8, 3, 243, 230, 8, 3, 243, 228, 8, 3, - 243, 229, 8, 3, 243, 212, 8, 3, 243, 211, 8, 3, 243, 215, 8, 3, 243, 213, - 8, 3, 213, 144, 8, 3, 213, 139, 8, 3, 213, 176, 8, 3, 213, 153, 8, 3, - 213, 166, 8, 3, 213, 163, 8, 3, 213, 168, 8, 3, 213, 167, 8, 3, 214, 7, - 8, 3, 214, 2, 8, 3, 214, 27, 8, 3, 214, 18, 8, 3, 213, 125, 8, 3, 213, - 121, 8, 3, 213, 138, 8, 3, 213, 126, 8, 3, 213, 178, 8, 3, 213, 244, 8, - 3, 212, 110, 8, 3, 212, 108, 8, 3, 212, 116, 8, 3, 212, 113, 8, 3, 212, - 111, 8, 3, 212, 112, 8, 3, 212, 102, 8, 3, 212, 101, 8, 3, 212, 106, 8, - 3, 212, 105, 8, 3, 212, 103, 8, 3, 212, 104, 8, 3, 247, 186, 8, 3, 247, - 174, 8, 3, 248, 11, 8, 3, 247, 211, 8, 3, 247, 244, 8, 3, 247, 248, 8, 3, - 247, 247, 8, 3, 248, 160, 8, 3, 248, 155, 8, 3, 248, 229, 8, 3, 248, 180, - 8, 3, 246, 70, 8, 3, 246, 71, 8, 3, 247, 128, 8, 3, 246, 110, 8, 3, 247, - 153, 8, 3, 247, 130, 8, 3, 248, 38, 8, 3, 248, 98, 8, 3, 248, 53, 8, 3, - 246, 61, 8, 3, 246, 59, 8, 3, 246, 86, 8, 3, 246, 69, 8, 3, 246, 64, 8, - 3, 246, 67, 8, 3, 216, 68, 8, 3, 216, 62, 8, 3, 216, 118, 8, 3, 216, 77, - 8, 3, 216, 110, 8, 3, 216, 112, 8, 3, 216, 111, 8, 3, 217, 47, 8, 3, 217, - 34, 8, 3, 217, 106, 8, 3, 217, 55, 8, 3, 215, 103, 8, 3, 215, 102, 8, 3, - 215, 105, 8, 3, 215, 104, 8, 3, 216, 6, 8, 3, 216, 2, 8, 3, 112, 8, 3, - 216, 14, 8, 3, 216, 214, 8, 3, 217, 23, 8, 3, 216, 238, 8, 3, 215, 88, 8, - 3, 215, 83, 8, 3, 215, 119, 8, 3, 215, 101, 8, 3, 215, 89, 8, 3, 215, 99, - 8, 3, 248, 115, 8, 3, 248, 114, 8, 3, 248, 120, 8, 3, 248, 116, 8, 3, - 248, 117, 8, 3, 248, 119, 8, 3, 248, 118, 8, 3, 248, 136, 8, 3, 248, 135, - 8, 3, 248, 143, 8, 3, 248, 137, 8, 3, 248, 105, 8, 3, 248, 107, 8, 3, - 248, 106, 8, 3, 248, 110, 8, 3, 248, 109, 8, 3, 248, 113, 8, 3, 248, 111, - 8, 3, 248, 128, 8, 3, 248, 131, 8, 3, 248, 129, 8, 3, 248, 101, 8, 3, - 248, 100, 8, 3, 248, 108, 8, 3, 248, 104, 8, 3, 248, 102, 8, 3, 248, 103, - 8, 3, 229, 131, 8, 3, 229, 130, 8, 3, 229, 138, 8, 3, 229, 133, 8, 3, - 229, 134, 8, 3, 229, 135, 8, 3, 229, 147, 8, 3, 229, 146, 8, 3, 229, 153, - 8, 3, 229, 148, 8, 3, 229, 123, 8, 3, 229, 122, 8, 3, 229, 129, 8, 3, - 229, 124, 8, 3, 229, 139, 8, 3, 229, 145, 8, 3, 229, 143, 8, 3, 229, 115, - 8, 3, 229, 114, 8, 3, 229, 120, 8, 3, 229, 118, 8, 3, 229, 116, 8, 3, - 229, 117, 8, 3, 241, 84, 8, 3, 241, 83, 8, 3, 241, 90, 8, 3, 241, 85, 8, - 3, 241, 87, 8, 3, 241, 86, 8, 3, 241, 89, 8, 3, 241, 88, 8, 3, 241, 95, - 8, 3, 241, 94, 8, 3, 241, 97, 8, 3, 241, 96, 8, 3, 241, 78, 8, 3, 241, - 79, 8, 3, 241, 81, 8, 3, 241, 80, 8, 3, 241, 82, 8, 3, 241, 91, 8, 3, - 241, 93, 8, 3, 241, 92, 8, 3, 241, 77, 8, 3, 228, 194, 8, 3, 228, 192, 8, - 3, 228, 238, 8, 3, 228, 197, 8, 3, 228, 220, 8, 3, 228, 234, 8, 3, 228, - 233, 8, 3, 229, 188, 8, 3, 198, 8, 3, 229, 202, 8, 3, 227, 190, 8, 3, - 227, 192, 8, 3, 227, 191, 8, 3, 228, 56, 8, 3, 228, 43, 8, 3, 228, 79, 8, - 3, 228, 65, 8, 3, 229, 88, 8, 3, 229, 112, 8, 3, 229, 99, 8, 3, 227, 185, - 8, 3, 227, 181, 8, 3, 227, 242, 8, 3, 227, 189, 8, 3, 227, 187, 8, 3, - 227, 188, 8, 3, 241, 148, 8, 3, 241, 147, 8, 3, 241, 153, 8, 3, 241, 149, - 8, 3, 241, 150, 8, 3, 241, 152, 8, 3, 241, 151, 8, 3, 241, 158, 8, 3, - 241, 157, 8, 3, 241, 160, 8, 3, 241, 159, 8, 3, 241, 140, 8, 3, 241, 142, - 8, 3, 241, 141, 8, 3, 241, 144, 8, 3, 241, 146, 8, 3, 241, 145, 8, 3, - 241, 154, 8, 3, 241, 156, 8, 3, 241, 155, 8, 3, 241, 136, 8, 3, 241, 135, - 8, 3, 241, 143, 8, 3, 241, 139, 8, 3, 241, 137, 8, 3, 241, 138, 8, 3, - 241, 130, 8, 3, 241, 129, 8, 3, 241, 134, 8, 3, 241, 133, 8, 3, 241, 131, - 8, 3, 241, 132, 8, 3, 232, 201, 8, 3, 232, 195, 8, 3, 232, 247, 8, 3, - 232, 208, 8, 3, 232, 239, 8, 3, 232, 238, 8, 3, 232, 242, 8, 3, 232, 240, - 8, 3, 233, 85, 8, 3, 233, 75, 8, 3, 233, 141, 8, 3, 233, 94, 8, 3, 232, - 84, 8, 3, 232, 83, 8, 3, 232, 86, 8, 3, 232, 85, 8, 3, 232, 122, 8, 3, - 232, 112, 8, 3, 232, 162, 8, 3, 232, 126, 8, 3, 233, 8, 8, 3, 233, 64, 8, - 3, 233, 23, 8, 3, 232, 79, 8, 3, 232, 77, 8, 3, 232, 103, 8, 3, 232, 82, - 8, 3, 232, 80, 8, 3, 232, 81, 8, 3, 232, 59, 8, 3, 232, 58, 8, 3, 232, - 67, 8, 3, 232, 62, 8, 3, 232, 60, 8, 3, 232, 61, 8, 3, 242, 196, 8, 3, - 242, 195, 8, 3, 242, 221, 8, 3, 242, 206, 8, 3, 242, 213, 8, 3, 242, 212, - 8, 3, 242, 215, 8, 3, 242, 214, 8, 3, 243, 96, 8, 3, 243, 91, 8, 3, 243, - 142, 8, 3, 243, 106, 8, 3, 242, 98, 8, 3, 242, 97, 8, 3, 242, 100, 8, 3, - 242, 99, 8, 3, 242, 161, 8, 3, 242, 159, 8, 3, 242, 181, 8, 3, 242, 169, - 8, 3, 243, 40, 8, 3, 243, 38, 8, 3, 243, 69, 8, 3, 243, 51, 8, 3, 242, - 88, 8, 3, 242, 87, 8, 3, 242, 120, 8, 3, 242, 96, 8, 3, 242, 89, 8, 3, - 242, 95, 8, 3, 234, 67, 8, 3, 234, 66, 8, 3, 234, 98, 8, 3, 234, 81, 8, - 3, 234, 91, 8, 3, 234, 94, 8, 3, 234, 92, 8, 3, 234, 208, 8, 3, 234, 196, - 8, 3, 176, 8, 3, 234, 234, 8, 3, 233, 206, 8, 3, 233, 211, 8, 3, 233, - 208, 8, 3, 234, 6, 8, 3, 234, 2, 8, 3, 234, 34, 8, 3, 234, 13, 8, 3, 234, - 162, 8, 3, 234, 146, 8, 3, 234, 188, 8, 3, 234, 165, 8, 3, 233, 195, 8, - 3, 233, 192, 8, 3, 233, 223, 8, 3, 233, 205, 8, 3, 233, 198, 8, 3, 233, - 202, 8, 3, 243, 22, 8, 3, 243, 21, 8, 3, 243, 26, 8, 3, 243, 23, 8, 3, - 243, 25, 8, 3, 243, 24, 8, 3, 243, 33, 8, 3, 243, 32, 8, 3, 243, 36, 8, - 3, 243, 34, 8, 3, 243, 13, 8, 3, 243, 12, 8, 3, 243, 15, 8, 3, 243, 14, - 8, 3, 243, 18, 8, 3, 243, 17, 8, 3, 243, 20, 8, 3, 243, 19, 8, 3, 243, - 28, 8, 3, 243, 27, 8, 3, 243, 31, 8, 3, 243, 29, 8, 3, 243, 8, 8, 3, 243, - 7, 8, 3, 243, 16, 8, 3, 243, 11, 8, 3, 243, 9, 8, 3, 243, 10, 8, 3, 230, - 254, 8, 3, 230, 255, 8, 3, 231, 17, 8, 3, 231, 16, 8, 3, 231, 19, 8, 3, - 231, 18, 8, 3, 230, 245, 8, 3, 230, 247, 8, 3, 230, 246, 8, 3, 230, 250, - 8, 3, 230, 249, 8, 3, 230, 252, 8, 3, 230, 251, 8, 3, 231, 0, 8, 3, 231, - 2, 8, 3, 231, 1, 8, 3, 230, 241, 8, 3, 230, 240, 8, 3, 230, 248, 8, 3, - 230, 244, 8, 3, 230, 242, 8, 3, 230, 243, 8, 3, 240, 187, 8, 3, 240, 186, - 8, 3, 240, 193, 8, 3, 240, 188, 8, 3, 240, 190, 8, 3, 240, 189, 8, 3, - 240, 192, 8, 3, 240, 191, 8, 3, 240, 198, 8, 3, 240, 197, 8, 3, 240, 200, - 8, 3, 240, 199, 8, 3, 240, 179, 8, 3, 240, 178, 8, 3, 240, 181, 8, 3, - 240, 180, 8, 3, 240, 183, 8, 3, 240, 182, 8, 3, 240, 185, 8, 3, 240, 184, - 8, 3, 240, 194, 8, 3, 240, 196, 8, 3, 240, 195, 8, 3, 229, 29, 8, 3, 229, - 31, 8, 3, 229, 30, 8, 3, 229, 72, 8, 3, 229, 70, 8, 3, 229, 82, 8, 3, - 229, 75, 8, 3, 228, 248, 8, 3, 228, 247, 8, 3, 228, 249, 8, 3, 229, 1, 8, - 3, 228, 254, 8, 3, 229, 9, 8, 3, 229, 3, 8, 3, 229, 63, 8, 3, 229, 69, 8, - 3, 229, 65, 8, 3, 241, 163, 8, 3, 241, 173, 8, 3, 241, 182, 8, 3, 242, 2, - 8, 3, 241, 250, 8, 3, 162, 8, 3, 242, 13, 8, 3, 240, 213, 8, 3, 240, 212, - 8, 3, 240, 215, 8, 3, 240, 214, 8, 3, 240, 249, 8, 3, 240, 240, 8, 3, - 241, 75, 8, 3, 241, 54, 8, 3, 241, 201, 8, 3, 241, 245, 8, 3, 241, 213, - 8, 3, 212, 43, 8, 3, 212, 28, 8, 3, 212, 65, 8, 3, 212, 51, 8, 3, 211, - 185, 8, 3, 211, 187, 8, 3, 211, 186, 8, 3, 211, 203, 8, 3, 211, 227, 8, - 3, 211, 210, 8, 3, 212, 5, 8, 3, 212, 22, 8, 3, 212, 10, 8, 3, 210, 30, - 8, 3, 210, 29, 8, 3, 210, 44, 8, 3, 210, 32, 8, 3, 210, 37, 8, 3, 210, - 39, 8, 3, 210, 38, 8, 3, 210, 102, 8, 3, 210, 99, 8, 3, 210, 116, 8, 3, - 210, 105, 8, 3, 210, 6, 8, 3, 210, 8, 8, 3, 210, 7, 8, 3, 210, 19, 8, 3, - 210, 18, 8, 3, 210, 23, 8, 3, 210, 20, 8, 3, 210, 84, 8, 3, 210, 94, 8, - 3, 210, 88, 8, 3, 210, 2, 8, 3, 210, 1, 8, 3, 210, 13, 8, 3, 210, 5, 8, - 3, 210, 3, 8, 3, 210, 4, 8, 3, 209, 245, 8, 3, 209, 244, 8, 3, 209, 250, - 8, 3, 209, 248, 8, 3, 209, 246, 8, 3, 209, 247, 8, 3, 250, 36, 8, 3, 250, - 32, 8, 3, 250, 59, 8, 3, 250, 45, 8, 3, 250, 56, 8, 3, 250, 50, 8, 3, - 250, 58, 8, 3, 250, 57, 8, 3, 250, 232, 8, 3, 250, 225, 8, 3, 251, 41, 8, - 3, 251, 3, 8, 3, 249, 112, 8, 3, 249, 114, 8, 3, 249, 113, 8, 3, 249, - 161, 8, 3, 249, 152, 8, 3, 249, 246, 8, 3, 249, 177, 8, 3, 250, 168, 8, - 3, 250, 198, 8, 3, 250, 173, 8, 3, 249, 92, 8, 3, 249, 90, 8, 3, 249, - 120, 8, 3, 249, 110, 8, 3, 249, 97, 8, 3, 249, 109, 8, 3, 249, 71, 8, 3, - 249, 70, 8, 3, 249, 81, 8, 3, 249, 77, 8, 3, 249, 72, 8, 3, 249, 74, 8, - 3, 209, 228, 8, 3, 209, 227, 8, 3, 209, 234, 8, 3, 209, 229, 8, 3, 209, - 231, 8, 3, 209, 230, 8, 3, 209, 233, 8, 3, 209, 232, 8, 3, 209, 240, 8, - 3, 209, 239, 8, 3, 209, 243, 8, 3, 209, 241, 8, 3, 209, 224, 8, 3, 209, - 226, 8, 3, 209, 225, 8, 3, 209, 235, 8, 3, 209, 238, 8, 3, 209, 236, 8, - 3, 209, 217, 8, 3, 209, 221, 8, 3, 209, 220, 8, 3, 209, 218, 8, 3, 209, - 219, 8, 3, 209, 211, 8, 3, 209, 210, 8, 3, 209, 216, 8, 3, 209, 214, 8, - 3, 209, 212, 8, 3, 209, 213, 8, 3, 227, 108, 8, 3, 227, 107, 8, 3, 227, - 113, 8, 3, 227, 109, 8, 3, 227, 110, 8, 3, 227, 112, 8, 3, 227, 111, 8, - 3, 227, 118, 8, 3, 227, 117, 8, 3, 227, 121, 8, 3, 227, 120, 8, 3, 227, - 101, 8, 3, 227, 102, 8, 3, 227, 105, 8, 3, 227, 106, 8, 3, 227, 114, 8, - 3, 227, 116, 8, 3, 227, 96, 8, 3, 227, 104, 8, 3, 227, 100, 8, 3, 227, - 97, 8, 3, 227, 98, 8, 3, 227, 91, 8, 3, 227, 90, 8, 3, 227, 95, 8, 3, - 227, 94, 8, 3, 227, 92, 8, 3, 227, 93, 8, 3, 219, 129, 8, 3, 195, 8, 3, - 219, 193, 8, 3, 219, 132, 8, 3, 219, 185, 8, 3, 219, 188, 8, 3, 219, 186, - 8, 3, 221, 228, 8, 3, 221, 216, 8, 3, 206, 8, 3, 221, 236, 8, 3, 218, 29, - 8, 3, 218, 31, 8, 3, 218, 30, 8, 3, 219, 36, 8, 3, 219, 25, 8, 3, 219, - 60, 8, 3, 219, 40, 8, 3, 220, 116, 8, 3, 221, 183, 8, 3, 220, 141, 8, 3, - 218, 6, 8, 3, 218, 4, 8, 3, 218, 84, 8, 3, 218, 28, 8, 3, 218, 10, 8, 3, - 218, 18, 8, 3, 217, 167, 8, 3, 217, 166, 8, 3, 217, 233, 8, 3, 217, 174, - 8, 3, 217, 169, 8, 3, 217, 173, 8, 3, 218, 188, 8, 3, 218, 187, 8, 3, - 218, 194, 8, 3, 218, 189, 8, 3, 218, 191, 8, 3, 218, 193, 8, 3, 218, 192, - 8, 3, 218, 202, 8, 3, 218, 200, 8, 3, 218, 225, 8, 3, 218, 203, 8, 3, - 218, 183, 8, 3, 218, 182, 8, 3, 218, 186, 8, 3, 218, 184, 8, 3, 218, 196, - 8, 3, 218, 199, 8, 3, 218, 197, 8, 3, 218, 179, 8, 3, 218, 177, 8, 3, - 218, 181, 8, 3, 218, 180, 8, 3, 218, 172, 8, 3, 218, 171, 8, 3, 218, 176, - 8, 3, 218, 175, 8, 3, 218, 173, 8, 3, 218, 174, 8, 3, 210, 77, 8, 3, 210, - 76, 8, 3, 210, 82, 8, 3, 210, 79, 8, 3, 210, 59, 8, 3, 210, 61, 8, 3, - 210, 60, 8, 3, 210, 64, 8, 3, 210, 63, 8, 3, 210, 67, 8, 3, 210, 65, 8, - 3, 210, 71, 8, 3, 210, 70, 8, 3, 210, 74, 8, 3, 210, 72, 8, 3, 210, 55, - 8, 3, 210, 54, 8, 3, 210, 62, 8, 3, 210, 58, 8, 3, 210, 56, 8, 3, 210, - 57, 8, 3, 210, 47, 8, 3, 210, 46, 8, 3, 210, 51, 8, 3, 210, 50, 8, 3, - 210, 48, 8, 3, 210, 49, 8, 3, 250, 144, 8, 3, 250, 141, 8, 3, 250, 165, - 8, 3, 250, 152, 8, 3, 250, 73, 8, 3, 250, 72, 8, 3, 250, 75, 8, 3, 250, - 74, 8, 3, 250, 87, 8, 3, 250, 86, 8, 3, 250, 94, 8, 3, 250, 89, 8, 3, - 250, 123, 8, 3, 250, 121, 8, 3, 250, 139, 8, 3, 250, 129, 8, 3, 250, 67, - 8, 3, 250, 77, 8, 3, 250, 71, 8, 3, 250, 68, 8, 3, 250, 70, 8, 3, 250, - 61, 8, 3, 250, 60, 8, 3, 250, 65, 8, 3, 250, 64, 8, 3, 250, 62, 8, 3, - 250, 63, 8, 3, 222, 177, 8, 3, 222, 181, 8, 3, 222, 160, 8, 3, 222, 161, - 8, 3, 222, 164, 8, 3, 222, 163, 8, 3, 222, 167, 8, 3, 222, 165, 8, 3, - 222, 171, 8, 3, 222, 170, 8, 3, 222, 176, 8, 3, 222, 172, 8, 3, 222, 156, - 8, 3, 222, 154, 8, 3, 222, 162, 8, 3, 222, 159, 8, 3, 222, 157, 8, 3, - 222, 158, 8, 3, 222, 149, 8, 3, 222, 148, 8, 3, 222, 153, 8, 3, 222, 152, - 8, 3, 222, 150, 8, 3, 222, 151, 8, 3, 228, 39, 8, 3, 228, 38, 8, 3, 228, - 41, 8, 3, 228, 40, 8, 3, 228, 31, 8, 3, 228, 33, 8, 3, 228, 32, 8, 3, - 228, 35, 8, 3, 228, 34, 8, 3, 228, 37, 8, 3, 228, 36, 8, 3, 228, 26, 8, - 3, 228, 25, 8, 3, 228, 30, 8, 3, 228, 29, 8, 3, 228, 27, 8, 3, 228, 28, - 8, 3, 228, 20, 8, 3, 228, 19, 8, 3, 228, 24, 8, 3, 228, 23, 8, 3, 228, - 21, 8, 3, 228, 22, 8, 3, 220, 74, 8, 3, 220, 69, 8, 3, 220, 104, 8, 3, - 220, 85, 8, 3, 219, 217, 8, 3, 219, 219, 8, 3, 219, 218, 8, 3, 219, 238, - 8, 3, 219, 235, 8, 3, 220, 9, 8, 3, 220, 0, 8, 3, 220, 44, 8, 3, 220, 37, - 8, 3, 220, 65, 8, 3, 220, 52, 8, 3, 219, 213, 8, 3, 219, 211, 8, 3, 219, - 227, 8, 3, 219, 216, 8, 3, 219, 214, 8, 3, 219, 215, 8, 3, 219, 196, 8, - 3, 219, 195, 8, 3, 219, 202, 8, 3, 219, 199, 8, 3, 219, 197, 8, 3, 219, - 198, 8, 3, 223, 144, 8, 3, 223, 138, 8, 3, 205, 8, 3, 223, 150, 8, 3, - 222, 122, 8, 3, 222, 124, 8, 3, 222, 123, 8, 3, 222, 190, 8, 3, 222, 183, - 8, 3, 222, 213, 8, 3, 222, 194, 8, 3, 223, 46, 8, 3, 223, 131, 8, 3, 223, - 84, 8, 3, 222, 115, 8, 3, 222, 112, 8, 3, 222, 142, 8, 3, 222, 121, 8, 3, - 222, 117, 8, 3, 222, 118, 8, 3, 222, 97, 8, 3, 222, 96, 8, 3, 222, 102, - 8, 3, 222, 100, 8, 3, 222, 98, 8, 3, 222, 99, 8, 3, 235, 104, 8, 3, 235, - 103, 8, 3, 235, 114, 8, 3, 235, 105, 8, 3, 235, 110, 8, 3, 235, 109, 8, - 3, 235, 112, 8, 3, 235, 111, 8, 3, 235, 47, 8, 3, 235, 46, 8, 3, 235, 49, - 8, 3, 235, 48, 8, 3, 235, 62, 8, 3, 235, 60, 8, 3, 235, 74, 8, 3, 235, - 64, 8, 3, 235, 40, 8, 3, 235, 38, 8, 3, 235, 57, 8, 3, 235, 45, 8, 3, - 235, 42, 8, 3, 235, 43, 8, 3, 235, 32, 8, 3, 235, 31, 8, 3, 235, 36, 8, - 3, 235, 35, 8, 3, 235, 33, 8, 3, 235, 34, 8, 3, 224, 49, 8, 3, 224, 47, - 8, 3, 224, 56, 8, 3, 224, 50, 8, 3, 224, 53, 8, 3, 224, 52, 8, 3, 224, - 55, 8, 3, 224, 54, 8, 3, 224, 2, 8, 3, 223, 255, 8, 3, 224, 4, 8, 3, 224, - 3, 8, 3, 224, 36, 8, 3, 224, 35, 8, 3, 224, 45, 8, 3, 224, 39, 8, 3, 223, - 250, 8, 3, 223, 246, 8, 3, 224, 33, 8, 3, 223, 254, 8, 3, 223, 252, 8, 3, - 223, 253, 8, 3, 223, 230, 8, 3, 223, 228, 8, 3, 223, 240, 8, 3, 223, 233, - 8, 3, 223, 231, 8, 3, 223, 232, 8, 3, 235, 93, 8, 3, 235, 92, 8, 3, 235, - 99, 8, 3, 235, 94, 8, 3, 235, 96, 8, 3, 235, 95, 8, 3, 235, 98, 8, 3, - 235, 97, 8, 3, 235, 84, 8, 3, 235, 86, 8, 3, 235, 85, 8, 3, 235, 89, 8, - 3, 235, 88, 8, 3, 235, 91, 8, 3, 235, 90, 8, 3, 235, 80, 8, 3, 235, 79, - 8, 3, 235, 87, 8, 3, 235, 83, 8, 3, 235, 81, 8, 3, 235, 82, 8, 3, 235, - 76, 8, 3, 235, 75, 8, 3, 235, 78, 8, 3, 235, 77, 8, 3, 228, 167, 8, 3, - 228, 166, 8, 3, 228, 174, 8, 3, 228, 168, 8, 3, 228, 170, 8, 3, 228, 169, - 8, 3, 228, 173, 8, 3, 228, 171, 8, 3, 228, 156, 8, 3, 228, 157, 8, 3, - 228, 162, 8, 3, 228, 161, 8, 3, 228, 165, 8, 3, 228, 163, 8, 3, 228, 151, - 8, 3, 228, 160, 8, 3, 228, 155, 8, 3, 228, 152, 8, 3, 228, 153, 8, 3, - 228, 146, 8, 3, 228, 145, 8, 3, 228, 150, 8, 3, 228, 149, 8, 3, 228, 147, - 8, 3, 228, 148, 8, 3, 227, 141, 8, 3, 227, 140, 8, 3, 227, 152, 8, 3, - 227, 145, 8, 3, 227, 149, 8, 3, 227, 148, 8, 3, 227, 151, 8, 3, 227, 150, - 8, 3, 227, 128, 8, 3, 227, 130, 8, 3, 227, 129, 8, 3, 227, 134, 8, 3, - 227, 133, 8, 3, 227, 138, 8, 3, 227, 135, 8, 3, 227, 126, 8, 3, 227, 124, - 8, 3, 227, 132, 8, 3, 227, 127, 8, 3, 211, 150, 8, 3, 211, 149, 8, 3, - 211, 157, 8, 3, 211, 152, 8, 3, 211, 154, 8, 3, 211, 153, 8, 3, 211, 156, - 8, 3, 211, 155, 8, 3, 211, 139, 8, 3, 211, 140, 8, 3, 211, 144, 8, 3, - 211, 143, 8, 3, 211, 148, 8, 3, 211, 146, 8, 3, 211, 121, 8, 3, 211, 119, - 8, 3, 211, 131, 8, 3, 211, 124, 8, 3, 211, 122, 8, 3, 211, 123, 8, 3, - 210, 250, 8, 3, 210, 248, 8, 3, 211, 8, 8, 3, 210, 251, 8, 3, 211, 2, 8, - 3, 211, 1, 8, 3, 211, 5, 8, 3, 211, 3, 8, 3, 210, 191, 8, 3, 210, 190, 8, - 3, 210, 194, 8, 3, 210, 192, 8, 3, 210, 224, 8, 3, 210, 221, 8, 3, 210, - 244, 8, 3, 210, 228, 8, 3, 210, 182, 8, 3, 210, 178, 8, 3, 210, 212, 8, - 3, 210, 189, 8, 3, 210, 185, 8, 3, 210, 186, 8, 3, 210, 162, 8, 3, 210, - 161, 8, 3, 210, 169, 8, 3, 210, 165, 8, 3, 210, 163, 8, 3, 210, 164, 8, - 34, 224, 36, 8, 34, 232, 247, 8, 34, 234, 67, 8, 34, 227, 145, 8, 34, - 249, 77, 8, 34, 218, 194, 8, 34, 243, 19, 8, 34, 243, 51, 8, 34, 230, - 235, 8, 34, 240, 187, 8, 34, 232, 61, 8, 34, 252, 91, 8, 34, 230, 131, 8, - 34, 210, 244, 8, 34, 224, 124, 8, 34, 240, 181, 8, 34, 217, 47, 8, 34, - 243, 142, 8, 34, 210, 5, 8, 34, 249, 71, 8, 34, 248, 103, 8, 34, 251, - 106, 8, 34, 243, 15, 8, 34, 227, 135, 8, 34, 215, 119, 8, 34, 226, 179, - 8, 34, 235, 80, 8, 34, 210, 19, 8, 34, 224, 103, 8, 34, 241, 115, 8, 34, - 210, 250, 8, 34, 212, 112, 8, 34, 219, 202, 8, 34, 213, 244, 8, 34, 210, - 116, 8, 34, 235, 74, 8, 34, 227, 100, 8, 34, 235, 78, 8, 34, 242, 161, 8, - 34, 235, 98, 8, 34, 211, 227, 8, 34, 246, 86, 8, 34, 219, 215, 8, 34, - 232, 242, 8, 34, 249, 81, 8, 34, 249, 113, 8, 34, 250, 45, 8, 34, 240, - 184, 8, 34, 220, 74, 8, 34, 210, 4, 8, 34, 220, 0, 8, 34, 250, 139, 8, - 34, 209, 231, 8, 34, 229, 178, 8, 34, 234, 188, 232, 202, 1, 252, 199, - 232, 202, 1, 191, 232, 202, 1, 225, 150, 232, 202, 1, 248, 229, 232, 202, - 1, 217, 106, 232, 202, 1, 216, 209, 232, 202, 1, 243, 142, 232, 202, 1, - 176, 232, 202, 1, 234, 138, 232, 202, 1, 235, 147, 232, 202, 1, 251, 41, - 232, 202, 1, 250, 165, 232, 202, 1, 246, 46, 232, 202, 1, 215, 184, 232, - 202, 1, 215, 176, 232, 202, 1, 186, 232, 202, 1, 198, 232, 202, 1, 233, - 141, 232, 202, 1, 206, 232, 202, 1, 210, 82, 232, 202, 1, 210, 116, 232, - 202, 1, 229, 82, 232, 202, 1, 162, 232, 202, 1, 211, 165, 232, 202, 1, - 241, 196, 232, 202, 1, 244, 204, 232, 202, 1, 212, 65, 232, 202, 1, 220, - 104, 232, 202, 1, 192, 232, 202, 1, 243, 0, 232, 202, 1, 61, 232, 202, 1, - 254, 252, 232, 202, 1, 76, 232, 202, 1, 245, 63, 232, 202, 1, 74, 232, - 202, 1, 78, 232, 202, 1, 69, 232, 202, 1, 214, 214, 232, 202, 1, 214, - 208, 232, 202, 1, 226, 238, 232, 202, 1, 138, 230, 37, 216, 118, 232, - 202, 1, 138, 229, 234, 225, 19, 232, 202, 1, 138, 230, 37, 249, 80, 232, - 202, 1, 138, 230, 37, 251, 213, 232, 202, 1, 138, 230, 37, 198, 232, 202, - 1, 138, 230, 37, 235, 121, 232, 202, 224, 144, 249, 227, 232, 202, 224, - 144, 243, 236, 218, 131, 41, 3, 245, 217, 41, 3, 245, 213, 41, 3, 241, - 227, 41, 3, 212, 17, 41, 3, 212, 16, 41, 3, 225, 214, 41, 3, 252, 21, 41, - 3, 252, 74, 41, 3, 231, 121, 41, 3, 233, 253, 41, 3, 231, 11, 41, 3, 243, - 82, 41, 3, 244, 155, 41, 3, 213, 250, 41, 3, 217, 12, 41, 3, 216, 195, - 41, 3, 248, 24, 41, 3, 248, 21, 41, 3, 233, 56, 41, 3, 223, 111, 41, 3, - 248, 85, 41, 3, 229, 144, 41, 3, 221, 172, 41, 3, 220, 63, 41, 3, 210, - 92, 41, 3, 210, 73, 41, 3, 250, 190, 41, 3, 235, 130, 41, 3, 228, 181, - 41, 3, 211, 44, 41, 3, 234, 187, 41, 3, 229, 56, 41, 3, 243, 62, 41, 3, - 231, 85, 41, 3, 229, 108, 41, 3, 227, 159, 41, 3, 74, 41, 3, 236, 6, 41, - 3, 241, 187, 41, 3, 241, 167, 41, 3, 211, 250, 41, 3, 211, 241, 41, 3, - 225, 111, 41, 3, 252, 19, 41, 3, 252, 14, 41, 3, 231, 114, 41, 3, 233, - 250, 41, 3, 231, 8, 41, 3, 243, 78, 41, 3, 244, 129, 41, 3, 213, 176, 41, - 3, 216, 118, 41, 3, 216, 176, 41, 3, 248, 16, 41, 3, 248, 20, 41, 3, 232, - 247, 41, 3, 223, 38, 41, 3, 248, 11, 41, 3, 229, 138, 41, 3, 219, 193, - 41, 3, 220, 34, 41, 3, 210, 44, 41, 3, 210, 69, 41, 3, 250, 59, 41, 3, - 235, 114, 41, 3, 228, 174, 41, 3, 211, 8, 41, 3, 234, 98, 41, 3, 229, 48, - 41, 3, 242, 221, 41, 3, 230, 235, 41, 3, 228, 238, 41, 3, 227, 152, 41, - 3, 61, 41, 3, 254, 131, 41, 3, 229, 77, 41, 3, 162, 41, 3, 242, 25, 41, - 3, 212, 65, 41, 3, 212, 55, 41, 3, 191, 41, 3, 252, 26, 41, 3, 252, 199, - 41, 3, 231, 129, 41, 3, 234, 1, 41, 3, 234, 0, 41, 3, 231, 15, 41, 3, - 243, 86, 41, 3, 244, 204, 41, 3, 214, 27, 41, 3, 217, 106, 41, 3, 216, - 209, 41, 3, 248, 33, 41, 3, 248, 23, 41, 3, 233, 141, 41, 3, 205, 41, 3, - 248, 229, 41, 3, 229, 153, 41, 3, 206, 41, 3, 220, 104, 41, 3, 210, 116, - 41, 3, 210, 82, 41, 3, 251, 41, 41, 3, 235, 147, 41, 3, 228, 190, 41, 3, - 192, 41, 3, 176, 41, 3, 234, 240, 41, 3, 229, 61, 41, 3, 243, 142, 41, 3, - 186, 41, 3, 198, 41, 3, 227, 169, 41, 3, 226, 187, 41, 3, 226, 183, 41, - 3, 241, 60, 41, 3, 211, 215, 41, 3, 211, 211, 41, 3, 224, 252, 41, 3, - 252, 17, 41, 3, 251, 201, 41, 3, 231, 109, 41, 3, 233, 248, 41, 3, 231, - 4, 41, 3, 243, 74, 41, 3, 244, 42, 41, 3, 213, 127, 41, 3, 216, 18, 41, - 3, 216, 154, 41, 3, 248, 14, 41, 3, 248, 18, 41, 3, 232, 133, 41, 3, 222, - 199, 41, 3, 247, 133, 41, 3, 229, 125, 41, 3, 219, 42, 41, 3, 220, 3, 41, - 3, 210, 21, 41, 3, 210, 66, 41, 3, 249, 182, 41, 3, 235, 65, 41, 3, 228, - 164, 41, 3, 210, 229, 41, 3, 234, 16, 41, 3, 229, 46, 41, 3, 242, 171, - 41, 3, 230, 137, 41, 3, 228, 69, 41, 3, 227, 136, 41, 3, 69, 41, 3, 214, - 190, 41, 3, 240, 229, 41, 3, 240, 219, 41, 3, 211, 195, 41, 3, 211, 189, - 41, 3, 224, 153, 41, 3, 252, 16, 41, 3, 251, 133, 41, 3, 231, 108, 41, 3, - 233, 246, 41, 3, 231, 3, 41, 3, 243, 73, 41, 3, 243, 241, 41, 3, 212, - 116, 41, 3, 215, 119, 41, 3, 216, 137, 41, 3, 248, 12, 41, 3, 248, 17, - 41, 3, 232, 103, 41, 3, 222, 142, 41, 3, 246, 86, 41, 3, 229, 120, 41, 3, - 218, 84, 41, 3, 219, 227, 41, 3, 210, 13, 41, 3, 210, 62, 41, 3, 249, - 120, 41, 3, 235, 57, 41, 3, 228, 160, 41, 3, 210, 212, 41, 3, 233, 223, - 41, 3, 229, 45, 41, 3, 242, 120, 41, 3, 230, 107, 41, 3, 227, 242, 41, 3, - 227, 132, 41, 3, 78, 41, 3, 226, 200, 41, 3, 229, 5, 41, 3, 241, 75, 41, - 3, 241, 63, 41, 3, 211, 227, 41, 3, 211, 216, 41, 3, 225, 19, 41, 3, 252, - 18, 41, 3, 251, 213, 41, 3, 231, 110, 41, 3, 233, 249, 41, 3, 231, 6, 41, - 3, 243, 76, 41, 3, 243, 75, 41, 3, 244, 51, 41, 3, 213, 138, 41, 3, 112, - 41, 3, 216, 157, 41, 3, 248, 15, 41, 3, 248, 19, 41, 3, 232, 162, 41, 3, - 222, 213, 41, 3, 247, 153, 41, 3, 229, 129, 41, 3, 219, 60, 41, 3, 220, - 9, 41, 3, 210, 23, 41, 3, 210, 67, 41, 3, 249, 246, 41, 3, 235, 74, 41, - 3, 228, 165, 41, 3, 210, 244, 41, 3, 234, 34, 41, 3, 229, 47, 41, 3, 242, - 181, 41, 3, 230, 166, 41, 3, 228, 79, 41, 3, 227, 138, 41, 3, 76, 41, 3, - 245, 158, 41, 3, 229, 66, 41, 3, 241, 245, 41, 3, 241, 216, 41, 3, 212, - 22, 41, 3, 212, 12, 41, 3, 225, 224, 41, 3, 252, 22, 41, 3, 252, 83, 41, - 3, 231, 122, 41, 3, 233, 254, 41, 3, 233, 252, 41, 3, 231, 12, 41, 3, - 243, 83, 41, 3, 243, 81, 41, 3, 244, 162, 41, 3, 213, 255, 41, 3, 217, - 23, 41, 3, 216, 196, 41, 3, 248, 25, 41, 3, 248, 22, 41, 3, 233, 64, 41, - 3, 223, 131, 41, 3, 248, 98, 41, 3, 229, 145, 41, 3, 221, 183, 41, 3, - 220, 65, 41, 3, 210, 94, 41, 3, 210, 74, 41, 3, 250, 198, 41, 3, 235, - 132, 41, 3, 228, 183, 41, 3, 211, 47, 41, 3, 234, 188, 41, 3, 229, 57, - 41, 3, 229, 53, 41, 3, 243, 69, 41, 3, 243, 58, 41, 3, 231, 96, 41, 3, - 229, 112, 41, 3, 227, 160, 41, 3, 229, 84, 41, 3, 233, 28, 41, 249, 227, - 41, 243, 236, 218, 131, 41, 224, 16, 79, 41, 3, 229, 128, 244, 204, 41, - 3, 229, 128, 176, 41, 3, 229, 128, 219, 42, 41, 16, 244, 152, 41, 16, - 234, 186, 41, 16, 216, 82, 41, 16, 228, 213, 41, 16, 252, 155, 41, 16, - 244, 203, 41, 16, 217, 102, 41, 16, 248, 184, 41, 16, 247, 132, 41, 16, - 233, 212, 41, 16, 216, 22, 41, 16, 247, 152, 41, 16, 235, 66, 41, 21, - 210, 86, 41, 21, 111, 41, 21, 105, 41, 21, 158, 41, 21, 161, 41, 21, 190, - 41, 21, 195, 41, 21, 199, 41, 21, 196, 41, 21, 201, 41, 3, 229, 128, 186, - 41, 3, 229, 128, 247, 153, 33, 6, 1, 210, 90, 33, 4, 1, 210, 90, 33, 6, - 1, 246, 42, 33, 4, 1, 246, 42, 33, 6, 1, 223, 52, 246, 44, 33, 4, 1, 223, - 52, 246, 44, 33, 6, 1, 235, 192, 33, 4, 1, 235, 192, 33, 6, 1, 247, 169, - 33, 4, 1, 247, 169, 33, 6, 1, 230, 145, 214, 205, 33, 4, 1, 230, 145, - 214, 205, 33, 6, 1, 251, 144, 226, 205, 33, 4, 1, 251, 144, 226, 205, 33, - 6, 1, 229, 92, 211, 31, 33, 4, 1, 229, 92, 211, 31, 33, 6, 1, 211, 28, 2, - 252, 193, 211, 31, 33, 4, 1, 211, 28, 2, 252, 193, 211, 31, 33, 6, 1, - 235, 190, 211, 59, 33, 4, 1, 235, 190, 211, 59, 33, 6, 1, 223, 52, 210, - 212, 33, 4, 1, 223, 52, 210, 212, 33, 6, 1, 235, 190, 61, 33, 4, 1, 235, - 190, 61, 33, 6, 1, 250, 8, 232, 198, 210, 183, 33, 4, 1, 250, 8, 232, - 198, 210, 183, 33, 6, 1, 251, 222, 210, 183, 33, 4, 1, 251, 222, 210, - 183, 33, 6, 1, 235, 190, 250, 8, 232, 198, 210, 183, 33, 4, 1, 235, 190, - 250, 8, 232, 198, 210, 183, 33, 6, 1, 210, 246, 33, 4, 1, 210, 246, 33, - 6, 1, 223, 52, 215, 179, 33, 4, 1, 223, 52, 215, 179, 33, 6, 1, 219, 54, - 248, 98, 33, 4, 1, 219, 54, 248, 98, 33, 6, 1, 219, 54, 245, 182, 33, 4, - 1, 219, 54, 245, 182, 33, 6, 1, 219, 54, 245, 167, 33, 4, 1, 219, 54, - 245, 167, 33, 6, 1, 230, 149, 78, 33, 4, 1, 230, 149, 78, 33, 6, 1, 251, - 248, 78, 33, 4, 1, 251, 248, 78, 33, 6, 1, 52, 230, 149, 78, 33, 4, 1, - 52, 230, 149, 78, 33, 1, 230, 91, 78, 38, 33, 212, 100, 38, 33, 216, 249, - 230, 196, 50, 38, 33, 240, 218, 230, 196, 50, 38, 33, 216, 149, 230, 196, - 50, 219, 95, 253, 224, 38, 33, 1, 214, 202, 236, 67, 38, 33, 1, 74, 38, - 33, 1, 211, 8, 38, 33, 1, 69, 38, 33, 1, 242, 10, 50, 38, 33, 1, 211, 27, - 38, 33, 1, 219, 54, 50, 38, 33, 1, 226, 205, 38, 33, 234, 198, 38, 33, - 225, 231, 33, 234, 198, 33, 225, 231, 33, 6, 1, 246, 54, 33, 4, 1, 246, - 54, 33, 6, 1, 246, 35, 33, 4, 1, 246, 35, 33, 6, 1, 210, 52, 33, 4, 1, - 210, 52, 33, 6, 1, 250, 214, 33, 4, 1, 250, 214, 33, 6, 1, 246, 33, 33, - 4, 1, 246, 33, 33, 6, 1, 217, 24, 2, 230, 229, 103, 33, 4, 1, 217, 24, 2, - 230, 229, 103, 33, 6, 1, 215, 78, 33, 4, 1, 215, 78, 33, 6, 1, 215, 161, - 33, 4, 1, 215, 161, 33, 6, 1, 215, 165, 33, 4, 1, 215, 165, 33, 6, 1, - 217, 29, 33, 4, 1, 217, 29, 33, 6, 1, 240, 205, 33, 4, 1, 240, 205, 33, - 6, 1, 219, 208, 33, 4, 1, 219, 208, 38, 33, 1, 235, 190, 76, 20, 1, 61, - 20, 1, 176, 20, 1, 69, 20, 1, 233, 223, 20, 1, 245, 217, 20, 1, 223, 111, - 20, 1, 217, 87, 20, 1, 78, 20, 1, 227, 152, 20, 1, 74, 20, 1, 233, 141, - 20, 1, 191, 20, 1, 222, 242, 20, 1, 223, 32, 20, 1, 233, 55, 20, 1, 231, - 84, 20, 1, 217, 102, 20, 1, 229, 151, 20, 1, 228, 188, 20, 1, 194, 20, 1, - 218, 5, 20, 1, 230, 107, 20, 1, 220, 29, 20, 1, 219, 193, 20, 1, 220, 39, - 20, 1, 220, 125, 20, 1, 233, 161, 20, 1, 234, 162, 20, 1, 227, 213, 20, - 1, 227, 242, 20, 1, 228, 159, 20, 1, 210, 226, 20, 1, 219, 227, 20, 1, - 210, 187, 20, 1, 192, 20, 1, 228, 14, 20, 1, 234, 148, 20, 1, 225, 154, - 20, 1, 228, 181, 20, 1, 227, 251, 20, 1, 224, 147, 20, 1, 211, 192, 20, - 1, 225, 214, 20, 1, 244, 155, 20, 1, 222, 142, 20, 1, 232, 103, 20, 1, - 230, 235, 20, 1, 228, 238, 20, 1, 223, 54, 20, 1, 223, 174, 20, 1, 234, - 171, 20, 1, 229, 12, 20, 1, 229, 61, 20, 1, 229, 82, 20, 1, 220, 9, 20, - 1, 224, 150, 20, 1, 243, 241, 20, 1, 244, 45, 20, 1, 212, 65, 20, 1, 198, - 20, 1, 232, 247, 20, 1, 225, 111, 20, 1, 232, 125, 20, 1, 234, 34, 20, 1, - 231, 119, 20, 1, 223, 86, 20, 1, 231, 63, 20, 1, 186, 20, 1, 216, 118, - 20, 1, 234, 98, 20, 1, 230, 166, 20, 1, 231, 127, 20, 1, 216, 231, 20, 1, - 234, 1, 20, 1, 216, 248, 20, 1, 227, 243, 20, 1, 221, 253, 20, 1, 244, - 200, 20, 1, 234, 3, 20, 1, 234, 30, 20, 38, 164, 234, 11, 20, 38, 164, - 215, 111, 20, 228, 187, 20, 243, 236, 218, 131, 20, 249, 234, 20, 249, - 227, 20, 220, 152, 20, 224, 16, 79, 58, 1, 250, 104, 138, 210, 254, 225, - 64, 58, 1, 250, 104, 138, 211, 70, 225, 64, 58, 1, 250, 104, 138, 210, - 254, 220, 86, 58, 1, 250, 104, 138, 211, 70, 220, 86, 58, 1, 250, 104, - 138, 210, 254, 224, 33, 58, 1, 250, 104, 138, 211, 70, 224, 33, 58, 1, - 250, 104, 138, 210, 254, 222, 142, 58, 1, 250, 104, 138, 211, 70, 222, - 142, 58, 1, 245, 28, 246, 126, 138, 130, 58, 1, 125, 246, 126, 138, 130, - 58, 1, 230, 230, 246, 126, 138, 130, 58, 1, 121, 246, 126, 138, 130, 58, - 1, 245, 27, 246, 126, 138, 130, 58, 1, 245, 28, 246, 126, 233, 45, 138, - 130, 58, 1, 125, 246, 126, 233, 45, 138, 130, 58, 1, 230, 230, 246, 126, - 233, 45, 138, 130, 58, 1, 121, 246, 126, 233, 45, 138, 130, 58, 1, 245, - 27, 246, 126, 233, 45, 138, 130, 58, 1, 245, 28, 233, 45, 138, 130, 58, - 1, 125, 233, 45, 138, 130, 58, 1, 230, 230, 233, 45, 138, 130, 58, 1, - 121, 233, 45, 138, 130, 58, 1, 245, 27, 233, 45, 138, 130, 58, 1, 59, 67, - 130, 58, 1, 59, 219, 97, 58, 1, 59, 203, 130, 58, 1, 232, 114, 44, 249, - 169, 254, 117, 58, 1, 223, 160, 120, 75, 58, 1, 223, 160, 124, 75, 58, 1, - 223, 160, 245, 39, 79, 58, 1, 223, 160, 235, 200, 245, 39, 79, 58, 1, - 121, 235, 200, 245, 39, 79, 58, 1, 218, 113, 22, 125, 216, 31, 58, 1, - 218, 113, 22, 121, 216, 31, 7, 6, 1, 245, 207, 254, 179, 7, 4, 1, 245, - 207, 254, 179, 7, 6, 1, 245, 207, 254, 205, 7, 4, 1, 245, 207, 254, 205, - 7, 6, 1, 241, 214, 7, 4, 1, 241, 214, 7, 6, 1, 215, 40, 7, 4, 1, 215, 40, - 7, 6, 1, 215, 230, 7, 4, 1, 215, 230, 7, 6, 1, 249, 118, 7, 4, 1, 249, - 118, 7, 6, 1, 249, 119, 2, 249, 227, 7, 4, 1, 249, 119, 2, 249, 227, 7, - 1, 4, 6, 245, 14, 7, 1, 4, 6, 222, 93, 7, 6, 1, 255, 82, 7, 4, 1, 255, - 82, 7, 6, 1, 254, 81, 7, 4, 1, 254, 81, 7, 6, 1, 253, 200, 7, 4, 1, 253, - 200, 7, 6, 1, 253, 184, 7, 4, 1, 253, 184, 7, 6, 1, 253, 185, 2, 203, - 130, 7, 4, 1, 253, 185, 2, 203, 130, 7, 6, 1, 253, 175, 7, 4, 1, 253, - 175, 7, 6, 1, 223, 52, 251, 75, 2, 247, 128, 7, 4, 1, 223, 52, 251, 75, - 2, 247, 128, 7, 6, 1, 235, 30, 2, 91, 7, 4, 1, 235, 30, 2, 91, 7, 6, 1, - 235, 30, 2, 248, 7, 91, 7, 4, 1, 235, 30, 2, 248, 7, 91, 7, 6, 1, 235, - 30, 2, 218, 105, 22, 248, 7, 91, 7, 4, 1, 235, 30, 2, 218, 105, 22, 248, - 7, 91, 7, 6, 1, 251, 143, 156, 7, 4, 1, 251, 143, 156, 7, 6, 1, 233, 155, - 2, 125, 91, 7, 4, 1, 233, 155, 2, 125, 91, 7, 6, 1, 144, 2, 200, 218, - 105, 226, 124, 7, 4, 1, 144, 2, 200, 218, 105, 226, 124, 7, 6, 1, 144, 2, - 232, 129, 7, 4, 1, 144, 2, 232, 129, 7, 6, 1, 226, 187, 7, 4, 1, 226, - 187, 7, 6, 1, 226, 110, 2, 218, 105, 216, 140, 248, 47, 7, 4, 1, 226, - 110, 2, 218, 105, 216, 140, 248, 47, 7, 6, 1, 226, 110, 2, 244, 61, 7, 4, - 1, 226, 110, 2, 244, 61, 7, 6, 1, 226, 110, 2, 218, 231, 217, 78, 7, 4, - 1, 226, 110, 2, 218, 231, 217, 78, 7, 6, 1, 224, 100, 2, 218, 105, 216, - 140, 248, 47, 7, 4, 1, 224, 100, 2, 218, 105, 216, 140, 248, 47, 7, 6, 1, - 224, 100, 2, 248, 7, 91, 7, 4, 1, 224, 100, 2, 248, 7, 91, 7, 6, 1, 223, - 227, 222, 188, 7, 4, 1, 223, 227, 222, 188, 7, 6, 1, 222, 132, 222, 188, - 7, 4, 1, 222, 132, 222, 188, 7, 6, 1, 214, 106, 2, 248, 7, 91, 7, 4, 1, - 214, 106, 2, 248, 7, 91, 7, 6, 1, 212, 106, 7, 4, 1, 212, 106, 7, 6, 1, - 213, 145, 210, 159, 7, 4, 1, 213, 145, 210, 159, 7, 6, 1, 216, 153, 2, - 91, 7, 4, 1, 216, 153, 2, 91, 7, 6, 1, 216, 153, 2, 218, 105, 216, 140, - 248, 47, 7, 4, 1, 216, 153, 2, 218, 105, 216, 140, 248, 47, 7, 6, 1, 213, - 245, 7, 4, 1, 213, 245, 7, 6, 1, 245, 73, 7, 4, 1, 245, 73, 7, 6, 1, 235, - 178, 7, 4, 1, 235, 178, 7, 6, 1, 249, 215, 7, 4, 1, 249, 215, 58, 1, 214, - 133, 7, 4, 1, 246, 77, 7, 4, 1, 232, 89, 7, 4, 1, 230, 85, 7, 4, 1, 227, - 205, 7, 4, 1, 222, 131, 7, 1, 4, 6, 222, 131, 7, 4, 1, 215, 109, 7, 4, 1, - 214, 197, 7, 6, 1, 235, 220, 249, 68, 7, 4, 1, 235, 220, 249, 68, 7, 6, - 1, 235, 220, 245, 14, 7, 4, 1, 235, 220, 245, 14, 7, 6, 1, 235, 220, 243, - 209, 7, 6, 1, 215, 94, 235, 220, 243, 209, 7, 4, 1, 215, 94, 235, 220, - 243, 209, 7, 6, 1, 215, 94, 156, 7, 4, 1, 215, 94, 156, 7, 6, 1, 235, - 220, 153, 7, 4, 1, 235, 220, 153, 7, 6, 1, 235, 220, 222, 93, 7, 4, 1, - 235, 220, 222, 93, 7, 6, 1, 235, 220, 217, 153, 7, 4, 1, 235, 220, 217, - 153, 58, 1, 121, 250, 39, 255, 23, 58, 1, 249, 234, 58, 1, 219, 253, 245, - 106, 50, 7, 6, 1, 222, 1, 7, 4, 1, 222, 1, 7, 6, 1, 215, 94, 242, 67, 7, - 4, 1, 233, 155, 2, 223, 58, 241, 59, 22, 252, 49, 7, 6, 1, 230, 31, 2, - 248, 47, 7, 4, 1, 230, 31, 2, 248, 47, 7, 6, 1, 251, 75, 2, 130, 7, 4, 1, - 251, 75, 2, 130, 7, 6, 1, 243, 210, 2, 226, 252, 91, 7, 4, 1, 243, 210, - 2, 226, 252, 91, 7, 6, 1, 235, 30, 2, 226, 252, 91, 7, 4, 1, 235, 30, 2, - 226, 252, 91, 7, 6, 1, 230, 31, 2, 226, 252, 91, 7, 4, 1, 230, 31, 2, - 226, 252, 91, 7, 6, 1, 223, 227, 2, 226, 252, 91, 7, 4, 1, 223, 227, 2, - 226, 252, 91, 7, 6, 1, 222, 94, 2, 226, 252, 91, 7, 4, 1, 222, 94, 2, - 226, 252, 91, 7, 6, 1, 242, 68, 2, 103, 58, 1, 6, 242, 68, 2, 91, 58, 1, - 4, 27, 226, 238, 7, 1, 4, 6, 215, 94, 194, 7, 245, 111, 1, 223, 52, 245, - 14, 7, 245, 111, 1, 223, 52, 226, 109, 7, 245, 111, 1, 235, 200, 194, 7, - 245, 111, 1, 240, 161, 232, 135, 7, 245, 111, 1, 254, 31, 194, 217, 231, - 229, 219, 1, 61, 217, 231, 229, 219, 1, 74, 217, 231, 229, 219, 5, 246, - 56, 217, 231, 229, 219, 1, 69, 217, 231, 229, 219, 1, 76, 217, 231, 229, - 219, 1, 78, 217, 231, 229, 219, 5, 242, 4, 217, 231, 229, 219, 1, 234, - 34, 217, 231, 229, 219, 1, 234, 111, 217, 231, 229, 219, 1, 242, 181, - 217, 231, 229, 219, 1, 242, 231, 217, 231, 229, 219, 5, 254, 83, 217, - 231, 229, 219, 1, 249, 246, 217, 231, 229, 219, 1, 250, 94, 217, 231, - 229, 219, 1, 235, 74, 217, 231, 229, 219, 1, 235, 115, 217, 231, 229, - 219, 1, 215, 134, 217, 231, 229, 219, 1, 215, 140, 217, 231, 229, 219, 1, - 248, 113, 217, 231, 229, 219, 1, 248, 122, 217, 231, 229, 219, 1, 112, - 217, 231, 229, 219, 1, 216, 157, 217, 231, 229, 219, 1, 247, 153, 217, - 231, 229, 219, 1, 248, 15, 217, 231, 229, 219, 1, 228, 79, 217, 231, 229, - 219, 1, 225, 19, 217, 231, 229, 219, 1, 225, 124, 217, 231, 229, 219, 1, - 251, 213, 217, 231, 229, 219, 1, 252, 18, 217, 231, 229, 219, 1, 230, - 166, 217, 231, 229, 219, 1, 222, 213, 217, 231, 229, 219, 1, 232, 162, - 217, 231, 229, 219, 1, 222, 167, 217, 231, 229, 219, 1, 219, 60, 217, - 231, 229, 219, 1, 241, 75, 217, 231, 229, 219, 25, 5, 61, 217, 231, 229, - 219, 25, 5, 74, 217, 231, 229, 219, 25, 5, 69, 217, 231, 229, 219, 25, 5, - 76, 217, 231, 229, 219, 25, 5, 226, 187, 217, 231, 229, 219, 225, 15, - 231, 163, 217, 231, 229, 219, 225, 15, 231, 162, 217, 231, 229, 219, 225, - 15, 231, 161, 217, 231, 229, 219, 225, 15, 231, 160, 228, 61, 235, 247, - 244, 10, 123, 224, 24, 228, 61, 235, 247, 244, 10, 123, 242, 34, 228, 61, - 235, 247, 244, 10, 134, 224, 22, 228, 61, 235, 247, 244, 10, 123, 219, - 119, 228, 61, 235, 247, 244, 10, 123, 245, 196, 228, 61, 235, 247, 244, - 10, 134, 219, 118, 228, 61, 235, 247, 224, 25, 79, 228, 61, 235, 247, - 225, 43, 79, 228, 61, 235, 247, 222, 120, 79, 228, 61, 235, 247, 224, 26, - 79, 225, 147, 1, 176, 225, 147, 1, 234, 138, 225, 147, 1, 243, 142, 225, - 147, 1, 229, 82, 225, 147, 1, 251, 41, 225, 147, 1, 250, 165, 225, 147, - 1, 235, 147, 225, 147, 1, 227, 169, 225, 147, 1, 217, 106, 225, 147, 1, - 216, 209, 225, 147, 1, 248, 229, 225, 147, 1, 198, 225, 147, 1, 191, 225, - 147, 1, 225, 150, 225, 147, 1, 252, 199, 225, 147, 1, 186, 225, 147, 1, - 215, 184, 225, 147, 1, 215, 176, 225, 147, 1, 246, 46, 225, 147, 1, 212, - 65, 225, 147, 1, 210, 82, 225, 147, 1, 210, 116, 225, 147, 1, 4, 61, 225, - 147, 1, 192, 225, 147, 1, 205, 225, 147, 1, 233, 141, 225, 147, 1, 220, - 104, 225, 147, 1, 206, 225, 147, 1, 162, 225, 147, 1, 61, 225, 147, 1, - 74, 225, 147, 1, 69, 225, 147, 1, 76, 225, 147, 1, 78, 225, 147, 1, 224, - 91, 225, 147, 1, 211, 165, 225, 147, 1, 244, 204, 225, 147, 1, 243, 36, - 225, 147, 1, 245, 217, 225, 147, 218, 74, 1, 212, 65, 225, 147, 218, 74, - 1, 192, 225, 147, 1, 215, 157, 225, 147, 1, 215, 145, 225, 147, 1, 248, - 143, 225, 147, 1, 228, 115, 225, 147, 1, 254, 149, 192, 225, 147, 1, 213, - 134, 220, 104, 225, 147, 1, 213, 135, 162, 225, 147, 1, 253, 231, 244, - 204, 225, 147, 218, 74, 1, 205, 225, 147, 218, 26, 1, 205, 225, 147, 1, - 251, 7, 225, 147, 219, 157, 241, 243, 79, 225, 147, 52, 241, 243, 79, - 225, 147, 164, 220, 97, 225, 147, 164, 52, 220, 97, 179, 5, 254, 83, 179, - 5, 213, 147, 179, 1, 61, 179, 1, 255, 82, 179, 1, 74, 179, 1, 236, 40, - 179, 1, 69, 179, 1, 214, 118, 179, 1, 149, 153, 179, 1, 149, 222, 182, - 179, 1, 149, 156, 179, 1, 149, 232, 191, 179, 1, 76, 179, 1, 245, 217, - 179, 1, 254, 210, 179, 1, 78, 179, 1, 226, 187, 179, 1, 253, 200, 179, 1, - 176, 179, 1, 234, 138, 179, 1, 243, 142, 179, 1, 243, 0, 179, 1, 229, 82, - 179, 1, 251, 41, 179, 1, 250, 165, 179, 1, 235, 147, 179, 1, 235, 120, - 179, 1, 227, 169, 179, 1, 215, 157, 179, 1, 215, 145, 179, 1, 248, 143, - 179, 1, 248, 127, 179, 1, 228, 115, 179, 1, 217, 106, 179, 1, 216, 209, - 179, 1, 248, 229, 179, 1, 248, 33, 179, 1, 198, 179, 1, 191, 179, 1, 225, - 150, 179, 1, 252, 199, 179, 1, 252, 26, 179, 1, 186, 179, 1, 192, 179, 1, - 205, 179, 1, 233, 141, 179, 1, 214, 27, 179, 1, 220, 104, 179, 1, 218, - 225, 179, 1, 206, 179, 1, 162, 179, 1, 232, 190, 179, 117, 5, 242, 51, - 179, 25, 5, 255, 82, 179, 25, 5, 74, 179, 25, 5, 236, 40, 179, 25, 5, 69, - 179, 25, 5, 214, 118, 179, 25, 5, 149, 153, 179, 25, 5, 149, 222, 182, - 179, 25, 5, 149, 156, 179, 25, 5, 149, 232, 191, 179, 25, 5, 76, 179, 25, - 5, 245, 217, 179, 25, 5, 254, 210, 179, 25, 5, 78, 179, 25, 5, 226, 187, - 179, 25, 5, 253, 200, 179, 5, 213, 152, 179, 248, 186, 179, 52, 248, 186, - 179, 21, 210, 86, 179, 21, 111, 179, 21, 105, 179, 21, 158, 179, 21, 161, - 179, 21, 190, 179, 21, 195, 179, 21, 199, 179, 21, 196, 179, 21, 201, 38, - 84, 21, 210, 86, 38, 84, 21, 111, 38, 84, 21, 105, 38, 84, 21, 158, 38, - 84, 21, 161, 38, 84, 21, 190, 38, 84, 21, 195, 38, 84, 21, 199, 38, 84, - 21, 196, 38, 84, 21, 201, 38, 84, 1, 61, 38, 84, 1, 69, 38, 84, 1, 176, - 38, 84, 1, 198, 38, 84, 1, 191, 38, 84, 1, 205, 38, 84, 1, 213, 176, 38, - 84, 5, 253, 183, 84, 5, 219, 19, 251, 7, 84, 5, 251, 8, 213, 152, 84, 5, - 52, 251, 8, 213, 152, 84, 5, 251, 8, 105, 84, 5, 251, 8, 158, 84, 5, 251, - 8, 253, 183, 84, 5, 224, 127, 84, 243, 107, 244, 111, 84, 250, 246, 84, - 241, 237, 234, 194, 232, 248, 21, 210, 86, 234, 194, 232, 248, 21, 111, - 234, 194, 232, 248, 21, 105, 234, 194, 232, 248, 21, 158, 234, 194, 232, - 248, 21, 161, 234, 194, 232, 248, 21, 190, 234, 194, 232, 248, 21, 195, - 234, 194, 232, 248, 21, 199, 234, 194, 232, 248, 21, 196, 234, 194, 232, - 248, 21, 201, 234, 194, 232, 248, 1, 176, 234, 194, 232, 248, 1, 234, - 138, 234, 194, 232, 248, 1, 243, 142, 234, 194, 232, 248, 1, 229, 82, - 234, 194, 232, 248, 1, 206, 234, 194, 232, 248, 1, 220, 104, 234, 194, - 232, 248, 1, 210, 116, 234, 194, 232, 248, 1, 227, 169, 234, 194, 232, - 248, 1, 217, 106, 234, 194, 232, 248, 1, 240, 233, 234, 194, 232, 248, 1, - 198, 234, 194, 232, 248, 1, 191, 234, 194, 232, 248, 1, 225, 150, 234, - 194, 232, 248, 1, 186, 234, 194, 232, 248, 1, 248, 229, 234, 194, 232, - 248, 1, 252, 199, 234, 194, 232, 248, 1, 205, 234, 194, 232, 248, 1, 192, - 234, 194, 232, 248, 1, 233, 141, 234, 194, 232, 248, 1, 212, 65, 234, - 194, 232, 248, 1, 216, 209, 234, 194, 232, 248, 1, 162, 234, 194, 232, - 248, 1, 214, 27, 234, 194, 232, 248, 1, 251, 41, 234, 194, 232, 248, 1, - 61, 234, 194, 232, 248, 1, 226, 238, 234, 194, 232, 248, 1, 74, 234, 194, - 232, 248, 1, 226, 187, 234, 194, 232, 248, 25, 214, 214, 234, 194, 232, - 248, 25, 76, 234, 194, 232, 248, 25, 69, 234, 194, 232, 248, 25, 245, - 217, 234, 194, 232, 248, 25, 78, 234, 194, 232, 248, 138, 225, 33, 234, - 194, 232, 248, 138, 251, 20, 234, 194, 232, 248, 138, 251, 21, 225, 33, - 234, 194, 232, 248, 5, 249, 85, 234, 194, 232, 248, 5, 219, 201, 223, 96, - 1, 176, 223, 96, 1, 243, 142, 223, 96, 1, 229, 82, 223, 96, 1, 217, 106, - 223, 96, 1, 248, 229, 223, 96, 1, 198, 223, 96, 1, 191, 223, 96, 1, 252, - 199, 223, 96, 1, 186, 223, 96, 1, 251, 41, 223, 96, 1, 235, 147, 223, 96, - 1, 227, 169, 223, 96, 1, 206, 223, 96, 1, 205, 223, 96, 1, 233, 141, 223, - 96, 1, 192, 223, 96, 1, 212, 65, 223, 96, 1, 162, 223, 96, 1, 231, 129, - 223, 96, 1, 229, 61, 223, 96, 1, 229, 153, 223, 96, 1, 227, 139, 223, 96, - 1, 61, 223, 96, 25, 5, 74, 223, 96, 25, 5, 69, 223, 96, 25, 5, 76, 223, - 96, 25, 5, 254, 210, 223, 96, 25, 5, 78, 223, 96, 25, 5, 253, 200, 223, - 96, 25, 5, 245, 63, 223, 96, 25, 5, 245, 241, 223, 96, 117, 5, 229, 84, - 223, 96, 117, 5, 230, 30, 223, 96, 117, 5, 153, 223, 96, 117, 5, 242, 67, - 223, 96, 213, 152, 223, 96, 221, 175, 79, 24, 100, 216, 98, 24, 100, 216, - 97, 24, 100, 216, 95, 24, 100, 216, 100, 24, 100, 223, 24, 24, 100, 223, - 8, 24, 100, 223, 3, 24, 100, 223, 5, 24, 100, 223, 21, 24, 100, 223, 14, - 24, 100, 223, 7, 24, 100, 223, 26, 24, 100, 223, 9, 24, 100, 223, 28, 24, - 100, 223, 25, 24, 100, 230, 218, 24, 100, 230, 209, 24, 100, 230, 212, - 24, 100, 225, 83, 24, 100, 225, 94, 24, 100, 225, 95, 24, 100, 218, 209, - 24, 100, 236, 53, 24, 100, 236, 60, 24, 100, 218, 220, 24, 100, 218, 207, - 24, 100, 225, 133, 24, 100, 241, 174, 24, 100, 218, 204, 155, 5, 226, 31, - 155, 5, 250, 195, 155, 5, 233, 72, 155, 5, 211, 243, 155, 1, 61, 155, 1, - 240, 161, 234, 197, 155, 1, 74, 155, 1, 236, 40, 155, 1, 69, 155, 1, 226, - 94, 250, 171, 155, 1, 229, 83, 233, 34, 155, 1, 229, 83, 233, 35, 223, - 145, 155, 1, 76, 155, 1, 254, 210, 155, 1, 78, 155, 1, 176, 155, 1, 235, - 19, 221, 230, 155, 1, 235, 19, 230, 71, 155, 1, 243, 142, 155, 1, 243, - 143, 230, 71, 155, 1, 229, 82, 155, 1, 251, 41, 155, 1, 251, 42, 230, 71, - 155, 1, 235, 147, 155, 1, 227, 170, 230, 71, 155, 1, 235, 148, 231, 212, - 155, 1, 227, 169, 155, 1, 215, 157, 155, 1, 215, 158, 231, 212, 155, 1, - 248, 143, 155, 1, 248, 144, 231, 212, 155, 1, 229, 234, 230, 71, 155, 1, - 217, 106, 155, 1, 217, 107, 230, 71, 155, 1, 248, 229, 155, 1, 248, 230, - 231, 212, 155, 1, 198, 155, 1, 191, 155, 1, 226, 94, 230, 71, 155, 1, - 252, 199, 155, 1, 252, 200, 230, 71, 155, 1, 186, 155, 1, 192, 155, 1, - 205, 155, 1, 223, 191, 254, 219, 155, 1, 233, 141, 155, 1, 212, 65, 155, - 1, 222, 36, 230, 71, 155, 1, 222, 36, 231, 212, 155, 1, 206, 155, 1, 162, - 155, 5, 250, 196, 216, 251, 155, 25, 5, 217, 48, 155, 25, 5, 216, 36, - 155, 25, 5, 211, 190, 155, 25, 5, 211, 191, 231, 74, 155, 25, 5, 218, 48, - 155, 25, 5, 218, 49, 231, 62, 155, 25, 5, 217, 66, 155, 25, 5, 247, 202, - 230, 70, 155, 25, 5, 225, 187, 155, 117, 5, 234, 164, 155, 117, 5, 225, - 199, 155, 117, 5, 251, 27, 155, 226, 44, 155, 43, 223, 72, 155, 44, 223, - 72, 155, 226, 83, 254, 125, 155, 226, 83, 231, 229, 155, 226, 83, 232, - 93, 155, 226, 83, 211, 238, 155, 226, 83, 226, 45, 155, 226, 83, 232, - 211, 155, 226, 83, 232, 87, 155, 226, 83, 255, 2, 155, 226, 83, 255, 3, - 255, 2, 155, 226, 83, 225, 54, 155, 215, 94, 226, 83, 225, 54, 155, 226, - 40, 155, 21, 210, 86, 155, 21, 111, 155, 21, 105, 155, 21, 158, 155, 21, - 161, 155, 21, 190, 155, 21, 195, 155, 21, 199, 155, 21, 196, 155, 21, - 201, 155, 226, 83, 216, 70, 215, 107, 155, 226, 83, 235, 174, 172, 1, 61, - 172, 1, 74, 172, 1, 69, 172, 1, 76, 172, 1, 254, 210, 172, 1, 78, 172, 1, - 176, 172, 1, 234, 138, 172, 1, 243, 142, 172, 1, 243, 0, 172, 1, 228, - 250, 172, 1, 229, 82, 172, 1, 250, 165, 172, 1, 250, 120, 172, 1, 235, - 147, 172, 1, 235, 120, 172, 1, 228, 240, 172, 1, 228, 242, 172, 1, 228, - 241, 172, 1, 217, 106, 172, 1, 216, 209, 172, 1, 248, 229, 172, 1, 248, - 33, 172, 1, 227, 211, 172, 1, 198, 172, 1, 248, 143, 172, 1, 191, 172, 1, - 224, 223, 172, 1, 225, 150, 172, 1, 252, 199, 172, 1, 252, 26, 172, 1, - 230, 100, 172, 1, 186, 172, 1, 252, 119, 172, 1, 192, 172, 1, 205, 172, - 1, 233, 141, 172, 1, 214, 27, 172, 1, 218, 225, 172, 1, 206, 172, 1, 162, - 172, 25, 5, 255, 82, 172, 25, 5, 74, 172, 25, 5, 236, 40, 172, 25, 5, - 245, 203, 172, 25, 5, 69, 172, 25, 5, 226, 238, 172, 25, 5, 78, 172, 25, - 5, 254, 210, 172, 25, 5, 253, 200, 172, 25, 5, 214, 214, 172, 117, 5, - 192, 172, 117, 5, 205, 172, 117, 5, 233, 141, 172, 117, 5, 212, 65, 172, - 1, 40, 235, 29, 172, 1, 40, 243, 209, 172, 1, 40, 229, 84, 172, 117, 5, - 40, 229, 84, 172, 1, 40, 250, 166, 172, 1, 40, 217, 153, 172, 1, 40, 230, - 30, 172, 1, 40, 226, 109, 172, 1, 40, 211, 117, 172, 1, 40, 153, 172, 1, - 40, 156, 172, 1, 40, 218, 228, 172, 117, 5, 40, 194, 172, 117, 5, 40, - 242, 67, 172, 21, 210, 86, 172, 21, 111, 172, 21, 105, 172, 21, 158, 172, - 21, 161, 172, 21, 190, 172, 21, 195, 172, 21, 199, 172, 21, 196, 172, 21, - 201, 172, 224, 144, 218, 253, 172, 224, 144, 248, 186, 172, 224, 144, 52, - 248, 186, 172, 224, 144, 215, 212, 248, 186, 68, 1, 234, 132, 243, 142, - 68, 1, 234, 132, 251, 41, 68, 1, 234, 132, 250, 165, 68, 1, 234, 132, - 235, 147, 68, 1, 234, 132, 235, 120, 68, 1, 234, 132, 227, 169, 68, 1, - 234, 132, 215, 157, 68, 1, 234, 132, 215, 145, 68, 1, 234, 132, 248, 143, - 68, 1, 234, 132, 248, 127, 68, 1, 234, 132, 248, 33, 68, 1, 234, 132, - 198, 68, 1, 234, 132, 206, 68, 1, 234, 132, 162, 68, 1, 234, 132, 241, - 196, 68, 1, 234, 132, 244, 204, 68, 58, 1, 234, 132, 223, 112, 68, 1, - 234, 132, 211, 165, 68, 1, 234, 132, 210, 116, 68, 1, 234, 132, 205, 68, - 232, 151, 234, 132, 227, 1, 68, 232, 151, 234, 132, 224, 46, 68, 232, - 151, 234, 132, 241, 128, 68, 16, 254, 199, 245, 38, 68, 16, 254, 199, - 111, 68, 16, 254, 199, 105, 68, 1, 254, 199, 205, 68, 5, 226, 27, 234, - 219, 216, 31, 39, 208, 1, 121, 234, 34, 39, 208, 1, 125, 234, 34, 39, - 208, 1, 121, 234, 111, 39, 208, 1, 125, 234, 111, 39, 208, 1, 121, 234, - 120, 39, 208, 1, 125, 234, 120, 39, 208, 1, 121, 242, 181, 39, 208, 1, - 125, 242, 181, 39, 208, 1, 121, 229, 9, 39, 208, 1, 125, 229, 9, 39, 208, - 1, 121, 249, 246, 39, 208, 1, 125, 249, 246, 39, 208, 1, 121, 250, 94, - 39, 208, 1, 125, 250, 94, 39, 208, 1, 121, 219, 60, 39, 208, 1, 125, 219, - 60, 39, 208, 1, 121, 227, 138, 39, 208, 1, 125, 227, 138, 39, 208, 1, - 121, 247, 153, 39, 208, 1, 125, 247, 153, 39, 208, 1, 121, 112, 39, 208, - 1, 125, 112, 39, 208, 1, 121, 216, 157, 39, 208, 1, 125, 216, 157, 39, - 208, 1, 121, 228, 79, 39, 208, 1, 125, 228, 79, 39, 208, 1, 121, 251, - 213, 39, 208, 1, 125, 251, 213, 39, 208, 1, 121, 225, 19, 39, 208, 1, - 125, 225, 19, 39, 208, 1, 121, 225, 124, 39, 208, 1, 125, 225, 124, 39, - 208, 1, 121, 244, 51, 39, 208, 1, 125, 244, 51, 39, 208, 1, 121, 230, - 166, 39, 208, 1, 125, 230, 166, 39, 208, 1, 121, 210, 244, 39, 208, 1, - 125, 210, 244, 39, 208, 1, 121, 222, 213, 39, 208, 1, 125, 222, 213, 39, - 208, 1, 121, 232, 162, 39, 208, 1, 125, 232, 162, 39, 208, 1, 121, 213, - 138, 39, 208, 1, 125, 213, 138, 39, 208, 1, 121, 241, 75, 39, 208, 1, - 125, 241, 75, 39, 208, 1, 121, 78, 39, 208, 1, 125, 78, 39, 208, 231, - 209, 234, 236, 39, 208, 25, 255, 82, 39, 208, 25, 74, 39, 208, 25, 214, - 214, 39, 208, 25, 69, 39, 208, 25, 76, 39, 208, 25, 78, 39, 208, 231, - 209, 234, 114, 39, 208, 25, 240, 126, 39, 208, 25, 214, 213, 39, 208, 25, - 214, 229, 39, 208, 25, 253, 198, 39, 208, 25, 253, 175, 39, 208, 25, 254, - 131, 39, 208, 25, 254, 144, 39, 208, 138, 231, 209, 245, 188, 39, 208, - 138, 231, 209, 227, 210, 39, 208, 138, 231, 209, 216, 157, 39, 208, 138, - 231, 209, 219, 44, 39, 208, 16, 234, 19, 39, 208, 16, 227, 210, 39, 208, - 16, 221, 255, 39, 208, 16, 241, 76, 241, 71, 39, 208, 16, 234, 28, 234, - 27, 188, 187, 1, 76, 188, 187, 1, 78, 188, 187, 1, 250, 165, 188, 187, 1, - 227, 169, 188, 187, 1, 215, 157, 188, 187, 1, 215, 145, 188, 187, 1, 248, - 143, 188, 187, 1, 248, 127, 188, 187, 1, 228, 115, 188, 187, 1, 220, 104, - 188, 187, 1, 218, 225, 188, 187, 25, 5, 236, 40, 188, 187, 25, 5, 214, - 118, 188, 187, 25, 5, 255, 46, 188, 187, 25, 5, 253, 200, 188, 187, 25, - 5, 255, 39, 188, 187, 250, 133, 188, 187, 254, 215, 234, 104, 188, 187, - 254, 111, 188, 187, 3, 223, 77, 79, 188, 187, 211, 209, 223, 77, 79, 188, - 187, 25, 5, 213, 147, 188, 187, 213, 152, 29, 3, 215, 138, 29, 3, 215, - 141, 29, 3, 215, 144, 29, 3, 215, 142, 29, 3, 215, 143, 29, 3, 215, 140, - 29, 3, 248, 121, 29, 3, 248, 123, 29, 3, 248, 126, 29, 3, 248, 124, 29, - 3, 248, 125, 29, 3, 248, 122, 29, 3, 246, 36, 29, 3, 246, 39, 29, 3, 246, - 45, 29, 3, 246, 43, 29, 3, 246, 44, 29, 3, 246, 37, 29, 3, 250, 212, 29, - 3, 250, 206, 29, 3, 250, 208, 29, 3, 250, 211, 29, 3, 250, 209, 29, 3, - 250, 210, 29, 3, 250, 207, 29, 3, 252, 119, 29, 3, 252, 98, 29, 3, 252, - 110, 29, 3, 252, 118, 29, 3, 252, 113, 29, 3, 252, 114, 29, 3, 252, 102, - 188, 187, 1, 234, 25, 188, 187, 1, 221, 255, 188, 187, 1, 233, 115, 188, - 187, 1, 230, 177, 188, 187, 1, 191, 188, 187, 1, 198, 188, 187, 1, 250, - 110, 188, 187, 1, 216, 91, 188, 187, 1, 234, 107, 188, 187, 1, 228, 255, - 188, 187, 1, 216, 151, 188, 187, 1, 212, 60, 188, 187, 1, 211, 69, 188, - 187, 1, 240, 223, 188, 187, 1, 214, 190, 188, 187, 1, 74, 188, 187, 1, - 225, 145, 188, 187, 1, 253, 210, 188, 187, 1, 242, 174, 188, 187, 1, 235, - 118, 188, 187, 1, 223, 169, 188, 187, 1, 252, 199, 188, 187, 1, 235, 106, - 188, 187, 1, 247, 227, 188, 187, 1, 242, 228, 188, 187, 1, 248, 13, 188, - 187, 1, 252, 24, 188, 187, 1, 234, 26, 232, 134, 188, 187, 1, 233, 116, - 232, 134, 188, 187, 1, 230, 178, 232, 134, 188, 187, 1, 226, 94, 232, - 134, 188, 187, 1, 229, 234, 232, 134, 188, 187, 1, 216, 92, 232, 134, - 188, 187, 1, 229, 0, 232, 134, 188, 187, 1, 240, 161, 232, 134, 188, 187, - 25, 5, 226, 199, 188, 187, 25, 5, 236, 4, 188, 187, 25, 5, 254, 130, 188, - 187, 25, 5, 211, 38, 188, 187, 25, 5, 219, 34, 188, 187, 25, 5, 214, 187, - 188, 187, 25, 5, 250, 131, 188, 187, 25, 5, 227, 195, 188, 187, 250, 132, - 188, 187, 232, 90, 235, 156, 188, 187, 254, 54, 235, 156, 188, 187, 21, - 210, 86, 188, 187, 21, 111, 188, 187, 21, 105, 188, 187, 21, 158, 188, - 187, 21, 161, 188, 187, 21, 190, 188, 187, 21, 195, 188, 187, 21, 199, - 188, 187, 21, 196, 188, 187, 21, 201, 24, 143, 227, 81, 24, 143, 227, 86, - 24, 143, 210, 243, 24, 143, 210, 242, 24, 143, 210, 241, 24, 143, 215, - 23, 24, 143, 215, 26, 24, 143, 210, 210, 24, 143, 210, 206, 24, 143, 245, - 62, 24, 143, 245, 60, 24, 143, 245, 61, 24, 143, 245, 58, 24, 143, 240, - 151, 24, 143, 240, 150, 24, 143, 240, 148, 24, 143, 240, 149, 24, 143, - 240, 154, 24, 143, 240, 147, 24, 143, 240, 146, 24, 143, 240, 156, 24, - 143, 254, 41, 24, 143, 254, 40, 24, 90, 228, 224, 24, 90, 228, 230, 24, - 90, 218, 206, 24, 90, 218, 205, 24, 90, 216, 97, 24, 90, 216, 95, 24, 90, - 216, 94, 24, 90, 216, 100, 24, 90, 216, 101, 24, 90, 216, 93, 24, 90, - 223, 8, 24, 90, 223, 23, 24, 90, 218, 212, 24, 90, 223, 20, 24, 90, 223, - 10, 24, 90, 223, 12, 24, 90, 222, 255, 24, 90, 223, 0, 24, 90, 234, 224, - 24, 90, 230, 217, 24, 90, 230, 211, 24, 90, 218, 216, 24, 90, 230, 214, - 24, 90, 230, 220, 24, 90, 225, 79, 24, 90, 225, 88, 24, 90, 225, 92, 24, - 90, 218, 214, 24, 90, 225, 82, 24, 90, 225, 96, 24, 90, 225, 97, 24, 90, - 219, 142, 24, 90, 219, 145, 24, 90, 218, 210, 24, 90, 218, 208, 24, 90, - 219, 140, 24, 90, 219, 148, 24, 90, 219, 149, 24, 90, 219, 134, 24, 90, - 219, 147, 24, 90, 226, 34, 24, 90, 226, 35, 24, 90, 211, 24, 24, 90, 211, - 25, 24, 90, 250, 52, 24, 90, 250, 51, 24, 90, 218, 221, 24, 90, 225, 131, - 24, 90, 225, 130, 10, 14, 238, 31, 10, 14, 238, 30, 10, 14, 238, 29, 10, - 14, 238, 28, 10, 14, 238, 27, 10, 14, 238, 26, 10, 14, 238, 25, 10, 14, - 238, 24, 10, 14, 238, 23, 10, 14, 238, 22, 10, 14, 238, 21, 10, 14, 238, - 20, 10, 14, 238, 19, 10, 14, 238, 18, 10, 14, 238, 17, 10, 14, 238, 16, - 10, 14, 238, 15, 10, 14, 238, 14, 10, 14, 238, 13, 10, 14, 238, 12, 10, - 14, 238, 11, 10, 14, 238, 10, 10, 14, 238, 9, 10, 14, 238, 8, 10, 14, - 238, 7, 10, 14, 238, 6, 10, 14, 238, 5, 10, 14, 238, 4, 10, 14, 238, 3, - 10, 14, 238, 2, 10, 14, 238, 1, 10, 14, 238, 0, 10, 14, 237, 255, 10, 14, - 237, 254, 10, 14, 237, 253, 10, 14, 237, 252, 10, 14, 237, 251, 10, 14, - 237, 250, 10, 14, 237, 249, 10, 14, 237, 248, 10, 14, 237, 247, 10, 14, - 237, 246, 10, 14, 237, 245, 10, 14, 237, 244, 10, 14, 237, 243, 10, 14, - 237, 242, 10, 14, 237, 241, 10, 14, 237, 240, 10, 14, 237, 239, 10, 14, - 237, 238, 10, 14, 237, 237, 10, 14, 237, 236, 10, 14, 237, 235, 10, 14, - 237, 234, 10, 14, 237, 233, 10, 14, 237, 232, 10, 14, 237, 231, 10, 14, - 237, 230, 10, 14, 237, 229, 10, 14, 237, 228, 10, 14, 237, 227, 10, 14, - 237, 226, 10, 14, 237, 225, 10, 14, 237, 224, 10, 14, 237, 223, 10, 14, - 237, 222, 10, 14, 237, 221, 10, 14, 237, 220, 10, 14, 237, 219, 10, 14, - 237, 218, 10, 14, 237, 217, 10, 14, 237, 216, 10, 14, 237, 215, 10, 14, - 237, 214, 10, 14, 237, 213, 10, 14, 237, 212, 10, 14, 237, 211, 10, 14, - 237, 210, 10, 14, 237, 209, 10, 14, 237, 208, 10, 14, 237, 207, 10, 14, - 237, 206, 10, 14, 237, 205, 10, 14, 237, 204, 10, 14, 237, 203, 10, 14, - 237, 202, 10, 14, 237, 201, 10, 14, 237, 200, 10, 14, 237, 199, 10, 14, - 237, 198, 10, 14, 237, 197, 10, 14, 237, 196, 10, 14, 237, 195, 10, 14, - 237, 194, 10, 14, 237, 193, 10, 14, 237, 192, 10, 14, 237, 191, 10, 14, - 237, 190, 10, 14, 237, 189, 10, 14, 237, 188, 10, 14, 237, 187, 10, 14, - 237, 186, 10, 14, 237, 185, 10, 14, 237, 184, 10, 14, 237, 183, 10, 14, - 237, 182, 10, 14, 237, 181, 10, 14, 237, 180, 10, 14, 237, 179, 10, 14, - 237, 178, 10, 14, 237, 177, 10, 14, 237, 176, 10, 14, 237, 175, 10, 14, - 237, 174, 10, 14, 237, 173, 10, 14, 237, 172, 10, 14, 237, 171, 10, 14, - 237, 170, 10, 14, 237, 169, 10, 14, 237, 168, 10, 14, 237, 167, 10, 14, - 237, 166, 10, 14, 237, 165, 10, 14, 237, 164, 10, 14, 237, 163, 10, 14, - 237, 162, 10, 14, 237, 161, 10, 14, 237, 160, 10, 14, 237, 159, 10, 14, - 237, 158, 10, 14, 237, 157, 10, 14, 237, 156, 10, 14, 237, 155, 10, 14, - 237, 154, 10, 14, 237, 153, 10, 14, 237, 152, 10, 14, 237, 151, 10, 14, - 237, 150, 10, 14, 237, 149, 10, 14, 237, 148, 10, 14, 237, 147, 10, 14, - 237, 146, 10, 14, 237, 145, 10, 14, 237, 144, 10, 14, 237, 143, 10, 14, - 237, 142, 10, 14, 237, 141, 10, 14, 237, 140, 10, 14, 237, 139, 10, 14, - 237, 138, 10, 14, 237, 137, 10, 14, 237, 136, 10, 14, 237, 135, 10, 14, - 237, 134, 10, 14, 237, 133, 10, 14, 237, 132, 10, 14, 237, 131, 10, 14, - 237, 130, 10, 14, 237, 129, 10, 14, 237, 128, 10, 14, 237, 127, 10, 14, - 237, 126, 10, 14, 237, 125, 10, 14, 237, 124, 10, 14, 237, 123, 10, 14, - 237, 122, 10, 14, 237, 121, 10, 14, 237, 120, 10, 14, 237, 119, 10, 14, - 237, 118, 10, 14, 237, 117, 10, 14, 237, 116, 10, 14, 237, 115, 10, 14, - 237, 114, 10, 14, 237, 113, 10, 14, 237, 112, 10, 14, 237, 111, 10, 14, - 237, 110, 10, 14, 237, 109, 10, 14, 237, 108, 10, 14, 237, 107, 10, 14, - 237, 106, 10, 14, 237, 105, 10, 14, 237, 104, 10, 14, 237, 103, 10, 14, - 237, 102, 10, 14, 237, 101, 10, 14, 237, 100, 10, 14, 237, 99, 10, 14, - 237, 98, 10, 14, 237, 97, 10, 14, 237, 96, 10, 14, 237, 95, 10, 14, 237, - 94, 10, 14, 237, 93, 10, 14, 237, 92, 10, 14, 237, 91, 10, 14, 237, 90, - 10, 14, 237, 89, 10, 14, 237, 88, 10, 14, 237, 87, 10, 14, 237, 86, 10, - 14, 237, 85, 10, 14, 237, 84, 10, 14, 237, 83, 10, 14, 237, 82, 10, 14, - 237, 81, 10, 14, 237, 80, 10, 14, 237, 79, 10, 14, 237, 78, 10, 14, 237, - 77, 10, 14, 237, 76, 10, 14, 237, 75, 10, 14, 237, 74, 10, 14, 237, 73, - 10, 14, 237, 72, 10, 14, 237, 71, 10, 14, 237, 70, 10, 14, 237, 69, 10, - 14, 237, 68, 10, 14, 237, 67, 10, 14, 237, 66, 10, 14, 237, 65, 10, 14, - 237, 64, 10, 14, 237, 63, 10, 14, 237, 62, 10, 14, 237, 61, 10, 14, 237, - 60, 10, 14, 237, 59, 10, 14, 237, 58, 10, 14, 237, 57, 10, 14, 237, 56, - 10, 14, 237, 55, 10, 14, 237, 54, 10, 14, 237, 53, 10, 14, 237, 52, 10, - 14, 237, 51, 10, 14, 237, 50, 10, 14, 237, 49, 10, 14, 237, 48, 10, 14, - 237, 47, 10, 14, 237, 46, 10, 14, 237, 45, 10, 14, 237, 44, 10, 14, 237, - 43, 10, 14, 237, 42, 10, 14, 237, 41, 10, 14, 237, 40, 10, 14, 237, 39, - 10, 14, 237, 38, 10, 14, 237, 37, 10, 14, 237, 36, 10, 14, 237, 35, 10, - 14, 237, 34, 10, 14, 237, 33, 10, 14, 237, 32, 10, 14, 237, 31, 10, 14, - 237, 30, 10, 14, 237, 29, 10, 14, 237, 28, 10, 14, 237, 27, 10, 14, 237, - 26, 10, 14, 237, 25, 10, 14, 237, 24, 10, 14, 237, 23, 10, 14, 237, 22, - 10, 14, 237, 21, 10, 14, 237, 20, 10, 14, 237, 19, 10, 14, 237, 18, 10, - 14, 237, 17, 10, 14, 237, 16, 10, 14, 237, 15, 10, 14, 237, 14, 10, 14, - 237, 13, 10, 14, 237, 12, 10, 14, 237, 11, 10, 14, 237, 10, 10, 14, 237, - 9, 10, 14, 237, 8, 10, 14, 237, 7, 10, 14, 237, 6, 10, 14, 237, 5, 10, - 14, 237, 4, 10, 14, 237, 3, 10, 14, 237, 2, 10, 14, 237, 1, 10, 14, 237, - 0, 10, 14, 236, 255, 10, 14, 236, 254, 10, 14, 236, 253, 10, 14, 236, - 252, 10, 14, 236, 251, 10, 14, 236, 250, 10, 14, 236, 249, 10, 14, 236, - 248, 10, 14, 236, 247, 10, 14, 236, 246, 10, 14, 236, 245, 10, 14, 236, - 244, 10, 14, 236, 243, 10, 14, 236, 242, 10, 14, 236, 241, 10, 14, 236, - 240, 10, 14, 236, 239, 10, 14, 236, 238, 10, 14, 236, 237, 10, 14, 236, - 236, 10, 14, 236, 235, 10, 14, 236, 234, 10, 14, 236, 233, 10, 14, 236, - 232, 10, 14, 236, 231, 10, 14, 236, 230, 10, 14, 236, 229, 10, 14, 236, - 228, 10, 14, 236, 227, 10, 14, 236, 226, 10, 14, 236, 225, 10, 14, 236, - 224, 10, 14, 236, 223, 10, 14, 236, 222, 10, 14, 236, 221, 10, 14, 236, - 220, 10, 14, 236, 219, 10, 14, 236, 218, 10, 14, 236, 217, 10, 14, 236, - 216, 10, 14, 236, 215, 10, 14, 236, 214, 10, 14, 236, 213, 10, 14, 236, - 212, 10, 14, 236, 211, 10, 14, 236, 210, 10, 14, 236, 209, 10, 14, 236, - 208, 10, 14, 236, 207, 10, 14, 236, 206, 10, 14, 236, 205, 10, 14, 236, - 204, 10, 14, 236, 203, 10, 14, 236, 202, 10, 14, 236, 201, 10, 14, 236, - 200, 10, 14, 236, 199, 10, 14, 236, 198, 10, 14, 236, 197, 10, 14, 236, - 196, 10, 14, 236, 195, 10, 14, 236, 194, 10, 14, 236, 193, 10, 14, 236, - 192, 10, 14, 236, 191, 10, 14, 236, 190, 10, 14, 236, 189, 10, 14, 236, - 188, 10, 14, 236, 187, 10, 14, 236, 186, 10, 14, 236, 185, 10, 14, 236, - 184, 10, 14, 236, 183, 10, 14, 236, 182, 10, 14, 236, 181, 10, 14, 236, - 180, 10, 14, 236, 179, 10, 14, 236, 178, 10, 14, 236, 177, 10, 14, 236, - 176, 10, 14, 236, 175, 10, 14, 236, 174, 10, 14, 236, 173, 10, 14, 236, - 172, 10, 14, 236, 171, 10, 14, 236, 170, 10, 14, 236, 169, 10, 14, 236, - 168, 10, 14, 236, 167, 10, 14, 236, 166, 10, 14, 236, 165, 10, 14, 236, - 164, 10, 14, 236, 163, 10, 14, 236, 162, 10, 14, 236, 161, 10, 14, 236, - 160, 10, 14, 236, 159, 10, 14, 236, 158, 10, 14, 236, 157, 10, 14, 236, - 156, 10, 14, 236, 155, 10, 14, 236, 154, 10, 14, 236, 153, 10, 14, 236, - 152, 10, 14, 236, 151, 10, 14, 236, 150, 10, 14, 236, 149, 10, 14, 236, - 148, 10, 14, 236, 147, 10, 14, 236, 146, 10, 14, 236, 145, 10, 14, 236, - 144, 10, 14, 236, 143, 10, 14, 236, 142, 10, 14, 236, 141, 10, 14, 236, - 140, 10, 14, 236, 139, 10, 14, 236, 138, 10, 14, 236, 137, 10, 14, 236, - 136, 10, 14, 236, 135, 10, 14, 236, 134, 10, 14, 236, 133, 10, 14, 236, - 132, 10, 14, 236, 131, 10, 14, 236, 130, 10, 14, 236, 129, 10, 14, 236, - 128, 10, 14, 236, 127, 10, 14, 236, 126, 10, 14, 236, 125, 10, 14, 236, - 124, 10, 14, 236, 123, 10, 14, 236, 122, 10, 14, 236, 121, 10, 14, 236, - 120, 10, 14, 236, 119, 10, 14, 236, 118, 10, 14, 236, 117, 10, 14, 236, - 116, 10, 14, 236, 115, 10, 14, 236, 114, 10, 14, 236, 113, 10, 14, 236, - 112, 10, 14, 236, 111, 10, 14, 236, 110, 10, 14, 236, 109, 10, 14, 236, - 108, 10, 14, 236, 107, 10, 14, 236, 106, 10, 14, 236, 105, 10, 14, 236, - 104, 10, 14, 236, 103, 10, 14, 236, 102, 10, 14, 236, 101, 10, 14, 236, - 100, 10, 14, 236, 99, 10, 14, 236, 98, 10, 14, 236, 97, 10, 14, 236, 96, - 10, 14, 236, 95, 10, 14, 236, 94, 10, 14, 236, 93, 10, 14, 236, 92, 10, - 14, 236, 91, 10, 14, 236, 90, 10, 14, 236, 89, 10, 14, 236, 88, 10, 14, - 236, 87, 10, 14, 236, 86, 10, 14, 236, 85, 10, 14, 236, 84, 10, 14, 236, - 83, 10, 14, 236, 82, 10, 14, 236, 81, 10, 14, 236, 80, 10, 14, 236, 79, - 10, 14, 236, 78, 10, 14, 236, 77, 10, 14, 236, 76, 10, 14, 236, 75, 10, - 14, 236, 74, 10, 14, 236, 73, 10, 14, 236, 72, 7, 4, 27, 244, 133, 7, 4, - 27, 244, 129, 7, 4, 27, 244, 84, 7, 4, 27, 244, 132, 7, 4, 27, 244, 131, - 7, 4, 27, 200, 222, 94, 217, 153, 7, 4, 27, 218, 170, 150, 4, 27, 231, - 64, 228, 44, 150, 4, 27, 231, 64, 245, 221, 150, 4, 27, 231, 64, 235, - 234, 150, 4, 27, 213, 180, 228, 44, 150, 4, 27, 231, 64, 211, 160, 94, 1, - 210, 234, 2, 241, 165, 94, 225, 14, 235, 56, 214, 11, 94, 27, 211, 6, - 210, 234, 210, 234, 225, 243, 94, 1, 254, 147, 253, 170, 94, 1, 211, 247, - 254, 179, 94, 1, 211, 247, 248, 197, 94, 1, 211, 247, 241, 245, 94, 1, - 211, 247, 235, 0, 94, 1, 211, 247, 233, 100, 94, 1, 211, 247, 40, 231, - 70, 94, 1, 211, 247, 223, 70, 94, 1, 211, 247, 217, 39, 94, 1, 254, 147, - 96, 50, 94, 1, 220, 23, 2, 220, 23, 247, 128, 94, 1, 220, 23, 2, 219, - 161, 247, 128, 94, 1, 220, 23, 2, 248, 216, 22, 220, 23, 247, 128, 94, 1, - 220, 23, 2, 248, 216, 22, 219, 161, 247, 128, 94, 1, 109, 2, 225, 243, - 94, 1, 109, 2, 224, 79, 94, 1, 109, 2, 231, 176, 94, 1, 252, 37, 2, 248, - 215, 94, 1, 242, 209, 2, 248, 215, 94, 1, 248, 198, 2, 248, 215, 94, 1, - 241, 246, 2, 231, 176, 94, 1, 214, 4, 2, 248, 215, 94, 1, 210, 98, 2, - 248, 215, 94, 1, 216, 232, 2, 248, 215, 94, 1, 210, 234, 2, 248, 215, 94, - 1, 40, 235, 1, 2, 248, 215, 94, 1, 235, 1, 2, 248, 215, 94, 1, 233, 101, - 2, 248, 215, 94, 1, 231, 71, 2, 248, 215, 94, 1, 227, 199, 2, 248, 215, - 94, 1, 221, 252, 2, 248, 215, 94, 1, 40, 225, 225, 2, 248, 215, 94, 1, - 225, 225, 2, 248, 215, 94, 1, 215, 181, 2, 248, 215, 94, 1, 224, 43, 2, - 248, 215, 94, 1, 223, 71, 2, 248, 215, 94, 1, 220, 23, 2, 248, 215, 94, - 1, 217, 40, 2, 248, 215, 94, 1, 214, 4, 2, 241, 68, 94, 1, 252, 37, 2, - 223, 172, 94, 1, 235, 1, 2, 223, 172, 94, 1, 225, 225, 2, 223, 172, 94, - 27, 109, 233, 100, 9, 1, 109, 212, 47, 53, 17, 9, 1, 109, 212, 47, 40, - 17, 9, 1, 252, 73, 53, 17, 9, 1, 252, 73, 40, 17, 9, 1, 252, 73, 65, 17, - 9, 1, 252, 73, 147, 17, 9, 1, 225, 209, 53, 17, 9, 1, 225, 209, 40, 17, - 9, 1, 225, 209, 65, 17, 9, 1, 225, 209, 147, 17, 9, 1, 252, 61, 53, 17, - 9, 1, 252, 61, 40, 17, 9, 1, 252, 61, 65, 17, 9, 1, 252, 61, 147, 17, 9, - 1, 215, 148, 53, 17, 9, 1, 215, 148, 40, 17, 9, 1, 215, 148, 65, 17, 9, - 1, 215, 148, 147, 17, 9, 1, 217, 7, 53, 17, 9, 1, 217, 7, 40, 17, 9, 1, - 217, 7, 65, 17, 9, 1, 217, 7, 147, 17, 9, 1, 215, 150, 53, 17, 9, 1, 215, - 150, 40, 17, 9, 1, 215, 150, 65, 17, 9, 1, 215, 150, 147, 17, 9, 1, 213, - 249, 53, 17, 9, 1, 213, 249, 40, 17, 9, 1, 213, 249, 65, 17, 9, 1, 213, - 249, 147, 17, 9, 1, 225, 207, 53, 17, 9, 1, 225, 207, 40, 17, 9, 1, 225, - 207, 65, 17, 9, 1, 225, 207, 147, 17, 9, 1, 246, 52, 53, 17, 9, 1, 246, - 52, 40, 17, 9, 1, 246, 52, 65, 17, 9, 1, 246, 52, 147, 17, 9, 1, 227, - 158, 53, 17, 9, 1, 227, 158, 40, 17, 9, 1, 227, 158, 65, 17, 9, 1, 227, - 158, 147, 17, 9, 1, 217, 28, 53, 17, 9, 1, 217, 28, 40, 17, 9, 1, 217, - 28, 65, 17, 9, 1, 217, 28, 147, 17, 9, 1, 217, 26, 53, 17, 9, 1, 217, 26, - 40, 17, 9, 1, 217, 26, 65, 17, 9, 1, 217, 26, 147, 17, 9, 1, 248, 141, - 53, 17, 9, 1, 248, 141, 40, 17, 9, 1, 248, 210, 53, 17, 9, 1, 248, 210, - 40, 17, 9, 1, 246, 79, 53, 17, 9, 1, 246, 79, 40, 17, 9, 1, 248, 139, 53, - 17, 9, 1, 248, 139, 40, 17, 9, 1, 235, 127, 53, 17, 9, 1, 235, 127, 40, - 17, 9, 1, 222, 174, 53, 17, 9, 1, 222, 174, 40, 17, 9, 1, 234, 181, 53, - 17, 9, 1, 234, 181, 40, 17, 9, 1, 234, 181, 65, 17, 9, 1, 234, 181, 147, - 17, 9, 1, 243, 130, 53, 17, 9, 1, 243, 130, 40, 17, 9, 1, 243, 130, 65, - 17, 9, 1, 243, 130, 147, 17, 9, 1, 242, 109, 53, 17, 9, 1, 242, 109, 40, - 17, 9, 1, 242, 109, 65, 17, 9, 1, 242, 109, 147, 17, 9, 1, 229, 8, 53, - 17, 9, 1, 229, 8, 40, 17, 9, 1, 229, 8, 65, 17, 9, 1, 229, 8, 147, 17, 9, - 1, 228, 68, 242, 226, 53, 17, 9, 1, 228, 68, 242, 226, 40, 17, 9, 1, 222, - 217, 53, 17, 9, 1, 222, 217, 40, 17, 9, 1, 222, 217, 65, 17, 9, 1, 222, - 217, 147, 17, 9, 1, 241, 226, 2, 77, 72, 53, 17, 9, 1, 241, 226, 2, 77, - 72, 40, 17, 9, 1, 241, 226, 242, 179, 53, 17, 9, 1, 241, 226, 242, 179, - 40, 17, 9, 1, 241, 226, 242, 179, 65, 17, 9, 1, 241, 226, 242, 179, 147, - 17, 9, 1, 241, 226, 247, 150, 53, 17, 9, 1, 241, 226, 247, 150, 40, 17, - 9, 1, 241, 226, 247, 150, 65, 17, 9, 1, 241, 226, 247, 150, 147, 17, 9, - 1, 77, 252, 141, 53, 17, 9, 1, 77, 252, 141, 40, 17, 9, 1, 77, 252, 141, - 2, 182, 72, 53, 17, 9, 1, 77, 252, 141, 2, 182, 72, 40, 17, 9, 16, 59, - 48, 9, 16, 59, 51, 9, 16, 113, 170, 48, 9, 16, 113, 170, 51, 9, 16, 134, - 170, 48, 9, 16, 134, 170, 51, 9, 16, 134, 170, 225, 10, 246, 112, 48, 9, - 16, 134, 170, 225, 10, 246, 112, 51, 9, 16, 244, 19, 170, 48, 9, 16, 244, - 19, 170, 51, 9, 16, 52, 67, 252, 149, 51, 9, 16, 113, 170, 213, 189, 48, - 9, 16, 113, 170, 213, 189, 51, 9, 16, 222, 236, 9, 16, 4, 217, 82, 48, 9, - 16, 4, 217, 82, 51, 9, 1, 229, 85, 53, 17, 9, 1, 229, 85, 40, 17, 9, 1, - 229, 85, 65, 17, 9, 1, 229, 85, 147, 17, 9, 1, 104, 53, 17, 9, 1, 104, - 40, 17, 9, 1, 226, 239, 53, 17, 9, 1, 226, 239, 40, 17, 9, 1, 210, 213, - 53, 17, 9, 1, 210, 213, 40, 17, 9, 1, 104, 2, 182, 72, 53, 17, 9, 1, 214, - 0, 53, 17, 9, 1, 214, 0, 40, 17, 9, 1, 234, 79, 226, 239, 53, 17, 9, 1, - 234, 79, 226, 239, 40, 17, 9, 1, 234, 79, 210, 213, 53, 17, 9, 1, 234, - 79, 210, 213, 40, 17, 9, 1, 160, 53, 17, 9, 1, 160, 40, 17, 9, 1, 160, - 65, 17, 9, 1, 160, 147, 17, 9, 1, 214, 207, 234, 192, 234, 79, 109, 231, - 198, 65, 17, 9, 1, 214, 207, 234, 192, 234, 79, 109, 231, 198, 147, 17, - 9, 27, 77, 2, 182, 72, 2, 109, 53, 17, 9, 27, 77, 2, 182, 72, 2, 109, 40, - 17, 9, 27, 77, 2, 182, 72, 2, 254, 253, 53, 17, 9, 27, 77, 2, 182, 72, 2, - 254, 253, 40, 17, 9, 27, 77, 2, 182, 72, 2, 212, 31, 53, 17, 9, 27, 77, - 2, 182, 72, 2, 212, 31, 40, 17, 9, 27, 77, 2, 182, 72, 2, 104, 53, 17, 9, - 27, 77, 2, 182, 72, 2, 104, 40, 17, 9, 27, 77, 2, 182, 72, 2, 226, 239, - 53, 17, 9, 27, 77, 2, 182, 72, 2, 226, 239, 40, 17, 9, 27, 77, 2, 182, - 72, 2, 210, 213, 53, 17, 9, 27, 77, 2, 182, 72, 2, 210, 213, 40, 17, 9, - 27, 77, 2, 182, 72, 2, 160, 53, 17, 9, 27, 77, 2, 182, 72, 2, 160, 40, - 17, 9, 27, 77, 2, 182, 72, 2, 160, 65, 17, 9, 27, 214, 207, 234, 79, 77, - 2, 182, 72, 2, 109, 231, 198, 53, 17, 9, 27, 214, 207, 234, 79, 77, 2, - 182, 72, 2, 109, 231, 198, 40, 17, 9, 27, 214, 207, 234, 79, 77, 2, 182, - 72, 2, 109, 231, 198, 65, 17, 9, 1, 244, 176, 77, 53, 17, 9, 1, 244, 176, - 77, 40, 17, 9, 1, 244, 176, 77, 65, 17, 9, 1, 244, 176, 77, 147, 17, 9, - 27, 77, 2, 182, 72, 2, 151, 53, 17, 9, 27, 77, 2, 182, 72, 2, 122, 53, - 17, 9, 27, 77, 2, 182, 72, 2, 66, 53, 17, 9, 27, 77, 2, 182, 72, 2, 109, - 231, 198, 53, 17, 9, 27, 77, 2, 182, 72, 2, 77, 53, 17, 9, 27, 252, 63, - 2, 151, 53, 17, 9, 27, 252, 63, 2, 122, 53, 17, 9, 27, 252, 63, 2, 234, - 136, 53, 17, 9, 27, 252, 63, 2, 66, 53, 17, 9, 27, 252, 63, 2, 109, 231, - 198, 53, 17, 9, 27, 252, 63, 2, 77, 53, 17, 9, 27, 217, 9, 2, 151, 53, - 17, 9, 27, 217, 9, 2, 122, 53, 17, 9, 27, 217, 9, 2, 234, 136, 53, 17, 9, - 27, 217, 9, 2, 66, 53, 17, 9, 27, 217, 9, 2, 109, 231, 198, 53, 17, 9, - 27, 217, 9, 2, 77, 53, 17, 9, 27, 216, 194, 2, 151, 53, 17, 9, 27, 216, - 194, 2, 66, 53, 17, 9, 27, 216, 194, 2, 109, 231, 198, 53, 17, 9, 27, - 216, 194, 2, 77, 53, 17, 9, 27, 151, 2, 122, 53, 17, 9, 27, 151, 2, 66, - 53, 17, 9, 27, 122, 2, 151, 53, 17, 9, 27, 122, 2, 66, 53, 17, 9, 27, - 234, 136, 2, 151, 53, 17, 9, 27, 234, 136, 2, 122, 53, 17, 9, 27, 234, - 136, 2, 66, 53, 17, 9, 27, 221, 169, 2, 151, 53, 17, 9, 27, 221, 169, 2, - 122, 53, 17, 9, 27, 221, 169, 2, 234, 136, 53, 17, 9, 27, 221, 169, 2, - 66, 53, 17, 9, 27, 222, 29, 2, 122, 53, 17, 9, 27, 222, 29, 2, 66, 53, - 17, 9, 27, 248, 225, 2, 151, 53, 17, 9, 27, 248, 225, 2, 122, 53, 17, 9, - 27, 248, 225, 2, 234, 136, 53, 17, 9, 27, 248, 225, 2, 66, 53, 17, 9, 27, - 217, 82, 2, 122, 53, 17, 9, 27, 217, 82, 2, 66, 53, 17, 9, 27, 210, 112, - 2, 66, 53, 17, 9, 27, 254, 206, 2, 151, 53, 17, 9, 27, 254, 206, 2, 66, - 53, 17, 9, 27, 242, 252, 2, 151, 53, 17, 9, 27, 242, 252, 2, 66, 53, 17, - 9, 27, 244, 151, 2, 151, 53, 17, 9, 27, 244, 151, 2, 122, 53, 17, 9, 27, - 244, 151, 2, 234, 136, 53, 17, 9, 27, 244, 151, 2, 66, 53, 17, 9, 27, - 244, 151, 2, 109, 231, 198, 53, 17, 9, 27, 244, 151, 2, 77, 53, 17, 9, - 27, 224, 85, 2, 122, 53, 17, 9, 27, 224, 85, 2, 66, 53, 17, 9, 27, 224, - 85, 2, 109, 231, 198, 53, 17, 9, 27, 224, 85, 2, 77, 53, 17, 9, 27, 235, - 1, 2, 109, 53, 17, 9, 27, 235, 1, 2, 151, 53, 17, 9, 27, 235, 1, 2, 122, - 53, 17, 9, 27, 235, 1, 2, 234, 136, 53, 17, 9, 27, 235, 1, 2, 233, 109, - 53, 17, 9, 27, 235, 1, 2, 66, 53, 17, 9, 27, 235, 1, 2, 109, 231, 198, - 53, 17, 9, 27, 235, 1, 2, 77, 53, 17, 9, 27, 233, 109, 2, 151, 53, 17, 9, - 27, 233, 109, 2, 122, 53, 17, 9, 27, 233, 109, 2, 234, 136, 53, 17, 9, - 27, 233, 109, 2, 66, 53, 17, 9, 27, 233, 109, 2, 109, 231, 198, 53, 17, - 9, 27, 233, 109, 2, 77, 53, 17, 9, 27, 66, 2, 151, 53, 17, 9, 27, 66, 2, - 122, 53, 17, 9, 27, 66, 2, 234, 136, 53, 17, 9, 27, 66, 2, 66, 53, 17, 9, - 27, 66, 2, 109, 231, 198, 53, 17, 9, 27, 66, 2, 77, 53, 17, 9, 27, 228, - 68, 2, 151, 53, 17, 9, 27, 228, 68, 2, 122, 53, 17, 9, 27, 228, 68, 2, - 234, 136, 53, 17, 9, 27, 228, 68, 2, 66, 53, 17, 9, 27, 228, 68, 2, 109, - 231, 198, 53, 17, 9, 27, 228, 68, 2, 77, 53, 17, 9, 27, 241, 226, 2, 151, - 53, 17, 9, 27, 241, 226, 2, 66, 53, 17, 9, 27, 241, 226, 2, 109, 231, - 198, 53, 17, 9, 27, 241, 226, 2, 77, 53, 17, 9, 27, 77, 2, 151, 53, 17, - 9, 27, 77, 2, 122, 53, 17, 9, 27, 77, 2, 234, 136, 53, 17, 9, 27, 77, 2, - 66, 53, 17, 9, 27, 77, 2, 109, 231, 198, 53, 17, 9, 27, 77, 2, 77, 53, - 17, 9, 27, 216, 204, 2, 218, 24, 109, 53, 17, 9, 27, 223, 99, 2, 218, 24, - 109, 53, 17, 9, 27, 109, 231, 198, 2, 218, 24, 109, 53, 17, 9, 27, 220, - 96, 2, 248, 191, 53, 17, 9, 27, 220, 96, 2, 234, 210, 53, 17, 9, 27, 220, - 96, 2, 244, 174, 53, 17, 9, 27, 220, 96, 2, 248, 193, 53, 17, 9, 27, 220, - 96, 2, 234, 212, 53, 17, 9, 27, 220, 96, 2, 218, 24, 109, 53, 17, 9, 27, - 77, 2, 182, 72, 2, 223, 99, 40, 17, 9, 27, 77, 2, 182, 72, 2, 210, 109, - 40, 17, 9, 27, 77, 2, 182, 72, 2, 66, 40, 17, 9, 27, 77, 2, 182, 72, 2, - 228, 68, 40, 17, 9, 27, 77, 2, 182, 72, 2, 109, 231, 198, 40, 17, 9, 27, - 77, 2, 182, 72, 2, 77, 40, 17, 9, 27, 252, 63, 2, 223, 99, 40, 17, 9, 27, - 252, 63, 2, 210, 109, 40, 17, 9, 27, 252, 63, 2, 66, 40, 17, 9, 27, 252, - 63, 2, 228, 68, 40, 17, 9, 27, 252, 63, 2, 109, 231, 198, 40, 17, 9, 27, - 252, 63, 2, 77, 40, 17, 9, 27, 217, 9, 2, 223, 99, 40, 17, 9, 27, 217, 9, - 2, 210, 109, 40, 17, 9, 27, 217, 9, 2, 66, 40, 17, 9, 27, 217, 9, 2, 228, - 68, 40, 17, 9, 27, 217, 9, 2, 109, 231, 198, 40, 17, 9, 27, 217, 9, 2, - 77, 40, 17, 9, 27, 216, 194, 2, 223, 99, 40, 17, 9, 27, 216, 194, 2, 210, - 109, 40, 17, 9, 27, 216, 194, 2, 66, 40, 17, 9, 27, 216, 194, 2, 228, 68, - 40, 17, 9, 27, 216, 194, 2, 109, 231, 198, 40, 17, 9, 27, 216, 194, 2, - 77, 40, 17, 9, 27, 244, 151, 2, 109, 231, 198, 40, 17, 9, 27, 244, 151, - 2, 77, 40, 17, 9, 27, 224, 85, 2, 109, 231, 198, 40, 17, 9, 27, 224, 85, - 2, 77, 40, 17, 9, 27, 235, 1, 2, 109, 40, 17, 9, 27, 235, 1, 2, 233, 109, - 40, 17, 9, 27, 235, 1, 2, 66, 40, 17, 9, 27, 235, 1, 2, 109, 231, 198, - 40, 17, 9, 27, 235, 1, 2, 77, 40, 17, 9, 27, 233, 109, 2, 66, 40, 17, 9, - 27, 233, 109, 2, 109, 231, 198, 40, 17, 9, 27, 233, 109, 2, 77, 40, 17, - 9, 27, 66, 2, 109, 40, 17, 9, 27, 66, 2, 66, 40, 17, 9, 27, 228, 68, 2, - 223, 99, 40, 17, 9, 27, 228, 68, 2, 210, 109, 40, 17, 9, 27, 228, 68, 2, - 66, 40, 17, 9, 27, 228, 68, 2, 228, 68, 40, 17, 9, 27, 228, 68, 2, 109, - 231, 198, 40, 17, 9, 27, 228, 68, 2, 77, 40, 17, 9, 27, 109, 231, 198, 2, - 218, 24, 109, 40, 17, 9, 27, 77, 2, 223, 99, 40, 17, 9, 27, 77, 2, 210, - 109, 40, 17, 9, 27, 77, 2, 66, 40, 17, 9, 27, 77, 2, 228, 68, 40, 17, 9, - 27, 77, 2, 109, 231, 198, 40, 17, 9, 27, 77, 2, 77, 40, 17, 9, 27, 77, 2, - 182, 72, 2, 151, 65, 17, 9, 27, 77, 2, 182, 72, 2, 122, 65, 17, 9, 27, - 77, 2, 182, 72, 2, 234, 136, 65, 17, 9, 27, 77, 2, 182, 72, 2, 66, 65, - 17, 9, 27, 77, 2, 182, 72, 2, 241, 226, 65, 17, 9, 27, 252, 63, 2, 151, - 65, 17, 9, 27, 252, 63, 2, 122, 65, 17, 9, 27, 252, 63, 2, 234, 136, 65, - 17, 9, 27, 252, 63, 2, 66, 65, 17, 9, 27, 252, 63, 2, 241, 226, 65, 17, - 9, 27, 217, 9, 2, 151, 65, 17, 9, 27, 217, 9, 2, 122, 65, 17, 9, 27, 217, - 9, 2, 234, 136, 65, 17, 9, 27, 217, 9, 2, 66, 65, 17, 9, 27, 217, 9, 2, - 241, 226, 65, 17, 9, 27, 216, 194, 2, 66, 65, 17, 9, 27, 151, 2, 122, 65, - 17, 9, 27, 151, 2, 66, 65, 17, 9, 27, 122, 2, 151, 65, 17, 9, 27, 122, 2, - 66, 65, 17, 9, 27, 234, 136, 2, 151, 65, 17, 9, 27, 234, 136, 2, 66, 65, - 17, 9, 27, 221, 169, 2, 151, 65, 17, 9, 27, 221, 169, 2, 122, 65, 17, 9, - 27, 221, 169, 2, 234, 136, 65, 17, 9, 27, 221, 169, 2, 66, 65, 17, 9, 27, - 222, 29, 2, 122, 65, 17, 9, 27, 222, 29, 2, 234, 136, 65, 17, 9, 27, 222, - 29, 2, 66, 65, 17, 9, 27, 248, 225, 2, 151, 65, 17, 9, 27, 248, 225, 2, - 122, 65, 17, 9, 27, 248, 225, 2, 234, 136, 65, 17, 9, 27, 248, 225, 2, - 66, 65, 17, 9, 27, 217, 82, 2, 122, 65, 17, 9, 27, 210, 112, 2, 66, 65, - 17, 9, 27, 254, 206, 2, 151, 65, 17, 9, 27, 254, 206, 2, 66, 65, 17, 9, - 27, 242, 252, 2, 151, 65, 17, 9, 27, 242, 252, 2, 66, 65, 17, 9, 27, 244, - 151, 2, 151, 65, 17, 9, 27, 244, 151, 2, 122, 65, 17, 9, 27, 244, 151, 2, - 234, 136, 65, 17, 9, 27, 244, 151, 2, 66, 65, 17, 9, 27, 224, 85, 2, 122, - 65, 17, 9, 27, 224, 85, 2, 66, 65, 17, 9, 27, 235, 1, 2, 151, 65, 17, 9, - 27, 235, 1, 2, 122, 65, 17, 9, 27, 235, 1, 2, 234, 136, 65, 17, 9, 27, - 235, 1, 2, 233, 109, 65, 17, 9, 27, 235, 1, 2, 66, 65, 17, 9, 27, 233, - 109, 2, 151, 65, 17, 9, 27, 233, 109, 2, 122, 65, 17, 9, 27, 233, 109, 2, - 234, 136, 65, 17, 9, 27, 233, 109, 2, 66, 65, 17, 9, 27, 233, 109, 2, - 241, 226, 65, 17, 9, 27, 66, 2, 151, 65, 17, 9, 27, 66, 2, 122, 65, 17, - 9, 27, 66, 2, 234, 136, 65, 17, 9, 27, 66, 2, 66, 65, 17, 9, 27, 228, 68, - 2, 151, 65, 17, 9, 27, 228, 68, 2, 122, 65, 17, 9, 27, 228, 68, 2, 234, - 136, 65, 17, 9, 27, 228, 68, 2, 66, 65, 17, 9, 27, 228, 68, 2, 241, 226, - 65, 17, 9, 27, 241, 226, 2, 151, 65, 17, 9, 27, 241, 226, 2, 66, 65, 17, - 9, 27, 241, 226, 2, 218, 24, 109, 65, 17, 9, 27, 77, 2, 151, 65, 17, 9, - 27, 77, 2, 122, 65, 17, 9, 27, 77, 2, 234, 136, 65, 17, 9, 27, 77, 2, 66, - 65, 17, 9, 27, 77, 2, 241, 226, 65, 17, 9, 27, 77, 2, 182, 72, 2, 66, - 147, 17, 9, 27, 77, 2, 182, 72, 2, 241, 226, 147, 17, 9, 27, 252, 63, 2, - 66, 147, 17, 9, 27, 252, 63, 2, 241, 226, 147, 17, 9, 27, 217, 9, 2, 66, - 147, 17, 9, 27, 217, 9, 2, 241, 226, 147, 17, 9, 27, 216, 194, 2, 66, - 147, 17, 9, 27, 216, 194, 2, 241, 226, 147, 17, 9, 27, 221, 169, 2, 66, - 147, 17, 9, 27, 221, 169, 2, 241, 226, 147, 17, 9, 27, 220, 62, 2, 66, - 147, 17, 9, 27, 220, 62, 2, 241, 226, 147, 17, 9, 27, 235, 1, 2, 233, - 109, 147, 17, 9, 27, 235, 1, 2, 66, 147, 17, 9, 27, 233, 109, 2, 66, 147, - 17, 9, 27, 228, 68, 2, 66, 147, 17, 9, 27, 228, 68, 2, 241, 226, 147, 17, - 9, 27, 77, 2, 66, 147, 17, 9, 27, 77, 2, 241, 226, 147, 17, 9, 27, 220, - 96, 2, 244, 174, 147, 17, 9, 27, 220, 96, 2, 248, 193, 147, 17, 9, 27, - 220, 96, 2, 234, 212, 147, 17, 9, 27, 217, 82, 2, 109, 231, 198, 53, 17, - 9, 27, 217, 82, 2, 77, 53, 17, 9, 27, 254, 206, 2, 109, 231, 198, 53, 17, - 9, 27, 254, 206, 2, 77, 53, 17, 9, 27, 242, 252, 2, 109, 231, 198, 53, - 17, 9, 27, 242, 252, 2, 77, 53, 17, 9, 27, 221, 169, 2, 109, 231, 198, - 53, 17, 9, 27, 221, 169, 2, 77, 53, 17, 9, 27, 220, 62, 2, 109, 231, 198, - 53, 17, 9, 27, 220, 62, 2, 77, 53, 17, 9, 27, 122, 2, 109, 231, 198, 53, - 17, 9, 27, 122, 2, 77, 53, 17, 9, 27, 151, 2, 109, 231, 198, 53, 17, 9, - 27, 151, 2, 77, 53, 17, 9, 27, 234, 136, 2, 109, 231, 198, 53, 17, 9, 27, - 234, 136, 2, 77, 53, 17, 9, 27, 222, 29, 2, 109, 231, 198, 53, 17, 9, 27, - 222, 29, 2, 77, 53, 17, 9, 27, 248, 225, 2, 109, 231, 198, 53, 17, 9, 27, - 248, 225, 2, 77, 53, 17, 9, 27, 220, 62, 2, 151, 53, 17, 9, 27, 220, 62, - 2, 122, 53, 17, 9, 27, 220, 62, 2, 234, 136, 53, 17, 9, 27, 220, 62, 2, - 66, 53, 17, 9, 27, 220, 62, 2, 223, 99, 53, 17, 9, 27, 221, 169, 2, 223, - 99, 53, 17, 9, 27, 222, 29, 2, 223, 99, 53, 17, 9, 27, 248, 225, 2, 223, - 99, 53, 17, 9, 27, 217, 82, 2, 109, 231, 198, 40, 17, 9, 27, 217, 82, 2, - 77, 40, 17, 9, 27, 254, 206, 2, 109, 231, 198, 40, 17, 9, 27, 254, 206, - 2, 77, 40, 17, 9, 27, 242, 252, 2, 109, 231, 198, 40, 17, 9, 27, 242, - 252, 2, 77, 40, 17, 9, 27, 221, 169, 2, 109, 231, 198, 40, 17, 9, 27, - 221, 169, 2, 77, 40, 17, 9, 27, 220, 62, 2, 109, 231, 198, 40, 17, 9, 27, - 220, 62, 2, 77, 40, 17, 9, 27, 122, 2, 109, 231, 198, 40, 17, 9, 27, 122, - 2, 77, 40, 17, 9, 27, 151, 2, 109, 231, 198, 40, 17, 9, 27, 151, 2, 77, - 40, 17, 9, 27, 234, 136, 2, 109, 231, 198, 40, 17, 9, 27, 234, 136, 2, - 77, 40, 17, 9, 27, 222, 29, 2, 109, 231, 198, 40, 17, 9, 27, 222, 29, 2, - 77, 40, 17, 9, 27, 248, 225, 2, 109, 231, 198, 40, 17, 9, 27, 248, 225, - 2, 77, 40, 17, 9, 27, 220, 62, 2, 151, 40, 17, 9, 27, 220, 62, 2, 122, - 40, 17, 9, 27, 220, 62, 2, 234, 136, 40, 17, 9, 27, 220, 62, 2, 66, 40, - 17, 9, 27, 220, 62, 2, 223, 99, 40, 17, 9, 27, 221, 169, 2, 223, 99, 40, - 17, 9, 27, 222, 29, 2, 223, 99, 40, 17, 9, 27, 248, 225, 2, 223, 99, 40, - 17, 9, 27, 220, 62, 2, 151, 65, 17, 9, 27, 220, 62, 2, 122, 65, 17, 9, - 27, 220, 62, 2, 234, 136, 65, 17, 9, 27, 220, 62, 2, 66, 65, 17, 9, 27, - 221, 169, 2, 241, 226, 65, 17, 9, 27, 220, 62, 2, 241, 226, 65, 17, 9, - 27, 217, 82, 2, 66, 65, 17, 9, 27, 221, 169, 2, 151, 147, 17, 9, 27, 221, - 169, 2, 122, 147, 17, 9, 27, 221, 169, 2, 234, 136, 147, 17, 9, 27, 220, - 62, 2, 151, 147, 17, 9, 27, 220, 62, 2, 122, 147, 17, 9, 27, 220, 62, 2, - 234, 136, 147, 17, 9, 27, 217, 82, 2, 66, 147, 17, 9, 27, 210, 112, 2, - 66, 147, 17, 9, 27, 109, 2, 244, 172, 40, 17, 9, 27, 109, 2, 244, 172, - 53, 17, 226, 150, 43, 226, 7, 226, 150, 44, 226, 7, 9, 27, 217, 9, 2, - 151, 2, 66, 65, 17, 9, 27, 217, 9, 2, 122, 2, 151, 40, 17, 9, 27, 217, 9, - 2, 122, 2, 151, 65, 17, 9, 27, 217, 9, 2, 122, 2, 66, 65, 17, 9, 27, 217, - 9, 2, 234, 136, 2, 66, 65, 17, 9, 27, 217, 9, 2, 66, 2, 151, 65, 17, 9, - 27, 217, 9, 2, 66, 2, 122, 65, 17, 9, 27, 217, 9, 2, 66, 2, 234, 136, 65, - 17, 9, 27, 151, 2, 66, 2, 122, 40, 17, 9, 27, 151, 2, 66, 2, 122, 65, 17, - 9, 27, 122, 2, 66, 2, 77, 40, 17, 9, 27, 122, 2, 66, 2, 109, 231, 198, - 40, 17, 9, 27, 221, 169, 2, 122, 2, 151, 65, 17, 9, 27, 221, 169, 2, 151, - 2, 122, 65, 17, 9, 27, 221, 169, 2, 151, 2, 109, 231, 198, 40, 17, 9, 27, - 221, 169, 2, 66, 2, 122, 40, 17, 9, 27, 221, 169, 2, 66, 2, 122, 65, 17, - 9, 27, 221, 169, 2, 66, 2, 151, 65, 17, 9, 27, 221, 169, 2, 66, 2, 66, - 40, 17, 9, 27, 221, 169, 2, 66, 2, 66, 65, 17, 9, 27, 222, 29, 2, 122, 2, - 122, 40, 17, 9, 27, 222, 29, 2, 122, 2, 122, 65, 17, 9, 27, 222, 29, 2, - 66, 2, 66, 40, 17, 9, 27, 220, 62, 2, 122, 2, 66, 40, 17, 9, 27, 220, 62, - 2, 122, 2, 66, 65, 17, 9, 27, 220, 62, 2, 151, 2, 77, 40, 17, 9, 27, 220, - 62, 2, 66, 2, 234, 136, 40, 17, 9, 27, 220, 62, 2, 66, 2, 234, 136, 65, - 17, 9, 27, 220, 62, 2, 66, 2, 66, 40, 17, 9, 27, 220, 62, 2, 66, 2, 66, - 65, 17, 9, 27, 248, 225, 2, 122, 2, 109, 231, 198, 40, 17, 9, 27, 248, - 225, 2, 234, 136, 2, 66, 40, 17, 9, 27, 248, 225, 2, 234, 136, 2, 66, 65, - 17, 9, 27, 217, 82, 2, 66, 2, 122, 40, 17, 9, 27, 217, 82, 2, 66, 2, 122, - 65, 17, 9, 27, 217, 82, 2, 66, 2, 66, 65, 17, 9, 27, 217, 82, 2, 66, 2, - 77, 40, 17, 9, 27, 254, 206, 2, 151, 2, 66, 40, 17, 9, 27, 254, 206, 2, - 66, 2, 66, 40, 17, 9, 27, 254, 206, 2, 66, 2, 66, 65, 17, 9, 27, 254, - 206, 2, 66, 2, 109, 231, 198, 40, 17, 9, 27, 242, 252, 2, 66, 2, 66, 40, - 17, 9, 27, 242, 252, 2, 66, 2, 77, 40, 17, 9, 27, 242, 252, 2, 66, 2, - 109, 231, 198, 40, 17, 9, 27, 244, 151, 2, 234, 136, 2, 66, 40, 17, 9, - 27, 244, 151, 2, 234, 136, 2, 66, 65, 17, 9, 27, 224, 85, 2, 66, 2, 122, - 40, 17, 9, 27, 224, 85, 2, 66, 2, 66, 40, 17, 9, 27, 233, 109, 2, 122, 2, - 66, 40, 17, 9, 27, 233, 109, 2, 122, 2, 77, 40, 17, 9, 27, 233, 109, 2, - 122, 2, 109, 231, 198, 40, 17, 9, 27, 233, 109, 2, 151, 2, 151, 65, 17, - 9, 27, 233, 109, 2, 151, 2, 151, 40, 17, 9, 27, 233, 109, 2, 234, 136, 2, - 66, 40, 17, 9, 27, 233, 109, 2, 234, 136, 2, 66, 65, 17, 9, 27, 233, 109, - 2, 66, 2, 122, 40, 17, 9, 27, 233, 109, 2, 66, 2, 122, 65, 17, 9, 27, 66, - 2, 122, 2, 151, 65, 17, 9, 27, 66, 2, 122, 2, 66, 65, 17, 9, 27, 66, 2, - 122, 2, 77, 40, 17, 9, 27, 66, 2, 151, 2, 122, 65, 17, 9, 27, 66, 2, 151, - 2, 66, 65, 17, 9, 27, 66, 2, 234, 136, 2, 151, 65, 17, 9, 27, 66, 2, 234, - 136, 2, 66, 65, 17, 9, 27, 66, 2, 151, 2, 234, 136, 65, 17, 9, 27, 241, - 226, 2, 66, 2, 151, 65, 17, 9, 27, 241, 226, 2, 66, 2, 66, 65, 17, 9, 27, - 228, 68, 2, 122, 2, 66, 65, 17, 9, 27, 228, 68, 2, 122, 2, 109, 231, 198, - 40, 17, 9, 27, 228, 68, 2, 151, 2, 66, 40, 17, 9, 27, 228, 68, 2, 151, 2, - 66, 65, 17, 9, 27, 228, 68, 2, 151, 2, 109, 231, 198, 40, 17, 9, 27, 228, - 68, 2, 66, 2, 77, 40, 17, 9, 27, 228, 68, 2, 66, 2, 109, 231, 198, 40, - 17, 9, 27, 77, 2, 66, 2, 66, 40, 17, 9, 27, 77, 2, 66, 2, 66, 65, 17, 9, - 27, 252, 63, 2, 234, 136, 2, 77, 40, 17, 9, 27, 217, 9, 2, 151, 2, 77, - 40, 17, 9, 27, 217, 9, 2, 151, 2, 109, 231, 198, 40, 17, 9, 27, 217, 9, - 2, 234, 136, 2, 77, 40, 17, 9, 27, 217, 9, 2, 234, 136, 2, 109, 231, 198, - 40, 17, 9, 27, 217, 9, 2, 66, 2, 77, 40, 17, 9, 27, 217, 9, 2, 66, 2, - 109, 231, 198, 40, 17, 9, 27, 151, 2, 66, 2, 77, 40, 17, 9, 27, 151, 2, - 122, 2, 109, 231, 198, 40, 17, 9, 27, 151, 2, 66, 2, 109, 231, 198, 40, - 17, 9, 27, 221, 169, 2, 234, 136, 2, 109, 231, 198, 40, 17, 9, 27, 222, - 29, 2, 122, 2, 77, 40, 17, 9, 27, 220, 62, 2, 122, 2, 77, 40, 17, 9, 27, - 248, 225, 2, 122, 2, 77, 40, 17, 9, 27, 233, 109, 2, 151, 2, 77, 40, 17, - 9, 27, 233, 109, 2, 66, 2, 77, 40, 17, 9, 27, 77, 2, 122, 2, 77, 40, 17, - 9, 27, 77, 2, 151, 2, 77, 40, 17, 9, 27, 77, 2, 66, 2, 77, 40, 17, 9, 27, - 66, 2, 66, 2, 77, 40, 17, 9, 27, 224, 85, 2, 66, 2, 77, 40, 17, 9, 27, - 228, 68, 2, 122, 2, 77, 40, 17, 9, 27, 224, 85, 2, 66, 2, 122, 65, 17, 9, - 27, 233, 109, 2, 122, 2, 66, 65, 17, 9, 27, 254, 206, 2, 66, 2, 77, 40, - 17, 9, 27, 235, 1, 2, 66, 2, 77, 40, 17, 9, 27, 228, 68, 2, 151, 2, 122, - 65, 17, 9, 27, 66, 2, 234, 136, 2, 77, 40, 17, 9, 27, 233, 109, 2, 151, - 2, 66, 65, 17, 9, 27, 235, 1, 2, 66, 2, 66, 40, 17, 9, 27, 233, 109, 2, - 151, 2, 66, 40, 17, 9, 27, 228, 68, 2, 151, 2, 122, 40, 17, 9, 27, 151, - 2, 122, 2, 77, 40, 17, 9, 27, 122, 2, 151, 2, 77, 40, 17, 9, 27, 66, 2, - 151, 2, 77, 40, 17, 9, 27, 244, 151, 2, 66, 2, 77, 40, 17, 9, 27, 252, - 63, 2, 122, 2, 77, 40, 17, 9, 27, 235, 1, 2, 66, 2, 66, 65, 17, 9, 27, - 254, 206, 2, 151, 2, 66, 65, 17, 9, 27, 222, 29, 2, 66, 2, 66, 65, 17, 9, - 27, 221, 169, 2, 234, 136, 2, 77, 40, 17, 9, 27, 228, 68, 2, 151, 2, 77, - 40, 17, 9, 27, 222, 6, 214, 128, 253, 246, 234, 10, 218, 132, 5, 53, 17, - 9, 27, 224, 81, 214, 128, 253, 246, 234, 10, 218, 132, 5, 53, 17, 9, 27, - 254, 162, 53, 17, 9, 27, 254, 192, 53, 17, 9, 27, 230, 158, 53, 17, 9, - 27, 222, 7, 53, 17, 9, 27, 223, 146, 53, 17, 9, 27, 254, 181, 53, 17, 9, - 27, 212, 49, 53, 17, 9, 27, 222, 6, 53, 17, 9, 27, 222, 5, 254, 181, 212, - 48, 9, 27, 235, 140, 223, 37, 50, 9, 27, 251, 238, 254, 47, 254, 48, 45, - 221, 158, 45, 221, 47, 45, 220, 235, 45, 220, 224, 45, 220, 213, 45, 220, - 202, 45, 220, 191, 45, 220, 180, 45, 220, 169, 45, 221, 157, 45, 221, - 146, 45, 221, 135, 45, 221, 124, 45, 221, 113, 45, 221, 102, 45, 221, 91, - 224, 197, 244, 28, 31, 67, 249, 227, 224, 197, 244, 28, 31, 67, 110, 249, - 227, 224, 197, 244, 28, 31, 67, 110, 243, 236, 218, 131, 224, 197, 244, - 28, 31, 67, 249, 234, 224, 197, 244, 28, 31, 67, 220, 152, 224, 197, 244, - 28, 31, 67, 245, 39, 79, 224, 197, 244, 28, 31, 67, 224, 16, 79, 224, - 197, 244, 28, 31, 67, 43, 71, 233, 26, 127, 224, 197, 244, 28, 31, 67, - 44, 71, 233, 26, 251, 164, 224, 197, 244, 28, 31, 67, 203, 245, 171, 38, - 27, 43, 242, 34, 38, 27, 44, 242, 34, 38, 52, 216, 90, 43, 242, 34, 38, - 52, 216, 90, 44, 242, 34, 38, 231, 238, 43, 242, 34, 38, 231, 238, 44, - 242, 34, 38, 249, 205, 231, 237, 224, 197, 244, 28, 31, 67, 113, 59, 233, - 62, 224, 197, 244, 28, 31, 67, 245, 168, 248, 164, 224, 197, 244, 28, 31, - 67, 245, 159, 248, 164, 224, 197, 244, 28, 31, 67, 121, 232, 219, 224, - 197, 244, 28, 31, 67, 212, 32, 121, 232, 219, 224, 197, 244, 28, 31, 67, - 43, 226, 7, 224, 197, 244, 28, 31, 67, 44, 226, 7, 224, 197, 244, 28, 31, - 67, 43, 249, 107, 127, 224, 197, 244, 28, 31, 67, 44, 249, 107, 127, 224, - 197, 244, 28, 31, 67, 43, 216, 7, 220, 55, 127, 224, 197, 244, 28, 31, - 67, 44, 216, 7, 220, 55, 127, 224, 197, 244, 28, 31, 67, 43, 85, 233, 26, - 127, 224, 197, 244, 28, 31, 67, 44, 85, 233, 26, 127, 224, 197, 244, 28, - 31, 67, 43, 52, 254, 118, 127, 224, 197, 244, 28, 31, 67, 44, 52, 254, - 118, 127, 224, 197, 244, 28, 31, 67, 43, 254, 118, 127, 224, 197, 244, - 28, 31, 67, 44, 254, 118, 127, 224, 197, 244, 28, 31, 67, 43, 249, 169, - 127, 224, 197, 244, 28, 31, 67, 44, 249, 169, 127, 224, 197, 244, 28, 31, - 67, 43, 71, 249, 169, 127, 224, 197, 244, 28, 31, 67, 44, 71, 249, 169, - 127, 220, 133, 247, 128, 71, 220, 133, 247, 128, 224, 197, 244, 28, 31, - 67, 43, 42, 127, 224, 197, 244, 28, 31, 67, 44, 42, 127, 248, 163, 226, - 123, 250, 180, 226, 123, 212, 32, 226, 123, 52, 212, 32, 226, 123, 248, - 163, 121, 232, 219, 250, 180, 121, 232, 219, 212, 32, 121, 232, 219, 4, - 249, 227, 4, 110, 249, 227, 4, 243, 236, 218, 131, 4, 220, 152, 4, 249, - 234, 4, 224, 16, 79, 4, 245, 39, 79, 4, 245, 168, 248, 164, 4, 43, 226, - 7, 4, 44, 226, 7, 4, 43, 249, 107, 127, 4, 44, 249, 107, 127, 4, 43, 216, - 7, 220, 55, 127, 4, 44, 216, 7, 220, 55, 127, 4, 54, 50, 4, 254, 134, 4, - 253, 224, 4, 96, 50, 4, 240, 174, 4, 233, 21, 50, 4, 242, 137, 50, 4, - 245, 106, 50, 4, 223, 53, 219, 48, 4, 247, 140, 50, 4, 225, 185, 50, 4, - 249, 225, 253, 214, 9, 244, 172, 53, 17, 9, 217, 45, 2, 244, 172, 48, 9, - 248, 191, 53, 17, 9, 217, 79, 244, 9, 9, 234, 210, 53, 17, 9, 244, 174, - 53, 17, 9, 244, 174, 147, 17, 9, 248, 193, 53, 17, 9, 248, 193, 147, 17, - 9, 234, 212, 53, 17, 9, 234, 212, 147, 17, 9, 220, 96, 53, 17, 9, 220, - 96, 147, 17, 9, 218, 47, 53, 17, 9, 218, 47, 147, 17, 9, 1, 182, 53, 17, - 9, 1, 109, 2, 231, 233, 72, 53, 17, 9, 1, 109, 2, 231, 233, 72, 40, 17, - 9, 1, 109, 2, 182, 72, 53, 17, 9, 1, 109, 2, 182, 72, 40, 17, 9, 1, 212, - 31, 2, 182, 72, 53, 17, 9, 1, 212, 31, 2, 182, 72, 40, 17, 9, 1, 109, 2, - 182, 252, 51, 53, 17, 9, 1, 109, 2, 182, 252, 51, 40, 17, 9, 1, 77, 2, - 182, 72, 53, 17, 9, 1, 77, 2, 182, 72, 40, 17, 9, 1, 77, 2, 182, 72, 65, - 17, 9, 1, 77, 2, 182, 72, 147, 17, 9, 1, 109, 53, 17, 9, 1, 109, 40, 17, - 9, 1, 252, 63, 53, 17, 9, 1, 252, 63, 40, 17, 9, 1, 252, 63, 65, 17, 9, - 1, 252, 63, 147, 17, 9, 1, 217, 9, 231, 170, 53, 17, 9, 1, 217, 9, 231, - 170, 40, 17, 9, 1, 217, 9, 53, 17, 9, 1, 217, 9, 40, 17, 9, 1, 217, 9, - 65, 17, 9, 1, 217, 9, 147, 17, 9, 1, 216, 194, 53, 17, 9, 1, 216, 194, - 40, 17, 9, 1, 216, 194, 65, 17, 9, 1, 216, 194, 147, 17, 9, 1, 151, 53, - 17, 9, 1, 151, 40, 17, 9, 1, 151, 65, 17, 9, 1, 151, 147, 17, 9, 1, 122, - 53, 17, 9, 1, 122, 40, 17, 9, 1, 122, 65, 17, 9, 1, 122, 147, 17, 9, 1, - 234, 136, 53, 17, 9, 1, 234, 136, 40, 17, 9, 1, 234, 136, 65, 17, 9, 1, - 234, 136, 147, 17, 9, 1, 248, 204, 53, 17, 9, 1, 248, 204, 40, 17, 9, 1, - 216, 204, 53, 17, 9, 1, 216, 204, 40, 17, 9, 1, 223, 99, 53, 17, 9, 1, - 223, 99, 40, 17, 9, 1, 210, 109, 53, 17, 9, 1, 210, 109, 40, 17, 9, 1, - 221, 169, 53, 17, 9, 1, 221, 169, 40, 17, 9, 1, 221, 169, 65, 17, 9, 1, - 221, 169, 147, 17, 9, 1, 220, 62, 53, 17, 9, 1, 220, 62, 40, 17, 9, 1, - 220, 62, 65, 17, 9, 1, 220, 62, 147, 17, 9, 1, 222, 29, 53, 17, 9, 1, - 222, 29, 40, 17, 9, 1, 222, 29, 65, 17, 9, 1, 222, 29, 147, 17, 9, 1, - 248, 225, 53, 17, 9, 1, 248, 225, 40, 17, 9, 1, 248, 225, 65, 17, 9, 1, - 248, 225, 147, 17, 9, 1, 217, 82, 53, 17, 9, 1, 217, 82, 40, 17, 9, 1, - 217, 82, 65, 17, 9, 1, 217, 82, 147, 17, 9, 1, 210, 112, 53, 17, 9, 1, - 210, 112, 40, 17, 9, 1, 210, 112, 65, 17, 9, 1, 210, 112, 147, 17, 9, 1, - 254, 206, 53, 17, 9, 1, 254, 206, 40, 17, 9, 1, 254, 206, 65, 17, 9, 1, - 254, 206, 147, 17, 9, 1, 242, 252, 53, 17, 9, 1, 242, 252, 40, 17, 9, 1, - 242, 252, 65, 17, 9, 1, 242, 252, 147, 17, 9, 1, 244, 151, 53, 17, 9, 1, - 244, 151, 40, 17, 9, 1, 244, 151, 65, 17, 9, 1, 244, 151, 147, 17, 9, 1, - 224, 85, 53, 17, 9, 1, 224, 85, 40, 17, 9, 1, 224, 85, 65, 17, 9, 1, 224, - 85, 147, 17, 9, 1, 235, 1, 53, 17, 9, 1, 235, 1, 40, 17, 9, 1, 235, 1, - 65, 17, 9, 1, 235, 1, 147, 17, 9, 1, 233, 109, 53, 17, 9, 1, 233, 109, - 40, 17, 9, 1, 233, 109, 65, 17, 9, 1, 233, 109, 147, 17, 9, 1, 66, 53, - 17, 9, 1, 66, 40, 17, 9, 1, 66, 65, 17, 9, 1, 66, 147, 17, 9, 1, 228, 68, - 53, 17, 9, 1, 228, 68, 40, 17, 9, 1, 228, 68, 65, 17, 9, 1, 228, 68, 147, - 17, 9, 1, 241, 226, 53, 17, 9, 1, 241, 226, 40, 17, 9, 1, 241, 226, 65, - 17, 9, 1, 241, 226, 147, 17, 9, 1, 212, 31, 53, 17, 9, 1, 212, 31, 40, - 17, 9, 1, 109, 231, 198, 53, 17, 9, 1, 109, 231, 198, 40, 17, 9, 1, 77, - 53, 17, 9, 1, 77, 40, 17, 9, 1, 77, 65, 17, 9, 1, 77, 147, 17, 9, 27, - 233, 109, 2, 109, 2, 231, 233, 72, 53, 17, 9, 27, 233, 109, 2, 109, 2, - 231, 233, 72, 40, 17, 9, 27, 233, 109, 2, 109, 2, 182, 72, 53, 17, 9, 27, - 233, 109, 2, 109, 2, 182, 72, 40, 17, 9, 27, 233, 109, 2, 109, 2, 182, - 252, 51, 53, 17, 9, 27, 233, 109, 2, 109, 2, 182, 252, 51, 40, 17, 9, 27, - 233, 109, 2, 109, 53, 17, 9, 27, 233, 109, 2, 109, 40, 17, 210, 87, 211, - 245, 228, 78, 219, 20, 126, 245, 39, 79, 126, 224, 1, 79, 126, 54, 50, - 126, 247, 140, 50, 126, 225, 185, 50, 126, 254, 134, 126, 254, 65, 126, - 43, 226, 7, 126, 44, 226, 7, 126, 253, 224, 126, 96, 50, 126, 249, 227, - 126, 240, 174, 126, 243, 236, 218, 131, 126, 219, 48, 126, 21, 210, 86, - 126, 21, 111, 126, 21, 105, 126, 21, 158, 126, 21, 161, 126, 21, 190, - 126, 21, 195, 126, 21, 199, 126, 21, 196, 126, 21, 201, 126, 249, 234, - 126, 220, 152, 126, 233, 21, 50, 126, 245, 106, 50, 126, 242, 137, 50, - 126, 224, 16, 79, 126, 249, 225, 253, 214, 126, 7, 6, 1, 61, 126, 7, 6, - 1, 253, 166, 126, 7, 6, 1, 251, 74, 126, 7, 6, 1, 249, 68, 126, 7, 6, 1, - 76, 126, 7, 6, 1, 245, 14, 126, 7, 6, 1, 243, 209, 126, 7, 6, 1, 242, 67, - 126, 7, 6, 1, 74, 126, 7, 6, 1, 235, 150, 126, 7, 6, 1, 235, 29, 126, 7, - 6, 1, 156, 126, 7, 6, 1, 194, 126, 7, 6, 1, 230, 30, 126, 7, 6, 1, 78, - 126, 7, 6, 1, 226, 109, 126, 7, 6, 1, 224, 99, 126, 7, 6, 1, 153, 126, 7, - 6, 1, 222, 93, 126, 7, 6, 1, 217, 153, 126, 7, 6, 1, 69, 126, 7, 6, 1, - 214, 105, 126, 7, 6, 1, 212, 98, 126, 7, 6, 1, 211, 178, 126, 7, 6, 1, - 211, 117, 126, 7, 6, 1, 210, 159, 126, 43, 42, 127, 126, 223, 53, 219, - 48, 126, 44, 42, 127, 126, 250, 39, 255, 23, 126, 121, 232, 219, 126, - 242, 144, 255, 23, 126, 7, 4, 1, 61, 126, 7, 4, 1, 253, 166, 126, 7, 4, - 1, 251, 74, 126, 7, 4, 1, 249, 68, 126, 7, 4, 1, 76, 126, 7, 4, 1, 245, - 14, 126, 7, 4, 1, 243, 209, 126, 7, 4, 1, 242, 67, 126, 7, 4, 1, 74, 126, - 7, 4, 1, 235, 150, 126, 7, 4, 1, 235, 29, 126, 7, 4, 1, 156, 126, 7, 4, - 1, 194, 126, 7, 4, 1, 230, 30, 126, 7, 4, 1, 78, 126, 7, 4, 1, 226, 109, - 126, 7, 4, 1, 224, 99, 126, 7, 4, 1, 153, 126, 7, 4, 1, 222, 93, 126, 7, - 4, 1, 217, 153, 126, 7, 4, 1, 69, 126, 7, 4, 1, 214, 105, 126, 7, 4, 1, - 212, 98, 126, 7, 4, 1, 211, 178, 126, 7, 4, 1, 211, 117, 126, 7, 4, 1, - 210, 159, 126, 43, 249, 107, 127, 126, 67, 232, 219, 126, 44, 249, 107, - 127, 126, 184, 126, 43, 71, 226, 7, 126, 44, 71, 226, 7, 101, 110, 243, - 236, 218, 131, 101, 43, 249, 169, 127, 101, 44, 249, 169, 127, 101, 110, - 249, 227, 101, 56, 230, 229, 247, 128, 101, 56, 1, 211, 227, 101, 56, 1, - 4, 61, 101, 56, 1, 4, 74, 101, 56, 1, 4, 69, 101, 56, 1, 4, 76, 101, 56, - 1, 4, 78, 101, 56, 1, 4, 192, 101, 56, 1, 4, 210, 212, 101, 56, 1, 4, - 210, 244, 101, 56, 1, 4, 215, 119, 101, 234, 207, 224, 176, 219, 33, 79, - 101, 56, 1, 61, 101, 56, 1, 74, 101, 56, 1, 69, 101, 56, 1, 76, 101, 56, - 1, 78, 101, 56, 1, 176, 101, 56, 1, 234, 98, 101, 56, 1, 233, 223, 101, - 56, 1, 234, 188, 101, 56, 1, 234, 34, 101, 56, 1, 206, 101, 56, 1, 219, - 193, 101, 56, 1, 218, 84, 101, 56, 1, 221, 183, 101, 56, 1, 219, 60, 101, - 56, 1, 217, 106, 101, 56, 1, 216, 118, 101, 56, 1, 215, 119, 101, 56, 1, - 217, 23, 101, 56, 1, 112, 101, 56, 1, 198, 101, 56, 1, 228, 238, 101, 56, - 1, 227, 242, 101, 56, 1, 229, 112, 101, 56, 1, 228, 79, 101, 56, 1, 162, - 101, 56, 1, 241, 187, 101, 56, 1, 240, 229, 101, 56, 1, 241, 245, 101, - 56, 1, 241, 75, 101, 56, 1, 186, 101, 56, 1, 230, 235, 101, 56, 1, 230, - 107, 101, 56, 1, 231, 96, 101, 56, 1, 230, 166, 101, 56, 1, 192, 101, 56, - 1, 210, 212, 101, 56, 1, 210, 244, 101, 56, 1, 205, 101, 56, 1, 223, 38, - 101, 56, 1, 222, 142, 101, 56, 1, 223, 131, 101, 56, 1, 222, 213, 101, - 56, 1, 212, 65, 101, 56, 1, 230, 30, 101, 56, 213, 135, 219, 33, 79, 101, - 56, 220, 157, 219, 33, 79, 101, 24, 244, 111, 101, 24, 1, 234, 64, 101, - 24, 1, 218, 217, 101, 24, 1, 234, 57, 101, 24, 1, 228, 231, 101, 24, 1, - 228, 229, 101, 24, 1, 228, 228, 101, 24, 1, 216, 102, 101, 24, 1, 218, - 206, 101, 24, 1, 223, 29, 101, 24, 1, 223, 24, 101, 24, 1, 223, 21, 101, - 24, 1, 223, 14, 101, 24, 1, 223, 9, 101, 24, 1, 223, 4, 101, 24, 1, 223, - 15, 101, 24, 1, 223, 27, 101, 24, 1, 230, 222, 101, 24, 1, 225, 98, 101, - 24, 1, 218, 214, 101, 24, 1, 225, 87, 101, 24, 1, 219, 150, 101, 24, 1, - 218, 211, 101, 24, 1, 236, 63, 101, 24, 1, 250, 54, 101, 24, 1, 218, 221, - 101, 24, 1, 250, 114, 101, 24, 1, 234, 116, 101, 24, 1, 216, 174, 101, - 24, 1, 225, 134, 101, 24, 1, 241, 179, 101, 24, 1, 61, 101, 24, 1, 254, - 252, 101, 24, 1, 192, 101, 24, 1, 211, 92, 101, 24, 1, 245, 125, 101, 24, - 1, 76, 101, 24, 1, 211, 36, 101, 24, 1, 211, 47, 101, 24, 1, 78, 101, 24, - 1, 212, 65, 101, 24, 1, 212, 62, 101, 24, 1, 226, 238, 101, 24, 1, 210, - 244, 101, 24, 1, 69, 101, 24, 1, 212, 11, 101, 24, 1, 212, 22, 101, 24, - 1, 211, 250, 101, 24, 1, 210, 212, 101, 24, 1, 245, 63, 101, 24, 1, 211, - 8, 101, 24, 1, 74, 126, 250, 184, 50, 126, 224, 231, 50, 126, 228, 57, - 50, 126, 231, 237, 126, 251, 143, 130, 126, 211, 40, 50, 126, 211, 217, - 50, 101, 244, 26, 193, 213, 239, 101, 140, 75, 101, 214, 153, 75, 101, - 97, 75, 101, 246, 112, 75, 101, 85, 218, 236, 101, 71, 250, 43, 235, 211, - 254, 107, 254, 128, 235, 211, 254, 107, 220, 139, 235, 211, 254, 107, - 216, 237, 226, 253, 223, 75, 250, 150, 223, 75, 250, 150, 62, 57, 3, 253, - 150, 61, 62, 57, 3, 253, 119, 76, 62, 57, 3, 253, 128, 74, 62, 57, 3, - 253, 96, 78, 62, 57, 3, 253, 146, 69, 62, 57, 3, 253, 165, 248, 229, 62, - 57, 3, 253, 112, 248, 98, 62, 57, 3, 253, 152, 248, 11, 62, 57, 3, 253, - 142, 247, 153, 62, 57, 3, 253, 106, 246, 86, 62, 57, 3, 253, 100, 235, - 147, 62, 57, 3, 253, 111, 235, 132, 62, 57, 3, 253, 121, 235, 74, 62, 57, - 3, 253, 92, 235, 57, 62, 57, 3, 253, 80, 176, 62, 57, 3, 253, 113, 234, - 188, 62, 57, 3, 253, 90, 234, 98, 62, 57, 3, 253, 87, 234, 34, 62, 57, 3, - 253, 76, 233, 223, 62, 57, 3, 253, 77, 186, 62, 57, 3, 253, 143, 231, 96, - 62, 57, 3, 253, 84, 230, 235, 62, 57, 3, 253, 141, 230, 166, 62, 57, 3, - 253, 133, 230, 107, 62, 57, 3, 253, 154, 198, 62, 57, 3, 253, 132, 229, - 112, 62, 57, 3, 253, 126, 228, 238, 62, 57, 3, 253, 105, 228, 79, 62, 57, - 3, 253, 102, 227, 242, 62, 57, 3, 253, 161, 191, 62, 57, 3, 253, 85, 225, - 224, 62, 57, 3, 253, 118, 225, 111, 62, 57, 3, 253, 145, 225, 19, 62, 57, - 3, 253, 107, 224, 153, 62, 57, 3, 253, 140, 224, 91, 62, 57, 3, 253, 79, - 224, 72, 62, 57, 3, 253, 135, 224, 56, 62, 57, 3, 253, 124, 224, 45, 62, - 57, 3, 253, 97, 205, 62, 57, 3, 253, 129, 223, 131, 62, 57, 3, 253, 104, - 223, 38, 62, 57, 3, 253, 163, 222, 213, 62, 57, 3, 253, 130, 222, 142, - 62, 57, 3, 253, 125, 206, 62, 57, 3, 253, 148, 221, 183, 62, 57, 3, 253, - 116, 219, 193, 62, 57, 3, 253, 144, 219, 60, 62, 57, 3, 253, 99, 218, 84, - 62, 57, 3, 253, 98, 217, 106, 62, 57, 3, 253, 159, 217, 23, 62, 57, 3, - 253, 120, 216, 118, 62, 57, 3, 253, 157, 112, 62, 57, 3, 253, 88, 215, - 119, 62, 57, 3, 253, 103, 212, 65, 62, 57, 3, 253, 82, 212, 22, 62, 57, - 3, 253, 117, 211, 250, 62, 57, 3, 253, 115, 211, 227, 62, 57, 3, 253, - 139, 210, 116, 62, 57, 3, 253, 83, 210, 94, 62, 57, 3, 253, 136, 210, 23, - 62, 57, 3, 253, 131, 255, 84, 62, 57, 3, 253, 114, 255, 83, 62, 57, 3, - 253, 73, 253, 200, 62, 57, 3, 253, 86, 246, 54, 62, 57, 3, 253, 69, 246, - 53, 62, 57, 3, 253, 109, 227, 178, 62, 57, 3, 253, 127, 224, 151, 62, 57, - 3, 253, 95, 224, 155, 62, 57, 3, 253, 81, 223, 189, 62, 57, 3, 253, 123, - 223, 188, 62, 57, 3, 253, 89, 222, 212, 62, 57, 3, 253, 91, 217, 103, 62, - 57, 3, 253, 71, 215, 78, 62, 57, 3, 253, 68, 105, 62, 57, 16, 253, 138, - 62, 57, 16, 253, 137, 62, 57, 16, 253, 134, 62, 57, 16, 253, 122, 62, 57, - 16, 253, 110, 62, 57, 16, 253, 108, 62, 57, 16, 253, 101, 62, 57, 16, - 253, 94, 62, 57, 16, 253, 93, 62, 57, 16, 253, 78, 62, 57, 16, 253, 75, - 62, 57, 16, 253, 74, 62, 57, 16, 253, 72, 62, 57, 16, 253, 70, 62, 57, - 106, 253, 67, 231, 190, 62, 57, 106, 253, 66, 211, 221, 62, 57, 106, 253, - 65, 248, 82, 62, 57, 106, 253, 64, 245, 103, 62, 57, 106, 253, 63, 231, - 164, 62, 57, 106, 253, 62, 218, 164, 62, 57, 106, 253, 61, 245, 45, 62, - 57, 106, 253, 60, 223, 156, 62, 57, 106, 253, 59, 220, 64, 62, 57, 106, - 253, 58, 241, 244, 62, 57, 106, 253, 57, 219, 27, 62, 57, 106, 253, 56, - 251, 211, 62, 57, 106, 253, 55, 249, 153, 62, 57, 106, 253, 54, 251, 123, - 62, 57, 106, 253, 53, 212, 2, 62, 57, 106, 253, 52, 252, 144, 62, 57, - 106, 253, 51, 226, 209, 62, 57, 106, 253, 50, 219, 0, 62, 57, 106, 253, - 49, 249, 76, 62, 57, 230, 147, 253, 48, 234, 230, 62, 57, 230, 147, 253, - 47, 234, 238, 62, 57, 106, 253, 46, 226, 222, 62, 57, 106, 253, 45, 211, - 236, 62, 57, 106, 253, 44, 62, 57, 230, 147, 253, 43, 254, 25, 62, 57, - 230, 147, 253, 42, 231, 57, 62, 57, 106, 253, 41, 251, 142, 62, 57, 106, - 253, 40, 242, 173, 62, 57, 106, 253, 39, 62, 57, 106, 253, 38, 211, 212, - 62, 57, 106, 253, 37, 62, 57, 106, 253, 36, 62, 57, 106, 253, 35, 240, - 255, 62, 57, 106, 253, 34, 62, 57, 106, 253, 33, 62, 57, 106, 253, 32, - 62, 57, 230, 147, 253, 30, 215, 92, 62, 57, 106, 253, 29, 62, 57, 106, - 253, 28, 62, 57, 106, 253, 27, 250, 2, 62, 57, 106, 253, 26, 62, 57, 106, - 253, 25, 62, 57, 106, 253, 24, 243, 100, 62, 57, 106, 253, 23, 254, 12, - 62, 57, 106, 253, 22, 62, 57, 106, 253, 21, 62, 57, 106, 253, 20, 62, 57, - 106, 253, 19, 62, 57, 106, 253, 18, 62, 57, 106, 253, 17, 62, 57, 106, - 253, 16, 62, 57, 106, 253, 15, 62, 57, 106, 253, 14, 62, 57, 106, 253, - 13, 230, 139, 62, 57, 106, 253, 12, 62, 57, 106, 253, 11, 215, 236, 62, - 57, 106, 253, 10, 62, 57, 106, 253, 9, 62, 57, 106, 253, 8, 62, 57, 106, - 253, 7, 62, 57, 106, 253, 6, 62, 57, 106, 253, 5, 62, 57, 106, 253, 4, - 62, 57, 106, 253, 3, 62, 57, 106, 253, 2, 62, 57, 106, 253, 1, 62, 57, - 106, 253, 0, 62, 57, 106, 252, 255, 241, 218, 62, 57, 106, 252, 234, 244, - 36, 62, 57, 106, 252, 231, 252, 124, 62, 57, 106, 252, 226, 219, 7, 62, - 57, 106, 252, 225, 75, 62, 57, 106, 252, 224, 62, 57, 106, 252, 223, 217, - 237, 62, 57, 106, 252, 222, 62, 57, 106, 252, 221, 62, 57, 106, 252, 220, - 211, 254, 250, 147, 62, 57, 106, 252, 219, 250, 147, 62, 57, 106, 252, - 218, 250, 148, 244, 7, 62, 57, 106, 252, 217, 212, 0, 62, 57, 106, 252, - 216, 62, 57, 106, 252, 215, 62, 57, 230, 147, 252, 214, 247, 206, 62, 57, - 106, 252, 213, 62, 57, 106, 252, 212, 62, 57, 106, 252, 210, 62, 57, 106, - 252, 209, 62, 57, 106, 252, 208, 62, 57, 106, 252, 207, 248, 167, 62, 57, - 106, 252, 206, 62, 57, 106, 252, 205, 62, 57, 106, 252, 204, 62, 57, 106, - 252, 203, 62, 57, 106, 252, 202, 62, 57, 106, 213, 186, 253, 31, 62, 57, - 106, 213, 186, 252, 254, 62, 57, 106, 213, 186, 252, 253, 62, 57, 106, - 213, 186, 252, 252, 62, 57, 106, 213, 186, 252, 251, 62, 57, 106, 213, - 186, 252, 250, 62, 57, 106, 213, 186, 252, 249, 62, 57, 106, 213, 186, - 252, 248, 62, 57, 106, 213, 186, 252, 247, 62, 57, 106, 213, 186, 252, - 246, 62, 57, 106, 213, 186, 252, 245, 62, 57, 106, 213, 186, 252, 244, - 62, 57, 106, 213, 186, 252, 243, 62, 57, 106, 213, 186, 252, 242, 62, 57, - 106, 213, 186, 252, 241, 62, 57, 106, 213, 186, 252, 240, 62, 57, 106, - 213, 186, 252, 239, 62, 57, 106, 213, 186, 252, 238, 62, 57, 106, 213, - 186, 252, 237, 62, 57, 106, 213, 186, 252, 236, 62, 57, 106, 213, 186, - 252, 235, 62, 57, 106, 213, 186, 252, 233, 62, 57, 106, 213, 186, 252, - 232, 62, 57, 106, 213, 186, 252, 230, 62, 57, 106, 213, 186, 252, 229, - 62, 57, 106, 213, 186, 252, 228, 62, 57, 106, 213, 186, 252, 227, 62, 57, - 106, 213, 186, 252, 211, 62, 57, 106, 213, 186, 252, 201, 254, 245, 211, - 209, 220, 140, 232, 219, 254, 245, 211, 209, 220, 140, 247, 128, 254, - 245, 250, 138, 79, 254, 245, 54, 111, 254, 245, 54, 105, 254, 245, 54, - 158, 254, 245, 54, 161, 254, 245, 54, 190, 254, 245, 54, 195, 254, 245, - 54, 199, 254, 245, 54, 196, 254, 245, 54, 201, 254, 245, 54, 216, 248, - 254, 245, 54, 215, 73, 254, 245, 54, 216, 163, 254, 245, 54, 244, 23, - 254, 245, 54, 244, 122, 254, 245, 54, 219, 113, 254, 245, 54, 220, 118, - 254, 245, 54, 245, 192, 254, 245, 54, 228, 200, 254, 245, 54, 123, 240, - 217, 254, 245, 54, 113, 240, 217, 254, 245, 54, 134, 240, 217, 254, 245, - 54, 244, 19, 240, 217, 254, 245, 54, 244, 89, 240, 217, 254, 245, 54, - 219, 127, 240, 217, 254, 245, 54, 220, 124, 240, 217, 254, 245, 54, 245, - 201, 240, 217, 254, 245, 54, 228, 205, 240, 217, 254, 245, 54, 123, 216, - 148, 254, 245, 54, 113, 216, 148, 254, 245, 54, 134, 216, 148, 254, 245, - 54, 244, 19, 216, 148, 254, 245, 54, 244, 89, 216, 148, 254, 245, 54, - 219, 127, 216, 148, 254, 245, 54, 220, 124, 216, 148, 254, 245, 54, 245, - 201, 216, 148, 254, 245, 54, 228, 205, 216, 148, 254, 245, 54, 216, 249, - 216, 148, 254, 245, 54, 215, 74, 216, 148, 254, 245, 54, 216, 164, 216, - 148, 254, 245, 54, 244, 24, 216, 148, 254, 245, 54, 244, 123, 216, 148, - 254, 245, 54, 219, 114, 216, 148, 254, 245, 54, 220, 119, 216, 148, 254, - 245, 54, 245, 193, 216, 148, 254, 245, 54, 228, 201, 216, 148, 254, 245, - 212, 14, 252, 136, 214, 173, 254, 245, 212, 14, 244, 100, 218, 60, 254, - 245, 212, 14, 221, 178, 218, 60, 254, 245, 212, 14, 216, 170, 218, 60, - 254, 245, 212, 14, 244, 12, 218, 60, 254, 245, 246, 89, 231, 95, 244, - 100, 218, 60, 254, 245, 232, 205, 231, 95, 244, 100, 218, 60, 254, 245, - 231, 95, 221, 178, 218, 60, 254, 245, 231, 95, 216, 170, 218, 60, 26, - 255, 15, 253, 202, 123, 224, 24, 26, 255, 15, 253, 202, 123, 242, 34, 26, - 255, 15, 253, 202, 123, 246, 108, 26, 255, 15, 253, 202, 190, 26, 255, - 15, 253, 202, 244, 122, 26, 255, 15, 253, 202, 244, 89, 240, 217, 26, - 255, 15, 253, 202, 244, 89, 216, 148, 26, 255, 15, 253, 202, 244, 123, - 216, 148, 26, 255, 15, 253, 202, 244, 89, 217, 68, 26, 255, 15, 253, 202, - 216, 249, 217, 68, 26, 255, 15, 253, 202, 244, 123, 217, 68, 26, 255, 15, - 253, 202, 123, 240, 218, 217, 68, 26, 255, 15, 253, 202, 244, 89, 240, - 218, 217, 68, 26, 255, 15, 253, 202, 123, 216, 149, 217, 68, 26, 255, 15, - 253, 202, 244, 89, 216, 149, 217, 68, 26, 255, 15, 253, 202, 244, 89, - 218, 152, 26, 255, 15, 253, 202, 216, 249, 218, 152, 26, 255, 15, 253, - 202, 244, 123, 218, 152, 26, 255, 15, 253, 202, 123, 240, 218, 218, 152, - 26, 255, 15, 253, 202, 244, 89, 240, 218, 218, 152, 26, 255, 15, 253, - 202, 123, 216, 149, 218, 152, 26, 255, 15, 253, 202, 216, 249, 216, 149, - 218, 152, 26, 255, 15, 253, 202, 244, 123, 216, 149, 218, 152, 26, 255, - 15, 253, 202, 216, 249, 230, 169, 26, 255, 15, 241, 212, 123, 225, 34, - 26, 255, 15, 216, 182, 111, 26, 255, 15, 241, 208, 111, 26, 255, 15, 245, - 112, 105, 26, 255, 15, 216, 182, 105, 26, 255, 15, 249, 73, 113, 246, - 107, 26, 255, 15, 245, 112, 113, 246, 107, 26, 255, 15, 215, 204, 190, - 26, 255, 15, 215, 204, 216, 248, 26, 255, 15, 215, 204, 216, 249, 254, - 149, 17, 26, 255, 15, 241, 208, 216, 248, 26, 255, 15, 231, 46, 216, 248, - 26, 255, 15, 216, 182, 216, 248, 26, 255, 15, 216, 182, 216, 163, 26, - 255, 15, 215, 204, 244, 122, 26, 255, 15, 215, 204, 244, 123, 254, 149, - 17, 26, 255, 15, 241, 208, 244, 122, 26, 255, 15, 216, 182, 244, 122, 26, - 255, 15, 216, 182, 123, 240, 217, 26, 255, 15, 216, 182, 134, 240, 217, - 26, 255, 15, 245, 112, 244, 89, 240, 217, 26, 255, 15, 215, 204, 244, 89, - 240, 217, 26, 255, 15, 216, 182, 244, 89, 240, 217, 26, 255, 15, 250, - 235, 244, 89, 240, 217, 26, 255, 15, 229, 187, 244, 89, 240, 217, 26, - 255, 15, 216, 182, 123, 216, 148, 26, 255, 15, 216, 182, 244, 89, 216, - 148, 26, 255, 15, 248, 65, 244, 89, 230, 169, 26, 255, 15, 218, 120, 244, - 123, 230, 169, 26, 123, 163, 50, 26, 123, 163, 5, 254, 149, 17, 26, 113, - 216, 168, 50, 26, 134, 224, 23, 50, 26, 211, 45, 50, 26, 217, 69, 50, 26, - 246, 109, 50, 26, 226, 250, 50, 26, 113, 226, 249, 50, 26, 134, 226, 249, - 50, 26, 244, 19, 226, 249, 50, 26, 244, 89, 226, 249, 50, 26, 231, 40, - 50, 26, 233, 163, 252, 136, 50, 26, 232, 200, 50, 26, 226, 135, 50, 26, - 211, 159, 50, 26, 253, 251, 50, 26, 254, 8, 50, 26, 242, 151, 50, 26, - 215, 187, 252, 136, 50, 26, 210, 87, 50, 222, 200, 220, 115, 50, 222, - 200, 214, 185, 50, 222, 200, 220, 144, 50, 222, 200, 220, 113, 50, 222, - 200, 247, 221, 220, 113, 50, 222, 200, 219, 170, 50, 222, 200, 248, 61, - 50, 222, 200, 224, 9, 50, 222, 200, 220, 131, 50, 222, 200, 246, 68, 50, - 222, 200, 253, 246, 50, 222, 200, 250, 179, 50, 225, 146, 247, 199, 5, - 225, 216, 225, 146, 247, 199, 5, 225, 27, 241, 242, 225, 146, 247, 199, - 5, 217, 46, 241, 242, 225, 146, 247, 199, 5, 250, 255, 225, 146, 247, - 199, 5, 250, 109, 225, 146, 247, 199, 5, 211, 221, 225, 146, 247, 199, 5, - 241, 218, 225, 146, 247, 199, 5, 243, 92, 225, 146, 247, 199, 5, 216, - 117, 225, 146, 247, 199, 5, 75, 225, 146, 247, 199, 5, 251, 177, 225, - 146, 247, 199, 5, 220, 31, 225, 146, 247, 199, 5, 249, 252, 225, 146, - 247, 199, 5, 231, 189, 225, 146, 247, 199, 5, 231, 141, 225, 146, 247, - 199, 5, 221, 218, 225, 146, 247, 199, 5, 232, 243, 225, 146, 247, 199, 5, - 251, 196, 225, 146, 247, 199, 5, 250, 239, 225, 38, 225, 146, 247, 199, - 5, 247, 141, 225, 146, 247, 199, 5, 249, 231, 225, 146, 247, 199, 5, 219, - 89, 225, 146, 247, 199, 5, 249, 232, 225, 146, 247, 199, 5, 252, 71, 225, - 146, 247, 199, 5, 220, 18, 225, 146, 247, 199, 5, 240, 255, 225, 146, - 247, 199, 5, 241, 185, 225, 146, 247, 199, 5, 251, 120, 233, 42, 225, - 146, 247, 199, 5, 250, 232, 225, 146, 247, 199, 5, 223, 156, 225, 146, - 247, 199, 5, 245, 238, 225, 146, 247, 199, 5, 246, 115, 225, 146, 247, - 199, 5, 215, 106, 225, 146, 247, 199, 5, 252, 74, 225, 146, 247, 199, 5, - 225, 39, 215, 236, 225, 146, 247, 199, 5, 213, 159, 225, 146, 247, 199, - 5, 226, 22, 225, 146, 247, 199, 5, 222, 192, 225, 146, 247, 199, 5, 232, - 230, 225, 146, 247, 199, 5, 226, 119, 252, 192, 225, 146, 247, 199, 5, - 244, 56, 225, 146, 247, 199, 5, 242, 145, 225, 146, 247, 199, 5, 218, - 121, 225, 146, 247, 199, 5, 4, 253, 176, 225, 146, 247, 199, 5, 212, 32, - 252, 156, 225, 146, 247, 199, 5, 38, 226, 252, 91, 232, 65, 1, 61, 232, - 65, 1, 76, 232, 65, 1, 253, 166, 232, 65, 1, 252, 27, 232, 65, 1, 243, - 209, 232, 65, 1, 249, 68, 232, 65, 1, 74, 232, 65, 1, 212, 98, 232, 65, - 1, 210, 159, 232, 65, 1, 216, 211, 232, 65, 1, 235, 150, 232, 65, 1, 235, - 29, 232, 65, 1, 224, 99, 232, 65, 1, 156, 232, 65, 1, 194, 232, 65, 1, - 230, 30, 232, 65, 1, 230, 171, 232, 65, 1, 228, 116, 232, 65, 1, 69, 232, - 65, 1, 226, 109, 232, 65, 1, 234, 53, 232, 65, 1, 153, 232, 65, 1, 222, - 93, 232, 65, 1, 217, 153, 232, 65, 1, 215, 160, 232, 65, 1, 254, 131, - 232, 65, 1, 245, 158, 232, 65, 1, 242, 67, 232, 65, 1, 211, 178, 250, - 245, 1, 61, 250, 245, 1, 226, 95, 250, 245, 1, 249, 68, 250, 245, 1, 156, - 250, 245, 1, 214, 116, 250, 245, 1, 153, 250, 245, 1, 233, 68, 250, 245, - 1, 255, 84, 250, 245, 1, 224, 99, 250, 245, 1, 253, 166, 250, 245, 1, - 194, 250, 245, 1, 78, 250, 245, 1, 248, 231, 250, 245, 1, 217, 153, 250, - 245, 1, 220, 106, 250, 245, 1, 220, 105, 250, 245, 1, 222, 93, 250, 245, - 1, 251, 73, 250, 245, 1, 69, 250, 245, 1, 228, 116, 250, 245, 1, 211, - 178, 250, 245, 1, 230, 30, 250, 245, 1, 215, 159, 250, 245, 1, 226, 109, - 250, 245, 1, 218, 228, 250, 245, 1, 74, 250, 245, 1, 76, 250, 245, 1, - 214, 113, 250, 245, 1, 235, 29, 250, 245, 1, 235, 20, 250, 245, 1, 229, - 155, 250, 245, 1, 214, 118, 250, 245, 1, 243, 209, 250, 245, 1, 243, 144, - 250, 245, 1, 218, 170, 250, 245, 1, 218, 169, 250, 245, 1, 229, 84, 250, - 245, 1, 236, 40, 250, 245, 1, 251, 72, 250, 245, 1, 215, 160, 250, 245, - 1, 214, 115, 250, 245, 1, 222, 182, 250, 245, 1, 231, 134, 250, 245, 1, - 231, 133, 250, 245, 1, 231, 132, 250, 245, 1, 231, 131, 250, 245, 1, 233, - 67, 250, 245, 1, 245, 242, 250, 245, 1, 214, 114, 55, 32, 1, 61, 55, 32, - 1, 252, 83, 55, 32, 1, 234, 188, 55, 32, 1, 248, 98, 55, 32, 1, 76, 55, - 32, 1, 213, 255, 55, 32, 1, 210, 94, 55, 32, 1, 241, 245, 55, 32, 1, 216, - 196, 55, 32, 1, 74, 55, 32, 1, 176, 55, 32, 1, 245, 182, 55, 32, 1, 245, - 167, 55, 32, 1, 245, 158, 55, 32, 1, 245, 83, 55, 32, 1, 78, 55, 32, 1, - 225, 224, 55, 32, 1, 220, 65, 55, 32, 1, 233, 223, 55, 32, 1, 245, 100, - 55, 32, 1, 245, 90, 55, 32, 1, 217, 23, 55, 32, 1, 69, 55, 32, 1, 245, - 185, 55, 32, 1, 225, 139, 55, 32, 1, 234, 125, 55, 32, 1, 245, 210, 55, - 32, 1, 245, 92, 55, 32, 1, 250, 139, 55, 32, 1, 236, 40, 55, 32, 1, 214, - 118, 55, 32, 227, 202, 111, 55, 32, 227, 202, 190, 55, 32, 227, 202, 216, - 248, 55, 32, 227, 202, 244, 122, 242, 160, 1, 254, 213, 242, 160, 1, 252, - 171, 242, 160, 1, 242, 218, 242, 160, 1, 248, 212, 242, 160, 1, 254, 209, - 242, 160, 1, 224, 82, 242, 160, 1, 235, 161, 242, 160, 1, 242, 46, 242, - 160, 1, 216, 159, 242, 160, 1, 245, 191, 242, 160, 1, 233, 196, 242, 160, - 1, 233, 119, 242, 160, 1, 231, 184, 242, 160, 1, 229, 189, 242, 160, 1, - 235, 125, 242, 160, 1, 214, 136, 242, 160, 1, 226, 73, 242, 160, 1, 228, - 200, 242, 160, 1, 223, 168, 242, 160, 1, 221, 220, 242, 160, 1, 217, 5, - 242, 160, 1, 211, 234, 242, 160, 1, 244, 186, 242, 160, 1, 236, 44, 242, - 160, 1, 240, 206, 242, 160, 1, 226, 143, 242, 160, 1, 228, 205, 240, 217, - 214, 209, 1, 254, 155, 214, 209, 1, 252, 34, 214, 209, 1, 243, 115, 214, - 209, 1, 234, 138, 214, 209, 1, 248, 62, 214, 209, 1, 241, 75, 214, 209, - 1, 211, 227, 214, 209, 1, 210, 85, 214, 209, 1, 240, 248, 214, 209, 1, - 216, 231, 214, 209, 1, 210, 233, 214, 209, 1, 235, 0, 214, 209, 1, 220, - 22, 214, 209, 1, 233, 104, 214, 209, 1, 231, 70, 214, 209, 1, 248, 29, - 214, 209, 1, 227, 198, 214, 209, 1, 210, 13, 214, 209, 1, 221, 250, 214, - 209, 1, 254, 205, 214, 209, 1, 224, 153, 214, 209, 1, 222, 27, 214, 209, - 1, 224, 38, 214, 209, 1, 223, 147, 214, 209, 1, 216, 200, 214, 209, 1, - 242, 251, 214, 209, 1, 112, 214, 209, 1, 74, 214, 209, 1, 69, 214, 209, - 1, 218, 181, 214, 209, 211, 209, 247, 180, 55, 225, 172, 5, 61, 55, 225, - 172, 5, 74, 55, 225, 172, 5, 69, 55, 225, 172, 5, 176, 55, 225, 172, 5, - 233, 223, 55, 225, 172, 5, 243, 142, 55, 225, 172, 5, 242, 120, 55, 225, - 172, 5, 211, 165, 55, 225, 172, 5, 251, 41, 55, 225, 172, 5, 235, 147, - 55, 225, 172, 5, 235, 114, 55, 225, 172, 5, 217, 106, 55, 225, 172, 5, - 215, 119, 55, 225, 172, 5, 248, 229, 55, 225, 172, 5, 248, 11, 55, 225, - 172, 5, 246, 86, 55, 225, 172, 5, 216, 209, 55, 225, 172, 5, 191, 55, - 225, 172, 5, 252, 199, 55, 225, 172, 5, 244, 204, 55, 225, 172, 5, 198, - 55, 225, 172, 5, 227, 242, 55, 225, 172, 5, 186, 55, 225, 172, 5, 230, - 235, 55, 225, 172, 5, 230, 107, 55, 225, 172, 5, 192, 55, 225, 172, 5, - 214, 27, 55, 225, 172, 5, 213, 176, 55, 225, 172, 5, 205, 55, 225, 172, - 5, 222, 142, 55, 225, 172, 5, 233, 141, 55, 225, 172, 5, 206, 55, 225, - 172, 5, 210, 116, 55, 225, 172, 5, 220, 104, 55, 225, 172, 5, 218, 225, - 55, 225, 172, 5, 162, 55, 225, 172, 5, 253, 194, 55, 225, 172, 5, 253, - 193, 55, 225, 172, 5, 253, 192, 55, 225, 172, 5, 211, 142, 55, 225, 172, - 5, 248, 208, 55, 225, 172, 5, 248, 207, 55, 225, 172, 5, 252, 178, 55, - 225, 172, 5, 251, 93, 55, 225, 172, 211, 209, 247, 180, 55, 225, 172, 54, - 111, 55, 225, 172, 54, 105, 55, 225, 172, 54, 216, 248, 55, 225, 172, 54, - 215, 73, 55, 225, 172, 54, 240, 217, 181, 6, 1, 200, 74, 181, 6, 1, 200, - 76, 181, 6, 1, 200, 61, 181, 6, 1, 200, 254, 218, 181, 6, 1, 200, 78, - 181, 6, 1, 200, 226, 187, 181, 6, 1, 219, 253, 74, 181, 6, 1, 219, 253, - 76, 181, 6, 1, 219, 253, 61, 181, 6, 1, 219, 253, 254, 218, 181, 6, 1, - 219, 253, 78, 181, 6, 1, 219, 253, 226, 187, 181, 6, 1, 253, 175, 181, 6, - 1, 226, 120, 181, 6, 1, 211, 195, 181, 6, 1, 211, 44, 181, 6, 1, 242, 67, - 181, 6, 1, 225, 214, 181, 6, 1, 252, 74, 181, 6, 1, 217, 12, 181, 6, 1, - 248, 85, 181, 6, 1, 250, 136, 181, 6, 1, 235, 130, 181, 6, 1, 234, 195, - 181, 6, 1, 243, 90, 181, 6, 1, 245, 210, 181, 6, 1, 213, 250, 181, 6, 1, - 245, 67, 181, 6, 1, 216, 195, 181, 6, 1, 245, 90, 181, 6, 1, 210, 92, - 181, 6, 1, 245, 83, 181, 6, 1, 210, 73, 181, 6, 1, 245, 100, 181, 6, 1, - 245, 182, 181, 6, 1, 245, 167, 181, 6, 1, 245, 158, 181, 6, 1, 245, 146, - 181, 6, 1, 226, 223, 181, 6, 1, 245, 46, 181, 4, 1, 200, 74, 181, 4, 1, - 200, 76, 181, 4, 1, 200, 61, 181, 4, 1, 200, 254, 218, 181, 4, 1, 200, - 78, 181, 4, 1, 200, 226, 187, 181, 4, 1, 219, 253, 74, 181, 4, 1, 219, - 253, 76, 181, 4, 1, 219, 253, 61, 181, 4, 1, 219, 253, 254, 218, 181, 4, - 1, 219, 253, 78, 181, 4, 1, 219, 253, 226, 187, 181, 4, 1, 253, 175, 181, - 4, 1, 226, 120, 181, 4, 1, 211, 195, 181, 4, 1, 211, 44, 181, 4, 1, 242, - 67, 181, 4, 1, 225, 214, 181, 4, 1, 252, 74, 181, 4, 1, 217, 12, 181, 4, - 1, 248, 85, 181, 4, 1, 250, 136, 181, 4, 1, 235, 130, 181, 4, 1, 234, - 195, 181, 4, 1, 243, 90, 181, 4, 1, 245, 210, 181, 4, 1, 213, 250, 181, - 4, 1, 245, 67, 181, 4, 1, 216, 195, 181, 4, 1, 245, 90, 181, 4, 1, 210, - 92, 181, 4, 1, 245, 83, 181, 4, 1, 210, 73, 181, 4, 1, 245, 100, 181, 4, - 1, 245, 182, 181, 4, 1, 245, 167, 181, 4, 1, 245, 158, 181, 4, 1, 245, - 146, 181, 4, 1, 226, 223, 181, 4, 1, 245, 46, 220, 71, 1, 225, 212, 220, - 71, 1, 216, 6, 220, 71, 1, 234, 97, 220, 71, 1, 244, 155, 220, 71, 1, - 216, 173, 220, 71, 1, 219, 60, 220, 71, 1, 218, 15, 220, 71, 1, 250, 69, - 220, 71, 1, 211, 46, 220, 71, 1, 240, 216, 220, 71, 1, 252, 13, 220, 71, - 1, 248, 97, 220, 71, 1, 243, 128, 220, 71, 1, 213, 123, 220, 71, 1, 216, - 177, 220, 71, 1, 210, 21, 220, 71, 1, 231, 94, 220, 71, 1, 235, 55, 220, - 71, 1, 211, 225, 220, 71, 1, 242, 55, 220, 71, 1, 232, 148, 220, 71, 1, - 230, 194, 220, 71, 1, 236, 47, 220, 71, 1, 245, 209, 220, 71, 1, 253, - 239, 220, 71, 1, 255, 0, 220, 71, 1, 226, 200, 220, 71, 1, 211, 212, 220, - 71, 1, 226, 134, 220, 71, 1, 254, 218, 220, 71, 1, 222, 210, 220, 71, 1, - 227, 198, 220, 71, 1, 245, 225, 220, 71, 1, 254, 223, 220, 71, 1, 240, - 118, 220, 71, 1, 214, 163, 220, 71, 1, 227, 2, 220, 71, 1, 226, 180, 220, - 71, 1, 226, 222, 220, 71, 1, 253, 178, 220, 71, 1, 254, 27, 220, 71, 1, - 226, 162, 220, 71, 1, 254, 201, 220, 71, 1, 245, 94, 220, 71, 1, 254, 5, - 220, 71, 1, 245, 235, 220, 71, 1, 240, 125, 220, 71, 1, 211, 13, 226, - 145, 1, 254, 179, 226, 145, 1, 252, 199, 226, 145, 1, 217, 106, 226, 145, - 1, 235, 147, 226, 145, 1, 211, 165, 226, 145, 1, 234, 138, 226, 145, 1, - 248, 84, 226, 145, 1, 205, 226, 145, 1, 206, 226, 145, 1, 220, 28, 226, - 145, 1, 248, 33, 226, 145, 1, 250, 223, 226, 145, 1, 243, 142, 226, 145, - 1, 244, 204, 226, 145, 1, 224, 89, 226, 145, 1, 235, 15, 226, 145, 1, - 233, 136, 226, 145, 1, 230, 205, 226, 145, 1, 227, 182, 226, 145, 1, 212, - 30, 226, 145, 1, 162, 226, 145, 1, 192, 226, 145, 1, 61, 226, 145, 1, 76, - 226, 145, 1, 74, 226, 145, 1, 78, 226, 145, 1, 69, 226, 145, 1, 255, 82, - 226, 145, 1, 245, 217, 226, 145, 1, 226, 187, 226, 145, 21, 210, 86, 226, - 145, 21, 111, 226, 145, 21, 105, 226, 145, 21, 158, 226, 145, 21, 161, - 226, 145, 21, 190, 226, 145, 21, 195, 226, 145, 21, 199, 226, 145, 21, - 196, 226, 145, 21, 201, 249, 75, 3, 61, 249, 75, 3, 76, 249, 75, 3, 74, - 249, 75, 3, 78, 249, 75, 3, 69, 249, 75, 3, 235, 147, 249, 75, 3, 235, - 74, 249, 75, 3, 176, 249, 75, 3, 234, 188, 249, 75, 3, 234, 98, 249, 75, - 3, 234, 34, 249, 75, 3, 233, 223, 249, 75, 3, 233, 141, 249, 75, 3, 233, - 64, 249, 75, 3, 232, 247, 249, 75, 3, 232, 162, 249, 75, 3, 232, 103, - 249, 75, 3, 186, 249, 75, 3, 231, 96, 249, 75, 3, 230, 235, 249, 75, 3, - 230, 166, 249, 75, 3, 230, 107, 249, 75, 3, 198, 249, 75, 3, 229, 112, - 249, 75, 3, 228, 238, 249, 75, 3, 228, 79, 249, 75, 3, 227, 242, 249, 75, - 3, 191, 249, 75, 3, 225, 224, 249, 75, 3, 225, 111, 249, 75, 3, 225, 19, - 249, 75, 3, 224, 153, 249, 75, 3, 205, 249, 75, 3, 223, 131, 249, 75, 3, - 223, 38, 249, 75, 3, 222, 213, 249, 75, 3, 222, 142, 249, 75, 3, 206, - 249, 75, 3, 221, 183, 249, 75, 3, 219, 193, 249, 75, 3, 219, 60, 249, 75, - 3, 218, 84, 249, 75, 3, 217, 106, 249, 75, 3, 217, 23, 249, 75, 3, 216, - 118, 249, 75, 3, 112, 249, 75, 3, 215, 119, 249, 75, 3, 212, 65, 249, 75, - 3, 212, 22, 249, 75, 3, 211, 250, 249, 75, 3, 211, 227, 249, 75, 3, 211, - 165, 249, 75, 3, 211, 162, 249, 75, 3, 210, 116, 249, 75, 3, 210, 23, - 236, 8, 254, 35, 1, 254, 177, 236, 8, 254, 35, 1, 252, 33, 236, 8, 254, - 35, 1, 242, 208, 236, 8, 254, 35, 1, 248, 196, 236, 8, 254, 35, 1, 241, - 245, 236, 8, 254, 35, 1, 212, 30, 236, 8, 254, 35, 1, 210, 97, 236, 8, - 254, 35, 1, 241, 202, 236, 8, 254, 35, 1, 216, 227, 236, 8, 254, 35, 1, - 210, 232, 236, 8, 254, 35, 1, 234, 231, 236, 8, 254, 35, 1, 233, 99, 236, - 8, 254, 35, 1, 231, 70, 236, 8, 254, 35, 1, 227, 198, 236, 8, 254, 35, 1, - 221, 251, 236, 8, 254, 35, 1, 253, 170, 236, 8, 254, 35, 1, 225, 224, - 236, 8, 254, 35, 1, 222, 26, 236, 8, 254, 35, 1, 224, 37, 236, 8, 254, - 35, 1, 223, 70, 236, 8, 254, 35, 1, 220, 22, 236, 8, 254, 35, 1, 217, 37, - 236, 8, 254, 35, 221, 175, 50, 236, 8, 254, 35, 54, 111, 236, 8, 254, 35, - 54, 105, 236, 8, 254, 35, 54, 158, 236, 8, 254, 35, 54, 216, 248, 236, 8, - 254, 35, 54, 215, 73, 236, 8, 254, 35, 54, 123, 240, 217, 236, 8, 254, - 35, 54, 123, 216, 148, 236, 8, 254, 35, 54, 216, 249, 216, 148, 225, 122, - 1, 254, 174, 225, 122, 1, 252, 36, 225, 122, 1, 243, 116, 225, 122, 1, - 248, 64, 225, 122, 1, 241, 245, 225, 122, 1, 212, 37, 225, 122, 1, 210, - 110, 225, 122, 1, 241, 204, 225, 122, 1, 216, 231, 225, 122, 1, 210, 233, - 225, 122, 1, 235, 0, 225, 122, 1, 233, 105, 225, 122, 1, 231, 70, 225, - 122, 1, 227, 198, 225, 122, 1, 220, 146, 225, 122, 1, 254, 205, 225, 122, - 1, 225, 224, 225, 122, 1, 222, 27, 225, 122, 1, 224, 42, 225, 122, 1, - 222, 191, 225, 122, 1, 220, 22, 225, 122, 1, 217, 42, 225, 122, 54, 111, - 225, 122, 54, 216, 248, 225, 122, 54, 215, 73, 225, 122, 54, 123, 240, - 217, 225, 122, 54, 105, 225, 122, 54, 158, 225, 122, 211, 209, 220, 139, - 232, 64, 1, 61, 232, 64, 1, 253, 166, 232, 64, 1, 243, 209, 232, 64, 1, - 249, 68, 232, 64, 1, 76, 232, 64, 1, 214, 105, 232, 64, 1, 74, 232, 64, - 1, 211, 117, 232, 64, 1, 235, 29, 232, 64, 1, 156, 232, 64, 1, 194, 232, - 64, 1, 230, 30, 232, 64, 1, 78, 232, 64, 1, 153, 232, 64, 1, 218, 228, - 232, 64, 1, 217, 153, 232, 64, 1, 69, 232, 64, 1, 245, 14, 232, 64, 1, - 224, 99, 232, 64, 1, 222, 93, 232, 64, 1, 215, 160, 232, 64, 1, 254, 131, - 232, 64, 1, 245, 158, 232, 64, 1, 232, 67, 232, 64, 1, 228, 116, 232, 64, - 1, 251, 74, 232, 64, 215, 223, 79, 231, 53, 241, 181, 1, 61, 231, 53, - 241, 181, 1, 76, 231, 53, 241, 181, 1, 74, 231, 53, 241, 181, 1, 78, 231, - 53, 241, 181, 1, 192, 231, 53, 241, 181, 1, 212, 65, 231, 53, 241, 181, - 1, 252, 199, 231, 53, 241, 181, 1, 252, 198, 231, 53, 241, 181, 1, 191, - 231, 53, 241, 181, 1, 186, 231, 53, 241, 181, 1, 198, 231, 53, 241, 181, - 1, 229, 233, 231, 53, 241, 181, 1, 229, 112, 231, 53, 241, 181, 1, 229, - 111, 231, 53, 241, 181, 1, 205, 231, 53, 241, 181, 1, 223, 190, 231, 53, - 241, 181, 1, 233, 141, 231, 53, 241, 181, 1, 234, 138, 231, 53, 241, 181, - 1, 241, 196, 231, 53, 241, 181, 1, 206, 231, 53, 241, 181, 1, 222, 35, - 231, 53, 241, 181, 1, 221, 183, 231, 53, 241, 181, 1, 176, 231, 53, 241, - 181, 1, 224, 91, 231, 53, 241, 181, 1, 217, 106, 231, 53, 241, 181, 1, - 217, 105, 231, 53, 241, 181, 1, 217, 23, 231, 53, 241, 181, 1, 217, 22, - 231, 53, 241, 181, 1, 112, 231, 53, 241, 181, 1, 248, 229, 231, 53, 241, - 181, 16, 213, 170, 231, 53, 241, 181, 16, 213, 169, 231, 53, 249, 102, 1, - 61, 231, 53, 249, 102, 1, 76, 231, 53, 249, 102, 1, 74, 231, 53, 249, - 102, 1, 78, 231, 53, 249, 102, 1, 192, 231, 53, 249, 102, 1, 212, 65, - 231, 53, 249, 102, 1, 252, 199, 231, 53, 249, 102, 1, 191, 231, 53, 249, - 102, 1, 186, 231, 53, 249, 102, 1, 198, 231, 53, 249, 102, 1, 229, 112, - 231, 53, 249, 102, 1, 205, 231, 53, 249, 102, 1, 233, 141, 231, 53, 249, - 102, 1, 234, 138, 231, 53, 249, 102, 1, 241, 196, 231, 53, 249, 102, 1, - 206, 231, 53, 249, 102, 1, 254, 31, 206, 231, 53, 249, 102, 1, 221, 183, - 231, 53, 249, 102, 1, 176, 231, 53, 249, 102, 1, 224, 91, 231, 53, 249, - 102, 1, 217, 106, 231, 53, 249, 102, 1, 217, 23, 231, 53, 249, 102, 1, - 112, 231, 53, 249, 102, 1, 248, 229, 231, 53, 249, 102, 232, 151, 222, - 219, 231, 53, 249, 102, 232, 151, 236, 13, 234, 126, 1, 61, 234, 126, 25, - 5, 74, 234, 126, 25, 5, 69, 234, 126, 25, 5, 149, 153, 234, 126, 25, 5, - 76, 234, 126, 25, 5, 78, 234, 126, 25, 233, 29, 79, 234, 126, 5, 52, 222, - 237, 51, 234, 126, 5, 254, 83, 234, 126, 5, 213, 147, 234, 126, 1, 176, - 234, 126, 1, 234, 138, 234, 126, 1, 243, 142, 234, 126, 1, 243, 0, 234, - 126, 1, 251, 41, 234, 126, 1, 250, 165, 234, 126, 1, 235, 147, 234, 126, - 1, 227, 169, 234, 126, 1, 215, 157, 234, 126, 1, 215, 145, 234, 126, 1, - 248, 143, 234, 126, 1, 248, 127, 234, 126, 1, 228, 115, 234, 126, 1, 217, - 106, 234, 126, 1, 216, 209, 234, 126, 1, 248, 229, 234, 126, 1, 248, 33, - 234, 126, 1, 198, 234, 126, 1, 191, 234, 126, 1, 225, 150, 234, 126, 1, - 252, 199, 234, 126, 1, 252, 26, 234, 126, 1, 186, 234, 126, 1, 192, 234, - 126, 1, 205, 234, 126, 1, 233, 141, 234, 126, 1, 214, 27, 234, 126, 1, - 220, 104, 234, 126, 1, 218, 225, 234, 126, 1, 206, 234, 126, 1, 210, 116, - 234, 126, 1, 162, 234, 126, 1, 234, 52, 234, 126, 1, 215, 125, 234, 126, - 5, 252, 149, 48, 234, 126, 5, 250, 229, 234, 126, 5, 59, 51, 234, 126, - 213, 152, 234, 126, 21, 111, 234, 126, 21, 105, 234, 126, 21, 158, 234, - 126, 21, 161, 234, 126, 54, 216, 248, 234, 126, 54, 215, 73, 234, 126, - 54, 123, 240, 217, 234, 126, 54, 123, 216, 148, 234, 126, 224, 144, 247, - 128, 234, 126, 224, 144, 4, 250, 43, 234, 126, 224, 144, 250, 43, 234, - 126, 224, 144, 249, 145, 130, 234, 126, 224, 144, 231, 185, 234, 126, - 224, 144, 232, 121, 234, 126, 224, 144, 248, 186, 234, 126, 224, 144, 52, - 248, 186, 234, 126, 224, 144, 232, 213, 55, 219, 30, 254, 46, 1, 241, - 245, 55, 219, 30, 254, 46, 1, 233, 99, 55, 219, 30, 254, 46, 1, 241, 202, - 55, 219, 30, 254, 46, 1, 231, 70, 55, 219, 30, 254, 46, 1, 224, 37, 55, - 219, 30, 254, 46, 1, 212, 30, 55, 219, 30, 254, 46, 1, 220, 22, 55, 219, - 30, 254, 46, 1, 223, 70, 55, 219, 30, 254, 46, 1, 252, 33, 55, 219, 30, - 254, 46, 1, 217, 37, 55, 219, 30, 254, 46, 1, 221, 228, 55, 219, 30, 254, - 46, 1, 234, 231, 55, 219, 30, 254, 46, 1, 227, 198, 55, 219, 30, 254, 46, - 1, 234, 122, 55, 219, 30, 254, 46, 1, 222, 26, 55, 219, 30, 254, 46, 1, - 221, 251, 55, 219, 30, 254, 46, 1, 244, 162, 55, 219, 30, 254, 46, 1, - 254, 179, 55, 219, 30, 254, 46, 1, 253, 169, 55, 219, 30, 254, 46, 1, - 248, 30, 55, 219, 30, 254, 46, 1, 242, 208, 55, 219, 30, 254, 46, 1, 248, - 196, 55, 219, 30, 254, 46, 1, 242, 245, 55, 219, 30, 254, 46, 1, 216, - 227, 55, 219, 30, 254, 46, 1, 210, 96, 55, 219, 30, 254, 46, 1, 248, 27, - 55, 219, 30, 254, 46, 1, 210, 232, 55, 219, 30, 254, 46, 1, 216, 198, 55, - 219, 30, 254, 46, 1, 216, 179, 55, 219, 30, 254, 46, 54, 111, 55, 219, - 30, 254, 46, 54, 244, 122, 55, 219, 30, 254, 46, 132, 235, 245, 253, 180, - 1, 61, 253, 180, 1, 255, 82, 253, 180, 1, 254, 81, 253, 180, 1, 255, 41, - 253, 180, 1, 254, 131, 253, 180, 1, 255, 42, 253, 180, 1, 254, 252, 253, - 180, 1, 254, 248, 253, 180, 1, 76, 253, 180, 1, 245, 217, 253, 180, 1, - 78, 253, 180, 1, 226, 187, 253, 180, 1, 74, 253, 180, 1, 236, 40, 253, - 180, 1, 69, 253, 180, 1, 214, 118, 253, 180, 1, 234, 188, 253, 180, 1, - 211, 162, 253, 180, 1, 211, 128, 253, 180, 1, 211, 137, 253, 180, 1, 243, - 69, 253, 180, 1, 243, 31, 253, 180, 1, 242, 243, 253, 180, 1, 250, 198, - 253, 180, 1, 235, 132, 253, 180, 1, 217, 23, 253, 180, 1, 216, 196, 253, - 180, 1, 248, 98, 253, 180, 1, 248, 25, 253, 180, 1, 215, 152, 253, 180, - 1, 225, 224, 253, 180, 1, 244, 162, 253, 180, 1, 252, 83, 253, 180, 1, - 252, 22, 253, 180, 1, 229, 69, 253, 180, 1, 228, 244, 253, 180, 1, 228, - 245, 253, 180, 1, 229, 112, 253, 180, 1, 227, 160, 253, 180, 1, 228, 110, - 253, 180, 1, 231, 96, 253, 180, 1, 241, 123, 253, 180, 1, 210, 166, 253, - 180, 1, 211, 47, 253, 180, 1, 213, 255, 253, 180, 1, 223, 131, 253, 180, - 1, 233, 64, 253, 180, 1, 221, 183, 253, 180, 1, 210, 94, 253, 180, 1, - 220, 65, 253, 180, 1, 210, 74, 253, 180, 1, 219, 200, 253, 180, 1, 218, - 195, 253, 180, 1, 241, 245, 253, 180, 255, 30, 79, 216, 80, 113, 170, - 115, 123, 59, 224, 143, 4, 113, 170, 115, 123, 59, 224, 143, 233, 91, - 113, 170, 115, 123, 59, 224, 143, 233, 91, 123, 59, 115, 113, 170, 224, - 143, 233, 91, 113, 222, 235, 115, 123, 222, 237, 224, 143, 233, 91, 123, - 222, 237, 115, 113, 222, 235, 224, 143, 235, 225, 226, 2, 1, 254, 177, - 235, 225, 226, 2, 1, 252, 33, 235, 225, 226, 2, 1, 242, 208, 235, 225, - 226, 2, 1, 248, 196, 235, 225, 226, 2, 1, 241, 245, 235, 225, 226, 2, 1, - 212, 30, 235, 225, 226, 2, 1, 210, 97, 235, 225, 226, 2, 1, 241, 202, - 235, 225, 226, 2, 1, 216, 227, 235, 225, 226, 2, 1, 210, 232, 235, 225, - 226, 2, 1, 234, 231, 235, 225, 226, 2, 1, 233, 99, 235, 225, 226, 2, 1, - 231, 70, 235, 225, 226, 2, 1, 227, 198, 235, 225, 226, 2, 1, 221, 251, - 235, 225, 226, 2, 1, 253, 170, 235, 225, 226, 2, 1, 225, 224, 235, 225, - 226, 2, 1, 222, 26, 235, 225, 226, 2, 1, 224, 37, 235, 225, 226, 2, 1, - 223, 70, 235, 225, 226, 2, 1, 220, 22, 235, 225, 226, 2, 1, 217, 37, 235, - 225, 226, 2, 54, 111, 235, 225, 226, 2, 54, 105, 235, 225, 226, 2, 54, - 158, 235, 225, 226, 2, 54, 161, 235, 225, 226, 2, 54, 216, 248, 235, 225, - 226, 2, 54, 215, 73, 235, 225, 226, 2, 54, 123, 240, 217, 235, 225, 226, - 2, 54, 123, 216, 148, 235, 225, 226, 76, 1, 254, 177, 235, 225, 226, 76, - 1, 252, 33, 235, 225, 226, 76, 1, 242, 208, 235, 225, 226, 76, 1, 248, - 196, 235, 225, 226, 76, 1, 241, 245, 235, 225, 226, 76, 1, 212, 29, 235, - 225, 226, 76, 1, 210, 97, 235, 225, 226, 76, 1, 241, 202, 235, 225, 226, - 76, 1, 216, 227, 235, 225, 226, 76, 1, 210, 232, 235, 225, 226, 76, 1, - 234, 231, 235, 225, 226, 76, 1, 233, 99, 235, 225, 226, 76, 1, 231, 69, - 235, 225, 226, 76, 1, 227, 198, 235, 225, 226, 76, 1, 221, 251, 235, 225, - 226, 76, 1, 225, 224, 235, 225, 226, 76, 1, 222, 26, 235, 225, 226, 76, - 1, 220, 22, 235, 225, 226, 76, 1, 217, 37, 235, 225, 226, 76, 54, 111, - 235, 225, 226, 76, 54, 105, 235, 225, 226, 76, 54, 158, 235, 225, 226, - 76, 54, 161, 235, 225, 226, 76, 54, 216, 248, 235, 225, 226, 76, 54, 215, - 73, 235, 225, 226, 76, 54, 123, 240, 217, 235, 225, 226, 76, 54, 123, - 216, 148, 55, 202, 1, 226, 153, 61, 55, 202, 1, 211, 37, 61, 55, 202, 1, - 211, 37, 254, 252, 55, 202, 1, 226, 153, 74, 55, 202, 1, 211, 37, 74, 55, - 202, 1, 211, 37, 76, 55, 202, 1, 226, 153, 78, 55, 202, 1, 226, 153, 226, - 238, 55, 202, 1, 211, 37, 226, 238, 55, 202, 1, 226, 153, 255, 34, 55, - 202, 1, 211, 37, 255, 34, 55, 202, 1, 226, 153, 254, 251, 55, 202, 1, - 211, 37, 254, 251, 55, 202, 1, 226, 153, 254, 225, 55, 202, 1, 211, 37, - 254, 225, 55, 202, 1, 226, 153, 254, 246, 55, 202, 1, 211, 37, 254, 246, - 55, 202, 1, 226, 153, 255, 8, 55, 202, 1, 211, 37, 255, 8, 55, 202, 1, - 226, 153, 254, 250, 55, 202, 1, 226, 153, 245, 20, 55, 202, 1, 211, 37, - 245, 20, 55, 202, 1, 226, 153, 253, 175, 55, 202, 1, 211, 37, 253, 175, - 55, 202, 1, 226, 153, 254, 233, 55, 202, 1, 211, 37, 254, 233, 55, 202, - 1, 226, 153, 254, 244, 55, 202, 1, 211, 37, 254, 244, 55, 202, 1, 226, - 153, 226, 237, 55, 202, 1, 211, 37, 226, 237, 55, 202, 1, 226, 153, 254, - 187, 55, 202, 1, 211, 37, 254, 187, 55, 202, 1, 226, 153, 254, 243, 55, - 202, 1, 226, 153, 245, 169, 55, 202, 1, 226, 153, 245, 167, 55, 202, 1, - 226, 153, 254, 131, 55, 202, 1, 226, 153, 254, 241, 55, 202, 1, 211, 37, - 254, 241, 55, 202, 1, 226, 153, 245, 139, 55, 202, 1, 211, 37, 245, 139, - 55, 202, 1, 226, 153, 245, 155, 55, 202, 1, 211, 37, 245, 155, 55, 202, - 1, 226, 153, 245, 126, 55, 202, 1, 211, 37, 245, 126, 55, 202, 1, 211, - 37, 254, 123, 55, 202, 1, 226, 153, 245, 146, 55, 202, 1, 211, 37, 254, - 240, 55, 202, 1, 226, 153, 245, 116, 55, 202, 1, 226, 153, 226, 179, 55, - 202, 1, 226, 153, 240, 120, 55, 202, 1, 226, 153, 245, 223, 55, 202, 1, - 211, 37, 245, 223, 55, 202, 1, 226, 153, 254, 53, 55, 202, 1, 211, 37, - 254, 53, 55, 202, 1, 226, 153, 235, 188, 55, 202, 1, 211, 37, 235, 188, - 55, 202, 1, 226, 153, 226, 163, 55, 202, 1, 211, 37, 226, 163, 55, 202, - 1, 226, 153, 254, 49, 55, 202, 1, 211, 37, 254, 49, 55, 202, 1, 226, 153, - 254, 239, 55, 202, 1, 226, 153, 253, 245, 55, 202, 1, 226, 153, 254, 237, - 55, 202, 1, 226, 153, 253, 239, 55, 202, 1, 211, 37, 253, 239, 55, 202, - 1, 226, 153, 245, 83, 55, 202, 1, 211, 37, 245, 83, 55, 202, 1, 226, 153, - 253, 214, 55, 202, 1, 211, 37, 253, 214, 55, 202, 1, 226, 153, 254, 234, - 55, 202, 1, 211, 37, 254, 234, 55, 202, 1, 226, 153, 226, 144, 55, 202, - 1, 226, 153, 252, 133, 222, 129, 21, 111, 222, 129, 21, 105, 222, 129, - 21, 158, 222, 129, 21, 161, 222, 129, 21, 190, 222, 129, 21, 195, 222, - 129, 21, 199, 222, 129, 21, 196, 222, 129, 21, 201, 222, 129, 54, 216, - 248, 222, 129, 54, 215, 73, 222, 129, 54, 216, 163, 222, 129, 54, 244, - 23, 222, 129, 54, 244, 122, 222, 129, 54, 219, 113, 222, 129, 54, 220, - 118, 222, 129, 54, 245, 192, 222, 129, 54, 228, 200, 222, 129, 54, 123, - 240, 217, 222, 129, 54, 113, 240, 217, 222, 129, 54, 134, 240, 217, 222, - 129, 54, 244, 19, 240, 217, 222, 129, 54, 244, 89, 240, 217, 222, 129, - 54, 219, 127, 240, 217, 222, 129, 54, 220, 124, 240, 217, 222, 129, 54, - 245, 201, 240, 217, 222, 129, 54, 228, 205, 240, 217, 222, 129, 244, 10, - 123, 242, 34, 222, 129, 244, 10, 123, 224, 24, 222, 129, 244, 10, 123, - 216, 169, 222, 129, 244, 10, 113, 216, 167, 118, 5, 251, 7, 118, 5, 254, - 83, 118, 5, 213, 147, 118, 5, 235, 108, 118, 5, 214, 161, 118, 1, 61, - 118, 1, 255, 82, 118, 1, 74, 118, 1, 236, 40, 118, 1, 69, 118, 1, 214, - 118, 118, 1, 149, 153, 118, 1, 149, 222, 182, 118, 1, 149, 156, 118, 1, - 149, 232, 191, 118, 1, 76, 118, 1, 254, 210, 118, 1, 78, 118, 1, 253, - 200, 118, 1, 176, 118, 1, 234, 138, 118, 1, 243, 142, 118, 1, 243, 0, - 118, 1, 229, 82, 118, 1, 251, 41, 118, 1, 250, 165, 118, 1, 235, 147, - 118, 1, 235, 120, 118, 1, 227, 169, 118, 1, 215, 157, 118, 1, 215, 145, - 118, 1, 248, 143, 118, 1, 248, 127, 118, 1, 228, 115, 118, 1, 217, 106, - 118, 1, 216, 209, 118, 1, 248, 229, 118, 1, 248, 33, 118, 1, 198, 118, 1, - 191, 118, 1, 225, 150, 118, 1, 252, 199, 118, 1, 252, 26, 118, 1, 186, - 118, 1, 192, 118, 1, 205, 118, 1, 233, 141, 118, 1, 214, 27, 118, 1, 220, - 104, 118, 1, 218, 225, 118, 1, 206, 118, 1, 162, 118, 1, 232, 190, 118, - 1, 55, 36, 232, 181, 118, 1, 55, 36, 222, 181, 118, 1, 55, 36, 228, 97, - 118, 25, 5, 255, 82, 118, 25, 5, 252, 23, 255, 82, 118, 25, 5, 74, 118, - 25, 5, 236, 40, 118, 25, 5, 69, 118, 25, 5, 214, 118, 118, 25, 5, 149, - 153, 118, 25, 5, 149, 222, 182, 118, 25, 5, 149, 156, 118, 25, 5, 149, - 232, 191, 118, 25, 5, 76, 118, 25, 5, 254, 210, 118, 25, 5, 78, 118, 25, - 5, 253, 200, 118, 213, 152, 118, 248, 186, 118, 52, 248, 186, 118, 224, - 144, 247, 128, 118, 224, 144, 52, 247, 128, 118, 224, 144, 232, 219, 118, - 224, 144, 249, 145, 130, 118, 224, 144, 232, 121, 118, 54, 111, 118, 54, - 105, 118, 54, 158, 118, 54, 161, 118, 54, 190, 118, 54, 195, 118, 54, - 199, 118, 54, 196, 118, 54, 201, 118, 54, 216, 248, 118, 54, 215, 73, - 118, 54, 216, 163, 118, 54, 244, 23, 118, 54, 244, 122, 118, 54, 219, - 113, 118, 54, 220, 118, 118, 54, 245, 192, 118, 54, 228, 200, 118, 54, - 123, 240, 217, 118, 54, 123, 216, 148, 118, 21, 210, 86, 118, 21, 111, - 118, 21, 105, 118, 21, 158, 118, 21, 161, 118, 21, 190, 118, 21, 195, - 118, 21, 199, 118, 21, 196, 118, 21, 201, 234, 250, 5, 251, 7, 234, 250, - 5, 254, 83, 234, 250, 5, 213, 147, 234, 250, 1, 61, 234, 250, 1, 255, 82, - 234, 250, 1, 74, 234, 250, 1, 236, 40, 234, 250, 1, 69, 234, 250, 1, 214, - 118, 234, 250, 1, 76, 234, 250, 1, 254, 210, 234, 250, 1, 78, 234, 250, - 1, 253, 200, 234, 250, 1, 176, 234, 250, 1, 234, 138, 234, 250, 1, 243, - 142, 234, 250, 1, 243, 0, 234, 250, 1, 229, 82, 234, 250, 1, 251, 41, - 234, 250, 1, 250, 165, 234, 250, 1, 235, 147, 234, 250, 1, 235, 120, 234, - 250, 1, 227, 169, 234, 250, 1, 215, 157, 234, 250, 1, 215, 145, 234, 250, - 1, 248, 143, 234, 250, 1, 248, 132, 234, 250, 1, 248, 127, 234, 250, 1, - 223, 42, 234, 250, 1, 228, 115, 234, 250, 1, 217, 106, 234, 250, 1, 216, - 209, 234, 250, 1, 248, 229, 234, 250, 1, 248, 33, 234, 250, 1, 198, 234, - 250, 1, 191, 234, 250, 1, 225, 150, 234, 250, 1, 252, 199, 234, 250, 1, - 252, 26, 234, 250, 1, 186, 234, 250, 1, 192, 234, 250, 1, 205, 234, 250, - 1, 233, 141, 234, 250, 1, 214, 27, 234, 250, 1, 220, 104, 234, 250, 1, - 218, 225, 234, 250, 1, 206, 234, 250, 1, 162, 234, 250, 25, 5, 255, 82, - 234, 250, 25, 5, 74, 234, 250, 25, 5, 236, 40, 234, 250, 25, 5, 69, 234, - 250, 25, 5, 214, 118, 234, 250, 25, 5, 76, 234, 250, 25, 5, 254, 210, - 234, 250, 25, 5, 78, 234, 250, 25, 5, 253, 200, 234, 250, 5, 213, 152, - 234, 250, 5, 227, 209, 234, 250, 255, 30, 50, 234, 250, 245, 129, 50, - 234, 250, 54, 50, 234, 250, 221, 175, 79, 234, 250, 52, 221, 175, 79, - 234, 250, 248, 186, 234, 250, 52, 248, 186, 219, 38, 219, 46, 1, 222, 20, - 219, 38, 219, 46, 1, 217, 81, 219, 38, 219, 46, 1, 252, 176, 219, 38, - 219, 46, 1, 251, 31, 219, 38, 219, 46, 1, 248, 211, 219, 38, 219, 46, 1, - 243, 127, 219, 38, 219, 46, 1, 231, 215, 219, 38, 219, 46, 1, 229, 79, - 219, 38, 219, 46, 1, 233, 118, 219, 38, 219, 46, 1, 229, 218, 219, 38, - 219, 46, 1, 214, 24, 219, 38, 219, 46, 1, 226, 77, 219, 38, 219, 46, 1, - 211, 84, 219, 38, 219, 46, 1, 223, 171, 219, 38, 219, 46, 1, 242, 44, - 219, 38, 219, 46, 1, 234, 254, 219, 38, 219, 46, 1, 235, 142, 219, 38, - 219, 46, 1, 227, 166, 219, 38, 219, 46, 1, 254, 218, 219, 38, 219, 46, 1, - 245, 215, 219, 38, 219, 46, 1, 236, 41, 219, 38, 219, 46, 1, 214, 208, - 219, 38, 219, 46, 1, 226, 226, 219, 38, 219, 46, 1, 245, 205, 219, 38, - 219, 46, 1, 231, 228, 219, 38, 219, 46, 21, 210, 86, 219, 38, 219, 46, - 21, 111, 219, 38, 219, 46, 21, 105, 219, 38, 219, 46, 21, 158, 219, 38, - 219, 46, 21, 161, 219, 38, 219, 46, 21, 190, 219, 38, 219, 46, 21, 195, - 219, 38, 219, 46, 21, 199, 219, 38, 219, 46, 21, 196, 219, 38, 219, 46, - 21, 201, 250, 159, 5, 251, 7, 250, 159, 5, 254, 83, 250, 159, 5, 213, - 147, 250, 159, 1, 255, 82, 250, 159, 1, 74, 250, 159, 1, 69, 250, 159, 1, - 76, 250, 159, 1, 235, 16, 250, 159, 1, 234, 137, 250, 159, 1, 243, 139, - 250, 159, 1, 242, 255, 250, 159, 1, 229, 81, 250, 159, 1, 251, 40, 250, - 159, 1, 250, 164, 250, 159, 1, 235, 146, 250, 159, 1, 235, 119, 250, 159, - 1, 227, 168, 250, 159, 1, 215, 156, 250, 159, 1, 215, 144, 250, 159, 1, - 248, 142, 250, 159, 1, 248, 126, 250, 159, 1, 228, 114, 250, 159, 1, 217, - 102, 250, 159, 1, 216, 208, 250, 159, 1, 248, 228, 250, 159, 1, 248, 32, - 250, 159, 1, 229, 230, 250, 159, 1, 226, 93, 250, 159, 1, 225, 149, 250, - 159, 1, 252, 197, 250, 159, 1, 252, 25, 250, 159, 1, 231, 242, 250, 159, - 1, 210, 167, 250, 159, 1, 211, 103, 250, 159, 1, 223, 187, 250, 159, 1, - 233, 140, 250, 159, 1, 212, 64, 250, 159, 1, 222, 33, 250, 159, 1, 242, - 53, 250, 159, 25, 5, 61, 250, 159, 25, 5, 74, 250, 159, 25, 5, 236, 40, - 250, 159, 25, 5, 69, 250, 159, 25, 5, 214, 118, 250, 159, 25, 5, 76, 250, - 159, 25, 5, 254, 210, 250, 159, 25, 5, 78, 250, 159, 25, 5, 253, 200, - 250, 159, 25, 5, 226, 223, 250, 159, 144, 79, 250, 159, 253, 201, 79, - 250, 159, 213, 152, 250, 159, 231, 240, 250, 159, 21, 210, 86, 250, 159, - 21, 111, 250, 159, 21, 105, 250, 159, 21, 158, 250, 159, 21, 161, 250, - 159, 21, 190, 250, 159, 21, 195, 250, 159, 21, 199, 250, 159, 21, 196, - 250, 159, 21, 201, 250, 159, 221, 175, 79, 250, 159, 248, 186, 250, 159, - 52, 248, 186, 250, 159, 224, 16, 79, 174, 5, 251, 7, 174, 5, 254, 83, - 174, 5, 213, 147, 174, 1, 61, 174, 1, 255, 82, 174, 1, 74, 174, 1, 236, - 40, 174, 1, 69, 174, 1, 214, 118, 174, 1, 149, 153, 174, 1, 149, 222, - 182, 174, 1, 149, 156, 174, 1, 149, 232, 191, 174, 1, 76, 174, 1, 254, - 210, 174, 1, 78, 174, 1, 253, 200, 174, 1, 176, 174, 1, 234, 138, 174, 1, - 243, 142, 174, 1, 243, 0, 174, 1, 229, 82, 174, 1, 251, 41, 174, 1, 250, - 165, 174, 1, 235, 147, 174, 1, 235, 120, 174, 1, 227, 169, 174, 1, 215, - 157, 174, 1, 215, 145, 174, 1, 248, 143, 174, 1, 248, 127, 174, 1, 228, - 115, 174, 1, 217, 106, 174, 1, 216, 209, 174, 1, 248, 229, 174, 1, 248, - 33, 174, 1, 198, 174, 1, 191, 174, 1, 225, 150, 174, 1, 252, 199, 174, 1, - 252, 26, 174, 1, 186, 174, 1, 192, 174, 1, 205, 174, 1, 233, 141, 174, 1, - 232, 190, 174, 1, 214, 27, 174, 1, 220, 104, 174, 1, 218, 225, 174, 1, - 206, 174, 1, 162, 174, 25, 5, 255, 82, 174, 25, 5, 74, 174, 25, 5, 236, - 40, 174, 25, 5, 69, 174, 25, 5, 214, 118, 174, 25, 5, 149, 153, 174, 25, - 5, 149, 222, 182, 174, 25, 5, 149, 156, 174, 25, 5, 149, 232, 191, 174, - 25, 5, 76, 174, 25, 5, 254, 210, 174, 25, 5, 78, 174, 25, 5, 253, 200, - 174, 5, 213, 152, 174, 5, 253, 183, 174, 5, 235, 108, 174, 5, 214, 161, - 174, 226, 208, 174, 248, 186, 174, 52, 248, 186, 174, 255, 30, 50, 174, - 220, 139, 174, 21, 210, 86, 174, 21, 111, 174, 21, 105, 174, 21, 158, - 174, 21, 161, 174, 21, 190, 174, 21, 195, 174, 21, 199, 174, 21, 196, - 174, 21, 201, 217, 70, 1, 61, 217, 70, 1, 255, 82, 217, 70, 1, 74, 217, - 70, 1, 236, 40, 217, 70, 1, 69, 217, 70, 1, 214, 118, 217, 70, 1, 76, - 217, 70, 1, 254, 210, 217, 70, 1, 78, 217, 70, 1, 253, 200, 217, 70, 1, - 176, 217, 70, 1, 234, 138, 217, 70, 1, 243, 142, 217, 70, 1, 243, 0, 217, - 70, 1, 229, 82, 217, 70, 1, 251, 41, 217, 70, 1, 250, 165, 217, 70, 1, - 235, 147, 217, 70, 1, 235, 120, 217, 70, 1, 227, 169, 217, 70, 1, 215, - 157, 217, 70, 1, 215, 145, 217, 70, 1, 248, 143, 217, 70, 1, 248, 127, - 217, 70, 1, 228, 115, 217, 70, 1, 217, 106, 217, 70, 1, 216, 209, 217, - 70, 1, 248, 229, 217, 70, 1, 248, 33, 217, 70, 1, 198, 217, 70, 1, 191, - 217, 70, 1, 225, 150, 217, 70, 1, 252, 199, 217, 70, 1, 252, 26, 217, 70, - 1, 186, 217, 70, 1, 192, 217, 70, 1, 205, 217, 70, 1, 233, 141, 217, 70, - 1, 214, 27, 217, 70, 1, 220, 104, 217, 70, 1, 206, 217, 70, 1, 162, 217, - 70, 1, 222, 181, 217, 70, 5, 254, 83, 217, 70, 5, 213, 147, 217, 70, 25, - 5, 255, 82, 217, 70, 25, 5, 74, 217, 70, 25, 5, 236, 40, 217, 70, 25, 5, - 69, 217, 70, 25, 5, 214, 118, 217, 70, 25, 5, 76, 217, 70, 25, 5, 254, - 210, 217, 70, 25, 5, 78, 217, 70, 25, 5, 253, 200, 217, 70, 5, 213, 152, - 217, 70, 5, 227, 209, 217, 70, 21, 210, 86, 217, 70, 21, 111, 217, 70, - 21, 105, 217, 70, 21, 158, 217, 70, 21, 161, 217, 70, 21, 190, 217, 70, - 21, 195, 217, 70, 21, 199, 217, 70, 21, 196, 217, 70, 21, 201, 15, 5, 61, - 15, 5, 116, 30, 61, 15, 5, 116, 30, 252, 184, 15, 5, 116, 30, 243, 112, - 216, 240, 15, 5, 116, 30, 162, 15, 5, 116, 30, 236, 42, 15, 5, 116, 30, - 233, 122, 242, 101, 15, 5, 116, 30, 230, 66, 15, 5, 116, 30, 222, 23, 15, - 5, 255, 84, 15, 5, 255, 34, 15, 5, 255, 35, 30, 253, 237, 15, 5, 255, 35, - 30, 246, 75, 242, 101, 15, 5, 255, 35, 30, 243, 125, 15, 5, 255, 35, 30, - 243, 112, 216, 240, 15, 5, 255, 35, 30, 162, 15, 5, 255, 35, 30, 236, 43, - 242, 101, 15, 5, 255, 35, 30, 236, 16, 15, 5, 255, 35, 30, 233, 123, 15, - 5, 255, 35, 30, 220, 50, 15, 5, 255, 35, 30, 104, 96, 104, 96, 69, 15, 5, - 255, 35, 242, 101, 15, 5, 255, 32, 15, 5, 255, 33, 30, 252, 168, 15, 5, - 255, 33, 30, 243, 112, 216, 240, 15, 5, 255, 33, 30, 231, 97, 96, 245, - 158, 15, 5, 255, 33, 30, 220, 102, 15, 5, 255, 33, 30, 217, 73, 15, 5, - 255, 8, 15, 5, 254, 195, 15, 5, 254, 196, 30, 245, 95, 15, 5, 254, 196, - 30, 220, 12, 96, 242, 197, 15, 5, 254, 187, 15, 5, 254, 188, 30, 254, - 187, 15, 5, 254, 188, 30, 247, 224, 15, 5, 254, 188, 30, 242, 197, 15, 5, - 254, 188, 30, 162, 15, 5, 254, 188, 30, 235, 5, 15, 5, 254, 188, 30, 234, - 98, 15, 5, 254, 188, 30, 220, 65, 15, 5, 254, 188, 30, 214, 126, 15, 5, - 254, 184, 15, 5, 254, 177, 15, 5, 254, 140, 15, 5, 254, 141, 30, 220, 65, - 15, 5, 254, 131, 15, 5, 254, 132, 115, 254, 131, 15, 5, 254, 132, 134, - 216, 86, 15, 5, 254, 132, 96, 229, 222, 226, 168, 254, 132, 96, 229, 221, - 15, 5, 254, 132, 96, 229, 222, 218, 235, 15, 5, 254, 102, 15, 5, 254, 75, - 15, 5, 254, 43, 15, 5, 254, 44, 30, 233, 202, 15, 5, 254, 16, 15, 5, 253, - 244, 15, 5, 253, 239, 15, 5, 253, 240, 210, 40, 216, 240, 15, 5, 253, - 240, 235, 9, 216, 240, 15, 5, 253, 240, 115, 253, 240, 215, 115, 115, - 215, 115, 215, 115, 115, 215, 115, 226, 25, 15, 5, 253, 240, 115, 253, - 240, 115, 253, 239, 15, 5, 253, 240, 115, 253, 240, 115, 253, 240, 249, - 133, 253, 240, 115, 253, 240, 115, 253, 239, 15, 5, 253, 237, 15, 5, 253, - 234, 15, 5, 252, 199, 15, 5, 252, 184, 15, 5, 252, 179, 15, 5, 252, 175, - 15, 5, 252, 169, 15, 5, 252, 170, 115, 252, 169, 15, 5, 252, 168, 15, 5, - 130, 15, 5, 252, 148, 15, 5, 252, 14, 15, 5, 252, 15, 30, 61, 15, 5, 252, - 15, 30, 243, 103, 15, 5, 252, 15, 30, 236, 43, 242, 101, 15, 5, 251, 133, - 15, 5, 251, 134, 115, 251, 134, 255, 34, 15, 5, 251, 134, 115, 251, 134, - 214, 190, 15, 5, 251, 134, 249, 133, 251, 133, 15, 5, 251, 117, 15, 5, - 251, 118, 115, 251, 117, 15, 5, 251, 106, 15, 5, 251, 105, 15, 5, 248, - 229, 15, 5, 248, 220, 15, 5, 248, 221, 234, 72, 30, 116, 96, 231, 152, - 15, 5, 248, 221, 234, 72, 30, 254, 140, 15, 5, 248, 221, 234, 72, 30, - 252, 168, 15, 5, 248, 221, 234, 72, 30, 252, 14, 15, 5, 248, 221, 234, - 72, 30, 243, 142, 15, 5, 248, 221, 234, 72, 30, 243, 143, 96, 231, 152, - 15, 5, 248, 221, 234, 72, 30, 242, 221, 15, 5, 248, 221, 234, 72, 30, - 242, 204, 15, 5, 248, 221, 234, 72, 30, 242, 110, 15, 5, 248, 221, 234, - 72, 30, 162, 15, 5, 248, 221, 234, 72, 30, 235, 186, 15, 5, 248, 221, - 234, 72, 30, 235, 187, 96, 232, 103, 15, 5, 248, 221, 234, 72, 30, 234, - 248, 15, 5, 248, 221, 234, 72, 30, 233, 141, 15, 5, 248, 221, 234, 72, - 30, 232, 103, 15, 5, 248, 221, 234, 72, 30, 232, 104, 96, 231, 151, 15, - 5, 248, 221, 234, 72, 30, 232, 89, 15, 5, 248, 221, 234, 72, 30, 229, - 112, 15, 5, 248, 221, 234, 72, 30, 226, 26, 96, 226, 25, 15, 5, 248, 221, - 234, 72, 30, 219, 193, 15, 5, 248, 221, 234, 72, 30, 217, 73, 15, 5, 248, - 221, 234, 72, 30, 214, 231, 96, 242, 204, 15, 5, 248, 221, 234, 72, 30, - 214, 126, 15, 5, 248, 195, 15, 5, 248, 174, 15, 5, 248, 173, 15, 5, 248, - 172, 15, 5, 248, 11, 15, 5, 247, 250, 15, 5, 247, 225, 15, 5, 247, 226, - 30, 220, 65, 15, 5, 247, 224, 15, 5, 247, 214, 15, 5, 247, 215, 234, 214, - 104, 242, 102, 247, 195, 15, 5, 247, 195, 15, 5, 246, 86, 15, 5, 246, 87, - 115, 246, 86, 15, 5, 246, 87, 242, 101, 15, 5, 246, 87, 220, 47, 15, 5, - 246, 84, 15, 5, 246, 85, 30, 245, 80, 15, 5, 246, 83, 15, 5, 246, 82, 15, - 5, 246, 81, 15, 5, 246, 80, 15, 5, 246, 76, 15, 5, 246, 74, 15, 5, 246, - 75, 242, 101, 15, 5, 246, 75, 242, 102, 242, 101, 15, 5, 246, 73, 15, 5, - 246, 66, 15, 5, 76, 15, 5, 160, 30, 226, 25, 15, 5, 160, 115, 160, 227, - 199, 115, 227, 198, 15, 5, 245, 242, 15, 5, 245, 243, 30, 116, 96, 242, - 56, 96, 248, 229, 15, 5, 245, 243, 30, 243, 103, 15, 5, 245, 243, 30, - 230, 235, 15, 5, 245, 243, 30, 222, 10, 15, 5, 245, 243, 30, 220, 65, 15, - 5, 245, 243, 30, 69, 15, 5, 245, 219, 15, 5, 245, 208, 15, 5, 245, 182, - 15, 5, 245, 158, 15, 5, 245, 159, 30, 243, 111, 15, 5, 245, 159, 30, 243, - 112, 216, 240, 15, 5, 245, 159, 30, 231, 96, 15, 5, 245, 159, 249, 133, - 245, 158, 15, 5, 245, 159, 226, 168, 245, 158, 15, 5, 245, 159, 218, 235, - 15, 5, 245, 97, 15, 5, 245, 95, 15, 5, 245, 80, 15, 5, 245, 18, 15, 5, - 245, 19, 30, 61, 15, 5, 245, 19, 30, 116, 96, 233, 110, 15, 5, 245, 19, - 30, 116, 96, 233, 111, 30, 233, 110, 15, 5, 245, 19, 30, 254, 131, 15, 5, - 245, 19, 30, 252, 184, 15, 5, 245, 19, 30, 246, 75, 242, 101, 15, 5, 245, - 19, 30, 246, 75, 242, 102, 242, 101, 15, 5, 245, 19, 30, 162, 15, 5, 245, - 19, 30, 242, 56, 242, 101, 15, 5, 245, 19, 30, 236, 43, 242, 101, 15, 5, - 245, 19, 30, 234, 213, 15, 5, 245, 19, 30, 234, 214, 218, 235, 15, 5, - 245, 19, 30, 233, 221, 15, 5, 245, 19, 30, 233, 141, 15, 5, 245, 19, 30, - 233, 111, 30, 233, 110, 15, 5, 245, 19, 30, 232, 247, 15, 5, 245, 19, 30, - 232, 103, 15, 5, 245, 19, 30, 214, 230, 15, 5, 245, 19, 30, 214, 219, 15, - 5, 243, 142, 15, 5, 243, 143, 242, 101, 15, 5, 243, 140, 15, 5, 243, 141, - 30, 116, 96, 248, 230, 96, 162, 15, 5, 243, 141, 30, 116, 96, 162, 15, 5, - 243, 141, 30, 116, 96, 236, 42, 15, 5, 243, 141, 30, 255, 33, 216, 241, - 96, 217, 94, 15, 5, 243, 141, 30, 254, 131, 15, 5, 243, 141, 30, 253, - 239, 15, 5, 243, 141, 30, 253, 238, 96, 243, 125, 15, 5, 243, 141, 30, - 252, 184, 15, 5, 243, 141, 30, 252, 149, 96, 205, 15, 5, 243, 141, 30, - 251, 106, 15, 5, 243, 141, 30, 251, 107, 96, 205, 15, 5, 243, 141, 30, - 248, 229, 15, 5, 243, 141, 30, 248, 11, 15, 5, 243, 141, 30, 247, 226, - 30, 220, 65, 15, 5, 243, 141, 30, 246, 84, 15, 5, 243, 141, 30, 245, 182, - 15, 5, 243, 141, 30, 245, 183, 96, 233, 141, 15, 5, 243, 141, 30, 245, - 158, 15, 5, 243, 141, 30, 245, 159, 30, 243, 112, 216, 240, 15, 5, 243, - 141, 30, 243, 112, 216, 240, 15, 5, 243, 141, 30, 243, 103, 15, 5, 243, - 141, 30, 242, 221, 15, 5, 243, 141, 30, 242, 219, 15, 5, 243, 141, 30, - 242, 220, 96, 61, 15, 5, 243, 141, 30, 242, 205, 96, 218, 84, 15, 5, 243, - 141, 30, 242, 56, 96, 232, 104, 96, 245, 80, 15, 5, 243, 141, 30, 242, - 37, 15, 5, 243, 141, 30, 242, 38, 96, 233, 141, 15, 5, 243, 141, 30, 241, - 188, 96, 232, 247, 15, 5, 243, 141, 30, 240, 225, 15, 5, 243, 141, 30, - 236, 43, 242, 101, 15, 5, 243, 141, 30, 235, 173, 96, 240, 230, 96, 253, - 239, 15, 5, 243, 141, 30, 234, 248, 15, 5, 243, 141, 30, 234, 213, 15, 5, - 243, 141, 30, 234, 95, 15, 5, 243, 141, 30, 234, 96, 96, 233, 110, 15, 5, - 243, 141, 30, 233, 222, 96, 254, 131, 15, 5, 243, 141, 30, 233, 141, 15, - 5, 243, 141, 30, 231, 97, 96, 245, 158, 15, 5, 243, 141, 30, 230, 235, - 15, 5, 243, 141, 30, 227, 198, 15, 5, 243, 141, 30, 227, 199, 115, 227, - 198, 15, 5, 243, 141, 30, 191, 15, 5, 243, 141, 30, 222, 10, 15, 5, 243, - 141, 30, 221, 233, 15, 5, 243, 141, 30, 220, 65, 15, 5, 243, 141, 30, - 220, 66, 96, 215, 99, 15, 5, 243, 141, 30, 220, 32, 15, 5, 243, 141, 30, - 218, 44, 15, 5, 243, 141, 30, 217, 73, 15, 5, 243, 141, 30, 69, 15, 5, - 243, 141, 30, 214, 219, 15, 5, 243, 141, 30, 214, 220, 96, 246, 86, 15, - 5, 243, 141, 115, 243, 140, 15, 5, 243, 135, 15, 5, 243, 136, 249, 133, - 243, 135, 15, 5, 243, 133, 15, 5, 243, 134, 115, 243, 134, 243, 104, 115, - 243, 103, 15, 5, 243, 125, 15, 5, 243, 126, 243, 134, 115, 243, 134, 243, - 104, 115, 243, 103, 15, 5, 243, 124, 15, 5, 243, 122, 15, 5, 243, 113, - 15, 5, 243, 111, 15, 5, 243, 112, 216, 240, 15, 5, 243, 112, 115, 243, - 111, 15, 5, 243, 112, 249, 133, 243, 111, 15, 5, 243, 103, 15, 5, 243, - 102, 15, 5, 243, 97, 15, 5, 243, 43, 15, 5, 243, 44, 30, 233, 202, 15, 5, - 242, 221, 15, 5, 242, 222, 30, 76, 15, 5, 242, 222, 30, 69, 15, 5, 242, - 222, 249, 133, 242, 221, 15, 5, 242, 219, 15, 5, 242, 220, 115, 242, 219, - 15, 5, 242, 220, 249, 133, 242, 219, 15, 5, 242, 216, 15, 5, 242, 204, - 15, 5, 242, 205, 242, 101, 15, 5, 242, 202, 15, 5, 242, 203, 30, 116, 96, - 236, 42, 15, 5, 242, 203, 30, 243, 112, 216, 240, 15, 5, 242, 203, 30, - 236, 42, 15, 5, 242, 203, 30, 232, 104, 96, 236, 42, 15, 5, 242, 203, 30, - 191, 15, 5, 242, 199, 15, 5, 242, 197, 15, 5, 242, 198, 249, 133, 242, - 197, 15, 5, 242, 198, 30, 252, 184, 15, 5, 242, 198, 30, 217, 73, 15, 5, - 242, 198, 216, 240, 15, 5, 242, 120, 15, 5, 242, 121, 249, 133, 242, 120, - 15, 5, 242, 118, 15, 5, 242, 119, 30, 234, 248, 15, 5, 242, 119, 30, 234, - 249, 30, 236, 43, 242, 101, 15, 5, 242, 119, 30, 227, 198, 15, 5, 242, - 119, 30, 222, 11, 96, 215, 114, 15, 5, 242, 119, 242, 101, 15, 5, 242, - 110, 15, 5, 242, 111, 30, 116, 96, 233, 202, 15, 5, 242, 111, 30, 233, - 202, 15, 5, 242, 111, 115, 242, 111, 232, 96, 15, 5, 242, 105, 15, 5, - 242, 103, 15, 5, 242, 104, 30, 220, 65, 15, 5, 242, 95, 15, 5, 242, 94, - 15, 5, 242, 91, 15, 5, 242, 90, 15, 5, 162, 15, 5, 242, 56, 216, 240, 15, - 5, 242, 56, 242, 101, 15, 5, 242, 37, 15, 5, 241, 187, 15, 5, 241, 188, - 30, 253, 239, 15, 5, 241, 188, 30, 253, 237, 15, 5, 241, 188, 30, 252, - 184, 15, 5, 241, 188, 30, 247, 195, 15, 5, 241, 188, 30, 243, 133, 15, 5, - 241, 188, 30, 234, 87, 15, 5, 241, 188, 30, 227, 198, 15, 5, 241, 188, - 30, 220, 65, 15, 5, 241, 188, 30, 69, 15, 5, 240, 229, 15, 5, 240, 225, - 15, 5, 240, 226, 30, 254, 131, 15, 5, 240, 226, 30, 242, 37, 15, 5, 240, - 226, 30, 234, 213, 15, 5, 240, 226, 30, 232, 203, 15, 5, 240, 226, 30, - 214, 219, 15, 5, 240, 222, 15, 5, 74, 15, 5, 240, 161, 61, 15, 5, 240, - 122, 15, 5, 236, 70, 15, 5, 236, 71, 115, 236, 71, 251, 106, 15, 5, 236, - 71, 115, 236, 71, 218, 235, 15, 5, 236, 45, 15, 5, 236, 42, 15, 5, 236, - 43, 247, 250, 15, 5, 236, 43, 223, 38, 15, 5, 236, 43, 115, 236, 43, 220, - 16, 115, 220, 16, 214, 220, 115, 214, 219, 15, 5, 236, 43, 242, 101, 15, - 5, 236, 34, 15, 5, 236, 35, 30, 243, 112, 216, 240, 15, 5, 236, 33, 15, - 5, 236, 23, 15, 5, 236, 24, 30, 217, 73, 15, 5, 236, 24, 249, 133, 236, - 23, 15, 5, 236, 24, 226, 168, 236, 23, 15, 5, 236, 24, 218, 235, 15, 5, - 236, 16, 15, 5, 236, 6, 15, 5, 235, 186, 15, 5, 235, 172, 15, 5, 176, 15, - 5, 235, 19, 30, 61, 15, 5, 235, 19, 30, 255, 8, 15, 5, 235, 19, 30, 255, - 9, 96, 233, 221, 15, 5, 235, 19, 30, 253, 237, 15, 5, 235, 19, 30, 252, - 184, 15, 5, 235, 19, 30, 252, 168, 15, 5, 235, 19, 30, 130, 15, 5, 235, - 19, 30, 252, 14, 15, 5, 235, 19, 30, 245, 95, 15, 5, 235, 19, 30, 245, - 80, 15, 5, 235, 19, 30, 243, 142, 15, 5, 235, 19, 30, 243, 125, 15, 5, - 235, 19, 30, 243, 112, 216, 240, 15, 5, 235, 19, 30, 243, 103, 15, 5, - 235, 19, 30, 243, 104, 96, 220, 103, 96, 61, 15, 5, 235, 19, 30, 242, - 221, 15, 5, 235, 19, 30, 242, 204, 15, 5, 235, 19, 30, 242, 198, 96, 221, - 233, 15, 5, 235, 19, 30, 242, 198, 249, 133, 242, 197, 15, 5, 235, 19, - 30, 242, 120, 15, 5, 235, 19, 30, 242, 94, 15, 5, 235, 19, 30, 236, 42, - 15, 5, 235, 19, 30, 236, 23, 15, 5, 235, 19, 30, 234, 248, 15, 5, 235, - 19, 30, 234, 98, 15, 5, 235, 19, 30, 234, 95, 15, 5, 235, 19, 30, 232, - 247, 15, 5, 235, 19, 30, 232, 103, 15, 5, 235, 19, 30, 231, 96, 15, 5, - 235, 19, 30, 231, 97, 96, 246, 86, 15, 5, 235, 19, 30, 231, 97, 96, 242, - 221, 15, 5, 235, 19, 30, 231, 97, 96, 217, 23, 15, 5, 235, 19, 30, 230, - 235, 15, 5, 235, 19, 30, 230, 236, 96, 227, 193, 15, 5, 235, 19, 30, 229, - 112, 15, 5, 235, 19, 30, 227, 198, 15, 5, 235, 19, 30, 225, 111, 15, 5, - 235, 19, 30, 222, 142, 15, 5, 235, 19, 30, 206, 15, 5, 235, 19, 30, 221, - 233, 15, 5, 235, 19, 30, 220, 104, 15, 5, 235, 19, 30, 220, 65, 15, 5, - 235, 19, 30, 220, 32, 15, 5, 235, 19, 30, 219, 227, 15, 5, 235, 19, 30, - 219, 184, 15, 5, 235, 19, 30, 218, 52, 15, 5, 235, 19, 30, 217, 51, 15, - 5, 235, 19, 30, 69, 15, 5, 235, 19, 30, 214, 230, 15, 5, 235, 19, 30, - 214, 219, 15, 5, 235, 19, 30, 214, 193, 30, 191, 15, 5, 235, 19, 30, 214, - 126, 15, 5, 235, 19, 30, 210, 44, 15, 5, 235, 17, 15, 5, 235, 18, 249, - 133, 235, 17, 15, 5, 235, 10, 15, 5, 235, 7, 15, 5, 235, 5, 15, 5, 235, - 4, 15, 5, 235, 2, 15, 5, 235, 3, 115, 235, 2, 15, 5, 234, 248, 15, 5, - 234, 249, 30, 236, 43, 242, 101, 15, 5, 234, 244, 15, 5, 234, 245, 30, - 252, 184, 15, 5, 234, 245, 249, 133, 234, 244, 15, 5, 234, 242, 15, 5, - 234, 241, 15, 5, 234, 213, 15, 5, 234, 214, 233, 124, 30, 104, 115, 233, - 124, 30, 69, 15, 5, 234, 214, 115, 234, 214, 233, 124, 30, 104, 115, 233, - 124, 30, 69, 15, 5, 234, 163, 15, 5, 234, 98, 15, 5, 234, 99, 30, 252, - 184, 15, 5, 234, 99, 30, 69, 15, 5, 234, 99, 30, 214, 219, 15, 5, 234, - 95, 15, 5, 234, 87, 15, 5, 234, 74, 15, 5, 234, 73, 15, 5, 234, 71, 15, - 5, 234, 72, 115, 234, 71, 15, 5, 233, 223, 15, 5, 233, 224, 115, 241, - 188, 30, 253, 238, 233, 224, 115, 241, 188, 30, 253, 237, 15, 5, 233, - 221, 15, 5, 233, 219, 15, 5, 233, 220, 214, 12, 17, 15, 5, 233, 218, 15, - 5, 233, 215, 15, 5, 233, 216, 242, 101, 15, 5, 233, 214, 15, 5, 233, 202, - 15, 5, 233, 203, 226, 168, 233, 202, 15, 5, 233, 197, 15, 5, 233, 178, - 15, 5, 233, 141, 15, 5, 233, 123, 15, 5, 233, 124, 30, 61, 15, 5, 233, - 124, 30, 116, 96, 248, 230, 96, 162, 15, 5, 233, 124, 30, 116, 96, 243, - 103, 15, 5, 233, 124, 30, 116, 96, 233, 110, 15, 5, 233, 124, 30, 254, - 187, 15, 5, 233, 124, 30, 254, 131, 15, 5, 233, 124, 30, 253, 240, 210, - 40, 216, 240, 15, 5, 233, 124, 30, 252, 184, 15, 5, 233, 124, 30, 252, - 14, 15, 5, 233, 124, 30, 248, 174, 15, 5, 233, 124, 30, 245, 158, 15, 5, - 233, 124, 30, 243, 142, 15, 5, 233, 124, 30, 243, 103, 15, 5, 233, 124, - 30, 242, 110, 15, 5, 233, 124, 30, 242, 111, 96, 242, 110, 15, 5, 233, - 124, 30, 162, 15, 5, 233, 124, 30, 242, 37, 15, 5, 233, 124, 30, 241, - 188, 30, 227, 198, 15, 5, 233, 124, 30, 236, 43, 242, 101, 15, 5, 233, - 124, 30, 236, 23, 15, 5, 233, 124, 30, 236, 24, 96, 162, 15, 5, 233, 124, - 30, 236, 24, 96, 232, 103, 15, 5, 233, 124, 30, 234, 98, 15, 5, 233, 124, - 30, 234, 87, 15, 5, 233, 124, 30, 233, 221, 15, 5, 233, 124, 30, 233, - 215, 15, 5, 233, 124, 30, 233, 216, 96, 241, 188, 96, 61, 15, 5, 233, - 124, 30, 233, 123, 15, 5, 233, 124, 30, 232, 203, 15, 5, 233, 124, 30, - 232, 103, 15, 5, 233, 124, 30, 232, 91, 15, 5, 233, 124, 30, 231, 96, 15, - 5, 233, 124, 30, 231, 97, 96, 245, 158, 15, 5, 233, 124, 30, 230, 66, 15, - 5, 233, 124, 30, 229, 112, 15, 5, 233, 124, 30, 220, 66, 96, 218, 44, 15, - 5, 233, 124, 30, 220, 12, 96, 242, 198, 96, 245, 95, 15, 5, 233, 124, 30, - 220, 12, 96, 242, 198, 216, 240, 15, 5, 233, 124, 30, 219, 225, 15, 5, - 233, 124, 30, 219, 226, 96, 219, 225, 15, 5, 233, 124, 30, 218, 44, 15, - 5, 233, 124, 30, 217, 85, 15, 5, 233, 124, 30, 217, 73, 15, 5, 233, 124, - 30, 217, 24, 96, 116, 96, 218, 85, 96, 198, 15, 5, 233, 124, 30, 69, 15, - 5, 233, 124, 30, 104, 96, 61, 15, 5, 233, 124, 30, 104, 96, 104, 96, 69, - 15, 5, 233, 124, 30, 214, 231, 96, 253, 239, 15, 5, 233, 124, 30, 214, - 219, 15, 5, 233, 124, 30, 214, 126, 15, 5, 233, 124, 218, 235, 15, 5, - 233, 121, 15, 5, 233, 122, 30, 220, 65, 15, 5, 233, 122, 30, 220, 66, 96, - 218, 44, 15, 5, 233, 122, 242, 101, 15, 5, 233, 122, 242, 102, 115, 233, - 122, 242, 102, 220, 65, 15, 5, 233, 117, 15, 5, 233, 110, 15, 5, 233, - 111, 30, 233, 110, 15, 5, 233, 108, 15, 5, 233, 109, 30, 233, 202, 15, 5, - 233, 109, 30, 233, 203, 96, 222, 142, 15, 5, 232, 247, 15, 5, 232, 232, - 15, 5, 232, 222, 15, 5, 232, 203, 15, 5, 232, 103, 15, 5, 232, 104, 30, - 252, 184, 15, 5, 232, 101, 15, 5, 232, 102, 30, 254, 187, 15, 5, 232, - 102, 30, 252, 184, 15, 5, 232, 102, 30, 245, 80, 15, 5, 232, 102, 30, - 245, 81, 216, 240, 15, 5, 232, 102, 30, 243, 112, 216, 240, 15, 5, 232, - 102, 30, 241, 188, 30, 252, 184, 15, 5, 232, 102, 30, 236, 23, 15, 5, - 232, 102, 30, 235, 7, 15, 5, 232, 102, 30, 235, 5, 15, 5, 232, 102, 30, - 235, 6, 96, 253, 239, 15, 5, 232, 102, 30, 234, 98, 15, 5, 232, 102, 30, - 233, 142, 96, 253, 239, 15, 5, 232, 102, 30, 233, 123, 15, 5, 232, 102, - 30, 231, 97, 96, 245, 158, 15, 5, 232, 102, 30, 229, 112, 15, 5, 232, - 102, 30, 227, 242, 15, 5, 232, 102, 30, 219, 194, 96, 253, 239, 15, 5, - 232, 102, 30, 219, 176, 96, 251, 133, 15, 5, 232, 102, 30, 215, 114, 15, - 5, 232, 102, 216, 240, 15, 5, 232, 102, 249, 133, 232, 101, 15, 5, 232, - 102, 226, 168, 232, 101, 15, 5, 232, 102, 218, 235, 15, 5, 232, 102, 220, - 47, 15, 5, 232, 100, 15, 5, 232, 96, 15, 5, 232, 97, 115, 232, 96, 15, 5, - 232, 97, 226, 168, 232, 96, 15, 5, 232, 97, 220, 47, 15, 5, 232, 94, 15, - 5, 232, 91, 15, 5, 232, 89, 15, 5, 232, 90, 115, 232, 89, 15, 5, 232, 90, - 115, 232, 90, 243, 104, 115, 243, 103, 15, 5, 186, 15, 5, 231, 244, 30, - 217, 73, 15, 5, 231, 244, 242, 101, 15, 5, 231, 243, 15, 5, 231, 215, 15, - 5, 231, 171, 15, 5, 231, 152, 15, 5, 231, 151, 15, 5, 231, 96, 15, 5, - 231, 52, 15, 5, 230, 235, 15, 5, 230, 193, 15, 5, 230, 107, 15, 5, 230, - 108, 115, 230, 107, 15, 5, 230, 98, 15, 5, 230, 99, 242, 101, 15, 5, 230, - 83, 15, 5, 230, 69, 15, 5, 230, 66, 15, 5, 230, 67, 30, 61, 15, 5, 230, - 67, 30, 233, 202, 15, 5, 230, 67, 30, 210, 116, 15, 5, 230, 67, 115, 230, - 66, 15, 5, 230, 67, 115, 230, 67, 30, 116, 96, 198, 15, 5, 230, 67, 249, - 133, 230, 66, 15, 5, 230, 64, 15, 5, 230, 65, 30, 61, 15, 5, 230, 65, 30, - 116, 96, 248, 11, 15, 5, 230, 65, 30, 248, 11, 15, 5, 230, 65, 242, 101, - 15, 5, 198, 15, 5, 229, 232, 15, 5, 229, 221, 15, 5, 229, 222, 235, 199, - 15, 5, 229, 222, 30, 219, 228, 216, 240, 15, 5, 229, 222, 226, 168, 229, - 221, 15, 5, 229, 220, 15, 5, 229, 213, 227, 184, 15, 5, 229, 212, 15, 5, - 229, 211, 15, 5, 229, 112, 15, 5, 229, 113, 30, 61, 15, 5, 229, 113, 30, - 214, 219, 15, 5, 229, 113, 220, 47, 15, 5, 228, 238, 15, 5, 228, 239, 30, - 76, 15, 5, 228, 237, 15, 5, 228, 208, 15, 5, 228, 209, 30, 243, 112, 216, - 240, 15, 5, 228, 209, 30, 243, 104, 96, 243, 112, 216, 240, 15, 5, 228, - 206, 15, 5, 228, 207, 30, 254, 131, 15, 5, 228, 207, 30, 253, 239, 15, 5, - 228, 207, 30, 253, 240, 96, 253, 239, 15, 5, 228, 207, 30, 242, 110, 15, - 5, 228, 207, 30, 231, 97, 96, 243, 112, 216, 240, 15, 5, 228, 207, 30, - 229, 112, 15, 5, 228, 207, 30, 227, 198, 15, 5, 228, 207, 30, 220, 65, - 15, 5, 228, 207, 30, 220, 66, 96, 116, 254, 131, 15, 5, 228, 207, 30, - 220, 66, 96, 253, 239, 15, 5, 228, 207, 30, 220, 66, 96, 253, 240, 96, - 253, 239, 15, 5, 228, 207, 30, 214, 231, 96, 253, 239, 15, 5, 228, 207, - 30, 214, 126, 15, 5, 228, 195, 15, 5, 227, 242, 15, 5, 227, 214, 15, 5, - 227, 198, 15, 5, 227, 199, 233, 122, 30, 243, 103, 15, 5, 227, 199, 233, - 122, 30, 231, 152, 15, 5, 227, 199, 233, 122, 30, 222, 10, 15, 5, 227, - 199, 233, 122, 30, 222, 11, 115, 227, 199, 233, 122, 30, 222, 10, 15, 5, - 227, 199, 233, 122, 30, 214, 126, 15, 5, 227, 199, 216, 240, 15, 5, 227, - 199, 115, 227, 198, 15, 5, 227, 199, 249, 133, 227, 198, 15, 5, 227, 199, - 249, 133, 227, 199, 233, 122, 115, 233, 121, 15, 5, 227, 193, 15, 5, 227, - 194, 255, 33, 30, 253, 234, 15, 5, 227, 194, 255, 33, 30, 252, 14, 15, 5, - 227, 194, 255, 33, 30, 246, 82, 15, 5, 227, 194, 255, 33, 30, 242, 110, - 15, 5, 227, 194, 255, 33, 30, 236, 43, 242, 101, 15, 5, 227, 194, 255, - 33, 30, 235, 5, 15, 5, 227, 194, 255, 33, 30, 233, 141, 15, 5, 227, 194, - 255, 33, 30, 229, 112, 15, 5, 227, 194, 255, 33, 30, 219, 173, 15, 5, - 227, 194, 255, 33, 30, 214, 230, 15, 5, 227, 194, 234, 72, 30, 252, 14, - 15, 5, 227, 194, 234, 72, 30, 252, 15, 69, 15, 5, 191, 15, 5, 226, 84, - 15, 5, 226, 51, 15, 5, 226, 25, 15, 5, 225, 164, 15, 5, 225, 111, 15, 5, - 225, 112, 30, 61, 15, 5, 225, 112, 30, 255, 34, 15, 5, 225, 112, 30, 252, - 14, 15, 5, 225, 112, 30, 251, 133, 15, 5, 225, 112, 30, 76, 15, 5, 225, - 112, 30, 74, 15, 5, 225, 112, 30, 240, 122, 15, 5, 225, 112, 30, 69, 15, - 5, 225, 112, 30, 214, 230, 15, 5, 225, 112, 249, 133, 225, 111, 15, 5, - 225, 56, 15, 5, 225, 57, 30, 234, 244, 15, 5, 225, 57, 30, 214, 219, 15, - 5, 225, 57, 30, 210, 116, 15, 5, 225, 57, 226, 168, 225, 56, 15, 5, 205, - 15, 5, 223, 185, 15, 5, 223, 38, 15, 5, 222, 142, 15, 5, 206, 15, 5, 222, - 24, 227, 184, 15, 5, 222, 23, 15, 5, 222, 24, 30, 61, 15, 5, 222, 24, 30, - 246, 86, 15, 5, 222, 24, 30, 246, 84, 15, 5, 222, 24, 30, 162, 15, 5, - 222, 24, 30, 234, 248, 15, 5, 222, 24, 30, 233, 202, 15, 5, 222, 24, 30, - 232, 89, 15, 5, 222, 24, 30, 230, 235, 15, 5, 222, 24, 30, 227, 198, 15, - 5, 222, 24, 30, 222, 10, 15, 5, 222, 24, 30, 220, 32, 15, 5, 222, 24, 30, - 217, 94, 15, 5, 222, 24, 30, 214, 230, 15, 5, 222, 24, 30, 214, 225, 15, - 5, 222, 24, 30, 214, 197, 15, 5, 222, 24, 30, 214, 150, 15, 5, 222, 24, - 30, 214, 126, 15, 5, 222, 24, 115, 222, 23, 15, 5, 222, 24, 242, 101, 15, - 5, 222, 10, 15, 5, 222, 11, 233, 124, 30, 253, 237, 15, 5, 221, 241, 15, - 5, 221, 233, 15, 5, 220, 104, 15, 5, 220, 102, 15, 5, 220, 103, 30, 61, - 15, 5, 220, 103, 30, 252, 184, 15, 5, 220, 103, 30, 242, 197, 15, 5, 220, - 103, 30, 229, 112, 15, 5, 220, 103, 30, 219, 225, 15, 5, 220, 103, 30, - 215, 99, 15, 5, 220, 103, 30, 69, 15, 5, 220, 103, 30, 104, 96, 61, 15, - 5, 220, 101, 15, 5, 220, 99, 15, 5, 220, 80, 15, 5, 220, 65, 15, 5, 220, - 66, 240, 229, 15, 5, 220, 66, 115, 220, 66, 243, 134, 115, 243, 134, 243, - 104, 115, 243, 103, 15, 5, 220, 66, 115, 220, 66, 217, 95, 115, 217, 95, - 243, 104, 115, 243, 103, 15, 5, 220, 58, 15, 5, 220, 53, 15, 5, 220, 50, - 15, 5, 220, 49, 15, 5, 220, 46, 15, 5, 220, 32, 15, 5, 220, 33, 30, 61, - 15, 5, 220, 33, 30, 236, 23, 15, 5, 220, 26, 15, 5, 220, 27, 30, 61, 15, - 5, 220, 27, 30, 252, 169, 15, 5, 220, 27, 30, 251, 117, 15, 5, 220, 27, - 30, 247, 214, 15, 5, 220, 27, 30, 243, 103, 15, 5, 220, 27, 30, 236, 42, - 15, 5, 220, 27, 30, 236, 43, 242, 101, 15, 5, 220, 27, 30, 233, 197, 15, - 5, 220, 27, 30, 232, 91, 15, 5, 220, 27, 30, 230, 98, 15, 5, 220, 27, 30, - 222, 10, 15, 5, 220, 20, 15, 5, 220, 15, 15, 5, 220, 16, 216, 240, 15, 5, - 220, 16, 115, 220, 16, 251, 107, 115, 251, 106, 15, 5, 220, 11, 15, 5, - 219, 227, 15, 5, 219, 228, 115, 235, 200, 219, 227, 15, 5, 219, 225, 15, - 5, 219, 224, 15, 5, 219, 193, 15, 5, 219, 194, 242, 101, 15, 5, 219, 184, - 15, 5, 219, 182, 15, 5, 219, 183, 115, 219, 183, 219, 225, 15, 5, 219, - 175, 15, 5, 219, 173, 15, 5, 218, 84, 15, 5, 218, 85, 115, 218, 84, 15, - 5, 218, 55, 15, 5, 218, 54, 15, 5, 218, 52, 15, 5, 218, 44, 15, 5, 218, - 43, 15, 5, 218, 18, 15, 5, 218, 17, 15, 5, 217, 106, 15, 5, 217, 107, - 253, 224, 15, 5, 217, 107, 30, 241, 187, 15, 5, 217, 107, 30, 230, 235, - 15, 5, 217, 107, 242, 101, 15, 5, 217, 94, 15, 5, 217, 95, 115, 217, 95, - 228, 239, 115, 228, 239, 247, 196, 115, 247, 195, 15, 5, 217, 95, 218, - 235, 15, 5, 217, 85, 15, 5, 129, 30, 252, 14, 15, 5, 129, 30, 242, 110, - 15, 5, 129, 30, 220, 65, 15, 5, 129, 30, 219, 227, 15, 5, 129, 30, 215, - 114, 15, 5, 129, 30, 214, 219, 15, 5, 217, 73, 15, 5, 217, 51, 15, 5, - 217, 23, 15, 5, 217, 24, 242, 101, 15, 5, 216, 118, 15, 5, 216, 119, 216, - 240, 15, 5, 216, 91, 15, 5, 216, 73, 15, 5, 216, 74, 30, 217, 73, 15, 5, - 216, 74, 115, 216, 73, 15, 5, 216, 74, 115, 216, 74, 243, 134, 115, 243, - 134, 243, 104, 115, 243, 103, 15, 5, 215, 119, 15, 5, 215, 114, 15, 5, - 215, 112, 15, 5, 215, 109, 15, 5, 215, 99, 15, 5, 215, 100, 115, 215, - 100, 210, 117, 115, 210, 116, 15, 5, 69, 15, 5, 104, 242, 110, 15, 5, - 104, 104, 69, 15, 5, 104, 115, 104, 226, 94, 115, 226, 94, 243, 104, 115, - 243, 103, 15, 5, 104, 115, 104, 218, 19, 115, 218, 18, 15, 5, 104, 115, - 104, 104, 223, 52, 115, 104, 223, 51, 15, 5, 214, 230, 15, 5, 214, 225, - 15, 5, 214, 219, 15, 5, 214, 220, 233, 197, 15, 5, 214, 220, 30, 252, - 184, 15, 5, 214, 220, 30, 230, 235, 15, 5, 214, 220, 30, 104, 96, 104, - 96, 69, 15, 5, 214, 220, 30, 104, 96, 104, 96, 104, 242, 101, 15, 5, 214, - 220, 242, 101, 15, 5, 214, 220, 220, 47, 15, 5, 214, 220, 220, 48, 30, - 252, 184, 15, 5, 214, 215, 15, 5, 214, 197, 15, 5, 214, 198, 30, 233, - 123, 15, 5, 214, 198, 30, 231, 97, 96, 248, 229, 15, 5, 214, 198, 30, - 220, 102, 15, 5, 214, 198, 30, 69, 15, 5, 214, 196, 15, 5, 214, 192, 15, - 5, 214, 193, 30, 234, 213, 15, 5, 214, 193, 30, 191, 15, 5, 214, 190, 15, - 5, 214, 191, 242, 101, 15, 5, 214, 150, 15, 5, 214, 151, 249, 133, 214, - 150, 15, 5, 214, 151, 220, 47, 15, 5, 214, 148, 15, 5, 214, 149, 30, 116, - 96, 162, 15, 5, 214, 149, 30, 116, 96, 198, 15, 5, 214, 149, 30, 254, - 187, 15, 5, 214, 149, 30, 162, 15, 5, 214, 149, 30, 227, 198, 15, 5, 214, - 149, 30, 214, 230, 15, 5, 214, 149, 30, 214, 231, 96, 253, 239, 15, 5, - 214, 149, 30, 214, 231, 96, 252, 14, 15, 5, 214, 147, 15, 5, 214, 144, - 15, 5, 214, 143, 15, 5, 214, 139, 15, 5, 214, 140, 30, 61, 15, 5, 214, - 140, 30, 253, 234, 15, 5, 214, 140, 30, 130, 15, 5, 214, 140, 30, 246, - 76, 15, 5, 214, 140, 30, 243, 142, 15, 5, 214, 140, 30, 243, 125, 15, 5, - 214, 140, 30, 243, 112, 216, 240, 15, 5, 214, 140, 30, 243, 103, 15, 5, - 214, 140, 30, 242, 120, 15, 5, 214, 140, 30, 162, 15, 5, 214, 140, 30, - 236, 42, 15, 5, 214, 140, 30, 236, 23, 15, 5, 214, 140, 30, 235, 172, 15, - 5, 214, 140, 30, 234, 98, 15, 5, 214, 140, 30, 232, 89, 15, 5, 214, 140, - 30, 230, 193, 15, 5, 214, 140, 30, 191, 15, 5, 214, 140, 30, 220, 65, 15, - 5, 214, 140, 30, 219, 182, 15, 5, 214, 140, 30, 215, 119, 15, 5, 214, - 140, 30, 104, 96, 242, 110, 15, 5, 214, 140, 30, 214, 219, 15, 5, 214, - 140, 30, 214, 137, 15, 5, 214, 137, 15, 5, 214, 138, 30, 69, 15, 5, 214, - 126, 15, 5, 214, 127, 30, 61, 15, 5, 214, 127, 30, 233, 223, 15, 5, 214, - 127, 30, 233, 202, 15, 5, 214, 127, 30, 217, 73, 15, 5, 214, 122, 15, 5, - 214, 125, 15, 5, 214, 123, 15, 5, 214, 119, 15, 5, 214, 108, 15, 5, 214, - 109, 30, 234, 213, 15, 5, 214, 107, 15, 5, 210, 116, 15, 5, 210, 117, - 216, 240, 15, 5, 210, 117, 92, 30, 233, 202, 15, 5, 210, 113, 15, 5, 210, - 106, 15, 5, 210, 93, 15, 5, 210, 44, 15, 5, 210, 45, 115, 210, 44, 15, 5, - 210, 43, 15, 5, 210, 41, 15, 5, 210, 42, 235, 9, 216, 240, 15, 5, 210, - 36, 15, 5, 210, 28, 15, 5, 210, 13, 15, 5, 210, 11, 15, 5, 210, 12, 30, - 61, 15, 5, 210, 10, 15, 5, 210, 9, 15, 132, 5, 113, 253, 239, 15, 132, 5, - 134, 253, 239, 15, 132, 5, 244, 19, 253, 239, 15, 132, 5, 244, 89, 253, - 239, 15, 132, 5, 219, 127, 253, 239, 15, 132, 5, 220, 124, 253, 239, 15, - 132, 5, 245, 201, 253, 239, 15, 132, 5, 228, 205, 253, 239, 15, 132, 5, - 134, 247, 195, 15, 132, 5, 244, 19, 247, 195, 15, 132, 5, 244, 89, 247, - 195, 15, 132, 5, 219, 127, 247, 195, 15, 132, 5, 220, 124, 247, 195, 15, - 132, 5, 245, 201, 247, 195, 15, 132, 5, 228, 205, 247, 195, 15, 132, 5, - 244, 19, 69, 15, 132, 5, 244, 89, 69, 15, 132, 5, 219, 127, 69, 15, 132, - 5, 220, 124, 69, 15, 132, 5, 245, 201, 69, 15, 132, 5, 228, 205, 69, 15, - 132, 5, 123, 243, 45, 15, 132, 5, 113, 243, 45, 15, 132, 5, 134, 243, 45, - 15, 132, 5, 244, 19, 243, 45, 15, 132, 5, 244, 89, 243, 45, 15, 132, 5, - 219, 127, 243, 45, 15, 132, 5, 220, 124, 243, 45, 15, 132, 5, 245, 201, - 243, 45, 15, 132, 5, 228, 205, 243, 45, 15, 132, 5, 123, 243, 42, 15, - 132, 5, 113, 243, 42, 15, 132, 5, 134, 243, 42, 15, 132, 5, 244, 19, 243, - 42, 15, 132, 5, 244, 89, 243, 42, 15, 132, 5, 113, 220, 80, 15, 132, 5, - 134, 220, 80, 15, 132, 5, 134, 220, 81, 214, 12, 17, 15, 132, 5, 244, 19, - 220, 80, 15, 132, 5, 244, 89, 220, 80, 15, 132, 5, 219, 127, 220, 80, 15, - 132, 5, 220, 124, 220, 80, 15, 132, 5, 245, 201, 220, 80, 15, 132, 5, - 228, 205, 220, 80, 15, 132, 5, 123, 220, 75, 15, 132, 5, 113, 220, 75, - 15, 132, 5, 134, 220, 75, 15, 132, 5, 134, 220, 76, 214, 12, 17, 15, 132, - 5, 244, 19, 220, 75, 15, 132, 5, 244, 89, 220, 75, 15, 132, 5, 220, 81, - 30, 243, 126, 96, 247, 195, 15, 132, 5, 220, 81, 30, 243, 126, 96, 230, - 193, 15, 132, 5, 123, 251, 103, 15, 132, 5, 113, 251, 103, 15, 132, 5, - 134, 251, 103, 15, 132, 5, 134, 251, 104, 214, 12, 17, 15, 132, 5, 244, - 19, 251, 103, 15, 132, 5, 244, 89, 251, 103, 15, 132, 5, 134, 214, 12, - 244, 28, 245, 82, 15, 132, 5, 134, 214, 12, 244, 28, 245, 79, 15, 132, 5, - 244, 19, 214, 12, 244, 28, 232, 223, 15, 132, 5, 244, 19, 214, 12, 244, - 28, 232, 221, 15, 132, 5, 244, 19, 214, 12, 244, 28, 232, 224, 61, 15, - 132, 5, 244, 19, 214, 12, 244, 28, 232, 224, 253, 166, 15, 132, 5, 219, - 127, 214, 12, 244, 28, 253, 236, 15, 132, 5, 220, 124, 214, 12, 244, 28, - 236, 15, 15, 132, 5, 220, 124, 214, 12, 244, 28, 236, 17, 61, 15, 132, 5, - 220, 124, 214, 12, 244, 28, 236, 17, 253, 166, 15, 132, 5, 245, 201, 214, - 12, 244, 28, 214, 121, 15, 132, 5, 245, 201, 214, 12, 244, 28, 214, 120, - 15, 132, 5, 228, 205, 214, 12, 244, 28, 236, 31, 15, 132, 5, 228, 205, - 214, 12, 244, 28, 236, 30, 15, 132, 5, 228, 205, 214, 12, 244, 28, 236, - 29, 15, 132, 5, 228, 205, 214, 12, 244, 28, 236, 32, 61, 15, 132, 5, 113, - 253, 240, 216, 240, 15, 132, 5, 134, 253, 240, 216, 240, 15, 132, 5, 244, - 19, 253, 240, 216, 240, 15, 132, 5, 244, 89, 253, 240, 216, 240, 15, 132, - 5, 219, 127, 253, 240, 216, 240, 15, 132, 5, 123, 252, 158, 15, 132, 5, - 113, 252, 158, 15, 132, 5, 134, 252, 158, 15, 132, 5, 244, 19, 252, 158, - 15, 132, 5, 244, 19, 252, 159, 214, 12, 17, 15, 132, 5, 244, 89, 252, - 158, 15, 132, 5, 244, 89, 252, 159, 214, 12, 17, 15, 132, 5, 228, 215, - 15, 132, 5, 228, 216, 15, 132, 5, 123, 245, 78, 15, 132, 5, 113, 245, 78, - 15, 132, 5, 123, 216, 170, 247, 195, 15, 132, 5, 113, 216, 168, 247, 195, - 15, 132, 5, 244, 89, 219, 116, 247, 195, 15, 132, 5, 123, 216, 170, 214, - 12, 244, 28, 61, 15, 132, 5, 113, 216, 168, 214, 12, 244, 28, 61, 15, - 132, 5, 123, 245, 197, 253, 239, 15, 132, 5, 123, 224, 25, 253, 239, 15, - 132, 5, 55, 253, 227, 123, 219, 117, 15, 132, 5, 55, 253, 227, 123, 224, - 24, 15, 224, 144, 5, 55, 253, 227, 211, 209, 247, 180, 15, 224, 144, 5, - 67, 249, 234, 15, 224, 144, 5, 248, 7, 249, 234, 15, 224, 144, 5, 248, 7, - 215, 222, 12, 13, 255, 164, 12, 13, 255, 163, 12, 13, 255, 162, 12, 13, - 255, 161, 12, 13, 255, 160, 12, 13, 255, 159, 12, 13, 255, 158, 12, 13, - 255, 157, 12, 13, 255, 156, 12, 13, 255, 155, 12, 13, 255, 154, 12, 13, - 255, 153, 12, 13, 255, 152, 12, 13, 255, 151, 12, 13, 255, 150, 12, 13, - 255, 149, 12, 13, 255, 148, 12, 13, 255, 147, 12, 13, 255, 146, 12, 13, - 255, 145, 12, 13, 255, 144, 12, 13, 255, 143, 12, 13, 255, 142, 12, 13, - 255, 141, 12, 13, 255, 140, 12, 13, 255, 139, 12, 13, 255, 138, 12, 13, - 255, 137, 12, 13, 255, 136, 12, 13, 255, 135, 12, 13, 255, 134, 12, 13, - 255, 133, 12, 13, 255, 132, 12, 13, 255, 131, 12, 13, 255, 130, 12, 13, - 255, 129, 12, 13, 255, 128, 12, 13, 255, 127, 12, 13, 255, 126, 12, 13, - 255, 125, 12, 13, 255, 124, 12, 13, 255, 123, 12, 13, 255, 122, 12, 13, - 255, 121, 12, 13, 255, 120, 12, 13, 255, 119, 12, 13, 255, 118, 12, 13, - 255, 117, 12, 13, 255, 116, 12, 13, 255, 115, 12, 13, 255, 114, 12, 13, - 255, 113, 12, 13, 255, 112, 12, 13, 255, 111, 12, 13, 255, 110, 12, 13, - 255, 109, 12, 13, 255, 108, 12, 13, 255, 107, 12, 13, 255, 106, 12, 13, - 255, 105, 12, 13, 255, 104, 12, 13, 255, 103, 12, 13, 255, 102, 12, 13, - 255, 101, 12, 13, 255, 100, 12, 13, 255, 99, 12, 13, 255, 98, 12, 13, - 255, 97, 12, 13, 255, 96, 12, 13, 255, 95, 12, 13, 255, 94, 12, 13, 255, - 93, 12, 13, 255, 92, 12, 13, 255, 91, 12, 13, 255, 90, 12, 13, 255, 89, - 12, 13, 255, 88, 12, 13, 255, 87, 12, 13, 255, 86, 12, 13, 255, 85, 12, - 13, 253, 164, 12, 13, 253, 162, 12, 13, 253, 160, 12, 13, 253, 158, 12, - 13, 253, 156, 12, 13, 253, 155, 12, 13, 253, 153, 12, 13, 253, 151, 12, - 13, 253, 149, 12, 13, 253, 147, 12, 13, 251, 70, 12, 13, 251, 69, 12, 13, - 251, 68, 12, 13, 251, 67, 12, 13, 251, 66, 12, 13, 251, 65, 12, 13, 251, - 64, 12, 13, 251, 63, 12, 13, 251, 62, 12, 13, 251, 61, 12, 13, 251, 60, - 12, 13, 251, 59, 12, 13, 251, 58, 12, 13, 251, 57, 12, 13, 251, 56, 12, - 13, 251, 55, 12, 13, 251, 54, 12, 13, 251, 53, 12, 13, 251, 52, 12, 13, - 251, 51, 12, 13, 251, 50, 12, 13, 251, 49, 12, 13, 251, 48, 12, 13, 251, - 47, 12, 13, 251, 46, 12, 13, 251, 45, 12, 13, 251, 44, 12, 13, 251, 43, - 12, 13, 249, 67, 12, 13, 249, 66, 12, 13, 249, 65, 12, 13, 249, 64, 12, - 13, 249, 63, 12, 13, 249, 62, 12, 13, 249, 61, 12, 13, 249, 60, 12, 13, - 249, 59, 12, 13, 249, 58, 12, 13, 249, 57, 12, 13, 249, 56, 12, 13, 249, - 55, 12, 13, 249, 54, 12, 13, 249, 53, 12, 13, 249, 52, 12, 13, 249, 51, - 12, 13, 249, 50, 12, 13, 249, 49, 12, 13, 249, 48, 12, 13, 249, 47, 12, - 13, 249, 46, 12, 13, 249, 45, 12, 13, 249, 44, 12, 13, 249, 43, 12, 13, - 249, 42, 12, 13, 249, 41, 12, 13, 249, 40, 12, 13, 249, 39, 12, 13, 249, - 38, 12, 13, 249, 37, 12, 13, 249, 36, 12, 13, 249, 35, 12, 13, 249, 34, - 12, 13, 249, 33, 12, 13, 249, 32, 12, 13, 249, 31, 12, 13, 249, 30, 12, - 13, 249, 29, 12, 13, 249, 28, 12, 13, 249, 27, 12, 13, 249, 26, 12, 13, - 249, 25, 12, 13, 249, 24, 12, 13, 249, 23, 12, 13, 249, 22, 12, 13, 249, - 21, 12, 13, 249, 20, 12, 13, 249, 19, 12, 13, 249, 18, 12, 13, 249, 17, - 12, 13, 249, 16, 12, 13, 249, 15, 12, 13, 249, 14, 12, 13, 249, 13, 12, - 13, 249, 12, 12, 13, 249, 11, 12, 13, 249, 10, 12, 13, 249, 9, 12, 13, - 249, 8, 12, 13, 249, 7, 12, 13, 249, 6, 12, 13, 249, 5, 12, 13, 249, 4, - 12, 13, 249, 3, 12, 13, 249, 2, 12, 13, 249, 1, 12, 13, 249, 0, 12, 13, - 248, 255, 12, 13, 248, 254, 12, 13, 248, 253, 12, 13, 248, 252, 12, 13, - 248, 251, 12, 13, 248, 250, 12, 13, 248, 249, 12, 13, 248, 248, 12, 13, - 248, 247, 12, 13, 248, 246, 12, 13, 248, 245, 12, 13, 248, 244, 12, 13, - 248, 243, 12, 13, 248, 242, 12, 13, 248, 241, 12, 13, 248, 240, 12, 13, - 248, 239, 12, 13, 248, 238, 12, 13, 248, 237, 12, 13, 248, 236, 12, 13, - 248, 235, 12, 13, 248, 234, 12, 13, 248, 233, 12, 13, 248, 232, 12, 13, - 246, 31, 12, 13, 246, 30, 12, 13, 246, 29, 12, 13, 246, 28, 12, 13, 246, - 27, 12, 13, 246, 26, 12, 13, 246, 25, 12, 13, 246, 24, 12, 13, 246, 23, - 12, 13, 246, 22, 12, 13, 246, 21, 12, 13, 246, 20, 12, 13, 246, 19, 12, - 13, 246, 18, 12, 13, 246, 17, 12, 13, 246, 16, 12, 13, 246, 15, 12, 13, - 246, 14, 12, 13, 246, 13, 12, 13, 246, 12, 12, 13, 246, 11, 12, 13, 246, - 10, 12, 13, 246, 9, 12, 13, 246, 8, 12, 13, 246, 7, 12, 13, 246, 6, 12, - 13, 246, 5, 12, 13, 246, 4, 12, 13, 246, 3, 12, 13, 246, 2, 12, 13, 246, - 1, 12, 13, 246, 0, 12, 13, 245, 255, 12, 13, 245, 254, 12, 13, 245, 253, - 12, 13, 245, 252, 12, 13, 245, 251, 12, 13, 245, 250, 12, 13, 245, 249, - 12, 13, 245, 248, 12, 13, 245, 247, 12, 13, 245, 246, 12, 13, 245, 245, - 12, 13, 245, 244, 12, 13, 245, 13, 12, 13, 245, 12, 12, 13, 245, 11, 12, - 13, 245, 10, 12, 13, 245, 9, 12, 13, 245, 8, 12, 13, 245, 7, 12, 13, 245, - 6, 12, 13, 245, 5, 12, 13, 245, 4, 12, 13, 245, 3, 12, 13, 245, 2, 12, - 13, 245, 1, 12, 13, 245, 0, 12, 13, 244, 255, 12, 13, 244, 254, 12, 13, - 244, 253, 12, 13, 244, 252, 12, 13, 244, 251, 12, 13, 244, 250, 12, 13, - 244, 249, 12, 13, 244, 248, 12, 13, 244, 247, 12, 13, 244, 246, 12, 13, - 244, 245, 12, 13, 244, 244, 12, 13, 244, 243, 12, 13, 244, 242, 12, 13, - 244, 241, 12, 13, 244, 240, 12, 13, 244, 239, 12, 13, 244, 238, 12, 13, - 244, 237, 12, 13, 244, 236, 12, 13, 244, 235, 12, 13, 244, 234, 12, 13, - 244, 233, 12, 13, 244, 232, 12, 13, 244, 231, 12, 13, 244, 230, 12, 13, - 244, 229, 12, 13, 244, 228, 12, 13, 244, 227, 12, 13, 244, 226, 12, 13, - 244, 225, 12, 13, 244, 224, 12, 13, 244, 223, 12, 13, 244, 222, 12, 13, - 244, 221, 12, 13, 244, 220, 12, 13, 244, 219, 12, 13, 244, 218, 12, 13, - 244, 217, 12, 13, 244, 216, 12, 13, 244, 215, 12, 13, 244, 214, 12, 13, - 244, 213, 12, 13, 244, 212, 12, 13, 244, 211, 12, 13, 244, 210, 12, 13, - 244, 209, 12, 13, 244, 208, 12, 13, 244, 207, 12, 13, 244, 206, 12, 13, - 244, 205, 12, 13, 243, 208, 12, 13, 243, 207, 12, 13, 243, 206, 12, 13, - 243, 205, 12, 13, 243, 204, 12, 13, 243, 203, 12, 13, 243, 202, 12, 13, - 243, 201, 12, 13, 243, 200, 12, 13, 243, 199, 12, 13, 243, 198, 12, 13, - 243, 197, 12, 13, 243, 196, 12, 13, 243, 195, 12, 13, 243, 194, 12, 13, - 243, 193, 12, 13, 243, 192, 12, 13, 243, 191, 12, 13, 243, 190, 12, 13, - 243, 189, 12, 13, 243, 188, 12, 13, 243, 187, 12, 13, 243, 186, 12, 13, - 243, 185, 12, 13, 243, 184, 12, 13, 243, 183, 12, 13, 243, 182, 12, 13, - 243, 181, 12, 13, 243, 180, 12, 13, 243, 179, 12, 13, 243, 178, 12, 13, - 243, 177, 12, 13, 243, 176, 12, 13, 243, 175, 12, 13, 243, 174, 12, 13, - 243, 173, 12, 13, 243, 172, 12, 13, 243, 171, 12, 13, 243, 170, 12, 13, - 243, 169, 12, 13, 243, 168, 12, 13, 243, 167, 12, 13, 243, 166, 12, 13, - 243, 165, 12, 13, 243, 164, 12, 13, 243, 163, 12, 13, 243, 162, 12, 13, - 243, 161, 12, 13, 243, 160, 12, 13, 243, 159, 12, 13, 243, 158, 12, 13, - 243, 157, 12, 13, 243, 156, 12, 13, 243, 155, 12, 13, 243, 154, 12, 13, - 243, 153, 12, 13, 243, 152, 12, 13, 243, 151, 12, 13, 243, 150, 12, 13, - 243, 149, 12, 13, 243, 148, 12, 13, 243, 147, 12, 13, 243, 146, 12, 13, - 243, 145, 12, 13, 242, 65, 12, 13, 242, 64, 12, 13, 242, 63, 12, 13, 242, - 62, 12, 13, 242, 61, 12, 13, 242, 60, 12, 13, 242, 59, 12, 13, 242, 58, - 12, 13, 242, 57, 12, 13, 240, 145, 12, 13, 240, 144, 12, 13, 240, 143, - 12, 13, 240, 142, 12, 13, 240, 141, 12, 13, 240, 140, 12, 13, 240, 139, - 12, 13, 240, 138, 12, 13, 240, 137, 12, 13, 240, 136, 12, 13, 240, 135, - 12, 13, 240, 134, 12, 13, 240, 133, 12, 13, 240, 132, 12, 13, 240, 131, - 12, 13, 240, 130, 12, 13, 240, 129, 12, 13, 240, 128, 12, 13, 240, 127, - 12, 13, 235, 28, 12, 13, 235, 27, 12, 13, 235, 26, 12, 13, 235, 25, 12, - 13, 235, 24, 12, 13, 235, 23, 12, 13, 235, 22, 12, 13, 235, 21, 12, 13, - 233, 152, 12, 13, 233, 151, 12, 13, 233, 150, 12, 13, 233, 149, 12, 13, - 233, 148, 12, 13, 233, 147, 12, 13, 233, 146, 12, 13, 233, 145, 12, 13, - 233, 144, 12, 13, 233, 143, 12, 13, 232, 54, 12, 13, 232, 53, 12, 13, - 232, 52, 12, 13, 232, 51, 12, 13, 232, 50, 12, 13, 232, 49, 12, 13, 232, - 48, 12, 13, 232, 47, 12, 13, 232, 46, 12, 13, 232, 45, 12, 13, 232, 44, - 12, 13, 232, 43, 12, 13, 232, 42, 12, 13, 232, 41, 12, 13, 232, 40, 12, - 13, 232, 39, 12, 13, 232, 38, 12, 13, 232, 37, 12, 13, 232, 36, 12, 13, - 232, 35, 12, 13, 232, 34, 12, 13, 232, 33, 12, 13, 232, 32, 12, 13, 232, - 31, 12, 13, 232, 30, 12, 13, 232, 29, 12, 13, 232, 28, 12, 13, 232, 27, - 12, 13, 232, 26, 12, 13, 232, 25, 12, 13, 232, 24, 12, 13, 232, 23, 12, - 13, 232, 22, 12, 13, 232, 21, 12, 13, 232, 20, 12, 13, 232, 19, 12, 13, - 232, 18, 12, 13, 232, 17, 12, 13, 232, 16, 12, 13, 232, 15, 12, 13, 232, - 14, 12, 13, 232, 13, 12, 13, 232, 12, 12, 13, 232, 11, 12, 13, 232, 10, - 12, 13, 232, 9, 12, 13, 232, 8, 12, 13, 232, 7, 12, 13, 232, 6, 12, 13, - 232, 5, 12, 13, 232, 4, 12, 13, 232, 3, 12, 13, 232, 2, 12, 13, 232, 1, - 12, 13, 232, 0, 12, 13, 231, 255, 12, 13, 231, 254, 12, 13, 231, 253, 12, - 13, 231, 252, 12, 13, 231, 251, 12, 13, 231, 250, 12, 13, 231, 249, 12, - 13, 231, 248, 12, 13, 231, 247, 12, 13, 231, 246, 12, 13, 231, 245, 12, - 13, 230, 27, 12, 13, 230, 26, 12, 13, 230, 25, 12, 13, 230, 24, 12, 13, - 230, 23, 12, 13, 230, 22, 12, 13, 230, 21, 12, 13, 230, 20, 12, 13, 230, - 19, 12, 13, 230, 18, 12, 13, 230, 17, 12, 13, 230, 16, 12, 13, 230, 15, - 12, 13, 230, 14, 12, 13, 230, 13, 12, 13, 230, 12, 12, 13, 230, 11, 12, - 13, 230, 10, 12, 13, 230, 9, 12, 13, 230, 8, 12, 13, 230, 7, 12, 13, 230, - 6, 12, 13, 230, 5, 12, 13, 230, 4, 12, 13, 230, 3, 12, 13, 230, 2, 12, - 13, 230, 1, 12, 13, 230, 0, 12, 13, 229, 255, 12, 13, 229, 254, 12, 13, - 229, 253, 12, 13, 229, 252, 12, 13, 229, 251, 12, 13, 229, 250, 12, 13, - 229, 249, 12, 13, 229, 248, 12, 13, 229, 247, 12, 13, 229, 246, 12, 13, - 229, 245, 12, 13, 229, 244, 12, 13, 229, 243, 12, 13, 229, 242, 12, 13, - 229, 241, 12, 13, 229, 240, 12, 13, 229, 239, 12, 13, 229, 238, 12, 13, - 229, 237, 12, 13, 229, 236, 12, 13, 229, 235, 12, 13, 228, 139, 12, 13, - 228, 138, 12, 13, 228, 137, 12, 13, 228, 136, 12, 13, 228, 135, 12, 13, - 228, 134, 12, 13, 228, 133, 12, 13, 228, 132, 12, 13, 228, 131, 12, 13, - 228, 130, 12, 13, 228, 129, 12, 13, 228, 128, 12, 13, 228, 127, 12, 13, - 228, 126, 12, 13, 228, 125, 12, 13, 228, 124, 12, 13, 228, 123, 12, 13, - 228, 122, 12, 13, 228, 121, 12, 13, 228, 120, 12, 13, 228, 119, 12, 13, - 228, 118, 12, 13, 227, 241, 12, 13, 227, 240, 12, 13, 227, 239, 12, 13, - 227, 238, 12, 13, 227, 237, 12, 13, 227, 236, 12, 13, 227, 235, 12, 13, - 227, 234, 12, 13, 227, 233, 12, 13, 227, 232, 12, 13, 227, 231, 12, 13, - 227, 230, 12, 13, 227, 229, 12, 13, 227, 228, 12, 13, 227, 227, 12, 13, - 227, 226, 12, 13, 227, 225, 12, 13, 227, 224, 12, 13, 227, 223, 12, 13, - 227, 222, 12, 13, 227, 221, 12, 13, 227, 220, 12, 13, 227, 219, 12, 13, - 227, 218, 12, 13, 227, 217, 12, 13, 227, 216, 12, 13, 227, 80, 12, 13, - 227, 79, 12, 13, 227, 78, 12, 13, 227, 77, 12, 13, 227, 76, 12, 13, 227, - 75, 12, 13, 227, 74, 12, 13, 227, 73, 12, 13, 227, 72, 12, 13, 227, 71, - 12, 13, 227, 70, 12, 13, 227, 69, 12, 13, 227, 68, 12, 13, 227, 67, 12, - 13, 227, 66, 12, 13, 227, 65, 12, 13, 227, 64, 12, 13, 227, 63, 12, 13, - 227, 62, 12, 13, 227, 61, 12, 13, 227, 60, 12, 13, 227, 59, 12, 13, 227, - 58, 12, 13, 227, 57, 12, 13, 227, 56, 12, 13, 227, 55, 12, 13, 227, 54, - 12, 13, 227, 53, 12, 13, 227, 52, 12, 13, 227, 51, 12, 13, 227, 50, 12, - 13, 227, 49, 12, 13, 227, 48, 12, 13, 227, 47, 12, 13, 227, 46, 12, 13, - 227, 45, 12, 13, 227, 44, 12, 13, 227, 43, 12, 13, 227, 42, 12, 13, 227, - 41, 12, 13, 227, 40, 12, 13, 227, 39, 12, 13, 227, 38, 12, 13, 227, 37, - 12, 13, 227, 36, 12, 13, 227, 35, 12, 13, 227, 34, 12, 13, 227, 33, 12, - 13, 227, 32, 12, 13, 227, 31, 12, 13, 227, 30, 12, 13, 227, 29, 12, 13, - 227, 28, 12, 13, 227, 27, 12, 13, 227, 26, 12, 13, 227, 25, 12, 13, 227, - 24, 12, 13, 227, 23, 12, 13, 227, 22, 12, 13, 227, 21, 12, 13, 227, 20, - 12, 13, 227, 19, 12, 13, 227, 18, 12, 13, 227, 17, 12, 13, 227, 16, 12, - 13, 227, 15, 12, 13, 227, 14, 12, 13, 227, 13, 12, 13, 227, 12, 12, 13, - 227, 11, 12, 13, 227, 10, 12, 13, 227, 9, 12, 13, 227, 8, 12, 13, 227, 7, - 12, 13, 227, 6, 12, 13, 226, 108, 12, 13, 226, 107, 12, 13, 226, 106, 12, - 13, 226, 105, 12, 13, 226, 104, 12, 13, 226, 103, 12, 13, 226, 102, 12, - 13, 226, 101, 12, 13, 226, 100, 12, 13, 226, 99, 12, 13, 226, 98, 12, 13, - 226, 97, 12, 13, 226, 96, 12, 13, 224, 98, 12, 13, 224, 97, 12, 13, 224, - 96, 12, 13, 224, 95, 12, 13, 224, 94, 12, 13, 224, 93, 12, 13, 224, 92, - 12, 13, 223, 225, 12, 13, 223, 224, 12, 13, 223, 223, 12, 13, 223, 222, - 12, 13, 223, 221, 12, 13, 223, 220, 12, 13, 223, 219, 12, 13, 223, 218, - 12, 13, 223, 217, 12, 13, 223, 216, 12, 13, 223, 215, 12, 13, 223, 214, - 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211, 12, 13, 223, 210, - 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207, 12, 13, 223, 206, - 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203, 12, 13, 223, 202, - 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199, 12, 13, 223, 198, - 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195, 12, 13, 223, 194, - 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 222, 90, 12, 13, 222, 89, 12, - 13, 222, 88, 12, 13, 222, 87, 12, 13, 222, 86, 12, 13, 222, 85, 12, 13, - 222, 84, 12, 13, 222, 83, 12, 13, 222, 82, 12, 13, 222, 81, 12, 13, 222, - 80, 12, 13, 222, 79, 12, 13, 222, 78, 12, 13, 222, 77, 12, 13, 222, 76, - 12, 13, 222, 75, 12, 13, 222, 74, 12, 13, 222, 73, 12, 13, 222, 72, 12, - 13, 222, 71, 12, 13, 222, 70, 12, 13, 222, 69, 12, 13, 222, 68, 12, 13, - 222, 67, 12, 13, 222, 66, 12, 13, 222, 65, 12, 13, 222, 64, 12, 13, 222, - 63, 12, 13, 222, 62, 12, 13, 222, 61, 12, 13, 222, 60, 12, 13, 222, 59, - 12, 13, 222, 58, 12, 13, 222, 57, 12, 13, 222, 56, 12, 13, 222, 55, 12, - 13, 222, 54, 12, 13, 222, 53, 12, 13, 222, 52, 12, 13, 222, 51, 12, 13, - 222, 50, 12, 13, 222, 49, 12, 13, 222, 48, 12, 13, 222, 47, 12, 13, 222, - 46, 12, 13, 222, 45, 12, 13, 222, 44, 12, 13, 222, 43, 12, 13, 222, 42, - 12, 13, 222, 41, 12, 13, 222, 40, 12, 13, 222, 39, 12, 13, 222, 38, 12, - 13, 222, 37, 12, 13, 217, 151, 12, 13, 217, 150, 12, 13, 217, 149, 12, - 13, 217, 148, 12, 13, 217, 147, 12, 13, 217, 146, 12, 13, 217, 145, 12, - 13, 217, 144, 12, 13, 217, 143, 12, 13, 217, 142, 12, 13, 217, 141, 12, - 13, 217, 140, 12, 13, 217, 139, 12, 13, 217, 138, 12, 13, 217, 137, 12, - 13, 217, 136, 12, 13, 217, 135, 12, 13, 217, 134, 12, 13, 217, 133, 12, - 13, 217, 132, 12, 13, 217, 131, 12, 13, 217, 130, 12, 13, 217, 129, 12, - 13, 217, 128, 12, 13, 217, 127, 12, 13, 217, 126, 12, 13, 217, 125, 12, - 13, 217, 124, 12, 13, 217, 123, 12, 13, 217, 122, 12, 13, 217, 121, 12, - 13, 217, 120, 12, 13, 217, 119, 12, 13, 217, 118, 12, 13, 217, 117, 12, - 13, 217, 116, 12, 13, 217, 115, 12, 13, 217, 114, 12, 13, 217, 113, 12, - 13, 217, 112, 12, 13, 217, 111, 12, 13, 217, 110, 12, 13, 217, 109, 12, - 13, 217, 108, 12, 13, 215, 22, 12, 13, 215, 21, 12, 13, 215, 20, 12, 13, - 215, 19, 12, 13, 215, 18, 12, 13, 215, 17, 12, 13, 215, 16, 12, 13, 215, - 15, 12, 13, 215, 14, 12, 13, 215, 13, 12, 13, 215, 12, 12, 13, 215, 11, - 12, 13, 215, 10, 12, 13, 215, 9, 12, 13, 215, 8, 12, 13, 215, 7, 12, 13, - 215, 6, 12, 13, 215, 5, 12, 13, 215, 4, 12, 13, 215, 3, 12, 13, 215, 2, - 12, 13, 215, 1, 12, 13, 215, 0, 12, 13, 214, 255, 12, 13, 214, 254, 12, - 13, 214, 253, 12, 13, 214, 252, 12, 13, 214, 251, 12, 13, 214, 250, 12, - 13, 214, 249, 12, 13, 214, 248, 12, 13, 214, 247, 12, 13, 214, 246, 12, - 13, 214, 245, 12, 13, 214, 244, 12, 13, 214, 243, 12, 13, 214, 242, 12, - 13, 214, 241, 12, 13, 214, 240, 12, 13, 214, 239, 12, 13, 214, 238, 12, - 13, 214, 237, 12, 13, 214, 236, 12, 13, 214, 235, 12, 13, 214, 234, 12, - 13, 214, 233, 12, 13, 214, 232, 12, 13, 214, 104, 12, 13, 214, 103, 12, - 13, 214, 102, 12, 13, 214, 101, 12, 13, 214, 100, 12, 13, 214, 99, 12, - 13, 214, 98, 12, 13, 214, 97, 12, 13, 214, 96, 12, 13, 214, 95, 12, 13, - 214, 94, 12, 13, 214, 93, 12, 13, 214, 92, 12, 13, 214, 91, 12, 13, 214, - 90, 12, 13, 214, 89, 12, 13, 214, 88, 12, 13, 214, 87, 12, 13, 214, 86, - 12, 13, 214, 85, 12, 13, 214, 84, 12, 13, 214, 83, 12, 13, 214, 82, 12, - 13, 214, 81, 12, 13, 214, 80, 12, 13, 214, 79, 12, 13, 214, 78, 12, 13, - 214, 77, 12, 13, 214, 76, 12, 13, 214, 75, 12, 13, 214, 74, 12, 13, 214, - 73, 12, 13, 214, 72, 12, 13, 214, 71, 12, 13, 214, 70, 12, 13, 214, 69, - 12, 13, 214, 68, 12, 13, 214, 67, 12, 13, 214, 66, 12, 13, 214, 65, 12, - 13, 214, 64, 12, 13, 214, 63, 12, 13, 214, 62, 12, 13, 214, 61, 12, 13, - 214, 60, 12, 13, 214, 59, 12, 13, 214, 58, 12, 13, 214, 57, 12, 13, 214, - 56, 12, 13, 214, 55, 12, 13, 214, 54, 12, 13, 214, 53, 12, 13, 214, 52, - 12, 13, 214, 51, 12, 13, 214, 50, 12, 13, 214, 49, 12, 13, 214, 48, 12, - 13, 214, 47, 12, 13, 214, 46, 12, 13, 214, 45, 12, 13, 214, 44, 12, 13, - 214, 43, 12, 13, 214, 42, 12, 13, 214, 41, 12, 13, 214, 40, 12, 13, 214, - 39, 12, 13, 214, 38, 12, 13, 214, 37, 12, 13, 214, 36, 12, 13, 214, 35, - 12, 13, 214, 34, 12, 13, 214, 33, 12, 13, 214, 32, 12, 13, 214, 31, 12, - 13, 214, 30, 12, 13, 214, 29, 12, 13, 214, 28, 12, 13, 212, 97, 12, 13, - 212, 96, 12, 13, 212, 95, 12, 13, 212, 94, 12, 13, 212, 93, 12, 13, 212, - 92, 12, 13, 212, 91, 12, 13, 212, 90, 12, 13, 212, 89, 12, 13, 212, 88, - 12, 13, 212, 87, 12, 13, 212, 86, 12, 13, 212, 85, 12, 13, 212, 84, 12, - 13, 212, 83, 12, 13, 212, 82, 12, 13, 212, 81, 12, 13, 212, 80, 12, 13, - 212, 79, 12, 13, 212, 78, 12, 13, 212, 77, 12, 13, 212, 76, 12, 13, 212, - 75, 12, 13, 212, 74, 12, 13, 212, 73, 12, 13, 212, 72, 12, 13, 212, 71, - 12, 13, 212, 70, 12, 13, 212, 69, 12, 13, 212, 68, 12, 13, 212, 67, 12, - 13, 212, 66, 12, 13, 211, 177, 12, 13, 211, 176, 12, 13, 211, 175, 12, - 13, 211, 174, 12, 13, 211, 173, 12, 13, 211, 172, 12, 13, 211, 171, 12, - 13, 211, 170, 12, 13, 211, 169, 12, 13, 211, 168, 12, 13, 211, 167, 12, - 13, 211, 166, 12, 13, 211, 115, 12, 13, 211, 114, 12, 13, 211, 113, 12, - 13, 211, 112, 12, 13, 211, 111, 12, 13, 211, 110, 12, 13, 211, 109, 12, - 13, 211, 108, 12, 13, 211, 107, 12, 13, 210, 158, 12, 13, 210, 157, 12, - 13, 210, 156, 12, 13, 210, 155, 12, 13, 210, 154, 12, 13, 210, 153, 12, - 13, 210, 152, 12, 13, 210, 151, 12, 13, 210, 150, 12, 13, 210, 149, 12, - 13, 210, 148, 12, 13, 210, 147, 12, 13, 210, 146, 12, 13, 210, 145, 12, - 13, 210, 144, 12, 13, 210, 143, 12, 13, 210, 142, 12, 13, 210, 141, 12, - 13, 210, 140, 12, 13, 210, 139, 12, 13, 210, 138, 12, 13, 210, 137, 12, - 13, 210, 136, 12, 13, 210, 135, 12, 13, 210, 134, 12, 13, 210, 133, 12, - 13, 210, 132, 12, 13, 210, 131, 12, 13, 210, 130, 12, 13, 210, 129, 12, - 13, 210, 128, 12, 13, 210, 127, 12, 13, 210, 126, 12, 13, 210, 125, 12, - 13, 210, 124, 12, 13, 210, 123, 12, 13, 210, 122, 12, 13, 210, 121, 12, - 13, 210, 120, 12, 13, 210, 119, 12, 13, 210, 118, 12, 13, 255, 81, 12, - 13, 255, 80, 12, 13, 255, 79, 12, 13, 255, 78, 12, 13, 255, 77, 12, 13, - 255, 76, 12, 13, 255, 75, 12, 13, 255, 74, 12, 13, 255, 73, 12, 13, 255, - 72, 12, 13, 255, 71, 12, 13, 255, 70, 12, 13, 255, 69, 12, 13, 255, 68, - 12, 13, 255, 67, 12, 13, 255, 66, 12, 13, 255, 65, 12, 13, 255, 64, 12, - 13, 255, 63, 12, 13, 255, 62, 12, 13, 255, 61, 12, 13, 255, 60, 12, 13, - 255, 59, 12, 13, 255, 58, 12, 13, 255, 57, 12, 13, 255, 56, 12, 13, 255, - 55, 12, 13, 255, 54, 12, 13, 255, 53, 12, 13, 255, 52, 12, 13, 255, 51, - 12, 13, 255, 50, 12, 13, 255, 49, 12, 13, 255, 48, 20, 1, 167, 229, 17, - 231, 21, 20, 1, 167, 243, 77, 244, 44, 20, 1, 167, 224, 254, 231, 22, - 225, 60, 20, 1, 167, 224, 254, 231, 22, 225, 61, 20, 1, 167, 229, 231, - 231, 21, 20, 1, 167, 219, 223, 20, 1, 167, 216, 67, 231, 21, 20, 1, 167, - 227, 122, 231, 21, 20, 1, 167, 220, 21, 226, 94, 228, 174, 20, 1, 167, - 224, 254, 226, 94, 228, 175, 225, 60, 20, 1, 167, 224, 254, 226, 94, 228, - 175, 225, 61, 20, 1, 167, 231, 223, 20, 1, 167, 215, 120, 231, 224, 20, - 1, 167, 229, 76, 20, 1, 167, 231, 220, 20, 1, 167, 231, 181, 20, 1, 167, - 230, 53, 20, 1, 167, 220, 126, 20, 1, 167, 227, 246, 20, 1, 167, 234, - 155, 20, 1, 167, 228, 143, 20, 1, 167, 218, 5, 20, 1, 167, 229, 16, 20, - 1, 167, 233, 93, 20, 1, 167, 233, 18, 233, 195, 20, 1, 167, 227, 253, - 231, 29, 20, 1, 167, 231, 227, 20, 1, 167, 225, 250, 20, 1, 167, 242, - 238, 20, 1, 167, 226, 54, 20, 1, 167, 230, 156, 229, 50, 20, 1, 167, 227, - 103, 231, 32, 20, 1, 167, 104, 210, 188, 229, 225, 20, 1, 167, 242, 239, - 20, 1, 167, 227, 253, 227, 254, 20, 1, 167, 219, 130, 20, 1, 167, 231, - 14, 20, 1, 167, 231, 35, 20, 1, 167, 230, 135, 20, 1, 167, 234, 255, 20, - 1, 167, 226, 94, 233, 53, 20, 1, 167, 229, 154, 233, 53, 20, 1, 167, 225, - 161, 20, 1, 167, 231, 221, 20, 1, 167, 228, 212, 20, 1, 167, 224, 137, - 20, 1, 167, 215, 117, 20, 1, 167, 232, 99, 20, 1, 167, 219, 43, 20, 1, - 167, 216, 217, 20, 1, 167, 231, 218, 20, 1, 167, 234, 162, 20, 1, 167, - 229, 150, 20, 1, 167, 233, 207, 20, 1, 167, 230, 136, 20, 1, 167, 219, - 220, 20, 1, 167, 232, 144, 20, 1, 167, 244, 101, 20, 1, 167, 222, 201, - 20, 1, 167, 233, 247, 20, 1, 167, 219, 39, 20, 1, 167, 231, 178, 225, - 102, 20, 1, 167, 220, 14, 20, 1, 167, 227, 252, 20, 1, 167, 219, 255, - 228, 7, 210, 196, 20, 1, 167, 227, 142, 230, 153, 20, 1, 167, 226, 89, - 20, 1, 167, 228, 144, 20, 1, 167, 214, 170, 20, 1, 167, 229, 53, 20, 1, - 167, 231, 217, 20, 1, 167, 228, 186, 20, 1, 167, 231, 124, 20, 1, 167, - 227, 155, 20, 1, 167, 216, 221, 20, 1, 167, 219, 36, 20, 1, 167, 226, 90, - 20, 1, 167, 228, 11, 20, 1, 167, 231, 225, 20, 1, 167, 227, 152, 20, 1, - 167, 234, 222, 20, 1, 167, 228, 14, 20, 1, 167, 213, 250, 20, 1, 167, - 232, 103, 20, 1, 167, 229, 103, 20, 1, 167, 229, 201, 20, 1, 167, 231, - 123, 20, 1, 225, 141, 228, 9, 20, 1, 225, 141, 215, 120, 231, 222, 20, 1, - 225, 141, 219, 187, 20, 1, 225, 141, 220, 130, 215, 119, 20, 1, 225, 141, - 232, 146, 227, 249, 20, 1, 225, 141, 231, 130, 231, 226, 20, 1, 225, 141, - 234, 93, 20, 1, 225, 141, 211, 15, 20, 1, 225, 141, 231, 125, 20, 1, 225, - 141, 234, 243, 20, 1, 225, 141, 225, 211, 20, 1, 225, 141, 211, 89, 233, - 53, 20, 1, 225, 141, 233, 109, 228, 7, 227, 164, 20, 1, 225, 141, 227, - 247, 220, 40, 20, 1, 225, 141, 229, 121, 228, 189, 20, 1, 225, 141, 242, - 236, 20, 1, 225, 141, 225, 52, 20, 1, 225, 141, 215, 120, 228, 5, 20, 1, - 225, 141, 220, 45, 228, 184, 20, 1, 225, 141, 220, 41, 20, 1, 225, 141, - 231, 22, 216, 220, 20, 1, 225, 141, 231, 112, 231, 126, 20, 1, 225, 141, - 227, 153, 227, 249, 20, 1, 225, 141, 234, 151, 20, 1, 225, 141, 242, 237, - 20, 1, 225, 141, 234, 147, 20, 1, 225, 141, 233, 135, 20, 1, 225, 141, - 225, 253, 20, 1, 225, 141, 213, 182, 20, 1, 225, 141, 229, 18, 230, 51, - 20, 1, 225, 141, 229, 52, 231, 108, 20, 1, 225, 141, 211, 193, 20, 1, - 225, 141, 222, 13, 20, 1, 225, 141, 217, 98, 20, 1, 225, 141, 231, 34, - 20, 1, 225, 141, 229, 37, 20, 1, 225, 141, 229, 38, 233, 90, 20, 1, 225, - 141, 231, 24, 20, 1, 225, 141, 218, 53, 20, 1, 225, 141, 231, 116, 20, 1, - 225, 141, 230, 138, 20, 1, 225, 141, 227, 167, 20, 1, 225, 141, 224, 141, - 20, 1, 225, 141, 231, 33, 229, 54, 20, 1, 225, 141, 244, 134, 20, 1, 225, - 141, 231, 103, 20, 1, 225, 141, 244, 155, 20, 1, 225, 141, 234, 159, 20, - 1, 225, 141, 231, 244, 228, 178, 20, 1, 225, 141, 231, 244, 228, 154, 20, - 1, 225, 141, 233, 17, 20, 1, 225, 141, 229, 60, 20, 1, 225, 141, 228, 16, - 20, 1, 225, 141, 186, 20, 1, 225, 141, 234, 80, 20, 1, 225, 141, 229, 6, - 20, 1, 137, 229, 17, 231, 224, 20, 1, 137, 227, 121, 20, 1, 137, 210, - 196, 20, 1, 137, 212, 53, 20, 1, 137, 229, 53, 20, 1, 137, 229, 142, 20, - 1, 137, 229, 24, 20, 1, 137, 242, 246, 20, 1, 137, 231, 120, 20, 1, 137, - 243, 84, 20, 1, 137, 227, 144, 230, 175, 231, 36, 20, 1, 137, 227, 245, - 231, 111, 20, 1, 137, 231, 117, 20, 1, 137, 225, 58, 20, 1, 137, 229, - 127, 20, 1, 137, 231, 128, 251, 37, 20, 1, 137, 234, 149, 20, 1, 137, - 242, 247, 20, 1, 137, 234, 156, 20, 1, 137, 210, 213, 230, 81, 20, 1, - 137, 227, 115, 20, 1, 137, 231, 105, 20, 1, 137, 228, 15, 20, 1, 137, - 231, 111, 20, 1, 137, 211, 16, 20, 1, 137, 233, 255, 20, 1, 137, 235, 16, - 20, 1, 137, 220, 125, 20, 1, 137, 229, 136, 20, 1, 137, 217, 96, 20, 1, - 137, 228, 158, 20, 1, 137, 216, 67, 210, 198, 20, 1, 137, 218, 80, 20, 1, - 137, 229, 44, 227, 164, 20, 1, 137, 213, 181, 20, 1, 137, 229, 204, 20, - 1, 137, 231, 244, 234, 158, 20, 1, 137, 227, 254, 20, 1, 137, 229, 39, - 20, 1, 137, 233, 94, 20, 1, 137, 231, 113, 20, 1, 137, 231, 13, 20, 1, - 137, 227, 248, 20, 1, 137, 216, 216, 20, 1, 137, 229, 41, 20, 1, 137, - 243, 240, 20, 1, 137, 229, 141, 20, 1, 137, 228, 17, 20, 1, 137, 228, 13, - 20, 1, 137, 251, 115, 20, 1, 137, 213, 183, 20, 1, 137, 231, 118, 20, 1, - 137, 222, 142, 20, 1, 137, 228, 188, 20, 1, 137, 233, 108, 20, 1, 137, - 216, 65, 20, 1, 137, 227, 255, 229, 6, 20, 1, 137, 228, 180, 20, 1, 137, - 234, 162, 20, 1, 137, 229, 45, 20, 1, 137, 231, 217, 20, 1, 137, 231, - 106, 20, 1, 137, 232, 103, 20, 1, 137, 233, 195, 20, 1, 137, 228, 186, - 20, 1, 137, 229, 6, 20, 1, 137, 211, 184, 20, 1, 137, 229, 42, 20, 1, - 137, 228, 2, 20, 1, 137, 227, 250, 20, 1, 137, 233, 209, 228, 144, 20, 1, - 137, 228, 0, 20, 1, 137, 229, 149, 20, 1, 137, 231, 244, 228, 5, 20, 1, - 137, 211, 103, 20, 1, 137, 229, 148, 20, 1, 137, 219, 222, 20, 1, 137, - 220, 128, 20, 1, 137, 231, 114, 20, 1, 137, 231, 224, 20, 1, 137, 231, - 124, 20, 1, 137, 234, 150, 20, 1, 137, 231, 115, 20, 1, 137, 234, 154, - 20, 1, 137, 231, 128, 225, 106, 20, 1, 137, 210, 179, 20, 1, 137, 228, - 176, 20, 1, 137, 230, 225, 20, 1, 137, 230, 105, 20, 1, 137, 220, 17, 20, - 1, 137, 234, 172, 233, 76, 20, 1, 137, 234, 172, 244, 168, 20, 1, 137, - 229, 74, 20, 1, 137, 229, 201, 20, 1, 137, 232, 206, 20, 1, 137, 225, 68, - 20, 1, 137, 225, 202, 20, 1, 137, 216, 231, 20, 1, 107, 231, 104, 20, 1, - 107, 212, 51, 20, 1, 107, 228, 174, 20, 1, 107, 231, 21, 20, 1, 107, 228, - 172, 20, 1, 107, 232, 241, 20, 1, 107, 228, 177, 20, 1, 107, 228, 12, 20, - 1, 107, 229, 59, 20, 1, 107, 227, 164, 20, 1, 107, 211, 194, 20, 1, 107, - 229, 14, 20, 1, 107, 220, 63, 20, 1, 107, 229, 25, 20, 1, 107, 234, 157, - 20, 1, 107, 216, 218, 20, 1, 107, 220, 43, 20, 1, 107, 228, 185, 20, 1, - 107, 218, 53, 20, 1, 107, 234, 162, 20, 1, 107, 211, 91, 20, 1, 107, 233, - 210, 20, 1, 107, 221, 236, 20, 1, 107, 231, 26, 20, 1, 107, 229, 140, 20, - 1, 107, 231, 193, 20, 1, 107, 231, 32, 20, 1, 107, 220, 127, 20, 1, 107, - 211, 39, 20, 1, 107, 228, 179, 20, 1, 107, 234, 153, 231, 107, 20, 1, - 107, 229, 21, 20, 1, 107, 215, 119, 20, 1, 107, 242, 255, 20, 1, 107, - 229, 11, 20, 1, 107, 244, 135, 20, 1, 107, 229, 144, 20, 1, 107, 231, 5, - 20, 1, 107, 233, 11, 20, 1, 107, 229, 126, 20, 1, 107, 230, 152, 20, 1, - 107, 231, 9, 20, 1, 107, 224, 121, 20, 1, 107, 231, 7, 20, 1, 107, 231, - 23, 20, 1, 107, 232, 89, 20, 1, 107, 228, 4, 20, 1, 107, 231, 127, 20, 1, - 107, 233, 186, 20, 1, 107, 227, 155, 20, 1, 107, 216, 221, 20, 1, 107, - 219, 36, 20, 1, 107, 210, 179, 20, 1, 107, 234, 154, 20, 1, 107, 223, - 173, 20, 1, 107, 217, 11, 20, 1, 107, 229, 22, 20, 1, 107, 231, 28, 20, - 1, 107, 228, 3, 20, 1, 107, 234, 152, 20, 1, 107, 225, 62, 20, 1, 107, - 225, 155, 20, 1, 107, 227, 131, 20, 1, 107, 233, 17, 20, 1, 107, 229, 60, - 20, 1, 107, 231, 25, 20, 1, 107, 229, 34, 20, 1, 107, 210, 193, 20, 1, - 107, 226, 25, 20, 1, 107, 210, 192, 20, 1, 107, 229, 149, 20, 1, 107, - 227, 249, 20, 1, 107, 218, 82, 20, 1, 107, 233, 214, 20, 1, 107, 229, 49, - 20, 1, 107, 229, 19, 20, 1, 107, 215, 103, 20, 1, 107, 231, 36, 20, 1, - 107, 233, 204, 20, 1, 107, 228, 1, 20, 1, 107, 216, 219, 20, 1, 107, 231, - 219, 20, 1, 107, 229, 58, 20, 1, 107, 233, 10, 20, 1, 107, 229, 40, 20, - 1, 107, 228, 6, 20, 1, 107, 228, 158, 20, 1, 107, 242, 240, 20, 1, 107, - 233, 223, 20, 1, 107, 223, 87, 226, 213, 20, 1, 107, 217, 87, 20, 1, 107, - 216, 11, 20, 1, 107, 227, 152, 20, 1, 107, 222, 242, 20, 1, 107, 233, 55, - 20, 1, 107, 231, 84, 20, 1, 107, 194, 20, 1, 107, 218, 5, 20, 1, 107, - 230, 107, 20, 1, 107, 220, 29, 20, 1, 107, 220, 39, 20, 1, 107, 233, 161, - 20, 1, 107, 227, 242, 20, 1, 107, 219, 227, 20, 1, 107, 227, 251, 20, 1, - 107, 225, 214, 20, 1, 107, 228, 238, 20, 1, 107, 219, 254, 20, 1, 107, - 224, 136, 20, 1, 107, 230, 51, 20, 1, 107, 232, 125, 20, 1, 107, 223, 87, - 230, 101, 20, 1, 107, 216, 118, 20, 1, 107, 227, 243, 20, 1, 107, 231, - 128, 199, 20, 1, 107, 221, 234, 20, 1, 107, 244, 203, 20, 1, 82, 229, - 148, 20, 1, 82, 216, 17, 20, 1, 82, 231, 117, 20, 1, 82, 233, 94, 20, 1, - 82, 213, 128, 20, 1, 82, 232, 131, 20, 1, 82, 226, 93, 20, 1, 82, 219, - 47, 20, 1, 82, 223, 148, 20, 1, 82, 228, 8, 20, 1, 82, 229, 119, 20, 1, - 82, 224, 150, 20, 1, 82, 217, 63, 20, 1, 82, 229, 27, 20, 1, 82, 233, - 251, 20, 1, 82, 211, 187, 20, 1, 82, 221, 172, 20, 1, 82, 229, 50, 20, 1, - 82, 226, 90, 20, 1, 82, 216, 18, 20, 1, 82, 233, 208, 20, 1, 82, 232, - 145, 20, 1, 82, 228, 11, 20, 1, 82, 229, 3, 20, 1, 82, 231, 225, 20, 1, - 82, 229, 20, 20, 1, 82, 229, 2, 20, 1, 82, 228, 10, 20, 1, 82, 222, 240, - 20, 1, 82, 228, 176, 20, 1, 82, 225, 213, 20, 1, 82, 222, 33, 20, 1, 82, - 229, 35, 20, 1, 82, 231, 15, 20, 1, 82, 242, 234, 20, 1, 82, 229, 23, 20, - 1, 82, 228, 187, 20, 1, 82, 231, 177, 20, 1, 82, 232, 127, 20, 1, 82, - 229, 55, 20, 1, 82, 229, 132, 20, 1, 82, 217, 86, 227, 249, 20, 1, 82, - 220, 129, 20, 1, 82, 224, 146, 20, 1, 82, 229, 152, 219, 53, 20, 1, 82, - 229, 43, 227, 164, 20, 1, 82, 211, 4, 20, 1, 82, 242, 235, 20, 1, 82, - 215, 118, 20, 1, 82, 211, 19, 20, 1, 82, 225, 19, 20, 1, 82, 215, 108, - 20, 1, 82, 234, 160, 20, 1, 82, 218, 81, 20, 1, 82, 216, 220, 20, 1, 82, - 213, 184, 20, 1, 82, 212, 6, 20, 1, 82, 233, 138, 20, 1, 82, 224, 153, - 20, 1, 82, 217, 97, 20, 1, 82, 242, 254, 20, 1, 82, 229, 64, 20, 1, 82, - 220, 42, 20, 1, 82, 231, 10, 20, 1, 82, 231, 121, 20, 1, 82, 227, 119, - 20, 1, 82, 228, 141, 20, 1, 82, 243, 80, 20, 1, 82, 215, 109, 20, 1, 82, - 233, 217, 20, 1, 82, 211, 67, 20, 1, 82, 227, 153, 250, 24, 20, 1, 82, - 210, 250, 20, 1, 82, 231, 27, 20, 1, 82, 229, 137, 20, 1, 82, 225, 103, - 20, 1, 82, 210, 197, 20, 1, 82, 233, 12, 20, 1, 82, 243, 240, 20, 1, 82, - 243, 79, 20, 1, 82, 229, 13, 20, 1, 82, 234, 162, 20, 1, 82, 231, 228, - 20, 1, 82, 229, 26, 20, 1, 82, 242, 241, 20, 1, 82, 244, 204, 20, 1, 82, - 227, 244, 20, 1, 82, 225, 156, 20, 1, 82, 211, 17, 20, 1, 82, 229, 51, - 20, 1, 82, 227, 153, 252, 31, 20, 1, 82, 227, 99, 20, 1, 82, 224, 250, - 20, 1, 82, 230, 225, 20, 1, 82, 243, 238, 20, 1, 82, 229, 225, 20, 1, 82, - 230, 105, 20, 1, 82, 242, 240, 20, 1, 82, 243, 242, 74, 20, 1, 82, 230, - 52, 20, 1, 82, 224, 149, 20, 1, 82, 229, 15, 20, 1, 82, 233, 195, 20, 1, - 82, 225, 100, 20, 1, 82, 227, 252, 20, 1, 82, 211, 18, 20, 1, 82, 229, - 36, 20, 1, 82, 226, 94, 225, 190, 20, 1, 82, 243, 242, 251, 23, 20, 1, - 82, 244, 45, 20, 1, 82, 228, 181, 20, 1, 82, 61, 20, 1, 82, 216, 11, 20, - 1, 82, 78, 20, 1, 82, 74, 20, 1, 82, 233, 92, 20, 1, 82, 226, 94, 225, - 26, 20, 1, 82, 217, 102, 20, 1, 82, 217, 52, 20, 1, 82, 229, 152, 230, - 39, 240, 241, 20, 1, 82, 220, 17, 20, 1, 82, 211, 14, 20, 1, 82, 228, - 252, 20, 1, 82, 210, 202, 20, 1, 82, 210, 227, 217, 241, 20, 1, 82, 210, - 227, 249, 155, 20, 1, 82, 210, 187, 20, 1, 82, 210, 195, 20, 1, 82, 234, - 148, 20, 1, 82, 225, 154, 20, 1, 82, 228, 182, 245, 110, 20, 1, 82, 224, - 147, 20, 1, 82, 211, 192, 20, 1, 82, 244, 155, 20, 1, 82, 213, 250, 20, - 1, 82, 232, 103, 20, 1, 82, 230, 235, 20, 1, 82, 223, 54, 20, 1, 82, 223, - 174, 20, 1, 82, 228, 251, 20, 1, 82, 229, 82, 20, 1, 82, 220, 9, 20, 1, - 82, 219, 254, 20, 1, 82, 243, 242, 223, 89, 20, 1, 82, 198, 20, 1, 82, - 225, 111, 20, 1, 82, 232, 125, 20, 1, 82, 234, 34, 20, 1, 82, 231, 63, - 20, 1, 82, 186, 20, 1, 82, 231, 174, 20, 1, 82, 216, 222, 20, 1, 82, 234, - 98, 20, 1, 82, 230, 155, 20, 1, 82, 216, 248, 20, 1, 82, 244, 177, 20, 1, - 82, 242, 230, 20, 1, 225, 140, 176, 20, 1, 225, 140, 69, 20, 1, 225, 140, - 233, 223, 20, 1, 225, 140, 245, 217, 20, 1, 225, 140, 223, 111, 20, 1, - 225, 140, 217, 87, 20, 1, 225, 140, 227, 152, 20, 1, 225, 140, 233, 141, - 20, 1, 225, 140, 222, 242, 20, 1, 225, 140, 223, 32, 20, 1, 225, 140, - 231, 84, 20, 1, 225, 140, 217, 102, 20, 1, 225, 140, 229, 151, 20, 1, - 225, 140, 228, 188, 20, 1, 225, 140, 194, 20, 1, 225, 140, 218, 5, 20, 1, - 225, 140, 220, 29, 20, 1, 225, 140, 219, 193, 20, 1, 225, 140, 220, 125, - 20, 1, 225, 140, 233, 161, 20, 1, 225, 140, 234, 162, 20, 1, 225, 140, - 227, 213, 20, 1, 225, 140, 227, 242, 20, 1, 225, 140, 228, 159, 20, 1, - 225, 140, 210, 226, 20, 1, 225, 140, 219, 227, 20, 1, 225, 140, 192, 20, - 1, 225, 140, 228, 14, 20, 1, 225, 140, 225, 154, 20, 1, 225, 140, 227, - 251, 20, 1, 225, 140, 211, 192, 20, 1, 225, 140, 225, 214, 20, 1, 225, - 140, 222, 142, 20, 1, 225, 140, 228, 238, 20, 1, 225, 140, 223, 54, 20, - 1, 225, 140, 234, 171, 20, 1, 225, 140, 229, 12, 20, 1, 225, 140, 229, - 61, 20, 1, 225, 140, 220, 9, 20, 1, 225, 140, 224, 150, 20, 1, 225, 140, - 244, 45, 20, 1, 225, 140, 212, 65, 20, 1, 225, 140, 232, 247, 20, 1, 225, - 140, 232, 125, 20, 1, 225, 140, 234, 34, 20, 1, 225, 140, 231, 119, 20, - 1, 225, 140, 223, 86, 20, 1, 225, 140, 186, 20, 1, 225, 140, 230, 166, - 20, 1, 225, 140, 231, 127, 20, 1, 225, 140, 216, 231, 20, 1, 225, 140, - 234, 1, 20, 1, 225, 140, 221, 253, 20, 1, 225, 140, 212, 115, 95, 1, 191, - 95, 1, 252, 199, 95, 1, 8, 191, 95, 1, 225, 45, 95, 1, 186, 95, 1, 230, - 238, 95, 1, 254, 31, 186, 95, 1, 244, 204, 95, 1, 214, 27, 95, 1, 213, - 177, 95, 1, 217, 106, 95, 1, 248, 229, 95, 1, 8, 215, 157, 95, 1, 8, 217, - 106, 95, 1, 215, 157, 95, 1, 248, 143, 95, 1, 198, 95, 1, 228, 242, 95, - 1, 8, 228, 115, 95, 1, 254, 31, 198, 95, 1, 228, 115, 95, 1, 228, 101, - 95, 1, 233, 141, 95, 1, 232, 66, 95, 1, 233, 4, 95, 1, 232, 249, 95, 1, - 216, 57, 95, 1, 247, 161, 95, 1, 216, 49, 95, 1, 247, 160, 95, 1, 176, - 95, 1, 243, 142, 95, 1, 8, 176, 95, 1, 224, 91, 95, 1, 224, 69, 95, 1, - 229, 82, 95, 1, 229, 33, 95, 1, 254, 31, 229, 82, 95, 1, 162, 95, 1, 211, - 165, 95, 1, 243, 0, 95, 1, 242, 233, 95, 1, 215, 166, 95, 1, 246, 34, 95, - 1, 227, 169, 95, 1, 227, 154, 95, 1, 215, 176, 95, 1, 246, 41, 95, 1, 8, - 215, 176, 95, 1, 8, 246, 41, 95, 1, 223, 109, 215, 176, 95, 1, 220, 104, - 95, 1, 218, 225, 95, 1, 210, 82, 95, 1, 210, 14, 95, 1, 215, 184, 95, 1, - 246, 46, 95, 1, 8, 215, 184, 95, 1, 206, 95, 1, 210, 116, 95, 1, 210, 15, - 95, 1, 209, 243, 95, 1, 209, 223, 95, 1, 254, 31, 209, 243, 95, 1, 209, - 215, 95, 1, 209, 222, 95, 1, 212, 65, 95, 1, 254, 218, 95, 1, 241, 196, - 95, 1, 229, 197, 95, 5, 253, 230, 95, 5, 223, 109, 213, 133, 95, 5, 223, - 109, 253, 230, 95, 25, 5, 61, 95, 25, 5, 255, 82, 95, 25, 5, 254, 214, - 95, 25, 5, 254, 131, 95, 25, 5, 254, 123, 95, 25, 5, 78, 95, 25, 5, 226, - 187, 95, 25, 5, 211, 227, 95, 25, 5, 212, 98, 95, 25, 5, 76, 95, 25, 5, - 245, 158, 95, 25, 5, 245, 146, 95, 25, 5, 226, 236, 95, 25, 5, 74, 95, - 25, 5, 240, 126, 95, 25, 5, 240, 125, 95, 25, 5, 240, 124, 95, 25, 5, - 235, 196, 95, 25, 5, 236, 67, 95, 25, 5, 236, 40, 95, 25, 5, 235, 162, - 95, 25, 5, 235, 238, 95, 25, 5, 69, 95, 25, 5, 214, 229, 95, 25, 5, 214, - 228, 95, 25, 5, 214, 227, 95, 25, 5, 214, 118, 95, 25, 5, 214, 211, 95, - 25, 5, 214, 178, 95, 25, 5, 211, 117, 95, 25, 5, 211, 8, 95, 25, 5, 254, - 252, 95, 25, 5, 254, 248, 95, 25, 5, 245, 94, 95, 25, 5, 222, 185, 245, - 94, 95, 25, 5, 245, 100, 95, 25, 5, 222, 185, 245, 100, 95, 25, 5, 254, - 210, 95, 25, 5, 245, 203, 95, 25, 5, 253, 200, 95, 25, 5, 226, 138, 95, - 25, 5, 230, 30, 95, 25, 5, 229, 84, 95, 138, 222, 254, 95, 138, 216, 15, - 222, 254, 95, 138, 48, 95, 138, 51, 95, 1, 216, 29, 95, 1, 216, 28, 95, - 1, 216, 27, 95, 1, 216, 26, 95, 1, 216, 25, 95, 1, 216, 24, 95, 1, 216, - 23, 95, 1, 223, 109, 216, 30, 95, 1, 223, 109, 216, 29, 95, 1, 223, 109, - 216, 27, 95, 1, 223, 109, 216, 26, 95, 1, 223, 109, 216, 25, 95, 1, 223, - 109, 216, 23, 56, 1, 254, 31, 76, 141, 1, 254, 31, 211, 47, 49, 28, 16, - 224, 157, 49, 28, 16, 248, 166, 49, 28, 16, 225, 178, 49, 28, 16, 226, - 117, 245, 186, 49, 28, 16, 226, 117, 247, 209, 49, 28, 16, 214, 16, 245, - 186, 49, 28, 16, 214, 16, 247, 209, 49, 28, 16, 234, 203, 49, 28, 16, - 217, 170, 49, 28, 16, 226, 13, 49, 28, 16, 210, 217, 49, 28, 16, 210, - 218, 247, 209, 49, 28, 16, 233, 240, 49, 28, 16, 254, 76, 245, 186, 49, - 28, 16, 245, 34, 245, 186, 49, 28, 16, 217, 3, 49, 28, 16, 234, 167, 49, - 28, 16, 254, 66, 49, 28, 16, 254, 67, 247, 209, 49, 28, 16, 217, 176, 49, - 28, 16, 216, 160, 49, 28, 16, 226, 210, 254, 29, 49, 28, 16, 242, 166, - 254, 29, 49, 28, 16, 224, 156, 49, 28, 16, 250, 157, 49, 28, 16, 214, 6, - 49, 28, 16, 235, 170, 254, 29, 49, 28, 16, 234, 169, 254, 29, 49, 28, 16, - 234, 168, 254, 29, 49, 28, 16, 221, 215, 49, 28, 16, 226, 4, 49, 28, 16, - 218, 148, 254, 69, 49, 28, 16, 226, 116, 254, 29, 49, 28, 16, 214, 15, - 254, 29, 49, 28, 16, 254, 70, 254, 29, 49, 28, 16, 254, 64, 49, 28, 16, - 234, 43, 49, 28, 16, 223, 49, 49, 28, 16, 225, 109, 254, 29, 49, 28, 16, - 216, 84, 49, 28, 16, 254, 129, 49, 28, 16, 221, 161, 49, 28, 16, 217, - 179, 254, 29, 49, 28, 16, 217, 179, 231, 45, 218, 146, 49, 28, 16, 226, - 111, 254, 29, 49, 28, 16, 216, 191, 49, 28, 16, 233, 33, 49, 28, 16, 246, - 49, 49, 28, 16, 215, 228, 49, 28, 16, 216, 233, 49, 28, 16, 233, 243, 49, - 28, 16, 254, 76, 245, 34, 229, 100, 49, 28, 16, 243, 243, 254, 29, 49, - 28, 16, 236, 19, 49, 28, 16, 215, 200, 254, 29, 49, 28, 16, 234, 206, - 215, 199, 49, 28, 16, 225, 203, 49, 28, 16, 224, 161, 49, 28, 16, 234, - 17, 49, 28, 16, 250, 88, 254, 29, 49, 28, 16, 223, 149, 49, 28, 16, 226, - 16, 254, 29, 49, 28, 16, 226, 14, 254, 29, 49, 28, 16, 240, 116, 49, 28, - 16, 229, 208, 49, 28, 16, 225, 159, 49, 28, 16, 234, 18, 254, 158, 49, - 28, 16, 215, 200, 254, 158, 49, 28, 16, 218, 125, 49, 28, 16, 242, 130, - 49, 28, 16, 235, 170, 229, 100, 49, 28, 16, 226, 210, 229, 100, 49, 28, - 16, 226, 117, 229, 100, 49, 28, 16, 225, 158, 49, 28, 16, 234, 4, 49, 28, - 16, 225, 157, 49, 28, 16, 233, 242, 49, 28, 16, 225, 204, 229, 100, 49, - 28, 16, 234, 168, 229, 101, 254, 104, 49, 28, 16, 234, 169, 229, 101, - 254, 104, 49, 28, 16, 210, 215, 49, 28, 16, 254, 67, 229, 100, 49, 28, - 16, 254, 68, 217, 177, 229, 100, 49, 28, 16, 210, 216, 49, 28, 16, 233, - 241, 49, 28, 16, 245, 181, 49, 28, 16, 250, 158, 49, 28, 16, 230, 203, - 235, 169, 49, 28, 16, 214, 16, 229, 100, 49, 28, 16, 225, 109, 229, 100, - 49, 28, 16, 224, 162, 229, 100, 49, 28, 16, 226, 207, 49, 28, 16, 254, - 92, 49, 28, 16, 232, 63, 49, 28, 16, 226, 14, 229, 100, 49, 28, 16, 226, - 16, 229, 100, 49, 28, 16, 245, 68, 226, 15, 49, 28, 16, 233, 159, 49, 28, - 16, 254, 93, 49, 28, 16, 215, 200, 229, 100, 49, 28, 16, 245, 184, 49, - 28, 16, 217, 179, 229, 100, 49, 28, 16, 217, 171, 49, 28, 16, 250, 88, - 229, 100, 49, 28, 16, 245, 114, 49, 28, 16, 221, 162, 229, 100, 49, 28, - 16, 211, 151, 234, 43, 49, 28, 16, 215, 197, 49, 28, 16, 224, 163, 49, - 28, 16, 215, 201, 49, 28, 16, 215, 198, 49, 28, 16, 224, 160, 49, 28, 16, - 215, 196, 49, 28, 16, 224, 159, 49, 28, 16, 242, 165, 49, 28, 16, 254, - 22, 49, 28, 16, 245, 68, 254, 22, 49, 28, 16, 226, 111, 229, 100, 49, 28, - 16, 216, 190, 245, 77, 49, 28, 16, 216, 190, 245, 33, 49, 28, 16, 216, - 192, 254, 71, 49, 28, 16, 216, 185, 234, 253, 254, 63, 49, 28, 16, 234, - 205, 49, 28, 16, 245, 147, 49, 28, 16, 211, 11, 234, 202, 49, 28, 16, - 211, 11, 254, 104, 49, 28, 16, 218, 147, 49, 28, 16, 234, 44, 254, 104, - 49, 28, 16, 247, 210, 254, 29, 49, 28, 16, 233, 244, 254, 29, 49, 28, 16, - 233, 244, 254, 158, 49, 28, 16, 233, 244, 229, 100, 49, 28, 16, 254, 70, - 229, 100, 49, 28, 16, 254, 72, 49, 28, 16, 247, 209, 49, 28, 16, 215, - 211, 49, 28, 16, 216, 225, 49, 28, 16, 234, 8, 49, 28, 16, 233, 38, 245, - 142, 250, 79, 49, 28, 16, 233, 38, 246, 50, 250, 80, 49, 28, 16, 233, 38, - 215, 213, 250, 80, 49, 28, 16, 233, 38, 216, 235, 250, 80, 49, 28, 16, - 233, 38, 236, 14, 250, 79, 49, 28, 16, 242, 166, 229, 101, 254, 104, 49, - 28, 16, 242, 166, 226, 5, 254, 18, 49, 28, 16, 242, 166, 226, 5, 248, 37, - 49, 28, 16, 247, 233, 49, 28, 16, 247, 234, 226, 5, 254, 19, 234, 202, - 49, 28, 16, 247, 234, 226, 5, 254, 19, 254, 104, 49, 28, 16, 247, 234, - 226, 5, 248, 37, 49, 28, 16, 215, 217, 49, 28, 16, 254, 23, 49, 28, 16, - 236, 21, 49, 28, 16, 247, 254, 49, 28, 16, 254, 220, 225, 3, 254, 24, 49, - 28, 16, 254, 220, 254, 21, 49, 28, 16, 254, 220, 254, 24, 49, 28, 16, - 254, 220, 231, 39, 49, 28, 16, 254, 220, 231, 50, 49, 28, 16, 254, 220, - 242, 167, 49, 28, 16, 254, 220, 242, 164, 49, 28, 16, 254, 220, 225, 3, - 242, 167, 49, 28, 16, 231, 156, 224, 168, 240, 114, 49, 28, 16, 231, 156, - 254, 160, 224, 168, 240, 114, 49, 28, 16, 231, 156, 248, 36, 240, 114, - 49, 28, 16, 231, 156, 254, 160, 248, 36, 240, 114, 49, 28, 16, 231, 156, - 215, 206, 240, 114, 49, 28, 16, 231, 156, 215, 218, 49, 28, 16, 231, 156, - 216, 229, 240, 114, 49, 28, 16, 231, 156, 216, 229, 233, 41, 240, 114, - 49, 28, 16, 231, 156, 233, 41, 240, 114, 49, 28, 16, 231, 156, 225, 42, - 240, 114, 49, 28, 16, 235, 176, 216, 252, 240, 115, 49, 28, 16, 254, 68, - 216, 252, 240, 115, 49, 28, 16, 244, 180, 216, 226, 49, 28, 16, 244, 180, - 230, 148, 49, 28, 16, 244, 180, 247, 238, 49, 28, 16, 231, 156, 214, 10, - 240, 114, 49, 28, 16, 231, 156, 224, 167, 240, 114, 49, 28, 16, 231, 156, - 225, 42, 216, 229, 240, 114, 49, 28, 16, 242, 162, 230, 31, 254, 71, 49, - 28, 16, 242, 162, 230, 31, 247, 208, 49, 28, 16, 245, 156, 234, 253, 243, - 243, 213, 124, 49, 28, 16, 236, 20, 49, 28, 16, 236, 18, 49, 28, 16, 243, - 243, 254, 30, 248, 35, 240, 113, 49, 28, 16, 243, 243, 247, 252, 191, 49, - 28, 16, 243, 243, 247, 252, 229, 208, 49, 28, 16, 243, 243, 229, 203, - 240, 114, 49, 28, 16, 243, 243, 247, 252, 248, 11, 49, 28, 16, 243, 243, - 219, 104, 247, 251, 248, 11, 49, 28, 16, 243, 243, 247, 252, 234, 188, - 49, 28, 16, 243, 243, 247, 252, 210, 23, 49, 28, 16, 243, 243, 247, 252, - 228, 239, 234, 202, 49, 28, 16, 243, 243, 247, 252, 228, 239, 254, 104, - 49, 28, 16, 243, 243, 231, 196, 250, 81, 247, 238, 49, 28, 16, 243, 243, - 231, 196, 250, 81, 230, 148, 49, 28, 16, 244, 130, 219, 104, 250, 81, - 214, 9, 49, 28, 16, 243, 243, 219, 104, 250, 81, 217, 180, 49, 28, 16, - 243, 243, 229, 102, 49, 28, 16, 250, 82, 209, 249, 49, 28, 16, 250, 82, - 234, 42, 49, 28, 16, 250, 82, 219, 11, 49, 28, 16, 243, 243, 240, 161, - 211, 10, 216, 230, 49, 28, 16, 243, 243, 245, 157, 254, 94, 49, 28, 16, - 211, 10, 215, 207, 49, 28, 16, 247, 246, 215, 207, 49, 28, 16, 247, 246, - 216, 230, 49, 28, 16, 247, 246, 254, 73, 246, 50, 247, 147, 49, 28, 16, - 247, 246, 230, 146, 216, 234, 247, 147, 49, 28, 16, 247, 246, 247, 230, - 245, 44, 247, 147, 49, 28, 16, 247, 246, 215, 215, 226, 215, 247, 147, - 49, 28, 16, 211, 10, 254, 73, 246, 50, 247, 147, 49, 28, 16, 211, 10, - 230, 146, 216, 234, 247, 147, 49, 28, 16, 211, 10, 247, 230, 245, 44, - 247, 147, 49, 28, 16, 211, 10, 215, 215, 226, 215, 247, 147, 49, 28, 16, - 243, 56, 247, 245, 49, 28, 16, 243, 56, 211, 9, 49, 28, 16, 247, 253, - 254, 73, 230, 204, 49, 28, 16, 247, 253, 254, 73, 231, 78, 49, 28, 16, - 247, 253, 247, 209, 49, 28, 16, 247, 253, 216, 183, 49, 28, 16, 219, 165, - 216, 183, 49, 28, 16, 219, 165, 216, 184, 247, 194, 49, 28, 16, 219, 165, - 216, 184, 215, 208, 49, 28, 16, 219, 165, 216, 184, 216, 223, 49, 28, 16, - 219, 165, 253, 252, 49, 28, 16, 219, 165, 253, 253, 247, 194, 49, 28, 16, - 219, 165, 253, 253, 215, 208, 49, 28, 16, 219, 165, 253, 253, 216, 223, - 49, 28, 16, 247, 231, 243, 37, 49, 28, 16, 247, 237, 226, 138, 49, 28, - 16, 218, 139, 49, 28, 16, 254, 15, 191, 49, 28, 16, 254, 15, 213, 124, - 49, 28, 16, 254, 15, 243, 142, 49, 28, 16, 254, 15, 248, 11, 49, 28, 16, - 254, 15, 234, 188, 49, 28, 16, 254, 15, 210, 23, 49, 28, 16, 254, 15, - 228, 238, 49, 28, 16, 234, 168, 229, 101, 231, 49, 49, 28, 16, 234, 169, - 229, 101, 231, 49, 49, 28, 16, 234, 168, 229, 101, 234, 202, 49, 28, 16, - 234, 169, 229, 101, 234, 202, 49, 28, 16, 234, 44, 234, 202, 49, 28, 16, - 242, 166, 229, 101, 234, 202, 28, 16, 219, 157, 252, 143, 28, 16, 52, - 252, 143, 28, 16, 40, 252, 143, 28, 16, 223, 53, 40, 252, 143, 28, 16, - 248, 163, 252, 143, 28, 16, 219, 253, 252, 143, 28, 16, 43, 223, 80, 50, - 28, 16, 44, 223, 80, 50, 28, 16, 223, 80, 247, 126, 28, 16, 248, 204, - 221, 165, 28, 16, 248, 230, 251, 1, 28, 16, 221, 165, 28, 16, 249, 242, - 28, 16, 223, 78, 244, 119, 28, 16, 223, 78, 244, 118, 28, 16, 223, 78, - 244, 117, 28, 16, 244, 139, 28, 16, 244, 140, 51, 28, 16, 251, 156, 79, - 28, 16, 251, 32, 28, 16, 251, 167, 28, 16, 127, 28, 16, 226, 197, 218, - 165, 28, 16, 215, 57, 218, 165, 28, 16, 216, 143, 218, 165, 28, 16, 244, - 18, 218, 165, 28, 16, 244, 88, 218, 165, 28, 16, 219, 126, 218, 165, 28, - 16, 219, 124, 244, 2, 28, 16, 244, 16, 244, 2, 28, 16, 243, 210, 250, 22, - 28, 16, 243, 210, 250, 23, 226, 140, 254, 150, 28, 16, 243, 210, 250, 23, - 226, 140, 252, 130, 28, 16, 251, 75, 250, 22, 28, 16, 245, 15, 250, 22, - 28, 16, 245, 15, 250, 23, 226, 140, 254, 150, 28, 16, 245, 15, 250, 23, - 226, 140, 252, 130, 28, 16, 246, 91, 250, 21, 28, 16, 246, 91, 250, 20, - 28, 16, 230, 90, 231, 95, 223, 64, 28, 16, 52, 220, 77, 28, 16, 52, 244, - 73, 28, 16, 244, 74, 214, 163, 28, 16, 244, 74, 246, 114, 28, 16, 229, - 193, 214, 163, 28, 16, 229, 193, 246, 114, 28, 16, 220, 78, 214, 163, 28, - 16, 220, 78, 246, 114, 28, 16, 224, 25, 138, 220, 77, 28, 16, 224, 25, - 138, 244, 73, 28, 16, 249, 224, 216, 88, 28, 16, 249, 93, 216, 88, 28, - 16, 226, 140, 254, 150, 28, 16, 226, 140, 252, 130, 28, 16, 224, 7, 254, - 150, 28, 16, 224, 7, 252, 130, 28, 16, 230, 93, 223, 64, 28, 16, 211, - 251, 223, 64, 28, 16, 163, 223, 64, 28, 16, 224, 25, 223, 64, 28, 16, - 245, 197, 223, 64, 28, 16, 219, 120, 223, 64, 28, 16, 216, 161, 223, 64, - 28, 16, 219, 112, 223, 64, 28, 16, 123, 240, 218, 215, 71, 223, 64, 28, - 16, 211, 179, 228, 48, 28, 16, 96, 228, 48, 28, 16, 250, 44, 211, 179, - 228, 48, 28, 16, 42, 228, 49, 211, 253, 28, 16, 42, 228, 49, 251, 229, - 28, 16, 215, 227, 228, 49, 120, 211, 253, 28, 16, 215, 227, 228, 49, 120, - 251, 229, 28, 16, 215, 227, 228, 49, 43, 211, 253, 28, 16, 215, 227, 228, - 49, 43, 251, 229, 28, 16, 215, 227, 228, 49, 44, 211, 253, 28, 16, 215, - 227, 228, 49, 44, 251, 229, 28, 16, 215, 227, 228, 49, 124, 211, 253, 28, - 16, 215, 227, 228, 49, 124, 251, 229, 28, 16, 215, 227, 228, 49, 120, 44, - 211, 253, 28, 16, 215, 227, 228, 49, 120, 44, 251, 229, 28, 16, 230, 134, - 228, 49, 211, 253, 28, 16, 230, 134, 228, 49, 251, 229, 28, 16, 215, 224, - 228, 49, 124, 211, 253, 28, 16, 215, 224, 228, 49, 124, 251, 229, 28, 16, - 226, 8, 228, 48, 28, 16, 213, 132, 228, 48, 28, 16, 228, 49, 251, 229, - 28, 16, 227, 207, 228, 48, 28, 16, 249, 249, 228, 49, 211, 253, 28, 16, - 249, 249, 228, 49, 251, 229, 28, 16, 251, 154, 28, 16, 211, 251, 228, 52, - 28, 16, 163, 228, 52, 28, 16, 224, 25, 228, 52, 28, 16, 245, 197, 228, - 52, 28, 16, 219, 120, 228, 52, 28, 16, 216, 161, 228, 52, 28, 16, 219, - 112, 228, 52, 28, 16, 123, 240, 218, 215, 71, 228, 52, 28, 16, 38, 218, - 141, 28, 16, 38, 218, 242, 218, 141, 28, 16, 38, 215, 235, 28, 16, 38, - 215, 234, 28, 16, 38, 215, 233, 28, 16, 244, 109, 215, 235, 28, 16, 244, - 109, 215, 234, 28, 16, 244, 109, 215, 233, 28, 16, 38, 253, 197, 247, - 128, 28, 16, 38, 244, 80, 28, 16, 38, 244, 79, 28, 16, 38, 244, 78, 28, - 16, 38, 244, 77, 28, 16, 38, 244, 76, 28, 16, 252, 66, 252, 82, 28, 16, - 245, 151, 252, 82, 28, 16, 252, 66, 216, 112, 28, 16, 245, 151, 216, 112, - 28, 16, 252, 66, 219, 82, 28, 16, 245, 151, 219, 82, 28, 16, 252, 66, - 225, 118, 28, 16, 245, 151, 225, 118, 28, 16, 38, 255, 23, 28, 16, 38, - 218, 167, 28, 16, 38, 216, 239, 28, 16, 38, 218, 168, 28, 16, 38, 231, - 167, 28, 16, 38, 231, 166, 28, 16, 38, 255, 22, 28, 16, 38, 232, 118, 28, - 16, 254, 6, 214, 163, 28, 16, 254, 6, 246, 114, 28, 16, 38, 247, 143, 28, - 16, 38, 222, 234, 28, 16, 38, 244, 66, 28, 16, 38, 219, 78, 28, 16, 38, - 252, 46, 28, 16, 38, 52, 216, 20, 28, 16, 38, 215, 212, 216, 20, 28, 16, - 222, 238, 28, 16, 218, 76, 28, 16, 210, 159, 28, 16, 225, 110, 28, 16, - 231, 30, 28, 16, 244, 25, 28, 16, 249, 146, 28, 16, 248, 86, 28, 16, 242, - 157, 228, 53, 219, 97, 28, 16, 242, 157, 228, 53, 228, 80, 219, 97, 28, - 16, 216, 1, 28, 16, 215, 95, 28, 16, 235, 200, 215, 95, 28, 16, 215, 96, - 219, 97, 28, 16, 215, 96, 214, 163, 28, 16, 226, 152, 218, 104, 28, 16, - 226, 152, 218, 101, 28, 16, 226, 152, 218, 100, 28, 16, 226, 152, 218, - 99, 28, 16, 226, 152, 218, 98, 28, 16, 226, 152, 218, 97, 28, 16, 226, - 152, 218, 96, 28, 16, 226, 152, 218, 95, 28, 16, 226, 152, 218, 94, 28, - 16, 226, 152, 218, 103, 28, 16, 226, 152, 218, 102, 28, 16, 241, 252, 28, - 16, 229, 110, 28, 16, 245, 151, 64, 218, 135, 28, 16, 248, 79, 219, 97, - 28, 16, 38, 124, 251, 177, 28, 16, 38, 120, 251, 177, 28, 16, 38, 242, 7, - 28, 16, 38, 219, 69, 225, 46, 28, 16, 225, 219, 79, 28, 16, 225, 219, - 120, 79, 28, 16, 163, 225, 219, 79, 28, 16, 242, 189, 214, 163, 28, 16, - 242, 189, 246, 114, 28, 16, 2, 244, 108, 28, 16, 248, 188, 28, 16, 248, - 189, 254, 163, 28, 16, 231, 138, 28, 16, 232, 135, 28, 16, 251, 151, 28, - 16, 220, 156, 211, 253, 28, 16, 220, 156, 251, 229, 28, 16, 230, 189, 28, - 16, 230, 190, 251, 229, 28, 16, 220, 150, 211, 253, 28, 16, 220, 150, - 251, 229, 28, 16, 243, 227, 211, 253, 28, 16, 243, 227, 251, 229, 28, 16, - 232, 136, 225, 183, 223, 64, 28, 16, 232, 136, 236, 11, 223, 64, 28, 16, - 251, 152, 223, 64, 28, 16, 220, 156, 223, 64, 28, 16, 230, 190, 223, 64, - 28, 16, 220, 150, 223, 64, 28, 16, 216, 250, 225, 181, 249, 115, 224, - 177, 225, 182, 28, 16, 216, 250, 225, 181, 249, 115, 224, 177, 236, 10, - 28, 16, 216, 250, 225, 181, 249, 115, 224, 177, 225, 183, 247, 219, 28, - 16, 216, 250, 236, 9, 249, 115, 224, 177, 225, 182, 28, 16, 216, 250, - 236, 9, 249, 115, 224, 177, 236, 10, 28, 16, 216, 250, 236, 9, 249, 115, - 224, 177, 236, 11, 247, 219, 28, 16, 216, 250, 236, 9, 249, 115, 224, - 177, 236, 11, 247, 218, 28, 16, 216, 250, 236, 9, 249, 115, 224, 177, - 236, 11, 247, 217, 28, 16, 249, 141, 28, 16, 242, 133, 251, 75, 250, 22, - 28, 16, 242, 133, 245, 15, 250, 22, 28, 16, 42, 253, 166, 28, 16, 213, - 151, 28, 16, 225, 17, 28, 16, 250, 13, 28, 16, 221, 205, 28, 16, 250, 17, - 28, 16, 216, 8, 28, 16, 224, 245, 28, 16, 224, 246, 244, 68, 28, 16, 221, - 206, 244, 68, 28, 16, 216, 9, 223, 61, 28, 16, 225, 166, 218, 67, 26, - 213, 137, 189, 217, 230, 26, 213, 137, 189, 217, 219, 26, 213, 137, 189, - 217, 209, 26, 213, 137, 189, 217, 202, 26, 213, 137, 189, 217, 194, 26, - 213, 137, 189, 217, 188, 26, 213, 137, 189, 217, 187, 26, 213, 137, 189, - 217, 186, 26, 213, 137, 189, 217, 185, 26, 213, 137, 189, 217, 229, 26, - 213, 137, 189, 217, 228, 26, 213, 137, 189, 217, 227, 26, 213, 137, 189, - 217, 226, 26, 213, 137, 189, 217, 225, 26, 213, 137, 189, 217, 224, 26, - 213, 137, 189, 217, 223, 26, 213, 137, 189, 217, 222, 26, 213, 137, 189, - 217, 221, 26, 213, 137, 189, 217, 220, 26, 213, 137, 189, 217, 218, 26, - 213, 137, 189, 217, 217, 26, 213, 137, 189, 217, 216, 26, 213, 137, 189, - 217, 215, 26, 213, 137, 189, 217, 214, 26, 213, 137, 189, 217, 193, 26, - 213, 137, 189, 217, 192, 26, 213, 137, 189, 217, 191, 26, 213, 137, 189, - 217, 190, 26, 213, 137, 189, 217, 189, 26, 235, 221, 189, 217, 230, 26, - 235, 221, 189, 217, 219, 26, 235, 221, 189, 217, 202, 26, 235, 221, 189, - 217, 194, 26, 235, 221, 189, 217, 187, 26, 235, 221, 189, 217, 186, 26, - 235, 221, 189, 217, 228, 26, 235, 221, 189, 217, 227, 26, 235, 221, 189, - 217, 226, 26, 235, 221, 189, 217, 225, 26, 235, 221, 189, 217, 222, 26, - 235, 221, 189, 217, 221, 26, 235, 221, 189, 217, 220, 26, 235, 221, 189, - 217, 215, 26, 235, 221, 189, 217, 214, 26, 235, 221, 189, 217, 213, 26, - 235, 221, 189, 217, 212, 26, 235, 221, 189, 217, 211, 26, 235, 221, 189, - 217, 210, 26, 235, 221, 189, 217, 208, 26, 235, 221, 189, 217, 207, 26, - 235, 221, 189, 217, 206, 26, 235, 221, 189, 217, 205, 26, 235, 221, 189, - 217, 204, 26, 235, 221, 189, 217, 203, 26, 235, 221, 189, 217, 201, 26, - 235, 221, 189, 217, 200, 26, 235, 221, 189, 217, 199, 26, 235, 221, 189, - 217, 198, 26, 235, 221, 189, 217, 197, 26, 235, 221, 189, 217, 196, 26, - 235, 221, 189, 217, 195, 26, 235, 221, 189, 217, 193, 26, 235, 221, 189, - 217, 192, 26, 235, 221, 189, 217, 191, 26, 235, 221, 189, 217, 190, 26, - 235, 221, 189, 217, 189, 38, 26, 28, 215, 209, 38, 26, 28, 216, 224, 38, - 26, 28, 225, 191, 26, 28, 233, 37, 230, 147, 31, 245, 231, 247, 232, 31, - 241, 229, 245, 231, 247, 232, 31, 240, 221, 245, 231, 247, 232, 31, 245, - 230, 241, 230, 247, 232, 31, 245, 230, 240, 220, 247, 232, 31, 245, 231, - 180, 31, 250, 182, 180, 31, 243, 236, 250, 43, 180, 31, 230, 182, 180, - 31, 252, 138, 180, 31, 234, 185, 219, 81, 180, 31, 249, 187, 180, 31, - 253, 241, 180, 31, 226, 167, 180, 31, 251, 161, 226, 134, 180, 31, 248, - 81, 177, 247, 187, 180, 31, 247, 184, 180, 31, 210, 222, 180, 31, 235, - 254, 180, 31, 225, 200, 180, 31, 223, 130, 180, 31, 249, 197, 180, 31, - 241, 67, 252, 192, 180, 31, 212, 59, 180, 31, 244, 47, 180, 31, 254, 255, - 180, 31, 223, 92, 180, 31, 223, 68, 180, 31, 245, 229, 180, 31, 235, 59, - 180, 31, 249, 192, 180, 31, 245, 150, 180, 31, 246, 60, 180, 31, 250, - 153, 180, 31, 248, 90, 180, 31, 23, 223, 67, 180, 31, 226, 85, 180, 31, - 233, 40, 180, 31, 250, 6, 180, 31, 234, 83, 180, 31, 243, 93, 180, 31, - 218, 114, 180, 31, 224, 133, 180, 31, 243, 235, 180, 31, 223, 69, 180, - 31, 233, 77, 177, 230, 162, 180, 31, 223, 65, 180, 31, 242, 175, 216, 43, - 231, 81, 180, 31, 245, 152, 180, 31, 218, 126, 180, 31, 242, 135, 180, - 31, 245, 144, 180, 31, 225, 239, 180, 31, 222, 228, 180, 31, 244, 67, - 180, 31, 214, 8, 177, 212, 44, 180, 31, 249, 201, 180, 31, 231, 94, 180, - 31, 245, 69, 180, 31, 214, 172, 180, 31, 247, 220, 180, 31, 250, 8, 230, - 115, 180, 31, 242, 113, 180, 31, 243, 94, 236, 6, 180, 31, 231, 146, 180, - 31, 255, 19, 180, 31, 245, 165, 180, 31, 246, 117, 180, 31, 212, 42, 180, - 31, 219, 152, 180, 31, 235, 229, 180, 31, 248, 50, 180, 31, 248, 168, - 180, 31, 247, 216, 180, 31, 245, 37, 180, 31, 220, 117, 180, 31, 218, - 130, 180, 31, 242, 9, 180, 31, 249, 220, 180, 31, 250, 3, 180, 31, 244, - 185, 180, 31, 254, 221, 180, 31, 249, 219, 180, 31, 226, 201, 216, 197, - 213, 242, 180, 31, 247, 240, 180, 31, 233, 130, 180, 31, 244, 21, 249, - 157, 222, 204, 214, 174, 21, 111, 249, 157, 222, 204, 214, 174, 21, 105, - 249, 157, 222, 204, 214, 174, 21, 158, 249, 157, 222, 204, 214, 174, 21, - 161, 249, 157, 222, 204, 214, 174, 21, 190, 249, 157, 222, 204, 214, 174, - 21, 195, 249, 157, 222, 204, 214, 174, 21, 199, 249, 157, 222, 204, 214, - 174, 21, 196, 249, 157, 222, 204, 214, 174, 21, 201, 249, 157, 222, 204, - 216, 244, 21, 111, 249, 157, 222, 204, 216, 244, 21, 105, 249, 157, 222, - 204, 216, 244, 21, 158, 249, 157, 222, 204, 216, 244, 21, 161, 249, 157, - 222, 204, 216, 244, 21, 190, 249, 157, 222, 204, 216, 244, 21, 195, 249, - 157, 222, 204, 216, 244, 21, 199, 249, 157, 222, 204, 216, 244, 21, 196, - 249, 157, 222, 204, 216, 244, 21, 201, 11, 23, 6, 61, 11, 23, 6, 253, - 166, 11, 23, 6, 251, 74, 11, 23, 6, 249, 68, 11, 23, 6, 76, 11, 23, 6, - 245, 14, 11, 23, 6, 243, 209, 11, 23, 6, 242, 67, 11, 23, 6, 74, 11, 23, - 6, 235, 150, 11, 23, 6, 235, 29, 11, 23, 6, 156, 11, 23, 6, 194, 11, 23, - 6, 230, 30, 11, 23, 6, 78, 11, 23, 6, 226, 109, 11, 23, 6, 224, 99, 11, - 23, 6, 153, 11, 23, 6, 222, 93, 11, 23, 6, 217, 153, 11, 23, 6, 69, 11, - 23, 6, 214, 105, 11, 23, 6, 212, 98, 11, 23, 6, 211, 178, 11, 23, 6, 211, - 117, 11, 23, 6, 210, 159, 11, 23, 4, 61, 11, 23, 4, 253, 166, 11, 23, 4, - 251, 74, 11, 23, 4, 249, 68, 11, 23, 4, 76, 11, 23, 4, 245, 14, 11, 23, - 4, 243, 209, 11, 23, 4, 242, 67, 11, 23, 4, 74, 11, 23, 4, 235, 150, 11, - 23, 4, 235, 29, 11, 23, 4, 156, 11, 23, 4, 194, 11, 23, 4, 230, 30, 11, - 23, 4, 78, 11, 23, 4, 226, 109, 11, 23, 4, 224, 99, 11, 23, 4, 153, 11, - 23, 4, 222, 93, 11, 23, 4, 217, 153, 11, 23, 4, 69, 11, 23, 4, 214, 105, - 11, 23, 4, 212, 98, 11, 23, 4, 211, 178, 11, 23, 4, 211, 117, 11, 23, 4, - 210, 159, 11, 32, 6, 61, 11, 32, 6, 253, 166, 11, 32, 6, 251, 74, 11, 32, - 6, 249, 68, 11, 32, 6, 76, 11, 32, 6, 245, 14, 11, 32, 6, 243, 209, 11, - 32, 6, 242, 67, 11, 32, 6, 74, 11, 32, 6, 235, 150, 11, 32, 6, 235, 29, - 11, 32, 6, 156, 11, 32, 6, 194, 11, 32, 6, 230, 30, 11, 32, 6, 78, 11, - 32, 6, 226, 109, 11, 32, 6, 224, 99, 11, 32, 6, 153, 11, 32, 6, 222, 93, - 11, 32, 6, 217, 153, 11, 32, 6, 69, 11, 32, 6, 214, 105, 11, 32, 6, 212, - 98, 11, 32, 6, 211, 178, 11, 32, 6, 211, 117, 11, 32, 6, 210, 159, 11, - 32, 4, 61, 11, 32, 4, 253, 166, 11, 32, 4, 251, 74, 11, 32, 4, 249, 68, - 11, 32, 4, 76, 11, 32, 4, 245, 14, 11, 32, 4, 243, 209, 11, 32, 4, 74, - 11, 32, 4, 235, 150, 11, 32, 4, 235, 29, 11, 32, 4, 156, 11, 32, 4, 194, - 11, 32, 4, 230, 30, 11, 32, 4, 78, 11, 32, 4, 226, 109, 11, 32, 4, 224, - 99, 11, 32, 4, 153, 11, 32, 4, 222, 93, 11, 32, 4, 217, 153, 11, 32, 4, - 69, 11, 32, 4, 214, 105, 11, 32, 4, 212, 98, 11, 32, 4, 211, 178, 11, 32, - 4, 211, 117, 11, 32, 4, 210, 159, 11, 23, 32, 6, 61, 11, 23, 32, 6, 253, - 166, 11, 23, 32, 6, 251, 74, 11, 23, 32, 6, 249, 68, 11, 23, 32, 6, 76, - 11, 23, 32, 6, 245, 14, 11, 23, 32, 6, 243, 209, 11, 23, 32, 6, 242, 67, - 11, 23, 32, 6, 74, 11, 23, 32, 6, 235, 150, 11, 23, 32, 6, 235, 29, 11, - 23, 32, 6, 156, 11, 23, 32, 6, 194, 11, 23, 32, 6, 230, 30, 11, 23, 32, - 6, 78, 11, 23, 32, 6, 226, 109, 11, 23, 32, 6, 224, 99, 11, 23, 32, 6, - 153, 11, 23, 32, 6, 222, 93, 11, 23, 32, 6, 217, 153, 11, 23, 32, 6, 69, - 11, 23, 32, 6, 214, 105, 11, 23, 32, 6, 212, 98, 11, 23, 32, 6, 211, 178, - 11, 23, 32, 6, 211, 117, 11, 23, 32, 6, 210, 159, 11, 23, 32, 4, 61, 11, - 23, 32, 4, 253, 166, 11, 23, 32, 4, 251, 74, 11, 23, 32, 4, 249, 68, 11, - 23, 32, 4, 76, 11, 23, 32, 4, 245, 14, 11, 23, 32, 4, 243, 209, 11, 23, - 32, 4, 242, 67, 11, 23, 32, 4, 74, 11, 23, 32, 4, 235, 150, 11, 23, 32, - 4, 235, 29, 11, 23, 32, 4, 156, 11, 23, 32, 4, 194, 11, 23, 32, 4, 230, - 30, 11, 23, 32, 4, 78, 11, 23, 32, 4, 226, 109, 11, 23, 32, 4, 224, 99, - 11, 23, 32, 4, 153, 11, 23, 32, 4, 222, 93, 11, 23, 32, 4, 217, 153, 11, - 23, 32, 4, 69, 11, 23, 32, 4, 214, 105, 11, 23, 32, 4, 212, 98, 11, 23, - 32, 4, 211, 178, 11, 23, 32, 4, 211, 117, 11, 23, 32, 4, 210, 159, 11, - 119, 6, 61, 11, 119, 6, 251, 74, 11, 119, 6, 249, 68, 11, 119, 6, 243, - 209, 11, 119, 6, 235, 150, 11, 119, 6, 235, 29, 11, 119, 6, 230, 30, 11, - 119, 6, 78, 11, 119, 6, 226, 109, 11, 119, 6, 224, 99, 11, 119, 6, 222, - 93, 11, 119, 6, 217, 153, 11, 119, 6, 69, 11, 119, 6, 214, 105, 11, 119, - 6, 212, 98, 11, 119, 6, 211, 178, 11, 119, 6, 211, 117, 11, 119, 6, 210, - 159, 11, 119, 4, 61, 11, 119, 4, 253, 166, 11, 119, 4, 251, 74, 11, 119, - 4, 249, 68, 11, 119, 4, 245, 14, 11, 119, 4, 242, 67, 11, 119, 4, 74, 11, - 119, 4, 235, 150, 11, 119, 4, 235, 29, 11, 119, 4, 156, 11, 119, 4, 194, - 11, 119, 4, 230, 30, 11, 119, 4, 226, 109, 11, 119, 4, 224, 99, 11, 119, - 4, 153, 11, 119, 4, 222, 93, 11, 119, 4, 217, 153, 11, 119, 4, 69, 11, - 119, 4, 214, 105, 11, 119, 4, 212, 98, 11, 119, 4, 211, 178, 11, 119, 4, - 211, 117, 11, 119, 4, 210, 159, 11, 23, 119, 6, 61, 11, 23, 119, 6, 253, - 166, 11, 23, 119, 6, 251, 74, 11, 23, 119, 6, 249, 68, 11, 23, 119, 6, - 76, 11, 23, 119, 6, 245, 14, 11, 23, 119, 6, 243, 209, 11, 23, 119, 6, - 242, 67, 11, 23, 119, 6, 74, 11, 23, 119, 6, 235, 150, 11, 23, 119, 6, - 235, 29, 11, 23, 119, 6, 156, 11, 23, 119, 6, 194, 11, 23, 119, 6, 230, - 30, 11, 23, 119, 6, 78, 11, 23, 119, 6, 226, 109, 11, 23, 119, 6, 224, - 99, 11, 23, 119, 6, 153, 11, 23, 119, 6, 222, 93, 11, 23, 119, 6, 217, - 153, 11, 23, 119, 6, 69, 11, 23, 119, 6, 214, 105, 11, 23, 119, 6, 212, - 98, 11, 23, 119, 6, 211, 178, 11, 23, 119, 6, 211, 117, 11, 23, 119, 6, - 210, 159, 11, 23, 119, 4, 61, 11, 23, 119, 4, 253, 166, 11, 23, 119, 4, - 251, 74, 11, 23, 119, 4, 249, 68, 11, 23, 119, 4, 76, 11, 23, 119, 4, - 245, 14, 11, 23, 119, 4, 243, 209, 11, 23, 119, 4, 242, 67, 11, 23, 119, - 4, 74, 11, 23, 119, 4, 235, 150, 11, 23, 119, 4, 235, 29, 11, 23, 119, 4, - 156, 11, 23, 119, 4, 194, 11, 23, 119, 4, 230, 30, 11, 23, 119, 4, 78, - 11, 23, 119, 4, 226, 109, 11, 23, 119, 4, 224, 99, 11, 23, 119, 4, 153, - 11, 23, 119, 4, 222, 93, 11, 23, 119, 4, 217, 153, 11, 23, 119, 4, 69, - 11, 23, 119, 4, 214, 105, 11, 23, 119, 4, 212, 98, 11, 23, 119, 4, 211, - 178, 11, 23, 119, 4, 211, 117, 11, 23, 119, 4, 210, 159, 11, 133, 6, 61, - 11, 133, 6, 253, 166, 11, 133, 6, 249, 68, 11, 133, 6, 76, 11, 133, 6, - 245, 14, 11, 133, 6, 243, 209, 11, 133, 6, 235, 150, 11, 133, 6, 235, 29, - 11, 133, 6, 156, 11, 133, 6, 194, 11, 133, 6, 230, 30, 11, 133, 6, 78, - 11, 133, 6, 226, 109, 11, 133, 6, 224, 99, 11, 133, 6, 222, 93, 11, 133, - 6, 217, 153, 11, 133, 6, 69, 11, 133, 6, 214, 105, 11, 133, 6, 212, 98, - 11, 133, 6, 211, 178, 11, 133, 6, 211, 117, 11, 133, 4, 61, 11, 133, 4, - 253, 166, 11, 133, 4, 251, 74, 11, 133, 4, 249, 68, 11, 133, 4, 76, 11, - 133, 4, 245, 14, 11, 133, 4, 243, 209, 11, 133, 4, 242, 67, 11, 133, 4, - 74, 11, 133, 4, 235, 150, 11, 133, 4, 235, 29, 11, 133, 4, 156, 11, 133, - 4, 194, 11, 133, 4, 230, 30, 11, 133, 4, 78, 11, 133, 4, 226, 109, 11, - 133, 4, 224, 99, 11, 133, 4, 153, 11, 133, 4, 222, 93, 11, 133, 4, 217, - 153, 11, 133, 4, 69, 11, 133, 4, 214, 105, 11, 133, 4, 212, 98, 11, 133, - 4, 211, 178, 11, 133, 4, 211, 117, 11, 133, 4, 210, 159, 11, 139, 6, 61, - 11, 139, 6, 253, 166, 11, 139, 6, 249, 68, 11, 139, 6, 76, 11, 139, 6, - 245, 14, 11, 139, 6, 243, 209, 11, 139, 6, 74, 11, 139, 6, 235, 150, 11, - 139, 6, 235, 29, 11, 139, 6, 156, 11, 139, 6, 194, 11, 139, 6, 78, 11, - 139, 6, 222, 93, 11, 139, 6, 217, 153, 11, 139, 6, 69, 11, 139, 6, 214, - 105, 11, 139, 6, 212, 98, 11, 139, 6, 211, 178, 11, 139, 6, 211, 117, 11, - 139, 4, 61, 11, 139, 4, 253, 166, 11, 139, 4, 251, 74, 11, 139, 4, 249, - 68, 11, 139, 4, 76, 11, 139, 4, 245, 14, 11, 139, 4, 243, 209, 11, 139, - 4, 242, 67, 11, 139, 4, 74, 11, 139, 4, 235, 150, 11, 139, 4, 235, 29, - 11, 139, 4, 156, 11, 139, 4, 194, 11, 139, 4, 230, 30, 11, 139, 4, 78, - 11, 139, 4, 226, 109, 11, 139, 4, 224, 99, 11, 139, 4, 153, 11, 139, 4, - 222, 93, 11, 139, 4, 217, 153, 11, 139, 4, 69, 11, 139, 4, 214, 105, 11, - 139, 4, 212, 98, 11, 139, 4, 211, 178, 11, 139, 4, 211, 117, 11, 139, 4, - 210, 159, 11, 23, 133, 6, 61, 11, 23, 133, 6, 253, 166, 11, 23, 133, 6, - 251, 74, 11, 23, 133, 6, 249, 68, 11, 23, 133, 6, 76, 11, 23, 133, 6, - 245, 14, 11, 23, 133, 6, 243, 209, 11, 23, 133, 6, 242, 67, 11, 23, 133, - 6, 74, 11, 23, 133, 6, 235, 150, 11, 23, 133, 6, 235, 29, 11, 23, 133, 6, - 156, 11, 23, 133, 6, 194, 11, 23, 133, 6, 230, 30, 11, 23, 133, 6, 78, - 11, 23, 133, 6, 226, 109, 11, 23, 133, 6, 224, 99, 11, 23, 133, 6, 153, - 11, 23, 133, 6, 222, 93, 11, 23, 133, 6, 217, 153, 11, 23, 133, 6, 69, - 11, 23, 133, 6, 214, 105, 11, 23, 133, 6, 212, 98, 11, 23, 133, 6, 211, - 178, 11, 23, 133, 6, 211, 117, 11, 23, 133, 6, 210, 159, 11, 23, 133, 4, - 61, 11, 23, 133, 4, 253, 166, 11, 23, 133, 4, 251, 74, 11, 23, 133, 4, - 249, 68, 11, 23, 133, 4, 76, 11, 23, 133, 4, 245, 14, 11, 23, 133, 4, - 243, 209, 11, 23, 133, 4, 242, 67, 11, 23, 133, 4, 74, 11, 23, 133, 4, - 235, 150, 11, 23, 133, 4, 235, 29, 11, 23, 133, 4, 156, 11, 23, 133, 4, - 194, 11, 23, 133, 4, 230, 30, 11, 23, 133, 4, 78, 11, 23, 133, 4, 226, - 109, 11, 23, 133, 4, 224, 99, 11, 23, 133, 4, 153, 11, 23, 133, 4, 222, - 93, 11, 23, 133, 4, 217, 153, 11, 23, 133, 4, 69, 11, 23, 133, 4, 214, - 105, 11, 23, 133, 4, 212, 98, 11, 23, 133, 4, 211, 178, 11, 23, 133, 4, - 211, 117, 11, 23, 133, 4, 210, 159, 11, 35, 6, 61, 11, 35, 6, 253, 166, - 11, 35, 6, 251, 74, 11, 35, 6, 249, 68, 11, 35, 6, 76, 11, 35, 6, 245, - 14, 11, 35, 6, 243, 209, 11, 35, 6, 242, 67, 11, 35, 6, 74, 11, 35, 6, - 235, 150, 11, 35, 6, 235, 29, 11, 35, 6, 156, 11, 35, 6, 194, 11, 35, 6, - 230, 30, 11, 35, 6, 78, 11, 35, 6, 226, 109, 11, 35, 6, 224, 99, 11, 35, - 6, 153, 11, 35, 6, 222, 93, 11, 35, 6, 217, 153, 11, 35, 6, 69, 11, 35, - 6, 214, 105, 11, 35, 6, 212, 98, 11, 35, 6, 211, 178, 11, 35, 6, 211, - 117, 11, 35, 6, 210, 159, 11, 35, 4, 61, 11, 35, 4, 253, 166, 11, 35, 4, - 251, 74, 11, 35, 4, 249, 68, 11, 35, 4, 76, 11, 35, 4, 245, 14, 11, 35, - 4, 243, 209, 11, 35, 4, 242, 67, 11, 35, 4, 74, 11, 35, 4, 235, 150, 11, - 35, 4, 235, 29, 11, 35, 4, 156, 11, 35, 4, 194, 11, 35, 4, 230, 30, 11, - 35, 4, 78, 11, 35, 4, 226, 109, 11, 35, 4, 224, 99, 11, 35, 4, 153, 11, - 35, 4, 222, 93, 11, 35, 4, 217, 153, 11, 35, 4, 69, 11, 35, 4, 214, 105, - 11, 35, 4, 212, 98, 11, 35, 4, 211, 178, 11, 35, 4, 211, 117, 11, 35, 4, - 210, 159, 11, 35, 23, 6, 61, 11, 35, 23, 6, 253, 166, 11, 35, 23, 6, 251, - 74, 11, 35, 23, 6, 249, 68, 11, 35, 23, 6, 76, 11, 35, 23, 6, 245, 14, - 11, 35, 23, 6, 243, 209, 11, 35, 23, 6, 242, 67, 11, 35, 23, 6, 74, 11, - 35, 23, 6, 235, 150, 11, 35, 23, 6, 235, 29, 11, 35, 23, 6, 156, 11, 35, - 23, 6, 194, 11, 35, 23, 6, 230, 30, 11, 35, 23, 6, 78, 11, 35, 23, 6, - 226, 109, 11, 35, 23, 6, 224, 99, 11, 35, 23, 6, 153, 11, 35, 23, 6, 222, - 93, 11, 35, 23, 6, 217, 153, 11, 35, 23, 6, 69, 11, 35, 23, 6, 214, 105, - 11, 35, 23, 6, 212, 98, 11, 35, 23, 6, 211, 178, 11, 35, 23, 6, 211, 117, - 11, 35, 23, 6, 210, 159, 11, 35, 23, 4, 61, 11, 35, 23, 4, 253, 166, 11, - 35, 23, 4, 251, 74, 11, 35, 23, 4, 249, 68, 11, 35, 23, 4, 76, 11, 35, - 23, 4, 245, 14, 11, 35, 23, 4, 243, 209, 11, 35, 23, 4, 242, 67, 11, 35, - 23, 4, 74, 11, 35, 23, 4, 235, 150, 11, 35, 23, 4, 235, 29, 11, 35, 23, - 4, 156, 11, 35, 23, 4, 194, 11, 35, 23, 4, 230, 30, 11, 35, 23, 4, 78, - 11, 35, 23, 4, 226, 109, 11, 35, 23, 4, 224, 99, 11, 35, 23, 4, 153, 11, - 35, 23, 4, 222, 93, 11, 35, 23, 4, 217, 153, 11, 35, 23, 4, 69, 11, 35, - 23, 4, 214, 105, 11, 35, 23, 4, 212, 98, 11, 35, 23, 4, 211, 178, 11, 35, - 23, 4, 211, 117, 11, 35, 23, 4, 210, 159, 11, 35, 32, 6, 61, 11, 35, 32, - 6, 253, 166, 11, 35, 32, 6, 251, 74, 11, 35, 32, 6, 249, 68, 11, 35, 32, - 6, 76, 11, 35, 32, 6, 245, 14, 11, 35, 32, 6, 243, 209, 11, 35, 32, 6, - 242, 67, 11, 35, 32, 6, 74, 11, 35, 32, 6, 235, 150, 11, 35, 32, 6, 235, - 29, 11, 35, 32, 6, 156, 11, 35, 32, 6, 194, 11, 35, 32, 6, 230, 30, 11, - 35, 32, 6, 78, 11, 35, 32, 6, 226, 109, 11, 35, 32, 6, 224, 99, 11, 35, - 32, 6, 153, 11, 35, 32, 6, 222, 93, 11, 35, 32, 6, 217, 153, 11, 35, 32, - 6, 69, 11, 35, 32, 6, 214, 105, 11, 35, 32, 6, 212, 98, 11, 35, 32, 6, - 211, 178, 11, 35, 32, 6, 211, 117, 11, 35, 32, 6, 210, 159, 11, 35, 32, - 4, 61, 11, 35, 32, 4, 253, 166, 11, 35, 32, 4, 251, 74, 11, 35, 32, 4, - 249, 68, 11, 35, 32, 4, 76, 11, 35, 32, 4, 245, 14, 11, 35, 32, 4, 243, - 209, 11, 35, 32, 4, 242, 67, 11, 35, 32, 4, 74, 11, 35, 32, 4, 235, 150, - 11, 35, 32, 4, 235, 29, 11, 35, 32, 4, 156, 11, 35, 32, 4, 194, 11, 35, - 32, 4, 230, 30, 11, 35, 32, 4, 78, 11, 35, 32, 4, 226, 109, 11, 35, 32, - 4, 224, 99, 11, 35, 32, 4, 153, 11, 35, 32, 4, 222, 93, 11, 35, 32, 4, - 217, 153, 11, 35, 32, 4, 69, 11, 35, 32, 4, 214, 105, 11, 35, 32, 4, 212, - 98, 11, 35, 32, 4, 211, 178, 11, 35, 32, 4, 211, 117, 11, 35, 32, 4, 210, - 159, 11, 35, 23, 32, 6, 61, 11, 35, 23, 32, 6, 253, 166, 11, 35, 23, 32, - 6, 251, 74, 11, 35, 23, 32, 6, 249, 68, 11, 35, 23, 32, 6, 76, 11, 35, - 23, 32, 6, 245, 14, 11, 35, 23, 32, 6, 243, 209, 11, 35, 23, 32, 6, 242, - 67, 11, 35, 23, 32, 6, 74, 11, 35, 23, 32, 6, 235, 150, 11, 35, 23, 32, - 6, 235, 29, 11, 35, 23, 32, 6, 156, 11, 35, 23, 32, 6, 194, 11, 35, 23, - 32, 6, 230, 30, 11, 35, 23, 32, 6, 78, 11, 35, 23, 32, 6, 226, 109, 11, - 35, 23, 32, 6, 224, 99, 11, 35, 23, 32, 6, 153, 11, 35, 23, 32, 6, 222, - 93, 11, 35, 23, 32, 6, 217, 153, 11, 35, 23, 32, 6, 69, 11, 35, 23, 32, - 6, 214, 105, 11, 35, 23, 32, 6, 212, 98, 11, 35, 23, 32, 6, 211, 178, 11, - 35, 23, 32, 6, 211, 117, 11, 35, 23, 32, 6, 210, 159, 11, 35, 23, 32, 4, - 61, 11, 35, 23, 32, 4, 253, 166, 11, 35, 23, 32, 4, 251, 74, 11, 35, 23, - 32, 4, 249, 68, 11, 35, 23, 32, 4, 76, 11, 35, 23, 32, 4, 245, 14, 11, - 35, 23, 32, 4, 243, 209, 11, 35, 23, 32, 4, 242, 67, 11, 35, 23, 32, 4, - 74, 11, 35, 23, 32, 4, 235, 150, 11, 35, 23, 32, 4, 235, 29, 11, 35, 23, - 32, 4, 156, 11, 35, 23, 32, 4, 194, 11, 35, 23, 32, 4, 230, 30, 11, 35, - 23, 32, 4, 78, 11, 35, 23, 32, 4, 226, 109, 11, 35, 23, 32, 4, 224, 99, - 11, 35, 23, 32, 4, 153, 11, 35, 23, 32, 4, 222, 93, 11, 35, 23, 32, 4, - 217, 153, 11, 35, 23, 32, 4, 69, 11, 35, 23, 32, 4, 214, 105, 11, 35, 23, - 32, 4, 212, 98, 11, 35, 23, 32, 4, 211, 178, 11, 35, 23, 32, 4, 211, 117, - 11, 35, 23, 32, 4, 210, 159, 11, 230, 143, 6, 61, 11, 230, 143, 6, 253, - 166, 11, 230, 143, 6, 251, 74, 11, 230, 143, 6, 249, 68, 11, 230, 143, 6, - 76, 11, 230, 143, 6, 245, 14, 11, 230, 143, 6, 243, 209, 11, 230, 143, 6, - 242, 67, 11, 230, 143, 6, 74, 11, 230, 143, 6, 235, 150, 11, 230, 143, 6, - 235, 29, 11, 230, 143, 6, 156, 11, 230, 143, 6, 194, 11, 230, 143, 6, - 230, 30, 11, 230, 143, 6, 78, 11, 230, 143, 6, 226, 109, 11, 230, 143, 6, - 224, 99, 11, 230, 143, 6, 153, 11, 230, 143, 6, 222, 93, 11, 230, 143, 6, - 217, 153, 11, 230, 143, 6, 69, 11, 230, 143, 6, 214, 105, 11, 230, 143, - 6, 212, 98, 11, 230, 143, 6, 211, 178, 11, 230, 143, 6, 211, 117, 11, - 230, 143, 6, 210, 159, 11, 230, 143, 4, 61, 11, 230, 143, 4, 253, 166, - 11, 230, 143, 4, 251, 74, 11, 230, 143, 4, 249, 68, 11, 230, 143, 4, 76, - 11, 230, 143, 4, 245, 14, 11, 230, 143, 4, 243, 209, 11, 230, 143, 4, - 242, 67, 11, 230, 143, 4, 74, 11, 230, 143, 4, 235, 150, 11, 230, 143, 4, - 235, 29, 11, 230, 143, 4, 156, 11, 230, 143, 4, 194, 11, 230, 143, 4, - 230, 30, 11, 230, 143, 4, 78, 11, 230, 143, 4, 226, 109, 11, 230, 143, 4, - 224, 99, 11, 230, 143, 4, 153, 11, 230, 143, 4, 222, 93, 11, 230, 143, 4, - 217, 153, 11, 230, 143, 4, 69, 11, 230, 143, 4, 214, 105, 11, 230, 143, - 4, 212, 98, 11, 230, 143, 4, 211, 178, 11, 230, 143, 4, 211, 117, 11, - 230, 143, 4, 210, 159, 11, 32, 4, 247, 127, 74, 11, 32, 4, 247, 127, 235, - 150, 11, 23, 6, 254, 151, 11, 23, 6, 252, 34, 11, 23, 6, 243, 114, 11, - 23, 6, 248, 62, 11, 23, 6, 245, 108, 11, 23, 6, 210, 85, 11, 23, 6, 245, - 71, 11, 23, 6, 216, 180, 11, 23, 6, 235, 192, 11, 23, 6, 234, 228, 11, - 23, 6, 233, 104, 11, 23, 6, 230, 107, 11, 23, 6, 227, 242, 11, 23, 6, - 211, 157, 11, 23, 6, 226, 203, 11, 23, 6, 225, 111, 11, 23, 6, 223, 40, - 11, 23, 6, 216, 181, 87, 11, 23, 6, 219, 179, 11, 23, 6, 217, 42, 11, 23, - 6, 214, 157, 11, 23, 6, 225, 136, 11, 23, 6, 250, 118, 11, 23, 6, 224, - 164, 11, 23, 6, 226, 205, 11, 23, 229, 226, 11, 23, 4, 254, 151, 11, 23, - 4, 252, 34, 11, 23, 4, 243, 114, 11, 23, 4, 248, 62, 11, 23, 4, 245, 108, - 11, 23, 4, 210, 85, 11, 23, 4, 245, 71, 11, 23, 4, 216, 180, 11, 23, 4, - 235, 192, 11, 23, 4, 234, 228, 11, 23, 4, 233, 104, 11, 23, 4, 230, 107, - 11, 23, 4, 227, 242, 11, 23, 4, 211, 157, 11, 23, 4, 226, 203, 11, 23, 4, - 225, 111, 11, 23, 4, 223, 40, 11, 23, 4, 40, 219, 179, 11, 23, 4, 219, - 179, 11, 23, 4, 217, 42, 11, 23, 4, 214, 157, 11, 23, 4, 225, 136, 11, - 23, 4, 250, 118, 11, 23, 4, 224, 164, 11, 23, 4, 226, 205, 11, 23, 226, - 1, 247, 241, 11, 23, 245, 109, 87, 11, 23, 216, 181, 87, 11, 23, 234, - 229, 87, 11, 23, 225, 137, 87, 11, 23, 223, 41, 87, 11, 23, 225, 112, 87, - 11, 32, 6, 254, 151, 11, 32, 6, 252, 34, 11, 32, 6, 243, 114, 11, 32, 6, - 248, 62, 11, 32, 6, 245, 108, 11, 32, 6, 210, 85, 11, 32, 6, 245, 71, 11, - 32, 6, 216, 180, 11, 32, 6, 235, 192, 11, 32, 6, 234, 228, 11, 32, 6, - 233, 104, 11, 32, 6, 230, 107, 11, 32, 6, 227, 242, 11, 32, 6, 211, 157, - 11, 32, 6, 226, 203, 11, 32, 6, 225, 111, 11, 32, 6, 223, 40, 11, 32, 6, - 216, 181, 87, 11, 32, 6, 219, 179, 11, 32, 6, 217, 42, 11, 32, 6, 214, - 157, 11, 32, 6, 225, 136, 11, 32, 6, 250, 118, 11, 32, 6, 224, 164, 11, - 32, 6, 226, 205, 11, 32, 229, 226, 11, 32, 4, 254, 151, 11, 32, 4, 252, - 34, 11, 32, 4, 243, 114, 11, 32, 4, 248, 62, 11, 32, 4, 245, 108, 11, 32, - 4, 210, 85, 11, 32, 4, 245, 71, 11, 32, 4, 216, 180, 11, 32, 4, 235, 192, - 11, 32, 4, 234, 228, 11, 32, 4, 233, 104, 11, 32, 4, 230, 107, 11, 32, 4, - 227, 242, 11, 32, 4, 211, 157, 11, 32, 4, 226, 203, 11, 32, 4, 225, 111, - 11, 32, 4, 223, 40, 11, 32, 4, 40, 219, 179, 11, 32, 4, 219, 179, 11, 32, - 4, 217, 42, 11, 32, 4, 214, 157, 11, 32, 4, 225, 136, 11, 32, 4, 250, - 118, 11, 32, 4, 224, 164, 11, 32, 4, 226, 205, 11, 32, 226, 1, 247, 241, - 11, 32, 245, 109, 87, 11, 32, 216, 181, 87, 11, 32, 234, 229, 87, 11, 32, - 225, 137, 87, 11, 32, 223, 41, 87, 11, 32, 225, 112, 87, 11, 23, 32, 6, - 254, 151, 11, 23, 32, 6, 252, 34, 11, 23, 32, 6, 243, 114, 11, 23, 32, 6, - 248, 62, 11, 23, 32, 6, 245, 108, 11, 23, 32, 6, 210, 85, 11, 23, 32, 6, - 245, 71, 11, 23, 32, 6, 216, 180, 11, 23, 32, 6, 235, 192, 11, 23, 32, 6, - 234, 228, 11, 23, 32, 6, 233, 104, 11, 23, 32, 6, 230, 107, 11, 23, 32, - 6, 227, 242, 11, 23, 32, 6, 211, 157, 11, 23, 32, 6, 226, 203, 11, 23, - 32, 6, 225, 111, 11, 23, 32, 6, 223, 40, 11, 23, 32, 6, 216, 181, 87, 11, - 23, 32, 6, 219, 179, 11, 23, 32, 6, 217, 42, 11, 23, 32, 6, 214, 157, 11, - 23, 32, 6, 225, 136, 11, 23, 32, 6, 250, 118, 11, 23, 32, 6, 224, 164, - 11, 23, 32, 6, 226, 205, 11, 23, 32, 229, 226, 11, 23, 32, 4, 254, 151, - 11, 23, 32, 4, 252, 34, 11, 23, 32, 4, 243, 114, 11, 23, 32, 4, 248, 62, - 11, 23, 32, 4, 245, 108, 11, 23, 32, 4, 210, 85, 11, 23, 32, 4, 245, 71, - 11, 23, 32, 4, 216, 180, 11, 23, 32, 4, 235, 192, 11, 23, 32, 4, 234, - 228, 11, 23, 32, 4, 233, 104, 11, 23, 32, 4, 230, 107, 11, 23, 32, 4, - 227, 242, 11, 23, 32, 4, 211, 157, 11, 23, 32, 4, 226, 203, 11, 23, 32, - 4, 225, 111, 11, 23, 32, 4, 223, 40, 11, 23, 32, 4, 40, 219, 179, 11, 23, - 32, 4, 219, 179, 11, 23, 32, 4, 217, 42, 11, 23, 32, 4, 214, 157, 11, 23, - 32, 4, 225, 136, 11, 23, 32, 4, 250, 118, 11, 23, 32, 4, 224, 164, 11, - 23, 32, 4, 226, 205, 11, 23, 32, 226, 1, 247, 241, 11, 23, 32, 245, 109, - 87, 11, 23, 32, 216, 181, 87, 11, 23, 32, 234, 229, 87, 11, 23, 32, 225, - 137, 87, 11, 23, 32, 223, 41, 87, 11, 23, 32, 225, 112, 87, 11, 35, 23, - 6, 254, 151, 11, 35, 23, 6, 252, 34, 11, 35, 23, 6, 243, 114, 11, 35, 23, - 6, 248, 62, 11, 35, 23, 6, 245, 108, 11, 35, 23, 6, 210, 85, 11, 35, 23, - 6, 245, 71, 11, 35, 23, 6, 216, 180, 11, 35, 23, 6, 235, 192, 11, 35, 23, - 6, 234, 228, 11, 35, 23, 6, 233, 104, 11, 35, 23, 6, 230, 107, 11, 35, - 23, 6, 227, 242, 11, 35, 23, 6, 211, 157, 11, 35, 23, 6, 226, 203, 11, - 35, 23, 6, 225, 111, 11, 35, 23, 6, 223, 40, 11, 35, 23, 6, 216, 181, 87, - 11, 35, 23, 6, 219, 179, 11, 35, 23, 6, 217, 42, 11, 35, 23, 6, 214, 157, - 11, 35, 23, 6, 225, 136, 11, 35, 23, 6, 250, 118, 11, 35, 23, 6, 224, - 164, 11, 35, 23, 6, 226, 205, 11, 35, 23, 229, 226, 11, 35, 23, 4, 254, - 151, 11, 35, 23, 4, 252, 34, 11, 35, 23, 4, 243, 114, 11, 35, 23, 4, 248, - 62, 11, 35, 23, 4, 245, 108, 11, 35, 23, 4, 210, 85, 11, 35, 23, 4, 245, - 71, 11, 35, 23, 4, 216, 180, 11, 35, 23, 4, 235, 192, 11, 35, 23, 4, 234, - 228, 11, 35, 23, 4, 233, 104, 11, 35, 23, 4, 230, 107, 11, 35, 23, 4, - 227, 242, 11, 35, 23, 4, 211, 157, 11, 35, 23, 4, 226, 203, 11, 35, 23, - 4, 225, 111, 11, 35, 23, 4, 223, 40, 11, 35, 23, 4, 40, 219, 179, 11, 35, - 23, 4, 219, 179, 11, 35, 23, 4, 217, 42, 11, 35, 23, 4, 214, 157, 11, 35, - 23, 4, 225, 136, 11, 35, 23, 4, 250, 118, 11, 35, 23, 4, 224, 164, 11, - 35, 23, 4, 226, 205, 11, 35, 23, 226, 1, 247, 241, 11, 35, 23, 245, 109, - 87, 11, 35, 23, 216, 181, 87, 11, 35, 23, 234, 229, 87, 11, 35, 23, 225, - 137, 87, 11, 35, 23, 223, 41, 87, 11, 35, 23, 225, 112, 87, 11, 35, 23, - 32, 6, 254, 151, 11, 35, 23, 32, 6, 252, 34, 11, 35, 23, 32, 6, 243, 114, - 11, 35, 23, 32, 6, 248, 62, 11, 35, 23, 32, 6, 245, 108, 11, 35, 23, 32, - 6, 210, 85, 11, 35, 23, 32, 6, 245, 71, 11, 35, 23, 32, 6, 216, 180, 11, - 35, 23, 32, 6, 235, 192, 11, 35, 23, 32, 6, 234, 228, 11, 35, 23, 32, 6, - 233, 104, 11, 35, 23, 32, 6, 230, 107, 11, 35, 23, 32, 6, 227, 242, 11, - 35, 23, 32, 6, 211, 157, 11, 35, 23, 32, 6, 226, 203, 11, 35, 23, 32, 6, - 225, 111, 11, 35, 23, 32, 6, 223, 40, 11, 35, 23, 32, 6, 216, 181, 87, - 11, 35, 23, 32, 6, 219, 179, 11, 35, 23, 32, 6, 217, 42, 11, 35, 23, 32, - 6, 214, 157, 11, 35, 23, 32, 6, 225, 136, 11, 35, 23, 32, 6, 250, 118, - 11, 35, 23, 32, 6, 224, 164, 11, 35, 23, 32, 6, 226, 205, 11, 35, 23, 32, - 229, 226, 11, 35, 23, 32, 4, 254, 151, 11, 35, 23, 32, 4, 252, 34, 11, - 35, 23, 32, 4, 243, 114, 11, 35, 23, 32, 4, 248, 62, 11, 35, 23, 32, 4, - 245, 108, 11, 35, 23, 32, 4, 210, 85, 11, 35, 23, 32, 4, 245, 71, 11, 35, - 23, 32, 4, 216, 180, 11, 35, 23, 32, 4, 235, 192, 11, 35, 23, 32, 4, 234, - 228, 11, 35, 23, 32, 4, 233, 104, 11, 35, 23, 32, 4, 230, 107, 11, 35, - 23, 32, 4, 227, 242, 11, 35, 23, 32, 4, 211, 157, 11, 35, 23, 32, 4, 226, - 203, 11, 35, 23, 32, 4, 225, 111, 11, 35, 23, 32, 4, 223, 40, 11, 35, 23, - 32, 4, 40, 219, 179, 11, 35, 23, 32, 4, 219, 179, 11, 35, 23, 32, 4, 217, - 42, 11, 35, 23, 32, 4, 214, 157, 11, 35, 23, 32, 4, 225, 136, 11, 35, 23, - 32, 4, 250, 118, 11, 35, 23, 32, 4, 224, 164, 11, 35, 23, 32, 4, 226, - 205, 11, 35, 23, 32, 226, 1, 247, 241, 11, 35, 23, 32, 245, 109, 87, 11, - 35, 23, 32, 216, 181, 87, 11, 35, 23, 32, 234, 229, 87, 11, 35, 23, 32, - 225, 137, 87, 11, 35, 23, 32, 223, 41, 87, 11, 35, 23, 32, 225, 112, 87, - 11, 23, 6, 247, 235, 11, 23, 4, 247, 235, 11, 23, 21, 210, 86, 11, 23, - 21, 111, 11, 23, 21, 105, 11, 23, 21, 158, 11, 23, 21, 161, 11, 23, 21, - 190, 11, 23, 21, 195, 11, 23, 21, 199, 11, 23, 21, 196, 11, 23, 21, 201, - 11, 139, 21, 210, 86, 11, 139, 21, 111, 11, 139, 21, 105, 11, 139, 21, - 158, 11, 139, 21, 161, 11, 139, 21, 190, 11, 139, 21, 195, 11, 139, 21, - 199, 11, 139, 21, 196, 11, 139, 21, 201, 11, 35, 21, 210, 86, 11, 35, 21, - 111, 11, 35, 21, 105, 11, 35, 21, 158, 11, 35, 21, 161, 11, 35, 21, 190, - 11, 35, 21, 195, 11, 35, 21, 199, 11, 35, 21, 196, 11, 35, 21, 201, 11, - 35, 23, 21, 210, 86, 11, 35, 23, 21, 111, 11, 35, 23, 21, 105, 11, 35, - 23, 21, 158, 11, 35, 23, 21, 161, 11, 35, 23, 21, 190, 11, 35, 23, 21, - 195, 11, 35, 23, 21, 199, 11, 35, 23, 21, 196, 11, 35, 23, 21, 201, 11, - 230, 143, 21, 210, 86, 11, 230, 143, 21, 111, 11, 230, 143, 21, 105, 11, - 230, 143, 21, 158, 11, 230, 143, 21, 161, 11, 230, 143, 21, 190, 11, 230, - 143, 21, 195, 11, 230, 143, 21, 199, 11, 230, 143, 21, 196, 11, 230, 143, - 21, 201, 9, 11, 254, 179, 9, 11, 252, 62, 9, 11, 235, 129, 9, 11, 248, - 203, 9, 11, 212, 30, 9, 11, 210, 108, 9, 11, 242, 44, 9, 11, 217, 81, 9, - 11, 211, 43, 9, 11, 235, 0, 9, 11, 233, 108, 9, 11, 231, 83, 9, 11, 228, - 67, 9, 11, 221, 168, 9, 11, 254, 205, 9, 11, 244, 150, 9, 11, 222, 28, 9, - 11, 224, 84, 9, 11, 223, 98, 9, 11, 220, 61, 9, 11, 217, 8, 9, 11, 216, - 193, 9, 11, 234, 135, 9, 11, 216, 203, 9, 11, 248, 224, 9, 11, 210, 111, - 9, 11, 242, 251, 9, 11, 247, 127, 252, 62, 9, 11, 247, 127, 228, 67, 9, - 11, 247, 127, 244, 150, 9, 11, 247, 127, 224, 84, 9, 11, 65, 252, 62, 9, - 11, 65, 235, 129, 9, 11, 65, 241, 225, 9, 11, 65, 242, 44, 9, 11, 65, - 211, 43, 9, 11, 65, 235, 0, 9, 11, 65, 233, 108, 9, 11, 65, 231, 83, 9, - 11, 65, 228, 67, 9, 11, 65, 221, 168, 9, 11, 65, 254, 205, 9, 11, 65, - 244, 150, 9, 11, 65, 222, 28, 9, 11, 65, 224, 84, 9, 11, 65, 220, 61, 9, - 11, 65, 217, 8, 9, 11, 65, 216, 193, 9, 11, 65, 234, 135, 9, 11, 65, 248, - 224, 9, 11, 65, 242, 251, 9, 11, 217, 77, 235, 129, 9, 11, 217, 77, 242, - 44, 9, 11, 217, 77, 211, 43, 9, 11, 217, 77, 233, 108, 9, 11, 217, 77, - 228, 67, 9, 11, 217, 77, 221, 168, 9, 11, 217, 77, 254, 205, 9, 11, 217, - 77, 222, 28, 9, 11, 217, 77, 224, 84, 9, 11, 217, 77, 220, 61, 9, 11, - 217, 77, 234, 135, 9, 11, 217, 77, 248, 224, 9, 11, 217, 77, 242, 251, 9, - 11, 217, 77, 247, 127, 228, 67, 9, 11, 217, 77, 247, 127, 224, 84, 9, 11, - 218, 112, 252, 62, 9, 11, 218, 112, 235, 129, 9, 11, 218, 112, 241, 225, - 9, 11, 218, 112, 242, 44, 9, 11, 218, 112, 217, 81, 9, 11, 218, 112, 211, - 43, 9, 11, 218, 112, 235, 0, 9, 11, 218, 112, 231, 83, 9, 11, 218, 112, - 228, 67, 9, 11, 218, 112, 221, 168, 9, 11, 218, 112, 254, 205, 9, 11, - 218, 112, 244, 150, 9, 11, 218, 112, 222, 28, 9, 11, 218, 112, 224, 84, - 9, 11, 218, 112, 220, 61, 9, 11, 218, 112, 217, 8, 9, 11, 218, 112, 216, - 193, 9, 11, 218, 112, 234, 135, 9, 11, 218, 112, 248, 224, 9, 11, 218, - 112, 210, 111, 9, 11, 218, 112, 242, 251, 9, 11, 218, 112, 247, 127, 252, - 62, 9, 11, 218, 112, 247, 127, 244, 150, 9, 11, 232, 128, 254, 179, 9, - 11, 232, 128, 252, 62, 9, 11, 232, 128, 235, 129, 9, 11, 232, 128, 248, - 203, 9, 11, 232, 128, 241, 225, 9, 11, 232, 128, 212, 30, 9, 11, 232, - 128, 210, 108, 9, 11, 232, 128, 242, 44, 9, 11, 232, 128, 217, 81, 9, 11, - 232, 128, 211, 43, 9, 11, 232, 128, 233, 108, 9, 11, 232, 128, 231, 83, - 9, 11, 232, 128, 228, 67, 9, 11, 232, 128, 221, 168, 9, 11, 232, 128, - 254, 205, 9, 11, 232, 128, 244, 150, 9, 11, 232, 128, 222, 28, 9, 11, - 232, 128, 224, 84, 9, 11, 232, 128, 223, 98, 9, 11, 232, 128, 220, 61, 9, - 11, 232, 128, 217, 8, 9, 11, 232, 128, 216, 193, 9, 11, 232, 128, 234, - 135, 9, 11, 232, 128, 216, 203, 9, 11, 232, 128, 248, 224, 9, 11, 232, - 128, 210, 111, 9, 11, 232, 128, 242, 251, 9, 11, 139, 252, 62, 9, 11, - 139, 235, 129, 9, 11, 139, 248, 203, 9, 11, 139, 212, 30, 9, 11, 139, - 210, 108, 9, 11, 139, 242, 44, 9, 11, 139, 217, 81, 9, 11, 139, 211, 43, - 9, 11, 139, 233, 108, 9, 11, 139, 231, 83, 9, 11, 139, 228, 67, 9, 11, - 139, 221, 168, 9, 11, 139, 254, 205, 9, 11, 139, 244, 150, 9, 11, 139, - 222, 28, 9, 11, 139, 224, 84, 9, 11, 139, 223, 98, 9, 11, 139, 220, 61, - 9, 11, 139, 217, 8, 9, 11, 139, 216, 193, 9, 11, 139, 234, 135, 9, 11, - 139, 216, 203, 9, 11, 139, 248, 224, 9, 11, 139, 210, 111, 9, 11, 139, - 242, 251, 9, 11, 226, 172, 66, 2, 122, 2, 217, 44, 9, 11, 226, 172, 122, - 2, 248, 203, 231, 210, 86, 245, 228, 211, 239, 231, 210, 86, 219, 30, - 211, 239, 231, 210, 86, 212, 9, 211, 239, 231, 210, 86, 228, 61, 211, - 239, 231, 210, 86, 223, 114, 246, 104, 231, 210, 86, 242, 134, 246, 104, - 231, 210, 86, 71, 246, 104, 231, 210, 86, 123, 64, 250, 149, 231, 210, - 86, 113, 64, 250, 149, 231, 210, 86, 134, 64, 250, 149, 231, 210, 86, - 244, 19, 64, 250, 149, 231, 210, 86, 244, 89, 64, 250, 149, 231, 210, 86, - 219, 127, 64, 250, 149, 231, 210, 86, 220, 124, 64, 250, 149, 231, 210, - 86, 245, 201, 64, 250, 149, 231, 210, 86, 228, 205, 64, 250, 149, 231, - 210, 86, 123, 64, 252, 161, 231, 210, 86, 113, 64, 252, 161, 231, 210, - 86, 134, 64, 252, 161, 231, 210, 86, 244, 19, 64, 252, 161, 231, 210, 86, - 244, 89, 64, 252, 161, 231, 210, 86, 219, 127, 64, 252, 161, 231, 210, - 86, 220, 124, 64, 252, 161, 231, 210, 86, 245, 201, 64, 252, 161, 231, - 210, 86, 228, 205, 64, 252, 161, 231, 210, 86, 123, 64, 250, 42, 231, - 210, 86, 113, 64, 250, 42, 231, 210, 86, 134, 64, 250, 42, 231, 210, 86, - 244, 19, 64, 250, 42, 231, 210, 86, 244, 89, 64, 250, 42, 231, 210, 86, - 219, 127, 64, 250, 42, 231, 210, 86, 220, 124, 64, 250, 42, 231, 210, 86, - 245, 201, 64, 250, 42, 231, 210, 86, 228, 205, 64, 250, 42, 231, 210, 86, - 225, 28, 231, 210, 86, 226, 160, 231, 210, 86, 252, 162, 231, 210, 86, - 250, 78, 231, 210, 86, 218, 241, 231, 210, 86, 218, 40, 231, 210, 86, - 253, 187, 231, 210, 86, 211, 232, 231, 210, 86, 235, 68, 231, 210, 86, - 252, 192, 131, 86, 203, 252, 192, 131, 86, 241, 50, 131, 86, 241, 49, - 131, 86, 241, 48, 131, 86, 241, 47, 131, 86, 241, 46, 131, 86, 241, 45, - 131, 86, 241, 44, 131, 86, 241, 43, 131, 86, 241, 42, 131, 86, 241, 41, - 131, 86, 241, 40, 131, 86, 241, 39, 131, 86, 241, 38, 131, 86, 241, 37, - 131, 86, 241, 36, 131, 86, 241, 35, 131, 86, 241, 34, 131, 86, 241, 33, - 131, 86, 241, 32, 131, 86, 241, 31, 131, 86, 241, 30, 131, 86, 241, 29, - 131, 86, 241, 28, 131, 86, 241, 27, 131, 86, 241, 26, 131, 86, 241, 25, - 131, 86, 241, 24, 131, 86, 241, 23, 131, 86, 241, 22, 131, 86, 241, 21, - 131, 86, 241, 20, 131, 86, 241, 19, 131, 86, 241, 18, 131, 86, 241, 17, - 131, 86, 241, 16, 131, 86, 241, 15, 131, 86, 241, 14, 131, 86, 241, 13, - 131, 86, 241, 12, 131, 86, 241, 11, 131, 86, 241, 10, 131, 86, 241, 9, - 131, 86, 241, 8, 131, 86, 241, 7, 131, 86, 241, 6, 131, 86, 241, 5, 131, - 86, 241, 4, 131, 86, 241, 3, 131, 86, 241, 2, 131, 86, 67, 252, 192, 131, - 86, 213, 238, 131, 86, 213, 237, 131, 86, 213, 236, 131, 86, 213, 235, - 131, 86, 213, 234, 131, 86, 213, 233, 131, 86, 213, 232, 131, 86, 213, - 231, 131, 86, 213, 230, 131, 86, 213, 229, 131, 86, 213, 228, 131, 86, - 213, 227, 131, 86, 213, 226, 131, 86, 213, 225, 131, 86, 213, 224, 131, - 86, 213, 223, 131, 86, 213, 222, 131, 86, 213, 221, 131, 86, 213, 220, - 131, 86, 213, 219, 131, 86, 213, 218, 131, 86, 213, 217, 131, 86, 213, - 216, 131, 86, 213, 215, 131, 86, 213, 214, 131, 86, 213, 213, 131, 86, - 213, 212, 131, 86, 213, 211, 131, 86, 213, 210, 131, 86, 213, 209, 131, - 86, 213, 208, 131, 86, 213, 207, 131, 86, 213, 206, 131, 86, 213, 205, - 131, 86, 213, 204, 131, 86, 213, 203, 131, 86, 213, 202, 131, 86, 213, - 201, 131, 86, 213, 200, 131, 86, 213, 199, 131, 86, 213, 198, 131, 86, - 213, 197, 131, 86, 213, 196, 131, 86, 213, 195, 131, 86, 213, 194, 131, - 86, 213, 193, 131, 86, 213, 192, 131, 86, 213, 191, 131, 86, 213, 190, - 225, 36, 250, 251, 252, 192, 225, 36, 250, 251, 255, 18, 64, 219, 17, - 225, 36, 250, 251, 113, 64, 219, 17, 225, 36, 250, 251, 134, 64, 219, 17, - 225, 36, 250, 251, 244, 19, 64, 219, 17, 225, 36, 250, 251, 244, 89, 64, - 219, 17, 225, 36, 250, 251, 219, 127, 64, 219, 17, 225, 36, 250, 251, - 220, 124, 64, 219, 17, 225, 36, 250, 251, 245, 201, 64, 219, 17, 225, 36, - 250, 251, 228, 205, 64, 219, 17, 225, 36, 250, 251, 216, 249, 64, 219, - 17, 225, 36, 250, 251, 235, 145, 64, 219, 17, 225, 36, 250, 251, 234, 37, - 64, 219, 17, 225, 36, 250, 251, 224, 18, 64, 219, 17, 225, 36, 250, 251, - 234, 85, 64, 219, 17, 225, 36, 250, 251, 255, 18, 64, 241, 232, 225, 36, - 250, 251, 113, 64, 241, 232, 225, 36, 250, 251, 134, 64, 241, 232, 225, - 36, 250, 251, 244, 19, 64, 241, 232, 225, 36, 250, 251, 244, 89, 64, 241, - 232, 225, 36, 250, 251, 219, 127, 64, 241, 232, 225, 36, 250, 251, 220, - 124, 64, 241, 232, 225, 36, 250, 251, 245, 201, 64, 241, 232, 225, 36, - 250, 251, 228, 205, 64, 241, 232, 225, 36, 250, 251, 216, 249, 64, 241, - 232, 225, 36, 250, 251, 235, 145, 64, 241, 232, 225, 36, 250, 251, 234, - 37, 64, 241, 232, 225, 36, 250, 251, 224, 18, 64, 241, 232, 225, 36, 250, - 251, 234, 85, 64, 241, 232, 225, 36, 250, 251, 255, 18, 64, 247, 255, - 225, 36, 250, 251, 113, 64, 247, 255, 225, 36, 250, 251, 134, 64, 247, - 255, 225, 36, 250, 251, 244, 19, 64, 247, 255, 225, 36, 250, 251, 244, - 89, 64, 247, 255, 225, 36, 250, 251, 219, 127, 64, 247, 255, 225, 36, - 250, 251, 220, 124, 64, 247, 255, 225, 36, 250, 251, 245, 201, 64, 247, - 255, 225, 36, 250, 251, 228, 205, 64, 247, 255, 225, 36, 250, 251, 216, - 249, 64, 247, 255, 225, 36, 250, 251, 235, 145, 64, 247, 255, 225, 36, - 250, 251, 234, 37, 64, 247, 255, 225, 36, 250, 251, 224, 18, 64, 247, - 255, 225, 36, 250, 251, 234, 85, 64, 247, 255, 225, 36, 250, 251, 85, - 235, 68, 225, 36, 250, 251, 255, 18, 64, 249, 250, 225, 36, 250, 251, - 113, 64, 249, 250, 225, 36, 250, 251, 134, 64, 249, 250, 225, 36, 250, - 251, 244, 19, 64, 249, 250, 225, 36, 250, 251, 244, 89, 64, 249, 250, - 225, 36, 250, 251, 219, 127, 64, 249, 250, 225, 36, 250, 251, 220, 124, - 64, 249, 250, 225, 36, 250, 251, 245, 201, 64, 249, 250, 225, 36, 250, - 251, 228, 205, 64, 249, 250, 225, 36, 250, 251, 216, 249, 64, 249, 250, - 225, 36, 250, 251, 235, 145, 64, 249, 250, 225, 36, 250, 251, 234, 37, - 64, 249, 250, 225, 36, 250, 251, 224, 18, 64, 249, 250, 225, 36, 250, - 251, 234, 85, 64, 249, 250, 225, 36, 250, 251, 71, 235, 68, 21, 210, 87, - 243, 236, 218, 131, 21, 210, 87, 249, 227, 21, 123, 249, 227, 21, 113, - 249, 227, 21, 134, 249, 227, 21, 244, 19, 249, 227, 21, 244, 89, 249, - 227, 21, 219, 127, 249, 227, 21, 220, 124, 249, 227, 21, 245, 201, 249, - 227, 21, 228, 205, 249, 227, 88, 7, 6, 1, 61, 88, 7, 6, 1, 253, 166, 88, - 7, 6, 1, 251, 74, 88, 7, 6, 1, 249, 68, 88, 7, 6, 1, 76, 88, 7, 6, 1, - 245, 14, 88, 7, 6, 1, 243, 209, 88, 7, 6, 1, 242, 67, 88, 7, 6, 1, 74, - 88, 7, 6, 1, 235, 150, 88, 7, 6, 1, 235, 29, 88, 7, 6, 1, 156, 88, 7, 6, - 1, 194, 88, 7, 6, 1, 230, 30, 88, 7, 6, 1, 78, 88, 7, 6, 1, 226, 109, 88, - 7, 6, 1, 224, 99, 88, 7, 6, 1, 153, 88, 7, 6, 1, 222, 93, 88, 7, 6, 1, - 217, 153, 88, 7, 6, 1, 69, 88, 7, 6, 1, 214, 105, 88, 7, 6, 1, 212, 98, - 88, 7, 6, 1, 211, 178, 88, 7, 6, 1, 211, 117, 88, 7, 6, 1, 210, 159, 216, - 7, 220, 55, 251, 165, 7, 6, 1, 222, 93, 37, 32, 7, 6, 1, 251, 74, 37, 32, - 7, 6, 1, 153, 37, 250, 199, 37, 211, 180, 92, 7, 6, 1, 61, 92, 7, 6, 1, - 253, 166, 92, 7, 6, 1, 251, 74, 92, 7, 6, 1, 249, 68, 92, 7, 6, 1, 76, - 92, 7, 6, 1, 245, 14, 92, 7, 6, 1, 243, 209, 92, 7, 6, 1, 242, 67, 92, 7, - 6, 1, 74, 92, 7, 6, 1, 235, 150, 92, 7, 6, 1, 235, 29, 92, 7, 6, 1, 156, - 92, 7, 6, 1, 194, 92, 7, 6, 1, 230, 30, 92, 7, 6, 1, 78, 92, 7, 6, 1, - 226, 109, 92, 7, 6, 1, 224, 99, 92, 7, 6, 1, 153, 92, 7, 6, 1, 222, 93, - 92, 7, 6, 1, 217, 153, 92, 7, 6, 1, 69, 92, 7, 6, 1, 214, 105, 92, 7, 6, - 1, 212, 98, 92, 7, 6, 1, 211, 178, 92, 7, 6, 1, 211, 117, 92, 7, 6, 1, - 210, 159, 92, 240, 208, 92, 230, 54, 92, 221, 185, 92, 218, 228, 92, 224, - 221, 92, 212, 23, 152, 37, 7, 6, 1, 61, 152, 37, 7, 6, 1, 253, 166, 152, - 37, 7, 6, 1, 251, 74, 152, 37, 7, 6, 1, 249, 68, 152, 37, 7, 6, 1, 76, - 152, 37, 7, 6, 1, 245, 14, 152, 37, 7, 6, 1, 243, 209, 152, 37, 7, 6, 1, - 242, 67, 152, 37, 7, 6, 1, 74, 152, 37, 7, 6, 1, 235, 150, 152, 37, 7, 6, - 1, 235, 29, 152, 37, 7, 6, 1, 156, 152, 37, 7, 6, 1, 194, 152, 37, 7, 6, - 1, 230, 30, 152, 37, 7, 6, 1, 78, 152, 37, 7, 6, 1, 226, 109, 152, 37, 7, - 6, 1, 224, 99, 152, 37, 7, 6, 1, 153, 152, 37, 7, 6, 1, 222, 93, 152, 37, - 7, 6, 1, 217, 153, 152, 37, 7, 6, 1, 69, 152, 37, 7, 6, 1, 214, 105, 152, - 37, 7, 6, 1, 212, 98, 152, 37, 7, 6, 1, 211, 178, 152, 37, 7, 6, 1, 211, - 117, 152, 37, 7, 6, 1, 210, 159, 223, 160, 231, 102, 50, 223, 160, 231, - 99, 50, 152, 92, 7, 6, 1, 61, 152, 92, 7, 6, 1, 253, 166, 152, 92, 7, 6, - 1, 251, 74, 152, 92, 7, 6, 1, 249, 68, 152, 92, 7, 6, 1, 76, 152, 92, 7, - 6, 1, 245, 14, 152, 92, 7, 6, 1, 243, 209, 152, 92, 7, 6, 1, 242, 67, - 152, 92, 7, 6, 1, 74, 152, 92, 7, 6, 1, 235, 150, 152, 92, 7, 6, 1, 235, - 29, 152, 92, 7, 6, 1, 156, 152, 92, 7, 6, 1, 194, 152, 92, 7, 6, 1, 230, - 30, 152, 92, 7, 6, 1, 78, 152, 92, 7, 6, 1, 226, 109, 152, 92, 7, 6, 1, - 224, 99, 152, 92, 7, 6, 1, 153, 152, 92, 7, 6, 1, 222, 93, 152, 92, 7, 6, - 1, 217, 153, 152, 92, 7, 6, 1, 69, 152, 92, 7, 6, 1, 214, 105, 152, 92, - 7, 6, 1, 212, 98, 152, 92, 7, 6, 1, 211, 178, 152, 92, 7, 6, 1, 211, 117, - 152, 92, 7, 6, 1, 210, 159, 249, 136, 152, 92, 7, 6, 1, 226, 109, 152, - 92, 240, 120, 152, 92, 191, 152, 92, 206, 152, 92, 255, 34, 152, 92, 212, - 23, 42, 247, 172, 92, 250, 31, 92, 249, 178, 92, 244, 4, 92, 240, 112, - 92, 229, 91, 92, 229, 84, 92, 226, 218, 92, 219, 37, 92, 120, 2, 245, 39, - 79, 92, 213, 119, 223, 106, 235, 246, 16, 1, 61, 223, 106, 235, 246, 16, - 1, 253, 166, 223, 106, 235, 246, 16, 1, 251, 74, 223, 106, 235, 246, 16, - 1, 249, 68, 223, 106, 235, 246, 16, 1, 76, 223, 106, 235, 246, 16, 1, - 245, 14, 223, 106, 235, 246, 16, 1, 243, 209, 223, 106, 235, 246, 16, 1, - 242, 67, 223, 106, 235, 246, 16, 1, 74, 223, 106, 235, 246, 16, 1, 235, - 150, 223, 106, 235, 246, 16, 1, 235, 29, 223, 106, 235, 246, 16, 1, 156, - 223, 106, 235, 246, 16, 1, 194, 223, 106, 235, 246, 16, 1, 230, 30, 223, - 106, 235, 246, 16, 1, 78, 223, 106, 235, 246, 16, 1, 226, 109, 223, 106, - 235, 246, 16, 1, 224, 99, 223, 106, 235, 246, 16, 1, 153, 223, 106, 235, - 246, 16, 1, 222, 93, 223, 106, 235, 246, 16, 1, 217, 153, 223, 106, 235, - 246, 16, 1, 69, 223, 106, 235, 246, 16, 1, 214, 105, 223, 106, 235, 246, - 16, 1, 212, 98, 223, 106, 235, 246, 16, 1, 211, 178, 223, 106, 235, 246, - 16, 1, 211, 117, 223, 106, 235, 246, 16, 1, 210, 159, 42, 141, 241, 70, - 92, 56, 234, 24, 92, 56, 206, 92, 10, 214, 177, 238, 57, 92, 10, 214, - 177, 238, 61, 92, 10, 214, 177, 238, 69, 92, 56, 248, 98, 92, 10, 214, - 177, 238, 76, 92, 10, 214, 177, 238, 63, 92, 10, 214, 177, 238, 35, 92, - 10, 214, 177, 238, 62, 92, 10, 214, 177, 238, 75, 92, 10, 214, 177, 238, - 49, 92, 10, 214, 177, 238, 42, 92, 10, 214, 177, 238, 51, 92, 10, 214, - 177, 238, 72, 92, 10, 214, 177, 238, 58, 92, 10, 214, 177, 238, 74, 92, - 10, 214, 177, 238, 50, 92, 10, 214, 177, 238, 73, 92, 10, 214, 177, 238, - 36, 92, 10, 214, 177, 238, 41, 92, 10, 214, 177, 238, 34, 92, 10, 214, - 177, 238, 64, 92, 10, 214, 177, 238, 66, 92, 10, 214, 177, 238, 44, 92, - 10, 214, 177, 238, 55, 92, 10, 214, 177, 238, 53, 92, 10, 214, 177, 238, - 79, 92, 10, 214, 177, 238, 78, 92, 10, 214, 177, 238, 32, 92, 10, 214, - 177, 238, 59, 92, 10, 214, 177, 238, 77, 92, 10, 214, 177, 238, 68, 92, - 10, 214, 177, 238, 54, 92, 10, 214, 177, 238, 33, 92, 10, 214, 177, 238, - 56, 92, 10, 214, 177, 238, 38, 92, 10, 214, 177, 238, 37, 92, 10, 214, - 177, 238, 67, 92, 10, 214, 177, 238, 45, 92, 10, 214, 177, 238, 47, 92, - 10, 214, 177, 238, 48, 92, 10, 214, 177, 238, 40, 92, 10, 214, 177, 238, - 71, 92, 10, 214, 177, 238, 65, 216, 7, 220, 55, 251, 165, 10, 214, 177, - 238, 46, 216, 7, 220, 55, 251, 165, 10, 214, 177, 238, 78, 216, 7, 220, - 55, 251, 165, 10, 214, 177, 238, 76, 216, 7, 220, 55, 251, 165, 10, 214, - 177, 238, 60, 216, 7, 220, 55, 251, 165, 10, 214, 177, 238, 43, 216, 7, - 220, 55, 251, 165, 10, 214, 177, 238, 56, 216, 7, 220, 55, 251, 165, 10, - 214, 177, 238, 39, 216, 7, 220, 55, 251, 165, 10, 214, 177, 238, 70, 216, - 7, 220, 55, 251, 165, 10, 214, 177, 238, 52, 37, 154, 254, 254, 37, 154, - 255, 21, 249, 79, 244, 50, 250, 8, 214, 194, 228, 218, 2, 218, 155, 218, - 34, 115, 230, 119, 218, 33, 250, 34, 253, 215, 246, 62, 218, 32, 115, - 251, 126, 223, 161, 251, 148, 253, 215, 228, 217, 212, 41, 212, 35, 213, - 131, 230, 200, 212, 25, 245, 232, 242, 188, 245, 53, 245, 232, 242, 188, - 254, 136, 245, 232, 242, 188, 253, 233, 242, 188, 2, 231, 56, 166, 230, - 134, 87, 212, 27, 249, 145, 230, 134, 87, 244, 100, 224, 25, 230, 134, - 87, 212, 27, 242, 217, 230, 134, 87, 243, 236, 230, 134, 87, 212, 52, - 242, 217, 230, 134, 87, 233, 86, 224, 25, 230, 134, 87, 212, 52, 249, - 145, 230, 134, 87, 249, 145, 230, 133, 166, 230, 134, 2, 244, 198, 244, - 100, 224, 25, 230, 134, 2, 244, 198, 233, 86, 224, 25, 230, 134, 2, 244, - 198, 243, 236, 230, 134, 2, 244, 198, 218, 39, 2, 244, 198, 242, 186, - 218, 158, 220, 1, 218, 158, 250, 124, 221, 170, 245, 47, 215, 236, 248, - 92, 215, 236, 226, 63, 215, 236, 251, 35, 215, 110, 250, 126, 251, 218, - 222, 193, 241, 186, 218, 37, 251, 218, 245, 236, 64, 231, 199, 245, 236, - 64, 223, 34, 241, 211, 244, 19, 233, 60, 249, 254, 231, 175, 233, 59, - 244, 184, 233, 59, 233, 60, 244, 55, 236, 7, 211, 239, 230, 63, 216, 35, - 253, 199, 242, 150, 231, 72, 212, 39, 217, 58, 233, 32, 252, 157, 225, - 65, 223, 114, 254, 62, 242, 134, 254, 62, 225, 220, 225, 221, 250, 127, - 218, 116, 242, 30, 219, 92, 64, 225, 47, 231, 92, 226, 201, 251, 202, - 224, 232, 233, 42, 223, 35, 249, 150, 223, 35, 252, 167, 249, 181, 223, - 34, 249, 103, 22, 223, 34, 218, 143, 251, 175, 219, 16, 251, 159, 244, 3, - 243, 255, 222, 209, 217, 247, 224, 234, 248, 183, 226, 240, 218, 8, 244, - 0, 219, 232, 244, 99, 251, 29, 2, 217, 240, 248, 43, 219, 54, 240, 119, - 249, 149, 220, 72, 240, 118, 240, 119, 249, 149, 246, 116, 249, 180, 250, - 92, 130, 251, 6, 232, 147, 249, 96, 241, 62, 224, 236, 219, 242, 252, 44, - 251, 171, 224, 237, 64, 244, 41, 249, 179, 244, 32, 22, 234, 38, 217, 20, - 211, 230, 242, 20, 222, 14, 251, 185, 22, 249, 110, 211, 237, 242, 191, - 249, 243, 242, 191, 215, 194, 246, 98, 252, 70, 230, 98, 250, 15, 252, - 70, 230, 97, 252, 195, 251, 184, 223, 36, 211, 201, 224, 198, 251, 243, - 251, 28, 235, 144, 250, 85, 215, 236, 244, 170, 250, 84, 244, 102, 244, - 103, 219, 14, 252, 166, 225, 254, 224, 247, 249, 212, 252, 167, 217, 60, - 215, 236, 249, 136, 244, 75, 225, 66, 248, 89, 235, 137, 247, 139, 250, - 240, 218, 115, 211, 240, 250, 106, 230, 134, 213, 164, 250, 170, 221, - 201, 221, 226, 242, 155, 251, 3, 250, 241, 240, 252, 244, 138, 212, 0, - 222, 202, 249, 244, 244, 94, 225, 5, 22, 244, 98, 230, 232, 230, 113, - 251, 18, 250, 47, 241, 239, 253, 249, 226, 66, 216, 15, 242, 2, 250, 37, - 216, 243, 216, 114, 250, 28, 251, 210, 225, 180, 253, 248, 213, 172, 243, - 117, 247, 205, 241, 163, 219, 86, 231, 239, 251, 253, 243, 118, 247, 248, - 251, 174, 244, 60, 225, 36, 250, 249, 28, 228, 52, 230, 90, 28, 228, 47, - 221, 214, 242, 106, 28, 234, 143, 215, 191, 213, 154, 28, 221, 194, 222, - 126, 220, 13, 2, 221, 229, 216, 245, 223, 181, 22, 252, 167, 219, 107, - 22, 219, 107, 251, 195, 252, 131, 22, 241, 56, 250, 128, 244, 81, 219, - 65, 222, 127, 218, 13, 215, 195, 240, 253, 223, 182, 254, 137, 244, 39, - 222, 138, 244, 39, 217, 242, 240, 242, 251, 127, 240, 242, 2, 243, 101, - 226, 233, 251, 127, 235, 137, 224, 242, 226, 232, 245, 52, 224, 242, 226, - 232, 240, 251, 252, 153, 253, 189, 216, 253, 231, 239, 240, 247, 232, - 117, 240, 247, 249, 184, 218, 127, 221, 200, 248, 51, 218, 127, 244, 188, - 235, 155, 233, 95, 235, 137, 250, 234, 245, 52, 250, 234, 223, 144, 230, - 117, 226, 118, 212, 41, 251, 131, 249, 153, 216, 107, 233, 24, 223, 183, - 250, 232, 246, 104, 249, 143, 212, 3, 219, 72, 219, 70, 240, 252, 223, - 156, 242, 177, 220, 59, 230, 150, 222, 196, 250, 116, 247, 144, 225, 76, - 251, 211, 245, 177, 226, 242, 218, 254, 220, 54, 251, 130, 254, 100, 241, - 61, 233, 127, 252, 68, 244, 98, 215, 194, 244, 98, 251, 217, 215, 91, - 242, 0, 250, 117, 252, 195, 250, 117, 243, 250, 252, 195, 250, 117, 251, - 245, 225, 198, 234, 32, 224, 251, 246, 95, 251, 19, 252, 185, 251, 19, - 247, 138, 230, 118, 244, 198, 249, 154, 244, 198, 216, 108, 244, 198, - 223, 184, 244, 198, 250, 233, 244, 198, 246, 105, 244, 198, 218, 243, - 212, 3, 240, 253, 244, 198, 230, 151, 244, 198, 247, 145, 244, 198, 225, - 77, 244, 198, 243, 253, 244, 198, 242, 27, 244, 198, 211, 224, 244, 198, - 252, 79, 244, 198, 226, 49, 244, 198, 225, 77, 228, 58, 225, 236, 224, - 189, 245, 21, 245, 235, 228, 58, 230, 115, 216, 20, 71, 120, 225, 10, - 252, 190, 235, 249, 71, 124, 225, 10, 252, 190, 235, 249, 71, 43, 225, - 10, 252, 190, 235, 249, 71, 44, 225, 10, 252, 190, 235, 249, 244, 92, - 242, 23, 50, 212, 33, 242, 23, 50, 226, 219, 242, 23, 50, 216, 136, 120, - 50, 216, 136, 124, 50, 250, 27, 242, 18, 50, 204, 242, 18, 50, 249, 131, - 211, 220, 242, 2, 245, 22, 229, 109, 217, 152, 235, 131, 246, 100, 234, - 88, 251, 255, 211, 220, 250, 1, 224, 130, 242, 21, 224, 233, 231, 182, - 220, 6, 253, 211, 220, 6, 241, 171, 220, 6, 211, 220, 221, 242, 211, 220, - 251, 194, 244, 37, 251, 98, 236, 7, 219, 171, 251, 97, 236, 7, 219, 171, - 251, 170, 242, 201, 231, 190, 211, 221, 244, 182, 231, 191, 22, 211, 222, - 241, 67, 242, 17, 113, 231, 64, 241, 67, 242, 17, 113, 211, 219, 241, 67, - 242, 17, 225, 2, 226, 231, 211, 222, 2, 251, 114, 245, 233, 251, 149, 2, - 213, 246, 225, 171, 2, 251, 220, 242, 41, 231, 191, 2, 242, 117, 225, - 112, 231, 179, 231, 191, 2, 215, 98, 226, 212, 231, 190, 226, 212, 211, - 221, 252, 194, 249, 198, 211, 205, 224, 192, 235, 137, 226, 227, 235, - 137, 242, 176, 242, 229, 252, 195, 254, 121, 245, 26, 254, 169, 254, 170, - 230, 141, 236, 12, 219, 102, 235, 239, 248, 42, 225, 170, 242, 112, 248, - 187, 232, 207, 229, 216, 225, 1, 244, 199, 231, 147, 242, 40, 252, 146, - 225, 4, 217, 172, 225, 69, 234, 70, 79, 232, 117, 233, 16, 222, 236, 243, - 61, 218, 133, 234, 69, 251, 179, 249, 156, 2, 241, 234, 212, 19, 252, 77, - 241, 234, 251, 143, 241, 234, 113, 241, 232, 219, 12, 241, 234, 242, 127, - 241, 234, 241, 235, 2, 75, 251, 216, 241, 234, 242, 134, 241, 234, 211, - 42, 241, 234, 224, 131, 241, 234, 241, 235, 2, 223, 36, 223, 47, 241, - 232, 241, 235, 248, 89, 248, 1, 220, 84, 2, 116, 59, 235, 222, 245, 180, - 193, 251, 124, 254, 120, 87, 251, 203, 219, 94, 87, 249, 236, 87, 218, - 248, 217, 249, 87, 246, 93, 248, 165, 87, 225, 70, 64, 224, 252, 244, 69, - 252, 11, 247, 173, 87, 219, 5, 252, 166, 216, 150, 252, 166, 71, 244, 59, - 240, 218, 225, 8, 87, 230, 154, 252, 180, 249, 106, 245, 40, 114, 247, - 140, 50, 249, 147, 250, 250, 252, 152, 2, 211, 40, 50, 252, 152, 2, 247, - 140, 50, 252, 152, 2, 245, 55, 50, 252, 152, 2, 224, 231, 50, 230, 154, - 2, 211, 235, 250, 146, 2, 214, 153, 215, 232, 22, 211, 40, 50, 221, 180, - 225, 169, 249, 216, 251, 147, 230, 191, 244, 64, 247, 193, 226, 165, 247, - 198, 246, 57, 244, 115, 244, 48, 204, 244, 115, 244, 48, 226, 80, 2, 249, - 108, 226, 80, 244, 191, 214, 163, 251, 24, 217, 19, 251, 24, 250, 251, - 235, 249, 250, 146, 2, 214, 153, 215, 231, 250, 146, 2, 246, 112, 215, - 231, 252, 149, 250, 145, 250, 14, 224, 126, 222, 187, 224, 126, 226, 23, - 218, 123, 222, 133, 215, 223, 222, 133, 251, 199, 217, 92, 233, 57, 228, - 50, 228, 51, 2, 248, 88, 249, 155, 250, 8, 251, 200, 204, 251, 200, 242, - 134, 251, 200, 251, 216, 251, 200, 226, 161, 251, 200, 251, 197, 229, - 210, 252, 183, 221, 188, 231, 65, 217, 2, 223, 126, 226, 78, 244, 167, - 231, 239, 221, 225, 254, 97, 224, 148, 255, 5, 232, 119, 250, 135, 231, - 77, 226, 133, 215, 239, 236, 3, 215, 239, 226, 86, 246, 32, 87, 236, 0, - 245, 127, 245, 128, 2, 246, 112, 80, 48, 250, 8, 231, 205, 2, 232, 113, - 244, 81, 250, 8, 231, 205, 2, 223, 160, 244, 81, 204, 231, 205, 2, 223, - 160, 244, 81, 204, 231, 205, 2, 232, 113, 244, 81, 224, 239, 224, 240, - 240, 255, 229, 89, 230, 164, 225, 120, 230, 164, 225, 121, 2, 97, 80, - 253, 215, 233, 52, 213, 175, 230, 163, 230, 164, 225, 121, 226, 234, 228, - 80, 230, 164, 225, 119, 254, 98, 2, 252, 137, 251, 18, 213, 172, 251, 18, - 216, 255, 223, 176, 213, 171, 215, 60, 97, 253, 255, 250, 10, 97, 22, - 140, 204, 250, 44, 253, 255, 250, 10, 97, 22, 140, 204, 250, 44, 254, 0, - 2, 37, 123, 226, 124, 250, 10, 246, 112, 22, 214, 153, 204, 250, 44, 253, - 255, 254, 96, 246, 112, 22, 214, 153, 204, 250, 44, 253, 255, 121, 251, - 146, 87, 125, 251, 146, 87, 219, 9, 2, 251, 12, 91, 219, 8, 219, 9, 2, - 123, 219, 33, 212, 35, 219, 9, 2, 134, 219, 33, 212, 34, 252, 123, 245, - 180, 225, 30, 233, 48, 231, 216, 242, 191, 222, 250, 231, 216, 242, 191, - 232, 158, 2, 235, 232, 225, 202, 250, 8, 232, 158, 2, 234, 144, 234, 144, - 232, 157, 204, 232, 157, 252, 52, 252, 53, 2, 251, 12, 91, 251, 198, 232, - 210, 87, 223, 177, 251, 94, 252, 193, 2, 140, 80, 48, 245, 151, 2, 140, - 80, 48, 226, 201, 2, 245, 39, 164, 2, 43, 44, 80, 48, 219, 41, 2, 97, 80, - 48, 216, 15, 2, 214, 153, 80, 48, 228, 80, 123, 214, 184, 245, 199, 87, - 234, 142, 216, 248, 235, 226, 16, 31, 7, 6, 233, 15, 235, 226, 16, 31, 7, - 4, 233, 15, 235, 226, 16, 31, 227, 203, 235, 226, 16, 31, 217, 184, 235, - 226, 16, 31, 7, 233, 15, 244, 104, 245, 180, 216, 10, 211, 199, 242, 28, - 227, 186, 22, 251, 205, 241, 73, 225, 53, 230, 231, 217, 0, 249, 122, - 252, 167, 219, 127, 225, 12, 218, 159, 2, 230, 229, 247, 128, 235, 137, - 16, 31, 252, 65, 215, 221, 245, 164, 85, 42, 251, 94, 71, 42, 251, 94, - 233, 91, 223, 114, 250, 43, 233, 91, 251, 216, 250, 43, 233, 91, 226, - 161, 248, 0, 233, 91, 251, 216, 248, 0, 4, 226, 161, 248, 0, 4, 251, 216, - 248, 0, 214, 162, 223, 114, 215, 226, 246, 113, 223, 114, 215, 226, 214, - 162, 4, 223, 114, 215, 226, 246, 113, 4, 223, 114, 215, 226, 37, 249, - 139, 224, 255, 249, 139, 225, 0, 2, 242, 33, 51, 249, 139, 224, 255, 228, - 54, 43, 220, 155, 2, 134, 247, 126, 250, 12, 244, 199, 123, 226, 246, - 250, 12, 244, 199, 113, 226, 246, 250, 12, 244, 199, 134, 226, 246, 250, - 12, 244, 199, 244, 19, 226, 246, 250, 12, 244, 199, 244, 89, 226, 246, - 250, 12, 244, 199, 219, 127, 226, 246, 250, 12, 244, 199, 220, 124, 226, - 246, 250, 12, 244, 199, 245, 201, 226, 246, 250, 12, 244, 199, 228, 205, - 226, 246, 250, 12, 244, 199, 216, 249, 226, 246, 250, 12, 244, 199, 245, - 176, 226, 246, 250, 12, 244, 199, 215, 77, 226, 246, 250, 12, 244, 199, - 226, 196, 250, 12, 244, 199, 215, 56, 250, 12, 244, 199, 216, 141, 250, - 12, 244, 199, 244, 15, 250, 12, 244, 199, 244, 87, 250, 12, 244, 199, - 219, 123, 250, 12, 244, 199, 220, 123, 250, 12, 244, 199, 245, 200, 250, - 12, 244, 199, 228, 204, 250, 12, 244, 199, 216, 247, 250, 12, 244, 199, - 245, 174, 250, 12, 244, 199, 215, 75, 230, 122, 243, 237, 216, 37, 216, - 3, 218, 150, 64, 232, 245, 219, 172, 64, 235, 138, 230, 111, 242, 131, - 244, 198, 242, 131, 244, 199, 2, 219, 76, 245, 21, 244, 199, 2, 217, 15, - 64, 235, 59, 219, 76, 244, 199, 2, 204, 230, 115, 219, 76, 244, 199, 2, - 204, 230, 116, 22, 219, 76, 245, 21, 219, 76, 244, 199, 2, 204, 230, 116, - 22, 249, 238, 217, 248, 219, 76, 244, 199, 2, 204, 230, 116, 22, 216, - 105, 245, 21, 219, 76, 244, 199, 2, 242, 32, 219, 76, 244, 199, 2, 240, - 254, 211, 233, 244, 198, 219, 76, 244, 199, 2, 219, 76, 245, 21, 244, - 199, 221, 219, 248, 70, 244, 41, 223, 91, 244, 198, 219, 76, 244, 199, 2, - 241, 233, 245, 21, 219, 76, 244, 199, 2, 218, 35, 219, 75, 244, 198, 229, - 92, 244, 198, 245, 31, 244, 198, 214, 188, 244, 198, 244, 199, 2, 249, - 238, 217, 248, 225, 195, 244, 198, 249, 209, 244, 198, 249, 210, 244, - 198, 234, 68, 244, 198, 244, 199, 216, 138, 116, 234, 69, 234, 68, 244, - 199, 2, 219, 76, 245, 21, 234, 68, 244, 199, 2, 250, 8, 245, 21, 244, - 199, 2, 218, 89, 216, 20, 244, 199, 2, 218, 89, 216, 21, 22, 211, 233, - 245, 23, 244, 199, 2, 218, 89, 216, 21, 22, 216, 105, 245, 21, 247, 200, - 244, 198, 211, 204, 244, 198, 254, 116, 244, 198, 224, 230, 244, 198, - 249, 124, 244, 198, 225, 173, 244, 198, 244, 199, 2, 232, 132, 64, 215, - 205, 247, 200, 251, 96, 223, 91, 244, 198, 243, 247, 244, 199, 2, 204, - 230, 115, 254, 114, 244, 198, 244, 160, 244, 198, 212, 20, 244, 198, 219, - 93, 244, 198, 216, 72, 244, 198, 242, 132, 244, 198, 232, 120, 249, 124, - 244, 198, 244, 199, 2, 204, 230, 115, 240, 210, 244, 198, 244, 199, 2, - 204, 230, 116, 22, 249, 238, 217, 248, 244, 199, 221, 192, 236, 7, 244, - 161, 253, 221, 244, 198, 244, 57, 244, 198, 219, 94, 244, 198, 247, 173, - 244, 198, 244, 199, 211, 230, 230, 115, 244, 199, 2, 231, 89, 231, 149, - 242, 131, 250, 233, 244, 199, 2, 219, 76, 245, 21, 250, 233, 244, 199, 2, - 217, 15, 64, 235, 59, 219, 76, 250, 233, 244, 199, 2, 204, 230, 115, 219, - 76, 250, 233, 244, 199, 2, 241, 233, 245, 21, 250, 233, 244, 199, 2, 211, - 196, 219, 77, 234, 68, 250, 233, 244, 199, 2, 250, 8, 245, 21, 224, 230, - 250, 233, 244, 198, 249, 124, 250, 233, 244, 198, 212, 20, 250, 233, 244, - 198, 244, 199, 2, 228, 80, 242, 170, 243, 41, 244, 199, 2, 226, 219, 243, - 41, 225, 171, 251, 176, 248, 83, 221, 171, 230, 150, 241, 236, 230, 150, - 219, 10, 230, 150, 242, 12, 225, 171, 223, 159, 123, 242, 22, 225, 171, - 223, 159, 251, 186, 242, 18, 236, 7, 250, 187, 225, 171, 243, 246, 225, - 171, 2, 224, 230, 244, 198, 225, 171, 2, 244, 49, 242, 17, 222, 205, 241, - 221, 218, 145, 232, 155, 223, 165, 250, 252, 241, 169, 215, 249, 241, - 169, 215, 250, 2, 251, 122, 228, 58, 215, 249, 231, 37, 193, 223, 166, - 218, 151, 215, 247, 215, 248, 250, 252, 251, 100, 226, 198, 251, 100, - 215, 202, 251, 101, 218, 131, 230, 192, 254, 138, 244, 105, 245, 145, - 225, 2, 250, 252, 226, 198, 225, 2, 250, 252, 217, 33, 226, 198, 217, 33, - 253, 188, 226, 198, 253, 188, 223, 121, 213, 247, 248, 66, 215, 193, 253, - 250, 232, 123, 215, 255, 230, 144, 230, 121, 223, 164, 218, 7, 223, 164, - 230, 121, 251, 36, 254, 238, 215, 246, 220, 18, 222, 184, 219, 3, 203, - 215, 253, 232, 236, 67, 215, 253, 232, 236, 249, 198, 50, 225, 2, 250, - 237, 223, 47, 232, 236, 215, 223, 244, 82, 226, 201, 224, 241, 247, 131, - 228, 80, 245, 133, 50, 219, 74, 87, 228, 80, 219, 74, 87, 224, 125, 232, - 199, 236, 7, 235, 163, 225, 44, 87, 247, 154, 228, 57, 232, 199, 87, 224, - 235, 212, 41, 87, 228, 71, 212, 41, 87, 252, 10, 228, 80, 252, 9, 252, 8, - 230, 121, 252, 8, 225, 216, 228, 80, 225, 215, 250, 108, 249, 132, 231, - 61, 87, 211, 218, 87, 223, 62, 252, 195, 87, 216, 38, 212, 41, 250, 5, - 219, 236, 252, 126, 252, 124, 225, 246, 249, 185, 249, 94, 252, 177, 250, - 30, 43, 232, 95, 108, 16, 31, 224, 6, 108, 16, 31, 254, 201, 108, 16, 31, - 244, 104, 108, 16, 31, 245, 231, 108, 16, 31, 212, 40, 108, 16, 31, 254, - 51, 108, 16, 31, 254, 52, 223, 108, 108, 16, 31, 254, 52, 223, 107, 108, - 16, 31, 254, 52, 213, 143, 108, 16, 31, 254, 52, 213, 142, 108, 16, 31, - 213, 157, 108, 16, 31, 213, 156, 108, 16, 31, 213, 155, 108, 16, 31, 218, - 45, 108, 16, 31, 225, 128, 218, 45, 108, 16, 31, 85, 218, 45, 108, 16, - 31, 231, 60, 218, 72, 108, 16, 31, 231, 60, 218, 71, 108, 16, 31, 231, - 60, 218, 70, 108, 16, 31, 250, 46, 108, 16, 31, 222, 3, 108, 16, 31, 228, - 193, 108, 16, 31, 213, 141, 108, 16, 31, 213, 140, 108, 16, 31, 222, 206, - 222, 3, 108, 16, 31, 222, 206, 222, 2, 108, 16, 31, 242, 173, 108, 16, - 31, 219, 168, 108, 16, 31, 235, 184, 226, 157, 108, 16, 31, 235, 184, - 226, 156, 108, 16, 31, 249, 142, 64, 235, 183, 108, 16, 31, 223, 104, 64, - 235, 183, 108, 16, 31, 249, 176, 226, 157, 108, 16, 31, 235, 182, 226, - 157, 108, 16, 31, 218, 73, 64, 249, 175, 108, 16, 31, 249, 142, 64, 249, - 175, 108, 16, 31, 249, 142, 64, 249, 174, 108, 16, 31, 249, 176, 254, 91, - 108, 16, 31, 222, 4, 64, 249, 176, 254, 91, 108, 16, 31, 218, 73, 64, - 222, 4, 64, 249, 175, 108, 16, 31, 213, 243, 108, 16, 31, 216, 85, 226, - 157, 108, 16, 31, 233, 63, 226, 157, 108, 16, 31, 254, 90, 226, 157, 108, - 16, 31, 218, 73, 64, 254, 89, 108, 16, 31, 222, 4, 64, 254, 89, 108, 16, - 31, 218, 73, 64, 222, 4, 64, 254, 89, 108, 16, 31, 213, 158, 64, 254, 89, - 108, 16, 31, 223, 104, 64, 254, 89, 108, 16, 31, 223, 104, 64, 254, 88, - 108, 16, 31, 223, 103, 108, 16, 31, 223, 102, 108, 16, 31, 223, 101, 108, - 16, 31, 223, 100, 108, 16, 31, 254, 166, 108, 16, 31, 254, 165, 108, 16, - 31, 231, 168, 108, 16, 31, 222, 9, 108, 16, 31, 253, 254, 108, 16, 31, - 223, 128, 108, 16, 31, 223, 127, 108, 16, 31, 253, 191, 108, 16, 31, 251, - 237, 226, 157, 108, 16, 31, 217, 50, 108, 16, 31, 217, 49, 108, 16, 31, - 224, 11, 232, 228, 108, 16, 31, 251, 191, 108, 16, 31, 251, 190, 108, 16, - 31, 251, 189, 108, 16, 31, 254, 146, 108, 16, 31, 226, 222, 108, 16, 31, - 218, 250, 108, 16, 31, 216, 83, 108, 16, 31, 242, 103, 108, 16, 31, 212, - 28, 108, 16, 31, 224, 229, 108, 16, 31, 251, 22, 108, 16, 31, 215, 86, - 108, 16, 31, 250, 254, 230, 127, 108, 16, 31, 221, 204, 64, 235, 61, 108, - 16, 31, 251, 33, 108, 16, 31, 215, 220, 108, 16, 31, 218, 156, 215, 220, - 108, 16, 31, 232, 154, 108, 16, 31, 219, 58, 108, 16, 31, 214, 142, 108, - 16, 31, 240, 253, 246, 72, 108, 16, 31, 253, 235, 108, 16, 31, 224, 237, - 253, 235, 108, 16, 31, 251, 150, 108, 16, 31, 224, 228, 251, 150, 108, - 16, 31, 254, 143, 108, 16, 31, 218, 119, 218, 27, 218, 118, 108, 16, 31, - 218, 119, 218, 27, 218, 117, 108, 16, 31, 218, 69, 108, 16, 31, 224, 203, - 108, 16, 31, 247, 189, 108, 16, 31, 247, 191, 108, 16, 31, 247, 190, 108, - 16, 31, 224, 134, 108, 16, 31, 224, 123, 108, 16, 31, 249, 130, 108, 16, - 31, 249, 129, 108, 16, 31, 249, 128, 108, 16, 31, 249, 127, 108, 16, 31, - 249, 126, 108, 16, 31, 254, 178, 108, 16, 31, 252, 127, 64, 231, 154, - 108, 16, 31, 252, 127, 64, 214, 17, 108, 16, 31, 223, 60, 108, 16, 31, - 240, 245, 108, 16, 31, 228, 217, 108, 16, 31, 248, 153, 108, 16, 31, 230, - 139, 108, 16, 31, 163, 246, 102, 108, 16, 31, 163, 226, 136, 10, 14, 240, - 109, 10, 14, 240, 108, 10, 14, 240, 107, 10, 14, 240, 106, 10, 14, 240, - 105, 10, 14, 240, 104, 10, 14, 240, 103, 10, 14, 240, 102, 10, 14, 240, - 101, 10, 14, 240, 100, 10, 14, 240, 99, 10, 14, 240, 98, 10, 14, 240, 97, - 10, 14, 240, 96, 10, 14, 240, 95, 10, 14, 240, 94, 10, 14, 240, 93, 10, - 14, 240, 92, 10, 14, 240, 91, 10, 14, 240, 90, 10, 14, 240, 89, 10, 14, - 240, 88, 10, 14, 240, 87, 10, 14, 240, 86, 10, 14, 240, 85, 10, 14, 240, - 84, 10, 14, 240, 83, 10, 14, 240, 82, 10, 14, 240, 81, 10, 14, 240, 80, - 10, 14, 240, 79, 10, 14, 240, 78, 10, 14, 240, 77, 10, 14, 240, 76, 10, - 14, 240, 75, 10, 14, 240, 74, 10, 14, 240, 73, 10, 14, 240, 72, 10, 14, - 240, 71, 10, 14, 240, 70, 10, 14, 240, 69, 10, 14, 240, 68, 10, 14, 240, - 67, 10, 14, 240, 66, 10, 14, 240, 65, 10, 14, 240, 64, 10, 14, 240, 63, - 10, 14, 240, 62, 10, 14, 240, 61, 10, 14, 240, 60, 10, 14, 240, 59, 10, - 14, 240, 58, 10, 14, 240, 57, 10, 14, 240, 56, 10, 14, 240, 55, 10, 14, - 240, 54, 10, 14, 240, 53, 10, 14, 240, 52, 10, 14, 240, 51, 10, 14, 240, - 50, 10, 14, 240, 49, 10, 14, 240, 48, 10, 14, 240, 47, 10, 14, 240, 46, - 10, 14, 240, 45, 10, 14, 240, 44, 10, 14, 240, 43, 10, 14, 240, 42, 10, - 14, 240, 41, 10, 14, 240, 40, 10, 14, 240, 39, 10, 14, 240, 38, 10, 14, - 240, 37, 10, 14, 240, 36, 10, 14, 240, 35, 10, 14, 240, 34, 10, 14, 240, - 33, 10, 14, 240, 32, 10, 14, 240, 31, 10, 14, 240, 30, 10, 14, 240, 29, - 10, 14, 240, 28, 10, 14, 240, 27, 10, 14, 240, 26, 10, 14, 240, 25, 10, - 14, 240, 24, 10, 14, 240, 23, 10, 14, 240, 22, 10, 14, 240, 21, 10, 14, - 240, 20, 10, 14, 240, 19, 10, 14, 240, 18, 10, 14, 240, 17, 10, 14, 240, - 16, 10, 14, 240, 15, 10, 14, 240, 14, 10, 14, 240, 13, 10, 14, 240, 12, - 10, 14, 240, 11, 10, 14, 240, 10, 10, 14, 240, 9, 10, 14, 240, 8, 10, 14, - 240, 7, 10, 14, 240, 6, 10, 14, 240, 5, 10, 14, 240, 4, 10, 14, 240, 3, - 10, 14, 240, 2, 10, 14, 240, 1, 10, 14, 240, 0, 10, 14, 239, 255, 10, 14, - 239, 254, 10, 14, 239, 253, 10, 14, 239, 252, 10, 14, 239, 251, 10, 14, - 239, 250, 10, 14, 239, 249, 10, 14, 239, 248, 10, 14, 239, 247, 10, 14, - 239, 246, 10, 14, 239, 245, 10, 14, 239, 244, 10, 14, 239, 243, 10, 14, - 239, 242, 10, 14, 239, 241, 10, 14, 239, 240, 10, 14, 239, 239, 10, 14, - 239, 238, 10, 14, 239, 237, 10, 14, 239, 236, 10, 14, 239, 235, 10, 14, - 239, 234, 10, 14, 239, 233, 10, 14, 239, 232, 10, 14, 239, 231, 10, 14, - 239, 230, 10, 14, 239, 229, 10, 14, 239, 228, 10, 14, 239, 227, 10, 14, - 239, 226, 10, 14, 239, 225, 10, 14, 239, 224, 10, 14, 239, 223, 10, 14, - 239, 222, 10, 14, 239, 221, 10, 14, 239, 220, 10, 14, 239, 219, 10, 14, - 239, 218, 10, 14, 239, 217, 10, 14, 239, 216, 10, 14, 239, 215, 10, 14, - 239, 214, 10, 14, 239, 213, 10, 14, 239, 212, 10, 14, 239, 211, 10, 14, - 239, 210, 10, 14, 239, 209, 10, 14, 239, 208, 10, 14, 239, 207, 10, 14, - 239, 206, 10, 14, 239, 205, 10, 14, 239, 204, 10, 14, 239, 203, 10, 14, - 239, 202, 10, 14, 239, 201, 10, 14, 239, 200, 10, 14, 239, 199, 10, 14, - 239, 198, 10, 14, 239, 197, 10, 14, 239, 196, 10, 14, 239, 195, 10, 14, - 239, 194, 10, 14, 239, 193, 10, 14, 239, 192, 10, 14, 239, 191, 10, 14, - 239, 190, 10, 14, 239, 189, 10, 14, 239, 188, 10, 14, 239, 187, 10, 14, - 239, 186, 10, 14, 239, 185, 10, 14, 239, 184, 10, 14, 239, 183, 10, 14, - 239, 182, 10, 14, 239, 181, 10, 14, 239, 180, 10, 14, 239, 179, 10, 14, - 239, 178, 10, 14, 239, 177, 10, 14, 239, 176, 10, 14, 239, 175, 10, 14, - 239, 174, 10, 14, 239, 173, 10, 14, 239, 172, 10, 14, 239, 171, 10, 14, - 239, 170, 10, 14, 239, 169, 10, 14, 239, 168, 10, 14, 239, 167, 10, 14, - 239, 166, 10, 14, 239, 165, 10, 14, 239, 164, 10, 14, 239, 163, 10, 14, - 239, 162, 10, 14, 239, 161, 10, 14, 239, 160, 10, 14, 239, 159, 10, 14, - 239, 158, 10, 14, 239, 157, 10, 14, 239, 156, 10, 14, 239, 155, 10, 14, - 239, 154, 10, 14, 239, 153, 10, 14, 239, 152, 10, 14, 239, 151, 10, 14, - 239, 150, 10, 14, 239, 149, 10, 14, 239, 148, 10, 14, 239, 147, 10, 14, - 239, 146, 10, 14, 239, 145, 10, 14, 239, 144, 10, 14, 239, 143, 10, 14, - 239, 142, 10, 14, 239, 141, 10, 14, 239, 140, 10, 14, 239, 139, 10, 14, - 239, 138, 10, 14, 239, 137, 10, 14, 239, 136, 10, 14, 239, 135, 10, 14, - 239, 134, 10, 14, 239, 133, 10, 14, 239, 132, 10, 14, 239, 131, 10, 14, - 239, 130, 10, 14, 239, 129, 10, 14, 239, 128, 10, 14, 239, 127, 10, 14, - 239, 126, 10, 14, 239, 125, 10, 14, 239, 124, 10, 14, 239, 123, 10, 14, - 239, 122, 10, 14, 239, 121, 10, 14, 239, 120, 10, 14, 239, 119, 10, 14, - 239, 118, 10, 14, 239, 117, 10, 14, 239, 116, 10, 14, 239, 115, 10, 14, - 239, 114, 10, 14, 239, 113, 10, 14, 239, 112, 10, 14, 239, 111, 10, 14, - 239, 110, 10, 14, 239, 109, 10, 14, 239, 108, 10, 14, 239, 107, 10, 14, - 239, 106, 10, 14, 239, 105, 10, 14, 239, 104, 10, 14, 239, 103, 10, 14, - 239, 102, 10, 14, 239, 101, 10, 14, 239, 100, 10, 14, 239, 99, 10, 14, - 239, 98, 10, 14, 239, 97, 10, 14, 239, 96, 10, 14, 239, 95, 10, 14, 239, - 94, 10, 14, 239, 93, 10, 14, 239, 92, 10, 14, 239, 91, 10, 14, 239, 90, - 10, 14, 239, 89, 10, 14, 239, 88, 10, 14, 239, 87, 10, 14, 239, 86, 10, - 14, 239, 85, 10, 14, 239, 84, 10, 14, 239, 83, 10, 14, 239, 82, 10, 14, - 239, 81, 10, 14, 239, 80, 10, 14, 239, 79, 10, 14, 239, 78, 10, 14, 239, - 77, 10, 14, 239, 76, 10, 14, 239, 75, 10, 14, 239, 74, 10, 14, 239, 73, - 10, 14, 239, 72, 10, 14, 239, 71, 10, 14, 239, 70, 10, 14, 239, 69, 10, - 14, 239, 68, 10, 14, 239, 67, 10, 14, 239, 66, 10, 14, 239, 65, 10, 14, - 239, 64, 10, 14, 239, 63, 10, 14, 239, 62, 10, 14, 239, 61, 10, 14, 239, - 60, 10, 14, 239, 59, 10, 14, 239, 58, 10, 14, 239, 57, 10, 14, 239, 56, - 10, 14, 239, 55, 10, 14, 239, 54, 10, 14, 239, 53, 10, 14, 239, 52, 10, - 14, 239, 51, 10, 14, 239, 50, 10, 14, 239, 49, 10, 14, 239, 48, 10, 14, - 239, 47, 10, 14, 239, 46, 10, 14, 239, 45, 10, 14, 239, 44, 10, 14, 239, - 43, 10, 14, 239, 42, 10, 14, 239, 41, 10, 14, 239, 40, 10, 14, 239, 39, - 10, 14, 239, 38, 10, 14, 239, 37, 10, 14, 239, 36, 10, 14, 239, 35, 10, - 14, 239, 34, 10, 14, 239, 33, 10, 14, 239, 32, 10, 14, 239, 31, 10, 14, - 239, 30, 10, 14, 239, 29, 10, 14, 239, 28, 10, 14, 239, 27, 10, 14, 239, - 26, 10, 14, 239, 25, 10, 14, 239, 24, 10, 14, 239, 23, 10, 14, 239, 22, - 10, 14, 239, 21, 10, 14, 239, 20, 10, 14, 239, 19, 10, 14, 239, 18, 10, - 14, 239, 17, 10, 14, 239, 16, 10, 14, 239, 15, 10, 14, 239, 14, 10, 14, - 239, 13, 10, 14, 239, 12, 10, 14, 239, 11, 10, 14, 239, 10, 10, 14, 239, - 9, 10, 14, 239, 8, 10, 14, 239, 7, 10, 14, 239, 6, 10, 14, 239, 5, 10, - 14, 239, 4, 10, 14, 239, 3, 10, 14, 239, 2, 10, 14, 239, 1, 10, 14, 239, - 0, 10, 14, 238, 255, 10, 14, 238, 254, 10, 14, 238, 253, 10, 14, 238, - 252, 10, 14, 238, 251, 10, 14, 238, 250, 10, 14, 238, 249, 10, 14, 238, - 248, 10, 14, 238, 247, 10, 14, 238, 246, 10, 14, 238, 245, 10, 14, 238, - 244, 10, 14, 238, 243, 10, 14, 238, 242, 10, 14, 238, 241, 10, 14, 238, - 240, 10, 14, 238, 239, 10, 14, 238, 238, 10, 14, 238, 237, 10, 14, 238, - 236, 10, 14, 238, 235, 10, 14, 238, 234, 10, 14, 238, 233, 10, 14, 238, - 232, 10, 14, 238, 231, 10, 14, 238, 230, 10, 14, 238, 229, 10, 14, 238, - 228, 10, 14, 238, 227, 10, 14, 238, 226, 10, 14, 238, 225, 10, 14, 238, - 224, 10, 14, 238, 223, 10, 14, 238, 222, 10, 14, 238, 221, 10, 14, 238, - 220, 10, 14, 238, 219, 10, 14, 238, 218, 10, 14, 238, 217, 10, 14, 238, - 216, 10, 14, 238, 215, 10, 14, 238, 214, 10, 14, 238, 213, 10, 14, 238, - 212, 10, 14, 238, 211, 10, 14, 238, 210, 10, 14, 238, 209, 10, 14, 238, - 208, 10, 14, 238, 207, 10, 14, 238, 206, 10, 14, 238, 205, 10, 14, 238, - 204, 10, 14, 238, 203, 10, 14, 238, 202, 10, 14, 238, 201, 10, 14, 238, - 200, 10, 14, 238, 199, 10, 14, 238, 198, 10, 14, 238, 197, 10, 14, 238, - 196, 10, 14, 238, 195, 10, 14, 238, 194, 10, 14, 238, 193, 10, 14, 238, - 192, 10, 14, 238, 191, 10, 14, 238, 190, 10, 14, 238, 189, 10, 14, 238, - 188, 10, 14, 238, 187, 10, 14, 238, 186, 10, 14, 238, 185, 10, 14, 238, - 184, 10, 14, 238, 183, 10, 14, 238, 182, 10, 14, 238, 181, 10, 14, 238, - 180, 10, 14, 238, 179, 10, 14, 238, 178, 10, 14, 238, 177, 10, 14, 238, - 176, 10, 14, 238, 175, 10, 14, 238, 174, 10, 14, 238, 173, 10, 14, 238, - 172, 10, 14, 238, 171, 10, 14, 238, 170, 10, 14, 238, 169, 10, 14, 238, - 168, 10, 14, 238, 167, 10, 14, 238, 166, 10, 14, 238, 165, 10, 14, 238, - 164, 10, 14, 238, 163, 10, 14, 238, 162, 10, 14, 238, 161, 10, 14, 238, - 160, 10, 14, 238, 159, 10, 14, 238, 158, 10, 14, 238, 157, 10, 14, 238, - 156, 10, 14, 238, 155, 10, 14, 238, 154, 10, 14, 238, 153, 10, 14, 238, - 152, 10, 14, 238, 151, 10, 14, 238, 150, 10, 14, 238, 149, 10, 14, 238, - 148, 10, 14, 238, 147, 10, 14, 238, 146, 10, 14, 238, 145, 10, 14, 238, - 144, 10, 14, 238, 143, 10, 14, 238, 142, 10, 14, 238, 141, 10, 14, 238, - 140, 10, 14, 238, 139, 10, 14, 238, 138, 10, 14, 238, 137, 10, 14, 238, - 136, 10, 14, 238, 135, 10, 14, 238, 134, 10, 14, 238, 133, 10, 14, 238, - 132, 10, 14, 238, 131, 10, 14, 238, 130, 10, 14, 238, 129, 10, 14, 238, - 128, 10, 14, 238, 127, 10, 14, 238, 126, 10, 14, 238, 125, 10, 14, 238, - 124, 10, 14, 238, 123, 10, 14, 238, 122, 10, 14, 238, 121, 10, 14, 238, - 120, 10, 14, 238, 119, 10, 14, 238, 118, 10, 14, 238, 117, 10, 14, 238, - 116, 10, 14, 238, 115, 10, 14, 238, 114, 10, 14, 238, 113, 10, 14, 238, - 112, 10, 14, 238, 111, 10, 14, 238, 110, 10, 14, 238, 109, 10, 14, 238, - 108, 10, 14, 238, 107, 10, 14, 238, 106, 10, 14, 238, 105, 10, 14, 238, - 104, 10, 14, 238, 103, 10, 14, 238, 102, 10, 14, 238, 101, 10, 14, 238, - 100, 10, 14, 238, 99, 10, 14, 238, 98, 10, 14, 238, 97, 10, 14, 238, 96, - 10, 14, 238, 95, 10, 14, 238, 94, 10, 14, 238, 93, 10, 14, 238, 92, 10, - 14, 238, 91, 10, 14, 238, 90, 10, 14, 238, 89, 10, 14, 238, 88, 10, 14, - 238, 87, 10, 14, 238, 86, 10, 14, 238, 85, 10, 14, 238, 84, 10, 14, 238, - 83, 10, 14, 238, 82, 10, 14, 238, 81, 10, 14, 238, 80, 233, 96, 217, 85, - 129, 219, 20, 129, 245, 39, 79, 129, 224, 1, 79, 129, 54, 50, 129, 247, - 140, 50, 129, 225, 185, 50, 129, 254, 134, 129, 254, 65, 129, 43, 226, 7, - 129, 44, 226, 7, 129, 253, 224, 129, 96, 50, 129, 249, 227, 129, 240, - 174, 129, 243, 236, 218, 131, 129, 219, 48, 129, 21, 210, 86, 129, 21, - 111, 129, 21, 105, 129, 21, 158, 129, 21, 161, 129, 21, 190, 129, 21, - 195, 129, 21, 199, 129, 21, 196, 129, 21, 201, 129, 249, 234, 129, 220, - 152, 129, 233, 21, 50, 129, 245, 106, 50, 129, 242, 137, 50, 129, 224, - 16, 79, 129, 249, 225, 253, 214, 129, 7, 6, 1, 61, 129, 7, 6, 1, 253, - 166, 129, 7, 6, 1, 251, 74, 129, 7, 6, 1, 249, 68, 129, 7, 6, 1, 76, 129, - 7, 6, 1, 245, 14, 129, 7, 6, 1, 243, 209, 129, 7, 6, 1, 242, 67, 129, 7, - 6, 1, 74, 129, 7, 6, 1, 235, 150, 129, 7, 6, 1, 235, 29, 129, 7, 6, 1, - 156, 129, 7, 6, 1, 194, 129, 7, 6, 1, 230, 30, 129, 7, 6, 1, 78, 129, 7, - 6, 1, 226, 109, 129, 7, 6, 1, 224, 99, 129, 7, 6, 1, 153, 129, 7, 6, 1, - 222, 93, 129, 7, 6, 1, 217, 153, 129, 7, 6, 1, 69, 129, 7, 6, 1, 214, - 105, 129, 7, 6, 1, 212, 98, 129, 7, 6, 1, 211, 178, 129, 7, 6, 1, 211, - 117, 129, 7, 6, 1, 210, 159, 129, 43, 42, 127, 129, 223, 53, 219, 48, - 129, 44, 42, 127, 129, 250, 39, 255, 23, 129, 121, 232, 219, 129, 242, - 144, 255, 23, 129, 7, 4, 1, 61, 129, 7, 4, 1, 253, 166, 129, 7, 4, 1, - 251, 74, 129, 7, 4, 1, 249, 68, 129, 7, 4, 1, 76, 129, 7, 4, 1, 245, 14, - 129, 7, 4, 1, 243, 209, 129, 7, 4, 1, 242, 67, 129, 7, 4, 1, 74, 129, 7, - 4, 1, 235, 150, 129, 7, 4, 1, 235, 29, 129, 7, 4, 1, 156, 129, 7, 4, 1, - 194, 129, 7, 4, 1, 230, 30, 129, 7, 4, 1, 78, 129, 7, 4, 1, 226, 109, - 129, 7, 4, 1, 224, 99, 129, 7, 4, 1, 153, 129, 7, 4, 1, 222, 93, 129, 7, - 4, 1, 217, 153, 129, 7, 4, 1, 69, 129, 7, 4, 1, 214, 105, 129, 7, 4, 1, - 212, 98, 129, 7, 4, 1, 211, 178, 129, 7, 4, 1, 211, 117, 129, 7, 4, 1, - 210, 159, 129, 43, 249, 107, 127, 129, 67, 232, 219, 129, 44, 249, 107, - 127, 129, 184, 251, 14, 217, 85, 45, 221, 80, 45, 221, 69, 45, 221, 58, - 45, 221, 46, 45, 221, 35, 45, 221, 24, 45, 221, 13, 45, 221, 2, 45, 220, - 247, 45, 220, 239, 45, 220, 238, 45, 220, 237, 45, 220, 236, 45, 220, - 234, 45, 220, 233, 45, 220, 232, 45, 220, 231, 45, 220, 230, 45, 220, - 229, 45, 220, 228, 45, 220, 227, 45, 220, 226, 45, 220, 225, 45, 220, - 223, 45, 220, 222, 45, 220, 221, 45, 220, 220, 45, 220, 219, 45, 220, - 218, 45, 220, 217, 45, 220, 216, 45, 220, 215, 45, 220, 214, 45, 220, - 212, 45, 220, 211, 45, 220, 210, 45, 220, 209, 45, 220, 208, 45, 220, - 207, 45, 220, 206, 45, 220, 205, 45, 220, 204, 45, 220, 203, 45, 220, - 201, 45, 220, 200, 45, 220, 199, 45, 220, 198, 45, 220, 197, 45, 220, - 196, 45, 220, 195, 45, 220, 194, 45, 220, 193, 45, 220, 192, 45, 220, - 190, 45, 220, 189, 45, 220, 188, 45, 220, 187, 45, 220, 186, 45, 220, - 185, 45, 220, 184, 45, 220, 183, 45, 220, 182, 45, 220, 181, 45, 220, - 179, 45, 220, 178, 45, 220, 177, 45, 220, 176, 45, 220, 175, 45, 220, - 174, 45, 220, 173, 45, 220, 172, 45, 220, 171, 45, 220, 170, 45, 220, - 168, 45, 220, 167, 45, 220, 166, 45, 220, 165, 45, 220, 164, 45, 220, - 163, 45, 220, 162, 45, 220, 161, 45, 220, 160, 45, 220, 159, 45, 221, - 156, 45, 221, 155, 45, 221, 154, 45, 221, 153, 45, 221, 152, 45, 221, - 151, 45, 221, 150, 45, 221, 149, 45, 221, 148, 45, 221, 147, 45, 221, - 145, 45, 221, 144, 45, 221, 143, 45, 221, 142, 45, 221, 141, 45, 221, - 140, 45, 221, 139, 45, 221, 138, 45, 221, 137, 45, 221, 136, 45, 221, - 134, 45, 221, 133, 45, 221, 132, 45, 221, 131, 45, 221, 130, 45, 221, - 129, 45, 221, 128, 45, 221, 127, 45, 221, 126, 45, 221, 125, 45, 221, - 123, 45, 221, 122, 45, 221, 121, 45, 221, 120, 45, 221, 119, 45, 221, - 118, 45, 221, 117, 45, 221, 116, 45, 221, 115, 45, 221, 114, 45, 221, - 112, 45, 221, 111, 45, 221, 110, 45, 221, 109, 45, 221, 108, 45, 221, - 107, 45, 221, 106, 45, 221, 105, 45, 221, 104, 45, 221, 103, 45, 221, - 101, 45, 221, 100, 45, 221, 99, 45, 221, 98, 45, 221, 97, 45, 221, 96, - 45, 221, 95, 45, 221, 94, 45, 221, 93, 45, 221, 92, 45, 221, 90, 45, 221, - 89, 45, 221, 88, 45, 221, 87, 45, 221, 86, 45, 221, 85, 45, 221, 84, 45, - 221, 83, 45, 221, 82, 45, 221, 81, 45, 221, 79, 45, 221, 78, 45, 221, 77, - 45, 221, 76, 45, 221, 75, 45, 221, 74, 45, 221, 73, 45, 221, 72, 45, 221, - 71, 45, 221, 70, 45, 221, 68, 45, 221, 67, 45, 221, 66, 45, 221, 65, 45, - 221, 64, 45, 221, 63, 45, 221, 62, 45, 221, 61, 45, 221, 60, 45, 221, 59, - 45, 221, 57, 45, 221, 56, 45, 221, 55, 45, 221, 54, 45, 221, 53, 45, 221, - 52, 45, 221, 51, 45, 221, 50, 45, 221, 49, 45, 221, 48, 45, 221, 45, 45, - 221, 44, 45, 221, 43, 45, 221, 42, 45, 221, 41, 45, 221, 40, 45, 221, 39, - 45, 221, 38, 45, 221, 37, 45, 221, 36, 45, 221, 34, 45, 221, 33, 45, 221, - 32, 45, 221, 31, 45, 221, 30, 45, 221, 29, 45, 221, 28, 45, 221, 27, 45, - 221, 26, 45, 221, 25, 45, 221, 23, 45, 221, 22, 45, 221, 21, 45, 221, 20, - 45, 221, 19, 45, 221, 18, 45, 221, 17, 45, 221, 16, 45, 221, 15, 45, 221, - 14, 45, 221, 12, 45, 221, 11, 45, 221, 10, 45, 221, 9, 45, 221, 8, 45, - 221, 7, 45, 221, 6, 45, 221, 5, 45, 221, 4, 45, 221, 3, 45, 221, 1, 45, - 221, 0, 45, 220, 255, 45, 220, 254, 45, 220, 253, 45, 220, 252, 45, 220, - 251, 45, 220, 250, 45, 220, 249, 45, 220, 248, 45, 220, 246, 45, 220, - 245, 45, 220, 244, 45, 220, 243, 45, 220, 242, 45, 220, 241, 45, 220, - 240, 227, 206, 227, 208, 218, 154, 64, 241, 240, 219, 50, 218, 154, 64, - 216, 213, 218, 86, 245, 151, 64, 216, 213, 245, 64, 245, 151, 64, 215, - 244, 245, 117, 245, 140, 245, 141, 255, 16, 255, 17, 254, 176, 252, 55, - 252, 187, 251, 139, 135, 217, 90, 203, 217, 90, 240, 234, 217, 94, 232, - 220, 244, 153, 166, 232, 219, 245, 151, 64, 232, 219, 233, 6, 228, 140, - 245, 120, 232, 220, 217, 90, 67, 217, 90, 212, 118, 244, 28, 244, 153, - 244, 133, 250, 238, 223, 56, 249, 151, 220, 30, 226, 134, 232, 156, 111, - 219, 60, 220, 30, 236, 6, 232, 156, 210, 86, 219, 193, 248, 159, 232, - 210, 245, 85, 247, 163, 248, 39, 249, 186, 111, 248, 149, 248, 39, 249, - 186, 105, 248, 148, 248, 39, 249, 186, 158, 248, 147, 248, 39, 249, 186, - 161, 248, 146, 152, 255, 16, 229, 214, 217, 178, 236, 69, 217, 181, 245, - 151, 64, 215, 245, 251, 221, 245, 70, 251, 13, 251, 15, 245, 151, 64, - 231, 86, 245, 118, 218, 62, 218, 79, 245, 85, 245, 86, 235, 239, 220, - 140, 161, 244, 115, 220, 139, 243, 245, 235, 239, 220, 140, 158, 242, - 128, 220, 139, 242, 125, 235, 239, 220, 140, 105, 223, 124, 220, 139, - 222, 147, 235, 239, 220, 140, 111, 214, 174, 220, 139, 214, 133, 219, 23, - 248, 71, 248, 73, 226, 82, 250, 150, 226, 84, 125, 226, 244, 224, 196, - 241, 54, 251, 158, 225, 176, 241, 210, 251, 169, 228, 80, 251, 158, 241, - 210, 229, 180, 235, 249, 235, 251, 229, 87, 232, 219, 229, 104, 218, 154, - 64, 221, 160, 254, 26, 218, 225, 245, 151, 64, 221, 160, 254, 26, 245, - 88, 135, 217, 91, 220, 129, 203, 217, 91, 220, 129, 240, 231, 135, 217, - 91, 2, 235, 41, 203, 217, 91, 2, 235, 41, 240, 232, 232, 220, 217, 91, - 220, 129, 67, 217, 91, 220, 129, 212, 117, 226, 1, 232, 220, 244, 22, - 226, 1, 232, 220, 246, 114, 225, 35, 226, 1, 232, 220, 252, 186, 226, 1, - 232, 220, 214, 163, 225, 31, 223, 53, 232, 220, 244, 153, 223, 53, 235, - 249, 223, 38, 219, 157, 220, 30, 105, 219, 154, 218, 227, 219, 157, 220, - 30, 158, 219, 153, 218, 226, 248, 39, 249, 186, 218, 107, 248, 145, 224, - 186, 214, 132, 111, 224, 186, 214, 130, 224, 152, 224, 186, 214, 132, - 105, 224, 186, 214, 129, 224, 151, 220, 130, 215, 243, 218, 153, 218, 90, - 251, 14, 250, 150, 250, 217, 231, 48, 212, 59, 230, 48, 218, 154, 64, - 242, 114, 254, 26, 218, 154, 64, 224, 169, 254, 26, 219, 22, 245, 151, - 64, 242, 114, 254, 26, 245, 151, 64, 224, 169, 254, 26, 245, 115, 218, - 154, 64, 218, 107, 219, 37, 219, 157, 242, 148, 135, 235, 202, 220, 109, - 219, 157, 135, 235, 202, 221, 196, 249, 186, 220, 137, 235, 202, 249, - 121, 218, 108, 216, 237, 218, 170, 226, 173, 217, 168, 249, 226, 226, - 146, 224, 187, 231, 47, 225, 22, 254, 61, 224, 181, 249, 226, 254, 77, - 229, 168, 219, 202, 7, 6, 1, 243, 0, 7, 4, 1, 243, 0, 250, 167, 254, 157, - 183, 218, 68, 249, 235, 219, 108, 233, 52, 165, 1, 232, 181, 209, 209, 1, - 244, 52, 244, 44, 209, 209, 1, 244, 52, 244, 165, 209, 209, 1, 222, 213, - 209, 209, 1, 232, 162, 63, 164, 251, 231, 220, 5, 242, 222, 230, 253, - 223, 44, 243, 223, 243, 222, 243, 221, 230, 50, 209, 251, 209, 252, 209, - 254, 232, 107, 222, 221, 232, 109, 222, 223, 225, 227, 232, 106, 222, - 220, 228, 111, 230, 170, 211, 229, 232, 108, 222, 222, 243, 244, 225, - 226, 212, 15, 245, 170, 243, 233, 230, 234, 226, 201, 214, 134, 87, 230, - 234, 248, 165, 87, 8, 3, 235, 164, 79, 224, 197, 244, 28, 31, 67, 44, 71, - 233, 26, 127, 213, 118, 213, 7, 212, 195, 212, 184, 212, 173, 212, 162, - 212, 151, 212, 140, 212, 129, 213, 117, 213, 106, 213, 95, 213, 84, 213, - 73, 213, 62, 213, 51, 251, 79, 226, 159, 79, 251, 204, 209, 253, 15, 5, - 227, 215, 216, 240, 15, 5, 227, 215, 115, 227, 215, 251, 107, 115, 251, - 106, 49, 28, 16, 243, 243, 219, 104, 250, 81, 214, 9, 213, 40, 213, 29, - 213, 18, 213, 6, 212, 251, 212, 240, 212, 229, 212, 218, 212, 207, 212, - 199, 212, 198, 212, 197, 212, 196, 212, 194, 212, 193, 212, 192, 212, - 191, 212, 190, 212, 189, 212, 188, 212, 187, 212, 186, 212, 185, 212, - 183, 212, 182, 212, 181, 212, 180, 212, 179, 212, 178, 212, 177, 212, - 176, 212, 175, 212, 174, 212, 172, 212, 171, 212, 170, 212, 169, 212, - 168, 212, 167, 212, 166, 212, 165, 212, 164, 212, 163, 212, 161, 212, - 160, 212, 159, 212, 158, 212, 157, 212, 156, 212, 155, 212, 154, 212, - 153, 212, 152, 212, 150, 212, 149, 212, 148, 212, 147, 212, 146, 212, - 145, 212, 144, 212, 143, 212, 142, 212, 141, 212, 139, 212, 138, 212, - 137, 212, 136, 212, 135, 212, 134, 212, 133, 212, 132, 212, 131, 212, - 130, 212, 128, 212, 127, 212, 126, 212, 125, 212, 124, 212, 123, 212, - 122, 212, 121, 212, 120, 212, 119, 213, 116, 213, 115, 213, 114, 213, - 113, 213, 112, 213, 111, 213, 110, 213, 109, 213, 108, 213, 107, 213, - 105, 213, 104, 213, 103, 213, 102, 213, 101, 213, 100, 213, 99, 213, 98, - 213, 97, 213, 96, 213, 94, 213, 93, 213, 92, 213, 91, 213, 90, 213, 89, - 213, 88, 213, 87, 213, 86, 213, 85, 213, 83, 213, 82, 213, 81, 213, 80, - 213, 79, 213, 78, 213, 77, 213, 76, 213, 75, 213, 74, 213, 72, 213, 71, - 213, 70, 213, 69, 213, 68, 213, 67, 213, 66, 213, 65, 213, 64, 213, 63, - 213, 61, 213, 60, 213, 59, 213, 58, 213, 57, 213, 56, 213, 55, 213, 54, - 213, 53, 213, 52, 213, 50, 213, 49, 213, 48, 213, 47, 213, 46, 213, 45, - 213, 44, 213, 43, 213, 42, 213, 41, 213, 39, 213, 38, 213, 37, 213, 36, - 213, 35, 213, 34, 213, 33, 213, 32, 213, 31, 213, 30, 213, 28, 213, 27, - 213, 26, 213, 25, 213, 24, 213, 23, 213, 22, 213, 21, 213, 20, 213, 19, - 213, 17, 213, 16, 213, 15, 213, 14, 213, 13, 213, 12, 213, 11, 213, 10, - 213, 9, 213, 8, 213, 5, 213, 4, 213, 3, 213, 2, 213, 1, 213, 0, 212, 255, - 212, 254, 212, 253, 212, 252, 212, 250, 212, 249, 212, 248, 212, 247, - 212, 246, 212, 245, 212, 244, 212, 243, 212, 242, 212, 241, 212, 239, - 212, 238, 212, 237, 212, 236, 212, 235, 212, 234, 212, 233, 212, 232, - 212, 231, 212, 230, 212, 228, 212, 227, 212, 226, 212, 225, 212, 224, - 212, 223, 212, 222, 212, 221, 212, 220, 212, 219, 212, 217, 212, 216, - 212, 215, 212, 214, 212, 213, 212, 212, 212, 211, 212, 210, 212, 209, - 212, 208, 212, 206, 212, 205, 212, 204, 212, 203, 212, 202, 212, 201, - 212, 200, 7, 6, 1, 116, 2, 231, 238, 22, 242, 143, 7, 4, 1, 116, 2, 231, - 238, 22, 242, 143, 7, 6, 1, 160, 2, 67, 232, 220, 51, 7, 4, 1, 160, 2, - 67, 232, 220, 51, 7, 6, 1, 160, 2, 67, 232, 220, 252, 51, 22, 242, 143, - 7, 4, 1, 160, 2, 67, 232, 220, 252, 51, 22, 242, 143, 7, 6, 1, 160, 2, - 67, 232, 220, 252, 51, 22, 142, 7, 4, 1, 160, 2, 67, 232, 220, 252, 51, - 22, 142, 7, 6, 1, 160, 2, 250, 39, 22, 231, 237, 7, 4, 1, 160, 2, 250, - 39, 22, 231, 237, 7, 6, 1, 160, 2, 250, 39, 22, 250, 242, 7, 4, 1, 160, - 2, 250, 39, 22, 250, 242, 7, 6, 1, 240, 161, 2, 231, 238, 22, 242, 143, - 7, 4, 1, 240, 161, 2, 231, 238, 22, 242, 143, 7, 4, 1, 240, 161, 2, 59, - 72, 22, 142, 7, 4, 1, 229, 85, 2, 216, 90, 48, 7, 6, 1, 144, 2, 67, 232, - 220, 51, 7, 4, 1, 144, 2, 67, 232, 220, 51, 7, 6, 1, 144, 2, 67, 232, - 220, 252, 51, 22, 242, 143, 7, 4, 1, 144, 2, 67, 232, 220, 252, 51, 22, - 242, 143, 7, 6, 1, 144, 2, 67, 232, 220, 252, 51, 22, 142, 7, 4, 1, 144, - 2, 67, 232, 220, 252, 51, 22, 142, 7, 6, 1, 222, 94, 2, 67, 232, 220, 51, - 7, 4, 1, 222, 94, 2, 67, 232, 220, 51, 7, 6, 1, 104, 2, 231, 238, 22, - 242, 143, 7, 4, 1, 104, 2, 231, 238, 22, 242, 143, 7, 6, 1, 116, 2, 226, - 229, 22, 142, 7, 4, 1, 116, 2, 226, 229, 22, 142, 7, 6, 1, 116, 2, 226, - 229, 22, 184, 7, 4, 1, 116, 2, 226, 229, 22, 184, 7, 6, 1, 160, 2, 226, - 229, 22, 142, 7, 4, 1, 160, 2, 226, 229, 22, 142, 7, 6, 1, 160, 2, 226, - 229, 22, 184, 7, 4, 1, 160, 2, 226, 229, 22, 184, 7, 6, 1, 160, 2, 59, - 72, 22, 142, 7, 4, 1, 160, 2, 59, 72, 22, 142, 7, 6, 1, 160, 2, 59, 72, - 22, 184, 7, 4, 1, 160, 2, 59, 72, 22, 184, 7, 4, 1, 240, 161, 2, 59, 72, - 22, 242, 143, 7, 4, 1, 240, 161, 2, 59, 72, 22, 184, 7, 6, 1, 240, 161, - 2, 226, 229, 22, 142, 7, 4, 1, 240, 161, 2, 226, 229, 22, 59, 72, 22, - 142, 7, 6, 1, 240, 161, 2, 226, 229, 22, 184, 7, 4, 1, 240, 161, 2, 226, - 229, 22, 59, 72, 22, 184, 7, 6, 1, 235, 151, 2, 184, 7, 4, 1, 235, 151, - 2, 59, 72, 22, 184, 7, 6, 1, 233, 155, 2, 184, 7, 4, 1, 233, 155, 2, 184, - 7, 6, 1, 232, 55, 2, 184, 7, 4, 1, 232, 55, 2, 184, 7, 6, 1, 223, 227, 2, - 184, 7, 4, 1, 223, 227, 2, 184, 7, 6, 1, 104, 2, 226, 229, 22, 142, 7, 4, - 1, 104, 2, 226, 229, 22, 142, 7, 6, 1, 104, 2, 226, 229, 22, 184, 7, 4, - 1, 104, 2, 226, 229, 22, 184, 7, 6, 1, 104, 2, 231, 238, 22, 142, 7, 4, - 1, 104, 2, 231, 238, 22, 142, 7, 6, 1, 104, 2, 231, 238, 22, 184, 7, 4, - 1, 104, 2, 231, 238, 22, 184, 7, 4, 1, 254, 253, 2, 242, 143, 7, 4, 1, - 204, 144, 2, 242, 143, 7, 4, 1, 204, 144, 2, 142, 7, 4, 1, 215, 94, 214, - 106, 2, 242, 143, 7, 4, 1, 215, 94, 214, 106, 2, 142, 7, 4, 1, 221, 198, - 2, 242, 143, 7, 4, 1, 221, 198, 2, 142, 7, 4, 1, 241, 58, 221, 198, 2, - 242, 143, 7, 4, 1, 241, 58, 221, 198, 2, 142, 9, 220, 137, 77, 2, 182, - 72, 2, 254, 179, 9, 220, 137, 77, 2, 182, 72, 2, 212, 30, 9, 220, 137, - 77, 2, 182, 72, 2, 109, 231, 197, 9, 220, 137, 77, 2, 182, 72, 2, 226, - 238, 9, 220, 137, 77, 2, 182, 72, 2, 69, 9, 220, 137, 77, 2, 182, 72, 2, - 210, 212, 9, 220, 137, 77, 2, 182, 72, 2, 76, 9, 220, 137, 77, 2, 182, - 72, 2, 254, 252, 9, 220, 137, 228, 68, 2, 234, 180, 146, 1, 234, 115, 36, - 117, 235, 29, 36, 117, 229, 84, 36, 117, 251, 74, 36, 117, 227, 171, 36, - 117, 215, 160, 36, 117, 228, 116, 36, 117, 217, 153, 36, 117, 230, 30, - 36, 117, 226, 109, 36, 117, 194, 36, 117, 211, 117, 36, 117, 153, 36, - 117, 156, 36, 117, 214, 105, 36, 117, 232, 182, 36, 117, 232, 191, 36, - 117, 222, 182, 36, 117, 228, 98, 36, 117, 235, 150, 36, 117, 220, 106, - 36, 117, 218, 228, 36, 117, 222, 93, 36, 117, 242, 67, 36, 117, 233, 238, - 36, 3, 235, 16, 36, 3, 234, 98, 36, 3, 234, 89, 36, 3, 233, 223, 36, 3, - 233, 194, 36, 3, 234, 188, 36, 3, 234, 187, 36, 3, 234, 252, 36, 3, 234, - 34, 36, 3, 234, 16, 36, 3, 234, 201, 36, 3, 229, 81, 36, 3, 229, 32, 36, - 3, 229, 28, 36, 3, 228, 253, 36, 3, 228, 246, 36, 3, 229, 69, 36, 3, 229, - 67, 36, 3, 229, 78, 36, 3, 229, 9, 36, 3, 229, 4, 36, 3, 229, 71, 36, 3, - 251, 40, 36, 3, 250, 59, 36, 3, 250, 49, 36, 3, 249, 120, 36, 3, 249, 91, - 36, 3, 250, 198, 36, 3, 250, 190, 36, 3, 251, 30, 36, 3, 249, 246, 36, 3, - 249, 182, 36, 3, 250, 230, 36, 3, 227, 168, 36, 3, 227, 152, 36, 3, 227, - 147, 36, 3, 227, 132, 36, 3, 227, 125, 36, 3, 227, 160, 36, 3, 227, 159, - 36, 3, 227, 165, 36, 3, 227, 138, 36, 3, 227, 136, 36, 3, 227, 163, 36, - 3, 215, 156, 36, 3, 215, 136, 36, 3, 215, 135, 36, 3, 215, 124, 36, 3, - 215, 121, 36, 3, 215, 152, 36, 3, 215, 151, 36, 3, 215, 155, 36, 3, 215, - 134, 36, 3, 215, 133, 36, 3, 215, 154, 36, 3, 228, 114, 36, 3, 228, 100, - 36, 3, 228, 99, 36, 3, 228, 83, 36, 3, 228, 82, 36, 3, 228, 110, 36, 3, - 228, 109, 36, 3, 228, 113, 36, 3, 228, 85, 36, 3, 228, 84, 36, 3, 228, - 112, 36, 3, 217, 102, 36, 3, 216, 118, 36, 3, 216, 104, 36, 3, 215, 119, - 36, 3, 215, 85, 36, 3, 217, 23, 36, 3, 217, 12, 36, 3, 217, 80, 36, 3, - 112, 36, 3, 216, 18, 36, 3, 217, 42, 36, 3, 229, 230, 36, 3, 228, 238, - 36, 3, 228, 213, 36, 3, 227, 242, 36, 3, 227, 183, 36, 3, 229, 112, 36, - 3, 229, 108, 36, 3, 229, 217, 36, 3, 228, 79, 36, 3, 228, 69, 36, 3, 229, - 192, 36, 3, 226, 93, 36, 3, 225, 111, 36, 3, 225, 74, 36, 3, 224, 153, - 36, 3, 224, 122, 36, 3, 225, 224, 36, 3, 225, 214, 36, 3, 226, 75, 36, 3, - 225, 19, 36, 3, 224, 252, 36, 3, 225, 238, 36, 3, 231, 242, 36, 3, 230, - 235, 36, 3, 230, 206, 36, 3, 230, 107, 36, 3, 230, 59, 36, 3, 231, 96, - 36, 3, 231, 85, 36, 3, 231, 208, 36, 3, 230, 166, 36, 3, 230, 137, 36, 3, - 231, 140, 36, 3, 211, 103, 36, 3, 211, 8, 36, 3, 210, 255, 36, 3, 210, - 212, 36, 3, 210, 181, 36, 3, 211, 47, 36, 3, 211, 44, 36, 3, 211, 82, 36, - 3, 210, 244, 36, 3, 210, 229, 36, 3, 211, 55, 36, 3, 223, 187, 36, 3, - 223, 38, 36, 3, 222, 242, 36, 3, 222, 142, 36, 3, 222, 114, 36, 3, 223, - 131, 36, 3, 223, 111, 36, 3, 223, 169, 36, 3, 222, 213, 36, 3, 222, 199, - 36, 3, 223, 139, 36, 3, 233, 140, 36, 3, 232, 247, 36, 3, 232, 233, 36, - 3, 232, 103, 36, 3, 232, 78, 36, 3, 233, 64, 36, 3, 233, 56, 36, 3, 233, - 115, 36, 3, 232, 162, 36, 3, 232, 133, 36, 3, 233, 80, 36, 3, 214, 26, - 36, 3, 213, 176, 36, 3, 213, 162, 36, 3, 212, 116, 36, 3, 212, 109, 36, - 3, 213, 255, 36, 3, 213, 250, 36, 3, 214, 23, 36, 3, 213, 138, 36, 3, - 213, 127, 36, 3, 214, 5, 36, 3, 232, 180, 36, 3, 232, 175, 36, 3, 232, - 174, 36, 3, 232, 171, 36, 3, 232, 170, 36, 3, 232, 177, 36, 3, 232, 176, - 36, 3, 232, 179, 36, 3, 232, 173, 36, 3, 232, 172, 36, 3, 232, 178, 36, - 3, 232, 189, 36, 3, 232, 184, 36, 3, 232, 183, 36, 3, 232, 167, 36, 3, - 232, 166, 36, 3, 232, 186, 36, 3, 232, 185, 36, 3, 232, 188, 36, 3, 232, - 169, 36, 3, 232, 168, 36, 3, 232, 187, 36, 3, 222, 180, 36, 3, 222, 169, - 36, 3, 222, 168, 36, 3, 222, 162, 36, 3, 222, 155, 36, 3, 222, 176, 36, - 3, 222, 175, 36, 3, 222, 179, 36, 3, 222, 167, 36, 3, 222, 166, 36, 3, - 222, 178, 36, 3, 228, 96, 36, 3, 228, 91, 36, 3, 228, 90, 36, 3, 228, 87, - 36, 3, 228, 86, 36, 3, 228, 93, 36, 3, 228, 92, 36, 3, 228, 95, 36, 3, - 228, 89, 36, 3, 228, 88, 36, 3, 228, 94, 36, 3, 235, 146, 36, 3, 235, - 114, 36, 3, 235, 107, 36, 3, 235, 57, 36, 3, 235, 39, 36, 3, 235, 132, - 36, 3, 235, 130, 36, 3, 235, 141, 36, 3, 235, 74, 36, 3, 235, 65, 36, 3, - 235, 135, 36, 3, 220, 100, 36, 3, 220, 34, 36, 3, 220, 29, 36, 3, 219, - 227, 36, 3, 219, 212, 36, 3, 220, 65, 36, 3, 220, 63, 36, 3, 220, 92, 36, - 3, 220, 9, 36, 3, 220, 3, 36, 3, 220, 73, 36, 3, 218, 224, 36, 3, 218, - 194, 36, 3, 218, 190, 36, 3, 218, 181, 36, 3, 218, 178, 36, 3, 218, 199, - 36, 3, 218, 198, 36, 3, 218, 223, 36, 3, 218, 186, 36, 3, 218, 185, 36, - 3, 218, 201, 36, 3, 222, 33, 36, 3, 219, 193, 36, 3, 219, 177, 36, 3, - 218, 84, 36, 3, 218, 5, 36, 3, 221, 183, 36, 3, 221, 172, 36, 3, 222, 19, - 36, 3, 219, 60, 36, 3, 219, 42, 36, 3, 221, 221, 36, 3, 242, 53, 36, 3, - 241, 187, 36, 3, 241, 168, 36, 3, 240, 229, 36, 3, 240, 209, 36, 3, 241, - 245, 36, 3, 241, 227, 36, 3, 242, 43, 36, 3, 241, 75, 36, 3, 241, 60, 36, - 3, 241, 253, 36, 3, 233, 237, 36, 3, 233, 236, 36, 3, 233, 231, 36, 3, - 233, 230, 36, 3, 233, 227, 36, 3, 233, 226, 36, 3, 233, 233, 36, 3, 233, - 232, 36, 3, 233, 235, 36, 3, 233, 229, 36, 3, 233, 228, 36, 3, 233, 234, - 36, 3, 219, 233, 175, 117, 5, 211, 68, 175, 117, 5, 223, 158, 175, 117, - 5, 223, 81, 98, 1, 215, 28, 70, 117, 5, 249, 241, 176, 70, 117, 5, 249, - 241, 234, 138, 70, 117, 5, 249, 241, 234, 34, 70, 117, 5, 249, 241, 234, - 111, 70, 117, 5, 249, 241, 229, 9, 70, 117, 5, 249, 241, 251, 41, 70, - 117, 5, 249, 241, 250, 165, 70, 117, 5, 249, 241, 249, 246, 70, 117, 5, - 249, 241, 250, 94, 70, 117, 5, 249, 241, 227, 138, 70, 117, 5, 249, 241, - 248, 229, 70, 117, 5, 249, 241, 215, 145, 70, 117, 5, 249, 241, 247, 153, - 70, 117, 5, 249, 241, 215, 140, 70, 117, 5, 249, 241, 198, 70, 117, 5, - 249, 241, 217, 106, 70, 117, 5, 249, 241, 216, 209, 70, 117, 5, 249, 241, - 112, 70, 117, 5, 249, 241, 216, 157, 70, 117, 5, 249, 241, 228, 79, 70, - 117, 5, 249, 241, 252, 199, 70, 117, 5, 249, 241, 225, 150, 70, 117, 5, - 249, 241, 225, 19, 70, 117, 5, 249, 241, 225, 124, 70, 117, 5, 249, 241, - 230, 166, 70, 117, 5, 249, 241, 210, 244, 70, 117, 5, 249, 241, 222, 213, - 70, 117, 5, 249, 241, 232, 162, 70, 117, 5, 249, 241, 213, 138, 70, 117, - 5, 249, 241, 220, 104, 70, 117, 5, 249, 241, 218, 225, 70, 117, 5, 249, - 241, 206, 70, 117, 5, 249, 241, 162, 70, 117, 5, 249, 241, 233, 141, 70, - 25, 5, 249, 241, 224, 91, 70, 235, 250, 25, 5, 249, 241, 224, 33, 70, - 235, 250, 25, 5, 249, 241, 222, 102, 70, 235, 250, 25, 5, 249, 241, 222, - 95, 70, 235, 250, 25, 5, 249, 241, 224, 72, 70, 25, 5, 226, 208, 70, 25, - 5, 255, 43, 141, 1, 252, 7, 229, 82, 141, 1, 252, 7, 229, 32, 141, 1, - 252, 7, 228, 253, 141, 1, 252, 7, 229, 69, 141, 1, 252, 7, 229, 9, 56, 1, - 252, 7, 229, 82, 56, 1, 252, 7, 229, 32, 56, 1, 252, 7, 228, 253, 56, 1, - 252, 7, 229, 69, 56, 1, 252, 7, 229, 9, 56, 1, 254, 203, 250, 198, 56, 1, - 254, 203, 215, 119, 56, 1, 254, 203, 112, 56, 1, 254, 203, 226, 109, 58, - 1, 245, 28, 245, 27, 249, 190, 138, 130, 58, 1, 245, 27, 245, 28, 249, - 190, 138, 130, + 0, 214, 153, 242, 168, 83, 219, 180, 83, 43, 53, 245, 35, 53, 221, 131, + 53, 252, 125, 252, 53, 47, 221, 216, 48, 221, 216, 251, 209, 101, 53, + 247, 155, 237, 238, 241, 82, 213, 251, 214, 180, 18, 205, 85, 18, 102, + 18, 105, 18, 142, 18, 139, 18, 168, 18, 184, 18, 195, 18, 193, 18, 200, + 247, 162, 216, 52, 230, 10, 53, 242, 242, 53, 239, 230, 53, 219, 196, 83, + 247, 153, 251, 199, 7, 6, 1, 62, 7, 6, 1, 251, 150, 7, 6, 1, 249, 34, 7, + 6, 1, 246, 240, 7, 6, 1, 75, 7, 6, 1, 242, 139, 7, 6, 1, 241, 55, 7, 6, + 1, 239, 155, 7, 6, 1, 74, 7, 6, 1, 232, 203, 7, 6, 1, 232, 76, 7, 6, 1, + 149, 7, 6, 1, 229, 28, 7, 6, 1, 226, 33, 7, 6, 1, 76, 7, 6, 1, 222, 67, + 7, 6, 1, 220, 27, 7, 6, 1, 137, 7, 6, 1, 182, 7, 6, 1, 213, 10, 7, 6, 1, + 71, 7, 6, 1, 209, 148, 7, 6, 1, 207, 129, 7, 6, 1, 206, 195, 7, 6, 1, + 206, 123, 7, 6, 1, 205, 159, 47, 49, 145, 218, 225, 214, 180, 48, 49, + 145, 247, 228, 253, 21, 114, 229, 205, 239, 237, 253, 21, 7, 5, 1, 62, 7, + 5, 1, 251, 150, 7, 5, 1, 249, 34, 7, 5, 1, 246, 240, 7, 5, 1, 75, 7, 5, + 1, 242, 139, 7, 5, 1, 241, 55, 7, 5, 1, 239, 155, 7, 5, 1, 74, 7, 5, 1, + 232, 203, 7, 5, 1, 232, 76, 7, 5, 1, 149, 7, 5, 1, 229, 28, 7, 5, 1, 226, + 33, 7, 5, 1, 76, 7, 5, 1, 222, 67, 7, 5, 1, 220, 27, 7, 5, 1, 137, 7, 5, + 1, 182, 7, 5, 1, 213, 10, 7, 5, 1, 71, 7, 5, 1, 209, 148, 7, 5, 1, 207, + 129, 7, 5, 1, 206, 195, 7, 5, 1, 206, 123, 7, 5, 1, 205, 159, 47, 247, + 26, 145, 79, 229, 205, 48, 247, 26, 145, 211, 180, 224, 66, 214, 153, + 233, 2, 242, 168, 83, 248, 131, 53, 220, 165, 53, 247, 25, 53, 206, 43, + 53, 249, 111, 134, 217, 77, 53, 245, 166, 247, 94, 53, 242, 9, 222, 118, + 233, 49, 230, 41, 50, 252, 109, 219, 180, 83, 224, 43, 53, 214, 187, 237, + 239, 219, 23, 53, 228, 13, 245, 245, 53, 220, 217, 53, 213, 139, 105, + 213, 139, 142, 253, 9, 253, 21, 226, 252, 53, 221, 12, 53, 226, 247, 245, + 23, 248, 141, 213, 139, 102, 227, 179, 222, 118, 233, 49, 218, 162, 50, + 252, 109, 219, 180, 83, 207, 146, 241, 116, 119, 219, 204, 207, 146, 241, + 116, 119, 239, 121, 207, 146, 241, 116, 129, 219, 202, 233, 2, 219, 196, + 83, 7, 6, 1, 32, 2, 239, 236, 7, 6, 1, 32, 2, 153, 7, 6, 1, 32, 2, 247, + 227, 7, 6, 1, 32, 2, 211, 180, 7, 6, 1, 32, 2, 245, 166, 7, 6, 1, 32, 2, + 218, 149, 52, 7, 6, 1, 252, 248, 7, 6, 1, 249, 35, 2, 248, 141, 7, 6, 1, + 174, 2, 239, 236, 7, 6, 1, 174, 2, 153, 7, 6, 1, 174, 2, 247, 227, 7, 6, + 1, 174, 2, 245, 166, 7, 6, 1, 237, 225, 2, 239, 236, 7, 6, 1, 237, 225, + 2, 153, 7, 6, 1, 237, 225, 2, 247, 227, 7, 6, 1, 237, 225, 2, 245, 166, + 7, 6, 1, 242, 196, 7, 6, 1, 226, 34, 2, 211, 180, 7, 6, 1, 148, 2, 239, + 236, 7, 6, 1, 148, 2, 153, 7, 6, 1, 148, 2, 247, 227, 7, 6, 1, 148, 2, + 211, 180, 7, 6, 1, 148, 2, 245, 166, 226, 94, 53, 7, 6, 1, 148, 2, 91, 7, + 6, 1, 106, 2, 239, 236, 7, 6, 1, 106, 2, 153, 7, 6, 1, 106, 2, 247, 227, + 7, 6, 1, 106, 2, 245, 166, 7, 6, 1, 206, 124, 2, 153, 7, 6, 1, 211, 246, + 7, 5, 1, 215, 228, 182, 7, 5, 1, 32, 2, 239, 236, 7, 5, 1, 32, 2, 153, 7, + 5, 1, 32, 2, 247, 227, 7, 5, 1, 32, 2, 211, 180, 7, 5, 1, 32, 2, 245, + 166, 7, 5, 1, 32, 2, 218, 149, 52, 7, 5, 1, 252, 248, 7, 5, 1, 249, 35, + 2, 248, 141, 7, 5, 1, 174, 2, 239, 236, 7, 5, 1, 174, 2, 153, 7, 5, 1, + 174, 2, 247, 227, 7, 5, 1, 174, 2, 245, 166, 7, 5, 1, 237, 225, 2, 239, + 236, 7, 5, 1, 237, 225, 2, 153, 7, 5, 1, 237, 225, 2, 247, 227, 7, 5, 1, + 237, 225, 2, 245, 166, 7, 5, 1, 242, 196, 7, 5, 1, 226, 34, 2, 211, 180, + 7, 5, 1, 148, 2, 239, 236, 7, 5, 1, 148, 2, 153, 7, 5, 1, 148, 2, 247, + 227, 7, 5, 1, 148, 2, 211, 180, 7, 5, 1, 148, 2, 245, 166, 245, 75, 53, + 7, 5, 1, 148, 2, 91, 7, 5, 1, 106, 2, 239, 236, 7, 5, 1, 106, 2, 153, 7, + 5, 1, 106, 2, 247, 227, 7, 5, 1, 106, 2, 245, 166, 7, 5, 1, 206, 124, 2, + 153, 7, 5, 1, 211, 246, 7, 5, 1, 206, 124, 2, 245, 166, 7, 6, 1, 32, 2, + 228, 13, 7, 5, 1, 32, 2, 228, 13, 7, 6, 1, 32, 2, 249, 122, 7, 5, 1, 32, + 2, 249, 122, 7, 6, 1, 32, 2, 222, 196, 7, 5, 1, 32, 2, 222, 196, 7, 6, 1, + 249, 35, 2, 153, 7, 5, 1, 249, 35, 2, 153, 7, 6, 1, 249, 35, 2, 247, 227, + 7, 5, 1, 249, 35, 2, 247, 227, 7, 6, 1, 249, 35, 2, 67, 52, 7, 5, 1, 249, + 35, 2, 67, 52, 7, 6, 1, 249, 35, 2, 248, 195, 7, 5, 1, 249, 35, 2, 248, + 195, 7, 6, 1, 246, 241, 2, 248, 195, 7, 5, 1, 246, 241, 2, 248, 195, 7, + 6, 1, 246, 241, 2, 91, 7, 5, 1, 246, 241, 2, 91, 7, 6, 1, 174, 2, 228, + 13, 7, 5, 1, 174, 2, 228, 13, 7, 6, 1, 174, 2, 249, 122, 7, 5, 1, 174, 2, + 249, 122, 7, 6, 1, 174, 2, 67, 52, 7, 5, 1, 174, 2, 67, 52, 7, 6, 1, 174, + 2, 222, 196, 7, 5, 1, 174, 2, 222, 196, 7, 6, 1, 174, 2, 248, 195, 7, 5, + 1, 174, 2, 248, 195, 7, 6, 1, 241, 56, 2, 247, 227, 7, 5, 1, 241, 56, 2, + 247, 227, 7, 6, 1, 241, 56, 2, 249, 122, 7, 5, 1, 241, 56, 2, 249, 122, + 7, 6, 1, 241, 56, 2, 67, 52, 7, 5, 1, 241, 56, 2, 67, 52, 7, 6, 1, 241, + 56, 2, 248, 141, 7, 5, 1, 241, 56, 2, 248, 141, 7, 6, 1, 239, 156, 2, + 247, 227, 7, 5, 1, 239, 156, 2, 247, 227, 7, 6, 1, 239, 156, 2, 91, 7, 5, + 1, 239, 156, 2, 91, 7, 6, 1, 237, 225, 2, 211, 180, 7, 5, 1, 237, 225, 2, + 211, 180, 7, 6, 1, 237, 225, 2, 228, 13, 7, 5, 1, 237, 225, 2, 228, 13, + 7, 6, 1, 237, 225, 2, 249, 122, 7, 5, 1, 237, 225, 2, 249, 122, 7, 6, 1, + 237, 225, 2, 222, 196, 7, 5, 1, 237, 225, 2, 222, 196, 7, 6, 1, 237, 225, + 2, 67, 52, 7, 5, 1, 245, 22, 74, 7, 6, 28, 233, 100, 7, 5, 28, 233, 100, + 7, 6, 1, 232, 204, 2, 247, 227, 7, 5, 1, 232, 204, 2, 247, 227, 7, 6, 1, + 232, 77, 2, 248, 141, 7, 5, 1, 232, 77, 2, 248, 141, 7, 5, 1, 231, 2, 7, + 6, 1, 230, 159, 2, 153, 7, 5, 1, 230, 159, 2, 153, 7, 6, 1, 230, 159, 2, + 248, 141, 7, 5, 1, 230, 159, 2, 248, 141, 7, 6, 1, 230, 159, 2, 248, 195, + 7, 5, 1, 230, 159, 2, 248, 195, 7, 6, 1, 230, 159, 2, 226, 247, 245, 23, + 7, 5, 1, 230, 159, 2, 226, 247, 245, 23, 7, 6, 1, 230, 159, 2, 91, 7, 5, + 1, 230, 159, 2, 91, 7, 6, 1, 226, 34, 2, 153, 7, 5, 1, 226, 34, 2, 153, + 7, 6, 1, 226, 34, 2, 248, 141, 7, 5, 1, 226, 34, 2, 248, 141, 7, 6, 1, + 226, 34, 2, 248, 195, 7, 5, 1, 226, 34, 2, 248, 195, 7, 5, 1, 226, 34, + 220, 141, 249, 46, 252, 53, 7, 6, 1, 243, 28, 7, 5, 1, 243, 28, 7, 6, 1, + 148, 2, 228, 13, 7, 5, 1, 148, 2, 228, 13, 7, 6, 1, 148, 2, 249, 122, 7, + 5, 1, 148, 2, 249, 122, 7, 6, 1, 148, 2, 50, 153, 7, 5, 1, 148, 2, 50, + 153, 7, 6, 28, 222, 206, 7, 5, 28, 222, 206, 7, 6, 1, 219, 150, 2, 153, + 7, 5, 1, 219, 150, 2, 153, 7, 6, 1, 219, 150, 2, 248, 141, 7, 5, 1, 219, + 150, 2, 248, 141, 7, 6, 1, 219, 150, 2, 248, 195, 7, 5, 1, 219, 150, 2, + 248, 195, 7, 6, 1, 218, 1, 2, 153, 7, 5, 1, 218, 1, 2, 153, 7, 6, 1, 218, + 1, 2, 247, 227, 7, 5, 1, 218, 1, 2, 247, 227, 7, 6, 1, 218, 1, 2, 248, + 141, 7, 5, 1, 218, 1, 2, 248, 141, 7, 6, 1, 218, 1, 2, 248, 195, 7, 5, 1, + 218, 1, 2, 248, 195, 7, 6, 1, 213, 11, 2, 248, 141, 7, 5, 1, 213, 11, 2, + 248, 141, 7, 6, 1, 213, 11, 2, 248, 195, 7, 5, 1, 213, 11, 2, 248, 195, + 7, 6, 1, 213, 11, 2, 91, 7, 5, 1, 213, 11, 2, 91, 7, 6, 1, 106, 2, 211, + 180, 7, 5, 1, 106, 2, 211, 180, 7, 6, 1, 106, 2, 228, 13, 7, 5, 1, 106, + 2, 228, 13, 7, 6, 1, 106, 2, 249, 122, 7, 5, 1, 106, 2, 249, 122, 7, 6, + 1, 106, 2, 218, 149, 52, 7, 5, 1, 106, 2, 218, 149, 52, 7, 6, 1, 106, 2, + 50, 153, 7, 5, 1, 106, 2, 50, 153, 7, 6, 1, 106, 2, 222, 196, 7, 5, 1, + 106, 2, 222, 196, 7, 6, 1, 207, 130, 2, 247, 227, 7, 5, 1, 207, 130, 2, + 247, 227, 7, 6, 1, 206, 124, 2, 247, 227, 7, 5, 1, 206, 124, 2, 247, 227, + 7, 6, 1, 206, 124, 2, 245, 166, 7, 6, 1, 205, 160, 2, 153, 7, 5, 1, 205, + 160, 2, 153, 7, 6, 1, 205, 160, 2, 67, 52, 7, 5, 1, 205, 160, 2, 67, 52, + 7, 6, 1, 205, 160, 2, 248, 195, 7, 5, 1, 205, 160, 2, 248, 195, 7, 5, 1, + 152, 182, 7, 5, 1, 63, 2, 91, 7, 6, 1, 63, 2, 109, 7, 6, 1, 63, 2, 211, + 99, 7, 5, 1, 63, 2, 211, 99, 7, 6, 1, 135, 184, 7, 5, 1, 135, 184, 7, 6, + 1, 222, 142, 76, 7, 6, 1, 249, 35, 2, 109, 7, 5, 1, 249, 35, 2, 109, 7, + 6, 1, 252, 223, 246, 240, 7, 6, 1, 246, 241, 2, 109, 7, 6, 1, 246, 241, + 2, 211, 99, 7, 5, 1, 246, 241, 2, 211, 99, 7, 5, 1, 201, 245, 227, 7, 6, + 1, 218, 224, 75, 7, 6, 1, 217, 100, 7, 6, 1, 222, 142, 75, 7, 6, 1, 242, + 140, 2, 109, 7, 5, 1, 242, 140, 2, 109, 7, 6, 1, 241, 56, 2, 109, 7, 6, + 1, 240, 215, 7, 5, 1, 238, 17, 7, 6, 1, 232, 249, 7, 6, 1, 237, 225, 2, + 91, 7, 6, 1, 232, 77, 2, 109, 7, 5, 1, 232, 77, 2, 109, 7, 5, 1, 230, + 159, 2, 134, 7, 5, 1, 230, 104, 2, 91, 7, 6, 1, 201, 229, 28, 7, 6, 1, + 226, 34, 2, 47, 109, 7, 5, 1, 226, 34, 2, 152, 48, 230, 34, 7, 6, 1, 148, + 2, 226, 247, 211, 180, 7, 6, 1, 148, 2, 238, 69, 7, 5, 1, 148, 2, 238, + 69, 7, 6, 1, 222, 191, 7, 5, 1, 222, 191, 7, 6, 1, 222, 68, 2, 109, 7, 5, + 1, 222, 68, 2, 109, 7, 1, 205, 216, 7, 6, 1, 135, 105, 7, 5, 1, 135, 105, + 7, 6, 1, 242, 215, 7, 1, 218, 224, 242, 216, 229, 111, 7, 5, 1, 213, 11, + 2, 222, 26, 109, 7, 6, 1, 213, 11, 2, 109, 7, 5, 1, 213, 11, 2, 109, 7, + 6, 1, 213, 11, 2, 218, 230, 109, 7, 6, 1, 106, 2, 238, 69, 7, 5, 1, 106, + 2, 238, 69, 7, 6, 1, 209, 200, 7, 6, 1, 209, 149, 2, 109, 7, 6, 1, 206, + 124, 2, 109, 7, 5, 1, 206, 124, 2, 109, 7, 6, 1, 205, 160, 2, 91, 7, 5, + 1, 205, 160, 2, 91, 7, 6, 1, 242, 141, 7, 6, 1, 242, 142, 218, 223, 7, 5, + 1, 242, 142, 218, 223, 7, 5, 1, 242, 142, 2, 212, 191, 7, 1, 118, 2, 91, + 7, 6, 1, 135, 168, 7, 5, 1, 135, 168, 7, 1, 233, 2, 240, 25, 213, 252, 2, + 91, 7, 1, 206, 198, 7, 1, 245, 220, 247, 203, 7, 1, 230, 78, 247, 203, 7, + 1, 252, 137, 247, 203, 7, 1, 218, 230, 247, 203, 7, 6, 1, 243, 198, 2, + 248, 195, 7, 6, 1, 246, 241, 2, 5, 1, 205, 160, 2, 248, 195, 7, 5, 1, + 243, 198, 2, 248, 195, 7, 6, 1, 229, 176, 7, 6, 1, 230, 159, 2, 5, 1, + 232, 203, 7, 5, 1, 229, 176, 7, 6, 1, 224, 181, 7, 6, 1, 226, 34, 2, 5, + 1, 232, 203, 7, 5, 1, 224, 181, 7, 6, 1, 32, 2, 248, 195, 7, 5, 1, 32, 2, + 248, 195, 7, 6, 1, 237, 225, 2, 248, 195, 7, 5, 1, 237, 225, 2, 248, 195, + 7, 6, 1, 148, 2, 248, 195, 7, 5, 1, 148, 2, 248, 195, 7, 6, 1, 106, 2, + 248, 195, 7, 5, 1, 106, 2, 248, 195, 7, 6, 1, 106, 2, 245, 167, 23, 228, + 13, 7, 5, 1, 106, 2, 245, 167, 23, 228, 13, 7, 6, 1, 106, 2, 245, 167, + 23, 153, 7, 5, 1, 106, 2, 245, 167, 23, 153, 7, 6, 1, 106, 2, 245, 167, + 23, 248, 195, 7, 5, 1, 106, 2, 245, 167, 23, 248, 195, 7, 6, 1, 106, 2, + 245, 167, 23, 239, 236, 7, 5, 1, 106, 2, 245, 167, 23, 239, 236, 7, 5, 1, + 201, 75, 7, 6, 1, 32, 2, 245, 167, 23, 228, 13, 7, 5, 1, 32, 2, 245, 167, + 23, 228, 13, 7, 6, 1, 32, 2, 67, 84, 23, 228, 13, 7, 5, 1, 32, 2, 67, 84, + 23, 228, 13, 7, 6, 1, 252, 249, 2, 228, 13, 7, 5, 1, 252, 249, 2, 228, + 13, 7, 6, 1, 241, 56, 2, 91, 7, 5, 1, 241, 56, 2, 91, 7, 6, 1, 241, 56, + 2, 248, 195, 7, 5, 1, 241, 56, 2, 248, 195, 7, 6, 1, 232, 77, 2, 248, + 195, 7, 5, 1, 232, 77, 2, 248, 195, 7, 6, 1, 148, 2, 222, 196, 7, 5, 1, + 148, 2, 222, 196, 7, 6, 1, 148, 2, 222, 197, 23, 228, 13, 7, 5, 1, 148, + 2, 222, 197, 23, 228, 13, 7, 6, 1, 242, 142, 2, 248, 195, 7, 5, 1, 242, + 142, 2, 248, 195, 7, 5, 1, 232, 204, 2, 248, 195, 7, 6, 1, 243, 197, 7, + 6, 1, 246, 241, 2, 5, 1, 205, 159, 7, 5, 1, 243, 197, 7, 6, 1, 241, 56, + 2, 153, 7, 5, 1, 241, 56, 2, 153, 7, 6, 1, 238, 14, 7, 6, 1, 206, 198, 7, + 6, 1, 226, 34, 2, 239, 236, 7, 5, 1, 226, 34, 2, 239, 236, 7, 6, 1, 32, + 2, 218, 149, 84, 23, 153, 7, 5, 1, 32, 2, 218, 149, 84, 23, 153, 7, 6, 1, + 252, 249, 2, 153, 7, 5, 1, 252, 249, 2, 153, 7, 6, 1, 148, 2, 213, 225, + 23, 153, 7, 5, 1, 148, 2, 213, 225, 23, 153, 7, 6, 1, 32, 2, 50, 239, + 236, 7, 5, 1, 32, 2, 50, 239, 236, 7, 6, 1, 32, 2, 233, 2, 249, 122, 7, + 5, 1, 32, 2, 233, 2, 249, 122, 7, 6, 1, 174, 2, 50, 239, 236, 7, 5, 1, + 174, 2, 50, 239, 236, 7, 6, 1, 174, 2, 233, 2, 249, 122, 7, 5, 1, 174, 2, + 233, 2, 249, 122, 7, 6, 1, 237, 225, 2, 50, 239, 236, 7, 5, 1, 237, 225, + 2, 50, 239, 236, 7, 6, 1, 237, 225, 2, 233, 2, 249, 122, 7, 5, 1, 237, + 225, 2, 233, 2, 249, 122, 7, 6, 1, 148, 2, 50, 239, 236, 7, 5, 1, 148, 2, + 50, 239, 236, 7, 6, 1, 148, 2, 233, 2, 249, 122, 7, 5, 1, 148, 2, 233, 2, + 249, 122, 7, 6, 1, 219, 150, 2, 50, 239, 236, 7, 5, 1, 219, 150, 2, 50, + 239, 236, 7, 6, 1, 219, 150, 2, 233, 2, 249, 122, 7, 5, 1, 219, 150, 2, + 233, 2, 249, 122, 7, 6, 1, 106, 2, 50, 239, 236, 7, 5, 1, 106, 2, 50, + 239, 236, 7, 6, 1, 106, 2, 233, 2, 249, 122, 7, 5, 1, 106, 2, 233, 2, + 249, 122, 7, 6, 1, 218, 1, 2, 247, 156, 55, 7, 5, 1, 218, 1, 2, 247, 156, + 55, 7, 6, 1, 213, 11, 2, 247, 156, 55, 7, 5, 1, 213, 11, 2, 247, 156, 55, + 7, 6, 1, 205, 234, 7, 5, 1, 205, 234, 7, 6, 1, 239, 156, 2, 248, 195, 7, + 5, 1, 239, 156, 2, 248, 195, 7, 6, 1, 226, 34, 2, 152, 48, 230, 34, 7, 5, + 1, 246, 241, 2, 247, 27, 7, 6, 1, 222, 97, 7, 5, 1, 222, 97, 7, 6, 1, + 205, 160, 2, 109, 7, 5, 1, 205, 160, 2, 109, 7, 6, 1, 32, 2, 67, 52, 7, + 5, 1, 32, 2, 67, 52, 7, 6, 1, 174, 2, 248, 141, 7, 5, 1, 174, 2, 248, + 141, 7, 6, 1, 148, 2, 245, 167, 23, 228, 13, 7, 5, 1, 148, 2, 245, 167, + 23, 228, 13, 7, 6, 1, 148, 2, 211, 181, 23, 228, 13, 7, 5, 1, 148, 2, + 211, 181, 23, 228, 13, 7, 6, 1, 148, 2, 67, 52, 7, 5, 1, 148, 2, 67, 52, + 7, 6, 1, 148, 2, 67, 84, 23, 228, 13, 7, 5, 1, 148, 2, 67, 84, 23, 228, + 13, 7, 6, 1, 206, 124, 2, 228, 13, 7, 5, 1, 206, 124, 2, 228, 13, 7, 5, + 1, 230, 159, 2, 247, 27, 7, 5, 1, 226, 34, 2, 247, 27, 7, 5, 1, 213, 11, + 2, 247, 27, 7, 5, 1, 245, 22, 232, 203, 7, 5, 1, 246, 64, 245, 127, 7, 5, + 1, 219, 215, 245, 127, 7, 6, 1, 32, 2, 91, 7, 6, 1, 249, 35, 2, 91, 7, 5, + 1, 249, 35, 2, 91, 7, 6, 1, 230, 159, 2, 134, 7, 6, 1, 213, 11, 2, 245, + 163, 91, 7, 5, 1, 218, 1, 2, 213, 109, 212, 191, 7, 5, 1, 205, 160, 2, + 213, 109, 212, 191, 7, 6, 1, 240, 25, 213, 251, 7, 5, 1, 240, 25, 213, + 251, 7, 6, 1, 63, 2, 91, 7, 6, 1, 106, 134, 7, 6, 1, 201, 209, 148, 7, 6, + 1, 174, 2, 91, 7, 5, 1, 174, 2, 91, 7, 6, 1, 232, 204, 2, 91, 7, 5, 1, + 232, 204, 2, 91, 7, 6, 1, 5, 220, 28, 2, 238, 130, 212, 191, 7, 5, 1, + 220, 28, 2, 238, 130, 212, 191, 7, 6, 1, 219, 150, 2, 91, 7, 5, 1, 219, + 150, 2, 91, 7, 6, 1, 206, 124, 2, 91, 7, 5, 1, 206, 124, 2, 91, 7, 5, 1, + 201, 62, 7, 5, 1, 252, 144, 7, 5, 1, 201, 252, 144, 7, 5, 1, 63, 2, 109, + 7, 5, 1, 222, 142, 76, 7, 5, 1, 249, 35, 2, 247, 27, 7, 5, 1, 246, 241, + 2, 212, 191, 7, 5, 1, 246, 241, 2, 109, 7, 5, 1, 218, 224, 75, 7, 5, 1, + 217, 100, 7, 5, 1, 217, 101, 2, 109, 7, 5, 1, 222, 142, 75, 7, 5, 1, 218, + 224, 222, 142, 75, 7, 5, 1, 218, 224, 222, 142, 174, 2, 109, 7, 5, 1, + 247, 192, 218, 224, 222, 142, 75, 7, 5, 1, 245, 22, 232, 204, 2, 91, 7, + 5, 1, 241, 56, 2, 109, 7, 5, 1, 121, 241, 55, 7, 1, 5, 6, 241, 55, 7, 5, + 1, 240, 215, 7, 5, 1, 219, 75, 238, 69, 7, 5, 1, 201, 239, 155, 7, 5, 1, + 239, 156, 2, 109, 7, 5, 1, 239, 40, 2, 109, 7, 5, 1, 237, 225, 2, 91, 7, + 5, 1, 232, 249, 7, 1, 5, 6, 74, 7, 5, 1, 230, 159, 2, 226, 247, 211, 180, + 7, 5, 1, 230, 159, 2, 250, 24, 7, 5, 1, 230, 159, 2, 218, 230, 109, 7, 5, + 1, 229, 251, 7, 5, 1, 201, 229, 28, 7, 5, 1, 201, 229, 29, 2, 152, 230, + 34, 7, 5, 1, 229, 29, 2, 109, 7, 5, 1, 226, 34, 2, 47, 109, 7, 5, 1, 226, + 34, 2, 218, 230, 109, 7, 1, 5, 6, 226, 33, 7, 5, 1, 250, 123, 76, 7, 1, + 5, 6, 222, 206, 7, 5, 1, 247, 192, 222, 170, 7, 5, 1, 221, 78, 7, 5, 1, + 201, 137, 7, 5, 1, 201, 219, 150, 2, 152, 230, 34, 7, 5, 1, 201, 219, + 150, 2, 109, 7, 5, 1, 219, 150, 2, 152, 230, 34, 7, 5, 1, 219, 150, 2, + 212, 191, 7, 5, 1, 219, 150, 2, 241, 210, 7, 5, 1, 218, 224, 219, 150, 2, + 241, 210, 7, 1, 5, 6, 137, 7, 1, 5, 6, 233, 2, 137, 7, 5, 1, 218, 1, 2, + 109, 7, 5, 1, 242, 215, 7, 5, 1, 245, 22, 232, 204, 2, 213, 225, 23, 109, + 7, 5, 1, 214, 104, 218, 224, 242, 215, 7, 5, 1, 242, 216, 2, 247, 27, 7, + 5, 1, 201, 213, 10, 7, 5, 1, 213, 11, 2, 218, 230, 109, 7, 5, 1, 106, + 134, 7, 5, 1, 209, 200, 7, 5, 1, 209, 149, 2, 109, 7, 5, 1, 201, 209, + 148, 7, 5, 1, 201, 207, 129, 7, 5, 1, 201, 206, 123, 7, 1, 5, 6, 206, + 123, 7, 5, 1, 205, 160, 2, 218, 230, 109, 7, 5, 1, 205, 160, 2, 247, 27, + 7, 5, 1, 242, 141, 7, 5, 1, 242, 142, 2, 247, 27, 7, 1, 240, 25, 213, + 251, 7, 1, 221, 84, 208, 170, 241, 104, 7, 1, 233, 2, 240, 25, 213, 251, + 7, 1, 213, 232, 249, 34, 7, 1, 249, 228, 247, 203, 7, 1, 5, 6, 251, 150, + 7, 5, 1, 247, 192, 222, 142, 75, 7, 1, 5, 6, 241, 56, 2, 109, 7, 1, 5, 6, + 239, 155, 7, 5, 1, 232, 204, 2, 247, 56, 7, 5, 1, 201, 232, 76, 7, 1, 5, + 6, 149, 7, 5, 1, 220, 28, 2, 109, 7, 1, 240, 25, 213, 252, 2, 91, 7, 1, + 218, 224, 240, 25, 213, 252, 2, 91, 7, 5, 1, 243, 198, 245, 127, 7, 5, 1, + 245, 194, 245, 127, 7, 5, 1, 243, 198, 245, 128, 2, 247, 27, 7, 5, 1, + 210, 245, 245, 127, 7, 5, 1, 212, 85, 245, 127, 7, 5, 1, 212, 138, 245, + 128, 2, 247, 27, 7, 5, 1, 242, 7, 245, 127, 7, 5, 1, 229, 83, 245, 127, + 7, 5, 1, 229, 30, 245, 127, 7, 1, 249, 228, 221, 130, 7, 1, 249, 236, + 221, 130, 7, 5, 1, 201, 239, 156, 2, 241, 210, 7, 5, 1, 201, 239, 156, 2, + 241, 211, 23, 212, 191, 65, 1, 5, 239, 155, 65, 1, 5, 239, 156, 2, 109, + 65, 1, 5, 232, 203, 65, 1, 5, 137, 65, 1, 5, 201, 137, 65, 1, 5, 201, + 219, 150, 2, 109, 65, 1, 5, 6, 233, 2, 137, 65, 1, 5, 207, 129, 65, 1, 5, + 206, 123, 65, 1, 220, 127, 65, 1, 50, 220, 127, 65, 1, 201, 247, 155, 65, + 1, 252, 53, 65, 1, 218, 224, 247, 155, 65, 1, 48, 160, 218, 148, 65, 1, + 47, 160, 218, 148, 65, 1, 240, 25, 213, 251, 65, 1, 218, 224, 240, 25, + 213, 251, 65, 1, 47, 251, 243, 65, 1, 48, 251, 243, 65, 1, 120, 251, 243, + 65, 1, 130, 251, 243, 65, 1, 247, 228, 253, 21, 248, 195, 65, 1, 79, 229, + 205, 65, 1, 228, 13, 65, 1, 253, 9, 253, 21, 65, 1, 239, 237, 253, 21, + 65, 1, 114, 79, 229, 205, 65, 1, 114, 228, 13, 65, 1, 114, 239, 237, 253, + 21, 65, 1, 114, 253, 9, 253, 21, 65, 1, 211, 48, 247, 162, 65, 1, 160, + 211, 48, 247, 162, 65, 1, 248, 127, 48, 160, 218, 148, 65, 1, 248, 127, + 47, 160, 218, 148, 65, 1, 120, 212, 201, 65, 1, 130, 212, 201, 65, 1, + 101, 53, 65, 1, 226, 202, 53, 249, 122, 67, 52, 218, 149, 52, 222, 196, + 5, 211, 180, 50, 253, 9, 253, 21, 65, 1, 218, 209, 109, 65, 1, 247, 60, + 253, 21, 65, 1, 5, 240, 215, 65, 1, 5, 149, 65, 1, 5, 182, 65, 1, 5, 206, + 195, 65, 1, 5, 218, 224, 240, 25, 213, 251, 65, 1, 242, 156, 135, 134, + 65, 1, 127, 135, 134, 65, 1, 226, 249, 135, 134, 65, 1, 114, 135, 134, + 65, 1, 242, 155, 135, 134, 65, 1, 206, 1, 245, 217, 135, 83, 65, 1, 206, + 76, 245, 217, 135, 83, 65, 1, 208, 168, 65, 1, 209, 230, 65, 1, 50, 252, + 53, 65, 1, 114, 130, 251, 243, 65, 1, 114, 120, 251, 243, 65, 1, 114, 47, + 251, 243, 65, 1, 114, 48, 251, 243, 65, 1, 114, 218, 148, 65, 1, 226, + 247, 239, 237, 253, 21, 65, 1, 226, 247, 50, 239, 237, 253, 21, 65, 1, + 226, 247, 50, 253, 9, 253, 21, 65, 1, 114, 211, 180, 65, 1, 219, 81, 247, + 162, 65, 1, 250, 42, 127, 211, 118, 65, 1, 243, 34, 127, 211, 118, 65, 1, + 250, 42, 114, 211, 118, 65, 1, 243, 34, 114, 211, 118, 65, 1, 215, 205, + 65, 1, 222, 142, 215, 205, 65, 1, 114, 47, 45, 36, 239, 237, 253, 21, 36, + 253, 9, 253, 21, 36, 247, 228, 253, 21, 36, 211, 180, 36, 228, 13, 36, + 222, 81, 36, 249, 122, 36, 67, 52, 36, 245, 166, 36, 238, 130, 52, 36, + 218, 149, 52, 36, 50, 253, 9, 253, 21, 36, 248, 195, 36, 79, 229, 206, + 52, 36, 50, 79, 229, 206, 52, 36, 50, 239, 237, 253, 21, 36, 248, 217, + 36, 233, 2, 249, 122, 36, 201, 247, 156, 52, 36, 247, 156, 52, 36, 218, + 224, 247, 156, 52, 36, 247, 156, 84, 218, 167, 36, 239, 237, 253, 22, 55, + 36, 253, 9, 253, 22, 55, 36, 47, 212, 202, 55, 36, 48, 212, 202, 55, 36, + 47, 252, 109, 52, 36, 238, 69, 36, 47, 160, 218, 149, 55, 36, 120, 212, + 202, 55, 36, 130, 212, 202, 55, 36, 101, 3, 55, 36, 226, 202, 3, 55, 36, + 222, 24, 238, 130, 55, 36, 218, 230, 238, 130, 55, 36, 67, 55, 36, 245, + 167, 55, 36, 218, 149, 55, 36, 247, 156, 55, 36, 248, 141, 36, 222, 196, + 36, 79, 229, 206, 55, 36, 249, 116, 55, 36, 233, 2, 50, 252, 20, 55, 36, + 248, 196, 55, 36, 247, 228, 253, 22, 55, 36, 249, 123, 55, 36, 233, 2, + 249, 123, 55, 36, 211, 181, 55, 36, 228, 14, 55, 36, 114, 229, 205, 36, + 50, 114, 229, 205, 36, 211, 181, 222, 82, 36, 215, 144, 213, 225, 222, + 82, 36, 152, 213, 225, 222, 82, 36, 215, 144, 214, 181, 222, 82, 36, 152, + 214, 181, 222, 82, 36, 48, 160, 218, 149, 55, 36, 233, 2, 249, 116, 55, + 36, 49, 55, 36, 217, 85, 55, 36, 206, 196, 52, 36, 79, 211, 180, 36, 50, + 222, 81, 36, 239, 237, 135, 83, 36, 253, 9, 135, 83, 36, 27, 221, 124, + 36, 27, 231, 23, 36, 27, 245, 160, 211, 106, 36, 27, 205, 221, 36, 249, + 116, 52, 36, 242, 242, 3, 55, 36, 50, 79, 229, 206, 55, 36, 47, 252, 109, + 55, 36, 224, 43, 211, 181, 52, 36, 238, 136, 52, 36, 252, 149, 146, 211, + 130, 52, 36, 47, 48, 51, 55, 36, 167, 51, 55, 36, 239, 242, 232, 117, 36, + 48, 251, 244, 52, 36, 47, 160, 218, 149, 52, 36, 242, 4, 36, 206, 196, + 55, 36, 47, 251, 244, 55, 36, 48, 251, 244, 55, 36, 48, 251, 244, 23, + 120, 251, 244, 55, 36, 48, 160, 218, 149, 52, 36, 67, 84, 218, 167, 36, + 251, 210, 55, 36, 50, 218, 149, 55, 36, 205, 31, 52, 36, 50, 249, 123, + 55, 36, 50, 249, 122, 36, 50, 228, 13, 36, 50, 228, 14, 55, 36, 50, 211, + 180, 36, 50, 233, 2, 249, 122, 36, 50, 86, 51, 55, 36, 7, 5, 1, 62, 36, + 7, 5, 1, 75, 36, 7, 5, 1, 74, 36, 7, 5, 1, 76, 36, 7, 5, 1, 71, 36, 7, 5, + 1, 249, 34, 36, 7, 5, 1, 246, 240, 36, 7, 5, 1, 239, 155, 36, 7, 5, 1, + 229, 28, 36, 7, 5, 1, 137, 36, 7, 5, 1, 213, 10, 36, 7, 5, 1, 209, 148, + 36, 7, 5, 1, 206, 195, 27, 6, 1, 239, 28, 27, 5, 1, 239, 28, 27, 6, 1, + 252, 19, 217, 154, 27, 5, 1, 252, 19, 217, 154, 27, 223, 177, 53, 27, + 229, 92, 223, 177, 53, 27, 6, 1, 222, 10, 245, 134, 27, 5, 1, 222, 10, + 245, 134, 27, 205, 221, 27, 5, 218, 224, 229, 64, 215, 64, 93, 27, 5, + 244, 21, 229, 64, 215, 64, 93, 27, 5, 218, 224, 244, 21, 229, 64, 215, + 64, 93, 27, 219, 196, 83, 27, 6, 1, 205, 227, 27, 211, 106, 27, 245, 160, + 211, 106, 27, 6, 1, 252, 145, 2, 211, 106, 27, 252, 96, 212, 109, 27, 6, + 1, 242, 245, 2, 211, 106, 27, 6, 1, 242, 202, 2, 211, 106, 27, 6, 1, 232, + 250, 2, 211, 106, 27, 6, 1, 222, 169, 2, 211, 106, 27, 6, 1, 209, 201, 2, + 211, 106, 27, 6, 1, 222, 171, 2, 211, 106, 27, 5, 1, 232, 250, 2, 245, + 160, 23, 211, 106, 27, 6, 1, 252, 144, 27, 6, 1, 250, 8, 27, 6, 1, 240, + 215, 27, 6, 1, 245, 227, 27, 6, 1, 242, 244, 27, 6, 1, 205, 84, 27, 6, 1, + 242, 201, 27, 6, 1, 212, 23, 27, 6, 1, 232, 249, 27, 6, 1, 232, 14, 27, + 6, 1, 230, 102, 27, 6, 1, 226, 114, 27, 6, 1, 223, 217, 27, 6, 1, 206, + 169, 27, 6, 1, 222, 168, 27, 6, 1, 221, 53, 27, 6, 1, 218, 210, 27, 6, 1, + 215, 63, 27, 6, 1, 212, 151, 27, 6, 1, 209, 200, 27, 6, 1, 221, 78, 27, + 6, 1, 248, 58, 27, 6, 1, 220, 93, 27, 6, 1, 222, 170, 27, 6, 1, 232, 250, + 2, 245, 159, 27, 6, 1, 209, 201, 2, 245, 159, 27, 5, 1, 252, 145, 2, 211, + 106, 27, 5, 1, 242, 245, 2, 211, 106, 27, 5, 1, 242, 202, 2, 211, 106, + 27, 5, 1, 232, 250, 2, 211, 106, 27, 5, 1, 209, 201, 2, 245, 160, 23, + 211, 106, 27, 5, 1, 252, 144, 27, 5, 1, 250, 8, 27, 5, 1, 240, 215, 27, + 5, 1, 245, 227, 27, 5, 1, 242, 244, 27, 5, 1, 205, 84, 27, 5, 1, 242, + 201, 27, 5, 1, 212, 23, 27, 5, 1, 232, 249, 27, 5, 1, 232, 14, 27, 5, 1, + 230, 102, 27, 5, 1, 226, 114, 27, 5, 1, 223, 217, 27, 5, 1, 206, 169, 27, + 5, 1, 222, 168, 27, 5, 1, 221, 53, 27, 5, 1, 218, 210, 27, 5, 1, 42, 215, + 63, 27, 5, 1, 215, 63, 27, 5, 1, 212, 151, 27, 5, 1, 209, 200, 27, 5, 1, + 221, 78, 27, 5, 1, 248, 58, 27, 5, 1, 220, 93, 27, 5, 1, 222, 170, 27, 5, + 1, 232, 250, 2, 245, 159, 27, 5, 1, 209, 201, 2, 245, 159, 27, 5, 1, 222, + 169, 2, 211, 106, 27, 5, 1, 209, 201, 2, 211, 106, 27, 5, 1, 222, 171, 2, + 211, 106, 27, 6, 232, 42, 93, 27, 250, 9, 93, 27, 212, 24, 93, 27, 209, + 201, 2, 238, 130, 93, 27, 209, 201, 2, 253, 9, 23, 238, 130, 93, 27, 209, + 201, 2, 245, 167, 23, 238, 130, 93, 27, 221, 79, 93, 27, 221, 54, 93, 27, + 232, 42, 93, 27, 1, 252, 19, 231, 27, 27, 5, 1, 252, 19, 231, 27, 27, 1, + 214, 5, 27, 5, 1, 214, 5, 27, 1, 245, 134, 27, 5, 1, 245, 134, 27, 1, + 231, 27, 27, 5, 1, 231, 27, 27, 1, 217, 154, 27, 5, 1, 217, 154, 81, 6, + 1, 215, 206, 81, 5, 1, 215, 206, 81, 6, 1, 242, 13, 81, 5, 1, 242, 13, + 81, 6, 1, 231, 150, 81, 5, 1, 231, 150, 81, 6, 1, 238, 122, 81, 5, 1, + 238, 122, 81, 6, 1, 240, 210, 81, 5, 1, 240, 210, 81, 6, 1, 215, 173, 81, + 5, 1, 215, 173, 81, 6, 1, 245, 242, 81, 5, 1, 245, 242, 27, 232, 15, 93, + 27, 218, 211, 93, 27, 229, 64, 215, 64, 93, 27, 1, 205, 227, 27, 6, 212, + 24, 93, 27, 229, 64, 242, 245, 93, 27, 218, 224, 229, 64, 242, 245, 93, + 27, 6, 1, 215, 158, 27, 5, 1, 215, 158, 27, 6, 229, 64, 215, 64, 93, 27, + 6, 1, 217, 151, 27, 5, 1, 217, 151, 27, 218, 211, 2, 213, 225, 93, 27, 6, + 218, 224, 229, 64, 215, 64, 93, 27, 6, 244, 21, 229, 64, 215, 64, 93, 27, + 6, 218, 224, 244, 21, 229, 64, 215, 64, 93, 34, 6, 1, 233, 130, 2, 239, + 236, 34, 6, 1, 232, 253, 34, 6, 1, 245, 68, 34, 6, 1, 240, 32, 34, 6, 1, + 209, 246, 233, 129, 34, 6, 1, 243, 193, 34, 6, 1, 249, 44, 74, 34, 6, 1, + 206, 11, 34, 6, 1, 232, 182, 34, 6, 1, 229, 175, 34, 6, 1, 224, 173, 34, + 6, 1, 210, 231, 34, 6, 1, 231, 74, 34, 6, 1, 237, 225, 2, 239, 236, 34, + 6, 1, 215, 144, 71, 34, 6, 1, 243, 189, 34, 6, 1, 62, 34, 6, 1, 250, 61, + 34, 6, 1, 209, 39, 34, 6, 1, 240, 85, 34, 6, 1, 246, 9, 34, 6, 1, 233, + 129, 34, 6, 1, 205, 72, 34, 6, 1, 205, 93, 34, 6, 1, 74, 34, 6, 1, 215, + 144, 74, 34, 6, 1, 172, 34, 6, 1, 243, 68, 34, 6, 1, 243, 50, 34, 6, 1, + 243, 41, 34, 6, 1, 76, 34, 6, 1, 221, 174, 34, 6, 1, 242, 235, 34, 6, 1, + 242, 225, 34, 6, 1, 212, 131, 34, 6, 1, 71, 34, 6, 1, 243, 97, 34, 6, 1, + 155, 34, 6, 1, 210, 237, 34, 6, 1, 248, 82, 34, 6, 1, 216, 2, 34, 6, 1, + 215, 217, 34, 6, 1, 239, 94, 53, 34, 6, 1, 206, 30, 34, 6, 1, 214, 187, + 53, 34, 6, 1, 75, 34, 6, 1, 205, 213, 34, 6, 1, 190, 34, 5, 1, 62, 34, 5, + 1, 250, 61, 34, 5, 1, 209, 39, 34, 5, 1, 240, 85, 34, 5, 1, 246, 9, 34, + 5, 1, 233, 129, 34, 5, 1, 205, 72, 34, 5, 1, 205, 93, 34, 5, 1, 74, 34, + 5, 1, 215, 144, 74, 34, 5, 1, 172, 34, 5, 1, 243, 68, 34, 5, 1, 243, 50, + 34, 5, 1, 243, 41, 34, 5, 1, 76, 34, 5, 1, 221, 174, 34, 5, 1, 242, 235, + 34, 5, 1, 242, 225, 34, 5, 1, 212, 131, 34, 5, 1, 71, 34, 5, 1, 243, 97, + 34, 5, 1, 155, 34, 5, 1, 210, 237, 34, 5, 1, 248, 82, 34, 5, 1, 216, 2, + 34, 5, 1, 215, 217, 34, 5, 1, 239, 94, 53, 34, 5, 1, 206, 30, 34, 5, 1, + 214, 187, 53, 34, 5, 1, 75, 34, 5, 1, 205, 213, 34, 5, 1, 190, 34, 5, 1, + 233, 130, 2, 239, 236, 34, 5, 1, 232, 253, 34, 5, 1, 245, 68, 34, 5, 1, + 240, 32, 34, 5, 1, 209, 246, 233, 129, 34, 5, 1, 243, 193, 34, 5, 1, 249, + 44, 74, 34, 5, 1, 206, 11, 34, 5, 1, 232, 182, 34, 5, 1, 229, 175, 34, 5, + 1, 224, 173, 34, 5, 1, 210, 231, 34, 5, 1, 231, 74, 34, 5, 1, 237, 225, + 2, 239, 236, 34, 5, 1, 215, 144, 71, 34, 5, 1, 243, 189, 34, 6, 1, 222, + 170, 34, 5, 1, 222, 170, 34, 6, 1, 206, 65, 34, 5, 1, 206, 65, 34, 6, 1, + 232, 247, 75, 34, 5, 1, 232, 247, 75, 34, 6, 1, 229, 180, 205, 183, 34, + 5, 1, 229, 180, 205, 183, 34, 6, 1, 232, 247, 229, 180, 205, 183, 34, 5, + 1, 232, 247, 229, 180, 205, 183, 34, 6, 1, 249, 231, 205, 183, 34, 5, 1, + 249, 231, 205, 183, 34, 6, 1, 232, 247, 249, 231, 205, 183, 34, 5, 1, + 232, 247, 249, 231, 205, 183, 34, 6, 1, 230, 252, 34, 5, 1, 230, 252, 34, + 6, 1, 220, 93, 34, 5, 1, 220, 93, 34, 6, 1, 241, 205, 34, 5, 1, 241, 205, + 34, 6, 1, 232, 205, 34, 5, 1, 232, 205, 34, 6, 1, 232, 206, 2, 50, 239, + 237, 253, 21, 34, 5, 1, 232, 206, 2, 50, 239, 237, 253, 21, 34, 6, 1, + 209, 249, 34, 5, 1, 209, 249, 34, 6, 1, 218, 95, 222, 170, 34, 5, 1, 218, + 95, 222, 170, 34, 6, 1, 222, 171, 2, 211, 154, 34, 5, 1, 222, 171, 2, + 211, 154, 34, 6, 1, 222, 103, 34, 5, 1, 222, 103, 34, 6, 1, 231, 27, 34, + 5, 1, 231, 27, 34, 211, 241, 53, 36, 34, 211, 154, 36, 34, 222, 25, 36, + 34, 246, 76, 220, 213, 36, 34, 220, 87, 220, 213, 36, 34, 220, 197, 36, + 34, 238, 30, 211, 241, 53, 36, 34, 226, 213, 53, 34, 6, 1, 215, 144, 237, + 225, 2, 212, 191, 34, 5, 1, 215, 144, 237, 225, 2, 212, 191, 34, 6, 1, + 216, 48, 53, 34, 5, 1, 216, 48, 53, 34, 6, 1, 242, 236, 2, 211, 207, 34, + 5, 1, 242, 236, 2, 211, 207, 34, 6, 1, 240, 86, 2, 209, 199, 34, 5, 1, + 240, 86, 2, 209, 199, 34, 6, 1, 240, 86, 2, 91, 34, 5, 1, 240, 86, 2, 91, + 34, 6, 1, 240, 86, 2, 226, 247, 109, 34, 5, 1, 240, 86, 2, 226, 247, 109, + 34, 6, 1, 205, 73, 2, 245, 211, 34, 5, 1, 205, 73, 2, 245, 211, 34, 6, 1, + 205, 94, 2, 245, 211, 34, 5, 1, 205, 94, 2, 245, 211, 34, 6, 1, 232, 66, + 2, 245, 211, 34, 5, 1, 232, 66, 2, 245, 211, 34, 6, 1, 232, 66, 2, 79, + 91, 34, 5, 1, 232, 66, 2, 79, 91, 34, 6, 1, 232, 66, 2, 91, 34, 5, 1, + 232, 66, 2, 91, 34, 6, 1, 250, 112, 172, 34, 5, 1, 250, 112, 172, 34, 6, + 1, 243, 42, 2, 245, 211, 34, 5, 1, 243, 42, 2, 245, 211, 34, 6, 28, 243, + 42, 240, 85, 34, 5, 28, 243, 42, 240, 85, 34, 6, 1, 221, 175, 2, 226, + 247, 109, 34, 5, 1, 221, 175, 2, 226, 247, 109, 34, 6, 1, 253, 28, 155, + 34, 5, 1, 253, 28, 155, 34, 6, 1, 242, 226, 2, 245, 211, 34, 5, 1, 242, + 226, 2, 245, 211, 34, 6, 1, 212, 132, 2, 245, 211, 34, 5, 1, 212, 132, 2, + 245, 211, 34, 6, 1, 213, 243, 71, 34, 5, 1, 213, 243, 71, 34, 6, 1, 213, + 243, 106, 2, 91, 34, 5, 1, 213, 243, 106, 2, 91, 34, 6, 1, 239, 144, 2, + 245, 211, 34, 5, 1, 239, 144, 2, 245, 211, 34, 6, 28, 212, 132, 210, 237, + 34, 5, 28, 212, 132, 210, 237, 34, 6, 1, 248, 83, 2, 245, 211, 34, 5, 1, + 248, 83, 2, 245, 211, 34, 6, 1, 248, 83, 2, 79, 91, 34, 5, 1, 248, 83, 2, + 79, 91, 34, 6, 1, 215, 184, 34, 5, 1, 215, 184, 34, 6, 1, 253, 28, 248, + 82, 34, 5, 1, 253, 28, 248, 82, 34, 6, 1, 253, 28, 248, 83, 2, 245, 211, + 34, 5, 1, 253, 28, 248, 83, 2, 245, 211, 34, 1, 222, 17, 34, 6, 1, 205, + 73, 2, 249, 122, 34, 5, 1, 205, 73, 2, 249, 122, 34, 6, 1, 232, 66, 2, + 109, 34, 5, 1, 232, 66, 2, 109, 34, 6, 1, 243, 69, 2, 212, 191, 34, 5, 1, + 243, 69, 2, 212, 191, 34, 6, 1, 243, 42, 2, 109, 34, 5, 1, 243, 42, 2, + 109, 34, 6, 1, 243, 42, 2, 212, 191, 34, 5, 1, 243, 42, 2, 212, 191, 34, + 6, 1, 231, 161, 248, 82, 34, 5, 1, 231, 161, 248, 82, 34, 6, 1, 243, 51, + 2, 212, 191, 34, 5, 1, 243, 51, 2, 212, 191, 34, 5, 1, 222, 17, 34, 6, 1, + 32, 2, 249, 122, 34, 5, 1, 32, 2, 249, 122, 34, 6, 1, 32, 2, 245, 166, + 34, 5, 1, 32, 2, 245, 166, 34, 6, 28, 32, 233, 129, 34, 5, 28, 32, 233, + 129, 34, 6, 1, 233, 130, 2, 249, 122, 34, 5, 1, 233, 130, 2, 249, 122, + 34, 6, 1, 217, 100, 34, 5, 1, 217, 100, 34, 6, 1, 217, 101, 2, 245, 166, + 34, 5, 1, 217, 101, 2, 245, 166, 34, 6, 1, 205, 73, 2, 245, 166, 34, 5, + 1, 205, 73, 2, 245, 166, 34, 6, 1, 205, 94, 2, 245, 166, 34, 5, 1, 205, + 94, 2, 245, 166, 34, 6, 1, 253, 28, 243, 193, 34, 5, 1, 253, 28, 243, + 193, 34, 6, 1, 237, 225, 2, 228, 13, 34, 5, 1, 237, 225, 2, 228, 13, 34, + 6, 1, 237, 225, 2, 245, 166, 34, 5, 1, 237, 225, 2, 245, 166, 34, 6, 1, + 148, 2, 245, 166, 34, 5, 1, 148, 2, 245, 166, 34, 6, 1, 250, 123, 76, 34, + 5, 1, 250, 123, 76, 34, 6, 1, 250, 123, 148, 2, 245, 166, 34, 5, 1, 250, + 123, 148, 2, 245, 166, 34, 6, 1, 174, 2, 245, 166, 34, 5, 1, 174, 2, 245, + 166, 34, 6, 1, 106, 2, 228, 13, 34, 5, 1, 106, 2, 228, 13, 34, 6, 1, 106, + 2, 245, 166, 34, 5, 1, 106, 2, 245, 166, 34, 6, 1, 106, 2, 50, 153, 34, + 5, 1, 106, 2, 50, 153, 34, 6, 1, 248, 83, 2, 245, 166, 34, 5, 1, 248, 83, + 2, 245, 166, 34, 6, 1, 240, 86, 2, 245, 211, 34, 5, 1, 240, 86, 2, 245, + 211, 34, 6, 1, 206, 31, 2, 245, 166, 34, 5, 1, 206, 31, 2, 245, 166, 34, + 6, 1, 240, 86, 2, 213, 225, 23, 109, 34, 5, 1, 240, 86, 2, 213, 225, 23, + 109, 34, 6, 1, 239, 144, 2, 109, 34, 5, 1, 239, 144, 2, 109, 34, 6, 1, + 239, 144, 2, 91, 34, 5, 1, 239, 144, 2, 91, 34, 6, 1, 231, 37, 246, 9, + 34, 5, 1, 231, 37, 246, 9, 34, 6, 1, 231, 37, 245, 68, 34, 5, 1, 231, 37, + 245, 68, 34, 6, 1, 231, 37, 205, 23, 34, 5, 1, 231, 37, 205, 23, 34, 6, + 1, 231, 37, 243, 185, 34, 5, 1, 231, 37, 243, 185, 34, 6, 1, 231, 37, + 229, 175, 34, 5, 1, 231, 37, 229, 175, 34, 6, 1, 231, 37, 224, 173, 34, + 5, 1, 231, 37, 224, 173, 34, 6, 1, 231, 37, 214, 249, 34, 5, 1, 231, 37, + 214, 249, 34, 6, 1, 231, 37, 211, 148, 34, 5, 1, 231, 37, 211, 148, 34, + 6, 1, 218, 224, 205, 93, 34, 5, 1, 218, 224, 205, 93, 34, 6, 1, 243, 69, + 2, 109, 34, 5, 1, 243, 69, 2, 109, 34, 6, 1, 229, 248, 34, 5, 1, 229, + 248, 34, 6, 1, 218, 212, 34, 5, 1, 218, 212, 34, 6, 1, 206, 98, 34, 5, 1, + 206, 98, 34, 6, 1, 220, 19, 34, 5, 1, 220, 19, 34, 6, 1, 207, 51, 34, 5, + 1, 207, 51, 34, 6, 1, 252, 168, 172, 34, 5, 1, 252, 168, 172, 34, 6, 1, + 243, 69, 2, 226, 247, 109, 34, 5, 1, 243, 69, 2, 226, 247, 109, 34, 6, 1, + 243, 42, 2, 226, 247, 109, 34, 5, 1, 243, 42, 2, 226, 247, 109, 34, 6, 1, + 221, 175, 2, 245, 211, 34, 5, 1, 221, 175, 2, 245, 211, 34, 6, 1, 215, + 185, 2, 245, 211, 34, 5, 1, 215, 185, 2, 245, 211, 34, 6, 1, 243, 42, 2, + 47, 109, 34, 5, 1, 243, 42, 2, 47, 109, 34, 6, 1, 243, 178, 34, 5, 1, + 243, 178, 34, 6, 1, 246, 58, 34, 5, 1, 246, 58, 34, 6, 1, 243, 69, 2, + 245, 211, 34, 5, 1, 243, 69, 2, 245, 211, 164, 6, 1, 251, 156, 164, 6, 1, + 250, 22, 164, 6, 1, 240, 49, 164, 6, 1, 246, 145, 164, 6, 1, 243, 108, + 164, 6, 1, 205, 116, 164, 6, 1, 243, 92, 164, 6, 1, 242, 203, 164, 6, 1, + 124, 164, 6, 1, 205, 72, 164, 6, 1, 233, 38, 164, 6, 1, 229, 178, 164, 6, + 1, 206, 173, 164, 6, 1, 249, 1, 164, 6, 1, 231, 203, 164, 6, 1, 238, 149, + 164, 6, 1, 232, 200, 164, 6, 1, 240, 96, 164, 6, 1, 248, 75, 164, 6, 1, + 227, 83, 164, 6, 1, 206, 11, 164, 6, 1, 224, 29, 164, 6, 1, 216, 2, 164, + 6, 1, 208, 173, 164, 6, 1, 248, 110, 164, 6, 1, 221, 157, 164, 6, 1, 232, + 165, 164, 6, 1, 219, 113, 164, 6, 1, 217, 64, 164, 6, 1, 208, 218, 164, + 6, 1, 211, 151, 164, 6, 1, 219, 16, 164, 6, 1, 247, 174, 164, 6, 1, 205, + 252, 164, 6, 1, 220, 244, 164, 6, 1, 231, 214, 164, 6, 1, 222, 194, 164, + 6, 1, 242, 15, 164, 65, 1, 47, 160, 218, 148, 164, 252, 53, 164, 243, 45, + 83, 164, 242, 168, 83, 164, 247, 155, 164, 219, 196, 83, 164, 253, 29, + 83, 164, 5, 1, 251, 156, 164, 5, 1, 250, 22, 164, 5, 1, 240, 49, 164, 5, + 1, 246, 145, 164, 5, 1, 243, 108, 164, 5, 1, 205, 116, 164, 5, 1, 243, + 92, 164, 5, 1, 242, 203, 164, 5, 1, 124, 164, 5, 1, 205, 72, 164, 5, 1, + 233, 38, 164, 5, 1, 229, 178, 164, 5, 1, 206, 173, 164, 5, 1, 249, 1, + 164, 5, 1, 231, 203, 164, 5, 1, 238, 149, 164, 5, 1, 232, 200, 164, 5, 1, + 240, 96, 164, 5, 1, 248, 75, 164, 5, 1, 227, 83, 164, 5, 1, 206, 11, 164, + 5, 1, 224, 29, 164, 5, 1, 216, 2, 164, 5, 1, 208, 173, 164, 5, 1, 248, + 110, 164, 5, 1, 221, 157, 164, 5, 1, 232, 165, 164, 5, 1, 219, 113, 164, + 5, 1, 217, 64, 164, 5, 1, 208, 218, 164, 5, 1, 211, 151, 164, 5, 1, 219, + 16, 164, 5, 1, 247, 174, 164, 5, 1, 205, 252, 164, 5, 1, 220, 244, 164, + 5, 1, 231, 214, 164, 5, 1, 222, 194, 164, 5, 1, 242, 15, 164, 5, 28, 243, + 109, 205, 252, 164, 241, 82, 213, 251, 164, 237, 239, 218, 166, 164, 242, + 199, 53, 230, 45, 164, 242, 199, 53, 164, 243, 254, 53, 103, 253, 22, + 242, 194, 103, 253, 22, 217, 65, 103, 253, 22, 215, 240, 103, 253, 22, + 205, 104, 220, 2, 103, 253, 22, 205, 104, 240, 234, 103, 253, 22, 211, + 165, 103, 253, 22, 218, 221, 103, 253, 22, 205, 102, 103, 253, 22, 221, + 201, 103, 253, 22, 206, 23, 103, 253, 22, 212, 63, 103, 253, 22, 240, + 147, 103, 253, 22, 240, 148, 226, 78, 103, 253, 22, 240, 145, 103, 253, + 22, 220, 3, 221, 230, 103, 253, 22, 212, 104, 240, 163, 103, 253, 22, + 221, 180, 103, 253, 22, 251, 193, 239, 136, 103, 253, 22, 226, 88, 103, + 253, 22, 227, 244, 103, 253, 22, 227, 73, 103, 253, 22, 227, 74, 231, + 215, 103, 253, 22, 246, 85, 103, 253, 22, 220, 14, 103, 253, 22, 212, + 104, 219, 253, 103, 253, 22, 206, 33, 250, 23, 205, 233, 103, 253, 22, + 222, 177, 103, 253, 22, 233, 88, 103, 253, 22, 245, 243, 103, 253, 22, + 205, 29, 103, 141, 227, 174, 247, 233, 103, 220, 205, 215, 187, 103, 220, + 205, 239, 85, 217, 65, 103, 220, 205, 239, 85, 221, 194, 103, 220, 205, + 239, 85, 220, 7, 103, 220, 205, 238, 244, 103, 220, 205, 210, 234, 103, + 220, 205, 217, 65, 103, 220, 205, 221, 194, 103, 220, 205, 220, 7, 103, + 220, 205, 238, 142, 103, 220, 205, 238, 143, 239, 87, 33, 209, 43, 103, + 220, 205, 219, 200, 103, 220, 205, 246, 131, 222, 123, 227, 204, 103, + 220, 205, 227, 62, 103, 220, 72, 227, 201, 103, 220, 205, 219, 93, 103, + 220, 72, 221, 203, 103, 220, 205, 215, 172, 245, 23, 103, 220, 205, 215, + 45, 245, 23, 103, 220, 72, 214, 188, 221, 196, 103, 141, 209, 203, 245, + 23, 103, 141, 229, 92, 245, 23, 103, 220, 72, 223, 174, 239, 135, 103, + 220, 205, 220, 8, 220, 2, 103, 1, 252, 172, 103, 1, 250, 10, 103, 1, 240, + 47, 103, 1, 246, 111, 103, 1, 239, 71, 103, 1, 209, 43, 103, 1, 205, 96, + 103, 1, 239, 29, 103, 1, 212, 80, 103, 1, 205, 236, 103, 1, 42, 232, 45, + 103, 1, 232, 45, 103, 1, 230, 98, 103, 1, 42, 227, 90, 103, 1, 227, 90, + 103, 1, 42, 223, 173, 103, 1, 223, 173, 103, 1, 217, 157, 103, 1, 251, + 154, 103, 1, 42, 221, 174, 103, 1, 221, 174, 103, 1, 42, 210, 238, 103, + 1, 210, 238, 103, 1, 219, 223, 103, 1, 218, 242, 103, 1, 215, 171, 103, + 1, 212, 147, 103, 28, 206, 9, 50, 209, 43, 103, 28, 206, 9, 209, 44, 205, + 236, 103, 28, 206, 9, 50, 205, 236, 103, 220, 72, 240, 147, 103, 220, 72, + 240, 145, 8, 43, 53, 8, 3, 217, 150, 8, 241, 146, 227, 187, 8, 3, 217, + 187, 8, 3, 217, 153, 8, 43, 141, 52, 252, 33, 247, 36, 218, 103, 252, 33, + 241, 118, 218, 103, 8, 219, 58, 252, 33, 221, 132, 226, 215, 53, 252, 33, + 221, 132, 212, 99, 211, 243, 53, 252, 225, 53, 8, 247, 155, 8, 246, 72, + 216, 39, 8, 220, 207, 209, 24, 53, 8, 3, 226, 194, 8, 3, 217, 167, 252, + 175, 207, 75, 8, 3, 252, 175, 251, 214, 8, 3, 219, 91, 252, 174, 8, 3, + 219, 99, 252, 154, 252, 103, 8, 3, 212, 184, 8, 5, 127, 212, 194, 8, 5, + 127, 28, 126, 2, 230, 107, 2, 206, 47, 8, 5, 127, 205, 108, 8, 5, 242, + 39, 8, 5, 246, 106, 8, 5, 231, 252, 8, 216, 52, 8, 1, 83, 8, 211, 36, 67, + 220, 72, 83, 8, 219, 196, 83, 8, 1, 232, 0, 206, 47, 8, 1, 239, 111, 8, + 1, 126, 2, 228, 9, 52, 8, 1, 126, 2, 239, 112, 52, 8, 1, 207, 60, 2, 239, + 112, 52, 8, 1, 126, 2, 239, 112, 55, 8, 1, 87, 2, 239, 112, 52, 8, 1, + 252, 172, 8, 1, 250, 38, 8, 1, 212, 116, 227, 197, 8, 1, 212, 115, 8, 1, + 212, 37, 8, 1, 232, 179, 8, 1, 239, 132, 8, 1, 231, 163, 8, 1, 246, 117, + 8, 1, 212, 49, 8, 1, 219, 16, 8, 1, 205, 108, 8, 1, 217, 70, 8, 1, 215, + 210, 8, 1, 217, 191, 8, 1, 246, 140, 8, 1, 212, 194, 8, 1, 205, 111, 8, + 1, 252, 200, 8, 1, 240, 94, 8, 1, 231, 213, 2, 118, 177, 52, 8, 1, 231, + 213, 2, 129, 177, 55, 8, 1, 242, 42, 87, 2, 233, 2, 209, 148, 8, 1, 242, + 42, 87, 2, 118, 177, 52, 8, 1, 242, 42, 87, 2, 129, 177, 52, 8, 212, 153, + 8, 1, 242, 15, 8, 1, 220, 12, 8, 1, 232, 45, 8, 1, 230, 106, 8, 1, 227, + 104, 8, 1, 224, 54, 8, 1, 239, 50, 8, 1, 207, 59, 8, 1, 126, 227, 228, 8, + 1, 206, 47, 8, 242, 37, 8, 246, 104, 8, 231, 250, 8, 242, 39, 8, 246, + 106, 8, 231, 252, 8, 215, 249, 8, 213, 162, 8, 228, 7, 52, 8, 239, 112, + 52, 8, 239, 112, 55, 8, 213, 183, 252, 172, 8, 233, 2, 246, 106, 8, 141, + 224, 55, 240, 65, 8, 204, 251, 8, 22, 3, 5, 209, 149, 52, 8, 22, 3, 233, + 2, 5, 209, 149, 52, 8, 22, 3, 67, 55, 8, 218, 224, 246, 106, 8, 242, 40, + 2, 118, 245, 21, 8, 207, 61, 239, 112, 55, 252, 33, 18, 205, 85, 252, 33, + 18, 102, 252, 33, 18, 105, 252, 33, 18, 142, 252, 33, 18, 139, 252, 33, + 18, 168, 252, 33, 18, 184, 252, 33, 18, 195, 252, 33, 18, 193, 252, 33, + 18, 200, 8, 221, 131, 53, 8, 246, 2, 216, 39, 8, 211, 241, 216, 39, 8, + 241, 204, 220, 203, 214, 26, 8, 1, 245, 22, 250, 38, 8, 1, 245, 22, 220, + 12, 8, 1, 213, 139, 252, 172, 8, 1, 126, 207, 76, 8, 1, 126, 2, 207, 61, + 239, 112, 52, 8, 1, 126, 2, 207, 61, 239, 112, 55, 8, 1, 127, 239, 111, + 8, 1, 127, 239, 112, 252, 172, 8, 1, 127, 239, 112, 207, 59, 8, 1, 106, + 2, 239, 112, 52, 8, 1, 127, 239, 112, 206, 47, 8, 1, 210, 200, 8, 1, 210, + 198, 8, 1, 250, 48, 8, 1, 212, 116, 2, 218, 148, 8, 1, 212, 116, 2, 129, + 177, 84, 244, 6, 8, 1, 221, 157, 8, 1, 212, 113, 8, 1, 250, 36, 8, 1, + 140, 2, 239, 112, 52, 8, 1, 140, 2, 118, 177, 79, 52, 8, 1, 223, 131, 8, + 1, 243, 201, 8, 1, 140, 2, 129, 177, 52, 8, 1, 212, 135, 8, 1, 212, 133, + 8, 1, 246, 49, 8, 1, 246, 118, 2, 218, 148, 8, 1, 246, 118, 2, 67, 55, 8, + 1, 246, 118, 2, 67, 250, 26, 23, 5, 212, 194, 8, 1, 246, 124, 8, 1, 246, + 51, 8, 1, 243, 229, 8, 1, 246, 118, 2, 129, 177, 84, 244, 6, 8, 1, 246, + 118, 2, 241, 125, 177, 52, 8, 1, 218, 81, 8, 1, 219, 17, 2, 5, 209, 148, + 8, 1, 219, 17, 2, 218, 148, 8, 1, 219, 17, 2, 67, 55, 8, 1, 219, 17, 2, + 5, 209, 149, 55, 8, 1, 219, 17, 2, 67, 250, 26, 23, 67, 52, 8, 1, 219, + 17, 2, 118, 177, 52, 8, 1, 232, 176, 8, 1, 219, 17, 2, 241, 125, 177, 52, + 8, 1, 217, 71, 2, 67, 250, 26, 23, 67, 52, 8, 1, 217, 71, 2, 129, 177, + 55, 8, 1, 217, 71, 2, 129, 177, 250, 26, 23, 129, 177, 52, 8, 1, 217, + 192, 2, 118, 177, 55, 8, 1, 217, 192, 2, 129, 177, 52, 8, 1, 212, 195, 2, + 129, 177, 52, 8, 1, 252, 201, 2, 129, 177, 52, 8, 1, 245, 22, 242, 15, 8, + 1, 242, 16, 2, 67, 226, 122, 55, 8, 1, 242, 16, 2, 67, 55, 8, 1, 209, 32, + 8, 1, 242, 16, 2, 129, 177, 55, 8, 1, 221, 155, 8, 1, 220, 13, 2, 67, 52, + 8, 1, 220, 13, 2, 129, 177, 52, 8, 1, 231, 212, 8, 1, 213, 109, 232, 45, + 8, 1, 232, 46, 2, 218, 148, 8, 1, 232, 46, 2, 67, 52, 8, 1, 225, 79, 8, + 1, 232, 46, 2, 129, 177, 55, 8, 1, 240, 231, 8, 1, 240, 232, 2, 218, 148, + 8, 1, 225, 0, 8, 1, 240, 232, 2, 118, 177, 55, 8, 1, 239, 200, 8, 1, 240, + 232, 2, 129, 177, 52, 8, 1, 230, 107, 2, 5, 209, 148, 8, 1, 230, 107, 2, + 67, 52, 8, 1, 230, 107, 2, 129, 177, 52, 8, 1, 230, 107, 2, 129, 177, 55, + 8, 1, 224, 55, 2, 67, 55, 8, 1, 224, 55, 240, 65, 8, 1, 218, 127, 8, 1, + 224, 55, 2, 218, 148, 8, 1, 224, 55, 2, 129, 177, 52, 8, 1, 239, 51, 245, + 47, 8, 1, 212, 136, 2, 67, 52, 8, 1, 239, 51, 2, 87, 52, 8, 1, 239, 51, + 240, 16, 8, 1, 239, 51, 240, 17, 2, 239, 112, 52, 8, 1, 212, 116, 227, + 198, 240, 16, 8, 1, 207, 60, 2, 218, 148, 8, 1, 231, 101, 222, 206, 8, 1, + 222, 206, 8, 1, 71, 8, 1, 205, 213, 8, 1, 231, 101, 205, 213, 8, 1, 207, + 60, 2, 118, 177, 52, 8, 1, 209, 39, 8, 1, 242, 42, 206, 47, 8, 1, 87, 2, + 212, 191, 8, 1, 87, 2, 5, 209, 148, 8, 1, 207, 60, 2, 67, 52, 8, 1, 75, + 8, 1, 87, 2, 129, 177, 55, 8, 1, 87, 250, 121, 8, 1, 87, 250, 122, 2, + 239, 112, 52, 8, 241, 82, 213, 251, 8, 1, 252, 248, 8, 5, 127, 28, 217, + 192, 2, 230, 107, 2, 126, 227, 228, 8, 5, 127, 28, 220, 13, 2, 230, 107, + 2, 126, 227, 228, 8, 5, 127, 80, 78, 17, 8, 5, 127, 230, 107, 252, 172, + 8, 5, 127, 232, 179, 8, 5, 127, 129, 245, 21, 8, 5, 127, 217, 70, 8, 243, + 34, 73, 251, 158, 8, 214, 22, 73, 218, 48, 243, 69, 238, 240, 8, 5, 127, + 218, 93, 205, 85, 8, 5, 127, 209, 202, 219, 36, 205, 85, 8, 5, 127, 245, + 22, 239, 69, 73, 231, 163, 8, 5, 127, 80, 61, 17, 8, 5, 114, 217, 70, 8, + 5, 127, 228, 8, 8, 5, 207, 59, 8, 5, 206, 47, 8, 5, 127, 206, 47, 8, 5, + 127, 224, 54, 8, 220, 239, 73, 217, 177, 8, 243, 43, 248, 129, 114, 213, + 251, 8, 243, 43, 248, 129, 127, 213, 251, 8, 218, 93, 127, 213, 252, 2, + 241, 233, 248, 128, 8, 5, 114, 227, 104, 8, 1, 246, 118, 2, 233, 2, 209, + 148, 8, 1, 219, 17, 2, 233, 2, 209, 148, 242, 159, 252, 33, 18, 205, 85, + 242, 159, 252, 33, 18, 102, 242, 159, 252, 33, 18, 105, 242, 159, 252, + 33, 18, 142, 242, 159, 252, 33, 18, 139, 242, 159, 252, 33, 18, 168, 242, + 159, 252, 33, 18, 184, 242, 159, 252, 33, 18, 195, 242, 159, 252, 33, 18, + 193, 242, 159, 252, 33, 18, 200, 8, 1, 215, 211, 2, 67, 55, 8, 1, 246, + 141, 2, 67, 55, 8, 1, 240, 95, 2, 67, 55, 8, 3, 215, 44, 252, 125, 8, 3, + 215, 44, 220, 172, 227, 83, 8, 1, 239, 51, 2, 233, 2, 209, 148, 213, 30, + 243, 34, 73, 221, 228, 213, 30, 213, 135, 241, 82, 213, 251, 213, 30, + 213, 185, 241, 82, 213, 251, 213, 30, 213, 135, 247, 162, 213, 30, 213, + 185, 247, 162, 213, 30, 194, 247, 162, 213, 30, 247, 163, 214, 246, 230, + 46, 213, 30, 247, 163, 214, 246, 218, 167, 213, 30, 213, 135, 247, 163, + 214, 246, 230, 46, 213, 30, 213, 185, 247, 163, 214, 246, 218, 167, 213, + 30, 247, 111, 213, 30, 239, 92, 222, 224, 213, 30, 239, 92, 227, 60, 213, + 30, 239, 92, 251, 211, 213, 30, 253, 29, 83, 213, 30, 1, 252, 177, 213, + 30, 1, 213, 139, 252, 177, 213, 30, 1, 250, 7, 213, 30, 1, 240, 221, 213, + 30, 1, 240, 222, 240, 199, 213, 30, 1, 246, 114, 213, 30, 1, 245, 22, + 246, 115, 218, 143, 213, 30, 1, 239, 71, 213, 30, 1, 207, 59, 213, 30, 1, + 205, 108, 213, 30, 1, 239, 27, 213, 30, 1, 212, 76, 213, 30, 1, 212, 77, + 240, 199, 213, 30, 1, 205, 200, 213, 30, 1, 205, 201, 239, 71, 213, 30, + 1, 232, 17, 213, 30, 1, 230, 105, 213, 30, 1, 226, 211, 213, 30, 1, 223, + 173, 213, 30, 1, 216, 45, 213, 30, 1, 42, 216, 45, 213, 30, 1, 75, 213, + 30, 1, 221, 174, 213, 30, 1, 218, 224, 221, 174, 213, 30, 1, 217, 189, + 213, 30, 1, 220, 6, 213, 30, 1, 218, 143, 213, 30, 1, 215, 171, 213, 30, + 1, 212, 145, 213, 30, 1, 221, 116, 249, 250, 213, 30, 1, 221, 116, 240, + 92, 213, 30, 1, 221, 116, 245, 187, 213, 30, 220, 83, 52, 213, 30, 220, + 83, 55, 213, 30, 220, 83, 244, 20, 213, 30, 205, 13, 52, 213, 30, 205, + 13, 55, 213, 30, 205, 13, 244, 20, 213, 30, 219, 54, 52, 213, 30, 219, + 54, 55, 213, 30, 244, 21, 205, 20, 238, 121, 213, 30, 244, 21, 205, 20, + 252, 104, 213, 30, 239, 74, 52, 213, 30, 239, 74, 55, 213, 30, 239, 73, + 244, 20, 213, 30, 242, 219, 52, 213, 30, 242, 219, 55, 213, 30, 218, 16, + 213, 30, 242, 9, 245, 23, 213, 30, 219, 174, 213, 30, 218, 43, 213, 30, + 118, 79, 177, 52, 213, 30, 118, 79, 177, 55, 213, 30, 129, 177, 52, 213, + 30, 129, 177, 55, 213, 30, 222, 222, 229, 206, 52, 213, 30, 222, 222, + 229, 206, 55, 213, 30, 226, 64, 213, 30, 250, 120, 213, 30, 1, 214, 184, + 205, 79, 213, 30, 1, 214, 184, 231, 156, 213, 30, 1, 214, 184, 242, 28, + 8, 1, 250, 39, 2, 129, 177, 238, 71, 55, 8, 1, 250, 39, 2, 67, 250, 26, + 23, 129, 177, 52, 8, 1, 250, 39, 2, 129, 177, 220, 201, 167, 55, 8, 1, + 250, 39, 2, 129, 177, 220, 201, 167, 250, 26, 23, 118, 177, 52, 8, 1, + 250, 39, 2, 118, 177, 250, 26, 23, 67, 52, 8, 1, 250, 39, 2, 233, 2, 5, + 209, 149, 55, 8, 1, 250, 39, 2, 5, 209, 148, 8, 1, 140, 2, 118, 177, 52, + 8, 1, 140, 2, 129, 177, 220, 201, 167, 55, 8, 1, 246, 118, 2, 118, 177, + 208, 228, 250, 26, 23, 5, 212, 194, 8, 1, 246, 118, 2, 233, 2, 5, 209, + 149, 55, 8, 1, 219, 17, 2, 91, 8, 1, 217, 71, 2, 241, 125, 177, 52, 8, 1, + 252, 201, 2, 118, 177, 52, 8, 1, 252, 201, 2, 129, 177, 220, 201, 173, + 52, 8, 1, 252, 201, 2, 118, 177, 208, 228, 52, 8, 1, 242, 16, 2, 118, + 177, 55, 8, 1, 242, 16, 2, 129, 177, 220, 201, 167, 55, 8, 1, 231, 213, + 2, 67, 52, 8, 1, 231, 213, 2, 129, 177, 52, 8, 1, 231, 213, 2, 129, 177, + 220, 201, 167, 55, 8, 1, 80, 2, 67, 52, 8, 1, 80, 2, 67, 55, 8, 1, 224, + 55, 2, 118, 177, 55, 8, 1, 224, 55, 2, 5, 212, 194, 8, 1, 224, 55, 2, 5, + 209, 148, 8, 1, 230, 107, 2, 134, 8, 1, 219, 17, 2, 118, 177, 208, 228, + 52, 8, 1, 219, 17, 2, 239, 112, 52, 8, 1, 217, 71, 2, 118, 177, 208, 228, + 52, 8, 1, 140, 2, 5, 8, 1, 212, 195, 55, 8, 1, 140, 2, 5, 8, 1, 212, 195, + 23, 118, 245, 21, 8, 1, 217, 71, 2, 5, 8, 1, 212, 195, 23, 118, 245, 21, + 8, 1, 219, 17, 2, 5, 8, 1, 212, 195, 23, 118, 245, 21, 8, 1, 140, 2, 5, + 8, 1, 212, 195, 52, 8, 1, 126, 2, 242, 159, 252, 33, 18, 118, 52, 8, 1, + 126, 2, 242, 159, 252, 33, 18, 129, 52, 8, 1, 242, 42, 87, 2, 242, 159, + 252, 33, 18, 118, 52, 8, 1, 242, 42, 87, 2, 242, 159, 252, 33, 18, 129, + 52, 8, 1, 242, 42, 87, 2, 242, 159, 252, 33, 18, 241, 125, 55, 8, 1, 207, + 60, 2, 242, 159, 252, 33, 18, 118, 52, 8, 1, 207, 60, 2, 242, 159, 252, + 33, 18, 129, 52, 8, 1, 87, 250, 122, 2, 242, 159, 252, 33, 18, 118, 52, + 8, 1, 87, 250, 122, 2, 242, 159, 252, 33, 18, 129, 52, 8, 1, 140, 2, 242, + 159, 252, 33, 18, 241, 125, 55, 8, 1, 217, 71, 2, 242, 159, 252, 33, 18, + 241, 125, 52, 8, 1, 217, 71, 2, 233, 2, 209, 148, 8, 1, 232, 46, 2, 118, + 177, 52, 212, 53, 1, 239, 141, 212, 53, 1, 215, 220, 212, 53, 1, 224, 53, + 212, 53, 1, 219, 109, 212, 53, 1, 250, 181, 212, 53, 1, 229, 245, 212, + 53, 1, 232, 60, 212, 53, 1, 252, 161, 212, 53, 1, 209, 68, 212, 53, 1, + 227, 103, 212, 53, 1, 242, 71, 212, 53, 1, 245, 190, 212, 53, 1, 212, 55, + 212, 53, 1, 230, 137, 212, 53, 1, 240, 240, 212, 53, 1, 240, 22, 212, 53, + 1, 217, 69, 212, 53, 1, 246, 70, 212, 53, 1, 205, 99, 212, 53, 1, 212, + 146, 212, 53, 1, 206, 109, 212, 53, 1, 221, 187, 212, 53, 1, 232, 186, + 212, 53, 1, 248, 85, 212, 53, 1, 210, 207, 212, 53, 1, 239, 19, 212, 53, + 1, 231, 166, 212, 53, 1, 212, 54, 212, 53, 1, 205, 115, 212, 53, 1, 215, + 209, 212, 53, 1, 217, 195, 212, 53, 1, 246, 143, 212, 53, 1, 124, 212, + 53, 1, 205, 19, 212, 53, 1, 252, 197, 212, 53, 1, 240, 93, 212, 53, 1, + 220, 16, 212, 53, 1, 207, 94, 212, 53, 253, 31, 212, 53, 253, 129, 212, + 53, 237, 184, 212, 53, 243, 103, 212, 53, 210, 11, 212, 53, 222, 151, + 212, 53, 243, 111, 212, 53, 242, 151, 212, 53, 222, 221, 212, 53, 222, + 229, 212, 53, 213, 162, 212, 53, 1, 225, 232, 224, 131, 18, 205, 85, 224, + 131, 18, 102, 224, 131, 18, 105, 224, 131, 18, 142, 224, 131, 18, 139, + 224, 131, 18, 168, 224, 131, 18, 184, 224, 131, 18, 195, 224, 131, 18, + 193, 224, 131, 18, 200, 224, 131, 1, 62, 224, 131, 1, 243, 104, 224, 131, + 1, 74, 224, 131, 1, 75, 224, 131, 1, 71, 224, 131, 1, 222, 152, 224, 131, + 1, 76, 224, 131, 1, 246, 132, 224, 131, 1, 226, 33, 224, 131, 1, 250, + 183, 224, 131, 1, 179, 224, 131, 1, 212, 219, 224, 131, 1, 232, 200, 224, + 131, 1, 248, 110, 224, 131, 1, 246, 145, 224, 131, 1, 219, 113, 224, 131, + 1, 218, 89, 224, 131, 1, 217, 199, 224, 131, 1, 240, 187, 224, 131, 1, + 242, 73, 224, 131, 1, 172, 224, 131, 1, 230, 141, 224, 131, 1, 225, 237, + 206, 246, 224, 131, 1, 185, 224, 131, 1, 223, 144, 224, 131, 1, 199, 224, + 131, 1, 155, 224, 131, 1, 207, 96, 224, 131, 1, 190, 224, 131, 1, 223, + 145, 206, 246, 224, 131, 1, 232, 115, 232, 200, 224, 131, 1, 232, 115, + 248, 110, 224, 131, 1, 232, 115, 219, 113, 224, 131, 36, 215, 144, 127, + 211, 118, 224, 131, 36, 215, 144, 114, 211, 118, 224, 131, 36, 215, 144, + 218, 142, 211, 118, 224, 131, 36, 152, 245, 210, 211, 118, 224, 131, 36, + 152, 127, 211, 118, 224, 131, 36, 152, 114, 211, 118, 224, 131, 36, 152, + 218, 142, 211, 118, 224, 131, 36, 225, 197, 83, 224, 131, 36, 50, 67, 52, + 224, 131, 127, 135, 252, 53, 224, 131, 114, 135, 252, 53, 224, 131, 16, + 222, 153, 245, 223, 224, 131, 16, 240, 186, 224, 131, 247, 155, 224, 131, + 242, 168, 83, 224, 131, 230, 112, 217, 160, 1, 252, 179, 217, 160, 1, + 249, 209, 217, 160, 1, 240, 220, 217, 160, 1, 246, 116, 217, 160, 1, 232, + 211, 217, 160, 1, 250, 181, 217, 160, 1, 205, 88, 217, 160, 1, 232, 220, + 217, 160, 1, 211, 156, 217, 160, 1, 205, 182, 217, 160, 1, 232, 61, 217, + 160, 1, 230, 134, 217, 160, 1, 226, 211, 217, 160, 1, 223, 173, 217, 160, + 1, 215, 42, 217, 160, 1, 233, 68, 217, 160, 1, 241, 250, 217, 160, 1, + 210, 241, 217, 160, 1, 219, 193, 217, 160, 1, 218, 143, 217, 160, 1, 215, + 237, 217, 160, 1, 212, 214, 217, 160, 141, 233, 68, 217, 160, 141, 233, + 67, 217, 160, 141, 222, 217, 217, 160, 141, 246, 130, 217, 160, 65, 1, + 242, 249, 205, 182, 217, 160, 141, 242, 249, 205, 182, 217, 160, 22, 3, + 152, 75, 217, 160, 22, 3, 75, 217, 160, 22, 3, 222, 80, 253, 164, 217, + 160, 22, 3, 152, 253, 164, 217, 160, 22, 3, 253, 164, 217, 160, 22, 3, + 222, 80, 62, 217, 160, 22, 3, 152, 62, 217, 160, 22, 3, 62, 217, 160, 65, + 1, 215, 144, 62, 217, 160, 22, 3, 215, 144, 62, 217, 160, 22, 3, 152, 71, + 217, 160, 22, 3, 71, 217, 160, 65, 1, 74, 217, 160, 22, 3, 152, 74, 217, + 160, 22, 3, 74, 217, 160, 22, 3, 76, 217, 160, 22, 3, 213, 162, 217, 160, + 141, 225, 94, 217, 160, 220, 72, 225, 94, 217, 160, 220, 72, 252, 222, + 217, 160, 220, 72, 252, 113, 217, 160, 220, 72, 250, 101, 217, 160, 220, + 72, 251, 194, 217, 160, 220, 72, 215, 159, 217, 160, 253, 29, 83, 217, + 160, 220, 72, 227, 93, 219, 229, 217, 160, 220, 72, 205, 27, 217, 160, + 220, 72, 219, 229, 217, 160, 220, 72, 205, 114, 217, 160, 220, 72, 210, + 140, 217, 160, 220, 72, 252, 4, 217, 160, 220, 72, 214, 188, 227, 176, + 217, 160, 220, 72, 252, 99, 227, 217, 1, 239, 118, 227, 217, 1, 253, 115, + 227, 217, 1, 252, 220, 227, 217, 1, 253, 5, 227, 217, 1, 252, 213, 227, + 217, 1, 209, 168, 227, 217, 1, 251, 152, 227, 217, 1, 232, 220, 227, 217, + 1, 251, 191, 227, 217, 1, 252, 184, 227, 217, 1, 252, 189, 227, 217, 1, + 252, 181, 227, 217, 1, 252, 136, 227, 217, 1, 252, 122, 227, 217, 1, 251, + 231, 227, 217, 1, 233, 68, 227, 217, 1, 252, 68, 227, 217, 1, 251, 201, + 227, 217, 1, 252, 41, 227, 217, 1, 252, 37, 227, 217, 1, 251, 225, 227, + 217, 1, 251, 199, 227, 217, 1, 243, 214, 227, 217, 1, 232, 53, 227, 217, + 1, 252, 200, 227, 217, 252, 226, 83, 227, 217, 208, 171, 83, 227, 217, + 240, 159, 83, 227, 217, 220, 71, 8, 1, 250, 39, 2, 5, 209, 149, 55, 8, 1, + 250, 39, 2, 239, 112, 52, 8, 1, 171, 2, 118, 177, 52, 8, 1, 212, 195, 2, + 118, 177, 52, 8, 1, 242, 16, 2, 67, 250, 26, 23, 129, 177, 52, 8, 1, 220, + 13, 2, 67, 55, 8, 1, 230, 107, 2, 50, 134, 8, 1, 80, 2, 129, 177, 52, 8, + 1, 87, 2, 118, 177, 250, 26, 23, 239, 112, 52, 8, 1, 87, 2, 118, 177, + 250, 26, 23, 67, 52, 8, 1, 219, 17, 2, 229, 111, 8, 1, 207, 60, 2, 67, + 206, 254, 8, 1, 218, 113, 206, 47, 8, 1, 114, 252, 172, 8, 1, 246, 118, + 2, 129, 177, 55, 8, 1, 217, 192, 2, 129, 177, 55, 8, 1, 240, 232, 2, 233, + 2, 91, 8, 1, 213, 243, 207, 59, 8, 1, 205, 109, 2, 233, 2, 209, 149, 52, + 8, 247, 26, 242, 39, 8, 247, 26, 246, 106, 8, 247, 26, 231, 252, 8, 247, + 26, 242, 37, 8, 247, 26, 246, 104, 8, 247, 26, 231, 250, 8, 135, 119, 67, + 52, 8, 135, 118, 177, 52, 8, 135, 229, 112, 52, 8, 135, 119, 67, 55, 8, + 135, 118, 177, 55, 8, 135, 229, 112, 55, 8, 222, 142, 242, 37, 8, 222, + 142, 246, 104, 8, 222, 142, 231, 250, 8, 5, 127, 207, 59, 8, 242, 40, 2, + 218, 148, 8, 242, 40, 2, 67, 52, 8, 231, 253, 2, 67, 55, 8, 47, 251, 244, + 52, 8, 48, 251, 244, 52, 8, 47, 251, 244, 55, 8, 48, 251, 244, 55, 8, 50, + 48, 251, 244, 52, 8, 50, 48, 251, 244, 84, 2, 245, 23, 8, 48, 251, 244, + 84, 2, 245, 23, 8, 246, 107, 2, 245, 23, 8, 141, 215, 73, 224, 55, 240, + 65, 89, 3, 233, 2, 248, 217, 89, 3, 248, 217, 89, 3, 252, 73, 89, 3, 208, + 183, 89, 1, 215, 144, 62, 89, 1, 62, 89, 1, 253, 164, 89, 1, 74, 89, 1, + 233, 102, 89, 1, 71, 89, 1, 209, 162, 89, 1, 115, 137, 89, 1, 115, 149, + 89, 1, 248, 220, 75, 89, 1, 215, 144, 75, 89, 1, 75, 89, 1, 252, 205, 89, + 1, 248, 220, 76, 89, 1, 215, 144, 76, 89, 1, 76, 89, 1, 251, 184, 89, 1, + 172, 89, 1, 231, 167, 89, 1, 240, 244, 89, 1, 240, 99, 89, 1, 225, 77, + 89, 1, 249, 1, 89, 1, 248, 110, 89, 1, 232, 200, 89, 1, 232, 170, 89, 1, + 223, 144, 89, 1, 210, 208, 89, 1, 210, 196, 89, 1, 246, 54, 89, 1, 246, + 38, 89, 1, 224, 103, 89, 1, 212, 219, 89, 1, 212, 56, 89, 1, 246, 145, + 89, 1, 245, 192, 89, 1, 199, 89, 1, 224, 85, 89, 1, 179, 89, 1, 221, 93, + 89, 1, 250, 183, 89, 1, 250, 0, 89, 1, 185, 89, 1, 190, 89, 1, 219, 113, + 89, 1, 218, 89, 89, 1, 230, 141, 89, 1, 229, 172, 89, 1, 229, 163, 89, 1, + 209, 70, 89, 1, 216, 2, 89, 1, 214, 96, 89, 1, 217, 199, 89, 1, 155, 89, + 22, 3, 222, 206, 89, 22, 3, 222, 150, 89, 3, 223, 184, 89, 3, 251, 167, + 89, 22, 3, 253, 164, 89, 22, 3, 74, 89, 22, 3, 233, 102, 89, 22, 3, 71, + 89, 22, 3, 209, 162, 89, 22, 3, 115, 137, 89, 22, 3, 115, 218, 90, 89, + 22, 3, 248, 220, 75, 89, 22, 3, 215, 144, 75, 89, 22, 3, 75, 89, 22, 3, + 252, 205, 89, 22, 3, 248, 220, 76, 89, 22, 3, 215, 144, 76, 89, 22, 3, + 76, 89, 22, 3, 251, 184, 89, 3, 208, 188, 89, 22, 3, 220, 120, 75, 89, + 22, 3, 251, 163, 89, 222, 173, 89, 213, 233, 3, 210, 5, 89, 213, 233, 3, + 252, 75, 89, 239, 237, 253, 21, 89, 253, 9, 253, 21, 89, 22, 3, 248, 220, + 152, 75, 89, 22, 3, 210, 3, 89, 22, 3, 209, 161, 89, 1, 220, 19, 89, 1, + 231, 148, 89, 1, 240, 74, 89, 1, 205, 116, 89, 1, 246, 43, 89, 1, 218, + 212, 89, 1, 242, 73, 89, 1, 205, 168, 89, 1, 115, 218, 90, 89, 1, 115, + 229, 173, 89, 22, 3, 115, 149, 89, 22, 3, 115, 229, 173, 89, 246, 100, + 89, 50, 246, 100, 89, 18, 205, 85, 89, 18, 102, 89, 18, 105, 89, 18, 142, + 89, 18, 139, 89, 18, 168, 89, 18, 184, 89, 18, 195, 89, 18, 193, 89, 18, + 200, 89, 253, 29, 53, 89, 3, 127, 214, 152, 245, 23, 89, 1, 248, 220, 62, + 89, 1, 222, 206, 89, 1, 222, 150, 89, 1, 251, 163, 89, 1, 210, 3, 89, 1, + 209, 161, 89, 1, 227, 181, 246, 54, 89, 1, 205, 81, 89, 1, 77, 190, 89, + 1, 240, 135, 89, 1, 232, 150, 89, 1, 240, 25, 213, 251, 89, 1, 246, 44, + 89, 1, 250, 97, 165, 252, 102, 165, 3, 248, 217, 165, 3, 252, 73, 165, 3, + 208, 183, 165, 1, 62, 165, 1, 253, 164, 165, 1, 74, 165, 1, 233, 102, + 165, 1, 71, 165, 1, 209, 162, 165, 1, 115, 137, 165, 1, 115, 149, 165, 1, + 75, 165, 1, 252, 205, 165, 1, 76, 165, 1, 251, 184, 165, 1, 172, 165, 1, + 231, 167, 165, 1, 240, 244, 165, 1, 240, 99, 165, 1, 225, 77, 165, 1, + 249, 1, 165, 1, 248, 110, 165, 1, 232, 200, 165, 1, 232, 170, 165, 1, + 223, 144, 165, 1, 210, 208, 165, 1, 210, 196, 165, 1, 246, 54, 165, 1, + 246, 38, 165, 1, 224, 103, 165, 1, 212, 219, 165, 1, 212, 56, 165, 1, + 246, 145, 165, 1, 245, 192, 165, 1, 199, 165, 1, 179, 165, 1, 221, 93, + 165, 1, 250, 183, 165, 1, 250, 0, 165, 1, 185, 165, 1, 190, 165, 1, 219, + 113, 165, 1, 230, 141, 165, 1, 216, 2, 165, 1, 214, 96, 165, 1, 217, 199, + 165, 1, 155, 165, 3, 223, 184, 165, 3, 251, 167, 165, 22, 3, 253, 164, + 165, 22, 3, 74, 165, 22, 3, 233, 102, 165, 22, 3, 71, 165, 22, 3, 209, + 162, 165, 22, 3, 115, 137, 165, 22, 3, 115, 218, 90, 165, 22, 3, 75, 165, + 22, 3, 252, 205, 165, 22, 3, 76, 165, 22, 3, 251, 184, 165, 3, 208, 188, + 165, 1, 231, 158, 212, 219, 165, 251, 185, 230, 20, 83, 165, 1, 218, 89, + 165, 1, 218, 212, 165, 1, 205, 168, 165, 1, 115, 218, 90, 165, 1, 115, + 229, 173, 165, 22, 3, 115, 149, 165, 22, 3, 115, 229, 173, 165, 18, 205, + 85, 165, 18, 102, 165, 18, 105, 165, 18, 142, 165, 18, 139, 165, 18, 168, + 165, 18, 184, 165, 18, 195, 165, 18, 193, 165, 18, 200, 165, 1, 219, 114, + 2, 226, 247, 245, 162, 165, 1, 219, 114, 2, 229, 92, 245, 162, 165, 218, + 27, 83, 165, 218, 27, 53, 165, 247, 25, 223, 176, 102, 165, 247, 25, 223, + 176, 105, 165, 247, 25, 223, 176, 142, 165, 247, 25, 223, 176, 139, 165, + 247, 25, 223, 176, 119, 230, 11, 212, 47, 212, 42, 245, 221, 165, 247, + 25, 245, 222, 215, 4, 165, 232, 221, 165, 240, 211, 83, 239, 182, 3, 253, + 4, 249, 224, 239, 182, 3, 249, 224, 239, 182, 3, 208, 183, 239, 182, 1, + 62, 239, 182, 1, 253, 164, 239, 182, 1, 74, 239, 182, 1, 233, 102, 239, + 182, 1, 71, 239, 182, 1, 209, 162, 239, 182, 1, 243, 104, 239, 182, 1, + 252, 205, 239, 182, 1, 222, 152, 239, 182, 1, 251, 184, 239, 182, 1, 172, + 239, 182, 1, 231, 167, 239, 182, 1, 240, 244, 239, 182, 1, 240, 99, 239, + 182, 1, 225, 77, 239, 182, 1, 249, 1, 239, 182, 1, 248, 110, 239, 182, 1, + 232, 200, 239, 182, 1, 232, 170, 239, 182, 1, 223, 144, 239, 182, 1, 210, + 208, 239, 182, 1, 210, 196, 239, 182, 1, 246, 54, 239, 182, 1, 246, 38, + 239, 182, 1, 224, 103, 239, 182, 1, 212, 219, 239, 182, 1, 212, 56, 239, + 182, 1, 246, 145, 239, 182, 1, 245, 192, 239, 182, 1, 199, 239, 182, 1, + 179, 239, 182, 1, 221, 93, 239, 182, 1, 250, 183, 239, 182, 1, 250, 0, + 239, 182, 1, 185, 239, 182, 1, 190, 239, 182, 1, 219, 113, 239, 182, 1, + 230, 141, 239, 182, 1, 229, 172, 239, 182, 1, 209, 70, 239, 182, 1, 216, + 2, 239, 182, 1, 217, 199, 239, 182, 1, 155, 239, 182, 3, 223, 184, 239, + 182, 22, 3, 253, 164, 239, 182, 22, 3, 74, 239, 182, 22, 3, 233, 102, + 239, 182, 22, 3, 71, 239, 182, 22, 3, 209, 162, 239, 182, 22, 3, 243, + 104, 239, 182, 22, 3, 252, 205, 239, 182, 22, 3, 222, 152, 239, 182, 22, + 3, 251, 184, 239, 182, 3, 208, 188, 239, 182, 3, 210, 7, 239, 182, 1, + 231, 148, 239, 182, 1, 240, 74, 239, 182, 1, 205, 116, 239, 182, 1, 218, + 89, 239, 182, 1, 242, 73, 239, 182, 18, 205, 85, 239, 182, 18, 102, 239, + 182, 18, 105, 239, 182, 18, 142, 239, 182, 18, 139, 239, 182, 18, 168, + 239, 182, 18, 184, 239, 182, 18, 195, 239, 182, 18, 193, 239, 182, 18, + 200, 239, 182, 211, 164, 239, 182, 253, 3, 239, 182, 232, 241, 239, 182, + 209, 190, 239, 182, 243, 76, 222, 157, 239, 182, 3, 206, 84, 198, 3, 248, + 217, 198, 3, 252, 73, 198, 3, 208, 183, 198, 1, 62, 198, 1, 253, 164, + 198, 1, 74, 198, 1, 233, 102, 198, 1, 71, 198, 1, 209, 162, 198, 1, 115, + 137, 198, 1, 115, 149, 198, 22, 248, 220, 75, 198, 1, 75, 198, 1, 252, + 205, 198, 22, 248, 220, 76, 198, 1, 76, 198, 1, 251, 184, 198, 1, 172, + 198, 1, 231, 167, 198, 1, 240, 244, 198, 1, 240, 99, 198, 1, 225, 77, + 198, 1, 249, 1, 198, 1, 248, 110, 198, 1, 232, 200, 198, 1, 232, 170, + 198, 1, 223, 144, 198, 1, 210, 208, 198, 1, 210, 196, 198, 1, 246, 54, + 198, 1, 246, 38, 198, 1, 224, 103, 198, 1, 212, 219, 198, 1, 212, 56, + 198, 1, 246, 145, 198, 1, 245, 192, 198, 1, 199, 198, 1, 179, 198, 1, + 221, 93, 198, 1, 250, 183, 198, 1, 250, 0, 198, 1, 185, 198, 1, 190, 198, + 1, 219, 113, 198, 1, 230, 141, 198, 1, 229, 172, 198, 1, 209, 70, 198, 1, + 216, 2, 198, 1, 214, 96, 198, 1, 217, 199, 198, 1, 155, 198, 3, 223, 184, + 198, 3, 251, 167, 198, 22, 3, 253, 164, 198, 22, 3, 74, 198, 22, 3, 233, + 102, 198, 22, 3, 71, 198, 22, 3, 209, 162, 198, 22, 3, 115, 137, 198, 22, + 3, 115, 218, 90, 198, 22, 3, 248, 220, 75, 198, 22, 3, 75, 198, 22, 3, + 252, 205, 198, 22, 3, 248, 220, 76, 198, 22, 3, 76, 198, 22, 3, 251, 184, + 198, 3, 208, 188, 198, 222, 173, 198, 1, 115, 218, 90, 198, 1, 115, 229, + 173, 198, 22, 3, 115, 149, 198, 22, 3, 115, 229, 173, 198, 18, 205, 85, + 198, 18, 102, 198, 18, 105, 198, 18, 142, 198, 18, 139, 198, 18, 168, + 198, 18, 184, 198, 18, 195, 198, 18, 193, 198, 18, 200, 198, 253, 29, 53, + 198, 218, 27, 53, 178, 3, 248, 217, 178, 3, 252, 73, 178, 3, 208, 183, + 178, 1, 62, 178, 1, 253, 164, 178, 1, 74, 178, 1, 233, 102, 178, 1, 71, + 178, 1, 209, 162, 178, 1, 115, 137, 178, 1, 115, 149, 178, 1, 75, 178, 1, + 252, 205, 178, 1, 76, 178, 1, 251, 184, 178, 1, 172, 178, 1, 231, 167, + 178, 1, 240, 244, 178, 1, 240, 99, 178, 1, 225, 77, 178, 1, 249, 1, 178, + 1, 248, 110, 178, 1, 232, 200, 178, 1, 232, 170, 178, 1, 223, 144, 178, + 1, 210, 208, 178, 1, 210, 196, 178, 1, 246, 54, 178, 1, 246, 38, 178, 1, + 224, 103, 178, 1, 212, 219, 178, 1, 212, 56, 178, 1, 246, 145, 178, 1, + 245, 192, 178, 1, 199, 178, 1, 179, 178, 1, 221, 93, 178, 1, 250, 183, + 178, 1, 250, 0, 178, 1, 185, 178, 1, 190, 178, 1, 219, 113, 178, 1, 230, + 141, 178, 1, 229, 172, 178, 1, 209, 70, 178, 1, 216, 2, 178, 1, 214, 96, + 178, 1, 217, 199, 178, 1, 155, 178, 3, 223, 184, 178, 3, 251, 167, 178, + 22, 3, 253, 164, 178, 22, 3, 74, 178, 22, 3, 233, 102, 178, 22, 3, 71, + 178, 22, 3, 209, 162, 178, 22, 3, 115, 137, 178, 22, 3, 115, 218, 90, + 178, 22, 3, 75, 178, 22, 3, 252, 205, 178, 22, 3, 76, 178, 22, 3, 251, + 184, 178, 3, 208, 188, 178, 252, 206, 230, 20, 83, 178, 251, 185, 230, + 20, 83, 178, 1, 218, 89, 178, 1, 218, 212, 178, 1, 205, 168, 178, 1, 115, + 218, 90, 178, 1, 115, 229, 173, 178, 22, 3, 115, 149, 178, 22, 3, 115, + 229, 173, 178, 18, 205, 85, 178, 18, 102, 178, 18, 105, 178, 18, 142, + 178, 18, 139, 178, 18, 168, 178, 18, 184, 178, 18, 195, 178, 18, 193, + 178, 18, 200, 178, 232, 221, 178, 1, 207, 96, 178, 241, 116, 119, 219, + 204, 178, 241, 116, 119, 239, 121, 178, 241, 116, 129, 219, 202, 178, + 241, 116, 119, 215, 2, 178, 241, 116, 119, 243, 83, 178, 241, 116, 129, + 215, 1, 40, 3, 252, 73, 40, 3, 208, 183, 40, 1, 62, 40, 1, 253, 164, 40, + 1, 74, 40, 1, 233, 102, 40, 1, 71, 40, 1, 209, 162, 40, 1, 75, 40, 1, + 243, 104, 40, 1, 252, 205, 40, 1, 76, 40, 1, 222, 152, 40, 1, 251, 184, + 40, 1, 172, 40, 1, 225, 77, 40, 1, 249, 1, 40, 1, 232, 200, 40, 1, 223, + 144, 40, 1, 210, 208, 40, 1, 224, 103, 40, 1, 212, 219, 40, 1, 199, 40, + 1, 224, 85, 40, 1, 179, 40, 1, 185, 40, 1, 190, 40, 1, 219, 113, 40, 1, + 218, 89, 40, 1, 230, 141, 40, 1, 229, 172, 40, 1, 229, 163, 40, 1, 209, + 70, 40, 1, 216, 2, 40, 1, 214, 96, 40, 1, 217, 199, 40, 1, 155, 40, 22, + 3, 253, 164, 40, 22, 3, 74, 40, 22, 3, 233, 102, 40, 22, 3, 71, 40, 22, + 3, 209, 162, 40, 22, 3, 75, 40, 22, 3, 243, 104, 40, 22, 3, 252, 205, 40, + 22, 3, 76, 40, 22, 3, 222, 152, 40, 22, 3, 251, 184, 40, 3, 208, 188, 40, + 222, 173, 40, 251, 185, 230, 20, 83, 40, 18, 205, 85, 40, 18, 102, 40, + 18, 105, 40, 18, 142, 40, 18, 139, 40, 18, 168, 40, 18, 184, 40, 18, 195, + 40, 18, 193, 40, 18, 200, 40, 43, 212, 98, 40, 43, 119, 238, 29, 40, 43, + 119, 211, 242, 40, 246, 67, 53, 40, 226, 153, 53, 40, 206, 50, 53, 40, + 246, 6, 53, 40, 247, 68, 53, 40, 251, 232, 84, 53, 40, 218, 27, 53, 40, + 43, 53, 163, 3, 36, 248, 218, 52, 163, 3, 248, 217, 163, 3, 252, 73, 163, + 3, 208, 183, 163, 1, 62, 163, 1, 253, 164, 163, 1, 74, 163, 1, 233, 102, + 163, 1, 71, 163, 1, 209, 162, 163, 1, 115, 137, 163, 1, 115, 149, 163, 1, + 75, 163, 1, 243, 104, 163, 1, 252, 205, 163, 1, 76, 163, 1, 222, 152, + 163, 1, 251, 184, 163, 1, 172, 163, 1, 231, 167, 163, 1, 240, 244, 163, + 1, 240, 99, 163, 1, 225, 77, 163, 1, 249, 1, 163, 1, 248, 110, 163, 1, + 232, 200, 163, 1, 232, 170, 163, 1, 223, 144, 163, 1, 210, 208, 163, 1, + 210, 196, 163, 1, 246, 54, 163, 1, 246, 38, 163, 1, 224, 103, 163, 1, + 212, 219, 163, 1, 212, 56, 163, 1, 246, 145, 163, 1, 245, 192, 163, 1, + 199, 163, 1, 179, 163, 1, 221, 93, 163, 1, 250, 183, 163, 1, 250, 0, 163, + 1, 185, 163, 1, 190, 163, 1, 219, 113, 163, 1, 218, 89, 163, 1, 230, 141, + 163, 1, 229, 172, 163, 1, 229, 163, 163, 1, 209, 70, 163, 1, 216, 2, 163, + 1, 214, 96, 163, 1, 217, 199, 163, 1, 155, 163, 3, 251, 167, 163, 22, 3, + 253, 164, 163, 22, 3, 74, 163, 22, 3, 233, 102, 163, 22, 3, 71, 163, 22, + 3, 209, 162, 163, 22, 3, 115, 137, 163, 22, 3, 115, 218, 90, 163, 22, 3, + 75, 163, 22, 3, 243, 104, 163, 22, 3, 252, 205, 163, 22, 3, 76, 163, 22, + 3, 222, 152, 163, 22, 3, 251, 184, 163, 3, 208, 188, 163, 230, 20, 83, + 163, 252, 206, 230, 20, 83, 163, 1, 210, 243, 163, 1, 243, 196, 163, 1, + 115, 218, 90, 163, 1, 115, 229, 173, 163, 22, 3, 115, 149, 163, 22, 3, + 115, 229, 173, 163, 18, 205, 85, 163, 18, 102, 163, 18, 105, 163, 18, + 142, 163, 18, 139, 163, 18, 168, 163, 18, 184, 163, 18, 195, 163, 18, + 193, 163, 18, 200, 163, 241, 116, 18, 205, 86, 33, 222, 210, 220, 160, + 73, 139, 163, 241, 116, 18, 119, 33, 222, 210, 220, 160, 73, 139, 163, + 241, 116, 18, 118, 33, 222, 210, 220, 160, 73, 139, 163, 241, 116, 18, + 129, 33, 222, 210, 220, 160, 73, 139, 163, 241, 116, 18, 119, 33, 242, + 179, 220, 160, 73, 139, 163, 241, 116, 18, 118, 33, 242, 179, 220, 160, + 73, 139, 163, 241, 116, 18, 129, 33, 242, 179, 220, 160, 73, 139, 163, 3, + 210, 134, 183, 3, 248, 217, 183, 3, 252, 73, 183, 3, 208, 183, 183, 1, + 62, 183, 1, 253, 164, 183, 1, 74, 183, 1, 233, 102, 183, 1, 71, 183, 1, + 209, 162, 183, 1, 115, 137, 183, 1, 115, 149, 183, 1, 75, 183, 1, 243, + 104, 183, 1, 252, 205, 183, 1, 76, 183, 1, 222, 152, 183, 1, 251, 184, + 183, 1, 172, 183, 1, 231, 167, 183, 1, 240, 244, 183, 1, 240, 99, 183, 1, + 225, 77, 183, 1, 249, 1, 183, 1, 248, 110, 183, 1, 232, 200, 183, 1, 232, + 170, 183, 1, 223, 144, 183, 1, 210, 208, 183, 1, 210, 196, 183, 1, 246, + 54, 183, 1, 246, 38, 183, 1, 224, 103, 183, 1, 212, 219, 183, 1, 212, 56, + 183, 1, 246, 145, 183, 1, 245, 192, 183, 1, 199, 183, 1, 179, 183, 1, + 221, 93, 183, 1, 250, 183, 183, 1, 250, 0, 183, 1, 185, 183, 1, 190, 183, + 1, 219, 113, 183, 1, 218, 89, 183, 1, 230, 141, 183, 1, 229, 172, 183, 1, + 209, 70, 183, 1, 216, 2, 183, 1, 214, 96, 183, 1, 217, 199, 183, 1, 155, + 183, 3, 223, 184, 183, 3, 251, 167, 183, 22, 3, 253, 164, 183, 22, 3, 74, + 183, 22, 3, 233, 102, 183, 22, 3, 71, 183, 22, 3, 209, 162, 183, 22, 3, + 115, 137, 183, 22, 3, 115, 218, 90, 183, 22, 3, 75, 183, 22, 3, 243, 104, + 183, 22, 3, 252, 205, 183, 22, 3, 76, 183, 22, 3, 222, 152, 183, 22, 3, + 251, 184, 183, 3, 208, 188, 183, 230, 20, 83, 183, 252, 206, 230, 20, 83, + 183, 1, 242, 73, 183, 1, 115, 218, 90, 183, 1, 115, 229, 173, 183, 22, 3, + 115, 149, 183, 22, 3, 115, 229, 173, 183, 18, 205, 85, 183, 18, 102, 183, + 18, 105, 183, 18, 142, 183, 18, 139, 183, 18, 168, 183, 18, 184, 183, 18, + 195, 183, 18, 193, 183, 18, 200, 183, 3, 232, 156, 183, 3, 209, 204, 156, + 3, 248, 217, 156, 3, 252, 73, 156, 3, 208, 183, 156, 1, 62, 156, 1, 253, + 164, 156, 1, 74, 156, 1, 233, 102, 156, 1, 71, 156, 1, 209, 162, 156, 1, + 115, 137, 156, 1, 115, 149, 156, 1, 75, 156, 1, 243, 104, 156, 1, 252, + 205, 156, 1, 76, 156, 1, 222, 152, 156, 1, 251, 184, 156, 1, 172, 156, 1, + 231, 167, 156, 1, 240, 244, 156, 1, 240, 99, 156, 1, 225, 77, 156, 1, + 249, 1, 156, 1, 248, 110, 156, 1, 232, 200, 156, 1, 232, 170, 156, 1, + 223, 144, 156, 1, 210, 208, 156, 1, 210, 196, 156, 1, 246, 54, 156, 1, + 246, 38, 156, 1, 224, 103, 156, 1, 212, 219, 156, 1, 212, 56, 156, 1, + 246, 145, 156, 1, 245, 192, 156, 1, 199, 156, 1, 224, 85, 156, 1, 179, + 156, 1, 221, 93, 156, 1, 250, 183, 156, 1, 250, 0, 156, 1, 185, 156, 1, + 190, 156, 1, 219, 113, 156, 1, 218, 89, 156, 1, 230, 141, 156, 1, 229, + 172, 156, 1, 229, 163, 156, 1, 209, 70, 156, 1, 216, 2, 156, 1, 214, 96, + 156, 1, 217, 199, 156, 1, 155, 156, 1, 210, 177, 156, 3, 251, 167, 156, + 22, 3, 253, 164, 156, 22, 3, 74, 156, 22, 3, 233, 102, 156, 22, 3, 71, + 156, 22, 3, 209, 162, 156, 22, 3, 115, 137, 156, 22, 3, 115, 218, 90, + 156, 22, 3, 75, 156, 22, 3, 243, 104, 156, 22, 3, 252, 205, 156, 22, 3, + 76, 156, 22, 3, 222, 152, 156, 22, 3, 251, 184, 156, 3, 208, 188, 156, 1, + 67, 218, 248, 156, 251, 185, 230, 20, 83, 156, 1, 115, 218, 90, 156, 1, + 115, 229, 173, 156, 22, 3, 115, 149, 156, 22, 3, 115, 229, 173, 156, 18, + 205, 85, 156, 18, 102, 156, 18, 105, 156, 18, 142, 156, 18, 139, 156, 18, + 168, 156, 18, 184, 156, 18, 195, 156, 18, 193, 156, 18, 200, 156, 43, + 212, 98, 156, 43, 119, 238, 29, 156, 43, 119, 211, 242, 156, 241, 116, + 119, 219, 204, 156, 241, 116, 119, 239, 121, 156, 241, 116, 129, 219, + 202, 156, 246, 72, 83, 156, 1, 248, 47, 224, 104, 156, 1, 248, 47, 226, + 33, 156, 1, 248, 47, 218, 90, 156, 1, 248, 47, 149, 156, 1, 248, 47, 229, + 173, 156, 1, 248, 47, 232, 76, 132, 3, 252, 72, 132, 3, 208, 182, 132, 1, + 251, 157, 132, 1, 253, 118, 132, 1, 252, 228, 132, 1, 252, 243, 132, 1, + 232, 210, 132, 1, 233, 101, 132, 1, 209, 153, 132, 1, 209, 156, 132, 1, + 232, 236, 132, 1, 232, 237, 132, 1, 233, 87, 132, 1, 233, 89, 132, 1, + 242, 152, 132, 1, 243, 99, 132, 1, 252, 191, 132, 1, 222, 70, 132, 1, + 222, 145, 132, 1, 251, 170, 132, 1, 252, 147, 231, 229, 132, 1, 227, 246, + 231, 229, 132, 1, 252, 147, 240, 190, 132, 1, 227, 246, 240, 190, 132, 1, + 232, 22, 225, 229, 132, 1, 217, 143, 240, 190, 132, 1, 252, 147, 248, + 174, 132, 1, 227, 246, 248, 174, 132, 1, 252, 147, 232, 185, 132, 1, 227, + 246, 232, 185, 132, 1, 212, 212, 225, 229, 132, 1, 212, 212, 217, 142, + 225, 230, 132, 1, 217, 143, 232, 185, 132, 1, 252, 147, 210, 204, 132, 1, + 227, 246, 210, 204, 132, 1, 252, 147, 246, 45, 132, 1, 227, 246, 246, 45, + 132, 1, 226, 61, 225, 184, 132, 1, 217, 143, 246, 45, 132, 1, 252, 147, + 212, 139, 132, 1, 227, 246, 212, 139, 132, 1, 252, 147, 246, 65, 132, 1, + 227, 246, 246, 65, 132, 1, 246, 96, 225, 184, 132, 1, 217, 143, 246, 65, + 132, 1, 252, 147, 221, 182, 132, 1, 227, 246, 221, 182, 132, 1, 252, 147, + 250, 99, 132, 1, 227, 246, 250, 99, 132, 1, 227, 161, 132, 1, 252, 131, + 250, 99, 132, 1, 206, 57, 132, 1, 219, 57, 132, 1, 246, 96, 230, 67, 132, + 1, 209, 41, 132, 1, 212, 212, 217, 115, 132, 1, 226, 61, 217, 115, 132, + 1, 246, 96, 217, 115, 132, 1, 239, 75, 132, 1, 226, 61, 230, 67, 132, 1, + 242, 30, 132, 3, 252, 180, 132, 22, 3, 252, 238, 132, 22, 3, 231, 192, + 252, 245, 132, 22, 3, 245, 135, 252, 245, 132, 22, 3, 231, 192, 232, 233, + 132, 22, 3, 245, 135, 232, 233, 132, 22, 3, 231, 192, 222, 50, 132, 22, + 3, 245, 135, 222, 50, 132, 22, 3, 240, 233, 132, 22, 3, 231, 38, 132, 22, + 3, 245, 135, 231, 38, 132, 22, 3, 231, 40, 245, 240, 132, 22, 3, 231, 39, + 239, 142, 252, 238, 132, 22, 3, 231, 39, 239, 142, 245, 135, 252, 238, + 132, 22, 3, 231, 39, 239, 142, 240, 189, 132, 22, 3, 240, 189, 132, 229, + 183, 18, 205, 85, 132, 229, 183, 18, 102, 132, 229, 183, 18, 105, 132, + 229, 183, 18, 142, 132, 229, 183, 18, 139, 132, 229, 183, 18, 168, 132, + 229, 183, 18, 184, 132, 229, 183, 18, 195, 132, 229, 183, 18, 193, 132, + 229, 183, 18, 200, 132, 22, 3, 245, 135, 240, 233, 132, 22, 3, 245, 135, + 240, 189, 132, 220, 72, 230, 221, 189, 157, 231, 54, 232, 41, 189, 157, + 231, 139, 231, 162, 189, 157, 231, 139, 231, 131, 189, 157, 231, 139, + 231, 126, 189, 157, 231, 139, 231, 135, 189, 157, 231, 139, 219, 78, 189, + 157, 225, 3, 224, 246, 189, 157, 248, 33, 248, 100, 189, 157, 248, 33, + 248, 43, 189, 157, 248, 33, 248, 99, 189, 157, 214, 194, 214, 193, 189, + 157, 248, 33, 248, 29, 189, 157, 205, 248, 205, 255, 189, 157, 245, 52, + 248, 107, 189, 157, 211, 130, 221, 193, 189, 157, 211, 254, 212, 46, 189, + 157, 211, 254, 225, 206, 189, 157, 211, 254, 221, 56, 189, 157, 224, 68, + 225, 101, 189, 157, 245, 52, 245, 241, 189, 157, 211, 130, 212, 167, 189, + 157, 211, 254, 211, 225, 189, 157, 211, 254, 212, 52, 189, 157, 211, 254, + 211, 249, 189, 157, 224, 68, 223, 217, 189, 157, 249, 185, 250, 154, 189, + 157, 220, 212, 220, 240, 189, 157, 221, 67, 221, 58, 189, 157, 241, 163, + 242, 73, 189, 157, 221, 67, 221, 86, 189, 157, 241, 163, 242, 47, 189, + 157, 221, 67, 217, 155, 189, 157, 226, 182, 185, 189, 157, 205, 248, 206, + 85, 189, 157, 218, 125, 218, 49, 189, 157, 218, 50, 189, 157, 229, 145, + 229, 198, 189, 157, 229, 81, 189, 157, 206, 251, 207, 91, 189, 157, 214, + 194, 217, 170, 189, 157, 214, 194, 218, 23, 189, 157, 214, 194, 213, 202, + 189, 157, 238, 150, 238, 245, 189, 157, 229, 145, 248, 13, 189, 157, 148, + 252, 114, 189, 157, 238, 150, 224, 63, 189, 157, 222, 28, 189, 157, 217, + 137, 62, 189, 157, 227, 240, 239, 109, 189, 157, 217, 137, 253, 164, 189, + 157, 217, 137, 252, 136, 189, 157, 217, 137, 74, 189, 157, 217, 137, 233, + 102, 189, 157, 217, 137, 210, 3, 189, 157, 217, 137, 210, 1, 189, 157, + 217, 137, 71, 189, 157, 217, 137, 209, 162, 189, 157, 221, 69, 189, 247, + 25, 16, 250, 155, 189, 157, 217, 137, 75, 189, 157, 217, 137, 252, 248, + 189, 157, 217, 137, 76, 189, 157, 217, 137, 252, 206, 227, 234, 189, 157, + 217, 137, 252, 206, 227, 235, 189, 157, 230, 110, 189, 157, 227, 231, + 189, 157, 227, 232, 189, 157, 227, 240, 243, 75, 189, 157, 227, 240, 211, + 253, 189, 157, 227, 240, 211, 54, 189, 157, 227, 240, 248, 87, 189, 157, + 212, 44, 189, 157, 224, 202, 189, 157, 206, 79, 189, 157, 241, 153, 189, + 18, 205, 85, 189, 18, 102, 189, 18, 105, 189, 18, 142, 189, 18, 139, 189, + 18, 168, 189, 18, 184, 189, 18, 195, 189, 18, 193, 189, 18, 200, 189, + 157, 252, 110, 189, 157, 231, 136, 230, 90, 1, 231, 53, 230, 90, 1, 231, + 139, 213, 151, 230, 90, 1, 231, 139, 212, 176, 230, 90, 1, 225, 2, 230, + 90, 1, 247, 174, 230, 90, 1, 214, 194, 212, 176, 230, 90, 1, 223, 110, + 230, 90, 1, 245, 51, 230, 90, 1, 124, 230, 90, 1, 211, 254, 213, 151, + 230, 90, 1, 211, 254, 212, 176, 230, 90, 1, 224, 67, 230, 90, 1, 249, + 184, 230, 90, 1, 220, 211, 230, 90, 1, 221, 67, 213, 151, 230, 90, 1, + 241, 163, 212, 176, 230, 90, 1, 221, 67, 212, 176, 230, 90, 1, 241, 163, + 213, 151, 230, 90, 1, 226, 181, 230, 90, 1, 205, 247, 230, 90, 1, 229, + 145, 229, 198, 230, 90, 1, 229, 145, 229, 109, 230, 90, 1, 206, 250, 230, + 90, 1, 214, 194, 213, 151, 230, 90, 1, 238, 150, 213, 151, 230, 90, 1, + 76, 230, 90, 1, 238, 150, 212, 176, 230, 90, 243, 54, 230, 90, 22, 3, 62, + 230, 90, 22, 3, 227, 240, 232, 27, 230, 90, 22, 3, 253, 164, 230, 90, 22, + 3, 252, 136, 230, 90, 22, 3, 74, 230, 90, 22, 3, 233, 102, 230, 90, 22, + 3, 206, 123, 230, 90, 22, 3, 205, 169, 230, 90, 22, 3, 71, 230, 90, 22, + 3, 209, 162, 230, 90, 22, 3, 227, 240, 231, 36, 230, 90, 216, 47, 3, 229, + 144, 230, 90, 216, 47, 3, 223, 110, 230, 90, 22, 3, 75, 230, 90, 22, 3, + 243, 90, 230, 90, 22, 3, 76, 230, 90, 22, 3, 251, 159, 230, 90, 22, 3, + 252, 205, 230, 90, 231, 54, 230, 141, 230, 90, 135, 227, 240, 243, 75, + 230, 90, 135, 227, 240, 211, 253, 230, 90, 135, 227, 240, 211, 211, 230, + 90, 135, 227, 240, 248, 182, 230, 90, 248, 223, 83, 230, 90, 224, 211, + 230, 90, 18, 205, 85, 230, 90, 18, 102, 230, 90, 18, 105, 230, 90, 18, + 142, 230, 90, 18, 139, 230, 90, 18, 168, 230, 90, 18, 184, 230, 90, 18, + 195, 230, 90, 18, 193, 230, 90, 18, 200, 230, 90, 238, 150, 224, 67, 230, + 90, 238, 150, 226, 181, 230, 90, 1, 231, 140, 240, 19, 230, 90, 1, 231, + 140, 223, 110, 72, 4, 222, 173, 72, 141, 239, 215, 206, 3, 227, 16, 210, + 249, 62, 72, 141, 239, 215, 206, 3, 227, 16, 254, 254, 218, 129, 250, 63, + 185, 72, 141, 239, 215, 206, 3, 227, 16, 254, 254, 239, 215, 210, 229, + 185, 72, 141, 78, 206, 3, 227, 16, 227, 121, 185, 72, 141, 247, 188, 206, + 3, 227, 16, 216, 9, 185, 72, 141, 248, 200, 206, 3, 227, 16, 221, 57, + 215, 252, 185, 72, 141, 206, 3, 227, 16, 210, 229, 215, 252, 185, 72, + 141, 217, 113, 215, 251, 72, 141, 249, 104, 206, 3, 227, 15, 72, 141, + 249, 204, 215, 154, 206, 3, 227, 15, 72, 141, 233, 6, 210, 228, 72, 141, + 245, 234, 210, 229, 249, 103, 72, 141, 215, 251, 72, 141, 223, 115, 215, + 251, 72, 141, 210, 229, 215, 251, 72, 141, 223, 115, 210, 229, 215, 251, + 72, 141, 218, 151, 248, 71, 214, 110, 215, 251, 72, 141, 218, 216, 239, + 246, 215, 251, 72, 141, 248, 200, 255, 2, 218, 54, 227, 120, 152, 248, + 226, 72, 141, 239, 215, 210, 228, 72, 229, 132, 3, 248, 108, 218, 53, 72, + 229, 132, 3, 229, 246, 218, 53, 72, 251, 205, 3, 216, 5, 240, 173, 255, + 3, 218, 53, 72, 251, 205, 3, 255, 0, 179, 72, 251, 205, 3, 217, 87, 210, + 223, 72, 3, 219, 53, 245, 65, 240, 172, 72, 3, 219, 53, 245, 65, 240, 21, + 72, 3, 219, 53, 245, 65, 239, 216, 72, 3, 219, 53, 225, 225, 240, 172, + 72, 3, 219, 53, 225, 225, 240, 21, 72, 3, 219, 53, 245, 65, 219, 53, 225, + 224, 72, 18, 205, 85, 72, 18, 102, 72, 18, 105, 72, 18, 142, 72, 18, 139, + 72, 18, 168, 72, 18, 184, 72, 18, 195, 72, 18, 193, 72, 18, 200, 72, 18, + 160, 102, 72, 18, 160, 105, 72, 18, 160, 142, 72, 18, 160, 139, 72, 18, + 160, 168, 72, 18, 160, 184, 72, 18, 160, 195, 72, 18, 160, 193, 72, 18, + 160, 200, 72, 18, 160, 205, 85, 72, 141, 249, 106, 218, 53, 72, 141, 225, + 68, 249, 36, 223, 126, 205, 21, 72, 141, 248, 200, 255, 2, 218, 54, 249, + 37, 226, 225, 248, 226, 72, 141, 225, 68, 249, 36, 216, 6, 218, 53, 72, + 141, 248, 83, 227, 15, 72, 141, 210, 244, 254, 255, 72, 141, 239, 198, + 218, 54, 239, 158, 72, 141, 239, 198, 218, 54, 239, 164, 72, 141, 252, + 115, 231, 157, 239, 158, 72, 141, 252, 115, 231, 157, 239, 164, 72, 3, + 206, 71, 210, 227, 72, 3, 227, 200, 210, 227, 72, 1, 172, 72, 1, 231, + 167, 72, 1, 240, 244, 72, 1, 240, 99, 72, 1, 225, 77, 72, 1, 249, 1, 72, + 1, 248, 110, 72, 1, 232, 200, 72, 1, 223, 144, 72, 1, 210, 208, 72, 1, + 210, 196, 72, 1, 246, 54, 72, 1, 246, 38, 72, 1, 224, 103, 72, 1, 212, + 219, 72, 1, 212, 56, 72, 1, 246, 145, 72, 1, 245, 192, 72, 1, 199, 72, 1, + 179, 72, 1, 221, 93, 72, 1, 250, 183, 72, 1, 250, 0, 72, 1, 185, 72, 1, + 210, 243, 72, 1, 210, 233, 72, 1, 243, 196, 72, 1, 243, 190, 72, 1, 207, + 96, 72, 1, 205, 81, 72, 1, 205, 116, 72, 1, 255, 5, 72, 1, 190, 72, 1, + 219, 113, 72, 1, 230, 141, 72, 1, 216, 2, 72, 1, 214, 96, 72, 1, 217, + 199, 72, 1, 155, 72, 1, 62, 72, 1, 230, 250, 72, 1, 241, 200, 219, 113, + 72, 1, 231, 72, 72, 1, 218, 89, 72, 22, 3, 253, 164, 72, 22, 3, 74, 72, + 22, 3, 233, 102, 72, 22, 3, 71, 72, 22, 3, 209, 162, 72, 22, 3, 115, 137, + 72, 22, 3, 115, 218, 90, 72, 22, 3, 115, 149, 72, 22, 3, 115, 229, 173, + 72, 22, 3, 75, 72, 22, 3, 243, 104, 72, 22, 3, 76, 72, 22, 3, 222, 152, + 72, 3, 218, 135, 213, 204, 225, 78, 218, 124, 72, 3, 218, 129, 250, 62, + 72, 22, 3, 218, 224, 74, 72, 22, 3, 218, 224, 233, 102, 72, 3, 223, 126, + 205, 22, 225, 233, 246, 145, 72, 3, 214, 207, 230, 60, 72, 141, 239, 123, + 72, 141, 222, 16, 72, 3, 230, 63, 218, 53, 72, 3, 206, 76, 218, 53, 72, + 3, 230, 64, 210, 244, 248, 226, 72, 3, 227, 123, 248, 226, 72, 3, 239, + 219, 248, 227, 218, 214, 72, 3, 239, 219, 227, 113, 218, 214, 72, 3, 233, + 2, 227, 123, 248, 226, 72, 213, 191, 3, 230, 64, 210, 244, 248, 226, 72, + 213, 191, 3, 227, 123, 248, 226, 72, 213, 191, 3, 233, 2, 227, 123, 248, + 226, 72, 213, 191, 1, 172, 72, 213, 191, 1, 231, 167, 72, 213, 191, 1, + 240, 244, 72, 213, 191, 1, 240, 99, 72, 213, 191, 1, 225, 77, 72, 213, + 191, 1, 249, 1, 72, 213, 191, 1, 248, 110, 72, 213, 191, 1, 232, 200, 72, + 213, 191, 1, 223, 144, 72, 213, 191, 1, 210, 208, 72, 213, 191, 1, 210, + 196, 72, 213, 191, 1, 246, 54, 72, 213, 191, 1, 246, 38, 72, 213, 191, 1, + 224, 103, 72, 213, 191, 1, 212, 219, 72, 213, 191, 1, 212, 56, 72, 213, + 191, 1, 246, 145, 72, 213, 191, 1, 245, 192, 72, 213, 191, 1, 199, 72, + 213, 191, 1, 179, 72, 213, 191, 1, 221, 93, 72, 213, 191, 1, 250, 183, + 72, 213, 191, 1, 250, 0, 72, 213, 191, 1, 185, 72, 213, 191, 1, 210, 243, + 72, 213, 191, 1, 210, 233, 72, 213, 191, 1, 243, 196, 72, 213, 191, 1, + 243, 190, 72, 213, 191, 1, 207, 96, 72, 213, 191, 1, 205, 81, 72, 213, + 191, 1, 205, 116, 72, 213, 191, 1, 255, 5, 72, 213, 191, 1, 190, 72, 213, + 191, 1, 219, 113, 72, 213, 191, 1, 230, 141, 72, 213, 191, 1, 216, 2, 72, + 213, 191, 1, 214, 96, 72, 213, 191, 1, 217, 199, 72, 213, 191, 1, 155, + 72, 213, 191, 1, 62, 72, 213, 191, 1, 230, 250, 72, 213, 191, 1, 241, + 200, 207, 96, 72, 213, 191, 1, 241, 200, 190, 72, 213, 191, 1, 241, 200, + 219, 113, 72, 230, 237, 218, 51, 231, 167, 72, 230, 237, 218, 51, 231, + 168, 249, 37, 226, 225, 248, 226, 72, 248, 214, 3, 77, 250, 55, 72, 248, + 214, 3, 147, 250, 55, 72, 248, 214, 3, 248, 215, 212, 129, 72, 248, 214, + 3, 217, 112, 255, 4, 72, 16, 243, 250, 249, 101, 72, 16, 219, 52, 218, + 136, 72, 16, 222, 39, 240, 171, 72, 16, 219, 52, 218, 137, 218, 216, 239, + 245, 72, 16, 221, 57, 179, 72, 16, 224, 51, 249, 101, 72, 16, 224, 51, + 249, 102, 223, 115, 255, 1, 72, 16, 224, 51, 249, 102, 239, 217, 255, 1, + 72, 16, 224, 51, 249, 102, 249, 37, 255, 1, 72, 3, 219, 53, 225, 225, + 219, 53, 245, 64, 72, 3, 219, 53, 225, 225, 239, 216, 72, 141, 249, 105, + 215, 154, 240, 62, 227, 16, 218, 215, 72, 141, 226, 183, 206, 3, 240, 62, + 227, 16, 218, 215, 72, 141, 223, 115, 210, 228, 72, 141, 78, 249, 128, + 218, 126, 206, 3, 227, 16, 227, 121, 185, 72, 141, 247, 188, 249, 128, + 218, 126, 206, 3, 227, 16, 216, 9, 185, 218, 166, 213, 114, 53, 230, 45, + 213, 114, 53, 218, 166, 213, 114, 3, 2, 245, 21, 230, 45, 213, 114, 3, 2, + 245, 21, 72, 141, 230, 55, 227, 124, 218, 53, 72, 141, 211, 76, 227, 124, + 218, 53, 66, 1, 172, 66, 1, 231, 167, 66, 1, 240, 244, 66, 1, 240, 99, + 66, 1, 225, 77, 66, 1, 249, 1, 66, 1, 248, 110, 66, 1, 232, 200, 66, 1, + 232, 170, 66, 1, 223, 144, 66, 1, 224, 69, 66, 1, 210, 208, 66, 1, 210, + 196, 66, 1, 246, 54, 66, 1, 246, 38, 66, 1, 224, 103, 66, 1, 212, 219, + 66, 1, 212, 56, 66, 1, 246, 145, 66, 1, 245, 192, 66, 1, 199, 66, 1, 179, + 66, 1, 221, 93, 66, 1, 250, 183, 66, 1, 250, 0, 66, 1, 185, 66, 1, 190, + 66, 1, 219, 113, 66, 1, 230, 141, 66, 1, 207, 96, 66, 1, 217, 199, 66, 1, + 155, 66, 1, 229, 172, 66, 1, 62, 66, 1, 215, 238, 62, 66, 1, 74, 66, 1, + 233, 102, 66, 1, 71, 66, 1, 209, 162, 66, 1, 75, 66, 1, 226, 169, 75, 66, + 1, 76, 66, 1, 251, 184, 66, 22, 3, 212, 178, 253, 164, 66, 22, 3, 253, + 164, 66, 22, 3, 74, 66, 22, 3, 233, 102, 66, 22, 3, 71, 66, 22, 3, 209, + 162, 66, 22, 3, 75, 66, 22, 3, 252, 205, 66, 22, 3, 226, 169, 233, 102, + 66, 22, 3, 226, 169, 76, 66, 22, 3, 174, 52, 66, 3, 252, 73, 66, 3, 67, + 55, 66, 3, 208, 183, 66, 3, 208, 188, 66, 3, 251, 229, 66, 107, 3, 169, + 190, 66, 107, 3, 169, 219, 113, 66, 107, 3, 169, 207, 96, 66, 107, 3, + 169, 155, 66, 1, 239, 232, 217, 199, 66, 18, 205, 85, 66, 18, 102, 66, + 18, 105, 66, 18, 142, 66, 18, 139, 66, 18, 168, 66, 18, 184, 66, 18, 195, + 66, 18, 193, 66, 18, 200, 66, 3, 229, 180, 217, 76, 66, 3, 217, 76, 66, + 16, 229, 141, 66, 16, 247, 149, 66, 16, 252, 224, 66, 16, 240, 154, 66, + 1, 216, 2, 66, 1, 214, 96, 66, 1, 115, 137, 66, 1, 115, 218, 90, 66, 1, + 115, 149, 66, 1, 115, 229, 173, 66, 22, 3, 115, 137, 66, 22, 3, 115, 218, + 90, 66, 22, 3, 115, 149, 66, 22, 3, 115, 229, 173, 66, 1, 226, 169, 225, + 77, 66, 1, 226, 169, 232, 170, 66, 1, 226, 169, 250, 97, 66, 1, 226, 169, + 250, 92, 66, 107, 3, 226, 169, 169, 199, 66, 107, 3, 226, 169, 169, 185, + 66, 107, 3, 226, 169, 169, 230, 141, 66, 1, 216, 8, 232, 4, 216, 2, 66, + 22, 3, 216, 8, 232, 4, 242, 192, 66, 135, 141, 216, 8, 232, 4, 239, 82, + 66, 135, 141, 216, 8, 232, 4, 231, 225, 221, 66, 66, 1, 207, 34, 220, 39, + 232, 4, 212, 56, 66, 1, 207, 34, 220, 39, 232, 4, 220, 45, 66, 22, 3, + 207, 34, 220, 39, 232, 4, 242, 192, 66, 22, 3, 207, 34, 220, 39, 232, 4, + 210, 3, 66, 3, 207, 34, 220, 39, 232, 4, 211, 117, 66, 3, 207, 34, 220, + 39, 232, 4, 211, 116, 66, 3, 207, 34, 220, 39, 232, 4, 211, 115, 66, 3, + 207, 34, 220, 39, 232, 4, 211, 114, 66, 3, 207, 34, 220, 39, 232, 4, 211, + 113, 66, 1, 243, 115, 220, 39, 232, 4, 224, 103, 66, 1, 243, 115, 220, + 39, 232, 4, 205, 176, 66, 1, 243, 115, 220, 39, 232, 4, 240, 64, 66, 22, + 3, 240, 166, 232, 4, 74, 66, 22, 3, 231, 230, 222, 206, 66, 22, 3, 231, + 230, 71, 66, 22, 3, 231, 230, 243, 104, 66, 1, 215, 238, 172, 66, 1, 215, + 238, 231, 167, 66, 1, 215, 238, 240, 244, 66, 1, 215, 238, 249, 1, 66, 1, + 215, 238, 205, 116, 66, 1, 215, 238, 223, 144, 66, 1, 215, 238, 246, 145, + 66, 1, 215, 238, 199, 66, 1, 215, 238, 221, 93, 66, 1, 215, 238, 242, 73, + 66, 1, 215, 238, 250, 183, 66, 1, 215, 238, 212, 56, 66, 1, 215, 238, + 155, 66, 107, 3, 215, 238, 169, 207, 96, 66, 22, 3, 215, 238, 253, 164, + 66, 22, 3, 215, 238, 75, 66, 22, 3, 215, 238, 174, 52, 66, 22, 3, 215, + 238, 42, 206, 123, 66, 3, 215, 238, 211, 116, 66, 3, 215, 238, 211, 115, + 66, 3, 215, 238, 211, 113, 66, 3, 215, 238, 211, 112, 66, 3, 215, 238, + 247, 82, 211, 116, 66, 3, 215, 238, 247, 82, 211, 115, 66, 3, 215, 238, + 247, 82, 243, 44, 211, 118, 66, 1, 218, 37, 222, 23, 242, 73, 66, 3, 218, + 37, 222, 23, 211, 113, 66, 215, 238, 18, 205, 85, 66, 215, 238, 18, 102, + 66, 215, 238, 18, 105, 66, 215, 238, 18, 142, 66, 215, 238, 18, 139, 66, + 215, 238, 18, 168, 66, 215, 238, 18, 184, 66, 215, 238, 18, 195, 66, 215, + 238, 18, 193, 66, 215, 238, 18, 200, 66, 3, 231, 160, 211, 117, 66, 3, + 231, 160, 211, 115, 66, 22, 3, 252, 193, 62, 66, 22, 3, 252, 193, 252, + 205, 66, 16, 215, 238, 102, 66, 16, 215, 238, 242, 167, 108, 6, 1, 252, + 122, 108, 6, 1, 250, 140, 108, 6, 1, 240, 214, 108, 6, 1, 245, 31, 108, + 6, 1, 243, 41, 108, 6, 1, 208, 197, 108, 6, 1, 205, 88, 108, 6, 1, 212, + 174, 108, 6, 1, 233, 68, 108, 6, 1, 232, 27, 108, 6, 1, 230, 82, 108, 6, + 1, 227, 221, 108, 6, 1, 225, 200, 108, 6, 1, 222, 165, 108, 6, 1, 221, + 231, 108, 6, 1, 205, 77, 108, 6, 1, 219, 95, 108, 6, 1, 217, 151, 108, 6, + 1, 212, 162, 108, 6, 1, 209, 234, 108, 6, 1, 221, 85, 108, 6, 1, 231, + 155, 108, 6, 1, 240, 90, 108, 6, 1, 220, 4, 108, 6, 1, 215, 171, 108, 6, + 1, 248, 45, 108, 6, 1, 248, 226, 108, 6, 1, 232, 154, 108, 6, 1, 247, + 240, 108, 6, 1, 248, 95, 108, 6, 1, 206, 179, 108, 6, 1, 232, 167, 108, + 6, 1, 239, 138, 108, 6, 1, 239, 71, 108, 6, 1, 239, 6, 108, 6, 1, 207, + 51, 108, 6, 1, 239, 95, 108, 6, 1, 238, 146, 108, 6, 1, 205, 249, 108, 6, + 1, 252, 237, 108, 1, 252, 122, 108, 1, 250, 140, 108, 1, 240, 214, 108, + 1, 245, 31, 108, 1, 243, 41, 108, 1, 208, 197, 108, 1, 205, 88, 108, 1, + 212, 174, 108, 1, 233, 68, 108, 1, 232, 27, 108, 1, 230, 82, 108, 1, 227, + 221, 108, 1, 225, 200, 108, 1, 222, 165, 108, 1, 221, 231, 108, 1, 205, + 77, 108, 1, 219, 95, 108, 1, 217, 151, 108, 1, 212, 162, 108, 1, 209, + 234, 108, 1, 221, 85, 108, 1, 231, 155, 108, 1, 240, 90, 108, 1, 220, 4, + 108, 1, 215, 171, 108, 1, 248, 45, 108, 1, 248, 226, 108, 1, 232, 154, + 108, 1, 247, 240, 108, 1, 248, 95, 108, 1, 206, 179, 108, 1, 232, 167, + 108, 1, 239, 138, 108, 1, 239, 71, 108, 1, 239, 6, 108, 1, 207, 51, 108, + 1, 239, 95, 108, 1, 238, 146, 108, 1, 241, 250, 108, 1, 205, 249, 108, 1, + 243, 56, 108, 1, 201, 240, 214, 108, 1, 252, 200, 108, 221, 229, 216, 39, + 65, 1, 108, 225, 200, 108, 1, 252, 237, 108, 1, 239, 94, 53, 108, 1, 230, + 132, 53, 25, 113, 231, 84, 25, 113, 214, 88, 25, 113, 224, 223, 25, 113, + 211, 193, 25, 113, 214, 77, 25, 113, 218, 198, 25, 113, 226, 240, 25, + 113, 221, 39, 25, 113, 214, 85, 25, 113, 215, 33, 25, 113, 214, 82, 25, + 113, 233, 125, 25, 113, 247, 246, 25, 113, 214, 92, 25, 113, 248, 54, 25, + 113, 231, 143, 25, 113, 212, 15, 25, 113, 221, 76, 25, 113, 239, 3, 25, + 113, 224, 219, 25, 113, 214, 86, 25, 113, 224, 213, 25, 113, 224, 217, + 25, 113, 211, 190, 25, 113, 218, 186, 25, 113, 214, 84, 25, 113, 218, + 196, 25, 113, 232, 10, 25, 113, 226, 233, 25, 113, 232, 13, 25, 113, 221, + 34, 25, 113, 221, 32, 25, 113, 221, 20, 25, 113, 221, 28, 25, 113, 221, + 26, 25, 113, 221, 23, 25, 113, 221, 25, 25, 113, 221, 22, 25, 113, 221, + 27, 25, 113, 221, 37, 25, 113, 221, 38, 25, 113, 221, 21, 25, 113, 221, + 31, 25, 113, 232, 11, 25, 113, 232, 9, 25, 113, 215, 26, 25, 113, 215, + 24, 25, 113, 215, 16, 25, 113, 215, 19, 25, 113, 215, 25, 25, 113, 215, + 21, 25, 113, 215, 20, 25, 113, 215, 18, 25, 113, 215, 29, 25, 113, 215, + 31, 25, 113, 215, 32, 25, 113, 215, 27, 25, 113, 215, 17, 25, 113, 215, + 22, 25, 113, 215, 30, 25, 113, 248, 36, 25, 113, 248, 34, 25, 113, 248, + 121, 25, 113, 248, 119, 25, 113, 221, 247, 25, 113, 233, 120, 25, 113, + 233, 111, 25, 113, 233, 119, 25, 113, 233, 116, 25, 113, 233, 114, 25, + 113, 233, 118, 25, 113, 214, 89, 25, 113, 233, 123, 25, 113, 233, 124, + 25, 113, 233, 112, 25, 113, 233, 117, 25, 113, 206, 29, 25, 113, 247, + 245, 25, 113, 248, 37, 25, 113, 248, 35, 25, 113, 248, 122, 25, 113, 248, + 120, 25, 113, 248, 52, 25, 113, 248, 53, 25, 113, 248, 38, 25, 113, 248, + 123, 25, 113, 221, 74, 25, 113, 232, 12, 25, 113, 214, 90, 25, 113, 206, + 35, 25, 113, 231, 75, 25, 113, 224, 215, 25, 113, 224, 221, 25, 113, 224, + 220, 25, 113, 211, 187, 25, 113, 241, 232, 25, 162, 241, 232, 25, 162, + 62, 25, 162, 252, 248, 25, 162, 190, 25, 162, 206, 98, 25, 162, 243, 6, + 25, 162, 75, 25, 162, 206, 39, 25, 162, 206, 52, 25, 162, 76, 25, 162, + 207, 96, 25, 162, 207, 92, 25, 162, 222, 206, 25, 162, 205, 247, 25, 162, + 71, 25, 162, 207, 38, 25, 162, 207, 51, 25, 162, 207, 20, 25, 162, 205, + 213, 25, 162, 242, 192, 25, 162, 206, 11, 25, 162, 74, 25, 162, 254, 252, + 25, 162, 254, 251, 25, 162, 206, 112, 25, 162, 206, 110, 25, 162, 243, 4, + 25, 162, 243, 3, 25, 162, 243, 5, 25, 162, 206, 38, 25, 162, 206, 37, 25, + 162, 223, 58, 25, 162, 223, 59, 25, 162, 223, 52, 25, 162, 223, 57, 25, + 162, 223, 55, 25, 162, 205, 241, 25, 162, 205, 240, 25, 162, 205, 239, + 25, 162, 205, 242, 25, 162, 205, 243, 25, 162, 210, 76, 25, 162, 210, 75, + 25, 162, 210, 73, 25, 162, 210, 69, 25, 162, 210, 70, 25, 162, 205, 212, + 25, 162, 205, 209, 25, 162, 205, 210, 25, 162, 205, 204, 25, 162, 205, + 205, 25, 162, 205, 206, 25, 162, 205, 208, 25, 162, 242, 186, 25, 162, + 242, 188, 25, 162, 206, 10, 25, 162, 237, 224, 25, 162, 237, 216, 25, + 162, 237, 219, 25, 162, 237, 217, 25, 162, 237, 221, 25, 162, 237, 223, + 25, 162, 252, 30, 25, 162, 252, 27, 25, 162, 252, 25, 25, 162, 252, 26, + 25, 162, 214, 93, 25, 162, 254, 253, 25, 162, 206, 111, 25, 162, 206, 36, + 25, 162, 223, 54, 25, 162, 223, 53, 25, 100, 231, 84, 25, 100, 214, 88, + 25, 100, 231, 77, 25, 100, 224, 223, 25, 100, 224, 221, 25, 100, 224, + 220, 25, 100, 211, 193, 25, 100, 218, 198, 25, 100, 218, 193, 25, 100, + 218, 190, 25, 100, 218, 183, 25, 100, 218, 178, 25, 100, 218, 173, 25, + 100, 218, 184, 25, 100, 218, 196, 25, 100, 226, 240, 25, 100, 221, 39, + 25, 100, 221, 28, 25, 100, 215, 33, 25, 100, 214, 82, 25, 100, 233, 125, + 25, 100, 247, 246, 25, 100, 248, 54, 25, 100, 231, 143, 25, 100, 212, 15, + 25, 100, 221, 76, 25, 100, 239, 3, 25, 100, 231, 78, 25, 100, 231, 76, + 25, 100, 224, 219, 25, 100, 224, 213, 25, 100, 224, 215, 25, 100, 224, + 218, 25, 100, 224, 214, 25, 100, 211, 190, 25, 100, 211, 187, 25, 100, + 218, 191, 25, 100, 218, 186, 25, 100, 218, 172, 25, 100, 218, 171, 25, + 100, 214, 84, 25, 100, 218, 188, 25, 100, 218, 187, 25, 100, 218, 180, + 25, 100, 218, 182, 25, 100, 218, 195, 25, 100, 218, 175, 25, 100, 218, + 185, 25, 100, 218, 194, 25, 100, 218, 170, 25, 100, 226, 236, 25, 100, + 226, 231, 25, 100, 226, 233, 25, 100, 226, 230, 25, 100, 226, 228, 25, + 100, 226, 234, 25, 100, 226, 239, 25, 100, 226, 237, 25, 100, 232, 13, + 25, 100, 221, 30, 25, 100, 221, 31, 25, 100, 221, 36, 25, 100, 232, 11, + 25, 100, 215, 26, 25, 100, 215, 16, 25, 100, 215, 19, 25, 100, 215, 21, + 25, 100, 221, 247, 25, 100, 233, 120, 25, 100, 233, 113, 25, 100, 214, + 89, 25, 100, 233, 121, 25, 100, 206, 29, 25, 100, 206, 25, 25, 100, 206, + 26, 25, 100, 221, 74, 25, 100, 232, 12, 25, 100, 239, 1, 25, 100, 238, + 255, 25, 100, 239, 2, 25, 100, 239, 0, 25, 100, 206, 35, 25, 100, 231, + 80, 25, 100, 231, 79, 25, 100, 231, 83, 25, 100, 231, 81, 25, 100, 231, + 82, 25, 100, 214, 86, 31, 4, 155, 31, 4, 238, 42, 31, 4, 239, 11, 31, 4, + 239, 141, 31, 4, 239, 53, 31, 4, 239, 71, 31, 4, 238, 149, 31, 4, 238, + 148, 31, 4, 230, 141, 31, 4, 229, 81, 31, 4, 229, 235, 31, 4, 230, 140, + 31, 4, 230, 50, 31, 4, 230, 58, 31, 4, 229, 144, 31, 4, 229, 50, 31, 4, + 239, 20, 31, 4, 239, 14, 31, 4, 239, 16, 31, 4, 239, 19, 31, 4, 239, 17, + 31, 4, 239, 18, 31, 4, 239, 15, 31, 4, 239, 13, 31, 4, 185, 31, 4, 226, + 114, 31, 4, 226, 254, 31, 4, 228, 18, 31, 4, 227, 107, 31, 4, 227, 119, + 31, 4, 226, 181, 31, 4, 226, 50, 31, 4, 213, 21, 31, 4, 213, 15, 31, 4, + 213, 17, 31, 4, 213, 20, 31, 4, 213, 18, 31, 4, 213, 19, 31, 4, 213, 16, + 31, 4, 213, 14, 31, 4, 219, 113, 31, 4, 218, 50, 31, 4, 218, 208, 31, 4, + 219, 109, 31, 4, 219, 29, 31, 4, 219, 51, 31, 4, 218, 124, 31, 4, 218, + 18, 31, 4, 217, 199, 31, 4, 213, 203, 31, 4, 215, 80, 31, 4, 217, 196, + 31, 4, 217, 74, 31, 4, 217, 86, 31, 4, 214, 193, 31, 4, 213, 112, 31, 4, + 216, 2, 31, 4, 215, 116, 31, 4, 215, 183, 31, 4, 215, 254, 31, 4, 215, + 212, 31, 4, 215, 214, 31, 4, 215, 158, 31, 4, 215, 98, 31, 4, 220, 19, + 31, 4, 219, 214, 31, 4, 219, 237, 31, 4, 220, 18, 31, 4, 219, 254, 31, 4, + 219, 255, 31, 4, 219, 226, 31, 4, 219, 225, 31, 4, 219, 168, 31, 4, 219, + 164, 31, 4, 219, 167, 31, 4, 219, 165, 31, 4, 219, 166, 31, 4, 219, 251, + 31, 4, 219, 243, 31, 4, 219, 246, 31, 4, 219, 250, 31, 4, 219, 247, 31, + 4, 219, 248, 31, 4, 219, 245, 31, 4, 219, 242, 31, 4, 219, 238, 31, 4, + 219, 241, 31, 4, 219, 239, 31, 4, 219, 240, 31, 4, 250, 183, 31, 4, 249, + 101, 31, 4, 249, 244, 31, 4, 250, 181, 31, 4, 250, 50, 31, 4, 250, 61, + 31, 4, 249, 184, 31, 4, 249, 51, 31, 4, 209, 70, 31, 4, 207, 148, 31, 4, + 208, 214, 31, 4, 209, 69, 31, 4, 209, 34, 31, 4, 209, 39, 31, 4, 208, + 173, 31, 4, 207, 139, 31, 4, 212, 219, 31, 4, 210, 170, 31, 4, 211, 211, + 31, 4, 212, 215, 31, 4, 212, 120, 31, 4, 212, 131, 31, 4, 124, 31, 4, + 210, 130, 31, 4, 249, 1, 31, 4, 247, 40, 31, 4, 247, 251, 31, 4, 249, 0, + 31, 4, 248, 140, 31, 4, 248, 148, 31, 4, 247, 174, 31, 4, 247, 7, 31, 4, + 206, 181, 31, 4, 206, 151, 31, 4, 206, 169, 31, 4, 206, 180, 31, 4, 206, + 174, 31, 4, 206, 175, 31, 4, 206, 159, 31, 4, 206, 158, 31, 4, 206, 145, + 31, 4, 206, 141, 31, 4, 206, 144, 31, 4, 206, 142, 31, 4, 206, 143, 31, + 4, 199, 31, 4, 223, 217, 31, 4, 224, 230, 31, 4, 225, 232, 31, 4, 225, + 106, 31, 4, 225, 110, 31, 4, 224, 67, 31, 4, 223, 153, 31, 4, 223, 144, + 31, 4, 223, 103, 31, 4, 223, 125, 31, 4, 223, 143, 31, 4, 223, 133, 31, + 4, 223, 134, 31, 4, 223, 110, 31, 4, 223, 93, 31, 4, 240, 25, 62, 31, 4, + 240, 25, 71, 31, 4, 240, 25, 74, 31, 4, 240, 25, 253, 164, 31, 4, 240, + 25, 243, 104, 31, 4, 240, 25, 75, 31, 4, 240, 25, 76, 31, 4, 240, 25, + 207, 96, 31, 4, 172, 31, 4, 230, 236, 31, 4, 231, 123, 31, 4, 232, 63, + 31, 4, 231, 221, 31, 4, 231, 224, 31, 4, 231, 53, 31, 4, 231, 52, 31, 4, + 230, 195, 31, 4, 230, 188, 31, 4, 230, 194, 31, 4, 230, 189, 31, 4, 230, + 190, 31, 4, 230, 181, 31, 4, 230, 175, 31, 4, 230, 177, 31, 4, 230, 180, + 31, 4, 230, 178, 31, 4, 230, 179, 31, 4, 230, 176, 31, 4, 230, 174, 31, + 4, 230, 170, 31, 4, 230, 173, 31, 4, 230, 171, 31, 4, 230, 172, 31, 4, + 207, 96, 31, 4, 206, 216, 31, 4, 207, 20, 31, 4, 207, 95, 31, 4, 207, 45, + 31, 4, 207, 51, 31, 4, 206, 250, 31, 4, 206, 249, 31, 4, 221, 84, 62, 31, + 4, 221, 84, 71, 31, 4, 221, 84, 74, 31, 4, 221, 84, 253, 164, 31, 4, 221, + 84, 243, 104, 31, 4, 221, 84, 75, 31, 4, 221, 84, 76, 31, 4, 205, 116, + 31, 4, 205, 9, 31, 4, 205, 40, 31, 4, 205, 115, 31, 4, 205, 91, 31, 4, + 205, 93, 31, 4, 205, 19, 31, 4, 204, 252, 31, 4, 205, 81, 31, 4, 205, 58, + 31, 4, 205, 67, 31, 4, 205, 80, 31, 4, 205, 71, 31, 4, 205, 72, 31, 4, + 205, 64, 31, 4, 205, 49, 31, 4, 190, 31, 4, 205, 213, 31, 4, 206, 11, 31, + 4, 206, 109, 31, 4, 206, 49, 31, 4, 206, 52, 31, 4, 205, 247, 31, 4, 205, + 238, 31, 4, 246, 145, 31, 4, 243, 237, 31, 4, 245, 168, 31, 4, 246, 144, + 31, 4, 245, 251, 31, 4, 246, 9, 31, 4, 245, 51, 31, 4, 243, 206, 31, 4, + 246, 54, 31, 4, 246, 19, 31, 4, 246, 31, 31, 4, 246, 53, 31, 4, 246, 41, + 31, 4, 246, 42, 31, 4, 246, 24, 31, 4, 246, 10, 31, 4, 232, 200, 31, 4, + 232, 104, 31, 4, 232, 162, 31, 4, 232, 199, 31, 4, 232, 180, 31, 4, 232, + 182, 31, 4, 232, 122, 31, 4, 232, 84, 31, 4, 240, 244, 31, 4, 239, 213, + 31, 4, 240, 61, 31, 4, 240, 241, 31, 4, 240, 162, 31, 4, 240, 170, 31, 4, + 240, 19, 31, 4, 240, 18, 31, 4, 239, 174, 31, 4, 239, 170, 31, 4, 239, + 173, 31, 4, 239, 171, 31, 4, 239, 172, 31, 4, 240, 135, 31, 4, 240, 115, + 31, 4, 240, 125, 31, 4, 240, 134, 31, 4, 240, 129, 31, 4, 240, 130, 31, + 4, 240, 119, 31, 4, 240, 104, 31, 4, 212, 56, 31, 4, 211, 230, 31, 4, + 212, 19, 31, 4, 212, 55, 31, 4, 212, 39, 31, 4, 212, 41, 31, 4, 211, 253, + 31, 4, 211, 222, 31, 4, 248, 110, 31, 4, 248, 14, 31, 4, 248, 58, 31, 4, + 248, 109, 31, 4, 248, 78, 31, 4, 248, 82, 31, 4, 248, 32, 31, 4, 248, 3, + 31, 4, 221, 93, 31, 4, 221, 59, 31, 4, 221, 78, 31, 4, 221, 92, 31, 4, + 221, 80, 31, 4, 221, 81, 31, 4, 221, 66, 31, 4, 221, 55, 31, 4, 210, 243, + 31, 4, 210, 216, 31, 4, 210, 222, 31, 4, 210, 242, 31, 4, 210, 236, 31, + 4, 210, 237, 31, 4, 210, 220, 31, 4, 210, 214, 31, 4, 210, 85, 31, 4, + 210, 77, 31, 4, 210, 81, 31, 4, 210, 84, 31, 4, 210, 82, 31, 4, 210, 83, + 31, 4, 210, 79, 31, 4, 210, 78, 31, 4, 242, 73, 31, 4, 241, 88, 31, 4, + 241, 250, 31, 4, 242, 72, 31, 4, 242, 21, 31, 4, 242, 28, 31, 4, 241, + 162, 31, 4, 241, 66, 31, 4, 179, 31, 4, 220, 82, 31, 4, 221, 53, 31, 4, + 222, 51, 31, 4, 221, 164, 31, 4, 221, 174, 31, 4, 220, 211, 31, 4, 220, + 45, 31, 4, 218, 8, 31, 4, 226, 39, 31, 4, 241, 60, 31, 36, 240, 159, 23, + 22, 230, 20, 83, 31, 36, 22, 230, 20, 83, 31, 36, 240, 159, 83, 31, 217, + 77, 83, 31, 206, 231, 31, 241, 82, 213, 251, 31, 247, 155, 31, 216, 52, + 31, 247, 162, 31, 220, 136, 247, 162, 31, 219, 196, 83, 31, 221, 229, + 216, 39, 31, 18, 102, 31, 18, 105, 31, 18, 142, 31, 18, 139, 31, 18, 168, + 31, 18, 184, 31, 18, 195, 31, 18, 193, 31, 18, 200, 31, 43, 212, 98, 31, + 43, 210, 123, 31, 43, 212, 3, 31, 43, 241, 130, 31, 43, 241, 243, 31, 43, + 214, 252, 31, 43, 216, 17, 31, 43, 243, 79, 31, 43, 224, 190, 31, 43, + 238, 29, 31, 43, 212, 99, 211, 242, 31, 4, 217, 82, 226, 50, 31, 4, 226, + 46, 31, 4, 226, 47, 31, 4, 226, 48, 31, 4, 217, 82, 249, 51, 31, 4, 249, + 48, 31, 4, 249, 49, 31, 4, 249, 50, 31, 4, 217, 82, 241, 66, 31, 4, 241, + 62, 31, 4, 241, 63, 31, 4, 241, 64, 31, 4, 217, 82, 220, 45, 31, 4, 220, + 41, 31, 4, 220, 42, 31, 4, 220, 43, 31, 211, 119, 141, 205, 250, 31, 211, + 119, 141, 245, 213, 31, 211, 119, 141, 218, 153, 31, 211, 119, 141, 215, + 144, 218, 153, 31, 211, 119, 141, 245, 142, 31, 211, 119, 141, 231, 202, + 31, 211, 119, 141, 248, 40, 31, 211, 119, 141, 239, 8, 31, 211, 119, 141, + 245, 212, 31, 211, 119, 141, 230, 208, 192, 1, 62, 192, 1, 75, 192, 1, + 74, 192, 1, 76, 192, 1, 71, 192, 1, 209, 148, 192, 1, 240, 244, 192, 1, + 172, 192, 1, 240, 170, 192, 1, 240, 61, 192, 1, 240, 19, 192, 1, 239, + 213, 192, 1, 239, 176, 192, 1, 155, 192, 1, 239, 71, 192, 1, 239, 11, + 192, 1, 238, 149, 192, 1, 238, 42, 192, 1, 238, 17, 192, 1, 230, 141, + 192, 1, 230, 58, 192, 1, 229, 235, 192, 1, 229, 144, 192, 1, 229, 81, + 192, 1, 229, 51, 192, 1, 185, 192, 1, 227, 119, 192, 1, 226, 254, 192, 1, + 226, 181, 192, 1, 226, 114, 192, 1, 199, 192, 1, 238, 173, 192, 1, 225, + 219, 192, 1, 225, 110, 192, 1, 224, 230, 192, 1, 224, 67, 192, 1, 223, + 217, 192, 1, 223, 155, 192, 1, 219, 213, 192, 1, 219, 199, 192, 1, 219, + 192, 192, 1, 219, 183, 192, 1, 219, 172, 192, 1, 219, 170, 192, 1, 217, + 199, 192, 1, 182, 192, 1, 217, 86, 192, 1, 215, 80, 192, 1, 214, 193, + 192, 1, 213, 203, 192, 1, 213, 117, 192, 1, 246, 145, 192, 1, 212, 219, + 192, 1, 246, 9, 192, 1, 212, 131, 192, 1, 245, 168, 192, 1, 211, 211, + 192, 1, 245, 51, 192, 1, 243, 237, 192, 1, 243, 209, 192, 1, 245, 62, + 192, 1, 211, 147, 192, 1, 211, 146, 192, 1, 211, 135, 192, 1, 211, 134, + 192, 1, 211, 133, 192, 1, 211, 132, 192, 1, 210, 243, 192, 1, 210, 237, + 192, 1, 210, 222, 192, 1, 210, 220, 192, 1, 210, 216, 192, 1, 210, 215, + 192, 1, 207, 96, 192, 1, 207, 51, 192, 1, 207, 20, 192, 1, 206, 250, 192, + 1, 206, 216, 192, 1, 206, 203, 192, 1, 190, 192, 1, 206, 52, 192, 1, 206, + 11, 192, 1, 205, 247, 192, 1, 205, 213, 192, 1, 205, 177, 19, 20, 237, + 239, 19, 20, 75, 19, 20, 253, 128, 19, 20, 74, 19, 20, 233, 102, 19, 20, + 76, 19, 20, 222, 152, 19, 20, 206, 122, 222, 152, 19, 20, 85, 243, 104, + 19, 20, 85, 74, 19, 20, 62, 19, 20, 253, 164, 19, 20, 207, 51, 19, 20, + 180, 207, 51, 19, 20, 207, 20, 19, 20, 180, 207, 20, 19, 20, 207, 12, 19, + 20, 180, 207, 12, 19, 20, 206, 250, 19, 20, 180, 206, 250, 19, 20, 206, + 238, 19, 20, 180, 206, 238, 19, 20, 225, 194, 206, 238, 19, 20, 207, 96, + 19, 20, 180, 207, 96, 19, 20, 207, 95, 19, 20, 180, 207, 95, 19, 20, 225, + 194, 207, 95, 19, 20, 252, 205, 19, 20, 206, 122, 207, 129, 19, 20, 240, + 25, 213, 251, 19, 20, 42, 153, 19, 20, 42, 239, 236, 19, 20, 42, 249, + 154, 160, 218, 148, 19, 20, 42, 211, 102, 160, 218, 148, 19, 20, 42, 48, + 160, 218, 148, 19, 20, 42, 218, 148, 19, 20, 42, 50, 153, 19, 20, 42, 50, + 215, 144, 79, 213, 212, 19, 20, 42, 226, 247, 245, 23, 19, 20, 42, 215, + 144, 194, 91, 19, 20, 42, 220, 218, 19, 20, 42, 130, 212, 201, 19, 20, + 243, 41, 19, 20, 233, 68, 19, 20, 222, 165, 19, 20, 252, 122, 19, 20, + 221, 174, 19, 20, 222, 49, 19, 20, 221, 53, 19, 20, 221, 15, 19, 20, 220, + 211, 19, 20, 220, 187, 19, 20, 206, 122, 220, 187, 19, 20, 85, 239, 53, + 19, 20, 85, 239, 11, 19, 20, 179, 19, 20, 222, 51, 19, 20, 220, 43, 19, + 20, 180, 220, 43, 19, 20, 220, 41, 19, 20, 180, 220, 41, 19, 20, 220, 40, + 19, 20, 180, 220, 40, 19, 20, 220, 38, 19, 20, 180, 220, 38, 19, 20, 220, + 37, 19, 20, 180, 220, 37, 19, 20, 220, 45, 19, 20, 180, 220, 45, 19, 20, + 220, 44, 19, 20, 180, 220, 44, 19, 20, 206, 122, 220, 44, 19, 20, 222, + 67, 19, 20, 180, 222, 67, 19, 20, 85, 239, 155, 19, 20, 212, 131, 19, 20, + 212, 213, 19, 20, 211, 211, 19, 20, 211, 195, 19, 20, 124, 19, 20, 211, + 105, 19, 20, 206, 122, 211, 105, 19, 20, 85, 245, 251, 19, 20, 85, 245, + 168, 19, 20, 212, 219, 19, 20, 212, 215, 19, 20, 210, 128, 19, 20, 180, + 210, 128, 19, 20, 210, 112, 19, 20, 180, 210, 112, 19, 20, 210, 111, 19, + 20, 180, 210, 111, 19, 20, 105, 19, 20, 180, 105, 19, 20, 210, 104, 19, + 20, 180, 210, 104, 19, 20, 210, 130, 19, 20, 180, 210, 130, 19, 20, 210, + 129, 19, 20, 180, 210, 129, 19, 20, 225, 194, 210, 129, 19, 20, 213, 10, + 19, 20, 210, 203, 19, 20, 210, 187, 19, 20, 210, 185, 19, 20, 210, 208, + 19, 20, 231, 224, 19, 20, 232, 59, 19, 20, 231, 123, 19, 20, 231, 111, + 19, 20, 231, 53, 19, 20, 231, 33, 19, 20, 206, 122, 231, 33, 19, 20, 172, + 19, 20, 232, 63, 19, 20, 230, 190, 19, 20, 180, 230, 190, 19, 20, 230, + 188, 19, 20, 180, 230, 188, 19, 20, 230, 187, 19, 20, 180, 230, 187, 19, + 20, 230, 185, 19, 20, 180, 230, 185, 19, 20, 230, 184, 19, 20, 180, 230, + 184, 19, 20, 230, 195, 19, 20, 180, 230, 195, 19, 20, 230, 194, 19, 20, + 180, 230, 194, 19, 20, 225, 194, 230, 194, 19, 20, 232, 76, 19, 20, 230, + 196, 19, 20, 214, 162, 231, 214, 19, 20, 214, 162, 231, 112, 19, 20, 214, + 162, 231, 47, 19, 20, 214, 162, 232, 43, 19, 20, 248, 148, 19, 20, 248, + 255, 19, 20, 247, 251, 19, 20, 247, 241, 19, 20, 247, 174, 19, 20, 247, + 105, 19, 20, 206, 122, 247, 105, 19, 20, 249, 1, 19, 20, 249, 0, 19, 20, + 247, 5, 19, 20, 180, 247, 5, 19, 20, 247, 3, 19, 20, 180, 247, 3, 19, 20, + 247, 2, 19, 20, 180, 247, 2, 19, 20, 247, 1, 19, 20, 180, 247, 1, 19, 20, + 247, 0, 19, 20, 180, 247, 0, 19, 20, 247, 7, 19, 20, 180, 247, 7, 19, 20, + 247, 6, 19, 20, 180, 247, 6, 19, 20, 225, 194, 247, 6, 19, 20, 249, 34, + 19, 20, 217, 114, 212, 58, 19, 20, 227, 119, 19, 20, 228, 17, 19, 20, + 226, 254, 19, 20, 226, 224, 19, 20, 226, 181, 19, 20, 226, 150, 19, 20, + 206, 122, 226, 150, 19, 20, 185, 19, 20, 228, 18, 19, 20, 226, 48, 19, + 20, 180, 226, 48, 19, 20, 226, 46, 19, 20, 180, 226, 46, 19, 20, 226, 45, + 19, 20, 180, 226, 45, 19, 20, 226, 44, 19, 20, 180, 226, 44, 19, 20, 226, + 43, 19, 20, 180, 226, 43, 19, 20, 226, 50, 19, 20, 180, 226, 50, 19, 20, + 226, 49, 19, 20, 180, 226, 49, 19, 20, 225, 194, 226, 49, 19, 20, 229, + 28, 19, 20, 180, 229, 28, 19, 20, 227, 2, 19, 20, 251, 198, 229, 28, 19, + 20, 217, 114, 229, 28, 19, 20, 225, 110, 19, 20, 225, 231, 19, 20, 224, + 230, 19, 20, 224, 205, 19, 20, 224, 67, 19, 20, 224, 56, 19, 20, 206, + 122, 224, 56, 19, 20, 199, 19, 20, 225, 232, 19, 20, 223, 151, 19, 20, + 180, 223, 151, 19, 20, 223, 153, 19, 20, 180, 223, 153, 19, 20, 223, 152, + 19, 20, 180, 223, 152, 19, 20, 225, 194, 223, 152, 19, 20, 226, 33, 19, + 20, 85, 225, 79, 19, 20, 224, 235, 19, 20, 230, 58, 19, 20, 230, 139, 19, + 20, 229, 235, 19, 20, 229, 219, 19, 20, 229, 144, 19, 20, 229, 115, 19, + 20, 206, 122, 229, 115, 19, 20, 230, 141, 19, 20, 230, 140, 19, 20, 229, + 48, 19, 20, 180, 229, 48, 19, 20, 229, 47, 19, 20, 180, 229, 47, 19, 20, + 229, 46, 19, 20, 180, 229, 46, 19, 20, 229, 45, 19, 20, 180, 229, 45, 19, + 20, 229, 44, 19, 20, 180, 229, 44, 19, 20, 229, 50, 19, 20, 180, 229, 50, + 19, 20, 229, 49, 19, 20, 180, 229, 49, 19, 20, 149, 19, 20, 180, 149, 19, + 20, 169, 149, 19, 20, 217, 86, 19, 20, 217, 194, 19, 20, 215, 80, 19, 20, + 215, 61, 19, 20, 214, 193, 19, 20, 214, 174, 19, 20, 206, 122, 214, 174, + 19, 20, 217, 199, 19, 20, 217, 196, 19, 20, 213, 108, 19, 20, 180, 213, + 108, 19, 20, 213, 102, 19, 20, 180, 213, 102, 19, 20, 213, 101, 19, 20, + 180, 213, 101, 19, 20, 213, 97, 19, 20, 180, 213, 97, 19, 20, 213, 96, + 19, 20, 180, 213, 96, 19, 20, 213, 112, 19, 20, 180, 213, 112, 19, 20, + 213, 111, 19, 20, 180, 213, 111, 19, 20, 225, 194, 213, 111, 19, 20, 182, + 19, 20, 251, 198, 182, 19, 20, 213, 113, 19, 20, 249, 199, 182, 19, 20, + 226, 143, 214, 248, 19, 20, 225, 194, 214, 239, 19, 20, 225, 194, 217, + 255, 19, 20, 225, 194, 214, 109, 19, 20, 225, 194, 213, 206, 19, 20, 225, + 194, 214, 238, 19, 20, 225, 194, 217, 89, 19, 20, 215, 214, 19, 20, 215, + 183, 19, 20, 215, 178, 19, 20, 215, 158, 19, 20, 215, 152, 19, 20, 216, + 2, 19, 20, 215, 254, 19, 20, 215, 95, 19, 20, 180, 215, 95, 19, 20, 215, + 94, 19, 20, 180, 215, 94, 19, 20, 215, 93, 19, 20, 180, 215, 93, 19, 20, + 215, 92, 19, 20, 180, 215, 92, 19, 20, 215, 91, 19, 20, 180, 215, 91, 19, + 20, 215, 98, 19, 20, 180, 215, 98, 19, 20, 215, 97, 19, 20, 180, 215, 97, + 19, 20, 216, 4, 19, 20, 206, 52, 19, 20, 206, 107, 19, 20, 206, 11, 19, + 20, 206, 2, 19, 20, 205, 247, 19, 20, 205, 232, 19, 20, 206, 122, 205, + 232, 19, 20, 190, 19, 20, 206, 109, 19, 20, 205, 174, 19, 20, 180, 205, + 174, 19, 20, 205, 173, 19, 20, 180, 205, 173, 19, 20, 205, 172, 19, 20, + 180, 205, 172, 19, 20, 205, 171, 19, 20, 180, 205, 171, 19, 20, 205, 170, + 19, 20, 180, 205, 170, 19, 20, 205, 176, 19, 20, 180, 205, 176, 19, 20, + 205, 175, 19, 20, 180, 205, 175, 19, 20, 225, 194, 205, 175, 19, 20, 206, + 123, 19, 20, 249, 242, 206, 123, 19, 20, 180, 206, 123, 19, 20, 217, 114, + 206, 11, 19, 20, 219, 51, 19, 20, 219, 149, 219, 51, 19, 20, 180, 230, + 58, 19, 20, 219, 108, 19, 20, 218, 208, 19, 20, 218, 154, 19, 20, 218, + 124, 19, 20, 218, 107, 19, 20, 180, 229, 144, 19, 20, 219, 113, 19, 20, + 219, 109, 19, 20, 180, 230, 141, 19, 20, 218, 17, 19, 20, 180, 218, 17, + 19, 20, 137, 19, 20, 180, 137, 19, 20, 169, 137, 19, 20, 242, 28, 19, 20, + 242, 70, 19, 20, 241, 250, 19, 20, 241, 237, 19, 20, 241, 162, 19, 20, + 241, 151, 19, 20, 242, 73, 19, 20, 242, 72, 19, 20, 241, 65, 19, 20, 180, + 241, 65, 19, 20, 242, 139, 19, 20, 212, 41, 19, 20, 226, 31, 212, 41, 19, + 20, 212, 19, 19, 20, 226, 31, 212, 19, 19, 20, 212, 13, 19, 20, 226, 31, + 212, 13, 19, 20, 211, 253, 19, 20, 211, 248, 19, 20, 212, 56, 19, 20, + 212, 55, 19, 20, 211, 221, 19, 20, 180, 211, 221, 19, 20, 212, 58, 19, + 20, 210, 194, 19, 20, 210, 192, 19, 20, 210, 191, 19, 20, 210, 196, 19, + 20, 210, 197, 19, 20, 210, 98, 19, 20, 210, 97, 19, 20, 210, 96, 19, 20, + 210, 100, 19, 20, 223, 172, 239, 71, 19, 20, 223, 172, 239, 11, 19, 20, + 223, 172, 238, 247, 19, 20, 223, 172, 238, 149, 19, 20, 223, 172, 238, + 131, 19, 20, 223, 172, 155, 19, 20, 223, 172, 239, 141, 19, 20, 223, 172, + 239, 155, 19, 20, 223, 171, 239, 155, 19, 20, 238, 239, 19, 20, 220, 15, + 19, 20, 219, 237, 19, 20, 219, 232, 19, 20, 219, 226, 19, 20, 219, 221, + 19, 20, 220, 19, 19, 20, 220, 18, 19, 20, 220, 27, 19, 20, 211, 143, 19, + 20, 211, 141, 19, 20, 211, 140, 19, 20, 211, 144, 19, 20, 180, 219, 51, + 19, 20, 180, 218, 208, 19, 20, 180, 218, 124, 19, 20, 180, 219, 113, 19, + 20, 225, 75, 19, 20, 225, 25, 19, 20, 225, 21, 19, 20, 225, 2, 19, 20, + 224, 253, 19, 20, 225, 77, 19, 20, 225, 76, 19, 20, 225, 79, 19, 20, 224, + 96, 19, 20, 217, 114, 215, 214, 19, 20, 217, 114, 215, 183, 19, 20, 217, + 114, 215, 158, 19, 20, 217, 114, 216, 2, 19, 20, 206, 236, 212, 41, 19, + 20, 206, 236, 212, 19, 19, 20, 206, 236, 211, 253, 19, 20, 206, 236, 212, + 56, 19, 20, 206, 236, 212, 58, 19, 20, 229, 242, 19, 20, 229, 241, 19, + 20, 229, 240, 19, 20, 229, 239, 19, 20, 229, 248, 19, 20, 229, 247, 19, + 20, 229, 249, 19, 20, 212, 57, 212, 41, 19, 20, 212, 57, 212, 19, 19, 20, + 212, 57, 212, 13, 19, 20, 212, 57, 211, 253, 19, 20, 212, 57, 211, 248, + 19, 20, 212, 57, 212, 56, 19, 20, 212, 57, 212, 55, 19, 20, 212, 57, 212, + 58, 19, 20, 252, 192, 251, 150, 19, 20, 249, 199, 75, 19, 20, 249, 199, + 74, 19, 20, 249, 199, 76, 19, 20, 249, 199, 62, 19, 20, 249, 199, 207, + 51, 19, 20, 249, 199, 207, 20, 19, 20, 249, 199, 206, 250, 19, 20, 249, + 199, 207, 96, 19, 20, 249, 199, 225, 110, 19, 20, 249, 199, 224, 230, 19, + 20, 249, 199, 224, 67, 19, 20, 249, 199, 199, 19, 20, 249, 199, 231, 224, + 19, 20, 249, 199, 231, 123, 19, 20, 249, 199, 231, 53, 19, 20, 249, 199, + 172, 19, 20, 217, 114, 239, 71, 19, 20, 217, 114, 239, 11, 19, 20, 217, + 114, 238, 149, 19, 20, 217, 114, 155, 19, 20, 85, 240, 67, 19, 20, 85, + 240, 71, 19, 20, 85, 240, 85, 19, 20, 85, 240, 84, 19, 20, 85, 240, 73, + 19, 20, 85, 240, 99, 19, 20, 85, 218, 50, 19, 20, 85, 218, 124, 19, 20, + 85, 219, 51, 19, 20, 85, 219, 29, 19, 20, 85, 218, 208, 19, 20, 85, 219, + 113, 19, 20, 85, 206, 216, 19, 20, 85, 206, 250, 19, 20, 85, 207, 51, 19, + 20, 85, 207, 45, 19, 20, 85, 207, 20, 19, 20, 85, 207, 96, 19, 20, 85, + 238, 9, 19, 20, 85, 238, 10, 19, 20, 85, 238, 13, 19, 20, 85, 238, 12, + 19, 20, 85, 238, 11, 19, 20, 85, 238, 16, 19, 20, 85, 211, 230, 19, 20, + 85, 211, 253, 19, 20, 85, 212, 41, 19, 20, 85, 212, 39, 19, 20, 85, 212, + 19, 19, 20, 85, 212, 56, 19, 20, 85, 210, 175, 19, 20, 85, 210, 185, 19, + 20, 85, 210, 203, 19, 20, 85, 210, 202, 19, 20, 85, 210, 187, 19, 20, 85, + 210, 208, 19, 20, 85, 220, 82, 19, 20, 85, 220, 211, 19, 20, 85, 221, + 174, 19, 20, 85, 221, 164, 19, 20, 85, 221, 53, 19, 20, 85, 179, 19, 20, + 85, 222, 67, 19, 20, 85, 239, 213, 19, 20, 85, 240, 19, 19, 20, 85, 240, + 170, 19, 20, 85, 240, 162, 19, 20, 85, 240, 61, 19, 20, 85, 240, 244, 19, + 20, 85, 231, 132, 19, 20, 85, 231, 138, 19, 20, 85, 231, 152, 19, 20, 85, + 231, 151, 19, 20, 85, 231, 145, 19, 20, 85, 231, 167, 19, 20, 85, 231, + 67, 19, 20, 85, 231, 68, 19, 20, 85, 231, 71, 19, 20, 85, 231, 70, 19, + 20, 85, 231, 69, 19, 20, 85, 231, 72, 19, 20, 85, 231, 73, 19, 20, 85, + 223, 217, 19, 20, 85, 224, 67, 19, 20, 85, 225, 110, 19, 20, 85, 225, + 106, 19, 20, 85, 224, 230, 19, 20, 85, 199, 19, 20, 85, 226, 114, 19, 20, + 85, 226, 181, 19, 20, 85, 227, 119, 19, 20, 85, 227, 107, 19, 20, 85, + 226, 254, 19, 20, 85, 185, 19, 20, 85, 205, 213, 19, 20, 85, 205, 247, + 19, 20, 85, 206, 52, 19, 20, 85, 206, 49, 19, 20, 85, 206, 11, 19, 20, + 85, 190, 19, 20, 85, 232, 104, 19, 20, 217, 114, 232, 104, 19, 20, 85, + 232, 122, 19, 20, 85, 232, 182, 19, 20, 85, 232, 180, 19, 20, 85, 232, + 162, 19, 20, 217, 114, 232, 162, 19, 20, 85, 232, 200, 19, 20, 85, 232, + 135, 19, 20, 85, 232, 139, 19, 20, 85, 232, 149, 19, 20, 85, 232, 148, + 19, 20, 85, 232, 147, 19, 20, 85, 232, 150, 19, 20, 85, 229, 81, 19, 20, + 85, 229, 144, 19, 20, 85, 230, 58, 19, 20, 85, 230, 50, 19, 20, 85, 229, + 235, 19, 20, 85, 230, 141, 19, 20, 85, 245, 55, 19, 20, 85, 245, 56, 19, + 20, 85, 245, 61, 19, 20, 85, 245, 60, 19, 20, 85, 245, 57, 19, 20, 85, + 245, 62, 19, 20, 85, 229, 238, 19, 20, 85, 229, 240, 19, 20, 85, 229, + 244, 19, 20, 85, 229, 243, 19, 20, 85, 229, 242, 19, 20, 85, 229, 248, + 19, 20, 85, 211, 138, 19, 20, 85, 211, 140, 19, 20, 85, 211, 143, 19, 20, + 85, 211, 142, 19, 20, 85, 211, 141, 19, 20, 85, 211, 144, 19, 20, 85, + 211, 133, 19, 20, 85, 211, 134, 19, 20, 85, 211, 146, 19, 20, 85, 211, + 145, 19, 20, 85, 211, 135, 19, 20, 85, 211, 147, 19, 20, 85, 205, 9, 19, + 20, 85, 205, 19, 19, 20, 85, 205, 93, 19, 20, 85, 205, 91, 19, 20, 85, + 205, 40, 19, 20, 85, 205, 116, 19, 20, 85, 205, 159, 19, 20, 85, 78, 205, + 159, 19, 20, 85, 243, 183, 19, 20, 85, 243, 184, 19, 20, 85, 243, 193, + 19, 20, 85, 243, 192, 19, 20, 85, 243, 187, 19, 20, 85, 243, 196, 19, 20, + 85, 213, 203, 19, 20, 85, 214, 193, 19, 20, 85, 217, 86, 19, 20, 85, 217, + 74, 19, 20, 85, 215, 80, 19, 20, 85, 217, 199, 19, 20, 85, 215, 116, 19, + 20, 85, 215, 158, 19, 20, 85, 215, 214, 19, 20, 85, 215, 212, 19, 20, 85, + 215, 183, 19, 20, 85, 216, 2, 19, 20, 85, 216, 4, 19, 20, 85, 210, 216, + 19, 20, 85, 210, 220, 19, 20, 85, 210, 237, 19, 20, 85, 210, 236, 19, 20, + 85, 210, 222, 19, 20, 85, 210, 243, 19, 20, 85, 248, 14, 19, 20, 85, 248, + 32, 19, 20, 85, 248, 82, 19, 20, 85, 248, 78, 19, 20, 85, 248, 58, 19, + 20, 85, 248, 110, 19, 20, 85, 210, 178, 19, 20, 85, 210, 179, 19, 20, 85, + 210, 182, 19, 20, 85, 210, 181, 19, 20, 85, 210, 180, 19, 20, 85, 210, + 183, 19, 20, 248, 59, 53, 19, 20, 241, 82, 213, 251, 19, 20, 220, 11, 19, + 20, 225, 73, 19, 20, 224, 93, 19, 20, 224, 92, 19, 20, 224, 91, 19, 20, + 224, 90, 19, 20, 224, 95, 19, 20, 224, 94, 19, 20, 206, 236, 211, 219, + 19, 20, 206, 236, 211, 218, 19, 20, 206, 236, 211, 217, 19, 20, 206, 236, + 211, 216, 19, 20, 206, 236, 211, 215, 19, 20, 206, 236, 211, 222, 19, 20, + 206, 236, 211, 221, 19, 20, 206, 236, 42, 212, 58, 19, 20, 249, 199, 207, + 129, 222, 198, 214, 154, 83, 222, 198, 1, 250, 32, 222, 198, 1, 229, 68, + 222, 198, 1, 242, 25, 222, 198, 1, 217, 179, 222, 198, 1, 224, 188, 222, + 198, 1, 210, 15, 222, 198, 1, 246, 119, 222, 198, 1, 211, 170, 222, 198, + 1, 247, 165, 222, 198, 1, 248, 136, 222, 198, 1, 226, 101, 222, 198, 1, + 240, 0, 222, 198, 1, 225, 63, 222, 198, 1, 213, 244, 222, 198, 1, 218, + 44, 222, 198, 1, 252, 202, 222, 198, 1, 222, 156, 222, 198, 1, 209, 194, + 222, 198, 1, 243, 128, 222, 198, 1, 232, 252, 222, 198, 1, 243, 129, 222, + 198, 1, 222, 122, 222, 198, 1, 209, 250, 222, 198, 1, 233, 108, 222, 198, + 1, 243, 126, 222, 198, 1, 221, 154, 222, 198, 242, 24, 83, 222, 198, 218, + 224, 242, 24, 83, 181, 1, 242, 14, 242, 6, 242, 29, 242, 139, 181, 1, + 209, 148, 181, 1, 209, 179, 209, 195, 71, 181, 1, 205, 216, 181, 1, 206, + 123, 181, 1, 207, 129, 181, 1, 211, 224, 211, 223, 211, 246, 181, 1, 242, + 196, 181, 1, 252, 92, 62, 181, 1, 222, 107, 76, 181, 1, 253, 25, 62, 181, + 1, 252, 232, 181, 1, 229, 121, 76, 181, 1, 215, 137, 76, 181, 1, 76, 181, + 1, 222, 206, 181, 1, 222, 165, 181, 1, 219, 88, 219, 101, 219, 14, 137, + 181, 1, 231, 239, 181, 1, 248, 132, 181, 1, 231, 240, 232, 76, 181, 1, + 241, 55, 181, 1, 243, 28, 181, 1, 240, 165, 239, 161, 241, 55, 181, 1, + 240, 204, 181, 1, 206, 208, 206, 199, 207, 129, 181, 1, 239, 133, 239, + 155, 181, 1, 239, 137, 239, 155, 181, 1, 229, 123, 239, 155, 181, 1, 215, + 140, 239, 155, 181, 1, 225, 189, 223, 135, 225, 190, 226, 33, 181, 1, + 215, 138, 226, 33, 181, 1, 244, 18, 181, 1, 232, 231, 232, 235, 232, 222, + 74, 181, 1, 75, 181, 1, 232, 173, 232, 203, 181, 1, 240, 149, 181, 1, + 229, 124, 252, 248, 181, 1, 215, 142, 62, 181, 1, 232, 214, 243, 2, 181, + 1, 221, 111, 221, 136, 222, 67, 181, 1, 252, 165, 243, 0, 181, 1, 214, + 159, 182, 181, 1, 215, 65, 229, 120, 182, 181, 1, 215, 136, 182, 181, 1, + 249, 34, 181, 1, 205, 159, 181, 1, 211, 152, 211, 163, 210, 87, 213, 10, + 181, 1, 215, 135, 213, 10, 181, 1, 246, 240, 181, 1, 250, 13, 250, 16, + 249, 205, 251, 150, 181, 1, 215, 141, 251, 150, 181, 1, 244, 17, 181, 1, + 222, 136, 181, 1, 243, 91, 243, 93, 75, 181, 1, 227, 212, 227, 222, 229, + 28, 181, 1, 229, 122, 229, 28, 181, 1, 215, 139, 229, 28, 181, 1, 230, + 73, 230, 119, 229, 131, 149, 181, 1, 244, 19, 181, 1, 233, 41, 181, 1, + 233, 42, 181, 1, 246, 133, 246, 139, 246, 240, 181, 1, 222, 101, 242, + 195, 76, 181, 1, 243, 124, 181, 1, 232, 251, 181, 1, 247, 4, 181, 1, 248, + 240, 181, 1, 248, 147, 181, 1, 214, 31, 181, 1, 229, 119, 181, 1, 215, + 134, 181, 1, 237, 180, 181, 1, 220, 27, 181, 1, 206, 195, 181, 215, 41, + 220, 71, 181, 226, 95, 220, 71, 181, 247, 60, 220, 71, 181, 252, 1, 93, + 181, 210, 132, 93, 181, 250, 30, 93, 181, 1, 232, 76, 181, 1, 216, 4, + 181, 1, 222, 152, 181, 1, 241, 109, 248, 186, 222, 106, 181, 1, 241, 109, + 248, 186, 232, 234, 181, 1, 241, 109, 248, 186, 243, 92, 181, 1, 241, + 109, 248, 186, 253, 24, 181, 1, 241, 109, 248, 186, 252, 232, 212, 197, + 1, 62, 212, 197, 1, 74, 212, 197, 1, 71, 212, 197, 1, 172, 212, 197, 1, + 240, 244, 212, 197, 1, 225, 77, 212, 197, 1, 212, 219, 212, 197, 1, 246, + 145, 212, 197, 1, 199, 212, 197, 1, 179, 212, 197, 1, 250, 183, 212, 197, + 1, 185, 212, 197, 1, 190, 212, 197, 1, 230, 141, 212, 197, 1, 207, 96, + 212, 197, 1, 217, 199, 212, 197, 1, 155, 212, 197, 22, 3, 74, 212, 197, + 22, 3, 71, 212, 197, 3, 208, 188, 239, 99, 1, 62, 239, 99, 1, 74, 239, + 99, 1, 71, 239, 99, 1, 172, 239, 99, 1, 240, 244, 239, 99, 1, 225, 77, + 239, 99, 1, 212, 219, 239, 99, 1, 246, 145, 239, 99, 1, 199, 239, 99, 1, + 179, 239, 99, 1, 250, 183, 239, 99, 1, 185, 239, 99, 1, 190, 239, 99, 1, + 219, 113, 239, 99, 1, 230, 141, 239, 99, 1, 207, 96, 239, 99, 1, 217, + 199, 239, 99, 1, 155, 239, 99, 22, 3, 74, 239, 99, 22, 3, 71, 239, 99, 3, + 222, 8, 221, 71, 215, 41, 220, 71, 221, 71, 50, 220, 71, 249, 93, 1, 62, + 249, 93, 1, 74, 249, 93, 1, 71, 249, 93, 1, 172, 249, 93, 1, 240, 244, + 249, 93, 1, 225, 77, 249, 93, 1, 212, 219, 249, 93, 1, 246, 145, 249, 93, + 1, 199, 249, 93, 1, 179, 249, 93, 1, 250, 183, 249, 93, 1, 185, 249, 93, + 1, 190, 249, 93, 1, 219, 113, 249, 93, 1, 230, 141, 249, 93, 1, 207, 96, + 249, 93, 1, 217, 199, 249, 93, 1, 155, 249, 93, 22, 3, 74, 249, 93, 22, + 3, 71, 212, 196, 1, 62, 212, 196, 1, 74, 212, 196, 1, 71, 212, 196, 1, + 172, 212, 196, 1, 240, 244, 212, 196, 1, 225, 77, 212, 196, 1, 212, 219, + 212, 196, 1, 246, 145, 212, 196, 1, 199, 212, 196, 1, 179, 212, 196, 1, + 250, 183, 212, 196, 1, 185, 212, 196, 1, 190, 212, 196, 1, 230, 141, 212, + 196, 1, 207, 96, 212, 196, 1, 217, 199, 212, 196, 22, 3, 74, 212, 196, + 22, 3, 71, 82, 1, 172, 82, 1, 231, 167, 82, 1, 231, 53, 82, 1, 231, 138, + 82, 1, 225, 2, 82, 1, 249, 1, 82, 1, 248, 110, 82, 1, 247, 174, 82, 1, + 248, 32, 82, 1, 223, 110, 82, 1, 246, 145, 82, 1, 210, 196, 82, 1, 245, + 51, 82, 1, 210, 191, 82, 1, 224, 73, 82, 1, 212, 219, 82, 1, 212, 56, 82, + 1, 124, 82, 1, 211, 253, 82, 1, 224, 67, 82, 1, 250, 183, 82, 1, 221, 93, + 82, 1, 220, 211, 82, 1, 221, 66, 82, 1, 226, 181, 82, 1, 205, 247, 82, 1, + 218, 124, 82, 1, 229, 144, 82, 1, 208, 173, 82, 1, 216, 2, 82, 1, 214, + 56, 82, 1, 217, 199, 82, 1, 155, 82, 1, 230, 141, 82, 1, 220, 19, 82, + 233, 55, 22, 220, 5, 82, 233, 55, 22, 220, 18, 82, 233, 55, 22, 219, 237, + 82, 233, 55, 22, 219, 232, 82, 233, 55, 22, 219, 214, 82, 233, 55, 22, + 219, 184, 82, 233, 55, 22, 219, 172, 82, 233, 55, 22, 219, 171, 82, 233, + 55, 22, 218, 9, 82, 233, 55, 22, 218, 2, 82, 233, 55, 22, 229, 42, 82, + 233, 55, 22, 229, 31, 82, 233, 55, 22, 219, 255, 82, 233, 55, 22, 220, + 11, 82, 233, 55, 22, 219, 222, 210, 95, 102, 82, 233, 55, 22, 219, 222, + 210, 95, 105, 82, 233, 55, 22, 220, 1, 82, 22, 233, 40, 252, 41, 82, 22, + 233, 40, 253, 164, 82, 22, 3, 253, 164, 82, 22, 3, 74, 82, 22, 3, 233, + 102, 82, 22, 3, 206, 123, 82, 22, 3, 205, 169, 82, 22, 3, 71, 82, 22, 3, + 209, 162, 82, 22, 3, 210, 18, 82, 22, 3, 222, 206, 82, 22, 3, 190, 82, + 22, 3, 233, 129, 82, 22, 3, 75, 82, 22, 3, 252, 248, 82, 22, 3, 252, 205, + 82, 22, 3, 222, 152, 82, 22, 3, 251, 184, 82, 3, 224, 203, 82, 3, 219, + 49, 82, 3, 205, 180, 82, 3, 226, 60, 82, 3, 211, 39, 82, 3, 250, 131, 82, + 3, 218, 119, 82, 3, 211, 128, 82, 3, 232, 34, 82, 3, 252, 207, 82, 3, + 217, 152, 217, 145, 82, 3, 208, 185, 82, 3, 247, 168, 82, 3, 250, 104, + 82, 3, 231, 159, 82, 3, 250, 126, 82, 3, 248, 229, 221, 16, 230, 201, 82, + 3, 230, 27, 211, 105, 82, 3, 250, 2, 82, 3, 221, 68, 226, 111, 82, 3, + 231, 31, 82, 247, 25, 16, 218, 200, 82, 3, 251, 166, 82, 3, 251, 187, 82, + 18, 205, 85, 82, 18, 102, 82, 18, 105, 82, 18, 142, 82, 18, 139, 82, 18, + 168, 82, 18, 184, 82, 18, 195, 82, 18, 193, 82, 18, 200, 82, 16, 230, 27, + 251, 189, 214, 177, 82, 16, 230, 27, 251, 189, 226, 80, 82, 16, 230, 27, + 251, 189, 221, 15, 82, 16, 230, 27, 251, 189, 250, 33, 82, 16, 230, 27, + 251, 189, 249, 73, 82, 16, 230, 27, 251, 189, 220, 152, 82, 16, 230, 27, + 251, 189, 220, 146, 82, 16, 230, 27, 251, 189, 220, 144, 82, 16, 230, 27, + 251, 189, 220, 150, 82, 16, 230, 27, 251, 189, 220, 148, 90, 249, 217, + 90, 243, 54, 90, 247, 155, 90, 241, 82, 213, 251, 90, 247, 162, 90, 241, + 125, 245, 21, 90, 211, 127, 214, 187, 237, 239, 90, 215, 78, 4, 249, 150, + 227, 187, 90, 227, 218, 247, 155, 90, 227, 218, 241, 82, 213, 251, 90, + 224, 186, 90, 241, 108, 54, 217, 60, 102, 90, 241, 108, 54, 217, 60, 105, + 90, 241, 108, 54, 217, 60, 142, 90, 22, 216, 39, 90, 18, 205, 85, 90, 18, + 102, 90, 18, 105, 90, 18, 142, 90, 18, 139, 90, 18, 168, 90, 18, 184, 90, + 18, 195, 90, 18, 193, 90, 18, 200, 90, 1, 62, 90, 1, 75, 90, 1, 74, 90, + 1, 76, 90, 1, 71, 90, 1, 222, 206, 90, 1, 210, 3, 90, 1, 243, 104, 90, 1, + 199, 90, 1, 252, 114, 90, 1, 250, 183, 90, 1, 179, 90, 1, 220, 19, 90, 1, + 240, 244, 90, 1, 185, 90, 1, 230, 141, 90, 1, 217, 199, 90, 1, 216, 2, + 90, 1, 212, 219, 90, 1, 246, 145, 90, 1, 248, 110, 90, 1, 232, 200, 90, + 1, 190, 90, 1, 219, 113, 90, 1, 207, 96, 90, 1, 242, 73, 90, 1, 172, 90, + 1, 231, 167, 90, 1, 210, 243, 90, 1, 205, 116, 90, 1, 239, 141, 90, 1, + 205, 12, 90, 1, 229, 248, 90, 1, 205, 67, 90, 1, 248, 58, 90, 1, 211, + 127, 152, 22, 53, 90, 1, 211, 127, 75, 90, 1, 211, 127, 74, 90, 1, 211, + 127, 76, 90, 1, 211, 127, 71, 90, 1, 211, 127, 222, 206, 90, 1, 211, 127, + 210, 3, 90, 1, 211, 127, 252, 114, 90, 1, 211, 127, 250, 183, 90, 1, 211, + 127, 179, 90, 1, 211, 127, 220, 19, 90, 1, 211, 127, 240, 244, 90, 1, + 211, 127, 185, 90, 1, 211, 127, 212, 219, 90, 1, 211, 127, 246, 145, 90, + 1, 211, 127, 248, 110, 90, 1, 211, 127, 232, 200, 90, 1, 211, 127, 210, + 243, 90, 1, 211, 127, 190, 90, 1, 211, 127, 207, 96, 90, 1, 211, 127, + 172, 90, 1, 211, 127, 240, 241, 90, 1, 211, 127, 239, 141, 90, 1, 211, + 127, 232, 161, 90, 1, 211, 127, 224, 228, 90, 1, 211, 127, 243, 196, 90, + 1, 215, 78, 75, 90, 1, 215, 78, 74, 90, 1, 215, 78, 232, 211, 90, 1, 215, + 78, 210, 3, 90, 1, 215, 78, 71, 90, 1, 215, 78, 252, 114, 90, 1, 215, 78, + 172, 90, 1, 215, 78, 240, 244, 90, 1, 215, 78, 155, 90, 1, 215, 78, 179, + 90, 1, 215, 78, 216, 2, 90, 1, 215, 78, 212, 219, 90, 1, 215, 78, 246, + 145, 90, 1, 215, 78, 232, 200, 90, 1, 215, 78, 242, 73, 90, 1, 215, 78, + 240, 241, 90, 1, 215, 78, 239, 141, 90, 1, 215, 78, 210, 243, 90, 1, 215, + 78, 205, 116, 90, 1, 215, 78, 219, 109, 90, 1, 215, 78, 248, 110, 90, 1, + 215, 78, 205, 81, 90, 1, 227, 218, 74, 90, 1, 227, 218, 172, 90, 1, 227, + 218, 219, 113, 90, 1, 227, 218, 242, 73, 90, 1, 227, 218, 205, 81, 90, 1, + 252, 164, 240, 224, 252, 74, 102, 90, 1, 252, 164, 240, 224, 208, 184, + 102, 90, 1, 252, 164, 240, 224, 246, 108, 90, 1, 252, 164, 240, 224, 210, + 13, 90, 1, 252, 164, 240, 224, 233, 2, 210, 13, 90, 1, 252, 164, 240, + 224, 250, 143, 90, 1, 252, 164, 240, 224, 129, 250, 143, 90, 1, 252, 164, + 240, 224, 62, 90, 1, 252, 164, 240, 224, 74, 90, 1, 252, 164, 240, 224, + 172, 90, 1, 252, 164, 240, 224, 225, 77, 90, 1, 252, 164, 240, 224, 249, + 1, 90, 1, 252, 164, 240, 224, 210, 208, 90, 1, 252, 164, 240, 224, 210, + 196, 90, 1, 252, 164, 240, 224, 246, 54, 90, 1, 252, 164, 240, 224, 224, + 103, 90, 1, 252, 164, 240, 224, 212, 219, 90, 1, 252, 164, 240, 224, 246, + 145, 90, 1, 252, 164, 240, 224, 179, 90, 1, 252, 164, 240, 224, 221, 93, + 90, 1, 252, 164, 240, 224, 214, 96, 90, 1, 252, 164, 240, 224, 205, 81, + 90, 1, 252, 164, 240, 224, 205, 116, 90, 1, 252, 164, 240, 224, 252, 213, + 90, 1, 211, 127, 252, 164, 240, 224, 212, 219, 90, 1, 211, 127, 252, 164, + 240, 224, 205, 81, 90, 1, 227, 218, 252, 164, 240, 224, 240, 99, 90, 1, + 227, 218, 252, 164, 240, 224, 225, 77, 90, 1, 227, 218, 252, 164, 240, + 224, 249, 1, 90, 1, 227, 218, 252, 164, 240, 224, 232, 170, 90, 1, 227, + 218, 252, 164, 240, 224, 210, 208, 90, 1, 227, 218, 252, 164, 240, 224, + 246, 38, 90, 1, 227, 218, 252, 164, 240, 224, 212, 219, 90, 1, 227, 218, + 252, 164, 240, 224, 245, 192, 90, 1, 227, 218, 252, 164, 240, 224, 214, + 96, 90, 1, 227, 218, 252, 164, 240, 224, 246, 254, 90, 1, 227, 218, 252, + 164, 240, 224, 205, 81, 90, 1, 227, 218, 252, 164, 240, 224, 205, 116, + 90, 1, 252, 164, 240, 224, 160, 71, 90, 1, 252, 164, 240, 224, 160, 190, + 90, 1, 227, 218, 252, 164, 240, 224, 250, 0, 90, 1, 252, 164, 240, 224, + 246, 134, 90, 1, 227, 218, 252, 164, 240, 224, 229, 248, 19, 20, 222, 71, + 19, 20, 251, 159, 19, 20, 253, 119, 19, 20, 207, 54, 19, 20, 220, 158, + 19, 20, 221, 183, 19, 20, 220, 36, 19, 20, 212, 140, 19, 20, 231, 231, + 19, 20, 230, 192, 19, 20, 227, 162, 19, 20, 224, 26, 19, 20, 225, 185, + 19, 20, 230, 68, 19, 20, 214, 157, 19, 20, 217, 116, 19, 20, 215, 124, + 19, 20, 215, 218, 19, 20, 215, 90, 19, 20, 205, 222, 19, 20, 206, 58, 19, + 20, 219, 58, 19, 20, 223, 150, 19, 20, 222, 187, 223, 150, 19, 20, 223, + 149, 19, 20, 222, 187, 223, 149, 19, 20, 223, 148, 19, 20, 222, 187, 223, + 148, 19, 20, 223, 147, 19, 20, 222, 187, 223, 147, 19, 20, 218, 14, 19, + 20, 218, 13, 19, 20, 218, 12, 19, 20, 218, 11, 19, 20, 218, 10, 19, 20, + 218, 18, 19, 20, 222, 187, 222, 67, 19, 20, 222, 187, 213, 10, 19, 20, + 222, 187, 232, 76, 19, 20, 222, 187, 249, 34, 19, 20, 222, 187, 229, 28, + 19, 20, 222, 187, 226, 33, 19, 20, 222, 187, 182, 19, 20, 222, 187, 216, + 4, 19, 20, 243, 115, 207, 129, 19, 20, 207, 34, 207, 129, 19, 20, 42, 5, + 218, 148, 19, 20, 42, 219, 81, 245, 23, 19, 20, 219, 149, 218, 15, 19, + 20, 180, 229, 115, 19, 20, 180, 230, 140, 19, 20, 211, 220, 19, 20, 211, + 222, 19, 20, 210, 188, 19, 20, 210, 190, 19, 20, 210, 195, 19, 20, 211, + 137, 19, 20, 211, 139, 19, 20, 217, 114, 215, 95, 19, 20, 217, 114, 215, + 152, 19, 20, 217, 114, 238, 131, 19, 20, 85, 239, 169, 19, 20, 85, 245, + 225, 240, 162, 19, 20, 85, 240, 241, 19, 20, 85, 239, 174, 19, 20, 217, + 114, 232, 86, 19, 20, 85, 232, 84, 19, 20, 250, 53, 245, 225, 149, 19, + 20, 250, 53, 245, 225, 137, 19, 20, 85, 245, 220, 182, 229, 215, 208, + 154, 230, 5, 229, 215, 1, 172, 229, 215, 1, 231, 167, 229, 215, 1, 240, + 244, 229, 215, 1, 240, 99, 229, 215, 1, 225, 77, 229, 215, 1, 249, 1, + 229, 215, 1, 248, 110, 229, 215, 1, 232, 200, 229, 215, 1, 232, 170, 229, + 215, 1, 206, 77, 229, 215, 1, 212, 219, 229, 215, 1, 212, 56, 229, 215, + 1, 246, 145, 229, 215, 1, 245, 192, 229, 215, 1, 199, 229, 215, 1, 179, + 229, 215, 1, 221, 93, 229, 215, 1, 250, 183, 229, 215, 1, 250, 0, 229, + 215, 1, 185, 229, 215, 1, 190, 229, 215, 1, 219, 113, 229, 215, 1, 230, + 141, 229, 215, 1, 207, 96, 229, 215, 1, 216, 2, 229, 215, 1, 214, 96, + 229, 215, 1, 217, 199, 229, 215, 1, 155, 229, 215, 1, 239, 165, 229, 215, + 1, 211, 83, 229, 215, 22, 3, 62, 229, 215, 22, 3, 74, 229, 215, 22, 3, + 71, 229, 215, 22, 3, 243, 104, 229, 215, 22, 3, 252, 205, 229, 215, 22, + 3, 222, 152, 229, 215, 22, 3, 251, 184, 229, 215, 22, 3, 75, 229, 215, + 22, 3, 76, 229, 215, 213, 191, 1, 190, 229, 215, 213, 191, 1, 219, 113, + 229, 215, 213, 191, 1, 207, 96, 229, 215, 5, 1, 172, 229, 215, 5, 1, 225, + 77, 229, 215, 5, 1, 252, 73, 229, 215, 5, 1, 212, 219, 229, 215, 5, 1, + 199, 229, 215, 5, 1, 179, 229, 215, 5, 1, 185, 229, 215, 5, 1, 219, 113, + 229, 215, 5, 1, 230, 141, 229, 215, 3, 226, 99, 229, 215, 3, 231, 209, + 229, 215, 3, 217, 197, 229, 215, 3, 229, 115, 229, 215, 242, 168, 83, + 229, 215, 219, 196, 83, 229, 215, 18, 205, 85, 229, 215, 18, 102, 229, + 215, 18, 105, 229, 215, 18, 142, 229, 215, 18, 139, 229, 215, 18, 168, + 229, 215, 18, 184, 229, 215, 18, 195, 229, 215, 18, 193, 229, 215, 18, + 200, 41, 230, 59, 1, 172, 41, 230, 59, 1, 206, 181, 41, 230, 59, 1, 225, + 77, 41, 230, 59, 1, 210, 243, 41, 230, 59, 1, 217, 199, 41, 230, 59, 1, + 190, 41, 230, 59, 1, 212, 219, 41, 230, 59, 1, 212, 56, 41, 230, 59, 1, + 230, 141, 41, 230, 59, 1, 179, 41, 230, 59, 1, 221, 93, 41, 230, 59, 1, + 185, 41, 230, 59, 1, 242, 73, 41, 230, 59, 1, 209, 70, 41, 230, 59, 1, + 155, 41, 230, 59, 1, 220, 19, 41, 230, 59, 1, 231, 167, 41, 230, 59, 1, + 210, 233, 41, 230, 59, 1, 199, 41, 230, 59, 1, 62, 41, 230, 59, 1, 74, + 41, 230, 59, 1, 243, 104, 41, 230, 59, 1, 243, 92, 41, 230, 59, 1, 71, + 41, 230, 59, 1, 222, 152, 41, 230, 59, 1, 76, 41, 230, 59, 1, 210, 3, 41, + 230, 59, 1, 75, 41, 230, 59, 1, 251, 182, 41, 230, 59, 1, 252, 205, 41, + 230, 59, 1, 211, 116, 41, 230, 59, 1, 211, 115, 41, 230, 59, 1, 211, 114, + 41, 230, 59, 1, 211, 113, 41, 230, 59, 1, 211, 112, 186, 41, 229, 75, 1, + 127, 220, 19, 186, 41, 229, 75, 1, 114, 220, 19, 186, 41, 229, 75, 1, + 127, 172, 186, 41, 229, 75, 1, 127, 206, 181, 186, 41, 229, 75, 1, 127, + 225, 77, 186, 41, 229, 75, 1, 114, 172, 186, 41, 229, 75, 1, 114, 206, + 181, 186, 41, 229, 75, 1, 114, 225, 77, 186, 41, 229, 75, 1, 127, 210, + 243, 186, 41, 229, 75, 1, 127, 217, 199, 186, 41, 229, 75, 1, 127, 190, + 186, 41, 229, 75, 1, 114, 210, 243, 186, 41, 229, 75, 1, 114, 217, 199, + 186, 41, 229, 75, 1, 114, 190, 186, 41, 229, 75, 1, 127, 212, 219, 186, + 41, 229, 75, 1, 127, 212, 56, 186, 41, 229, 75, 1, 127, 199, 186, 41, + 229, 75, 1, 114, 212, 219, 186, 41, 229, 75, 1, 114, 212, 56, 186, 41, + 229, 75, 1, 114, 199, 186, 41, 229, 75, 1, 127, 179, 186, 41, 229, 75, 1, + 127, 221, 93, 186, 41, 229, 75, 1, 127, 185, 186, 41, 229, 75, 1, 114, + 179, 186, 41, 229, 75, 1, 114, 221, 93, 186, 41, 229, 75, 1, 114, 185, + 186, 41, 229, 75, 1, 127, 242, 73, 186, 41, 229, 75, 1, 127, 209, 70, + 186, 41, 229, 75, 1, 127, 230, 141, 186, 41, 229, 75, 1, 114, 242, 73, + 186, 41, 229, 75, 1, 114, 209, 70, 186, 41, 229, 75, 1, 114, 230, 141, + 186, 41, 229, 75, 1, 127, 155, 186, 41, 229, 75, 1, 127, 246, 145, 186, + 41, 229, 75, 1, 127, 250, 183, 186, 41, 229, 75, 1, 114, 155, 186, 41, + 229, 75, 1, 114, 246, 145, 186, 41, 229, 75, 1, 114, 250, 183, 186, 41, + 229, 75, 1, 127, 230, 197, 186, 41, 229, 75, 1, 127, 206, 148, 186, 41, + 229, 75, 1, 114, 230, 197, 186, 41, 229, 75, 1, 114, 206, 148, 186, 41, + 229, 75, 1, 127, 213, 202, 186, 41, 229, 75, 1, 114, 213, 202, 186, 41, + 229, 75, 22, 3, 22, 215, 132, 186, 41, 229, 75, 22, 3, 253, 164, 186, 41, + 229, 75, 22, 3, 233, 102, 186, 41, 229, 75, 22, 3, 71, 186, 41, 229, 75, + 22, 3, 209, 162, 186, 41, 229, 75, 22, 3, 75, 186, 41, 229, 75, 22, 3, + 252, 248, 186, 41, 229, 75, 22, 3, 76, 186, 41, 229, 75, 22, 3, 222, 230, + 186, 41, 229, 75, 22, 3, 210, 3, 186, 41, 229, 75, 22, 3, 251, 159, 186, + 41, 229, 75, 22, 3, 253, 119, 186, 41, 229, 75, 22, 3, 209, 154, 186, 41, + 229, 75, 22, 3, 222, 71, 186, 41, 229, 75, 22, 3, 222, 227, 186, 41, 229, + 75, 22, 3, 209, 255, 186, 41, 229, 75, 22, 3, 232, 211, 186, 41, 229, 75, + 1, 42, 209, 148, 186, 41, 229, 75, 1, 42, 225, 79, 186, 41, 229, 75, 1, + 42, 226, 33, 186, 41, 229, 75, 1, 42, 229, 28, 186, 41, 229, 75, 1, 42, + 232, 76, 186, 41, 229, 75, 1, 42, 246, 240, 186, 41, 229, 75, 1, 42, 251, + 150, 186, 41, 229, 75, 135, 227, 191, 186, 41, 229, 75, 135, 227, 190, + 186, 41, 229, 75, 18, 205, 85, 186, 41, 229, 75, 18, 102, 186, 41, 229, + 75, 18, 105, 186, 41, 229, 75, 18, 142, 186, 41, 229, 75, 18, 139, 186, + 41, 229, 75, 18, 168, 186, 41, 229, 75, 18, 184, 186, 41, 229, 75, 18, + 195, 186, 41, 229, 75, 18, 193, 186, 41, 229, 75, 18, 200, 186, 41, 229, + 75, 99, 18, 102, 186, 41, 229, 75, 3, 230, 125, 186, 41, 229, 75, 3, 230, + 124, 82, 16, 221, 191, 82, 16, 226, 81, 231, 49, 82, 16, 221, 16, 231, + 49, 82, 16, 250, 34, 231, 49, 82, 16, 249, 74, 231, 49, 82, 16, 220, 153, + 231, 49, 82, 16, 220, 147, 231, 49, 82, 16, 220, 145, 231, 49, 82, 16, + 220, 151, 231, 49, 82, 16, 220, 149, 231, 49, 82, 16, 246, 95, 231, 49, + 82, 16, 246, 91, 231, 49, 82, 16, 246, 90, 231, 49, 82, 16, 246, 93, 231, + 49, 82, 16, 246, 92, 231, 49, 82, 16, 246, 89, 231, 49, 82, 16, 210, 137, + 82, 16, 226, 81, 218, 118, 82, 16, 221, 16, 218, 118, 82, 16, 250, 34, + 218, 118, 82, 16, 249, 74, 218, 118, 82, 16, 220, 153, 218, 118, 82, 16, + 220, 147, 218, 118, 82, 16, 220, 145, 218, 118, 82, 16, 220, 151, 218, + 118, 82, 16, 220, 149, 218, 118, 82, 16, 246, 95, 218, 118, 82, 16, 246, + 91, 218, 118, 82, 16, 246, 90, 218, 118, 82, 16, 246, 93, 218, 118, 82, + 16, 246, 92, 218, 118, 82, 16, 246, 89, 218, 118, 249, 94, 1, 172, 249, + 94, 1, 240, 244, 249, 94, 1, 225, 77, 249, 94, 1, 225, 20, 249, 94, 1, + 179, 249, 94, 1, 250, 183, 249, 94, 1, 185, 249, 94, 1, 226, 118, 249, + 94, 1, 212, 219, 249, 94, 1, 246, 145, 249, 94, 1, 199, 249, 94, 1, 224, + 24, 249, 94, 1, 249, 1, 249, 94, 1, 232, 200, 249, 94, 1, 223, 144, 249, + 94, 1, 223, 136, 249, 94, 1, 190, 249, 94, 1, 219, 113, 249, 94, 1, 230, + 141, 249, 94, 1, 209, 70, 249, 94, 1, 217, 199, 249, 94, 1, 62, 249, 94, + 1, 155, 249, 94, 22, 3, 74, 249, 94, 22, 3, 71, 249, 94, 22, 3, 75, 249, + 94, 22, 3, 76, 249, 94, 22, 3, 252, 248, 249, 94, 222, 20, 249, 94, 243, + 34, 73, 217, 76, 41, 99, 1, 127, 172, 41, 99, 1, 127, 231, 167, 41, 99, + 1, 127, 230, 181, 41, 99, 1, 114, 172, 41, 99, 1, 114, 230, 181, 41, 99, + 1, 114, 231, 167, 41, 99, 1, 225, 77, 41, 99, 1, 127, 249, 1, 41, 99, 1, + 127, 248, 110, 41, 99, 1, 114, 249, 1, 41, 99, 1, 114, 217, 199, 41, 99, + 1, 114, 248, 110, 41, 99, 1, 223, 144, 41, 99, 1, 219, 64, 41, 99, 1, + 127, 219, 62, 41, 99, 1, 246, 145, 41, 99, 1, 114, 219, 62, 41, 99, 1, + 219, 73, 41, 99, 1, 127, 212, 219, 41, 99, 1, 127, 212, 56, 41, 99, 1, + 114, 212, 219, 41, 99, 1, 114, 212, 56, 41, 99, 1, 199, 41, 99, 1, 250, + 183, 41, 99, 1, 127, 179, 41, 99, 1, 127, 221, 93, 41, 99, 1, 127, 242, + 73, 41, 99, 1, 114, 179, 41, 99, 1, 114, 242, 73, 41, 99, 1, 114, 221, + 93, 41, 99, 1, 185, 41, 99, 1, 114, 190, 41, 99, 1, 127, 190, 41, 99, 1, + 219, 113, 41, 99, 1, 218, 46, 41, 99, 1, 230, 141, 41, 99, 1, 229, 74, + 41, 99, 1, 207, 96, 41, 99, 1, 127, 216, 2, 41, 99, 1, 127, 214, 96, 41, + 99, 1, 127, 217, 199, 41, 99, 1, 127, 155, 41, 99, 1, 229, 172, 41, 99, + 1, 62, 41, 99, 1, 114, 155, 41, 99, 1, 74, 41, 99, 1, 233, 102, 41, 99, + 1, 71, 41, 99, 1, 209, 162, 41, 99, 1, 243, 104, 41, 99, 1, 222, 152, 41, + 99, 1, 230, 125, 41, 99, 1, 239, 232, 217, 199, 41, 99, 107, 3, 169, 219, + 113, 41, 99, 107, 3, 169, 230, 141, 41, 99, 107, 3, 230, 142, 212, 172, + 230, 114, 41, 99, 3, 227, 240, 232, 24, 230, 114, 41, 99, 107, 3, 42, + 225, 77, 41, 99, 107, 3, 114, 179, 41, 99, 107, 3, 127, 219, 63, 222, + 123, 114, 179, 41, 99, 107, 3, 185, 41, 99, 107, 3, 250, 183, 41, 99, + 107, 3, 217, 199, 41, 99, 3, 217, 174, 41, 99, 22, 3, 62, 41, 99, 22, 3, + 227, 240, 217, 133, 41, 99, 22, 3, 253, 164, 41, 99, 22, 3, 212, 178, + 253, 164, 41, 99, 22, 3, 74, 41, 99, 22, 3, 233, 102, 41, 99, 22, 3, 210, + 3, 41, 99, 22, 3, 209, 161, 41, 99, 22, 3, 71, 41, 99, 22, 3, 209, 162, + 41, 99, 22, 3, 76, 41, 99, 22, 3, 222, 231, 55, 41, 99, 22, 3, 222, 71, + 41, 99, 22, 3, 75, 41, 99, 22, 3, 252, 248, 41, 99, 22, 3, 222, 152, 41, + 99, 22, 3, 252, 205, 41, 99, 22, 3, 99, 252, 205, 41, 99, 22, 3, 222, + 231, 52, 41, 99, 3, 227, 240, 232, 23, 41, 99, 3, 211, 117, 41, 99, 3, + 211, 116, 41, 99, 3, 231, 128, 211, 115, 41, 99, 3, 231, 128, 211, 114, + 41, 99, 3, 231, 128, 211, 113, 41, 99, 3, 219, 114, 239, 140, 41, 99, 3, + 227, 240, 217, 161, 41, 99, 3, 231, 127, 232, 6, 41, 99, 36, 247, 43, + 245, 23, 41, 99, 238, 123, 18, 205, 85, 41, 99, 238, 123, 18, 102, 41, + 99, 238, 123, 18, 105, 41, 99, 238, 123, 18, 142, 41, 99, 238, 123, 18, + 139, 41, 99, 238, 123, 18, 168, 41, 99, 238, 123, 18, 184, 41, 99, 238, + 123, 18, 195, 41, 99, 238, 123, 18, 193, 41, 99, 238, 123, 18, 200, 41, + 99, 99, 18, 205, 85, 41, 99, 99, 18, 102, 41, 99, 99, 18, 105, 41, 99, + 99, 18, 142, 41, 99, 99, 18, 139, 41, 99, 99, 18, 168, 41, 99, 99, 18, + 184, 41, 99, 99, 18, 195, 41, 99, 99, 18, 193, 41, 99, 99, 18, 200, 41, + 99, 3, 207, 19, 41, 99, 3, 207, 18, 41, 99, 3, 217, 120, 41, 99, 3, 231, + 198, 41, 99, 3, 238, 52, 41, 99, 3, 245, 37, 41, 99, 3, 218, 224, 218, + 97, 219, 73, 41, 99, 3, 227, 240, 206, 78, 41, 99, 3, 232, 58, 41, 99, 3, + 232, 57, 41, 99, 3, 217, 128, 41, 99, 3, 217, 127, 41, 99, 3, 239, 101, + 41, 99, 3, 248, 254, 36, 244, 13, 247, 228, 253, 21, 36, 245, 165, 36, + 233, 45, 36, 173, 45, 36, 211, 36, 245, 23, 36, 206, 194, 55, 36, 207, + 14, 229, 206, 55, 36, 222, 142, 141, 55, 36, 50, 222, 142, 141, 55, 36, + 147, 248, 130, 213, 225, 55, 36, 213, 211, 248, 130, 213, 225, 55, 36, + 221, 218, 52, 36, 50, 221, 218, 52, 36, 221, 218, 55, 36, 221, 218, 222, + 82, 117, 3, 209, 244, 218, 202, 117, 3, 209, 244, 248, 219, 117, 3, 248, + 144, 117, 3, 213, 131, 117, 3, 249, 214, 117, 1, 252, 187, 117, 1, 252, + 188, 212, 122, 117, 1, 233, 98, 117, 1, 233, 99, 212, 122, 117, 1, 209, + 247, 117, 1, 209, 248, 212, 122, 117, 1, 219, 114, 218, 254, 117, 1, 219, + 114, 218, 255, 212, 122, 117, 1, 230, 142, 230, 21, 117, 1, 230, 142, + 230, 22, 212, 122, 117, 1, 243, 73, 117, 1, 252, 203, 117, 1, 222, 183, + 117, 1, 222, 184, 212, 122, 117, 1, 172, 117, 1, 232, 66, 227, 243, 117, + 1, 240, 244, 117, 1, 240, 245, 240, 5, 117, 1, 225, 77, 117, 1, 249, 1, + 117, 1, 249, 2, 230, 128, 117, 1, 232, 200, 117, 1, 232, 201, 232, 174, + 117, 1, 223, 144, 117, 1, 212, 220, 230, 77, 117, 1, 212, 220, 226, 76, + 227, 243, 117, 1, 246, 146, 226, 76, 252, 146, 117, 1, 246, 146, 226, 76, + 227, 243, 117, 1, 225, 237, 219, 76, 117, 1, 212, 219, 117, 1, 212, 220, + 212, 144, 117, 1, 246, 145, 117, 1, 246, 146, 228, 6, 117, 1, 199, 117, + 1, 179, 117, 1, 222, 52, 232, 18, 117, 1, 250, 183, 117, 1, 250, 184, + 231, 210, 117, 1, 185, 117, 1, 190, 117, 1, 219, 113, 117, 1, 230, 141, + 117, 1, 207, 96, 117, 1, 217, 200, 217, 184, 117, 1, 217, 200, 217, 140, + 117, 1, 217, 199, 117, 1, 155, 117, 3, 218, 245, 117, 22, 3, 212, 122, + 117, 22, 3, 209, 243, 117, 22, 3, 209, 244, 217, 136, 117, 22, 3, 213, + 164, 117, 22, 3, 213, 165, 233, 90, 117, 22, 3, 219, 114, 218, 254, 117, + 22, 3, 219, 114, 218, 255, 212, 122, 117, 22, 3, 230, 142, 230, 21, 117, + 22, 3, 230, 142, 230, 22, 212, 122, 117, 22, 3, 212, 179, 117, 22, 3, + 212, 180, 218, 254, 117, 22, 3, 212, 180, 212, 122, 117, 22, 3, 212, 180, + 218, 255, 212, 122, 117, 22, 3, 221, 134, 117, 22, 3, 221, 135, 212, 122, + 117, 253, 0, 252, 255, 117, 1, 232, 46, 217, 135, 117, 1, 231, 134, 217, + 135, 117, 1, 210, 80, 217, 135, 117, 1, 243, 98, 217, 135, 117, 1, 209, + 40, 217, 135, 117, 1, 205, 107, 217, 135, 117, 1, 251, 202, 217, 135, + 117, 18, 205, 85, 117, 18, 102, 117, 18, 105, 117, 18, 142, 117, 18, 139, + 117, 18, 168, 117, 18, 184, 117, 18, 195, 117, 18, 193, 117, 18, 200, + 117, 221, 244, 117, 222, 14, 117, 207, 7, 117, 248, 197, 222, 7, 117, + 248, 197, 215, 58, 117, 248, 197, 221, 215, 117, 222, 13, 117, 30, 16, + 245, 29, 117, 30, 16, 245, 224, 117, 30, 16, 243, 223, 117, 30, 16, 246, + 98, 117, 30, 16, 246, 99, 213, 131, 117, 30, 16, 245, 112, 117, 30, 16, + 246, 138, 117, 30, 16, 245, 201, 117, 30, 16, 246, 120, 117, 30, 16, 246, + 99, 240, 164, 117, 30, 16, 36, 212, 117, 117, 30, 16, 36, 243, 32, 117, + 30, 16, 36, 231, 205, 117, 30, 16, 36, 231, 207, 117, 30, 16, 36, 232, + 178, 117, 30, 16, 36, 231, 206, 2, 232, 178, 117, 30, 16, 36, 231, 208, + 2, 232, 178, 117, 30, 16, 36, 250, 20, 117, 30, 16, 36, 240, 9, 117, 30, + 16, 218, 165, 222, 142, 243, 233, 117, 30, 16, 218, 165, 222, 142, 246, + 136, 117, 30, 16, 218, 165, 247, 192, 210, 162, 117, 30, 16, 218, 165, + 247, 192, 212, 187, 117, 30, 16, 230, 44, 222, 142, 222, 2, 117, 30, 16, + 230, 44, 222, 142, 220, 70, 117, 30, 16, 230, 44, 247, 192, 220, 236, + 117, 30, 16, 230, 44, 247, 192, 220, 222, 117, 30, 16, 230, 44, 222, 142, + 221, 5, 213, 153, 3, 221, 241, 213, 153, 3, 221, 254, 213, 153, 3, 221, + 250, 213, 153, 1, 62, 213, 153, 1, 74, 213, 153, 1, 71, 213, 153, 1, 252, + 248, 213, 153, 1, 76, 213, 153, 1, 75, 213, 153, 1, 242, 192, 213, 153, + 1, 172, 213, 153, 1, 220, 19, 213, 153, 1, 240, 244, 213, 153, 1, 225, + 77, 213, 153, 1, 249, 1, 213, 153, 1, 232, 200, 213, 153, 1, 205, 116, + 213, 153, 1, 223, 144, 213, 153, 1, 212, 219, 213, 153, 1, 246, 145, 213, + 153, 1, 199, 213, 153, 1, 179, 213, 153, 1, 242, 73, 213, 153, 1, 209, + 70, 213, 153, 1, 250, 183, 213, 153, 1, 185, 213, 153, 1, 190, 213, 153, + 1, 219, 113, 213, 153, 1, 230, 141, 213, 153, 1, 207, 96, 213, 153, 1, + 217, 199, 213, 153, 1, 206, 181, 213, 153, 1, 155, 213, 153, 107, 3, 222, + 11, 213, 153, 107, 3, 221, 243, 213, 153, 107, 3, 221, 240, 213, 153, 22, + 3, 222, 1, 213, 153, 22, 3, 221, 239, 213, 153, 22, 3, 222, 5, 213, 153, + 22, 3, 221, 249, 213, 153, 22, 3, 222, 12, 213, 153, 22, 3, 222, 3, 213, + 153, 3, 222, 15, 213, 153, 3, 208, 188, 213, 153, 107, 3, 221, 204, 185, + 213, 153, 107, 3, 221, 204, 207, 96, 213, 153, 1, 231, 167, 213, 153, 1, + 213, 90, 213, 153, 18, 205, 85, 213, 153, 18, 102, 213, 153, 18, 105, + 213, 153, 18, 142, 213, 153, 18, 139, 213, 153, 18, 168, 213, 153, 18, + 184, 213, 153, 18, 195, 213, 153, 18, 193, 213, 153, 18, 200, 213, 153, + 251, 167, 213, 153, 1, 218, 227, 213, 153, 1, 230, 2, 213, 153, 1, 250, + 0, 213, 153, 1, 42, 232, 76, 213, 153, 1, 42, 229, 28, 250, 107, 1, 62, + 250, 107, 1, 215, 50, 62, 250, 107, 1, 155, 250, 107, 1, 215, 50, 155, + 250, 107, 1, 227, 216, 155, 250, 107, 1, 250, 183, 250, 107, 1, 232, 3, + 250, 183, 250, 107, 1, 179, 250, 107, 1, 215, 50, 179, 250, 107, 1, 199, + 250, 107, 1, 227, 216, 199, 250, 107, 1, 207, 96, 250, 107, 1, 215, 50, + 207, 96, 250, 107, 1, 222, 27, 207, 96, 250, 107, 1, 240, 244, 250, 107, + 1, 215, 50, 240, 244, 250, 107, 1, 232, 200, 250, 107, 1, 246, 145, 250, + 107, 1, 219, 113, 250, 107, 1, 215, 50, 219, 113, 250, 107, 1, 185, 250, + 107, 1, 215, 50, 185, 250, 107, 1, 214, 161, 212, 219, 250, 107, 1, 224, + 46, 212, 219, 250, 107, 1, 217, 199, 250, 107, 1, 215, 50, 217, 199, 250, + 107, 1, 227, 216, 217, 199, 250, 107, 1, 190, 250, 107, 1, 215, 50, 190, + 250, 107, 1, 225, 77, 250, 107, 1, 230, 141, 250, 107, 1, 215, 50, 230, + 141, 250, 107, 1, 223, 144, 250, 107, 1, 249, 1, 250, 107, 1, 225, 151, + 250, 107, 1, 227, 153, 250, 107, 1, 74, 250, 107, 1, 71, 250, 107, 3, + 211, 121, 250, 107, 22, 3, 75, 250, 107, 22, 3, 222, 27, 75, 250, 107, + 22, 3, 243, 104, 250, 107, 22, 3, 74, 250, 107, 22, 3, 232, 3, 74, 250, + 107, 22, 3, 76, 250, 107, 22, 3, 232, 3, 76, 250, 107, 22, 3, 71, 250, + 107, 22, 3, 106, 33, 215, 50, 217, 199, 250, 107, 107, 3, 225, 79, 250, + 107, 107, 3, 239, 155, 250, 107, 221, 252, 250, 107, 221, 248, 250, 107, + 16, 249, 222, 225, 237, 227, 61, 250, 107, 16, 249, 222, 221, 8, 250, + 107, 16, 249, 222, 232, 101, 250, 107, 16, 249, 222, 221, 252, 230, 12, + 1, 172, 230, 12, 1, 231, 65, 230, 12, 1, 231, 167, 230, 12, 1, 240, 244, + 230, 12, 1, 240, 31, 230, 12, 1, 225, 77, 230, 12, 1, 249, 1, 230, 12, 1, + 248, 110, 230, 12, 1, 232, 200, 230, 12, 1, 223, 144, 230, 12, 1, 212, + 219, 230, 12, 1, 212, 56, 230, 12, 1, 246, 145, 230, 12, 1, 199, 230, 12, + 1, 179, 230, 12, 1, 220, 240, 230, 12, 1, 221, 93, 230, 12, 1, 242, 73, + 230, 12, 1, 241, 198, 230, 12, 1, 250, 183, 230, 12, 1, 249, 203, 230, + 12, 1, 185, 230, 12, 1, 226, 188, 230, 12, 1, 210, 243, 230, 12, 1, 210, + 233, 230, 12, 1, 243, 196, 230, 12, 1, 190, 230, 12, 1, 219, 113, 230, + 12, 1, 230, 141, 230, 12, 1, 155, 230, 12, 1, 238, 237, 230, 12, 1, 209, + 70, 230, 12, 1, 217, 199, 230, 12, 1, 216, 2, 230, 12, 1, 207, 96, 230, + 12, 1, 62, 230, 12, 213, 191, 1, 190, 230, 12, 213, 191, 1, 219, 113, + 230, 12, 22, 3, 253, 164, 230, 12, 22, 3, 74, 230, 12, 22, 3, 76, 230, + 12, 22, 3, 222, 152, 230, 12, 22, 3, 71, 230, 12, 22, 3, 209, 162, 230, + 12, 22, 3, 75, 230, 12, 107, 3, 232, 76, 230, 12, 107, 3, 229, 28, 230, + 12, 107, 3, 149, 230, 12, 107, 3, 226, 33, 230, 12, 107, 3, 222, 67, 230, + 12, 107, 3, 137, 230, 12, 107, 3, 213, 10, 230, 12, 107, 3, 223, 118, + 230, 12, 107, 3, 232, 23, 230, 12, 3, 219, 74, 230, 12, 3, 223, 184, 230, + 12, 220, 72, 212, 217, 230, 12, 220, 72, 223, 129, 211, 214, 212, 217, + 230, 12, 220, 72, 248, 117, 230, 12, 220, 72, 210, 225, 248, 117, 230, + 12, 220, 72, 210, 224, 230, 12, 18, 205, 85, 230, 12, 18, 102, 230, 12, + 18, 105, 230, 12, 18, 142, 230, 12, 18, 139, 230, 12, 18, 168, 230, 12, + 18, 184, 230, 12, 18, 195, 230, 12, 18, 193, 230, 12, 18, 200, 230, 12, + 1, 210, 208, 230, 12, 1, 210, 196, 230, 12, 1, 246, 54, 222, 181, 248, + 51, 18, 205, 85, 222, 181, 248, 51, 18, 102, 222, 181, 248, 51, 18, 105, + 222, 181, 248, 51, 18, 142, 222, 181, 248, 51, 18, 139, 222, 181, 248, + 51, 18, 168, 222, 181, 248, 51, 18, 184, 222, 181, 248, 51, 18, 195, 222, + 181, 248, 51, 18, 193, 222, 181, 248, 51, 18, 200, 222, 181, 248, 51, 1, + 230, 141, 222, 181, 248, 51, 1, 251, 199, 222, 181, 248, 51, 1, 252, 220, + 222, 181, 248, 51, 1, 252, 114, 222, 181, 248, 51, 1, 252, 181, 222, 181, + 248, 51, 1, 230, 140, 222, 181, 248, 51, 1, 253, 126, 222, 181, 248, 51, + 1, 253, 127, 222, 181, 248, 51, 1, 253, 125, 222, 181, 248, 51, 1, 253, + 120, 222, 181, 248, 51, 1, 229, 235, 222, 181, 248, 51, 1, 232, 234, 222, + 181, 248, 51, 1, 233, 103, 222, 181, 248, 51, 1, 232, 255, 222, 181, 248, + 51, 1, 232, 243, 222, 181, 248, 51, 1, 229, 81, 222, 181, 248, 51, 1, + 210, 10, 222, 181, 248, 51, 1, 210, 8, 222, 181, 248, 51, 1, 209, 211, + 222, 181, 248, 51, 1, 209, 154, 222, 181, 248, 51, 1, 230, 58, 222, 181, + 248, 51, 1, 242, 253, 222, 181, 248, 51, 1, 243, 107, 222, 181, 248, 51, + 1, 243, 41, 222, 181, 248, 51, 1, 242, 229, 222, 181, 248, 51, 1, 229, + 144, 222, 181, 248, 51, 1, 222, 100, 222, 181, 248, 51, 1, 222, 226, 222, + 181, 248, 51, 1, 222, 88, 222, 181, 248, 51, 1, 222, 194, 222, 181, 248, + 51, 226, 115, 210, 173, 222, 181, 248, 51, 240, 239, 210, 174, 222, 181, + 248, 51, 226, 113, 210, 174, 222, 181, 248, 51, 219, 12, 222, 181, 248, + 51, 221, 91, 222, 181, 248, 51, 252, 212, 222, 181, 248, 51, 220, 72, + 226, 109, 222, 181, 248, 51, 220, 72, 50, 226, 109, 213, 153, 220, 72, + 249, 222, 213, 124, 213, 153, 220, 72, 249, 222, 221, 253, 213, 153, 220, + 72, 249, 222, 220, 60, 213, 153, 220, 72, 249, 222, 248, 242, 213, 153, + 220, 72, 249, 222, 230, 3, 217, 132, 213, 153, 220, 72, 249, 222, 232, + 66, 217, 132, 213, 153, 220, 72, 249, 222, 246, 146, 217, 132, 213, 153, + 220, 72, 249, 222, 250, 184, 217, 132, 209, 36, 135, 232, 1, 209, 36, + 135, 215, 229, 209, 36, 135, 220, 135, 209, 36, 3, 224, 206, 209, 36, 3, + 206, 86, 226, 245, 213, 115, 209, 36, 135, 206, 86, 252, 217, 233, 55, + 213, 115, 209, 36, 135, 206, 86, 233, 55, 213, 115, 209, 36, 135, 206, + 86, 231, 245, 233, 55, 213, 115, 209, 36, 135, 248, 220, 55, 209, 36, + 135, 206, 86, 231, 245, 233, 55, 213, 116, 217, 102, 209, 36, 135, 50, + 213, 115, 209, 36, 135, 211, 36, 213, 115, 209, 36, 135, 231, 245, 252, + 75, 209, 36, 135, 67, 55, 209, 36, 135, 118, 177, 55, 209, 36, 135, 129, + 177, 55, 209, 36, 135, 218, 155, 232, 0, 233, 55, 213, 115, 209, 36, 135, + 251, 197, 233, 55, 213, 115, 209, 36, 3, 208, 184, 213, 115, 209, 36, 3, + 208, 184, 210, 5, 209, 36, 3, 218, 224, 208, 184, 210, 5, 209, 36, 3, + 208, 184, 252, 75, 209, 36, 3, 218, 224, 208, 184, 252, 75, 209, 36, 3, + 208, 184, 210, 6, 2, 212, 191, 209, 36, 3, 208, 184, 252, 76, 2, 212, + 191, 209, 36, 3, 252, 74, 252, 90, 209, 36, 3, 252, 74, 250, 156, 209, + 36, 3, 252, 74, 209, 61, 209, 36, 3, 252, 74, 209, 62, 2, 212, 191, 209, + 36, 3, 211, 157, 209, 36, 3, 239, 23, 152, 252, 73, 209, 36, 3, 152, 252, + 73, 209, 36, 3, 218, 52, 152, 252, 73, 209, 36, 3, 252, 74, 210, 12, 226, + 100, 209, 36, 3, 252, 15, 209, 36, 3, 218, 97, 252, 15, 209, 36, 135, + 248, 220, 52, 209, 36, 3, 232, 156, 209, 36, 3, 209, 204, 209, 36, 135, + 218, 149, 52, 209, 36, 135, 50, 218, 149, 52, 7, 1, 5, 6, 62, 7, 1, 5, 6, + 252, 248, 7, 5, 1, 201, 252, 248, 7, 1, 5, 6, 250, 123, 251, 150, 7, 1, + 5, 6, 249, 34, 7, 1, 5, 6, 246, 240, 7, 1, 5, 6, 242, 196, 7, 1, 5, 6, + 75, 7, 5, 1, 201, 222, 142, 75, 7, 5, 1, 201, 74, 7, 1, 5, 6, 232, 203, + 7, 1, 5, 6, 232, 76, 7, 1, 5, 6, 230, 159, 2, 91, 7, 1, 5, 6, 229, 28, 7, + 1, 5, 6, 218, 224, 226, 33, 7, 1, 5, 6, 76, 7, 1, 5, 6, 222, 142, 76, 7, + 5, 1, 215, 73, 76, 7, 5, 1, 215, 73, 222, 142, 76, 7, 5, 1, 215, 73, 148, + 2, 91, 7, 5, 1, 201, 222, 206, 7, 1, 5, 6, 222, 97, 7, 5, 1, 211, 102, + 160, 76, 7, 5, 1, 249, 154, 160, 76, 7, 1, 5, 6, 222, 67, 7, 1, 5, 6, + 218, 224, 137, 7, 1, 5, 6, 201, 137, 7, 1, 5, 6, 213, 10, 7, 1, 5, 6, 71, + 7, 5, 1, 215, 73, 71, 7, 5, 1, 215, 73, 245, 164, 71, 7, 5, 1, 215, 73, + 201, 229, 28, 7, 1, 5, 6, 209, 148, 7, 1, 5, 6, 207, 129, 7, 1, 5, 6, + 205, 159, 7, 1, 5, 6, 242, 141, 7, 1, 208, 170, 230, 83, 214, 126, 7, 1, + 252, 200, 27, 1, 5, 6, 240, 215, 27, 1, 5, 6, 230, 102, 27, 1, 5, 6, 221, + 53, 27, 1, 5, 6, 218, 210, 27, 1, 5, 6, 220, 93, 34, 1, 5, 6, 243, 68, + 65, 1, 6, 62, 65, 1, 6, 252, 248, 65, 1, 6, 251, 150, 65, 1, 6, 250, 123, + 251, 150, 65, 1, 6, 246, 240, 65, 1, 6, 75, 65, 1, 6, 218, 224, 75, 65, + 1, 6, 241, 55, 65, 1, 6, 239, 155, 65, 1, 6, 74, 65, 1, 6, 232, 203, 65, + 1, 6, 232, 76, 65, 1, 6, 149, 65, 1, 6, 229, 28, 65, 1, 6, 226, 33, 65, + 1, 6, 218, 224, 226, 33, 65, 1, 6, 76, 65, 1, 6, 222, 97, 65, 1, 6, 222, + 67, 65, 1, 6, 137, 65, 1, 6, 213, 10, 65, 1, 6, 71, 65, 1, 6, 207, 129, + 65, 1, 5, 62, 65, 1, 5, 201, 62, 65, 1, 5, 252, 144, 65, 1, 5, 201, 252, + 248, 65, 1, 5, 251, 150, 65, 1, 5, 246, 240, 65, 1, 5, 75, 65, 1, 5, 217, + 100, 65, 1, 5, 222, 142, 75, 65, 1, 5, 201, 222, 142, 75, 65, 1, 5, 241, + 55, 65, 1, 5, 201, 74, 65, 1, 5, 232, 76, 65, 1, 5, 229, 28, 65, 1, 5, + 243, 28, 65, 1, 5, 76, 65, 1, 5, 222, 142, 76, 65, 1, 5, 211, 102, 160, + 76, 65, 1, 5, 249, 154, 160, 76, 65, 1, 5, 222, 67, 65, 1, 5, 213, 10, + 65, 1, 5, 71, 65, 1, 5, 215, 73, 71, 65, 1, 5, 201, 229, 28, 65, 1, 5, + 209, 148, 65, 1, 5, 252, 200, 65, 1, 5, 250, 8, 65, 1, 5, 27, 240, 215, + 65, 1, 5, 245, 227, 65, 1, 5, 27, 221, 78, 65, 1, 5, 248, 58, 7, 213, + 183, 5, 1, 74, 7, 213, 183, 5, 1, 137, 7, 213, 183, 5, 1, 71, 7, 213, + 183, 5, 1, 209, 148, 27, 213, 183, 5, 1, 250, 8, 27, 213, 183, 5, 1, 240, + 215, 27, 213, 183, 5, 1, 218, 210, 27, 213, 183, 5, 1, 221, 78, 27, 213, + 183, 5, 1, 248, 58, 7, 5, 1, 210, 3, 7, 5, 1, 63, 2, 226, 247, 211, 180, + 7, 5, 1, 246, 241, 2, 226, 247, 211, 180, 7, 5, 1, 242, 140, 2, 226, 247, + 211, 180, 7, 5, 1, 229, 29, 2, 226, 247, 211, 180, 7, 5, 1, 226, 34, 2, + 226, 247, 211, 180, 7, 5, 1, 222, 68, 2, 226, 247, 211, 180, 7, 5, 1, + 219, 150, 2, 226, 247, 211, 180, 7, 5, 1, 219, 150, 2, 241, 211, 23, 226, + 247, 211, 180, 7, 5, 1, 218, 1, 2, 226, 247, 211, 180, 7, 5, 1, 213, 11, + 2, 226, 247, 211, 180, 7, 5, 1, 205, 160, 2, 226, 247, 211, 180, 7, 5, 1, + 201, 241, 55, 65, 1, 34, 243, 41, 7, 5, 1, 233, 23, 241, 55, 7, 5, 1, + 212, 59, 2, 213, 229, 7, 5, 6, 1, 237, 225, 2, 91, 7, 5, 1, 232, 250, 2, + 91, 7, 5, 1, 222, 68, 2, 91, 7, 5, 6, 1, 106, 2, 91, 7, 5, 1, 209, 201, + 2, 91, 7, 5, 1, 63, 2, 222, 26, 109, 7, 5, 1, 246, 241, 2, 222, 26, 109, + 7, 5, 1, 242, 140, 2, 222, 26, 109, 7, 5, 1, 241, 56, 2, 222, 26, 109, 7, + 5, 1, 232, 77, 2, 222, 26, 109, 7, 5, 1, 230, 159, 2, 222, 26, 109, 7, 5, + 1, 229, 29, 2, 222, 26, 109, 7, 5, 1, 226, 34, 2, 222, 26, 109, 7, 5, 1, + 222, 68, 2, 222, 26, 109, 7, 5, 1, 219, 150, 2, 222, 26, 109, 7, 5, 1, + 218, 1, 2, 222, 26, 109, 7, 5, 1, 242, 216, 2, 222, 26, 109, 7, 5, 1, + 209, 149, 2, 222, 26, 109, 7, 5, 1, 206, 196, 2, 222, 26, 109, 7, 5, 1, + 205, 160, 2, 222, 26, 109, 7, 5, 1, 32, 2, 218, 230, 109, 7, 5, 1, 252, + 145, 2, 218, 230, 109, 7, 5, 1, 246, 241, 2, 238, 130, 23, 212, 191, 7, + 5, 1, 174, 2, 218, 230, 109, 7, 5, 1, 222, 142, 174, 2, 218, 230, 109, 7, + 5, 1, 218, 224, 222, 142, 174, 2, 218, 230, 109, 7, 5, 1, 217, 101, 2, + 218, 230, 109, 7, 5, 1, 237, 225, 2, 218, 230, 109, 7, 5, 1, 222, 142, + 148, 2, 218, 230, 109, 7, 5, 1, 242, 216, 2, 218, 230, 109, 7, 5, 1, 106, + 2, 218, 230, 109, 7, 5, 1, 242, 142, 2, 218, 230, 109, 65, 1, 5, 201, + 252, 144, 65, 1, 5, 249, 34, 65, 1, 5, 249, 35, 2, 247, 27, 65, 1, 5, + 242, 196, 65, 1, 5, 218, 224, 222, 142, 75, 65, 1, 5, 242, 139, 65, 1, 5, + 245, 22, 232, 204, 2, 91, 65, 1, 5, 121, 241, 55, 65, 1, 5, 201, 239, + 155, 65, 1, 5, 237, 225, 2, 91, 65, 1, 5, 232, 249, 65, 1, 5, 6, 74, 65, + 1, 5, 6, 237, 225, 2, 91, 65, 1, 5, 232, 204, 2, 247, 56, 65, 1, 5, 230, + 159, 2, 218, 230, 109, 65, 1, 5, 230, 159, 2, 222, 26, 109, 65, 1, 5, 6, + 149, 65, 1, 5, 229, 29, 2, 109, 65, 1, 5, 201, 229, 29, 2, 152, 230, 34, + 65, 1, 5, 226, 34, 2, 47, 109, 65, 1, 5, 226, 34, 2, 218, 230, 109, 65, + 1, 5, 6, 226, 33, 65, 1, 5, 250, 123, 76, 65, 1, 5, 221, 78, 65, 1, 5, + 218, 1, 2, 109, 65, 1, 5, 242, 215, 65, 1, 5, 213, 11, 2, 222, 26, 109, + 65, 1, 5, 106, 134, 65, 1, 5, 209, 200, 65, 1, 5, 6, 71, 65, 1, 5, 209, + 149, 2, 109, 65, 1, 5, 201, 209, 148, 65, 1, 5, 205, 159, 65, 1, 5, 205, + 160, 2, 218, 230, 109, 65, 1, 5, 205, 160, 2, 247, 27, 65, 1, 5, 242, + 141, 65, 1, 5, 212, 23, 36, 244, 21, 239, 237, 253, 21, 36, 244, 21, 253, + 9, 253, 21, 36, 214, 205, 55, 36, 213, 122, 83, 36, 228, 12, 36, 239, + 234, 36, 228, 10, 36, 253, 7, 36, 239, 235, 36, 253, 8, 36, 7, 5, 1, 219, + 150, 55, 36, 249, 121, 36, 228, 11, 36, 50, 247, 228, 52, 36, 222, 197, + 52, 36, 205, 31, 55, 36, 232, 235, 55, 36, 209, 195, 52, 36, 209, 178, + 52, 36, 7, 5, 1, 241, 185, 222, 142, 32, 52, 36, 7, 5, 1, 252, 248, 36, + 7, 5, 1, 252, 71, 36, 7, 5, 1, 251, 168, 36, 7, 5, 1, 249, 35, 248, 141, + 36, 7, 5, 1, 233, 23, 246, 240, 36, 7, 5, 1, 242, 196, 36, 7, 5, 1, 241, + 55, 36, 7, 1, 5, 6, 241, 55, 36, 7, 5, 1, 232, 76, 36, 7, 5, 1, 149, 36, + 7, 1, 5, 6, 149, 36, 7, 1, 5, 6, 229, 28, 36, 7, 5, 1, 226, 33, 36, 7, 1, + 5, 6, 226, 33, 36, 7, 1, 5, 6, 137, 36, 7, 5, 1, 219, 150, 218, 96, 36, + 7, 5, 1, 182, 36, 7, 5, 1, 152, 182, 36, 7, 5, 1, 205, 159, 36, 7, 5, 1, + 252, 144, 36, 7, 5, 1, 251, 150, 36, 7, 5, 1, 250, 8, 36, 7, 5, 1, 217, + 100, 36, 7, 5, 1, 242, 139, 36, 7, 5, 1, 230, 159, 2, 50, 226, 247, 211, + 180, 36, 7, 5, 1, 148, 2, 147, 248, 130, 91, 36, 7, 5, 1, 222, 67, 36, 7, + 5, 1, 242, 215, 36, 7, 5, 1, 106, 2, 147, 248, 130, 91, 36, 7, 5, 1, 207, + 129, 36, 7, 5, 1, 32, 2, 245, 166, 36, 7, 5, 1, 148, 2, 245, 166, 36, 7, + 5, 1, 106, 2, 245, 166, 36, 120, 212, 202, 52, 36, 50, 233, 2, 249, 123, + 55, 36, 252, 149, 146, 211, 130, 55, 36, 47, 251, 244, 52, 36, 48, 251, + 244, 23, 130, 251, 244, 55, 7, 6, 1, 32, 2, 218, 149, 55, 7, 5, 1, 32, 2, + 218, 149, 55, 7, 6, 1, 63, 2, 67, 52, 7, 5, 1, 63, 2, 67, 52, 7, 6, 1, + 63, 2, 67, 55, 7, 5, 1, 63, 2, 67, 55, 7, 6, 1, 63, 2, 229, 206, 55, 7, + 5, 1, 63, 2, 229, 206, 55, 7, 6, 1, 249, 35, 2, 248, 142, 23, 153, 7, 5, + 1, 249, 35, 2, 248, 142, 23, 153, 7, 6, 1, 246, 241, 2, 67, 52, 7, 5, 1, + 246, 241, 2, 67, 52, 7, 6, 1, 246, 241, 2, 67, 55, 7, 5, 1, 246, 241, 2, + 67, 55, 7, 6, 1, 246, 241, 2, 229, 206, 55, 7, 5, 1, 246, 241, 2, 229, + 206, 55, 7, 6, 1, 246, 241, 2, 248, 141, 7, 5, 1, 246, 241, 2, 248, 141, + 7, 6, 1, 246, 241, 2, 247, 228, 55, 7, 5, 1, 246, 241, 2, 247, 228, 55, + 7, 6, 1, 174, 2, 228, 14, 23, 239, 236, 7, 5, 1, 174, 2, 228, 14, 23, + 239, 236, 7, 6, 1, 174, 2, 228, 14, 23, 153, 7, 5, 1, 174, 2, 228, 14, + 23, 153, 7, 6, 1, 174, 2, 247, 228, 55, 7, 5, 1, 174, 2, 247, 228, 55, 7, + 6, 1, 174, 2, 211, 181, 55, 7, 5, 1, 174, 2, 211, 181, 55, 7, 6, 1, 174, + 2, 248, 142, 23, 249, 122, 7, 5, 1, 174, 2, 248, 142, 23, 249, 122, 7, 6, + 1, 242, 140, 2, 67, 52, 7, 5, 1, 242, 140, 2, 67, 52, 7, 6, 1, 241, 56, + 2, 228, 13, 7, 5, 1, 241, 56, 2, 228, 13, 7, 6, 1, 239, 156, 2, 67, 52, + 7, 5, 1, 239, 156, 2, 67, 52, 7, 6, 1, 239, 156, 2, 67, 55, 7, 5, 1, 239, + 156, 2, 67, 55, 7, 6, 1, 239, 156, 2, 245, 166, 7, 5, 1, 239, 156, 2, + 245, 166, 7, 6, 1, 239, 156, 2, 248, 141, 7, 5, 1, 239, 156, 2, 248, 141, + 7, 6, 1, 239, 156, 2, 249, 123, 55, 7, 5, 1, 239, 156, 2, 249, 123, 55, + 7, 6, 1, 237, 225, 2, 211, 181, 55, 7, 5, 1, 237, 225, 2, 211, 181, 55, + 7, 6, 1, 237, 225, 2, 245, 167, 23, 153, 7, 5, 1, 237, 225, 2, 245, 167, + 23, 153, 7, 6, 1, 232, 77, 2, 153, 7, 5, 1, 232, 77, 2, 153, 7, 6, 1, + 232, 77, 2, 67, 55, 7, 5, 1, 232, 77, 2, 67, 55, 7, 6, 1, 232, 77, 2, + 229, 206, 55, 7, 5, 1, 232, 77, 2, 229, 206, 55, 7, 6, 1, 230, 159, 2, + 67, 55, 7, 5, 1, 230, 159, 2, 67, 55, 7, 6, 1, 230, 159, 2, 67, 250, 26, + 23, 228, 13, 7, 5, 1, 230, 159, 2, 67, 250, 26, 23, 228, 13, 7, 6, 1, + 230, 159, 2, 229, 206, 55, 7, 5, 1, 230, 159, 2, 229, 206, 55, 7, 6, 1, + 230, 159, 2, 247, 228, 55, 7, 5, 1, 230, 159, 2, 247, 228, 55, 7, 6, 1, + 229, 29, 2, 153, 7, 5, 1, 229, 29, 2, 153, 7, 6, 1, 229, 29, 2, 67, 52, + 7, 5, 1, 229, 29, 2, 67, 52, 7, 6, 1, 229, 29, 2, 67, 55, 7, 5, 1, 229, + 29, 2, 67, 55, 7, 6, 1, 226, 34, 2, 67, 52, 7, 5, 1, 226, 34, 2, 67, 52, + 7, 6, 1, 226, 34, 2, 67, 55, 7, 5, 1, 226, 34, 2, 67, 55, 7, 6, 1, 226, + 34, 2, 229, 206, 55, 7, 5, 1, 226, 34, 2, 229, 206, 55, 7, 6, 1, 226, 34, + 2, 247, 228, 55, 7, 5, 1, 226, 34, 2, 247, 228, 55, 7, 6, 1, 148, 2, 211, + 181, 23, 153, 7, 5, 1, 148, 2, 211, 181, 23, 153, 7, 6, 1, 148, 2, 211, + 181, 23, 245, 166, 7, 5, 1, 148, 2, 211, 181, 23, 245, 166, 7, 6, 1, 148, + 2, 228, 14, 23, 239, 236, 7, 5, 1, 148, 2, 228, 14, 23, 239, 236, 7, 6, + 1, 148, 2, 228, 14, 23, 153, 7, 5, 1, 148, 2, 228, 14, 23, 153, 7, 6, 1, + 222, 68, 2, 153, 7, 5, 1, 222, 68, 2, 153, 7, 6, 1, 222, 68, 2, 67, 52, + 7, 5, 1, 222, 68, 2, 67, 52, 7, 6, 1, 219, 150, 2, 67, 52, 7, 5, 1, 219, + 150, 2, 67, 52, 7, 6, 1, 219, 150, 2, 67, 55, 7, 5, 1, 219, 150, 2, 67, + 55, 7, 6, 1, 219, 150, 2, 67, 250, 26, 23, 228, 13, 7, 5, 1, 219, 150, 2, + 67, 250, 26, 23, 228, 13, 7, 6, 1, 219, 150, 2, 229, 206, 55, 7, 5, 1, + 219, 150, 2, 229, 206, 55, 7, 6, 1, 218, 1, 2, 67, 52, 7, 5, 1, 218, 1, + 2, 67, 52, 7, 6, 1, 218, 1, 2, 67, 55, 7, 5, 1, 218, 1, 2, 67, 55, 7, 6, + 1, 218, 1, 2, 253, 9, 23, 67, 52, 7, 5, 1, 218, 1, 2, 253, 9, 23, 67, 52, + 7, 6, 1, 218, 1, 2, 248, 196, 23, 67, 52, 7, 5, 1, 218, 1, 2, 248, 196, + 23, 67, 52, 7, 6, 1, 218, 1, 2, 67, 250, 26, 23, 67, 52, 7, 5, 1, 218, 1, + 2, 67, 250, 26, 23, 67, 52, 7, 6, 1, 213, 11, 2, 67, 52, 7, 5, 1, 213, + 11, 2, 67, 52, 7, 6, 1, 213, 11, 2, 67, 55, 7, 5, 1, 213, 11, 2, 67, 55, + 7, 6, 1, 213, 11, 2, 229, 206, 55, 7, 5, 1, 213, 11, 2, 229, 206, 55, 7, + 6, 1, 213, 11, 2, 247, 228, 55, 7, 5, 1, 213, 11, 2, 247, 228, 55, 7, 6, + 1, 106, 2, 245, 167, 55, 7, 5, 1, 106, 2, 245, 167, 55, 7, 6, 1, 106, 2, + 211, 181, 55, 7, 5, 1, 106, 2, 211, 181, 55, 7, 6, 1, 106, 2, 247, 228, + 55, 7, 5, 1, 106, 2, 247, 228, 55, 7, 6, 1, 106, 2, 211, 181, 23, 153, 7, + 5, 1, 106, 2, 211, 181, 23, 153, 7, 6, 1, 106, 2, 228, 14, 23, 245, 166, + 7, 5, 1, 106, 2, 228, 14, 23, 245, 166, 7, 6, 1, 209, 149, 2, 211, 180, + 7, 5, 1, 209, 149, 2, 211, 180, 7, 6, 1, 209, 149, 2, 67, 55, 7, 5, 1, + 209, 149, 2, 67, 55, 7, 6, 1, 207, 130, 2, 239, 236, 7, 5, 1, 207, 130, + 2, 239, 236, 7, 6, 1, 207, 130, 2, 153, 7, 5, 1, 207, 130, 2, 153, 7, 6, + 1, 207, 130, 2, 245, 166, 7, 5, 1, 207, 130, 2, 245, 166, 7, 6, 1, 207, + 130, 2, 67, 52, 7, 5, 1, 207, 130, 2, 67, 52, 7, 6, 1, 207, 130, 2, 67, + 55, 7, 5, 1, 207, 130, 2, 67, 55, 7, 6, 1, 206, 196, 2, 67, 52, 7, 5, 1, + 206, 196, 2, 67, 52, 7, 6, 1, 206, 196, 2, 245, 166, 7, 5, 1, 206, 196, + 2, 245, 166, 7, 6, 1, 206, 124, 2, 67, 52, 7, 5, 1, 206, 124, 2, 67, 52, + 7, 6, 1, 205, 160, 2, 247, 227, 7, 5, 1, 205, 160, 2, 247, 227, 7, 6, 1, + 205, 160, 2, 67, 55, 7, 5, 1, 205, 160, 2, 67, 55, 7, 6, 1, 205, 160, 2, + 229, 206, 55, 7, 5, 1, 205, 160, 2, 229, 206, 55, 7, 5, 1, 239, 156, 2, + 229, 206, 55, 7, 5, 1, 213, 11, 2, 245, 166, 7, 5, 1, 207, 130, 2, 218, + 149, 52, 7, 5, 1, 206, 124, 2, 218, 149, 52, 7, 5, 1, 32, 2, 48, 160, + 218, 148, 7, 5, 1, 152, 218, 1, 2, 67, 52, 7, 5, 1, 152, 218, 1, 2, 245, + 163, 91, 7, 5, 1, 152, 218, 1, 2, 127, 91, 7, 6, 1, 215, 228, 182, 7, 5, + 1, 245, 227, 7, 6, 1, 32, 2, 67, 55, 7, 5, 1, 32, 2, 67, 55, 7, 6, 1, 32, + 2, 238, 130, 52, 7, 5, 1, 32, 2, 238, 130, 52, 7, 6, 1, 32, 2, 247, 228, + 23, 153, 7, 5, 1, 32, 2, 247, 228, 23, 153, 7, 6, 1, 32, 2, 247, 228, 23, + 239, 236, 7, 5, 1, 32, 2, 247, 228, 23, 239, 236, 7, 6, 1, 32, 2, 247, + 228, 23, 238, 130, 52, 7, 5, 1, 32, 2, 247, 228, 23, 238, 130, 52, 7, 6, + 1, 32, 2, 247, 228, 23, 211, 180, 7, 5, 1, 32, 2, 247, 228, 23, 211, 180, + 7, 6, 1, 32, 2, 247, 228, 23, 67, 55, 7, 5, 1, 32, 2, 247, 228, 23, 67, + 55, 7, 6, 1, 32, 2, 249, 123, 23, 153, 7, 5, 1, 32, 2, 249, 123, 23, 153, + 7, 6, 1, 32, 2, 249, 123, 23, 239, 236, 7, 5, 1, 32, 2, 249, 123, 23, + 239, 236, 7, 6, 1, 32, 2, 249, 123, 23, 238, 130, 52, 7, 5, 1, 32, 2, + 249, 123, 23, 238, 130, 52, 7, 6, 1, 32, 2, 249, 123, 23, 211, 180, 7, 5, + 1, 32, 2, 249, 123, 23, 211, 180, 7, 6, 1, 32, 2, 249, 123, 23, 67, 55, + 7, 5, 1, 32, 2, 249, 123, 23, 67, 55, 7, 6, 1, 174, 2, 67, 55, 7, 5, 1, + 174, 2, 67, 55, 7, 6, 1, 174, 2, 238, 130, 52, 7, 5, 1, 174, 2, 238, 130, + 52, 7, 6, 1, 174, 2, 211, 180, 7, 5, 1, 174, 2, 211, 180, 7, 6, 1, 174, + 2, 247, 228, 23, 153, 7, 5, 1, 174, 2, 247, 228, 23, 153, 7, 6, 1, 174, + 2, 247, 228, 23, 239, 236, 7, 5, 1, 174, 2, 247, 228, 23, 239, 236, 7, 6, + 1, 174, 2, 247, 228, 23, 238, 130, 52, 7, 5, 1, 174, 2, 247, 228, 23, + 238, 130, 52, 7, 6, 1, 174, 2, 247, 228, 23, 211, 180, 7, 5, 1, 174, 2, + 247, 228, 23, 211, 180, 7, 6, 1, 174, 2, 247, 228, 23, 67, 55, 7, 5, 1, + 174, 2, 247, 228, 23, 67, 55, 7, 6, 1, 237, 225, 2, 238, 130, 52, 7, 5, + 1, 237, 225, 2, 238, 130, 52, 7, 6, 1, 237, 225, 2, 67, 55, 7, 5, 1, 237, + 225, 2, 67, 55, 7, 6, 1, 148, 2, 67, 55, 7, 5, 1, 148, 2, 67, 55, 7, 6, + 1, 148, 2, 238, 130, 52, 7, 5, 1, 148, 2, 238, 130, 52, 7, 6, 1, 148, 2, + 247, 228, 23, 153, 7, 5, 1, 148, 2, 247, 228, 23, 153, 7, 6, 1, 148, 2, + 247, 228, 23, 239, 236, 7, 5, 1, 148, 2, 247, 228, 23, 239, 236, 7, 6, 1, + 148, 2, 247, 228, 23, 238, 130, 52, 7, 5, 1, 148, 2, 247, 228, 23, 238, + 130, 52, 7, 6, 1, 148, 2, 247, 228, 23, 211, 180, 7, 5, 1, 148, 2, 247, + 228, 23, 211, 180, 7, 6, 1, 148, 2, 247, 228, 23, 67, 55, 7, 5, 1, 148, + 2, 247, 228, 23, 67, 55, 7, 6, 1, 148, 2, 238, 70, 23, 153, 7, 5, 1, 148, + 2, 238, 70, 23, 153, 7, 6, 1, 148, 2, 238, 70, 23, 239, 236, 7, 5, 1, + 148, 2, 238, 70, 23, 239, 236, 7, 6, 1, 148, 2, 238, 70, 23, 238, 130, + 52, 7, 5, 1, 148, 2, 238, 70, 23, 238, 130, 52, 7, 6, 1, 148, 2, 238, 70, + 23, 211, 180, 7, 5, 1, 148, 2, 238, 70, 23, 211, 180, 7, 6, 1, 148, 2, + 238, 70, 23, 67, 55, 7, 5, 1, 148, 2, 238, 70, 23, 67, 55, 7, 6, 1, 106, + 2, 67, 55, 7, 5, 1, 106, 2, 67, 55, 7, 6, 1, 106, 2, 238, 130, 52, 7, 5, + 1, 106, 2, 238, 130, 52, 7, 6, 1, 106, 2, 238, 70, 23, 153, 7, 5, 1, 106, + 2, 238, 70, 23, 153, 7, 6, 1, 106, 2, 238, 70, 23, 239, 236, 7, 5, 1, + 106, 2, 238, 70, 23, 239, 236, 7, 6, 1, 106, 2, 238, 70, 23, 238, 130, + 52, 7, 5, 1, 106, 2, 238, 70, 23, 238, 130, 52, 7, 6, 1, 106, 2, 238, 70, + 23, 211, 180, 7, 5, 1, 106, 2, 238, 70, 23, 211, 180, 7, 6, 1, 106, 2, + 238, 70, 23, 67, 55, 7, 5, 1, 106, 2, 238, 70, 23, 67, 55, 7, 6, 1, 206, + 124, 2, 239, 236, 7, 5, 1, 206, 124, 2, 239, 236, 7, 6, 1, 206, 124, 2, + 67, 55, 7, 5, 1, 206, 124, 2, 67, 55, 7, 6, 1, 206, 124, 2, 238, 130, 52, + 7, 5, 1, 206, 124, 2, 238, 130, 52, 7, 6, 1, 206, 124, 2, 211, 180, 7, 5, + 1, 206, 124, 2, 211, 180, 7, 6, 1, 226, 246, 229, 173, 7, 5, 1, 226, 246, + 229, 173, 7, 6, 1, 226, 246, 209, 148, 7, 5, 1, 226, 246, 209, 148, 7, 6, + 1, 206, 124, 2, 229, 111, 7, 5, 1, 206, 124, 2, 229, 111, 27, 5, 1, 252, + 145, 2, 220, 86, 27, 5, 1, 252, 145, 2, 246, 75, 27, 5, 1, 252, 145, 2, + 220, 87, 23, 209, 54, 27, 5, 1, 252, 145, 2, 246, 76, 23, 209, 54, 27, 5, + 1, 252, 145, 2, 220, 87, 23, 222, 72, 27, 5, 1, 252, 145, 2, 246, 76, 23, + 222, 72, 27, 5, 1, 252, 145, 2, 220, 87, 23, 221, 124, 27, 5, 1, 252, + 145, 2, 246, 76, 23, 221, 124, 27, 6, 1, 252, 145, 2, 220, 86, 27, 6, 1, + 252, 145, 2, 246, 75, 27, 6, 1, 252, 145, 2, 220, 87, 23, 209, 54, 27, 6, + 1, 252, 145, 2, 246, 76, 23, 209, 54, 27, 6, 1, 252, 145, 2, 220, 87, 23, + 222, 72, 27, 6, 1, 252, 145, 2, 246, 76, 23, 222, 72, 27, 6, 1, 252, 145, + 2, 220, 87, 23, 221, 124, 27, 6, 1, 252, 145, 2, 246, 76, 23, 221, 124, + 27, 5, 1, 242, 245, 2, 220, 86, 27, 5, 1, 242, 245, 2, 246, 75, 27, 5, 1, + 242, 245, 2, 220, 87, 23, 209, 54, 27, 5, 1, 242, 245, 2, 246, 76, 23, + 209, 54, 27, 5, 1, 242, 245, 2, 220, 87, 23, 222, 72, 27, 5, 1, 242, 245, + 2, 246, 76, 23, 222, 72, 27, 6, 1, 242, 245, 2, 220, 86, 27, 6, 1, 242, + 245, 2, 246, 75, 27, 6, 1, 242, 245, 2, 220, 87, 23, 209, 54, 27, 6, 1, + 242, 245, 2, 246, 76, 23, 209, 54, 27, 6, 1, 242, 245, 2, 220, 87, 23, + 222, 72, 27, 6, 1, 242, 245, 2, 246, 76, 23, 222, 72, 27, 5, 1, 242, 202, + 2, 220, 86, 27, 5, 1, 242, 202, 2, 246, 75, 27, 5, 1, 242, 202, 2, 220, + 87, 23, 209, 54, 27, 5, 1, 242, 202, 2, 246, 76, 23, 209, 54, 27, 5, 1, + 242, 202, 2, 220, 87, 23, 222, 72, 27, 5, 1, 242, 202, 2, 246, 76, 23, + 222, 72, 27, 5, 1, 242, 202, 2, 220, 87, 23, 221, 124, 27, 5, 1, 242, + 202, 2, 246, 76, 23, 221, 124, 27, 6, 1, 242, 202, 2, 220, 86, 27, 6, 1, + 242, 202, 2, 246, 75, 27, 6, 1, 242, 202, 2, 220, 87, 23, 209, 54, 27, 6, + 1, 242, 202, 2, 246, 76, 23, 209, 54, 27, 6, 1, 242, 202, 2, 220, 87, 23, + 222, 72, 27, 6, 1, 242, 202, 2, 246, 76, 23, 222, 72, 27, 6, 1, 242, 202, + 2, 220, 87, 23, 221, 124, 27, 6, 1, 242, 202, 2, 246, 76, 23, 221, 124, + 27, 5, 1, 232, 250, 2, 220, 86, 27, 5, 1, 232, 250, 2, 246, 75, 27, 5, 1, + 232, 250, 2, 220, 87, 23, 209, 54, 27, 5, 1, 232, 250, 2, 246, 76, 23, + 209, 54, 27, 5, 1, 232, 250, 2, 220, 87, 23, 222, 72, 27, 5, 1, 232, 250, + 2, 246, 76, 23, 222, 72, 27, 5, 1, 232, 250, 2, 220, 87, 23, 221, 124, + 27, 5, 1, 232, 250, 2, 246, 76, 23, 221, 124, 27, 6, 1, 232, 250, 2, 220, + 86, 27, 6, 1, 232, 250, 2, 246, 75, 27, 6, 1, 232, 250, 2, 220, 87, 23, + 209, 54, 27, 6, 1, 232, 250, 2, 246, 76, 23, 209, 54, 27, 6, 1, 232, 250, + 2, 220, 87, 23, 222, 72, 27, 6, 1, 232, 250, 2, 246, 76, 23, 222, 72, 27, + 6, 1, 232, 250, 2, 220, 87, 23, 221, 124, 27, 6, 1, 232, 250, 2, 246, 76, + 23, 221, 124, 27, 5, 1, 222, 169, 2, 220, 86, 27, 5, 1, 222, 169, 2, 246, + 75, 27, 5, 1, 222, 169, 2, 220, 87, 23, 209, 54, 27, 5, 1, 222, 169, 2, + 246, 76, 23, 209, 54, 27, 5, 1, 222, 169, 2, 220, 87, 23, 222, 72, 27, 5, + 1, 222, 169, 2, 246, 76, 23, 222, 72, 27, 6, 1, 222, 169, 2, 220, 86, 27, + 6, 1, 222, 169, 2, 246, 75, 27, 6, 1, 222, 169, 2, 220, 87, 23, 209, 54, + 27, 6, 1, 222, 169, 2, 246, 76, 23, 209, 54, 27, 6, 1, 222, 169, 2, 220, + 87, 23, 222, 72, 27, 6, 1, 222, 169, 2, 246, 76, 23, 222, 72, 27, 5, 1, + 209, 201, 2, 220, 86, 27, 5, 1, 209, 201, 2, 246, 75, 27, 5, 1, 209, 201, + 2, 220, 87, 23, 209, 54, 27, 5, 1, 209, 201, 2, 246, 76, 23, 209, 54, 27, + 5, 1, 209, 201, 2, 220, 87, 23, 222, 72, 27, 5, 1, 209, 201, 2, 246, 76, + 23, 222, 72, 27, 5, 1, 209, 201, 2, 220, 87, 23, 221, 124, 27, 5, 1, 209, + 201, 2, 246, 76, 23, 221, 124, 27, 6, 1, 209, 201, 2, 246, 75, 27, 6, 1, + 209, 201, 2, 246, 76, 23, 209, 54, 27, 6, 1, 209, 201, 2, 246, 76, 23, + 222, 72, 27, 6, 1, 209, 201, 2, 246, 76, 23, 221, 124, 27, 5, 1, 222, + 171, 2, 220, 86, 27, 5, 1, 222, 171, 2, 246, 75, 27, 5, 1, 222, 171, 2, + 220, 87, 23, 209, 54, 27, 5, 1, 222, 171, 2, 246, 76, 23, 209, 54, 27, 5, + 1, 222, 171, 2, 220, 87, 23, 222, 72, 27, 5, 1, 222, 171, 2, 246, 76, 23, + 222, 72, 27, 5, 1, 222, 171, 2, 220, 87, 23, 221, 124, 27, 5, 1, 222, + 171, 2, 246, 76, 23, 221, 124, 27, 6, 1, 222, 171, 2, 220, 86, 27, 6, 1, + 222, 171, 2, 246, 75, 27, 6, 1, 222, 171, 2, 220, 87, 23, 209, 54, 27, 6, + 1, 222, 171, 2, 246, 76, 23, 209, 54, 27, 6, 1, 222, 171, 2, 220, 87, 23, + 222, 72, 27, 6, 1, 222, 171, 2, 246, 76, 23, 222, 72, 27, 6, 1, 222, 171, + 2, 220, 87, 23, 221, 124, 27, 6, 1, 222, 171, 2, 246, 76, 23, 221, 124, + 27, 5, 1, 252, 145, 2, 209, 54, 27, 5, 1, 252, 145, 2, 222, 72, 27, 5, 1, + 242, 245, 2, 209, 54, 27, 5, 1, 242, 245, 2, 222, 72, 27, 5, 1, 242, 202, + 2, 209, 54, 27, 5, 1, 242, 202, 2, 222, 72, 27, 5, 1, 232, 250, 2, 209, + 54, 27, 5, 1, 232, 250, 2, 222, 72, 27, 5, 1, 222, 169, 2, 209, 54, 27, + 5, 1, 222, 169, 2, 222, 72, 27, 5, 1, 209, 201, 2, 209, 54, 27, 5, 1, + 209, 201, 2, 222, 72, 27, 5, 1, 222, 171, 2, 209, 54, 27, 5, 1, 222, 171, + 2, 222, 72, 27, 5, 1, 252, 145, 2, 220, 87, 23, 205, 221, 27, 5, 1, 252, + 145, 2, 246, 76, 23, 205, 221, 27, 5, 1, 252, 145, 2, 220, 87, 23, 209, + 55, 23, 205, 221, 27, 5, 1, 252, 145, 2, 246, 76, 23, 209, 55, 23, 205, + 221, 27, 5, 1, 252, 145, 2, 220, 87, 23, 222, 73, 23, 205, 221, 27, 5, 1, + 252, 145, 2, 246, 76, 23, 222, 73, 23, 205, 221, 27, 5, 1, 252, 145, 2, + 220, 87, 23, 221, 125, 23, 205, 221, 27, 5, 1, 252, 145, 2, 246, 76, 23, + 221, 125, 23, 205, 221, 27, 6, 1, 252, 145, 2, 220, 87, 23, 220, 100, 27, + 6, 1, 252, 145, 2, 246, 76, 23, 220, 100, 27, 6, 1, 252, 145, 2, 220, 87, + 23, 209, 55, 23, 220, 100, 27, 6, 1, 252, 145, 2, 246, 76, 23, 209, 55, + 23, 220, 100, 27, 6, 1, 252, 145, 2, 220, 87, 23, 222, 73, 23, 220, 100, + 27, 6, 1, 252, 145, 2, 246, 76, 23, 222, 73, 23, 220, 100, 27, 6, 1, 252, + 145, 2, 220, 87, 23, 221, 125, 23, 220, 100, 27, 6, 1, 252, 145, 2, 246, + 76, 23, 221, 125, 23, 220, 100, 27, 5, 1, 242, 202, 2, 220, 87, 23, 205, + 221, 27, 5, 1, 242, 202, 2, 246, 76, 23, 205, 221, 27, 5, 1, 242, 202, 2, + 220, 87, 23, 209, 55, 23, 205, 221, 27, 5, 1, 242, 202, 2, 246, 76, 23, + 209, 55, 23, 205, 221, 27, 5, 1, 242, 202, 2, 220, 87, 23, 222, 73, 23, + 205, 221, 27, 5, 1, 242, 202, 2, 246, 76, 23, 222, 73, 23, 205, 221, 27, + 5, 1, 242, 202, 2, 220, 87, 23, 221, 125, 23, 205, 221, 27, 5, 1, 242, + 202, 2, 246, 76, 23, 221, 125, 23, 205, 221, 27, 6, 1, 242, 202, 2, 220, + 87, 23, 220, 100, 27, 6, 1, 242, 202, 2, 246, 76, 23, 220, 100, 27, 6, 1, + 242, 202, 2, 220, 87, 23, 209, 55, 23, 220, 100, 27, 6, 1, 242, 202, 2, + 246, 76, 23, 209, 55, 23, 220, 100, 27, 6, 1, 242, 202, 2, 220, 87, 23, + 222, 73, 23, 220, 100, 27, 6, 1, 242, 202, 2, 246, 76, 23, 222, 73, 23, + 220, 100, 27, 6, 1, 242, 202, 2, 220, 87, 23, 221, 125, 23, 220, 100, 27, + 6, 1, 242, 202, 2, 246, 76, 23, 221, 125, 23, 220, 100, 27, 5, 1, 222, + 171, 2, 220, 87, 23, 205, 221, 27, 5, 1, 222, 171, 2, 246, 76, 23, 205, + 221, 27, 5, 1, 222, 171, 2, 220, 87, 23, 209, 55, 23, 205, 221, 27, 5, 1, + 222, 171, 2, 246, 76, 23, 209, 55, 23, 205, 221, 27, 5, 1, 222, 171, 2, + 220, 87, 23, 222, 73, 23, 205, 221, 27, 5, 1, 222, 171, 2, 246, 76, 23, + 222, 73, 23, 205, 221, 27, 5, 1, 222, 171, 2, 220, 87, 23, 221, 125, 23, + 205, 221, 27, 5, 1, 222, 171, 2, 246, 76, 23, 221, 125, 23, 205, 221, 27, + 6, 1, 222, 171, 2, 220, 87, 23, 220, 100, 27, 6, 1, 222, 171, 2, 246, 76, + 23, 220, 100, 27, 6, 1, 222, 171, 2, 220, 87, 23, 209, 55, 23, 220, 100, + 27, 6, 1, 222, 171, 2, 246, 76, 23, 209, 55, 23, 220, 100, 27, 6, 1, 222, + 171, 2, 220, 87, 23, 222, 73, 23, 220, 100, 27, 6, 1, 222, 171, 2, 246, + 76, 23, 222, 73, 23, 220, 100, 27, 6, 1, 222, 171, 2, 220, 87, 23, 221, + 125, 23, 220, 100, 27, 6, 1, 222, 171, 2, 246, 76, 23, 221, 125, 23, 220, + 100, 27, 5, 1, 252, 145, 2, 208, 152, 27, 5, 1, 252, 145, 2, 228, 13, 27, + 5, 1, 252, 145, 2, 209, 55, 23, 205, 221, 27, 5, 1, 252, 145, 2, 205, + 221, 27, 5, 1, 252, 145, 2, 222, 73, 23, 205, 221, 27, 5, 1, 252, 145, 2, + 221, 124, 27, 5, 1, 252, 145, 2, 221, 125, 23, 205, 221, 27, 6, 1, 252, + 145, 2, 208, 152, 27, 6, 1, 252, 145, 2, 228, 13, 27, 6, 1, 252, 145, 2, + 209, 54, 27, 6, 1, 252, 145, 2, 222, 72, 27, 6, 1, 252, 145, 2, 220, 100, + 27, 231, 23, 27, 220, 100, 27, 220, 86, 27, 221, 124, 27, 245, 160, 23, + 221, 124, 27, 5, 1, 242, 202, 2, 209, 55, 23, 205, 221, 27, 5, 1, 242, + 202, 2, 205, 221, 27, 5, 1, 242, 202, 2, 222, 73, 23, 205, 221, 27, 5, 1, + 242, 202, 2, 221, 124, 27, 5, 1, 242, 202, 2, 221, 125, 23, 205, 221, 27, + 6, 1, 242, 245, 2, 209, 54, 27, 6, 1, 242, 245, 2, 222, 72, 27, 6, 1, + 242, 202, 2, 209, 54, 27, 6, 1, 242, 202, 2, 222, 72, 27, 6, 1, 242, 202, + 2, 220, 100, 27, 220, 87, 23, 209, 54, 27, 220, 87, 23, 222, 72, 27, 220, + 87, 23, 221, 124, 27, 5, 1, 232, 250, 2, 208, 152, 27, 5, 1, 232, 250, 2, + 228, 13, 27, 5, 1, 232, 250, 2, 245, 160, 23, 209, 54, 27, 5, 1, 232, + 250, 2, 245, 160, 23, 222, 72, 27, 5, 1, 232, 250, 2, 221, 124, 27, 5, 1, + 232, 250, 2, 245, 160, 23, 221, 124, 27, 6, 1, 232, 250, 2, 208, 152, 27, + 6, 1, 232, 250, 2, 228, 13, 27, 6, 1, 232, 250, 2, 209, 54, 27, 6, 1, + 232, 250, 2, 222, 72, 27, 246, 76, 23, 209, 54, 27, 246, 76, 23, 222, 72, + 27, 246, 76, 23, 221, 124, 27, 5, 1, 209, 201, 2, 208, 152, 27, 5, 1, + 209, 201, 2, 228, 13, 27, 5, 1, 209, 201, 2, 245, 160, 23, 209, 54, 27, + 5, 1, 209, 201, 2, 245, 160, 23, 222, 72, 27, 5, 1, 218, 211, 2, 220, 86, + 27, 5, 1, 218, 211, 2, 246, 75, 27, 5, 1, 209, 201, 2, 221, 124, 27, 5, + 1, 209, 201, 2, 245, 160, 23, 221, 124, 27, 6, 1, 209, 201, 2, 208, 152, + 27, 6, 1, 209, 201, 2, 228, 13, 27, 6, 1, 209, 201, 2, 209, 54, 27, 6, 1, + 209, 201, 2, 222, 72, 27, 6, 1, 218, 211, 2, 246, 75, 27, 245, 160, 23, + 209, 54, 27, 245, 160, 23, 222, 72, 27, 209, 54, 27, 5, 1, 222, 171, 2, + 209, 55, 23, 205, 221, 27, 5, 1, 222, 171, 2, 205, 221, 27, 5, 1, 222, + 171, 2, 222, 73, 23, 205, 221, 27, 5, 1, 222, 171, 2, 221, 124, 27, 5, 1, + 222, 171, 2, 221, 125, 23, 205, 221, 27, 6, 1, 222, 169, 2, 209, 54, 27, + 6, 1, 222, 169, 2, 222, 72, 27, 6, 1, 222, 171, 2, 209, 54, 27, 6, 1, + 222, 171, 2, 222, 72, 27, 6, 1, 222, 171, 2, 220, 100, 27, 222, 72, 27, + 246, 75, 243, 42, 219, 211, 243, 51, 219, 211, 243, 42, 214, 153, 243, + 51, 214, 153, 211, 235, 214, 153, 241, 123, 214, 153, 215, 8, 214, 153, + 241, 241, 214, 153, 220, 72, 214, 153, 212, 12, 214, 153, 239, 130, 214, + 153, 205, 86, 207, 15, 214, 153, 205, 86, 207, 15, 224, 59, 205, 86, 207, + 15, 232, 117, 230, 37, 83, 218, 158, 83, 237, 239, 224, 60, 237, 239, + 241, 241, 246, 78, 243, 42, 246, 78, 243, 51, 246, 78, 194, 134, 50, 79, + 229, 205, 50, 114, 229, 205, 47, 215, 41, 219, 180, 83, 48, 215, 41, 219, + 180, 83, 215, 41, 229, 96, 219, 180, 83, 215, 41, 238, 249, 219, 180, 83, + 47, 50, 219, 180, 83, 48, 50, 219, 180, 83, 50, 229, 96, 219, 180, 83, + 50, 238, 249, 219, 180, 83, 246, 128, 50, 246, 128, 249, 85, 211, 48, + 249, 85, 119, 67, 230, 56, 118, 67, 230, 56, 194, 243, 54, 237, 237, 220, + 204, 229, 206, 216, 39, 221, 229, 216, 39, 230, 37, 243, 49, 218, 158, + 243, 49, 220, 184, 245, 103, 241, 134, 230, 37, 222, 79, 218, 158, 222, + 79, 225, 199, 224, 66, 214, 153, 221, 132, 226, 215, 53, 221, 132, 212, + 99, 211, 243, 53, 220, 127, 50, 220, 127, 211, 36, 220, 127, 218, 224, + 220, 127, 218, 224, 50, 220, 127, 218, 224, 211, 36, 220, 127, 248, 199, + 215, 41, 230, 41, 252, 109, 219, 180, 83, 215, 41, 218, 162, 252, 109, + 219, 180, 83, 219, 28, 83, 50, 242, 168, 83, 233, 10, 222, 81, 209, 223, + 157, 211, 203, 248, 200, 233, 27, 220, 204, 251, 207, 237, 240, 249, 85, + 241, 116, 214, 235, 47, 49, 249, 134, 2, 219, 190, 48, 49, 249, 134, 2, + 219, 190, 50, 219, 196, 83, 219, 196, 242, 168, 83, 242, 168, 219, 196, + 83, 211, 159, 3, 242, 203, 218, 224, 221, 12, 53, 60, 92, 249, 85, 60, + 86, 249, 85, 114, 251, 209, 218, 224, 216, 52, 247, 193, 209, 206, 118, + 251, 208, 252, 160, 208, 227, 247, 153, 226, 202, 53, 213, 93, 246, 78, + 233, 2, 209, 223, 241, 173, 220, 72, 83, 129, 67, 220, 71, 219, 207, 220, + 127, 241, 125, 67, 220, 71, 241, 204, 67, 220, 71, 118, 67, 220, 71, 241, + 125, 67, 83, 244, 21, 247, 59, 211, 47, 79, 241, 125, 245, 21, 227, 109, + 11, 214, 153, 206, 232, 232, 117, 241, 80, 252, 48, 233, 0, 211, 175, + 233, 0, 216, 39, 233, 0, 220, 218, 230, 37, 232, 226, 218, 158, 232, 226, + 241, 215, 213, 211, 232, 226, 220, 184, 245, 103, 232, 226, 233, 39, 213, + 41, 213, 110, 253, 11, 213, 41, 213, 110, 233, 39, 8, 241, 136, 215, 232, + 253, 11, 8, 241, 136, 215, 232, 225, 193, 18, 215, 233, 224, 62, 18, 215, + 233, 213, 139, 205, 85, 213, 139, 7, 5, 1, 74, 213, 139, 139, 213, 139, + 168, 213, 139, 184, 213, 139, 195, 213, 139, 193, 213, 139, 200, 213, + 139, 101, 53, 213, 139, 226, 201, 213, 139, 242, 242, 53, 213, 139, 47, + 221, 216, 213, 139, 48, 221, 216, 213, 139, 7, 5, 1, 226, 33, 213, 183, + 205, 85, 213, 183, 102, 213, 183, 105, 213, 183, 142, 213, 183, 139, 213, + 183, 168, 213, 183, 184, 213, 183, 195, 213, 183, 193, 213, 183, 200, + 213, 183, 101, 53, 213, 183, 226, 201, 213, 183, 242, 242, 53, 213, 183, + 47, 221, 216, 213, 183, 48, 221, 216, 7, 213, 183, 5, 1, 62, 7, 213, 183, + 5, 1, 75, 7, 213, 183, 5, 1, 76, 7, 213, 183, 5, 1, 206, 195, 7, 213, + 183, 5, 1, 217, 100, 7, 213, 183, 5, 1, 239, 155, 7, 213, 183, 5, 1, 232, + 76, 7, 213, 183, 5, 1, 149, 7, 213, 183, 5, 1, 229, 28, 7, 213, 183, 5, + 1, 226, 33, 7, 213, 183, 5, 1, 222, 67, 7, 213, 183, 5, 1, 182, 7, 213, + 183, 5, 1, 213, 10, 242, 183, 53, 247, 163, 53, 247, 45, 53, 241, 106, + 241, 110, 53, 229, 188, 53, 226, 216, 53, 225, 216, 53, 221, 109, 53, + 218, 27, 53, 206, 240, 53, 186, 215, 200, 53, 245, 30, 53, 242, 184, 53, + 231, 104, 53, 210, 163, 53, 244, 4, 53, 240, 146, 221, 143, 53, 221, 106, + 53, 239, 208, 53, 251, 174, 53, 238, 48, 53, 248, 143, 53, 229, 179, 211, + 88, 53, 214, 134, 53, 212, 96, 53, 233, 52, 218, 27, 53, 210, 146, 229, + 188, 53, 224, 49, 141, 53, 227, 219, 53, 218, 47, 53, 36, 47, 239, 90, + 52, 36, 48, 239, 90, 52, 36, 152, 79, 229, 206, 222, 82, 36, 215, 144, + 79, 229, 206, 222, 82, 36, 252, 87, 51, 52, 36, 247, 194, 51, 52, 36, 47, + 51, 52, 36, 48, 51, 52, 36, 218, 149, 222, 82, 36, 247, 194, 218, 149, + 222, 82, 36, 252, 87, 218, 149, 222, 82, 36, 129, 177, 52, 36, 241, 125, + 177, 52, 36, 243, 37, 247, 233, 36, 243, 37, 214, 107, 36, 243, 37, 245, + 156, 36, 243, 37, 247, 234, 250, 171, 36, 47, 48, 51, 52, 36, 243, 37, + 217, 93, 36, 243, 37, 231, 170, 36, 243, 37, 209, 198, 220, 201, 211, 51, + 36, 218, 225, 214, 181, 222, 82, 36, 50, 79, 213, 225, 222, 82, 36, 252, + 97, 93, 36, 211, 36, 209, 225, 36, 207, 17, 249, 116, 52, 36, 92, 51, + 222, 82, 36, 152, 50, 214, 181, 222, 82, 36, 86, 239, 90, 2, 138, 244, 6, + 36, 92, 239, 90, 2, 138, 244, 6, 36, 47, 51, 55, 36, 48, 51, 55, 36, 251, + 210, 52, 253, 17, 222, 203, 253, 1, 211, 130, 212, 42, 213, 192, 159, 6, + 249, 34, 245, 245, 248, 134, 248, 129, 229, 206, 93, 248, 201, 222, 203, + 248, 249, 209, 233, 242, 185, 247, 124, 217, 90, 245, 245, 242, 56, 121, + 5, 241, 55, 121, 6, 239, 155, 249, 200, 6, 239, 155, 159, 6, 239, 155, + 220, 235, 247, 124, 220, 235, 247, 125, 131, 118, 221, 53, 121, 6, 74, + 249, 200, 6, 74, 121, 6, 149, 121, 5, 149, 230, 159, 63, 250, 129, 93, + 159, 6, 226, 33, 223, 175, 53, 214, 165, 219, 40, 247, 93, 121, 6, 222, + 67, 159, 6, 222, 67, 159, 6, 220, 27, 121, 6, 137, 249, 200, 6, 137, 159, + 6, 137, 220, 133, 212, 185, 218, 237, 216, 33, 83, 212, 108, 53, 211, 79, + 141, 53, 209, 23, 159, 6, 205, 159, 222, 96, 53, 222, 193, 53, 233, 2, + 222, 193, 53, 249, 200, 6, 205, 159, 201, 27, 5, 1, 232, 249, 231, 211, + 53, 252, 106, 53, 121, 6, 251, 150, 249, 200, 6, 249, 34, 242, 207, 93, + 121, 5, 75, 121, 6, 75, 121, 6, 242, 139, 201, 6, 242, 139, 121, 6, 229, + 28, 121, 5, 76, 126, 93, 250, 11, 93, 240, 48, 93, 246, 112, 93, 233, 43, + 214, 163, 218, 97, 6, 220, 27, 242, 59, 53, 159, 5, 221, 53, 159, 5, 240, + 215, 159, 6, 240, 215, 159, 6, 221, 53, 159, 226, 32, 213, 157, 201, 38, + 6, 241, 55, 201, 38, 6, 149, 218, 224, 38, 6, 149, 201, 38, 6, 206, 123, + 159, 35, 6, 246, 240, 159, 35, 5, 246, 240, 159, 35, 5, 75, 159, 35, 5, + 74, 159, 35, 5, 232, 203, 220, 103, 229, 205, 201, 252, 125, 221, 132, + 53, 252, 183, 201, 5, 242, 139, 16, 33, 217, 160, 214, 163, 207, 146, + 241, 116, 119, 216, 19, 207, 146, 241, 116, 119, 224, 189, 207, 146, 241, + 116, 119, 212, 91, 207, 146, 241, 116, 119, 212, 10, 207, 146, 241, 116, + 118, 212, 7, 207, 146, 241, 116, 119, 241, 246, 207, 146, 241, 116, 118, + 241, 245, 207, 146, 241, 116, 129, 241, 245, 207, 146, 241, 116, 241, + 125, 241, 245, 207, 146, 241, 116, 119, 215, 0, 207, 146, 241, 116, 241, + 204, 214, 254, 207, 146, 241, 116, 119, 243, 83, 207, 146, 241, 116, 129, + 243, 81, 207, 146, 241, 116, 241, 204, 243, 81, 207, 146, 241, 116, 216, + 23, 243, 81, 241, 116, 223, 176, 102, 218, 109, 223, 177, 102, 218, 109, + 223, 177, 105, 218, 109, 223, 177, 142, 218, 109, 223, 177, 139, 218, + 109, 223, 177, 168, 218, 109, 223, 177, 184, 218, 109, 223, 177, 195, + 218, 109, 223, 177, 193, 218, 109, 223, 177, 200, 218, 109, 223, 177, + 212, 98, 218, 109, 223, 177, 243, 58, 218, 109, 223, 177, 210, 126, 218, + 109, 223, 177, 241, 243, 218, 109, 223, 177, 119, 238, 29, 218, 109, 223, + 177, 241, 204, 238, 29, 218, 109, 223, 177, 119, 211, 242, 5, 218, 109, + 223, 177, 102, 5, 218, 109, 223, 177, 105, 5, 218, 109, 223, 177, 142, 5, + 218, 109, 223, 177, 139, 5, 218, 109, 223, 177, 168, 5, 218, 109, 223, + 177, 184, 5, 218, 109, 223, 177, 195, 5, 218, 109, 223, 177, 193, 5, 218, + 109, 223, 177, 200, 5, 218, 109, 223, 177, 212, 98, 5, 218, 109, 223, + 177, 243, 58, 5, 218, 109, 223, 177, 210, 126, 5, 218, 109, 223, 177, + 241, 243, 5, 218, 109, 223, 177, 119, 238, 29, 5, 218, 109, 223, 177, + 241, 204, 238, 29, 5, 218, 109, 223, 177, 119, 211, 242, 218, 109, 223, + 177, 119, 211, 243, 249, 35, 246, 240, 218, 109, 223, 177, 241, 204, 211, + 242, 218, 109, 223, 177, 212, 99, 211, 242, 218, 109, 223, 177, 218, 224, + 119, 238, 29, 7, 5, 1, 218, 224, 249, 34, 218, 109, 223, 177, 215, 10, + 230, 79, 17, 218, 109, 223, 177, 241, 244, 243, 123, 17, 218, 109, 223, + 177, 241, 244, 211, 242, 218, 109, 223, 177, 119, 238, 30, 211, 242, 207, + 146, 241, 116, 205, 86, 212, 7, 92, 45, 167, 45, 86, 45, 173, 45, 47, 48, + 45, 120, 130, 45, 143, 207, 36, 45, 143, 243, 117, 45, 188, 243, 117, 45, + 188, 207, 36, 45, 92, 51, 2, 91, 86, 51, 2, 91, 92, 207, 65, 45, 86, 207, + 65, 45, 92, 118, 239, 67, 45, 167, 118, 239, 67, 45, 86, 118, 239, 67, + 45, 173, 118, 239, 67, 45, 92, 51, 2, 212, 191, 86, 51, 2, 212, 191, 92, + 51, 241, 98, 134, 167, 51, 241, 98, 134, 86, 51, 241, 98, 134, 173, 51, + 241, 98, 134, 120, 130, 51, 2, 250, 116, 92, 51, 2, 109, 86, 51, 2, 109, + 92, 51, 2, 229, 111, 86, 51, 2, 229, 111, 47, 48, 207, 65, 45, 47, 48, + 51, 2, 91, 173, 205, 31, 45, 167, 51, 2, 211, 167, 230, 36, 167, 51, 2, + 211, 167, 218, 156, 173, 51, 2, 211, 167, 230, 36, 173, 51, 2, 211, 167, + 218, 156, 86, 51, 2, 247, 92, 244, 6, 173, 51, 2, 247, 92, 230, 36, 252, + 87, 211, 102, 216, 55, 45, 247, 194, 211, 102, 216, 55, 45, 143, 207, 36, + 51, 211, 130, 152, 134, 92, 51, 211, 130, 250, 129, 131, 86, 51, 211, + 130, 134, 252, 87, 222, 142, 247, 234, 45, 247, 194, 222, 142, 247, 234, + 45, 92, 239, 90, 2, 138, 209, 196, 92, 239, 90, 2, 138, 244, 6, 167, 239, + 90, 2, 138, 218, 156, 167, 239, 90, 2, 138, 230, 36, 86, 239, 90, 2, 138, + 209, 196, 86, 239, 90, 2, 138, 244, 6, 173, 239, 90, 2, 138, 218, 156, + 173, 239, 90, 2, 138, 230, 36, 86, 51, 131, 92, 45, 167, 51, 92, 73, 173, + 45, 92, 51, 131, 86, 45, 92, 222, 30, 251, 241, 167, 222, 30, 251, 241, + 86, 222, 30, 251, 241, 173, 222, 30, 251, 241, 92, 239, 90, 131, 86, 239, + 89, 86, 239, 90, 131, 92, 239, 89, 92, 50, 51, 2, 91, 47, 48, 50, 51, 2, + 91, 86, 50, 51, 2, 91, 92, 50, 45, 167, 50, 45, 86, 50, 45, 173, 50, 45, + 47, 48, 50, 45, 120, 130, 50, 45, 143, 207, 36, 50, 45, 143, 243, 117, + 50, 45, 188, 243, 117, 50, 45, 188, 207, 36, 50, 45, 92, 211, 36, 45, 86, + 211, 36, 45, 92, 214, 103, 45, 86, 214, 103, 45, 167, 51, 2, 50, 91, 173, + 51, 2, 50, 91, 92, 246, 77, 45, 167, 246, 77, 45, 86, 246, 77, 45, 173, + 246, 77, 45, 92, 51, 211, 130, 134, 86, 51, 211, 130, 134, 92, 59, 45, + 167, 59, 45, 86, 59, 45, 173, 59, 45, 167, 59, 51, 241, 98, 134, 167, 59, + 51, 222, 166, 221, 167, 167, 59, 51, 222, 166, 221, 168, 2, 194, 134, + 167, 59, 51, 222, 166, 221, 168, 2, 79, 134, 167, 59, 50, 45, 167, 59, + 50, 51, 222, 166, 221, 167, 86, 59, 51, 241, 98, 207, 86, 143, 207, 36, + 51, 211, 130, 247, 91, 188, 243, 117, 51, 211, 130, 247, 91, 120, 130, + 59, 45, 48, 51, 2, 5, 247, 233, 173, 51, 92, 73, 167, 45, 129, 86, 251, + 241, 92, 51, 2, 79, 91, 86, 51, 2, 79, 91, 47, 48, 51, 2, 79, 91, 92, 51, + 2, 50, 79, 91, 86, 51, 2, 50, 79, 91, 47, 48, 51, 2, 50, 79, 91, 92, 222, + 140, 45, 86, 222, 140, 45, 47, 48, 222, 140, 45, 33, 252, 156, 247, 150, + 221, 209, 245, 140, 212, 32, 242, 164, 212, 32, 245, 42, 224, 43, 242, + 165, 243, 43, 216, 28, 233, 57, 225, 227, 243, 61, 222, 203, 224, 43, + 252, 123, 243, 61, 222, 203, 5, 243, 61, 222, 203, 247, 118, 251, 232, + 227, 87, 245, 42, 224, 43, 247, 120, 251, 232, 227, 87, 5, 247, 118, 251, + 232, 227, 87, 243, 34, 73, 220, 105, 226, 32, 220, 115, 226, 32, 247, 96, + 226, 32, 213, 157, 226, 202, 53, 226, 200, 53, 67, 220, 218, 245, 75, + 214, 235, 216, 29, 226, 201, 251, 210, 222, 132, 218, 149, 222, 132, 249, + 86, 222, 132, 49, 218, 103, 247, 36, 218, 103, 241, 118, 218, 103, 220, + 101, 124, 233, 45, 48, 252, 108, 252, 108, 227, 116, 252, 108, 214, 133, + 252, 108, 245, 77, 245, 42, 224, 43, 245, 81, 221, 222, 124, 224, 43, + 221, 222, 124, 229, 134, 252, 117, 229, 134, 222, 122, 233, 7, 209, 218, + 233, 21, 50, 233, 21, 211, 36, 233, 21, 247, 113, 233, 21, 213, 129, 233, + 21, 208, 163, 233, 21, 247, 194, 233, 21, 247, 194, 247, 113, 233, 21, + 252, 87, 247, 113, 233, 21, 212, 31, 250, 52, 219, 61, 220, 102, 67, 226, + 201, 242, 170, 240, 152, 220, 102, 238, 135, 211, 181, 222, 132, 218, + 224, 211, 180, 233, 2, 230, 65, 182, 215, 43, 207, 64, 206, 221, 220, + 115, 224, 43, 211, 180, 226, 202, 211, 180, 251, 203, 146, 124, 224, 43, + 251, 203, 146, 124, 252, 44, 146, 124, 252, 44, 249, 57, 224, 43, 253, + 10, 146, 124, 225, 103, 252, 44, 224, 51, 253, 10, 146, 124, 252, 149, + 146, 124, 224, 43, 252, 149, 146, 124, 252, 149, 146, 222, 123, 146, 124, + 211, 36, 211, 180, 252, 157, 146, 124, 242, 237, 124, 240, 151, 242, 237, + 124, 245, 141, 250, 5, 252, 46, 212, 42, 229, 213, 240, 151, 146, 124, + 252, 44, 146, 211, 130, 222, 123, 212, 42, 233, 84, 222, 203, 233, 84, + 73, 222, 123, 252, 44, 146, 124, 247, 163, 242, 241, 242, 242, 247, 162, + 218, 149, 233, 69, 146, 124, 218, 149, 146, 124, 247, 85, 124, 242, 206, + 242, 240, 124, 214, 27, 242, 241, 245, 228, 146, 124, 146, 211, 130, 249, + 46, 245, 246, 227, 116, 249, 45, 219, 194, 146, 124, 224, 43, 146, 124, + 237, 173, 124, 224, 43, 237, 173, 124, 213, 231, 242, 237, 124, 230, 10, + 222, 123, 146, 124, 239, 230, 222, 123, 146, 124, 230, 10, 131, 146, 124, + 239, 230, 131, 146, 124, 230, 10, 249, 57, 224, 43, 146, 124, 239, 230, + 249, 57, 224, 43, 146, 124, 226, 108, 230, 9, 226, 108, 239, 229, 250, 5, + 224, 43, 242, 237, 124, 224, 43, 230, 9, 224, 43, 239, 229, 225, 103, + 230, 10, 224, 51, 146, 124, 225, 103, 239, 230, 224, 51, 146, 124, 230, + 10, 222, 123, 242, 237, 124, 239, 230, 222, 123, 242, 237, 124, 225, 103, + 230, 10, 224, 51, 242, 237, 124, 225, 103, 239, 230, 224, 51, 242, 237, + 124, 230, 10, 222, 123, 239, 229, 239, 230, 222, 123, 230, 9, 225, 103, + 230, 10, 224, 51, 239, 229, 225, 103, 239, 230, 224, 51, 230, 9, 220, + 139, 213, 173, 220, 140, 222, 123, 146, 124, 213, 174, 222, 123, 146, + 124, 220, 140, 222, 123, 242, 237, 124, 213, 174, 222, 123, 242, 237, + 124, 245, 42, 224, 43, 220, 142, 245, 42, 224, 43, 213, 175, 213, 182, + 222, 203, 213, 138, 222, 203, 224, 43, 32, 213, 182, 222, 203, 224, 43, + 32, 213, 138, 222, 203, 213, 182, 73, 222, 123, 146, 124, 213, 138, 73, + 222, 123, 146, 124, 225, 103, 32, 213, 182, 73, 224, 51, 146, 124, 225, + 103, 32, 213, 138, 73, 224, 51, 146, 124, 213, 182, 73, 2, 224, 43, 146, + 124, 213, 138, 73, 2, 224, 43, 146, 124, 226, 91, 226, 92, 226, 93, 226, + 92, 209, 218, 49, 233, 84, 222, 203, 49, 222, 114, 222, 203, 49, 233, 84, + 73, 222, 123, 146, 124, 49, 222, 114, 73, 222, 123, 146, 124, 49, 248, + 213, 49, 247, 29, 39, 220, 218, 39, 226, 201, 39, 211, 175, 39, 245, 75, + 214, 235, 39, 67, 222, 132, 39, 218, 149, 222, 132, 39, 251, 210, 222, + 132, 39, 242, 241, 39, 246, 78, 98, 220, 218, 98, 226, 201, 98, 211, 175, + 98, 67, 222, 132, 48, 212, 201, 47, 212, 201, 130, 212, 201, 120, 212, + 201, 251, 213, 226, 176, 211, 16, 241, 141, 211, 36, 79, 250, 129, 48, + 210, 143, 50, 79, 250, 129, 50, 48, 210, 143, 245, 42, 224, 43, 220, 96, + 224, 43, 211, 16, 245, 42, 224, 43, 241, 142, 225, 105, 50, 79, 250, 129, + 50, 48, 210, 143, 220, 140, 209, 227, 219, 11, 213, 174, 209, 227, 219, + 11, 224, 48, 213, 195, 222, 203, 247, 118, 251, 232, 224, 48, 213, 194, + 224, 48, 213, 195, 73, 222, 123, 146, 124, 247, 118, 251, 232, 224, 48, + 213, 195, 222, 123, 146, 124, 222, 114, 222, 203, 233, 84, 222, 203, 226, + 97, 239, 32, 247, 129, 227, 168, 233, 18, 206, 155, 225, 207, 224, 50, + 48, 252, 109, 2, 252, 21, 48, 211, 51, 226, 32, 229, 134, 252, 117, 226, + 32, 229, 134, 222, 122, 226, 32, 233, 7, 226, 32, 209, 218, 245, 157, + 222, 132, 67, 222, 132, 214, 27, 222, 132, 245, 75, 211, 175, 249, 141, + 47, 224, 48, 242, 58, 216, 51, 220, 115, 48, 224, 48, 242, 58, 216, 51, + 220, 115, 47, 216, 51, 220, 115, 48, 216, 51, 220, 115, 218, 224, 211, + 181, 242, 241, 247, 26, 229, 134, 222, 122, 247, 26, 229, 134, 252, 117, + 50, 213, 181, 50, 213, 137, 50, 233, 7, 50, 209, 218, 220, 245, 146, 23, + 221, 222, 124, 230, 10, 2, 245, 23, 239, 230, 2, 245, 23, 208, 226, 226, + 108, 230, 9, 208, 226, 226, 108, 239, 229, 230, 10, 146, 211, 130, 222, + 123, 239, 229, 239, 230, 146, 211, 130, 222, 123, 230, 9, 146, 211, 130, + 222, 123, 230, 9, 146, 211, 130, 222, 123, 239, 229, 146, 211, 130, 222, + 123, 220, 139, 146, 211, 130, 222, 123, 213, 173, 245, 42, 224, 43, 220, + 143, 222, 123, 242, 243, 245, 42, 224, 43, 213, 176, 222, 123, 242, 243, + 224, 43, 49, 233, 84, 73, 222, 123, 146, 124, 224, 43, 49, 222, 114, 73, + 222, 123, 146, 124, 49, 233, 84, 73, 222, 123, 224, 43, 146, 124, 49, + 222, 114, 73, 222, 123, 224, 43, 146, 124, 230, 10, 249, 57, 224, 43, + 242, 237, 124, 239, 230, 249, 57, 224, 43, 242, 237, 124, 220, 140, 249, + 57, 224, 43, 242, 237, 124, 213, 174, 249, 57, 224, 43, 242, 237, 124, + 224, 43, 224, 48, 213, 195, 222, 203, 245, 42, 224, 43, 247, 120, 251, + 232, 224, 48, 213, 194, 224, 43, 224, 48, 213, 195, 73, 222, 123, 146, + 124, 245, 42, 224, 43, 247, 120, 251, 232, 224, 48, 213, 195, 222, 123, + 242, 243, 79, 243, 54, 226, 245, 194, 243, 54, 120, 48, 245, 163, 243, + 54, 130, 48, 245, 163, 243, 54, 243, 61, 73, 2, 152, 194, 91, 243, 61, + 73, 2, 79, 250, 129, 251, 200, 243, 34, 73, 194, 91, 5, 243, 61, 73, 2, + 79, 250, 129, 251, 200, 243, 34, 73, 194, 91, 243, 61, 73, 2, 67, 52, + 243, 61, 73, 2, 222, 86, 5, 243, 61, 73, 2, 222, 86, 243, 61, 73, 2, 209, + 226, 243, 61, 73, 2, 118, 194, 213, 212, 247, 118, 2, 152, 194, 91, 247, + 118, 2, 79, 250, 129, 251, 200, 243, 34, 73, 194, 91, 5, 247, 118, 2, 79, + 250, 129, 251, 200, 243, 34, 73, 194, 91, 247, 118, 2, 222, 86, 5, 247, + 118, 2, 222, 86, 205, 160, 224, 41, 250, 164, 227, 86, 245, 158, 53, 243, + 63, 45, 238, 54, 120, 251, 243, 130, 251, 243, 220, 109, 221, 112, 207, + 61, 229, 205, 47, 248, 137, 48, 248, 137, 47, 241, 178, 48, 241, 178, + 249, 154, 48, 247, 61, 249, 154, 47, 247, 61, 211, 102, 48, 247, 61, 211, + 102, 47, 247, 61, 218, 224, 224, 43, 53, 49, 229, 88, 252, 21, 217, 67, + 217, 75, 212, 108, 219, 41, 220, 178, 233, 49, 208, 202, 214, 107, 220, + 239, 73, 233, 17, 53, 201, 224, 43, 53, 207, 71, 238, 56, 211, 102, 47, + 247, 91, 211, 102, 48, 247, 91, 249, 154, 47, 247, 91, 249, 154, 48, 247, + 91, 211, 102, 160, 233, 21, 249, 154, 160, 233, 21, 241, 95, 214, 211, + 120, 251, 244, 250, 6, 118, 194, 250, 118, 222, 125, 231, 174, 242, 233, + 211, 130, 212, 42, 218, 167, 206, 196, 233, 69, 32, 219, 38, 249, 140, + 231, 172, 230, 41, 252, 109, 145, 218, 162, 252, 109, 145, 242, 233, 211, + 130, 212, 42, 230, 46, 250, 17, 218, 148, 246, 250, 252, 157, 251, 252, + 213, 40, 211, 90, 218, 32, 245, 122, 222, 115, 247, 131, 212, 164, 214, + 222, 247, 81, 247, 80, 252, 62, 241, 78, 16, 237, 222, 252, 62, 241, 78, + 16, 214, 101, 219, 211, 252, 62, 241, 78, 16, 219, 212, 242, 243, 252, + 62, 241, 78, 16, 219, 212, 245, 81, 252, 62, 241, 78, 16, 219, 212, 245, + 156, 252, 62, 241, 78, 16, 219, 212, 232, 110, 252, 62, 241, 78, 16, 219, + 212, 247, 233, 252, 62, 241, 78, 16, 247, 234, 214, 3, 252, 62, 241, 78, + 16, 247, 234, 232, 110, 252, 62, 241, 78, 16, 214, 236, 134, 252, 62, + 241, 78, 16, 250, 172, 134, 252, 62, 241, 78, 16, 219, 212, 214, 235, + 252, 62, 241, 78, 16, 219, 212, 250, 171, 252, 62, 241, 78, 16, 219, 212, + 230, 9, 252, 62, 241, 78, 16, 219, 212, 239, 229, 252, 62, 241, 78, 16, + 92, 209, 60, 252, 62, 241, 78, 16, 86, 209, 60, 252, 62, 241, 78, 16, + 219, 212, 92, 45, 252, 62, 241, 78, 16, 219, 212, 86, 45, 252, 62, 241, + 78, 16, 247, 234, 250, 171, 252, 62, 241, 78, 16, 130, 212, 202, 209, + 226, 252, 62, 241, 78, 16, 245, 228, 214, 3, 252, 62, 241, 78, 16, 219, + 212, 130, 248, 199, 252, 62, 241, 78, 16, 219, 212, 245, 227, 252, 62, + 241, 78, 16, 130, 212, 202, 232, 110, 252, 62, 241, 78, 16, 167, 209, 60, + 252, 62, 241, 78, 16, 219, 212, 167, 45, 252, 62, 241, 78, 16, 120, 212, + 202, 222, 86, 252, 62, 241, 78, 16, 245, 239, 214, 3, 252, 62, 241, 78, + 16, 219, 212, 120, 248, 199, 252, 62, 241, 78, 16, 219, 212, 245, 238, + 252, 62, 241, 78, 16, 120, 212, 202, 232, 110, 252, 62, 241, 78, 16, 173, + 209, 60, 252, 62, 241, 78, 16, 219, 212, 173, 45, 252, 62, 241, 78, 16, + 219, 179, 209, 226, 252, 62, 241, 78, 16, 245, 228, 209, 226, 252, 62, + 241, 78, 16, 245, 157, 209, 226, 252, 62, 241, 78, 16, 232, 111, 209, + 226, 252, 62, 241, 78, 16, 247, 234, 209, 226, 252, 62, 241, 78, 16, 120, + 215, 156, 232, 110, 252, 62, 241, 78, 16, 219, 179, 219, 211, 252, 62, + 241, 78, 16, 247, 234, 214, 26, 252, 62, 241, 78, 16, 219, 212, 247, 162, + 252, 62, 241, 78, 16, 120, 212, 202, 245, 166, 252, 62, 241, 78, 16, 245, + 239, 245, 166, 252, 62, 241, 78, 16, 214, 27, 245, 166, 252, 62, 241, 78, + 16, 232, 111, 245, 166, 252, 62, 241, 78, 16, 247, 234, 245, 166, 252, + 62, 241, 78, 16, 130, 215, 156, 214, 3, 252, 62, 241, 78, 16, 47, 215, + 156, 214, 3, 252, 62, 241, 78, 16, 211, 181, 245, 166, 252, 62, 241, 78, + 16, 239, 230, 245, 166, 252, 62, 241, 78, 16, 247, 156, 134, 252, 62, + 241, 78, 16, 245, 239, 211, 180, 252, 62, 241, 78, 16, 205, 30, 252, 62, + 241, 78, 16, 214, 4, 211, 180, 252, 62, 241, 78, 16, 216, 53, 209, 226, + 252, 62, 241, 78, 16, 219, 212, 224, 43, 242, 243, 252, 62, 241, 78, 16, + 219, 212, 219, 195, 252, 62, 241, 78, 16, 130, 248, 200, 211, 180, 252, + 62, 241, 78, 16, 120, 248, 200, 211, 180, 252, 62, 241, 78, 16, 232, 249, + 252, 62, 241, 78, 16, 218, 210, 252, 62, 241, 78, 16, 222, 170, 252, 62, + 241, 78, 16, 252, 145, 209, 226, 252, 62, 241, 78, 16, 242, 245, 209, + 226, 252, 62, 241, 78, 16, 232, 250, 209, 226, 252, 62, 241, 78, 16, 222, + 171, 209, 226, 252, 62, 241, 78, 16, 252, 144, 224, 43, 248, 81, 83, 48, + 252, 109, 2, 173, 205, 31, 45, 215, 127, 222, 142, 249, 140, 250, 29, 93, + 79, 229, 206, 2, 226, 247, 245, 23, 233, 27, 93, 247, 114, 209, 224, 93, + 245, 96, 209, 224, 93, 243, 45, 93, 247, 146, 93, 59, 49, 2, 248, 129, + 79, 229, 205, 243, 19, 93, 252, 139, 231, 175, 93, 239, 45, 93, 39, 194, + 250, 129, 2, 224, 40, 39, 211, 52, 244, 8, 249, 111, 247, 234, 2, 224, + 45, 45, 209, 222, 93, 226, 155, 93, 237, 235, 93, 222, 141, 239, 154, 93, + 222, 141, 230, 157, 93, 221, 199, 93, 221, 198, 93, 245, 104, 247, 24, + 16, 241, 136, 105, 214, 185, 93, 252, 62, 241, 78, 16, 219, 211, 246, 2, + 216, 40, 231, 175, 93, 220, 129, 222, 37, 225, 82, 222, 37, 220, 125, + 217, 94, 93, 247, 209, 217, 94, 93, 47, 221, 217, 209, 203, 109, 47, 221, + 217, 242, 157, 47, 221, 217, 229, 92, 109, 48, 221, 217, 209, 203, 109, + 48, 221, 217, 242, 157, 48, 221, 217, 229, 92, 109, 47, 49, 249, 134, + 209, 203, 247, 91, 47, 49, 249, 134, 242, 157, 47, 49, 249, 134, 229, 92, + 247, 91, 48, 49, 249, 134, 209, 203, 247, 91, 48, 49, 249, 134, 242, 157, + 48, 49, 249, 134, 229, 92, 247, 91, 47, 247, 26, 249, 134, 209, 203, 109, + 47, 247, 26, 249, 134, 226, 247, 221, 45, 47, 247, 26, 249, 134, 229, 92, + 109, 247, 26, 249, 134, 242, 157, 48, 247, 26, 249, 134, 209, 203, 109, + 48, 247, 26, 249, 134, 226, 247, 221, 45, 48, 247, 26, 249, 134, 229, 92, + 109, 233, 22, 242, 157, 194, 229, 206, 242, 157, 209, 203, 47, 222, 123, + 229, 92, 48, 247, 26, 249, 134, 217, 76, 209, 203, 48, 222, 123, 229, 92, + 47, 247, 26, 249, 134, 217, 76, 213, 158, 211, 101, 213, 158, 249, 153, + 211, 102, 49, 145, 249, 154, 49, 145, 249, 154, 49, 249, 134, 131, 211, + 102, 49, 145, 37, 16, 249, 153, 47, 79, 96, 229, 205, 48, 79, 96, 229, + 205, 194, 217, 110, 229, 204, 194, 217, 110, 229, 203, 194, 217, 110, + 229, 202, 194, 217, 110, 229, 201, 245, 219, 16, 147, 79, 23, 211, 102, + 218, 167, 245, 219, 16, 147, 79, 23, 249, 154, 218, 167, 245, 219, 16, + 147, 79, 2, 247, 233, 245, 219, 16, 147, 130, 23, 194, 2, 247, 233, 245, + 219, 16, 147, 120, 23, 194, 2, 247, 233, 245, 219, 16, 147, 79, 2, 211, + 51, 245, 219, 16, 147, 130, 23, 194, 2, 211, 51, 245, 219, 16, 147, 120, + 23, 194, 2, 211, 51, 245, 219, 16, 147, 79, 23, 207, 64, 245, 219, 16, + 147, 130, 23, 194, 2, 207, 64, 245, 219, 16, 147, 120, 23, 194, 2, 207, + 64, 245, 219, 16, 147, 130, 23, 238, 121, 245, 219, 16, 147, 120, 23, + 238, 121, 245, 219, 16, 147, 79, 23, 211, 102, 230, 46, 245, 219, 16, + 147, 79, 23, 249, 154, 230, 46, 49, 241, 148, 218, 229, 93, 243, 77, 93, + 79, 229, 206, 242, 157, 227, 57, 249, 122, 227, 57, 152, 131, 215, 143, + 227, 57, 215, 144, 131, 229, 125, 227, 57, 152, 131, 118, 215, 129, 227, + 57, 118, 215, 130, 131, 229, 125, 227, 57, 118, 215, 130, 232, 118, 227, + 57, 211, 33, 227, 57, 212, 72, 227, 57, 221, 138, 243, 121, 239, 222, + 241, 72, 211, 102, 221, 216, 249, 154, 221, 216, 211, 102, 247, 26, 145, + 249, 154, 247, 26, 145, 211, 102, 211, 93, 215, 204, 145, 249, 154, 211, + 93, 215, 204, 145, 59, 211, 65, 250, 17, 218, 149, 2, 247, 233, 213, 242, + 241, 186, 253, 25, 247, 23, 243, 62, 233, 7, 246, 2, 242, 161, 93, 60, + 218, 162, 50, 211, 51, 60, 230, 41, 50, 211, 51, 60, 209, 205, 50, 211, + 51, 60, 244, 7, 50, 211, 51, 60, 218, 162, 50, 211, 52, 2, 79, 134, 60, + 230, 41, 50, 211, 52, 2, 79, 134, 60, 218, 162, 211, 52, 2, 50, 79, 134, + 252, 176, 247, 195, 213, 248, 211, 176, 247, 195, 238, 57, 2, 241, 170, + 217, 149, 60, 227, 109, 230, 41, 211, 51, 60, 227, 109, 218, 162, 211, + 51, 60, 227, 109, 209, 205, 211, 51, 60, 227, 109, 244, 7, 211, 51, 50, + 79, 134, 60, 49, 33, 213, 251, 60, 247, 234, 33, 219, 42, 16, 33, 223, + 181, 16, 33, 214, 22, 73, 239, 66, 16, 33, 214, 22, 73, 212, 60, 16, 33, + 243, 34, 73, 212, 60, 16, 33, 243, 34, 73, 211, 69, 16, 33, 243, 21, 16, + 33, 253, 13, 16, 33, 250, 28, 16, 33, 250, 170, 16, 33, 194, 212, 203, + 16, 33, 229, 206, 242, 19, 16, 33, 79, 212, 203, 16, 33, 241, 136, 242, + 19, 16, 33, 248, 191, 218, 228, 16, 33, 215, 179, 222, 93, 16, 33, 215, + 179, 233, 68, 16, 33, 246, 73, 229, 196, 242, 217, 16, 33, 245, 199, 247, + 109, 102, 16, 33, 245, 199, 247, 109, 105, 16, 33, 245, 199, 247, 109, + 142, 16, 33, 245, 199, 247, 109, 139, 16, 33, 170, 253, 13, 16, 33, 213, + 36, 233, 131, 16, 33, 243, 34, 73, 211, 70, 249, 193, 16, 33, 248, 224, + 16, 33, 243, 34, 73, 227, 108, 16, 33, 213, 179, 16, 33, 242, 217, 16, + 33, 241, 236, 216, 39, 16, 33, 239, 221, 216, 39, 16, 33, 219, 43, 216, + 39, 16, 33, 209, 217, 216, 39, 16, 33, 214, 153, 16, 33, 245, 236, 249, + 196, 93, 222, 142, 249, 140, 16, 33, 225, 85, 16, 33, 245, 237, 241, 136, + 105, 16, 33, 213, 180, 241, 136, 105, 222, 215, 109, 222, 215, 248, 105, + 222, 215, 241, 139, 222, 215, 233, 2, 241, 139, 222, 215, 250, 25, 249, + 98, 222, 215, 249, 147, 211, 203, 222, 215, 249, 131, 250, 134, 237, 172, + 222, 215, 252, 127, 73, 248, 80, 222, 215, 246, 78, 222, 215, 247, 13, + 253, 17, 223, 179, 222, 215, 50, 250, 171, 39, 18, 102, 39, 18, 105, 39, + 18, 142, 39, 18, 139, 39, 18, 168, 39, 18, 184, 39, 18, 195, 39, 18, 193, + 39, 18, 200, 39, 43, 212, 98, 39, 43, 243, 58, 39, 43, 210, 126, 39, 43, + 212, 5, 39, 43, 241, 119, 39, 43, 241, 247, 39, 43, 215, 4, 39, 43, 216, + 20, 39, 43, 243, 85, 39, 43, 224, 192, 39, 43, 210, 123, 97, 18, 102, 97, + 18, 105, 97, 18, 142, 97, 18, 139, 97, 18, 168, 97, 18, 184, 97, 18, 195, + 97, 18, 193, 97, 18, 200, 97, 43, 212, 98, 97, 43, 243, 58, 97, 43, 210, + 126, 97, 43, 212, 5, 97, 43, 241, 119, 97, 43, 241, 247, 97, 43, 215, 4, + 97, 43, 216, 20, 97, 43, 243, 85, 97, 43, 224, 192, 97, 43, 210, 123, 18, + 119, 241, 82, 213, 251, 18, 118, 241, 82, 213, 251, 18, 129, 241, 82, + 213, 251, 18, 241, 125, 241, 82, 213, 251, 18, 241, 204, 241, 82, 213, + 251, 18, 215, 10, 241, 82, 213, 251, 18, 216, 23, 241, 82, 213, 251, 18, + 243, 88, 241, 82, 213, 251, 18, 224, 195, 241, 82, 213, 251, 43, 212, 99, + 241, 82, 213, 251, 43, 243, 59, 241, 82, 213, 251, 43, 210, 127, 241, 82, + 213, 251, 43, 212, 6, 241, 82, 213, 251, 43, 241, 120, 241, 82, 213, 251, + 43, 241, 248, 241, 82, 213, 251, 43, 215, 5, 241, 82, 213, 251, 43, 216, + 21, 241, 82, 213, 251, 43, 243, 86, 241, 82, 213, 251, 43, 224, 193, 241, + 82, 213, 251, 43, 210, 124, 241, 82, 213, 251, 97, 7, 5, 1, 62, 97, 7, 5, + 1, 251, 150, 97, 7, 5, 1, 249, 34, 97, 7, 5, 1, 246, 240, 97, 7, 5, 1, + 75, 97, 7, 5, 1, 242, 139, 97, 7, 5, 1, 241, 55, 97, 7, 5, 1, 239, 155, + 97, 7, 5, 1, 74, 97, 7, 5, 1, 232, 203, 97, 7, 5, 1, 232, 76, 97, 7, 5, + 1, 149, 97, 7, 5, 1, 229, 28, 97, 7, 5, 1, 226, 33, 97, 7, 5, 1, 76, 97, + 7, 5, 1, 222, 67, 97, 7, 5, 1, 220, 27, 97, 7, 5, 1, 137, 97, 7, 5, 1, + 182, 97, 7, 5, 1, 213, 10, 97, 7, 5, 1, 71, 97, 7, 5, 1, 209, 148, 97, 7, + 5, 1, 207, 129, 97, 7, 5, 1, 206, 195, 97, 7, 5, 1, 206, 123, 97, 7, 5, + 1, 205, 159, 39, 7, 6, 1, 62, 39, 7, 6, 1, 251, 150, 39, 7, 6, 1, 249, + 34, 39, 7, 6, 1, 246, 240, 39, 7, 6, 1, 75, 39, 7, 6, 1, 242, 139, 39, 7, + 6, 1, 241, 55, 39, 7, 6, 1, 239, 155, 39, 7, 6, 1, 74, 39, 7, 6, 1, 232, + 203, 39, 7, 6, 1, 232, 76, 39, 7, 6, 1, 149, 39, 7, 6, 1, 229, 28, 39, 7, + 6, 1, 226, 33, 39, 7, 6, 1, 76, 39, 7, 6, 1, 222, 67, 39, 7, 6, 1, 220, + 27, 39, 7, 6, 1, 137, 39, 7, 6, 1, 182, 39, 7, 6, 1, 213, 10, 39, 7, 6, + 1, 71, 39, 7, 6, 1, 209, 148, 39, 7, 6, 1, 207, 129, 39, 7, 6, 1, 206, + 195, 39, 7, 6, 1, 206, 123, 39, 7, 6, 1, 205, 159, 39, 7, 5, 1, 62, 39, + 7, 5, 1, 251, 150, 39, 7, 5, 1, 249, 34, 39, 7, 5, 1, 246, 240, 39, 7, 5, + 1, 75, 39, 7, 5, 1, 242, 139, 39, 7, 5, 1, 241, 55, 39, 7, 5, 1, 239, + 155, 39, 7, 5, 1, 74, 39, 7, 5, 1, 232, 203, 39, 7, 5, 1, 232, 76, 39, 7, + 5, 1, 149, 39, 7, 5, 1, 229, 28, 39, 7, 5, 1, 226, 33, 39, 7, 5, 1, 76, + 39, 7, 5, 1, 222, 67, 39, 7, 5, 1, 220, 27, 39, 7, 5, 1, 137, 39, 7, 5, + 1, 182, 39, 7, 5, 1, 213, 10, 39, 7, 5, 1, 71, 39, 7, 5, 1, 209, 148, 39, + 7, 5, 1, 207, 129, 39, 7, 5, 1, 206, 195, 39, 7, 5, 1, 206, 123, 39, 7, + 5, 1, 205, 159, 39, 18, 205, 85, 170, 39, 43, 243, 58, 170, 39, 43, 210, + 126, 170, 39, 43, 212, 5, 170, 39, 43, 241, 119, 170, 39, 43, 241, 247, + 170, 39, 43, 215, 4, 170, 39, 43, 216, 20, 170, 39, 43, 243, 85, 170, 39, + 43, 224, 192, 170, 39, 43, 210, 123, 50, 39, 18, 102, 50, 39, 18, 105, + 50, 39, 18, 142, 50, 39, 18, 139, 50, 39, 18, 168, 50, 39, 18, 184, 50, + 39, 18, 195, 50, 39, 18, 193, 50, 39, 18, 200, 50, 39, 43, 212, 98, 170, + 39, 18, 205, 85, 96, 110, 147, 238, 121, 96, 110, 77, 238, 121, 96, 110, + 147, 209, 22, 96, 110, 77, 209, 22, 96, 110, 147, 211, 36, 246, 79, 238, + 121, 96, 110, 77, 211, 36, 246, 79, 238, 121, 96, 110, 147, 211, 36, 246, + 79, 209, 22, 96, 110, 77, 211, 36, 246, 79, 209, 22, 96, 110, 147, 219, + 207, 246, 79, 238, 121, 96, 110, 77, 219, 207, 246, 79, 238, 121, 96, + 110, 147, 219, 207, 246, 79, 209, 22, 96, 110, 77, 219, 207, 246, 79, + 209, 22, 96, 110, 147, 130, 23, 218, 167, 96, 110, 130, 147, 23, 48, 239, + 54, 96, 110, 130, 77, 23, 48, 229, 223, 96, 110, 77, 130, 23, 218, 167, + 96, 110, 147, 130, 23, 230, 46, 96, 110, 130, 147, 23, 47, 239, 54, 96, + 110, 130, 77, 23, 47, 229, 223, 96, 110, 77, 130, 23, 230, 46, 96, 110, + 147, 120, 23, 218, 167, 96, 110, 120, 147, 23, 48, 239, 54, 96, 110, 120, + 77, 23, 48, 229, 223, 96, 110, 77, 120, 23, 218, 167, 96, 110, 147, 120, + 23, 230, 46, 96, 110, 120, 147, 23, 47, 239, 54, 96, 110, 120, 77, 23, + 47, 229, 223, 96, 110, 77, 120, 23, 230, 46, 96, 110, 147, 79, 23, 218, + 167, 96, 110, 79, 147, 23, 48, 239, 54, 96, 110, 120, 77, 23, 48, 130, + 229, 223, 96, 110, 130, 77, 23, 48, 120, 229, 223, 96, 110, 79, 77, 23, + 48, 229, 223, 96, 110, 130, 147, 23, 48, 120, 239, 54, 96, 110, 120, 147, + 23, 48, 130, 239, 54, 96, 110, 77, 79, 23, 218, 167, 96, 110, 147, 79, + 23, 230, 46, 96, 110, 79, 147, 23, 47, 239, 54, 96, 110, 120, 77, 23, 47, + 130, 229, 223, 96, 110, 130, 77, 23, 47, 120, 229, 223, 96, 110, 79, 77, + 23, 47, 229, 223, 96, 110, 130, 147, 23, 47, 120, 239, 54, 96, 110, 120, + 147, 23, 47, 130, 239, 54, 96, 110, 77, 79, 23, 230, 46, 96, 110, 147, + 130, 23, 238, 121, 96, 110, 47, 77, 23, 48, 130, 229, 223, 96, 110, 48, + 77, 23, 47, 130, 229, 223, 96, 110, 130, 147, 23, 194, 239, 54, 96, 110, + 130, 77, 23, 194, 229, 223, 96, 110, 48, 147, 23, 47, 130, 239, 54, 96, + 110, 47, 147, 23, 48, 130, 239, 54, 96, 110, 77, 130, 23, 238, 121, 96, + 110, 147, 120, 23, 238, 121, 96, 110, 47, 77, 23, 48, 120, 229, 223, 96, + 110, 48, 77, 23, 47, 120, 229, 223, 96, 110, 120, 147, 23, 194, 239, 54, + 96, 110, 120, 77, 23, 194, 229, 223, 96, 110, 48, 147, 23, 47, 120, 239, + 54, 96, 110, 47, 147, 23, 48, 120, 239, 54, 96, 110, 77, 120, 23, 238, + 121, 96, 110, 147, 79, 23, 238, 121, 96, 110, 47, 77, 23, 48, 79, 229, + 223, 96, 110, 48, 77, 23, 47, 79, 229, 223, 96, 110, 79, 147, 23, 194, + 239, 54, 96, 110, 120, 77, 23, 130, 194, 229, 223, 96, 110, 130, 77, 23, + 120, 194, 229, 223, 96, 110, 79, 77, 23, 194, 229, 223, 96, 110, 47, 120, + 77, 23, 48, 130, 229, 223, 96, 110, 48, 120, 77, 23, 47, 130, 229, 223, + 96, 110, 47, 130, 77, 23, 48, 120, 229, 223, 96, 110, 48, 130, 77, 23, + 47, 120, 229, 223, 96, 110, 130, 147, 23, 120, 194, 239, 54, 96, 110, + 120, 147, 23, 130, 194, 239, 54, 96, 110, 48, 147, 23, 47, 79, 239, 54, + 96, 110, 47, 147, 23, 48, 79, 239, 54, 96, 110, 77, 79, 23, 238, 121, 96, + 110, 147, 50, 246, 79, 238, 121, 96, 110, 77, 50, 246, 79, 238, 121, 96, + 110, 147, 50, 246, 79, 209, 22, 96, 110, 77, 50, 246, 79, 209, 22, 96, + 110, 50, 238, 121, 96, 110, 50, 209, 22, 96, 110, 130, 215, 41, 23, 48, + 244, 16, 96, 110, 130, 50, 23, 48, 215, 40, 96, 110, 50, 130, 23, 218, + 167, 96, 110, 130, 215, 41, 23, 47, 244, 16, 96, 110, 130, 50, 23, 47, + 215, 40, 96, 110, 50, 130, 23, 230, 46, 96, 110, 120, 215, 41, 23, 48, + 244, 16, 96, 110, 120, 50, 23, 48, 215, 40, 96, 110, 50, 120, 23, 218, + 167, 96, 110, 120, 215, 41, 23, 47, 244, 16, 96, 110, 120, 50, 23, 47, + 215, 40, 96, 110, 50, 120, 23, 230, 46, 96, 110, 79, 215, 41, 23, 48, + 244, 16, 96, 110, 79, 50, 23, 48, 215, 40, 96, 110, 50, 79, 23, 218, 167, + 96, 110, 79, 215, 41, 23, 47, 244, 16, 96, 110, 79, 50, 23, 47, 215, 40, + 96, 110, 50, 79, 23, 230, 46, 96, 110, 130, 215, 41, 23, 194, 244, 16, + 96, 110, 130, 50, 23, 194, 215, 40, 96, 110, 50, 130, 23, 238, 121, 96, + 110, 120, 215, 41, 23, 194, 244, 16, 96, 110, 120, 50, 23, 194, 215, 40, + 96, 110, 50, 120, 23, 238, 121, 96, 110, 79, 215, 41, 23, 194, 244, 16, + 96, 110, 79, 50, 23, 194, 215, 40, 96, 110, 50, 79, 23, 238, 121, 96, + 110, 147, 252, 22, 130, 23, 218, 167, 96, 110, 147, 252, 22, 130, 23, + 230, 46, 96, 110, 147, 252, 22, 120, 23, 230, 46, 96, 110, 147, 252, 22, + 120, 23, 218, 167, 96, 110, 147, 245, 163, 209, 203, 48, 211, 130, 229, + 92, 230, 46, 96, 110, 147, 245, 163, 209, 203, 47, 211, 130, 229, 92, + 218, 167, 96, 110, 147, 245, 163, 247, 59, 96, 110, 147, 230, 46, 96, + 110, 147, 209, 206, 96, 110, 147, 218, 167, 96, 110, 147, 244, 8, 96, + 110, 77, 230, 46, 96, 110, 77, 209, 206, 96, 110, 77, 218, 167, 96, 110, + 77, 244, 8, 96, 110, 147, 47, 23, 77, 218, 167, 96, 110, 147, 120, 23, + 77, 244, 8, 96, 110, 77, 47, 23, 147, 218, 167, 96, 110, 77, 120, 23, + 147, 244, 8, 209, 203, 160, 249, 193, 229, 92, 119, 243, 84, 249, 193, + 229, 92, 119, 219, 205, 249, 193, 229, 92, 129, 243, 82, 249, 193, 229, + 92, 160, 249, 193, 229, 92, 241, 204, 243, 82, 249, 193, 229, 92, 129, + 219, 203, 249, 193, 229, 92, 216, 23, 243, 82, 249, 193, 241, 82, 249, + 193, 47, 216, 23, 243, 82, 249, 193, 47, 129, 219, 203, 249, 193, 47, + 241, 204, 243, 82, 249, 193, 47, 160, 249, 193, 47, 129, 243, 82, 249, + 193, 47, 119, 219, 205, 249, 193, 47, 119, 243, 84, 249, 193, 48, 160, + 249, 193, 147, 215, 248, 227, 109, 215, 248, 246, 84, 215, 248, 209, 203, + 119, 243, 84, 249, 193, 48, 119, 243, 84, 249, 193, 219, 209, 229, 92, + 230, 46, 219, 209, 229, 92, 218, 167, 219, 209, 209, 203, 230, 46, 219, + 209, 209, 203, 47, 23, 229, 92, 47, 23, 229, 92, 218, 167, 219, 209, 209, + 203, 47, 23, 229, 92, 218, 167, 219, 209, 209, 203, 47, 23, 209, 203, 48, + 23, 229, 92, 230, 46, 219, 209, 209, 203, 47, 23, 209, 203, 48, 23, 229, + 92, 218, 167, 219, 209, 209, 203, 218, 167, 219, 209, 209, 203, 48, 23, + 229, 92, 230, 46, 219, 209, 209, 203, 48, 23, 229, 92, 47, 23, 229, 92, + 218, 167, 60, 214, 107, 59, 214, 107, 59, 49, 2, 218, 93, 247, 90, 59, + 49, 247, 119, 60, 5, 214, 107, 49, 2, 194, 241, 234, 49, 2, 79, 241, 234, + 49, 2, 222, 108, 247, 55, 241, 234, 49, 2, 209, 203, 47, 211, 130, 229, + 92, 48, 241, 234, 49, 2, 209, 203, 48, 211, 130, 229, 92, 47, 241, 234, + 49, 2, 245, 163, 247, 55, 241, 234, 60, 5, 214, 107, 59, 5, 214, 107, 60, + 219, 37, 59, 219, 37, 60, 79, 219, 37, 59, 79, 219, 37, 60, 221, 220, 59, + 221, 220, 60, 209, 205, 211, 51, 59, 209, 205, 211, 51, 60, 209, 205, 5, + 211, 51, 59, 209, 205, 5, 211, 51, 60, 218, 162, 211, 51, 59, 218, 162, + 211, 51, 60, 218, 162, 5, 211, 51, 59, 218, 162, 5, 211, 51, 60, 218, + 162, 220, 202, 59, 218, 162, 220, 202, 60, 244, 7, 211, 51, 59, 244, 7, + 211, 51, 60, 244, 7, 5, 211, 51, 59, 244, 7, 5, 211, 51, 60, 230, 41, + 211, 51, 59, 230, 41, 211, 51, 60, 230, 41, 5, 211, 51, 59, 230, 41, 5, + 211, 51, 60, 230, 41, 220, 202, 59, 230, 41, 220, 202, 60, 245, 156, 59, + 245, 156, 59, 245, 157, 247, 119, 60, 5, 245, 156, 241, 212, 229, 88, 59, + 247, 233, 244, 21, 247, 233, 247, 234, 2, 79, 241, 234, 249, 81, 60, 247, + 233, 247, 234, 2, 47, 160, 249, 202, 247, 234, 2, 48, 160, 249, 202, 247, + 234, 2, 229, 92, 160, 249, 202, 247, 234, 2, 209, 203, 160, 249, 202, + 247, 234, 2, 209, 203, 48, 219, 209, 249, 202, 247, 234, 2, 252, 157, + 249, 57, 209, 203, 47, 219, 209, 249, 202, 47, 160, 60, 247, 233, 48, + 160, 60, 247, 233, 233, 3, 249, 85, 233, 3, 59, 247, 233, 209, 203, 160, + 233, 3, 59, 247, 233, 229, 92, 160, 233, 3, 59, 247, 233, 209, 203, 47, + 219, 209, 247, 230, 252, 21, 209, 203, 48, 219, 209, 247, 230, 252, 21, + 229, 92, 48, 219, 209, 247, 230, 252, 21, 229, 92, 47, 219, 209, 247, + 230, 252, 21, 209, 203, 160, 247, 233, 229, 92, 160, 247, 233, 60, 229, + 92, 48, 211, 51, 60, 229, 92, 47, 211, 51, 60, 209, 203, 47, 211, 51, 60, + 209, 203, 48, 211, 51, 59, 249, 85, 49, 2, 47, 160, 249, 202, 49, 2, 48, + 160, 249, 202, 49, 2, 209, 203, 47, 245, 163, 160, 249, 202, 49, 2, 229, + 92, 48, 245, 163, 160, 249, 202, 59, 49, 2, 79, 249, 213, 229, 205, 59, + 209, 205, 211, 52, 2, 245, 23, 209, 205, 211, 52, 2, 47, 160, 249, 202, + 209, 205, 211, 52, 2, 48, 160, 249, 202, 230, 86, 247, 233, 59, 49, 2, + 209, 203, 47, 219, 208, 59, 49, 2, 229, 92, 47, 219, 208, 59, 49, 2, 229, + 92, 48, 219, 208, 59, 49, 2, 209, 203, 48, 219, 208, 59, 247, 234, 2, + 209, 203, 47, 219, 208, 59, 247, 234, 2, 229, 92, 47, 219, 208, 59, 247, + 234, 2, 229, 92, 48, 219, 208, 59, 247, 234, 2, 209, 203, 48, 219, 208, + 209, 203, 47, 211, 51, 209, 203, 48, 211, 51, 229, 92, 47, 211, 51, 59, + 227, 109, 214, 107, 60, 227, 109, 214, 107, 59, 227, 109, 5, 214, 107, + 60, 227, 109, 5, 214, 107, 229, 92, 48, 211, 51, 60, 213, 155, 2, 219, + 55, 247, 183, 209, 238, 214, 195, 247, 158, 60, 214, 26, 59, 214, 26, + 229, 220, 211, 226, 213, 154, 251, 228, 224, 64, 245, 210, 224, 64, 247, + 128, 222, 128, 60, 212, 107, 59, 212, 107, 250, 146, 249, 140, 250, 146, + 96, 2, 248, 80, 250, 146, 96, 2, 206, 195, 217, 162, 209, 239, 2, 219, + 84, 243, 243, 238, 63, 250, 4, 59, 215, 153, 221, 45, 60, 215, 153, 221, + 45, 215, 239, 218, 224, 218, 97, 241, 176, 239, 61, 249, 85, 60, 47, 220, + 201, 233, 53, 60, 48, 220, 201, 233, 53, 59, 47, 220, 201, 233, 53, 59, + 120, 220, 201, 233, 53, 59, 48, 220, 201, 233, 53, 59, 130, 220, 201, + 233, 53, 214, 241, 23, 247, 58, 248, 177, 53, 219, 96, 53, 249, 220, 53, + 248, 248, 252, 101, 222, 109, 247, 59, 248, 59, 218, 210, 247, 60, 73, + 229, 106, 247, 60, 73, 232, 172, 214, 27, 23, 247, 65, 242, 42, 93, 252, + 254, 215, 241, 239, 115, 23, 215, 77, 221, 173, 93, 206, 1, 206, 75, 211, + 41, 33, 239, 56, 211, 41, 33, 230, 111, 211, 41, 33, 241, 219, 211, 41, + 33, 211, 227, 211, 41, 33, 207, 9, 211, 41, 33, 207, 69, 211, 41, 33, + 226, 128, 211, 41, 33, 243, 120, 207, 27, 73, 245, 184, 59, 241, 94, 242, + 67, 59, 214, 210, 242, 67, 60, 214, 210, 242, 67, 59, 213, 155, 2, 219, + 55, 241, 215, 219, 205, 226, 144, 230, 81, 219, 205, 226, 144, 227, 78, + 242, 11, 53, 243, 120, 227, 226, 53, 232, 91, 217, 126, 209, 189, 225, + 95, 220, 215, 252, 7, 212, 149, 240, 158, 248, 222, 230, 15, 208, 186, + 229, 232, 217, 96, 217, 183, 248, 208, 252, 38, 220, 250, 59, 248, 65, + 231, 106, 59, 248, 65, 219, 197, 59, 248, 65, 218, 105, 59, 248, 65, 249, + 212, 59, 248, 65, 231, 56, 59, 248, 65, 221, 185, 60, 248, 65, 231, 106, + 60, 248, 65, 219, 197, 60, 248, 65, 218, 105, 60, 248, 65, 249, 212, 60, + 248, 65, 231, 56, 60, 248, 65, 221, 185, 60, 214, 151, 213, 167, 59, 239, + 61, 213, 167, 59, 245, 157, 213, 167, 60, 247, 181, 213, 167, 59, 214, + 151, 213, 167, 60, 239, 61, 213, 167, 60, 245, 157, 213, 167, 59, 247, + 181, 213, 167, 238, 63, 214, 112, 219, 205, 224, 37, 243, 84, 224, 37, + 250, 58, 243, 84, 224, 32, 250, 58, 215, 3, 224, 32, 226, 65, 241, 188, + 53, 226, 65, 225, 192, 53, 226, 65, 215, 228, 53, 207, 36, 213, 30, 247, + 59, 243, 117, 213, 30, 247, 59, 209, 214, 219, 33, 93, 219, 33, 16, 33, + 210, 94, 220, 232, 219, 33, 16, 33, 210, 93, 220, 232, 219, 33, 16, 33, + 210, 92, 220, 232, 219, 33, 16, 33, 210, 91, 220, 232, 219, 33, 16, 33, + 210, 90, 220, 232, 219, 33, 16, 33, 210, 89, 220, 232, 219, 33, 16, 33, + 210, 88, 220, 232, 219, 33, 16, 33, 240, 156, 227, 169, 60, 209, 214, + 219, 33, 93, 219, 34, 221, 235, 93, 221, 208, 221, 235, 93, 221, 123, + 221, 235, 53, 207, 25, 93, 245, 149, 242, 66, 245, 149, 242, 65, 245, + 149, 242, 64, 245, 149, 242, 63, 245, 149, 242, 62, 245, 149, 242, 61, + 59, 247, 234, 2, 67, 218, 167, 59, 247, 234, 2, 118, 245, 21, 60, 247, + 234, 2, 59, 67, 218, 167, 60, 247, 234, 2, 118, 59, 245, 21, 226, 160, + 33, 206, 75, 226, 160, 33, 206, 0, 245, 131, 33, 239, 231, 206, 75, 245, + 131, 33, 230, 8, 206, 0, 245, 131, 33, 230, 8, 206, 75, 245, 131, 33, + 239, 231, 206, 0, 59, 241, 196, 60, 241, 196, 239, 115, 23, 221, 49, 252, + 119, 247, 57, 213, 94, 214, 35, 73, 252, 231, 217, 111, 252, 171, 241, + 172, 240, 167, 214, 35, 73, 239, 34, 251, 192, 93, 241, 184, 222, 89, 59, + 214, 26, 129, 229, 200, 247, 106, 218, 167, 129, 229, 200, 247, 106, 230, + 46, 207, 80, 53, 127, 208, 164, 53, 244, 13, 242, 11, 53, 244, 13, 227, + 226, 53, 233, 13, 242, 11, 23, 227, 226, 53, 227, 226, 23, 242, 11, 53, + 227, 226, 2, 213, 225, 53, 227, 226, 2, 213, 225, 23, 227, 226, 23, 242, + 11, 53, 79, 227, 226, 2, 213, 225, 53, 194, 227, 226, 2, 213, 225, 53, + 227, 109, 59, 247, 233, 227, 109, 60, 247, 233, 227, 109, 5, 59, 247, + 233, 227, 185, 93, 245, 73, 93, 209, 212, 221, 207, 93, 247, 167, 241, + 77, 209, 185, 225, 89, 248, 114, 222, 21, 232, 97, 208, 224, 248, 39, 60, + 226, 145, 229, 217, 216, 13, 216, 49, 219, 187, 216, 31, 214, 190, 250, + 149, 250, 115, 98, 231, 174, 59, 243, 252, 227, 221, 59, 243, 252, 231, + 106, 60, 243, 252, 227, 221, 60, 243, 252, 231, 106, 214, 196, 206, 253, + 214, 199, 213, 155, 250, 35, 247, 183, 219, 83, 60, 214, 195, 211, 228, + 247, 184, 23, 219, 83, 201, 59, 215, 153, 221, 45, 201, 60, 215, 153, + 221, 45, 59, 245, 157, 233, 69, 214, 107, 247, 54, 230, 93, 245, 100, + 248, 204, 222, 131, 221, 49, 248, 205, 214, 226, 239, 44, 2, 59, 247, 59, + 39, 247, 54, 230, 93, 248, 106, 224, 68, 243, 13, 252, 141, 222, 160, 47, + 207, 55, 211, 77, 60, 210, 105, 47, 207, 55, 211, 77, 59, 210, 105, 47, + 207, 55, 211, 77, 60, 47, 230, 94, 227, 77, 59, 47, 230, 94, 227, 77, + 243, 248, 214, 218, 53, 77, 59, 244, 7, 211, 51, 47, 247, 192, 243, 13, + 98, 217, 162, 242, 50, 245, 163, 233, 69, 59, 247, 234, 233, 69, 60, 214, + 107, 60, 211, 17, 218, 235, 47, 243, 12, 218, 235, 47, 243, 11, 251, 204, + 16, 33, 209, 189, 77, 247, 234, 2, 213, 225, 23, 118, 177, 52, 221, 139, + 218, 164, 233, 15, 221, 139, 230, 43, 233, 15, 221, 139, 233, 2, 221, + 139, 60, 247, 60, 222, 166, 215, 180, 215, 168, 215, 120, 248, 6, 248, + 185, 238, 243, 215, 11, 240, 168, 206, 253, 238, 39, 240, 168, 2, 239, + 104, 227, 206, 16, 33, 229, 222, 226, 128, 209, 239, 222, 166, 239, 222, + 241, 126, 241, 197, 233, 69, 238, 140, 242, 2, 217, 178, 49, 241, 125, + 247, 90, 214, 244, 237, 182, 214, 247, 221, 115, 2, 250, 149, 212, 92, + 232, 189, 250, 134, 93, 239, 64, 239, 233, 93, 241, 85, 220, 73, 247, 30, + 222, 166, 60, 214, 107, 59, 241, 197, 2, 194, 226, 247, 60, 213, 226, 60, + 217, 188, 217, 98, 209, 203, 249, 197, 217, 98, 60, 217, 98, 229, 92, + 249, 197, 217, 98, 59, 217, 98, 59, 77, 248, 81, 83, 212, 108, 229, 142, + 53, 212, 165, 243, 247, 252, 194, 243, 8, 219, 81, 241, 208, 219, 81, + 239, 107, 208, 212, 239, 107, 206, 219, 239, 107, 229, 92, 48, 221, 149, + 221, 149, 209, 203, 48, 221, 149, 59, 224, 227, 60, 224, 227, 248, 81, + 83, 77, 248, 81, 83, 226, 94, 206, 195, 77, 226, 94, 206, 195, 250, 146, + 206, 195, 77, 250, 146, 206, 195, 222, 89, 27, 247, 59, 77, 27, 247, 59, + 222, 142, 248, 129, 247, 59, 77, 222, 142, 248, 129, 247, 59, 7, 247, 59, + 215, 246, 59, 7, 247, 59, 222, 89, 7, 247, 59, 227, 223, 247, 59, 214, + 27, 73, 246, 71, 241, 125, 212, 124, 251, 209, 241, 125, 250, 147, 251, + 209, 77, 241, 125, 250, 147, 251, 209, 241, 125, 247, 179, 251, 209, 60, + 241, 125, 220, 203, 214, 26, 59, 241, 125, 220, 203, 214, 26, 214, 146, + 213, 233, 222, 89, 59, 214, 26, 39, 59, 214, 26, 222, 142, 248, 129, 60, + 214, 26, 60, 248, 129, 59, 214, 26, 222, 89, 60, 214, 26, 77, 222, 89, + 60, 214, 26, 221, 4, 214, 26, 215, 246, 59, 214, 26, 77, 251, 209, 222, + 142, 248, 129, 251, 209, 243, 88, 214, 119, 251, 209, 243, 88, 220, 203, + 60, 214, 26, 243, 88, 220, 203, 221, 4, 214, 26, 215, 10, 220, 203, 60, + 214, 26, 243, 88, 220, 203, 219, 35, 60, 214, 26, 77, 243, 88, 220, 203, + 219, 35, 60, 214, 26, 210, 127, 220, 203, 60, 214, 26, 215, 5, 220, 203, + 251, 209, 212, 124, 251, 209, 222, 142, 248, 129, 212, 124, 251, 209, 77, + 212, 124, 251, 209, 215, 10, 221, 103, 60, 23, 59, 241, 175, 60, 241, + 175, 59, 241, 175, 243, 88, 221, 103, 222, 89, 60, 241, 175, 39, 222, + 142, 248, 129, 243, 88, 220, 203, 214, 26, 77, 212, 124, 221, 4, 251, + 209, 214, 197, 211, 197, 211, 44, 214, 197, 77, 248, 62, 214, 197, 214, + 148, 77, 214, 148, 250, 147, 251, 209, 243, 88, 212, 124, 220, 104, 251, + 209, 77, 243, 88, 212, 124, 220, 104, 251, 209, 247, 60, 83, 215, 246, + 59, 247, 233, 170, 98, 247, 60, 83, 229, 92, 48, 243, 245, 59, 214, 107, + 209, 203, 48, 243, 245, 59, 214, 107, 229, 92, 48, 215, 246, 59, 214, + 107, 209, 203, 48, 215, 246, 59, 214, 107, 60, 219, 196, 141, 222, 111, + 59, 219, 196, 141, 222, 111, 59, 242, 168, 141, 222, 111, 60, 245, 157, + 226, 202, 59, 206, 195, 77, 242, 168, 141, 93, 147, 79, 134, 227, 109, + 79, 134, 77, 79, 134, 77, 215, 41, 201, 247, 156, 219, 180, 141, 222, + 111, 77, 215, 41, 247, 156, 219, 180, 141, 222, 111, 77, 50, 201, 247, + 156, 219, 180, 141, 222, 111, 77, 50, 247, 156, 219, 180, 141, 222, 111, + 77, 114, 215, 41, 247, 156, 219, 180, 141, 222, 111, 77, 114, 50, 247, + 156, 219, 180, 141, 222, 111, 247, 18, 214, 10, 221, 229, 3, 222, 111, + 77, 242, 168, 141, 222, 111, 77, 239, 61, 242, 168, 141, 222, 111, 77, + 60, 239, 60, 218, 97, 77, 60, 239, 61, 249, 85, 241, 176, 239, 60, 218, + 97, 241, 176, 239, 61, 249, 85, 227, 109, 47, 221, 217, 222, 111, 227, + 109, 48, 221, 217, 222, 111, 227, 109, 241, 185, 47, 221, 217, 222, 111, + 227, 109, 241, 185, 48, 221, 217, 222, 111, 227, 109, 230, 41, 252, 109, + 249, 134, 222, 111, 227, 109, 218, 162, 252, 109, 249, 134, 222, 111, 77, + 230, 41, 252, 109, 219, 180, 141, 222, 111, 77, 218, 162, 252, 109, 219, + 180, 141, 222, 111, 77, 230, 41, 252, 109, 249, 134, 222, 111, 77, 218, + 162, 252, 109, 249, 134, 222, 111, 147, 47, 211, 93, 215, 204, 249, 134, + 222, 111, 147, 48, 211, 93, 215, 204, 249, 134, 222, 111, 227, 109, 47, + 247, 26, 249, 134, 222, 111, 227, 109, 48, 247, 26, 249, 134, 222, 111, + 245, 111, 170, 39, 18, 102, 245, 111, 170, 39, 18, 105, 245, 111, 170, + 39, 18, 142, 245, 111, 170, 39, 18, 139, 245, 111, 170, 39, 18, 168, 245, + 111, 170, 39, 18, 184, 245, 111, 170, 39, 18, 195, 245, 111, 170, 39, 18, + 193, 245, 111, 170, 39, 18, 200, 245, 111, 170, 39, 43, 212, 98, 245, + 111, 39, 38, 18, 102, 245, 111, 39, 38, 18, 105, 245, 111, 39, 38, 18, + 142, 245, 111, 39, 38, 18, 139, 245, 111, 39, 38, 18, 168, 245, 111, 39, + 38, 18, 184, 245, 111, 39, 38, 18, 195, 245, 111, 39, 38, 18, 193, 245, + 111, 39, 38, 18, 200, 245, 111, 39, 38, 43, 212, 98, 245, 111, 170, 39, + 38, 18, 102, 245, 111, 170, 39, 38, 18, 105, 245, 111, 170, 39, 38, 18, + 142, 245, 111, 170, 39, 38, 18, 139, 245, 111, 170, 39, 38, 18, 168, 245, + 111, 170, 39, 38, 18, 184, 245, 111, 170, 39, 38, 18, 195, 245, 111, 170, + 39, 38, 18, 193, 245, 111, 170, 39, 38, 18, 200, 245, 111, 170, 39, 38, + 43, 212, 98, 77, 207, 16, 86, 45, 77, 101, 53, 77, 226, 202, 53, 77, 245, + 75, 53, 77, 188, 243, 117, 45, 77, 86, 45, 77, 143, 243, 117, 45, 244, 1, + 220, 205, 86, 45, 77, 218, 94, 86, 45, 211, 50, 86, 45, 77, 211, 50, 86, + 45, 246, 77, 211, 50, 86, 45, 77, 246, 77, 211, 50, 86, 45, 60, 86, 45, + 211, 238, 211, 100, 86, 251, 243, 211, 238, 249, 152, 86, 251, 243, 60, + 86, 251, 243, 77, 60, 247, 18, 173, 23, 86, 45, 77, 60, 247, 18, 167, 23, + 86, 45, 214, 104, 60, 86, 45, 77, 247, 139, 60, 86, 45, 218, 161, 59, 86, + 45, 230, 40, 59, 86, 45, 250, 175, 215, 246, 59, 86, 45, 241, 96, 215, + 246, 59, 86, 45, 77, 229, 92, 218, 160, 59, 86, 45, 77, 209, 203, 218, + 160, 59, 86, 45, 224, 39, 229, 92, 218, 160, 59, 86, 45, 247, 26, 229, + 111, 224, 39, 209, 203, 218, 160, 59, 86, 45, 39, 77, 59, 86, 45, 207, + 22, 86, 45, 249, 201, 188, 243, 117, 45, 249, 201, 86, 45, 249, 201, 143, + 243, 117, 45, 77, 249, 201, 188, 243, 117, 45, 77, 249, 201, 86, 45, 77, + 249, 201, 143, 243, 117, 45, 212, 126, 86, 45, 77, 212, 125, 86, 45, 207, + 46, 86, 45, 77, 207, 46, 86, 45, 222, 137, 86, 45, 50, 247, 26, 229, 111, + 129, 245, 121, 252, 108, 59, 211, 52, 247, 119, 5, 59, 211, 51, 221, 118, + 222, 142, 213, 181, 222, 142, 213, 137, 47, 218, 0, 250, 164, 245, 233, + 48, 218, 0, 250, 164, 245, 233, 222, 123, 2, 67, 233, 25, 218, 225, 214, + 181, 220, 138, 213, 181, 213, 138, 220, 138, 214, 180, 79, 250, 129, 2, + 194, 91, 11, 218, 142, 245, 162, 152, 245, 74, 11, 242, 50, 245, 162, 98, + 229, 134, 252, 117, 98, 229, 134, 222, 122, 59, 245, 157, 2, 248, 127, + 245, 23, 23, 2, 245, 23, 243, 61, 73, 222, 135, 209, 196, 229, 92, 48, + 247, 92, 2, 245, 23, 209, 203, 47, 247, 92, 2, 245, 23, 47, 222, 91, 232, + 120, 48, 222, 91, 232, 120, 241, 82, 222, 91, 232, 120, 230, 86, 120, + 212, 201, 230, 86, 130, 212, 201, 47, 23, 48, 50, 210, 143, 47, 23, 48, + 212, 201, 47, 226, 97, 152, 48, 212, 201, 152, 47, 212, 201, 120, 212, + 202, 2, 247, 234, 52, 229, 89, 245, 80, 249, 46, 194, 218, 42, 59, 247, + 138, 245, 156, 59, 247, 138, 245, 157, 2, 92, 211, 207, 59, 247, 138, + 245, 157, 2, 86, 211, 207, 59, 49, 2, 92, 211, 207, 59, 49, 2, 86, 211, + 207, 11, 47, 59, 49, 145, 11, 48, 59, 49, 145, 11, 47, 252, 109, 145, 11, + 48, 252, 109, 145, 11, 47, 50, 252, 109, 145, 11, 48, 50, 252, 109, 145, + 11, 47, 59, 211, 93, 215, 204, 145, 11, 48, 59, 211, 93, 215, 204, 145, + 11, 47, 241, 185, 221, 216, 11, 48, 241, 185, 221, 216, 167, 219, 207, + 45, 173, 219, 207, 45, 252, 87, 240, 206, 247, 234, 45, 247, 194, 240, + 206, 247, 234, 45, 48, 51, 2, 39, 220, 218, 152, 92, 45, 152, 86, 45, + 152, 47, 48, 45, 152, 92, 50, 45, 152, 86, 50, 45, 152, 47, 48, 50, 45, + 152, 92, 51, 241, 98, 134, 152, 86, 51, 241, 98, 134, 152, 92, 50, 51, + 241, 98, 134, 152, 86, 50, 51, 241, 98, 134, 152, 86, 214, 103, 45, 56, + 57, 249, 195, 56, 57, 245, 20, 56, 57, 244, 148, 56, 57, 245, 19, 56, 57, + 244, 84, 56, 57, 244, 211, 56, 57, 244, 147, 56, 57, 245, 18, 56, 57, + 244, 52, 56, 57, 244, 179, 56, 57, 244, 115, 56, 57, 244, 242, 56, 57, + 244, 83, 56, 57, 244, 210, 56, 57, 244, 146, 56, 57, 245, 17, 56, 57, + 244, 36, 56, 57, 244, 163, 56, 57, 244, 99, 56, 57, 244, 226, 56, 57, + 244, 67, 56, 57, 244, 194, 56, 57, 244, 130, 56, 57, 245, 1, 56, 57, 244, + 51, 56, 57, 244, 178, 56, 57, 244, 114, 56, 57, 244, 241, 56, 57, 244, + 82, 56, 57, 244, 209, 56, 57, 244, 145, 56, 57, 245, 16, 56, 57, 244, 28, + 56, 57, 244, 155, 56, 57, 244, 91, 56, 57, 244, 218, 56, 57, 244, 59, 56, + 57, 244, 186, 56, 57, 244, 122, 56, 57, 244, 249, 56, 57, 244, 43, 56, + 57, 244, 170, 56, 57, 244, 106, 56, 57, 244, 233, 56, 57, 244, 74, 56, + 57, 244, 201, 56, 57, 244, 137, 56, 57, 245, 8, 56, 57, 244, 35, 56, 57, + 244, 162, 56, 57, 244, 98, 56, 57, 244, 225, 56, 57, 244, 66, 56, 57, + 244, 193, 56, 57, 244, 129, 56, 57, 245, 0, 56, 57, 244, 50, 56, 57, 244, + 177, 56, 57, 244, 113, 56, 57, 244, 240, 56, 57, 244, 81, 56, 57, 244, + 208, 56, 57, 244, 144, 56, 57, 245, 15, 56, 57, 244, 24, 56, 57, 244, + 151, 56, 57, 244, 87, 56, 57, 244, 214, 56, 57, 244, 55, 56, 57, 244, + 182, 56, 57, 244, 118, 56, 57, 244, 245, 56, 57, 244, 39, 56, 57, 244, + 166, 56, 57, 244, 102, 56, 57, 244, 229, 56, 57, 244, 70, 56, 57, 244, + 197, 56, 57, 244, 133, 56, 57, 245, 4, 56, 57, 244, 31, 56, 57, 244, 158, + 56, 57, 244, 94, 56, 57, 244, 221, 56, 57, 244, 62, 56, 57, 244, 189, 56, + 57, 244, 125, 56, 57, 244, 252, 56, 57, 244, 46, 56, 57, 244, 173, 56, + 57, 244, 109, 56, 57, 244, 236, 56, 57, 244, 77, 56, 57, 244, 204, 56, + 57, 244, 140, 56, 57, 245, 11, 56, 57, 244, 27, 56, 57, 244, 154, 56, 57, + 244, 90, 56, 57, 244, 217, 56, 57, 244, 58, 56, 57, 244, 185, 56, 57, + 244, 121, 56, 57, 244, 248, 56, 57, 244, 42, 56, 57, 244, 169, 56, 57, + 244, 105, 56, 57, 244, 232, 56, 57, 244, 73, 56, 57, 244, 200, 56, 57, + 244, 136, 56, 57, 245, 7, 56, 57, 244, 34, 56, 57, 244, 161, 56, 57, 244, + 97, 56, 57, 244, 224, 56, 57, 244, 65, 56, 57, 244, 192, 56, 57, 244, + 128, 56, 57, 244, 255, 56, 57, 244, 49, 56, 57, 244, 176, 56, 57, 244, + 112, 56, 57, 244, 239, 56, 57, 244, 80, 56, 57, 244, 207, 56, 57, 244, + 143, 56, 57, 245, 14, 56, 57, 244, 22, 56, 57, 244, 149, 56, 57, 244, 85, + 56, 57, 244, 212, 56, 57, 244, 53, 56, 57, 244, 180, 56, 57, 244, 116, + 56, 57, 244, 243, 56, 57, 244, 37, 56, 57, 244, 164, 56, 57, 244, 100, + 56, 57, 244, 227, 56, 57, 244, 68, 56, 57, 244, 195, 56, 57, 244, 131, + 56, 57, 245, 2, 56, 57, 244, 29, 56, 57, 244, 156, 56, 57, 244, 92, 56, + 57, 244, 219, 56, 57, 244, 60, 56, 57, 244, 187, 56, 57, 244, 123, 56, + 57, 244, 250, 56, 57, 244, 44, 56, 57, 244, 171, 56, 57, 244, 107, 56, + 57, 244, 234, 56, 57, 244, 75, 56, 57, 244, 202, 56, 57, 244, 138, 56, + 57, 245, 9, 56, 57, 244, 25, 56, 57, 244, 152, 56, 57, 244, 88, 56, 57, + 244, 215, 56, 57, 244, 56, 56, 57, 244, 183, 56, 57, 244, 119, 56, 57, + 244, 246, 56, 57, 244, 40, 56, 57, 244, 167, 56, 57, 244, 103, 56, 57, + 244, 230, 56, 57, 244, 71, 56, 57, 244, 198, 56, 57, 244, 134, 56, 57, + 245, 5, 56, 57, 244, 32, 56, 57, 244, 159, 56, 57, 244, 95, 56, 57, 244, + 222, 56, 57, 244, 63, 56, 57, 244, 190, 56, 57, 244, 126, 56, 57, 244, + 253, 56, 57, 244, 47, 56, 57, 244, 174, 56, 57, 244, 110, 56, 57, 244, + 237, 56, 57, 244, 78, 56, 57, 244, 205, 56, 57, 244, 141, 56, 57, 245, + 12, 56, 57, 244, 23, 56, 57, 244, 150, 56, 57, 244, 86, 56, 57, 244, 213, + 56, 57, 244, 54, 56, 57, 244, 181, 56, 57, 244, 117, 56, 57, 244, 244, + 56, 57, 244, 38, 56, 57, 244, 165, 56, 57, 244, 101, 56, 57, 244, 228, + 56, 57, 244, 69, 56, 57, 244, 196, 56, 57, 244, 132, 56, 57, 245, 3, 56, + 57, 244, 30, 56, 57, 244, 157, 56, 57, 244, 93, 56, 57, 244, 220, 56, 57, + 244, 61, 56, 57, 244, 188, 56, 57, 244, 124, 56, 57, 244, 251, 56, 57, + 244, 45, 56, 57, 244, 172, 56, 57, 244, 108, 56, 57, 244, 235, 56, 57, + 244, 76, 56, 57, 244, 203, 56, 57, 244, 139, 56, 57, 245, 10, 56, 57, + 244, 26, 56, 57, 244, 153, 56, 57, 244, 89, 56, 57, 244, 216, 56, 57, + 244, 57, 56, 57, 244, 184, 56, 57, 244, 120, 56, 57, 244, 247, 56, 57, + 244, 41, 56, 57, 244, 168, 56, 57, 244, 104, 56, 57, 244, 231, 56, 57, + 244, 72, 56, 57, 244, 199, 56, 57, 244, 135, 56, 57, 245, 6, 56, 57, 244, + 33, 56, 57, 244, 160, 56, 57, 244, 96, 56, 57, 244, 223, 56, 57, 244, 64, + 56, 57, 244, 191, 56, 57, 244, 127, 56, 57, 244, 254, 56, 57, 244, 48, + 56, 57, 244, 175, 56, 57, 244, 111, 56, 57, 244, 238, 56, 57, 244, 79, + 56, 57, 244, 206, 56, 57, 244, 142, 56, 57, 245, 13, 86, 210, 108, 51, 2, + 79, 91, 86, 210, 108, 51, 2, 50, 79, 91, 92, 50, 51, 2, 79, 91, 86, 50, + 51, 2, 79, 91, 47, 48, 50, 51, 2, 79, 91, 86, 210, 108, 51, 241, 98, 134, + 92, 50, 51, 241, 98, 134, 86, 50, 51, 241, 98, 134, 173, 51, 2, 194, 91, + 167, 51, 2, 194, 91, 167, 211, 36, 45, 173, 211, 36, 45, 92, 50, 246, 79, + 45, 86, 50, 246, 79, 45, 92, 211, 36, 246, 79, 45, 86, 211, 36, 246, 79, + 45, 86, 210, 108, 211, 36, 246, 79, 45, 86, 51, 2, 244, 21, 214, 9, 167, + 51, 211, 130, 134, 173, 51, 211, 130, 134, 86, 51, 2, 212, 192, 2, 79, + 91, 86, 51, 2, 212, 192, 2, 50, 79, 91, 86, 210, 108, 51, 2, 212, 191, + 86, 210, 108, 51, 2, 212, 192, 2, 79, 91, 86, 210, 108, 51, 2, 212, 192, + 2, 50, 79, 91, 92, 251, 245, 86, 251, 245, 92, 50, 251, 245, 86, 50, 251, + 245, 92, 51, 211, 130, 60, 245, 156, 86, 51, 211, 130, 60, 245, 156, 92, + 51, 241, 98, 250, 129, 211, 130, 60, 245, 156, 86, 51, 241, 98, 250, 129, + 211, 130, 60, 245, 156, 143, 207, 36, 23, 188, 243, 117, 45, 143, 243, + 117, 23, 188, 207, 36, 45, 143, 207, 36, 51, 2, 109, 143, 243, 117, 51, + 2, 109, 188, 243, 117, 51, 2, 109, 188, 207, 36, 51, 2, 109, 143, 207, + 36, 51, 23, 143, 243, 117, 45, 143, 243, 117, 51, 23, 188, 243, 117, 45, + 188, 243, 117, 51, 23, 188, 207, 36, 45, 188, 207, 36, 51, 23, 143, 207, + 36, 45, 218, 142, 245, 163, 247, 54, 242, 50, 245, 162, 242, 50, 245, + 163, 247, 54, 218, 142, 245, 162, 188, 243, 117, 51, 247, 54, 143, 243, + 117, 45, 143, 243, 117, 51, 247, 54, 188, 243, 117, 45, 242, 50, 245, + 163, 247, 54, 143, 243, 117, 45, 218, 142, 245, 163, 247, 54, 188, 243, + 117, 45, 143, 243, 117, 51, 247, 54, 143, 207, 36, 45, 143, 207, 36, 51, + 247, 54, 143, 243, 117, 45, 207, 65, 51, 220, 201, 245, 102, 218, 167, + 51, 220, 201, 86, 212, 33, 247, 17, 209, 196, 51, 220, 201, 86, 212, 33, + 247, 17, 244, 6, 51, 220, 201, 173, 212, 33, 247, 17, 230, 36, 51, 220, + 201, 173, 212, 33, 247, 17, 218, 156, 218, 159, 252, 22, 247, 194, 45, + 230, 39, 252, 22, 252, 87, 45, 211, 102, 252, 22, 252, 87, 45, 249, 154, + 252, 22, 252, 87, 45, 211, 102, 252, 22, 247, 194, 51, 2, 226, 201, 211, + 102, 252, 22, 252, 87, 51, 2, 220, 218, 229, 92, 48, 216, 54, 247, 194, + 45, 229, 92, 47, 216, 54, 252, 87, 45, 252, 87, 247, 192, 247, 234, 45, + 247, 194, 247, 192, 247, 234, 45, 86, 51, 84, 215, 144, 92, 45, 92, 51, + 84, 215, 144, 86, 45, 215, 144, 86, 51, 84, 92, 45, 86, 51, 2, 101, 55, + 92, 51, 2, 101, 55, 86, 51, 211, 233, 206, 195, 47, 48, 51, 211, 233, 5, + 247, 233, 167, 210, 108, 51, 241, 98, 5, 247, 233, 47, 138, 120, 48, 138, + 130, 239, 89, 47, 138, 130, 48, 138, 120, 239, 89, 120, 138, 48, 130, + 138, 47, 239, 89, 120, 138, 47, 130, 138, 48, 239, 89, 47, 138, 120, 48, + 138, 120, 239, 89, 120, 138, 48, 130, 138, 48, 239, 89, 47, 138, 130, 48, + 138, 130, 239, 89, 120, 138, 47, 130, 138, 47, 239, 89, 92, 239, 90, 2, + 138, 120, 211, 130, 134, 86, 239, 90, 2, 138, 120, 211, 130, 134, 167, + 239, 90, 2, 138, 48, 211, 130, 134, 173, 239, 90, 2, 138, 48, 211, 130, + 134, 92, 239, 90, 2, 138, 130, 211, 130, 134, 86, 239, 90, 2, 138, 130, + 211, 130, 134, 167, 239, 90, 2, 138, 47, 211, 130, 134, 173, 239, 90, 2, + 138, 47, 211, 130, 134, 92, 239, 90, 2, 138, 120, 241, 98, 134, 86, 239, + 90, 2, 138, 120, 241, 98, 134, 167, 239, 90, 2, 138, 48, 241, 98, 134, + 173, 239, 90, 2, 138, 48, 241, 98, 134, 92, 239, 90, 2, 138, 130, 241, + 98, 134, 86, 239, 90, 2, 138, 130, 241, 98, 134, 167, 239, 90, 2, 138, + 47, 241, 98, 134, 173, 239, 90, 2, 138, 47, 241, 98, 134, 92, 239, 90, 2, + 138, 120, 84, 92, 239, 90, 2, 138, 244, 8, 167, 239, 90, 2, 138, 47, 250, + 12, 167, 239, 90, 2, 138, 218, 167, 86, 239, 90, 2, 138, 120, 84, 86, + 239, 90, 2, 138, 244, 8, 173, 239, 90, 2, 138, 47, 250, 12, 173, 239, 90, + 2, 138, 218, 167, 92, 239, 90, 2, 138, 120, 84, 86, 239, 90, 2, 138, 209, + 206, 92, 239, 90, 2, 138, 130, 84, 86, 239, 90, 2, 138, 244, 8, 86, 239, + 90, 2, 138, 120, 84, 92, 239, 90, 2, 138, 209, 206, 86, 239, 90, 2, 138, + 130, 84, 92, 239, 90, 2, 138, 244, 8, 92, 239, 90, 2, 138, 120, 84, 152, + 246, 78, 92, 239, 90, 2, 138, 130, 250, 26, 152, 246, 78, 86, 239, 90, 2, + 138, 120, 84, 152, 246, 78, 86, 239, 90, 2, 138, 130, 250, 26, 152, 246, + 78, 167, 239, 90, 2, 138, 47, 250, 12, 173, 239, 90, 2, 138, 218, 167, + 173, 239, 90, 2, 138, 47, 250, 12, 167, 239, 90, 2, 138, 218, 167, 48, + 50, 51, 2, 218, 93, 239, 68, 242, 242, 3, 84, 86, 45, 211, 181, 222, 133, + 84, 86, 45, 92, 51, 84, 211, 181, 222, 132, 86, 51, 84, 211, 181, 222, + 132, 86, 51, 84, 252, 149, 146, 124, 230, 10, 84, 92, 45, 92, 51, 211, + 233, 230, 9, 239, 230, 84, 86, 45, 213, 182, 84, 86, 45, 92, 51, 211, + 233, 213, 181, 213, 138, 84, 92, 45, 47, 241, 214, 212, 191, 48, 241, + 214, 212, 191, 120, 241, 214, 212, 191, 130, 241, 214, 212, 191, 211, 36, + 79, 250, 129, 245, 233, 205, 160, 224, 41, 214, 116, 205, 160, 224, 41, + 210, 95, 247, 162, 47, 59, 247, 26, 145, 48, 59, 247, 26, 145, 47, 59, + 221, 216, 48, 59, 221, 216, 205, 160, 224, 41, 47, 233, 84, 145, 205, + 160, 224, 41, 48, 233, 84, 145, 205, 160, 224, 41, 47, 249, 223, 145, + 205, 160, 224, 41, 48, 249, 223, 145, 47, 49, 249, 134, 2, 209, 226, 48, + 49, 249, 134, 2, 209, 226, 47, 49, 249, 134, 2, 211, 208, 233, 69, 211, + 102, 247, 91, 48, 49, 249, 134, 2, 211, 208, 233, 69, 249, 154, 247, 91, + 47, 49, 249, 134, 2, 211, 208, 233, 69, 249, 154, 247, 91, 48, 49, 249, + 134, 2, 211, 208, 233, 69, 211, 102, 247, 91, 47, 252, 109, 249, 134, 2, + 245, 23, 48, 252, 109, 249, 134, 2, 245, 23, 47, 252, 22, 230, 10, 145, + 48, 252, 22, 239, 230, 145, 50, 47, 252, 22, 239, 230, 145, 50, 48, 252, + 22, 230, 10, 145, 47, 60, 211, 93, 215, 204, 145, 48, 60, 211, 93, 215, + 204, 145, 244, 21, 242, 8, 79, 205, 31, 229, 205, 227, 116, 252, 109, + 222, 135, 230, 46, 48, 252, 109, 209, 53, 2, 214, 107, 227, 116, 48, 252, + 109, 2, 245, 23, 252, 109, 2, 218, 1, 233, 25, 253, 9, 252, 108, 214, + 133, 252, 109, 222, 135, 230, 46, 214, 133, 252, 109, 222, 135, 209, 206, + 201, 252, 108, 218, 224, 252, 108, 252, 109, 2, 209, 226, 218, 224, 252, + 109, 2, 209, 226, 222, 222, 252, 109, 222, 135, 209, 206, 222, 222, 252, + 109, 222, 135, 244, 8, 227, 116, 252, 109, 2, 222, 142, 252, 0, 243, 31, + 233, 69, 51, 220, 201, 120, 23, 218, 167, 227, 116, 252, 109, 2, 222, + 142, 252, 0, 243, 31, 233, 69, 51, 220, 201, 120, 23, 230, 46, 227, 116, + 252, 109, 2, 222, 142, 252, 0, 243, 31, 233, 69, 51, 220, 201, 130, 23, + 218, 167, 227, 116, 252, 109, 2, 222, 142, 252, 0, 243, 31, 233, 69, 51, + 220, 201, 130, 23, 230, 46, 227, 116, 252, 109, 2, 222, 142, 252, 0, 243, + 31, 233, 69, 51, 220, 201, 48, 23, 209, 206, 227, 116, 252, 109, 2, 222, + 142, 252, 0, 243, 31, 233, 69, 51, 220, 201, 47, 23, 209, 206, 227, 116, + 252, 109, 2, 222, 142, 252, 0, 243, 31, 233, 69, 51, 220, 201, 48, 23, + 244, 8, 227, 116, 252, 109, 2, 222, 142, 252, 0, 243, 31, 233, 69, 51, + 220, 201, 47, 23, 244, 8, 218, 224, 243, 43, 216, 28, 243, 43, 216, 29, + 2, 222, 86, 243, 43, 216, 29, 2, 5, 247, 234, 52, 243, 43, 216, 29, 2, + 48, 51, 52, 243, 43, 216, 29, 2, 47, 51, 52, 247, 234, 2, 194, 134, 39, + 79, 134, 39, 221, 221, 39, 218, 225, 214, 180, 39, 221, 118, 247, 234, + 245, 80, 249, 46, 194, 250, 129, 23, 211, 102, 160, 245, 80, 249, 46, 79, + 134, 247, 234, 2, 213, 140, 206, 195, 39, 252, 85, 245, 75, 53, 120, 51, + 211, 233, 247, 233, 39, 59, 249, 85, 39, 249, 85, 39, 230, 9, 39, 239, + 229, 247, 234, 2, 5, 247, 234, 211, 130, 212, 42, 218, 167, 247, 234, 2, + 118, 194, 213, 213, 211, 130, 212, 42, 218, 167, 98, 218, 142, 245, 163, + 214, 235, 98, 242, 50, 245, 163, 214, 235, 98, 251, 209, 98, 5, 247, 233, + 98, 214, 107, 118, 232, 119, 214, 105, 211, 52, 2, 67, 52, 211, 52, 2, + 209, 226, 218, 1, 233, 69, 211, 51, 211, 52, 2, 216, 35, 251, 200, 249, + 153, 48, 211, 52, 84, 47, 211, 51, 47, 211, 52, 250, 12, 79, 134, 79, + 250, 129, 250, 12, 48, 211, 51, 249, 142, 2, 47, 160, 249, 202, 249, 142, + 2, 48, 160, 249, 202, 60, 249, 141, 29, 2, 47, 160, 249, 202, 29, 2, 48, + 160, 249, 202, 59, 238, 56, 60, 238, 56, 47, 207, 14, 242, 8, 48, 207, + 14, 242, 8, 47, 50, 207, 14, 242, 8, 48, 50, 207, 14, 242, 8, 233, 61, + 233, 45, 211, 204, 131, 233, 45, 233, 46, 225, 105, 2, 79, 134, 244, 15, + 226, 97, 49, 2, 247, 112, 222, 90, 233, 58, 251, 231, 215, 110, 220, 115, + 242, 242, 3, 23, 214, 237, 221, 221, 242, 242, 3, 23, 214, 237, 221, 222, + 2, 211, 181, 52, 237, 173, 211, 130, 23, 214, 237, 221, 221, 240, 28, + 214, 25, 212, 30, 244, 7, 211, 52, 2, 47, 160, 249, 202, 244, 7, 211, 52, + 2, 48, 160, 249, 202, 60, 245, 157, 2, 130, 45, 60, 229, 88, 59, 247, + 234, 2, 130, 45, 60, 247, 234, 2, 130, 45, 242, 228, 59, 214, 107, 242, + 228, 60, 214, 107, 242, 228, 59, 245, 156, 242, 228, 60, 245, 156, 242, + 228, 59, 247, 233, 242, 228, 60, 247, 233, 218, 41, 218, 225, 214, 181, + 222, 132, 214, 181, 2, 222, 86, 218, 225, 214, 181, 2, 194, 91, 249, 231, + 214, 180, 249, 231, 218, 225, 214, 180, 50, 220, 218, 211, 36, 220, 218, + 230, 41, 247, 18, 252, 109, 145, 218, 162, 247, 18, 252, 109, 145, 211, + 168, 226, 199, 226, 32, 39, 67, 222, 132, 226, 32, 39, 101, 222, 132, + 226, 32, 39, 29, 222, 132, 226, 32, 209, 219, 222, 133, 2, 245, 23, 226, + 32, 209, 219, 222, 133, 2, 220, 218, 226, 32, 49, 233, 8, 222, 132, 226, + 32, 49, 209, 219, 222, 132, 118, 229, 134, 23, 222, 132, 118, 229, 134, + 222, 123, 222, 132, 226, 32, 29, 222, 132, 226, 172, 118, 213, 160, 213, + 158, 2, 233, 21, 219, 207, 233, 22, 222, 132, 241, 222, 221, 211, 233, + 21, 233, 22, 2, 50, 91, 233, 22, 251, 165, 2, 214, 235, 247, 229, 241, + 79, 252, 87, 233, 19, 229, 206, 233, 20, 2, 219, 36, 221, 192, 251, 253, + 220, 195, 229, 206, 233, 20, 2, 216, 54, 221, 192, 251, 253, 220, 195, + 229, 206, 233, 20, 224, 43, 233, 63, 212, 42, 220, 195, 233, 22, 251, + 253, 32, 220, 205, 222, 132, 219, 201, 233, 22, 222, 132, 233, 22, 2, 92, + 51, 2, 109, 233, 22, 2, 29, 53, 233, 22, 2, 233, 7, 233, 22, 2, 209, 218, + 233, 22, 2, 222, 86, 233, 22, 2, 209, 226, 232, 120, 230, 86, 47, 211, + 52, 222, 132, 205, 160, 224, 41, 217, 106, 247, 145, 205, 160, 224, 41, + 217, 106, 221, 0, 205, 160, 224, 41, 217, 106, 220, 110, 101, 3, 2, 5, + 247, 234, 52, 101, 3, 2, 247, 228, 253, 22, 52, 101, 3, 2, 211, 181, 52, + 101, 3, 2, 67, 55, 101, 3, 2, 211, 181, 55, 101, 3, 2, 213, 183, 105, + 101, 3, 2, 60, 211, 51, 226, 202, 3, 2, 247, 156, 52, 226, 202, 3, 2, 67, + 55, 226, 202, 3, 2, 242, 50, 245, 21, 226, 202, 3, 2, 218, 142, 245, 21, + 101, 3, 233, 69, 47, 160, 247, 233, 101, 3, 233, 69, 48, 160, 247, 233, + 209, 38, 222, 123, 247, 60, 220, 115, 226, 94, 3, 2, 67, 52, 226, 94, 3, + 2, 209, 226, 216, 51, 220, 116, 2, 249, 154, 247, 191, 214, 213, 220, + 115, 226, 94, 3, 233, 69, 47, 160, 247, 233, 226, 94, 3, 233, 69, 48, + 160, 247, 233, 39, 226, 94, 3, 2, 247, 228, 253, 21, 226, 94, 3, 233, 69, + 50, 247, 233, 39, 245, 75, 53, 101, 3, 233, 69, 211, 51, 226, 202, 3, + 233, 69, 211, 51, 226, 94, 3, 233, 69, 211, 51, 233, 16, 220, 115, 218, + 157, 233, 16, 220, 115, 205, 160, 224, 41, 219, 10, 247, 145, 252, 134, + 222, 123, 247, 96, 233, 8, 2, 245, 23, 209, 219, 2, 226, 202, 53, 209, + 219, 2, 222, 86, 233, 8, 2, 222, 86, 233, 8, 2, 229, 134, 252, 117, 209, + 219, 2, 229, 134, 222, 122, 209, 219, 84, 233, 7, 233, 8, 84, 209, 218, + 209, 219, 84, 250, 129, 84, 233, 7, 233, 8, 84, 250, 129, 84, 209, 218, + 209, 219, 250, 12, 23, 232, 119, 2, 209, 218, 233, 8, 250, 12, 23, 232, + 119, 2, 233, 7, 247, 192, 209, 219, 2, 216, 34, 247, 192, 233, 8, 2, 216, + 34, 50, 49, 233, 7, 50, 49, 209, 218, 247, 192, 209, 219, 2, 216, 35, 23, + 214, 213, 220, 115, 229, 134, 23, 2, 67, 52, 229, 134, 222, 123, 2, 67, + 52, 50, 229, 134, 252, 117, 50, 229, 134, 222, 122, 118, 233, 9, 229, + 134, 252, 117, 118, 233, 9, 229, 134, 222, 122, 214, 221, 230, 86, 222, + 122, 214, 221, 230, 86, 252, 117, 229, 134, 222, 123, 222, 83, 229, 134, + 252, 117, 229, 134, 23, 2, 226, 247, 214, 9, 229, 134, 222, 123, 2, 226, + 247, 214, 9, 229, 134, 23, 2, 194, 246, 78, 229, 134, 222, 123, 2, 194, + 246, 78, 229, 134, 23, 2, 50, 222, 86, 229, 134, 23, 2, 209, 226, 229, + 134, 23, 2, 50, 209, 226, 5, 209, 35, 2, 209, 226, 229, 134, 222, 123, 2, + 50, 222, 86, 229, 134, 222, 123, 2, 50, 209, 226, 205, 160, 224, 41, 245, + 32, 252, 77, 205, 160, 224, 41, 219, 72, 252, 77, 242, 242, 3, 2, 67, 55, + 237, 173, 2, 67, 52, 211, 36, 194, 250, 129, 2, 50, 79, 91, 211, 36, 194, + 250, 129, 2, 211, 36, 79, 91, 211, 181, 222, 133, 2, 67, 52, 211, 181, + 222, 133, 2, 218, 142, 245, 21, 215, 48, 226, 202, 215, 47, 247, 132, 2, + 67, 52, 242, 242, 2, 251, 209, 252, 149, 146, 211, 130, 2, 247, 228, 253, + 21, 252, 44, 146, 222, 123, 146, 124, 242, 242, 3, 84, 101, 53, 101, 3, + 84, 242, 242, 53, 242, 242, 3, 84, 211, 181, 222, 132, 50, 247, 163, 242, + 243, 118, 247, 127, 242, 242, 215, 62, 129, 247, 127, 242, 242, 215, 62, + 242, 242, 3, 2, 118, 177, 84, 23, 118, 177, 55, 242, 237, 2, 241, 125, + 177, 52, 230, 10, 2, 247, 234, 233, 25, 239, 230, 2, 247, 234, 233, 25, + 230, 10, 2, 219, 196, 141, 52, 239, 230, 2, 219, 196, 141, 52, 230, 10, + 222, 123, 214, 237, 146, 124, 239, 230, 222, 123, 214, 237, 146, 124, + 230, 10, 222, 123, 214, 237, 146, 211, 130, 2, 67, 233, 25, 239, 230, + 222, 123, 214, 237, 146, 211, 130, 2, 67, 233, 25, 230, 10, 222, 123, + 214, 237, 146, 211, 130, 2, 67, 52, 239, 230, 222, 123, 214, 237, 146, + 211, 130, 2, 67, 52, 230, 10, 222, 123, 214, 237, 146, 211, 130, 2, 67, + 84, 218, 167, 239, 230, 222, 123, 214, 237, 146, 211, 130, 2, 67, 84, + 230, 46, 230, 10, 222, 123, 252, 45, 239, 230, 222, 123, 252, 45, 230, + 10, 23, 215, 39, 224, 43, 146, 124, 239, 230, 23, 215, 39, 224, 43, 146, + 124, 230, 10, 23, 224, 43, 252, 45, 239, 230, 23, 224, 43, 252, 45, 230, + 10, 84, 244, 14, 146, 84, 239, 229, 239, 230, 84, 244, 14, 146, 84, 230, + 9, 230, 10, 84, 215, 48, 222, 123, 242, 243, 239, 230, 84, 215, 48, 222, + 123, 242, 243, 230, 10, 84, 215, 48, 84, 239, 229, 239, 230, 84, 215, 48, + 84, 230, 9, 230, 10, 84, 239, 230, 84, 244, 14, 242, 243, 239, 230, 84, + 230, 10, 84, 244, 14, 242, 243, 230, 10, 84, 214, 237, 146, 84, 239, 230, + 84, 214, 237, 242, 243, 239, 230, 84, 214, 237, 146, 84, 230, 10, 84, + 214, 237, 242, 243, 214, 237, 146, 211, 130, 222, 123, 230, 9, 214, 237, + 146, 211, 130, 222, 123, 239, 229, 214, 237, 146, 211, 130, 222, 123, + 230, 10, 2, 67, 233, 25, 214, 237, 146, 211, 130, 222, 123, 239, 230, 2, + 67, 233, 25, 244, 14, 146, 211, 130, 222, 123, 230, 9, 244, 14, 146, 211, + 130, 222, 123, 239, 229, 244, 14, 214, 237, 146, 211, 130, 222, 123, 230, + 9, 244, 14, 214, 237, 146, 211, 130, 222, 123, 239, 229, 215, 48, 222, + 123, 230, 9, 215, 48, 222, 123, 239, 229, 215, 48, 84, 230, 10, 84, 242, + 242, 53, 215, 48, 84, 239, 230, 84, 242, 242, 53, 50, 225, 93, 230, 9, + 50, 225, 93, 239, 229, 50, 225, 93, 230, 10, 2, 209, 226, 239, 230, 222, + 83, 230, 9, 239, 230, 250, 12, 230, 9, 230, 10, 247, 192, 249, 46, 247, + 19, 239, 230, 247, 192, 249, 46, 247, 19, 230, 10, 247, 192, 249, 46, + 247, 20, 84, 214, 237, 242, 243, 239, 230, 247, 192, 249, 46, 247, 20, + 84, 214, 237, 242, 243, 214, 214, 212, 46, 230, 84, 212, 46, 214, 214, + 212, 47, 222, 123, 146, 124, 230, 84, 212, 47, 222, 123, 146, 124, 242, + 242, 3, 2, 249, 78, 52, 220, 140, 84, 215, 39, 242, 242, 53, 213, 174, + 84, 215, 39, 242, 242, 53, 220, 140, 84, 215, 39, 224, 43, 146, 124, 213, + 174, 84, 215, 39, 224, 43, 146, 124, 220, 140, 84, 242, 242, 53, 213, + 174, 84, 242, 242, 53, 220, 140, 84, 224, 43, 146, 124, 213, 174, 84, + 224, 43, 146, 124, 220, 140, 84, 252, 149, 146, 124, 213, 174, 84, 252, + 149, 146, 124, 220, 140, 84, 224, 43, 252, 149, 146, 124, 213, 174, 84, + 224, 43, 252, 149, 146, 124, 50, 220, 139, 50, 213, 173, 213, 182, 2, + 245, 23, 213, 138, 2, 245, 23, 213, 182, 2, 101, 3, 55, 213, 138, 2, 101, + 3, 55, 213, 182, 2, 226, 94, 3, 55, 213, 138, 2, 226, 94, 3, 55, 213, + 182, 73, 222, 123, 146, 211, 130, 2, 67, 52, 213, 138, 73, 222, 123, 146, + 211, 130, 2, 67, 52, 213, 182, 73, 84, 242, 242, 53, 213, 138, 73, 84, + 242, 242, 53, 213, 182, 73, 84, 211, 181, 222, 132, 213, 138, 73, 84, + 211, 181, 222, 132, 213, 182, 73, 84, 252, 149, 146, 124, 213, 138, 73, + 84, 252, 149, 146, 124, 213, 182, 73, 84, 224, 43, 146, 124, 213, 138, + 73, 84, 224, 43, 146, 124, 49, 47, 222, 142, 96, 222, 132, 49, 48, 222, + 142, 96, 222, 132, 247, 192, 213, 181, 247, 192, 213, 137, 247, 192, 213, + 182, 222, 123, 146, 124, 247, 192, 213, 138, 222, 123, 146, 124, 213, + 182, 84, 213, 137, 213, 138, 84, 213, 181, 213, 182, 84, 213, 181, 213, + 138, 84, 213, 137, 213, 138, 250, 12, 213, 181, 213, 138, 250, 12, 23, + 232, 119, 249, 46, 246, 79, 2, 213, 181, 243, 61, 73, 222, 135, 244, 6, + 220, 246, 2, 212, 121, 211, 101, 211, 66, 233, 7, 241, 137, 224, 57, 215, + 144, 47, 212, 201, 215, 144, 130, 212, 201, 215, 144, 120, 212, 201, 221, + 119, 2, 182, 79, 250, 129, 211, 36, 48, 210, 143, 50, 79, 250, 129, 47, + 210, 143, 79, 250, 129, 50, 47, 210, 143, 50, 79, 250, 129, 50, 47, 210, + 143, 152, 246, 79, 241, 98, 47, 227, 88, 73, 50, 209, 22, 215, 144, 130, + 212, 202, 2, 222, 86, 215, 144, 120, 212, 202, 2, 209, 226, 215, 144, + 120, 212, 202, 84, 215, 144, 130, 212, 201, 50, 130, 212, 201, 50, 120, + 212, 201, 50, 213, 225, 224, 43, 53, 218, 224, 50, 213, 225, 224, 43, 53, + 245, 42, 224, 43, 245, 82, 2, 218, 224, 225, 104, 214, 235, 79, 229, 206, + 2, 247, 234, 52, 79, 229, 206, 2, 247, 234, 55, 130, 212, 202, 2, 247, + 234, 55, 221, 222, 2, 194, 91, 221, 222, 2, 211, 181, 222, 132, 211, 36, + 79, 250, 129, 249, 225, 219, 11, 211, 36, 79, 250, 129, 2, 194, 91, 211, + 36, 247, 163, 222, 132, 211, 36, 225, 93, 230, 9, 211, 36, 225, 93, 239, + 229, 244, 14, 214, 237, 230, 10, 222, 123, 146, 124, 244, 14, 214, 237, + 239, 230, 222, 123, 146, 124, 211, 36, 214, 181, 249, 225, 219, 11, 230, + 86, 211, 36, 79, 250, 129, 222, 132, 50, 214, 181, 222, 132, 59, 79, 134, + 226, 32, 59, 79, 134, 143, 243, 117, 59, 45, 143, 207, 36, 59, 45, 188, + 243, 117, 59, 45, 188, 207, 36, 59, 45, 47, 48, 59, 45, 92, 60, 45, 167, + 60, 45, 173, 60, 45, 143, 243, 117, 60, 45, 143, 207, 36, 60, 45, 188, + 243, 117, 60, 45, 188, 207, 36, 60, 45, 47, 48, 60, 45, 120, 130, 60, 45, + 86, 51, 2, 211, 167, 244, 6, 86, 51, 2, 211, 167, 209, 196, 92, 51, 2, + 211, 167, 244, 6, 92, 51, 2, 211, 167, 209, 196, 49, 2, 211, 102, 160, + 249, 202, 49, 2, 249, 154, 160, 249, 202, 49, 2, 209, 203, 48, 245, 163, + 160, 249, 202, 49, 2, 229, 92, 47, 245, 163, 160, 249, 202, 245, 157, 2, + 47, 160, 249, 202, 245, 157, 2, 48, 160, 249, 202, 245, 157, 2, 211, 102, + 160, 249, 202, 245, 157, 2, 249, 154, 160, 249, 202, 244, 21, 214, 107, + 60, 230, 86, 214, 107, 59, 230, 86, 214, 107, 60, 208, 226, 5, 214, 107, + 59, 208, 226, 5, 214, 107, 60, 221, 140, 59, 221, 140, 59, 239, 25, 60, + 239, 25, 194, 60, 239, 25, 60, 230, 86, 247, 233, 60, 227, 109, 245, 156, + 59, 227, 109, 245, 156, 60, 227, 109, 229, 88, 59, 227, 109, 229, 88, 60, + 5, 245, 156, 60, 5, 229, 88, 59, 5, 229, 88, 60, 194, 243, 55, 59, 194, + 243, 55, 60, 79, 243, 55, 59, 79, 243, 55, 47, 51, 2, 5, 247, 233, 129, + 92, 251, 241, 47, 51, 2, 39, 220, 218, 152, 92, 214, 103, 45, 92, 210, + 108, 51, 2, 79, 91, 92, 210, 108, 51, 2, 50, 79, 91, 92, 210, 108, 51, + 241, 98, 134, 92, 210, 108, 211, 36, 246, 79, 45, 92, 51, 2, 244, 21, + 214, 9, 92, 51, 2, 212, 192, 2, 79, 91, 92, 51, 2, 212, 192, 2, 50, 79, + 91, 92, 210, 108, 51, 2, 212, 191, 92, 210, 108, 51, 2, 212, 192, 2, 79, + 91, 92, 210, 108, 51, 2, 212, 192, 2, 50, 79, 91, 92, 51, 211, 233, 206, + 195, 207, 65, 51, 220, 201, 245, 102, 230, 46, 242, 242, 3, 84, 92, 45, + 218, 225, 211, 181, 222, 133, 84, 92, 45, 92, 51, 84, 218, 225, 252, 149, + 146, 124, 86, 51, 211, 233, 239, 229, 86, 51, 211, 233, 213, 137, 92, + 219, 207, 45, 86, 219, 207, 45, 218, 225, 211, 181, 222, 133, 84, 86, 45, + 86, 51, 84, 218, 225, 252, 149, 146, 124, 211, 181, 222, 133, 84, 92, 45, + 92, 51, 84, 252, 149, 146, 124, 92, 51, 84, 218, 225, 211, 181, 222, 132, + 86, 51, 84, 218, 225, 211, 181, 222, 132, 173, 211, 50, 205, 31, 45, 215, + 144, 214, 237, 143, 45, 215, 144, 250, 173, 188, 45, 59, 227, 109, 214, + 26, 60, 5, 214, 26, 59, 5, 214, 26, 60, 218, 162, 221, 140, 59, 218, 162, + 221, 140, 77, 230, 86, 247, 233, 77, 222, 87, 2, 222, 87, 233, 25, 77, + 247, 234, 2, 247, 234, 233, 25, 77, 247, 233, 77, 39, 217, 162, 214, 237, + 143, 51, 2, 238, 129, 239, 68, 250, 173, 188, 51, 2, 238, 129, 212, 191, + 214, 237, 143, 51, 2, 194, 212, 191, 250, 173, 188, 51, 2, 194, 212, 191, + 250, 19, 51, 220, 201, 173, 212, 33, 143, 243, 116, 215, 144, 250, 19, + 51, 220, 201, 173, 212, 33, 143, 243, 116, 92, 211, 50, 45, 167, 211, 50, + 45, 86, 211, 50, 45, 173, 211, 50, 45, 47, 48, 211, 50, 45, 120, 130, + 211, 50, 45, 143, 207, 36, 211, 50, 45, 143, 243, 117, 211, 50, 45, 188, + 243, 117, 211, 50, 45, 188, 207, 36, 211, 50, 45, 92, 211, 50, 246, 77, + 45, 167, 211, 50, 246, 77, 45, 86, 211, 50, 246, 77, 45, 173, 211, 50, + 246, 77, 45, 247, 194, 211, 50, 222, 142, 247, 234, 45, 252, 87, 211, 50, + 222, 142, 247, 234, 45, 92, 211, 50, 51, 211, 130, 134, 167, 211, 50, 51, + 211, 130, 134, 86, 211, 50, 51, 211, 130, 134, 173, 211, 50, 51, 211, + 130, 134, 143, 207, 36, 211, 50, 51, 211, 130, 134, 143, 243, 117, 211, + 50, 51, 211, 130, 134, 188, 243, 117, 211, 50, 51, 211, 130, 134, 188, + 207, 36, 211, 50, 51, 211, 130, 134, 92, 211, 50, 51, 2, 50, 194, 91, + 167, 211, 50, 51, 2, 50, 194, 91, 86, 211, 50, 51, 2, 50, 194, 91, 173, + 211, 50, 51, 2, 50, 194, 91, 194, 212, 208, 231, 174, 79, 212, 208, 231, + 174, 92, 211, 50, 51, 131, 86, 211, 50, 45, 167, 211, 50, 51, 92, 73, + 173, 211, 50, 45, 86, 211, 50, 51, 131, 92, 211, 50, 45, 173, 211, 50, + 51, 92, 73, 167, 211, 50, 45, 92, 211, 50, 222, 30, 251, 241, 167, 211, + 50, 222, 30, 251, 241, 86, 211, 50, 222, 30, 251, 241, 173, 211, 50, 222, + 30, 251, 241, 92, 60, 39, 59, 45, 167, 60, 39, 59, 45, 86, 60, 39, 59, + 45, 173, 60, 39, 59, 45, 252, 87, 211, 50, 48, 210, 71, 45, 252, 87, 211, + 50, 249, 154, 210, 71, 45, 252, 87, 211, 50, 47, 210, 71, 45, 252, 87, + 211, 50, 211, 102, 210, 71, 45, 218, 229, 230, 46, 218, 229, 218, 167, + 225, 86, 230, 46, 225, 86, 218, 167, 241, 125, 247, 92, 251, 242, 247, + 231, 252, 86, 86, 60, 45, 211, 238, 211, 100, 92, 242, 238, 251, 243, + 211, 238, 218, 163, 167, 242, 238, 251, 243, 211, 238, 211, 100, 86, 242, + 238, 251, 243, 211, 238, 230, 42, 173, 242, 238, 251, 243, 60, 92, 242, + 238, 251, 243, 60, 167, 242, 238, 251, 243, 60, 86, 242, 238, 251, 243, + 60, 173, 242, 238, 251, 243, 173, 211, 50, 51, 2, 152, 211, 167, 230, 36, + 173, 211, 50, 51, 2, 152, 211, 167, 218, 156, 167, 211, 50, 51, 2, 152, + 211, 167, 230, 36, 167, 211, 50, 51, 2, 152, 211, 167, 218, 156, 92, 211, + 50, 51, 2, 152, 211, 167, 209, 196, 86, 211, 50, 51, 2, 152, 211, 167, + 209, 196, 92, 211, 50, 51, 2, 152, 211, 167, 244, 6, 86, 211, 50, 51, 2, + 152, 211, 167, 244, 6, 60, 247, 18, 173, 23, 92, 45, 60, 247, 18, 173, + 23, 86, 45, 60, 247, 18, 167, 23, 92, 45, 60, 247, 18, 167, 23, 86, 45, + 60, 247, 18, 92, 23, 167, 45, 60, 247, 18, 86, 23, 167, 45, 60, 247, 18, + 92, 23, 173, 45, 60, 247, 18, 86, 23, 173, 45, 218, 206, 51, 130, 230, + 46, 218, 206, 51, 130, 218, 167, 218, 206, 51, 120, 230, 46, 218, 206, + 51, 120, 218, 167, 218, 206, 51, 47, 209, 206, 218, 206, 51, 48, 209, + 206, 218, 206, 51, 47, 244, 8, 218, 206, 51, 48, 244, 8, 167, 59, 51, + 241, 98, 250, 129, 2, 194, 134, 120, 251, 244, 233, 69, 32, 219, 38, 249, + 140, 250, 146, 96, 2, 147, 206, 195, 39, 206, 195, 39, 24, 206, 195, 60, + 49, 248, 126, 60, 245, 157, 248, 126, 201, 60, 221, 140, 194, 60, 222, + 214, 60, 222, 214, 60, 227, 109, 209, 205, 211, 52, 248, 126, 60, 227, + 109, 244, 7, 211, 52, 248, 126, 60, 227, 109, 230, 41, 211, 52, 248, 126, + 60, 227, 109, 218, 162, 211, 52, 248, 126, 211, 102, 160, 60, 247, 233, + 249, 154, 160, 60, 247, 233, 147, 241, 125, 220, 203, 60, 247, 15, 218, + 97, 147, 241, 125, 220, 203, 60, 247, 15, 59, 241, 125, 220, 203, 247, + 15, 218, 97, 59, 241, 125, 220, 203, 247, 15, 49, 220, 178, 233, 49, 209, + 229, 53, 166, 6, 1, 251, 151, 166, 6, 1, 249, 89, 166, 6, 1, 209, 37, + 166, 6, 1, 240, 30, 166, 6, 1, 245, 46, 166, 6, 1, 206, 24, 166, 6, 1, + 205, 65, 166, 6, 1, 243, 191, 166, 6, 1, 205, 90, 166, 6, 1, 232, 207, + 166, 6, 1, 78, 232, 207, 166, 6, 1, 74, 166, 6, 1, 245, 66, 166, 6, 1, + 232, 33, 166, 6, 1, 229, 174, 166, 6, 1, 226, 37, 166, 6, 1, 225, 195, + 166, 6, 1, 222, 154, 166, 6, 1, 220, 198, 166, 6, 1, 218, 141, 166, 6, 1, + 214, 219, 166, 6, 1, 210, 131, 166, 6, 1, 209, 245, 166, 6, 1, 241, 101, + 166, 6, 1, 239, 31, 166, 6, 1, 222, 98, 166, 6, 1, 221, 174, 166, 6, 1, + 215, 119, 166, 6, 1, 210, 222, 166, 6, 1, 248, 20, 166, 6, 1, 216, 2, + 166, 6, 1, 206, 30, 166, 6, 1, 206, 32, 166, 6, 1, 206, 63, 166, 6, 1, + 214, 129, 155, 166, 6, 1, 205, 213, 166, 6, 1, 5, 205, 183, 166, 6, 1, 5, + 205, 184, 2, 212, 191, 166, 6, 1, 205, 247, 166, 6, 1, 232, 248, 5, 205, + 183, 166, 6, 1, 249, 231, 205, 183, 166, 6, 1, 232, 248, 249, 231, 205, + 183, 166, 6, 1, 241, 205, 166, 6, 1, 232, 205, 166, 6, 1, 215, 118, 166, + 6, 1, 211, 27, 62, 166, 6, 1, 230, 76, 226, 37, 166, 5, 1, 251, 151, 166, + 5, 1, 249, 89, 166, 5, 1, 209, 37, 166, 5, 1, 240, 30, 166, 5, 1, 245, + 46, 166, 5, 1, 206, 24, 166, 5, 1, 205, 65, 166, 5, 1, 243, 191, 166, 5, + 1, 205, 90, 166, 5, 1, 232, 207, 166, 5, 1, 78, 232, 207, 166, 5, 1, 74, + 166, 5, 1, 245, 66, 166, 5, 1, 232, 33, 166, 5, 1, 229, 174, 166, 5, 1, + 226, 37, 166, 5, 1, 225, 195, 166, 5, 1, 222, 154, 166, 5, 1, 220, 198, + 166, 5, 1, 218, 141, 166, 5, 1, 214, 219, 166, 5, 1, 210, 131, 166, 5, 1, + 209, 245, 166, 5, 1, 241, 101, 166, 5, 1, 239, 31, 166, 5, 1, 222, 98, + 166, 5, 1, 221, 174, 166, 5, 1, 215, 119, 166, 5, 1, 210, 222, 166, 5, 1, + 248, 20, 166, 5, 1, 216, 2, 166, 5, 1, 206, 30, 166, 5, 1, 206, 32, 166, + 5, 1, 206, 63, 166, 5, 1, 214, 129, 155, 166, 5, 1, 205, 213, 166, 5, 1, + 5, 205, 183, 166, 5, 1, 5, 205, 184, 2, 212, 191, 166, 5, 1, 205, 247, + 166, 5, 1, 232, 248, 5, 205, 183, 166, 5, 1, 249, 231, 205, 183, 166, 5, + 1, 232, 248, 249, 231, 205, 183, 166, 5, 1, 241, 205, 166, 5, 1, 232, + 205, 166, 5, 1, 215, 118, 166, 5, 1, 211, 27, 62, 166, 5, 1, 230, 76, + 226, 37, 7, 6, 1, 230, 159, 2, 50, 134, 7, 5, 1, 230, 159, 2, 50, 134, 7, + 6, 1, 230, 159, 2, 226, 247, 211, 180, 7, 6, 1, 222, 68, 2, 91, 7, 6, 1, + 219, 150, 2, 212, 191, 7, 5, 1, 32, 2, 91, 7, 5, 1, 213, 11, 2, 245, 163, + 91, 7, 6, 1, 239, 156, 2, 245, 211, 7, 5, 1, 239, 156, 2, 245, 211, 7, 6, + 1, 232, 77, 2, 245, 211, 7, 5, 1, 232, 77, 2, 245, 211, 7, 6, 1, 205, + 160, 2, 245, 211, 7, 5, 1, 205, 160, 2, 245, 211, 7, 6, 1, 252, 144, 7, + 6, 1, 229, 29, 2, 109, 7, 6, 1, 201, 62, 7, 6, 1, 201, 252, 144, 7, 5, 1, + 209, 149, 2, 48, 109, 7, 6, 1, 207, 130, 2, 109, 7, 5, 1, 207, 130, 2, + 109, 7, 5, 1, 209, 149, 2, 247, 27, 7, 6, 1, 160, 239, 155, 7, 5, 1, 160, + 239, 155, 7, 5, 1, 212, 189, 221, 78, 7, 5, 1, 174, 2, 224, 40, 7, 5, 1, + 201, 219, 150, 2, 212, 191, 7, 5, 1, 148, 2, 114, 218, 149, 233, 25, 7, + 1, 5, 6, 201, 75, 7, 213, 183, 5, 1, 232, 203, 65, 1, 6, 209, 148, 7, 6, + 1, 218, 1, 2, 213, 109, 212, 191, 7, 6, 1, 205, 160, 2, 213, 109, 212, + 191, 81, 6, 1, 252, 166, 81, 5, 1, 252, 166, 81, 6, 1, 208, 211, 81, 5, + 1, 208, 211, 81, 6, 1, 240, 215, 81, 5, 1, 240, 215, 81, 6, 1, 246, 113, + 81, 5, 1, 246, 113, 81, 6, 1, 243, 89, 81, 5, 1, 243, 89, 81, 6, 1, 214, + 167, 81, 5, 1, 214, 167, 81, 6, 1, 205, 100, 81, 5, 1, 205, 100, 81, 6, + 1, 239, 83, 81, 5, 1, 239, 83, 81, 6, 1, 212, 21, 81, 5, 1, 212, 21, 81, + 6, 1, 237, 187, 81, 5, 1, 237, 187, 81, 6, 1, 232, 19, 81, 5, 1, 232, 19, + 81, 6, 1, 230, 72, 81, 5, 1, 230, 72, 81, 6, 1, 226, 254, 81, 5, 1, 226, + 254, 81, 6, 1, 224, 230, 81, 5, 1, 224, 230, 81, 6, 1, 230, 252, 81, 5, + 1, 230, 252, 81, 6, 1, 76, 81, 5, 1, 76, 81, 6, 1, 221, 53, 81, 5, 1, + 221, 53, 81, 6, 1, 218, 124, 81, 5, 1, 218, 124, 81, 6, 1, 215, 51, 81, + 5, 1, 215, 51, 81, 6, 1, 212, 151, 81, 5, 1, 212, 151, 81, 6, 1, 210, 18, + 81, 5, 1, 210, 18, 81, 6, 1, 241, 250, 81, 5, 1, 241, 250, 81, 6, 1, 231, + 145, 81, 5, 1, 231, 145, 81, 6, 1, 220, 93, 81, 5, 1, 220, 93, 81, 6, 1, + 222, 146, 81, 5, 1, 222, 146, 81, 6, 1, 245, 161, 252, 172, 81, 5, 1, + 245, 161, 252, 172, 81, 6, 1, 44, 81, 252, 200, 81, 5, 1, 44, 81, 252, + 200, 81, 6, 1, 247, 43, 243, 89, 81, 5, 1, 247, 43, 243, 89, 81, 6, 1, + 245, 161, 232, 19, 81, 5, 1, 245, 161, 232, 19, 81, 6, 1, 245, 161, 224, + 230, 81, 5, 1, 245, 161, 224, 230, 81, 6, 1, 247, 43, 224, 230, 81, 5, 1, + 247, 43, 224, 230, 81, 6, 1, 44, 81, 222, 146, 81, 5, 1, 44, 81, 222, + 146, 81, 6, 1, 217, 154, 81, 5, 1, 217, 154, 81, 6, 1, 247, 57, 215, 206, + 81, 5, 1, 247, 57, 215, 206, 81, 6, 1, 44, 81, 215, 206, 81, 5, 1, 44, + 81, 215, 206, 81, 6, 1, 44, 81, 242, 215, 81, 5, 1, 44, 81, 242, 215, 81, + 6, 1, 252, 185, 231, 150, 81, 5, 1, 252, 185, 231, 150, 81, 6, 1, 245, + 161, 238, 122, 81, 5, 1, 245, 161, 238, 122, 81, 6, 1, 44, 81, 238, 122, + 81, 5, 1, 44, 81, 238, 122, 81, 6, 1, 44, 81, 155, 81, 5, 1, 44, 81, 155, + 81, 6, 1, 230, 158, 155, 81, 5, 1, 230, 158, 155, 81, 6, 1, 44, 81, 239, + 49, 81, 5, 1, 44, 81, 239, 49, 81, 6, 1, 44, 81, 239, 86, 81, 5, 1, 44, + 81, 239, 86, 81, 6, 1, 44, 81, 240, 210, 81, 5, 1, 44, 81, 240, 210, 81, + 6, 1, 44, 81, 245, 69, 81, 5, 1, 44, 81, 245, 69, 81, 6, 1, 44, 81, 215, + 173, 81, 5, 1, 44, 81, 215, 173, 81, 6, 1, 44, 223, 187, 215, 173, 81, 5, + 1, 44, 223, 187, 215, 173, 81, 6, 1, 44, 223, 187, 225, 25, 81, 5, 1, 44, + 223, 187, 225, 25, 81, 6, 1, 44, 223, 187, 223, 125, 81, 5, 1, 44, 223, + 187, 223, 125, 81, 6, 1, 44, 223, 187, 207, 66, 81, 5, 1, 44, 223, 187, + 207, 66, 81, 16, 232, 41, 81, 16, 226, 255, 218, 124, 81, 16, 221, 54, + 218, 124, 81, 16, 214, 17, 81, 16, 212, 152, 218, 124, 81, 16, 231, 146, + 218, 124, 81, 16, 215, 174, 215, 51, 81, 6, 1, 247, 43, 215, 206, 81, 5, + 1, 247, 43, 215, 206, 81, 6, 1, 247, 43, 240, 210, 81, 5, 1, 247, 43, + 240, 210, 81, 36, 224, 231, 52, 81, 36, 214, 123, 251, 217, 81, 36, 214, + 123, 230, 17, 81, 6, 1, 249, 178, 231, 150, 81, 5, 1, 249, 178, 231, 150, + 81, 44, 223, 187, 241, 82, 213, 251, 81, 44, 223, 187, 245, 104, 219, + 196, 83, 81, 44, 223, 187, 233, 48, 219, 196, 83, 81, 44, 223, 187, 209, + 24, 245, 79, 81, 241, 116, 119, 239, 121, 81, 241, 82, 213, 251, 81, 226, + 140, 245, 79, 108, 5, 1, 252, 122, 108, 5, 1, 250, 140, 108, 5, 1, 240, + 214, 108, 5, 1, 245, 31, 108, 5, 1, 243, 41, 108, 5, 1, 208, 197, 108, 5, + 1, 205, 88, 108, 5, 1, 212, 174, 108, 5, 1, 233, 68, 108, 5, 1, 232, 27, + 108, 5, 1, 230, 82, 108, 5, 1, 227, 221, 108, 5, 1, 225, 200, 108, 5, 1, + 222, 165, 108, 5, 1, 221, 231, 108, 5, 1, 205, 77, 108, 5, 1, 219, 95, + 108, 5, 1, 217, 151, 108, 5, 1, 212, 162, 108, 5, 1, 209, 234, 108, 5, 1, + 221, 85, 108, 5, 1, 231, 155, 108, 5, 1, 240, 90, 108, 5, 1, 220, 4, 108, + 5, 1, 215, 171, 108, 5, 1, 248, 45, 108, 5, 1, 248, 226, 108, 5, 1, 232, + 154, 108, 5, 1, 247, 240, 108, 5, 1, 248, 95, 108, 5, 1, 206, 179, 108, + 5, 1, 232, 167, 108, 5, 1, 239, 138, 108, 5, 1, 239, 71, 108, 5, 1, 239, + 6, 108, 5, 1, 207, 51, 108, 5, 1, 239, 95, 108, 5, 1, 238, 146, 108, 5, + 1, 205, 249, 108, 5, 1, 252, 237, 211, 200, 1, 190, 211, 200, 1, 206, + 105, 211, 200, 1, 206, 104, 211, 200, 1, 206, 94, 211, 200, 1, 206, 92, + 211, 200, 1, 250, 14, 253, 23, 206, 87, 211, 200, 1, 206, 87, 211, 200, + 1, 206, 102, 211, 200, 1, 206, 99, 211, 200, 1, 206, 101, 211, 200, 1, + 206, 100, 211, 200, 1, 206, 15, 211, 200, 1, 206, 96, 211, 200, 1, 206, + 85, 211, 200, 1, 210, 167, 206, 85, 211, 200, 1, 206, 82, 211, 200, 1, + 206, 90, 211, 200, 1, 250, 14, 253, 23, 206, 90, 211, 200, 1, 210, 167, + 206, 90, 211, 200, 1, 206, 89, 211, 200, 1, 206, 109, 211, 200, 1, 206, + 83, 211, 200, 1, 210, 167, 206, 83, 211, 200, 1, 206, 72, 211, 200, 1, + 210, 167, 206, 72, 211, 200, 1, 206, 11, 211, 200, 1, 206, 54, 211, 200, + 1, 252, 211, 206, 54, 211, 200, 1, 210, 167, 206, 54, 211, 200, 1, 206, + 81, 211, 200, 1, 206, 80, 211, 200, 1, 206, 77, 211, 200, 1, 210, 167, + 206, 91, 211, 200, 1, 210, 167, 206, 75, 211, 200, 1, 206, 73, 211, 200, + 1, 205, 213, 211, 200, 1, 206, 70, 211, 200, 1, 206, 69, 211, 200, 1, + 206, 93, 211, 200, 1, 210, 167, 206, 93, 211, 200, 1, 251, 155, 206, 93, + 211, 200, 1, 206, 68, 211, 200, 1, 206, 66, 211, 200, 1, 206, 67, 211, + 200, 1, 206, 65, 211, 200, 1, 206, 64, 211, 200, 1, 206, 103, 211, 200, + 1, 206, 62, 211, 200, 1, 206, 60, 211, 200, 1, 206, 59, 211, 200, 1, 206, + 58, 211, 200, 1, 206, 55, 211, 200, 1, 212, 143, 206, 55, 211, 200, 1, + 206, 53, 211, 200, 1, 206, 52, 211, 200, 1, 205, 247, 211, 200, 65, 1, + 230, 131, 83, 211, 200, 216, 40, 83, 211, 200, 107, 232, 117, 31, 4, 229, + 143, 31, 4, 226, 180, 31, 4, 218, 122, 31, 4, 214, 192, 31, 4, 215, 157, + 31, 4, 249, 183, 31, 4, 211, 129, 31, 4, 247, 173, 31, 4, 224, 65, 31, 4, + 223, 109, 31, 4, 240, 25, 222, 230, 31, 4, 205, 18, 31, 4, 245, 49, 31, + 4, 246, 23, 31, 4, 232, 121, 31, 4, 211, 252, 31, 4, 248, 31, 31, 4, 221, + 65, 31, 4, 220, 210, 31, 4, 240, 105, 31, 4, 240, 101, 31, 4, 240, 102, + 31, 4, 240, 103, 31, 4, 214, 96, 31, 4, 214, 51, 31, 4, 214, 64, 31, 4, + 214, 95, 31, 4, 214, 69, 31, 4, 214, 70, 31, 4, 214, 56, 31, 4, 248, 171, + 31, 4, 248, 150, 31, 4, 248, 152, 31, 4, 248, 170, 31, 4, 248, 168, 31, + 4, 248, 169, 31, 4, 248, 151, 31, 4, 204, 238, 31, 4, 204, 216, 31, 4, + 204, 229, 31, 4, 204, 237, 31, 4, 204, 232, 31, 4, 204, 233, 31, 4, 204, + 221, 31, 4, 248, 166, 31, 4, 248, 153, 31, 4, 248, 155, 31, 4, 248, 165, + 31, 4, 248, 163, 31, 4, 248, 164, 31, 4, 248, 154, 31, 4, 219, 162, 31, + 4, 219, 152, 31, 4, 219, 158, 31, 4, 219, 161, 31, 4, 219, 159, 31, 4, + 219, 160, 31, 4, 219, 157, 31, 4, 230, 169, 31, 4, 230, 161, 31, 4, 230, + 164, 31, 4, 230, 168, 31, 4, 230, 165, 31, 4, 230, 166, 31, 4, 230, 162, + 31, 4, 206, 139, 31, 4, 206, 126, 31, 4, 206, 134, 31, 4, 206, 138, 31, + 4, 206, 136, 31, 4, 206, 137, 31, 4, 206, 133, 31, 4, 239, 167, 31, 4, + 239, 157, 31, 4, 239, 160, 31, 4, 239, 166, 31, 4, 239, 162, 31, 4, 239, + 163, 31, 4, 239, 159, 36, 34, 1, 250, 61, 36, 34, 1, 209, 39, 36, 34, 1, + 240, 85, 36, 34, 1, 246, 9, 36, 34, 1, 205, 72, 36, 34, 1, 205, 93, 36, + 34, 1, 172, 36, 34, 1, 243, 68, 36, 34, 1, 243, 50, 36, 34, 1, 243, 41, + 36, 34, 1, 76, 36, 34, 1, 221, 174, 36, 34, 1, 242, 235, 36, 34, 1, 242, + 225, 36, 34, 1, 212, 131, 36, 34, 1, 155, 36, 34, 1, 210, 237, 36, 34, 1, + 248, 82, 36, 34, 1, 216, 2, 36, 34, 1, 215, 217, 36, 34, 1, 241, 205, 36, + 34, 1, 242, 221, 36, 34, 1, 62, 36, 34, 1, 233, 129, 36, 34, 1, 245, 67, + 36, 34, 1, 226, 158, 209, 249, 36, 34, 1, 206, 65, 36, 34, 1, 205, 213, + 36, 34, 1, 232, 247, 62, 36, 34, 1, 229, 180, 205, 183, 36, 34, 1, 249, + 231, 205, 183, 36, 34, 1, 232, 247, 249, 231, 205, 183, 48, 252, 109, + 213, 178, 227, 187, 48, 252, 109, 244, 21, 213, 178, 227, 187, 47, 213, + 178, 145, 48, 213, 178, 145, 47, 244, 21, 213, 178, 145, 48, 244, 21, + 213, 178, 145, 219, 81, 233, 12, 227, 187, 219, 81, 244, 21, 233, 12, + 227, 187, 244, 21, 211, 67, 227, 187, 47, 211, 67, 145, 48, 211, 67, 145, + 219, 81, 214, 107, 47, 219, 81, 222, 167, 145, 48, 219, 81, 222, 167, + 145, 243, 105, 247, 89, 221, 227, 241, 138, 221, 227, 218, 224, 241, 138, + 221, 227, 237, 236, 244, 21, 222, 225, 173, 252, 118, 167, 252, 118, 244, + 21, 218, 162, 252, 108, 50, 222, 222, 237, 239, 233, 2, 233, 10, 222, 19, + 249, 130, 237, 240, 2, 245, 166, 211, 181, 2, 218, 149, 52, 47, 114, 221, + 219, 145, 48, 114, 221, 219, 145, 211, 181, 2, 67, 52, 211, 181, 2, 67, + 55, 47, 79, 250, 129, 2, 219, 190, 48, 79, 250, 129, 2, 219, 190, 211, + 102, 47, 160, 145, 211, 102, 48, 160, 145, 249, 154, 47, 160, 145, 249, + 154, 48, 160, 145, 47, 215, 73, 106, 145, 48, 215, 73, 106, 145, 47, 50, + 221, 216, 48, 50, 221, 216, 118, 177, 131, 119, 67, 220, 71, 119, 67, + 131, 118, 177, 220, 71, 98, 241, 125, 67, 220, 71, 241, 204, 67, 83, 218, + 224, 219, 196, 83, 79, 211, 180, 218, 149, 220, 204, 206, 232, 216, 40, + 226, 247, 245, 23, 201, 247, 155, 219, 81, 245, 23, 219, 81, 247, 155, + 201, 216, 52, 246, 129, 2, 47, 239, 207, 246, 129, 2, 48, 239, 207, 201, + 246, 128, 211, 102, 160, 217, 77, 53, 210, 109, 246, 78, 211, 237, 246, + 78, 214, 8, 241, 82, 213, 251, 79, 215, 10, 245, 21, 207, 14, 79, 229, + 205, 248, 211, 50, 237, 239, 218, 224, 247, 155, 50, 229, 93, 219, 180, + 83, 10, 37, 218, 251, 10, 37, 247, 202, 10, 37, 217, 80, 102, 10, 37, + 217, 80, 105, 10, 37, 217, 80, 142, 10, 37, 221, 114, 10, 37, 249, 140, + 10, 37, 212, 206, 10, 37, 231, 59, 102, 10, 37, 231, 59, 105, 10, 37, + 245, 76, 10, 37, 217, 84, 10, 37, 5, 102, 10, 37, 5, 105, 10, 37, 230, + 101, 102, 10, 37, 230, 101, 105, 10, 37, 230, 101, 142, 10, 37, 230, 101, + 139, 10, 37, 214, 204, 10, 37, 211, 239, 10, 37, 214, 202, 102, 10, 37, + 214, 202, 105, 10, 37, 239, 61, 102, 10, 37, 239, 61, 105, 10, 37, 239, + 107, 10, 37, 219, 71, 10, 37, 248, 28, 10, 37, 213, 154, 10, 37, 226, + 144, 10, 37, 246, 7, 10, 37, 226, 136, 10, 37, 247, 220, 10, 37, 207, 70, + 102, 10, 37, 207, 70, 105, 10, 37, 241, 219, 10, 37, 221, 186, 102, 10, + 37, 221, 186, 105, 10, 37, 215, 46, 160, 211, 62, 210, 248, 10, 37, 247, + 75, 10, 37, 245, 40, 10, 37, 232, 195, 10, 37, 249, 177, 73, 247, 186, + 10, 37, 242, 150, 10, 37, 214, 125, 102, 10, 37, 214, 125, 105, 10, 37, + 250, 142, 10, 37, 215, 53, 10, 37, 249, 31, 215, 53, 10, 37, 225, 92, + 102, 10, 37, 225, 92, 105, 10, 37, 225, 92, 142, 10, 37, 225, 92, 139, + 10, 37, 227, 70, 10, 37, 215, 208, 10, 37, 219, 77, 10, 37, 242, 174, 10, + 37, 222, 179, 10, 37, 249, 109, 102, 10, 37, 249, 109, 105, 10, 37, 227, + 114, 10, 37, 226, 139, 10, 37, 239, 240, 102, 10, 37, 239, 240, 105, 10, + 37, 239, 240, 142, 10, 37, 211, 198, 10, 37, 247, 185, 10, 37, 207, 36, + 102, 10, 37, 207, 36, 105, 10, 37, 249, 31, 217, 74, 10, 37, 215, 46, + 238, 69, 10, 37, 238, 69, 10, 37, 249, 31, 214, 136, 10, 37, 249, 31, + 215, 203, 10, 37, 241, 148, 10, 37, 249, 31, 248, 189, 10, 37, 215, 46, + 207, 87, 10, 37, 207, 88, 102, 10, 37, 207, 88, 105, 10, 37, 247, 223, + 10, 37, 249, 31, 240, 11, 10, 37, 152, 102, 10, 37, 152, 105, 10, 37, + 249, 31, 229, 125, 10, 37, 249, 31, 240, 196, 10, 37, 226, 132, 102, 10, + 37, 226, 132, 105, 10, 37, 219, 83, 10, 37, 249, 186, 10, 37, 249, 31, + 212, 168, 230, 52, 10, 37, 249, 31, 230, 53, 10, 37, 249, 31, 207, 9, 10, + 37, 249, 31, 241, 166, 10, 37, 243, 114, 102, 10, 37, 243, 114, 105, 10, + 37, 243, 114, 142, 10, 37, 249, 31, 243, 113, 10, 37, 239, 68, 10, 37, + 249, 31, 238, 65, 10, 37, 249, 173, 10, 37, 240, 69, 10, 37, 249, 31, + 241, 213, 10, 37, 249, 31, 249, 218, 10, 37, 249, 31, 217, 165, 10, 37, + 215, 46, 207, 28, 10, 37, 215, 46, 206, 44, 10, 37, 249, 31, 241, 99, 10, + 37, 232, 202, 242, 178, 10, 37, 249, 31, 242, 178, 10, 37, 232, 202, 211, + 103, 10, 37, 249, 31, 211, 103, 10, 37, 232, 202, 243, 255, 10, 37, 249, + 31, 243, 255, 10, 37, 210, 141, 10, 37, 232, 202, 210, 141, 10, 37, 249, + 31, 210, 141, 68, 37, 102, 68, 37, 229, 205, 68, 37, 245, 23, 68, 37, + 214, 235, 68, 37, 217, 79, 68, 37, 109, 68, 37, 105, 68, 37, 229, 231, + 68, 37, 227, 221, 68, 37, 230, 31, 68, 37, 243, 18, 68, 37, 193, 68, 37, + 130, 249, 140, 68, 37, 247, 77, 68, 37, 237, 181, 68, 37, 212, 206, 68, + 37, 222, 142, 249, 140, 68, 37, 231, 58, 68, 37, 220, 161, 68, 37, 206, + 223, 68, 37, 214, 118, 68, 37, 48, 222, 142, 249, 140, 68, 37, 239, 7, + 243, 36, 68, 37, 212, 98, 68, 37, 245, 76, 68, 37, 217, 84, 68, 37, 247, + 202, 68, 37, 220, 117, 68, 37, 252, 219, 68, 37, 226, 123, 68, 37, 243, + 36, 68, 37, 243, 120, 68, 37, 217, 105, 68, 37, 240, 19, 68, 37, 240, 20, + 214, 217, 68, 37, 242, 177, 68, 37, 249, 230, 68, 37, 206, 244, 68, 37, + 248, 49, 68, 37, 218, 106, 68, 37, 233, 64, 68, 37, 214, 215, 68, 37, + 230, 100, 68, 37, 247, 87, 68, 37, 214, 111, 68, 37, 226, 128, 68, 37, + 218, 138, 68, 37, 206, 229, 68, 37, 222, 159, 68, 37, 210, 148, 68, 37, + 243, 239, 68, 37, 215, 144, 211, 239, 68, 37, 244, 21, 247, 202, 68, 37, + 152, 213, 230, 68, 37, 118, 239, 102, 68, 37, 215, 150, 68, 37, 249, 146, + 68, 37, 214, 201, 68, 37, 249, 113, 68, 37, 214, 7, 68, 37, 239, 60, 68, + 37, 239, 122, 68, 37, 245, 26, 68, 37, 239, 107, 68, 37, 249, 130, 68, + 37, 219, 71, 68, 37, 217, 92, 68, 37, 245, 106, 68, 37, 251, 160, 68, 37, + 214, 107, 68, 37, 224, 42, 68, 37, 213, 154, 68, 37, 217, 116, 68, 37, + 226, 144, 68, 37, 211, 61, 68, 37, 230, 127, 68, 37, 213, 251, 68, 37, + 246, 7, 68, 37, 207, 50, 68, 37, 245, 52, 224, 42, 68, 37, 247, 151, 68, + 37, 241, 75, 68, 37, 247, 214, 68, 37, 214, 12, 68, 37, 207, 69, 68, 37, + 241, 219, 68, 37, 247, 210, 68, 37, 242, 35, 68, 37, 50, 206, 195, 68, + 37, 160, 211, 62, 210, 248, 68, 37, 214, 228, 68, 37, 242, 45, 68, 37, + 247, 75, 68, 37, 245, 40, 68, 37, 220, 114, 68, 37, 232, 195, 68, 37, + 227, 92, 68, 37, 211, 179, 68, 37, 213, 104, 68, 37, 229, 225, 68, 37, + 209, 175, 68, 37, 241, 249, 68, 37, 249, 177, 73, 247, 186, 68, 37, 215, + 76, 68, 37, 244, 21, 212, 92, 68, 37, 207, 23, 68, 37, 214, 243, 68, 37, + 245, 94, 68, 37, 242, 150, 68, 37, 214, 139, 68, 37, 45, 68, 37, 213, + 253, 68, 37, 214, 124, 68, 37, 211, 82, 68, 37, 239, 247, 68, 37, 248, + 176, 68, 37, 214, 30, 68, 37, 250, 142, 68, 37, 218, 203, 68, 37, 215, + 53, 68, 37, 232, 188, 68, 37, 225, 91, 68, 37, 215, 208, 68, 37, 242, 23, + 68, 37, 222, 179, 68, 37, 252, 117, 68, 37, 220, 225, 68, 37, 243, 124, + 68, 37, 249, 108, 68, 37, 227, 114, 68, 37, 226, 203, 68, 37, 216, 58, + 68, 37, 251, 247, 68, 37, 226, 139, 68, 37, 211, 107, 68, 37, 222, 130, + 68, 37, 249, 180, 68, 37, 213, 249, 68, 37, 247, 161, 68, 37, 239, 239, + 68, 37, 211, 198, 68, 37, 233, 28, 68, 37, 249, 191, 68, 37, 207, 88, + 243, 36, 68, 37, 247, 185, 68, 37, 207, 35, 68, 37, 217, 74, 68, 37, 238, + 69, 68, 37, 214, 136, 68, 37, 209, 63, 68, 37, 250, 57, 68, 37, 221, 17, + 68, 37, 250, 165, 68, 37, 215, 203, 68, 37, 219, 31, 68, 37, 218, 35, 68, + 37, 241, 148, 68, 37, 249, 179, 68, 37, 248, 189, 68, 37, 249, 207, 68, + 37, 226, 141, 68, 37, 207, 87, 68, 37, 247, 223, 68, 37, 207, 5, 68, 37, + 245, 87, 68, 37, 208, 198, 68, 37, 240, 11, 68, 37, 229, 125, 68, 37, + 240, 196, 68, 37, 226, 131, 68, 37, 214, 234, 68, 37, 215, 144, 212, 190, + 249, 218, 68, 37, 219, 83, 68, 37, 249, 186, 68, 37, 206, 218, 68, 37, + 242, 67, 68, 37, 230, 52, 68, 37, 212, 168, 230, 52, 68, 37, 230, 48, 68, + 37, 214, 164, 68, 37, 230, 53, 68, 37, 207, 9, 68, 37, 241, 166, 68, 37, + 243, 113, 68, 37, 239, 68, 68, 37, 241, 114, 68, 37, 238, 65, 68, 37, + 249, 173, 68, 37, 212, 177, 68, 37, 239, 129, 68, 37, 241, 242, 68, 37, + 217, 193, 207, 5, 68, 37, 248, 178, 68, 37, 240, 69, 68, 37, 241, 213, + 68, 37, 249, 218, 68, 37, 217, 165, 68, 37, 245, 248, 68, 37, 207, 28, + 68, 37, 239, 42, 68, 37, 206, 44, 68, 37, 226, 214, 68, 37, 249, 202, 68, + 37, 243, 46, 68, 37, 241, 99, 68, 37, 211, 34, 68, 37, 243, 241, 68, 37, + 219, 65, 68, 37, 224, 44, 68, 37, 242, 178, 68, 37, 211, 103, 68, 37, + 243, 255, 68, 37, 210, 141, 68, 37, 241, 168, 128, 245, 209, 157, 47, + 211, 130, 218, 167, 128, 245, 209, 157, 84, 211, 130, 55, 128, 245, 209, + 157, 47, 211, 130, 226, 247, 23, 218, 167, 128, 245, 209, 157, 84, 211, + 130, 226, 247, 23, 55, 128, 245, 209, 157, 241, 82, 213, 126, 128, 245, + 209, 157, 213, 127, 241, 98, 52, 128, 245, 209, 157, 213, 127, 241, 98, + 55, 128, 245, 209, 157, 213, 127, 241, 98, 230, 46, 128, 245, 209, 157, + 213, 127, 241, 98, 209, 203, 230, 46, 128, 245, 209, 157, 213, 127, 241, + 98, 209, 203, 218, 167, 128, 245, 209, 157, 213, 127, 241, 98, 229, 92, + 230, 46, 128, 245, 209, 157, 222, 85, 128, 214, 153, 128, 247, 155, 128, + 241, 82, 213, 251, 245, 84, 83, 232, 189, 233, 47, 214, 29, 93, 128, 232, + 218, 83, 128, 247, 188, 83, 128, 43, 205, 85, 47, 252, 109, 145, 48, 252, + 109, 145, 47, 50, 252, 109, 145, 48, 50, 252, 109, 145, 47, 247, 92, 145, + 48, 247, 92, 145, 47, 59, 247, 92, 145, 48, 59, 247, 92, 145, 47, 60, + 230, 16, 145, 48, 60, 230, 16, 145, 220, 174, 83, 240, 138, 83, 47, 211, + 93, 215, 204, 145, 48, 211, 93, 215, 204, 145, 47, 59, 230, 16, 145, 48, + 59, 230, 16, 145, 47, 59, 211, 93, 215, 204, 145, 48, 59, 211, 93, 215, + 204, 145, 47, 59, 49, 145, 48, 59, 49, 145, 207, 65, 246, 78, 218, 224, + 50, 220, 128, 219, 180, 83, 50, 220, 128, 219, 180, 83, 114, 50, 220, + 128, 219, 180, 83, 220, 174, 141, 242, 67, 239, 100, 223, 177, 102, 239, + 100, 223, 177, 105, 239, 100, 223, 177, 142, 239, 100, 223, 177, 139, + 239, 100, 223, 177, 168, 239, 100, 223, 177, 184, 239, 100, 223, 177, + 195, 239, 100, 223, 177, 193, 239, 100, 223, 177, 200, 128, 229, 254, + 135, 83, 128, 218, 142, 135, 83, 128, 245, 217, 135, 83, 128, 243, 17, + 135, 83, 25, 215, 41, 67, 135, 83, 25, 50, 67, 135, 83, 207, 61, 246, 78, + 79, 232, 26, 218, 252, 83, 79, 232, 26, 218, 252, 2, 208, 170, 214, 165, + 83, 79, 232, 26, 218, 252, 141, 209, 203, 239, 121, 79, 232, 26, 218, + 252, 2, 208, 170, 214, 165, 141, 209, 203, 239, 121, 79, 232, 26, 218, + 252, 141, 229, 92, 239, 121, 39, 220, 174, 83, 128, 212, 110, 229, 206, + 242, 20, 216, 40, 93, 239, 100, 223, 177, 212, 98, 239, 100, 223, 177, + 210, 123, 239, 100, 223, 177, 212, 3, 79, 128, 232, 218, 83, 227, 171, + 83, 221, 211, 252, 140, 83, 128, 54, 233, 49, 128, 160, 241, 235, 214, + 153, 161, 1, 5, 62, 161, 1, 62, 161, 1, 5, 74, 161, 1, 74, 161, 1, 5, 71, + 161, 1, 71, 161, 1, 5, 75, 161, 1, 75, 161, 1, 5, 76, 161, 1, 76, 161, 1, + 172, 161, 1, 240, 244, 161, 1, 231, 123, 161, 1, 240, 61, 161, 1, 230, + 236, 161, 1, 239, 213, 161, 1, 231, 224, 161, 1, 240, 170, 161, 1, 231, + 53, 161, 1, 240, 19, 161, 1, 217, 199, 161, 1, 205, 116, 161, 1, 215, 80, + 161, 1, 205, 40, 161, 1, 213, 203, 161, 1, 205, 9, 161, 1, 217, 86, 161, + 1, 205, 93, 161, 1, 214, 193, 161, 1, 205, 19, 161, 1, 212, 219, 161, 1, + 246, 145, 161, 1, 211, 211, 161, 1, 245, 168, 161, 1, 5, 210, 170, 161, + 1, 210, 170, 161, 1, 243, 237, 161, 1, 212, 131, 161, 1, 246, 9, 161, 1, + 124, 161, 1, 245, 51, 161, 1, 199, 161, 1, 224, 230, 161, 1, 223, 217, + 161, 1, 225, 110, 161, 1, 224, 67, 161, 1, 155, 161, 1, 250, 183, 161, 1, + 179, 161, 1, 239, 11, 161, 1, 249, 244, 161, 1, 221, 53, 161, 1, 238, 42, + 161, 1, 249, 101, 161, 1, 220, 82, 161, 1, 239, 71, 161, 1, 250, 61, 161, + 1, 221, 174, 161, 1, 238, 149, 161, 1, 249, 184, 161, 1, 220, 211, 161, + 1, 185, 161, 1, 226, 254, 161, 1, 226, 114, 161, 1, 227, 119, 161, 1, + 226, 181, 161, 1, 5, 190, 161, 1, 190, 161, 1, 5, 205, 213, 161, 1, 205, + 213, 161, 1, 5, 205, 247, 161, 1, 205, 247, 161, 1, 219, 113, 161, 1, + 218, 208, 161, 1, 218, 50, 161, 1, 219, 51, 161, 1, 218, 124, 161, 1, 5, + 207, 96, 161, 1, 207, 96, 161, 1, 207, 20, 161, 1, 207, 51, 161, 1, 206, + 250, 161, 1, 226, 33, 161, 1, 207, 148, 161, 1, 5, 172, 161, 1, 5, 231, + 224, 36, 231, 248, 208, 170, 214, 165, 83, 36, 231, 248, 216, 57, 214, + 165, 83, 231, 248, 208, 170, 214, 165, 83, 231, 248, 216, 57, 214, 165, + 83, 161, 232, 218, 83, 161, 208, 170, 232, 218, 83, 161, 245, 128, 205, + 228, 231, 248, 50, 237, 239, 64, 1, 5, 62, 64, 1, 62, 64, 1, 5, 74, 64, + 1, 74, 64, 1, 5, 71, 64, 1, 71, 64, 1, 5, 75, 64, 1, 75, 64, 1, 5, 76, + 64, 1, 76, 64, 1, 172, 64, 1, 240, 244, 64, 1, 231, 123, 64, 1, 240, 61, + 64, 1, 230, 236, 64, 1, 239, 213, 64, 1, 231, 224, 64, 1, 240, 170, 64, + 1, 231, 53, 64, 1, 240, 19, 64, 1, 217, 199, 64, 1, 205, 116, 64, 1, 215, + 80, 64, 1, 205, 40, 64, 1, 213, 203, 64, 1, 205, 9, 64, 1, 217, 86, 64, + 1, 205, 93, 64, 1, 214, 193, 64, 1, 205, 19, 64, 1, 212, 219, 64, 1, 246, + 145, 64, 1, 211, 211, 64, 1, 245, 168, 64, 1, 5, 210, 170, 64, 1, 210, + 170, 64, 1, 243, 237, 64, 1, 212, 131, 64, 1, 246, 9, 64, 1, 124, 64, 1, + 245, 51, 64, 1, 199, 64, 1, 224, 230, 64, 1, 223, 217, 64, 1, 225, 110, + 64, 1, 224, 67, 64, 1, 155, 64, 1, 250, 183, 64, 1, 179, 64, 1, 239, 11, + 64, 1, 249, 244, 64, 1, 221, 53, 64, 1, 238, 42, 64, 1, 249, 101, 64, 1, + 220, 82, 64, 1, 239, 71, 64, 1, 250, 61, 64, 1, 221, 174, 64, 1, 238, + 149, 64, 1, 249, 184, 64, 1, 220, 211, 64, 1, 185, 64, 1, 226, 254, 64, + 1, 226, 114, 64, 1, 227, 119, 64, 1, 226, 181, 64, 1, 5, 190, 64, 1, 190, + 64, 1, 5, 205, 213, 64, 1, 205, 213, 64, 1, 5, 205, 247, 64, 1, 205, 247, + 64, 1, 219, 113, 64, 1, 218, 208, 64, 1, 218, 50, 64, 1, 219, 51, 64, 1, + 218, 124, 64, 1, 5, 207, 96, 64, 1, 207, 96, 64, 1, 207, 20, 64, 1, 207, + 51, 64, 1, 206, 250, 64, 1, 226, 33, 64, 1, 207, 148, 64, 1, 5, 172, 64, + 1, 5, 231, 224, 64, 1, 209, 70, 64, 1, 208, 214, 64, 1, 209, 39, 64, 1, + 208, 173, 64, 226, 247, 245, 23, 231, 248, 220, 106, 214, 165, 83, 64, + 232, 218, 83, 64, 208, 170, 232, 218, 83, 64, 245, 128, 231, 20, 249, + 163, 1, 251, 150, 249, 163, 1, 222, 67, 249, 163, 1, 229, 28, 249, 163, + 1, 242, 139, 249, 163, 1, 246, 240, 249, 163, 1, 213, 10, 249, 163, 1, + 226, 33, 249, 163, 1, 149, 249, 163, 1, 241, 55, 249, 163, 1, 232, 76, + 249, 163, 1, 239, 155, 249, 163, 1, 232, 203, 249, 163, 1, 220, 27, 249, + 163, 1, 206, 195, 249, 163, 1, 205, 82, 249, 163, 1, 248, 111, 249, 163, + 1, 216, 4, 249, 163, 1, 137, 249, 163, 1, 205, 159, 249, 163, 1, 249, 34, + 249, 163, 1, 182, 249, 163, 1, 62, 249, 163, 1, 76, 249, 163, 1, 75, 249, + 163, 1, 243, 92, 249, 163, 1, 252, 205, 249, 163, 1, 243, 90, 249, 163, + 1, 251, 184, 249, 163, 1, 222, 97, 249, 163, 1, 252, 122, 249, 163, 1, + 243, 41, 249, 163, 1, 252, 114, 249, 163, 1, 243, 28, 249, 163, 1, 242, + 235, 249, 163, 1, 74, 249, 163, 1, 71, 249, 163, 1, 232, 216, 249, 163, + 1, 209, 148, 249, 163, 1, 225, 79, 249, 163, 1, 240, 23, 249, 163, 1, + 233, 103, 25, 1, 231, 84, 25, 1, 214, 88, 25, 1, 231, 77, 25, 1, 224, + 223, 25, 1, 224, 221, 25, 1, 224, 220, 25, 1, 211, 193, 25, 1, 214, 77, + 25, 1, 218, 198, 25, 1, 218, 193, 25, 1, 218, 190, 25, 1, 218, 183, 25, + 1, 218, 178, 25, 1, 218, 173, 25, 1, 218, 184, 25, 1, 218, 196, 25, 1, + 226, 240, 25, 1, 221, 39, 25, 1, 214, 85, 25, 1, 221, 28, 25, 1, 215, 33, + 25, 1, 214, 82, 25, 1, 233, 125, 25, 1, 247, 246, 25, 1, 214, 92, 25, 1, + 248, 54, 25, 1, 231, 143, 25, 1, 212, 15, 25, 1, 221, 76, 25, 1, 239, 3, + 25, 1, 62, 25, 1, 252, 248, 25, 1, 190, 25, 1, 206, 98, 25, 1, 243, 6, + 25, 1, 75, 25, 1, 206, 39, 25, 1, 206, 52, 25, 1, 76, 25, 1, 207, 96, 25, + 1, 207, 92, 25, 1, 222, 206, 25, 1, 205, 247, 25, 1, 71, 25, 1, 207, 38, + 25, 1, 207, 51, 25, 1, 207, 20, 25, 1, 205, 213, 25, 1, 242, 192, 25, 1, + 206, 11, 25, 1, 74, 25, 241, 232, 25, 1, 214, 86, 25, 1, 224, 213, 25, 1, + 224, 215, 25, 1, 224, 218, 25, 1, 218, 191, 25, 1, 218, 172, 25, 1, 218, + 180, 25, 1, 218, 185, 25, 1, 218, 170, 25, 1, 226, 233, 25, 1, 226, 230, + 25, 1, 226, 234, 25, 1, 232, 13, 25, 1, 221, 34, 25, 1, 221, 20, 25, 1, + 221, 26, 25, 1, 221, 23, 25, 1, 221, 37, 25, 1, 221, 21, 25, 1, 232, 11, + 25, 1, 232, 9, 25, 1, 215, 26, 25, 1, 215, 24, 25, 1, 215, 16, 25, 1, + 215, 21, 25, 1, 215, 31, 25, 1, 221, 247, 25, 1, 214, 89, 25, 1, 206, 29, + 25, 1, 206, 25, 25, 1, 206, 26, 25, 1, 232, 12, 25, 1, 214, 90, 25, 1, + 206, 35, 25, 1, 205, 241, 25, 1, 205, 240, 25, 1, 205, 243, 25, 1, 205, + 204, 25, 1, 205, 205, 25, 1, 205, 208, 25, 1, 252, 30, 25, 1, 252, 24, + 128, 252, 98, 229, 194, 83, 128, 252, 98, 218, 225, 83, 128, 252, 98, + 119, 83, 128, 252, 98, 118, 83, 128, 252, 98, 129, 83, 128, 252, 98, 241, + 125, 83, 128, 252, 98, 211, 102, 83, 128, 252, 98, 226, 247, 83, 128, + 252, 98, 249, 154, 83, 128, 252, 98, 241, 215, 83, 128, 252, 98, 217, 80, + 83, 128, 252, 98, 212, 11, 83, 128, 252, 98, 241, 118, 83, 128, 252, 98, + 239, 57, 83, 128, 252, 98, 243, 121, 83, 128, 252, 98, 227, 222, 83, 249, + 163, 1, 249, 101, 249, 163, 1, 205, 40, 249, 163, 1, 232, 162, 249, 163, + 1, 239, 213, 249, 163, 1, 243, 104, 249, 163, 1, 243, 25, 249, 163, 1, + 222, 152, 249, 163, 1, 222, 156, 249, 163, 1, 232, 243, 249, 163, 1, 252, + 100, 249, 163, 1, 233, 35, 249, 163, 1, 209, 211, 249, 163, 1, 233, 85, + 249, 163, 1, 225, 57, 249, 163, 1, 252, 199, 249, 163, 1, 251, 179, 249, + 163, 1, 252, 136, 249, 163, 1, 222, 173, 249, 163, 1, 222, 158, 249, 163, + 1, 233, 32, 249, 163, 42, 1, 222, 67, 249, 163, 42, 1, 213, 10, 249, 163, + 42, 1, 232, 76, 249, 163, 42, 1, 239, 155, 249, 163, 1, 240, 100, 249, + 163, 1, 229, 249, 249, 163, 1, 204, 245, 10, 213, 225, 213, 10, 10, 213, + 225, 207, 31, 10, 213, 225, 206, 170, 10, 213, 225, 249, 47, 10, 213, + 225, 213, 113, 10, 213, 225, 237, 229, 10, 213, 225, 237, 233, 10, 213, + 225, 238, 51, 10, 213, 225, 237, 230, 10, 213, 225, 213, 13, 10, 213, + 225, 237, 232, 10, 213, 225, 237, 228, 10, 213, 225, 238, 49, 10, 213, + 225, 237, 231, 10, 213, 225, 237, 227, 10, 213, 225, 226, 33, 10, 213, + 225, 239, 155, 10, 213, 225, 182, 10, 213, 225, 222, 67, 10, 213, 225, + 214, 156, 10, 213, 225, 246, 240, 10, 213, 225, 237, 234, 10, 213, 225, + 239, 21, 10, 213, 225, 213, 22, 10, 213, 225, 213, 92, 10, 213, 225, 214, + 40, 10, 213, 225, 216, 10, 10, 213, 225, 221, 178, 10, 213, 225, 220, 29, + 10, 213, 225, 211, 131, 10, 213, 225, 213, 12, 10, 213, 225, 213, 103, + 10, 213, 225, 237, 241, 10, 213, 225, 237, 226, 10, 213, 225, 221, 95, + 10, 213, 225, 220, 27, 64, 1, 5, 230, 236, 64, 1, 5, 215, 80, 64, 1, 5, + 213, 203, 64, 1, 5, 124, 64, 1, 5, 223, 217, 64, 1, 5, 155, 64, 1, 5, + 239, 11, 64, 1, 5, 238, 42, 64, 1, 5, 239, 71, 64, 1, 5, 238, 149, 64, 1, + 5, 226, 114, 64, 1, 5, 219, 113, 64, 1, 5, 218, 208, 64, 1, 5, 218, 50, + 64, 1, 5, 219, 51, 64, 1, 5, 218, 124, 97, 25, 231, 84, 97, 25, 224, 223, + 97, 25, 211, 193, 97, 25, 218, 198, 97, 25, 226, 240, 97, 25, 221, 39, + 97, 25, 215, 33, 97, 25, 233, 125, 97, 25, 247, 246, 97, 25, 248, 54, 97, + 25, 231, 143, 97, 25, 212, 15, 97, 25, 221, 76, 97, 25, 239, 3, 97, 25, + 231, 85, 62, 97, 25, 224, 224, 62, 97, 25, 211, 194, 62, 97, 25, 218, + 199, 62, 97, 25, 226, 241, 62, 97, 25, 221, 40, 62, 97, 25, 215, 34, 62, + 97, 25, 233, 126, 62, 97, 25, 247, 247, 62, 97, 25, 248, 55, 62, 97, 25, + 231, 144, 62, 97, 25, 212, 16, 62, 97, 25, 221, 77, 62, 97, 25, 239, 4, + 62, 97, 25, 247, 247, 71, 97, 231, 24, 157, 222, 188, 97, 231, 24, 157, + 148, 238, 42, 97, 175, 102, 97, 175, 105, 97, 175, 142, 97, 175, 139, 97, + 175, 168, 97, 175, 184, 97, 175, 195, 97, 175, 193, 97, 175, 200, 97, + 175, 212, 98, 97, 175, 226, 144, 97, 175, 241, 219, 97, 175, 207, 69, 97, + 175, 206, 237, 97, 175, 227, 63, 97, 175, 243, 120, 97, 175, 213, 154, + 97, 175, 213, 254, 97, 175, 239, 78, 97, 175, 214, 189, 97, 175, 225, + 210, 97, 175, 214, 138, 97, 175, 241, 229, 97, 175, 247, 133, 97, 175, + 230, 130, 97, 175, 218, 246, 97, 175, 248, 236, 97, 175, 213, 207, 97, + 175, 213, 136, 97, 175, 243, 16, 97, 175, 218, 238, 97, 175, 252, 152, + 97, 175, 242, 1, 97, 175, 218, 236, 97, 175, 216, 58, 97, 175, 219, 50, + 39, 175, 219, 195, 39, 175, 231, 108, 39, 175, 217, 103, 39, 175, 231, + 20, 39, 43, 212, 99, 222, 166, 60, 214, 107, 39, 43, 210, 124, 222, 166, + 60, 214, 107, 39, 43, 212, 4, 222, 166, 60, 214, 107, 39, 43, 241, 131, + 222, 166, 60, 214, 107, 39, 43, 241, 244, 222, 166, 60, 214, 107, 39, 43, + 214, 253, 222, 166, 60, 214, 107, 39, 43, 216, 18, 222, 166, 60, 214, + 107, 39, 43, 243, 80, 222, 166, 60, 214, 107, 221, 207, 53, 39, 43, 210, + 124, 102, 39, 43, 210, 124, 105, 39, 43, 210, 124, 142, 39, 43, 210, 124, + 139, 39, 43, 210, 124, 168, 39, 43, 210, 124, 184, 39, 43, 210, 124, 195, + 39, 43, 210, 124, 193, 39, 43, 210, 124, 200, 39, 43, 212, 3, 39, 43, + 212, 4, 102, 39, 43, 212, 4, 105, 39, 43, 212, 4, 142, 39, 43, 212, 4, + 139, 39, 43, 212, 4, 168, 39, 25, 231, 84, 39, 25, 224, 223, 39, 25, 211, + 193, 39, 25, 218, 198, 39, 25, 226, 240, 39, 25, 221, 39, 39, 25, 215, + 33, 39, 25, 233, 125, 39, 25, 247, 246, 39, 25, 248, 54, 39, 25, 231, + 143, 39, 25, 212, 15, 39, 25, 221, 76, 39, 25, 239, 3, 39, 25, 231, 85, + 62, 39, 25, 224, 224, 62, 39, 25, 211, 194, 62, 39, 25, 218, 199, 62, 39, + 25, 226, 241, 62, 39, 25, 221, 40, 62, 39, 25, 215, 34, 62, 39, 25, 233, + 126, 62, 39, 25, 247, 247, 62, 39, 25, 248, 55, 62, 39, 25, 231, 144, 62, + 39, 25, 212, 16, 62, 39, 25, 221, 77, 62, 39, 25, 239, 4, 62, 39, 231, + 24, 157, 248, 101, 39, 231, 24, 157, 232, 100, 39, 25, 233, 126, 71, 231, + 24, 214, 29, 93, 39, 175, 102, 39, 175, 105, 39, 175, 142, 39, 175, 139, + 39, 175, 168, 39, 175, 184, 39, 175, 195, 39, 175, 193, 39, 175, 200, 39, + 175, 212, 98, 39, 175, 226, 144, 39, 175, 241, 219, 39, 175, 207, 69, 39, + 175, 206, 237, 39, 175, 227, 63, 39, 175, 243, 120, 39, 175, 213, 154, + 39, 175, 213, 254, 39, 175, 239, 78, 39, 175, 214, 189, 39, 175, 225, + 210, 39, 175, 214, 138, 39, 175, 241, 229, 39, 175, 247, 133, 39, 175, + 230, 130, 39, 175, 217, 78, 39, 175, 227, 225, 39, 175, 242, 10, 39, 175, + 213, 166, 39, 175, 242, 171, 39, 175, 220, 124, 39, 175, 251, 188, 39, + 175, 232, 219, 39, 175, 218, 236, 39, 175, 247, 95, 39, 175, 247, 86, 39, + 175, 238, 252, 39, 175, 248, 128, 39, 175, 229, 97, 39, 175, 230, 46, 39, + 175, 218, 167, 39, 175, 227, 110, 39, 175, 219, 7, 39, 175, 213, 207, 39, + 175, 213, 136, 39, 175, 243, 16, 39, 175, 218, 238, 39, 175, 252, 152, + 39, 175, 224, 209, 39, 43, 212, 4, 184, 39, 43, 212, 4, 195, 39, 43, 212, + 4, 193, 39, 43, 212, 4, 200, 39, 43, 241, 130, 39, 43, 241, 131, 102, 39, + 43, 241, 131, 105, 39, 43, 241, 131, 142, 39, 43, 241, 131, 139, 39, 43, + 241, 131, 168, 39, 43, 241, 131, 184, 39, 43, 241, 131, 195, 39, 43, 241, + 131, 193, 39, 43, 241, 131, 200, 39, 43, 241, 243, 128, 212, 110, 16, 33, + 232, 191, 128, 212, 110, 16, 33, 242, 22, 128, 212, 110, 16, 33, 227, + 193, 128, 212, 110, 16, 33, 252, 43, 128, 212, 110, 16, 33, 227, 162, + 128, 212, 110, 16, 33, 232, 98, 128, 212, 110, 16, 33, 232, 99, 128, 212, + 110, 16, 33, 251, 180, 128, 212, 110, 16, 33, 216, 38, 128, 212, 110, 16, + 33, 222, 212, 128, 212, 110, 16, 33, 224, 30, 128, 212, 110, 16, 33, 246, + 4, 49, 239, 21, 49, 242, 231, 49, 242, 180, 229, 211, 229, 234, 53, 39, + 64, 62, 39, 64, 74, 39, 64, 71, 39, 64, 75, 39, 64, 76, 39, 64, 172, 39, + 64, 231, 123, 39, 64, 230, 236, 39, 64, 231, 224, 39, 64, 231, 53, 39, + 64, 217, 199, 39, 64, 215, 80, 39, 64, 213, 203, 39, 64, 217, 86, 39, 64, + 214, 193, 39, 64, 212, 219, 39, 64, 211, 211, 39, 64, 210, 170, 39, 64, + 212, 131, 39, 64, 124, 39, 64, 199, 39, 64, 224, 230, 39, 64, 223, 217, + 39, 64, 225, 110, 39, 64, 224, 67, 39, 64, 155, 39, 64, 239, 11, 39, 64, + 238, 42, 39, 64, 239, 71, 39, 64, 238, 149, 39, 64, 185, 39, 64, 226, + 254, 39, 64, 226, 114, 39, 64, 227, 119, 39, 64, 226, 181, 39, 64, 190, + 39, 64, 205, 213, 39, 64, 205, 247, 39, 64, 219, 113, 39, 64, 218, 208, + 39, 64, 218, 50, 39, 64, 219, 51, 39, 64, 218, 124, 39, 64, 207, 96, 39, + 64, 207, 20, 39, 64, 207, 51, 39, 64, 206, 250, 49, 252, 67, 49, 251, + 233, 49, 252, 94, 49, 253, 122, 49, 233, 37, 49, 233, 5, 49, 209, 209, + 49, 242, 205, 49, 243, 101, 49, 222, 155, 49, 222, 148, 49, 232, 39, 49, + 232, 5, 49, 232, 2, 49, 240, 200, 49, 240, 209, 49, 240, 50, 49, 240, 46, + 49, 230, 160, 49, 240, 38, 49, 231, 100, 49, 231, 99, 49, 231, 98, 49, + 231, 97, 49, 239, 184, 49, 239, 183, 49, 230, 207, 49, 230, 209, 49, 231, + 217, 49, 231, 22, 49, 231, 30, 49, 217, 180, 49, 217, 144, 49, 215, 14, + 49, 216, 43, 49, 216, 42, 49, 246, 142, 49, 245, 205, 49, 245, 24, 49, + 211, 120, 49, 225, 205, 49, 224, 31, 49, 239, 126, 49, 222, 46, 49, 222, + 45, 49, 250, 180, 49, 221, 50, 49, 221, 13, 49, 221, 14, 49, 249, 215, + 49, 238, 40, 49, 238, 36, 49, 249, 60, 49, 238, 22, 49, 239, 47, 49, 221, + 105, 49, 221, 145, 49, 239, 30, 49, 221, 141, 49, 221, 159, 49, 250, 45, + 49, 220, 200, 49, 249, 159, 49, 238, 134, 49, 220, 188, 49, 238, 126, 49, + 238, 128, 49, 227, 237, 49, 227, 233, 49, 227, 242, 49, 227, 182, 49, + 227, 209, 49, 226, 220, 49, 226, 196, 49, 226, 195, 49, 227, 99, 49, 227, + 96, 49, 227, 100, 49, 206, 108, 49, 206, 106, 49, 205, 202, 49, 218, 140, + 49, 218, 144, 49, 218, 26, 49, 218, 20, 49, 219, 4, 49, 219, 1, 49, 207, + 67, 128, 212, 110, 16, 33, 238, 59, 205, 85, 128, 212, 110, 16, 33, 238, + 59, 102, 128, 212, 110, 16, 33, 238, 59, 105, 128, 212, 110, 16, 33, 238, + 59, 142, 128, 212, 110, 16, 33, 238, 59, 139, 128, 212, 110, 16, 33, 238, + 59, 168, 128, 212, 110, 16, 33, 238, 59, 184, 128, 212, 110, 16, 33, 238, + 59, 195, 128, 212, 110, 16, 33, 238, 59, 193, 128, 212, 110, 16, 33, 238, + 59, 200, 128, 212, 110, 16, 33, 238, 59, 212, 98, 128, 212, 110, 16, 33, + 238, 59, 243, 58, 128, 212, 110, 16, 33, 238, 59, 210, 126, 128, 212, + 110, 16, 33, 238, 59, 212, 5, 128, 212, 110, 16, 33, 238, 59, 241, 119, + 128, 212, 110, 16, 33, 238, 59, 241, 247, 128, 212, 110, 16, 33, 238, 59, + 215, 4, 128, 212, 110, 16, 33, 238, 59, 216, 20, 128, 212, 110, 16, 33, + 238, 59, 243, 85, 128, 212, 110, 16, 33, 238, 59, 224, 192, 128, 212, + 110, 16, 33, 238, 59, 210, 123, 128, 212, 110, 16, 33, 238, 59, 210, 117, + 128, 212, 110, 16, 33, 238, 59, 210, 113, 128, 212, 110, 16, 33, 238, 59, + 210, 114, 128, 212, 110, 16, 33, 238, 59, 210, 119, 49, 238, 50, 49, 246, + 145, 49, 251, 184, 49, 134, 49, 222, 88, 49, 221, 179, 49, 245, 53, 49, + 245, 54, 214, 106, 49, 245, 54, 247, 35, 49, 232, 216, 49, 242, 234, 225, + 211, 239, 48, 49, 242, 234, 225, 211, 213, 33, 49, 242, 234, 225, 211, + 212, 188, 49, 242, 234, 225, 211, 227, 95, 49, 247, 88, 49, 222, 52, 252, + 124, 49, 199, 49, 226, 115, 62, 49, 185, 49, 172, 49, 231, 227, 49, 227, + 158, 49, 240, 188, 49, 248, 241, 49, 231, 226, 49, 221, 96, 49, 225, 81, + 49, 226, 115, 242, 139, 49, 226, 115, 241, 55, 49, 227, 39, 49, 231, 169, + 49, 237, 234, 49, 231, 125, 49, 227, 0, 49, 240, 63, 49, 211, 213, 49, + 226, 115, 149, 49, 226, 189, 49, 245, 63, 49, 231, 66, 49, 241, 164, 49, + 224, 105, 49, 226, 115, 229, 28, 49, 226, 186, 49, 247, 175, 49, 231, 60, + 49, 226, 187, 214, 106, 49, 247, 176, 214, 106, 49, 229, 29, 214, 106, + 49, 231, 61, 214, 106, 49, 226, 187, 247, 35, 49, 247, 176, 247, 35, 49, + 229, 29, 247, 35, 49, 231, 61, 247, 35, 49, 229, 29, 131, 182, 49, 229, + 29, 131, 218, 1, 214, 106, 49, 179, 49, 231, 15, 49, 226, 118, 49, 239, + 251, 49, 219, 100, 49, 219, 101, 131, 182, 49, 219, 101, 131, 218, 1, + 214, 106, 49, 220, 95, 49, 223, 255, 49, 226, 115, 182, 49, 226, 116, 49, + 220, 47, 49, 223, 155, 49, 226, 115, 209, 148, 49, 226, 57, 49, 230, 198, + 49, 226, 58, 227, 99, 49, 220, 46, 49, 223, 154, 49, 226, 115, 207, 129, + 49, 226, 51, 49, 230, 196, 49, 226, 52, 227, 99, 49, 232, 77, 222, 192, + 49, 229, 29, 222, 192, 49, 252, 136, 49, 249, 136, 49, 248, 172, 49, 248, + 149, 49, 249, 35, 131, 231, 169, 49, 247, 174, 49, 246, 63, 49, 239, 168, + 49, 155, 49, 238, 51, 49, 233, 68, 49, 231, 73, 49, 231, 61, 248, 212, + 49, 230, 238, 49, 229, 147, 49, 229, 146, 49, 229, 135, 49, 229, 43, 49, + 227, 159, 214, 215, 49, 226, 219, 49, 226, 170, 49, 221, 94, 49, 220, + 214, 49, 220, 156, 49, 220, 154, 49, 214, 100, 49, 213, 117, 49, 207, 53, + 49, 209, 149, 131, 229, 28, 49, 32, 131, 229, 28, 128, 212, 110, 16, 33, + 246, 67, 102, 128, 212, 110, 16, 33, 246, 67, 105, 128, 212, 110, 16, 33, + 246, 67, 142, 128, 212, 110, 16, 33, 246, 67, 139, 128, 212, 110, 16, 33, + 246, 67, 168, 128, 212, 110, 16, 33, 246, 67, 184, 128, 212, 110, 16, 33, + 246, 67, 195, 128, 212, 110, 16, 33, 246, 67, 193, 128, 212, 110, 16, 33, + 246, 67, 200, 128, 212, 110, 16, 33, 246, 67, 212, 98, 128, 212, 110, 16, + 33, 246, 67, 243, 58, 128, 212, 110, 16, 33, 246, 67, 210, 126, 128, 212, + 110, 16, 33, 246, 67, 212, 5, 128, 212, 110, 16, 33, 246, 67, 241, 119, + 128, 212, 110, 16, 33, 246, 67, 241, 247, 128, 212, 110, 16, 33, 246, 67, + 215, 4, 128, 212, 110, 16, 33, 246, 67, 216, 20, 128, 212, 110, 16, 33, + 246, 67, 243, 85, 128, 212, 110, 16, 33, 246, 67, 224, 192, 128, 212, + 110, 16, 33, 246, 67, 210, 123, 128, 212, 110, 16, 33, 246, 67, 210, 117, + 128, 212, 110, 16, 33, 246, 67, 210, 113, 128, 212, 110, 16, 33, 246, 67, + 210, 114, 128, 212, 110, 16, 33, 246, 67, 210, 119, 128, 212, 110, 16, + 33, 246, 67, 210, 120, 128, 212, 110, 16, 33, 246, 67, 210, 115, 128, + 212, 110, 16, 33, 246, 67, 210, 116, 128, 212, 110, 16, 33, 246, 67, 210, + 122, 128, 212, 110, 16, 33, 246, 67, 210, 118, 128, 212, 110, 16, 33, + 246, 67, 212, 3, 128, 212, 110, 16, 33, 246, 67, 212, 2, 49, 240, 226, + 239, 24, 33, 212, 42, 247, 69, 239, 56, 239, 24, 33, 212, 42, 219, 44, + 243, 120, 239, 24, 33, 245, 138, 251, 200, 212, 42, 250, 40, 239, 24, 33, + 205, 226, 241, 156, 239, 24, 33, 207, 89, 239, 24, 33, 247, 136, 239, 24, + 33, 212, 42, 251, 254, 239, 24, 33, 238, 141, 211, 126, 239, 24, 33, 5, + 212, 175, 239, 24, 33, 211, 63, 239, 24, 33, 221, 172, 239, 24, 33, 214, + 28, 239, 24, 33, 242, 12, 239, 24, 33, 239, 232, 220, 177, 239, 24, 33, + 226, 174, 239, 24, 33, 243, 15, 239, 24, 33, 241, 157, 239, 24, 33, 206, + 230, 222, 166, 212, 42, 246, 5, 239, 24, 33, 252, 47, 239, 24, 33, 247, + 117, 239, 24, 33, 249, 208, 211, 232, 239, 24, 33, 239, 249, 239, 24, 33, + 214, 120, 252, 66, 239, 24, 33, 218, 228, 239, 24, 33, 233, 31, 239, 24, + 33, 239, 232, 212, 175, 239, 24, 33, 226, 124, 247, 90, 239, 24, 33, 239, + 232, 220, 134, 239, 24, 33, 212, 42, 253, 26, 207, 69, 239, 24, 33, 212, + 42, 247, 200, 241, 219, 239, 24, 33, 233, 44, 239, 24, 33, 243, 216, 239, + 24, 33, 218, 231, 239, 24, 33, 239, 232, 220, 161, 239, 24, 33, 220, 112, + 239, 24, 33, 246, 83, 73, 212, 42, 229, 223, 239, 24, 33, 212, 42, 242, + 48, 239, 24, 33, 222, 128, 239, 24, 33, 222, 218, 239, 24, 33, 245, 232, + 239, 24, 33, 245, 253, 239, 24, 33, 233, 59, 239, 24, 33, 249, 125, 239, + 24, 33, 247, 157, 211, 130, 227, 102, 239, 24, 33, 240, 195, 211, 126, + 239, 24, 33, 220, 56, 209, 197, 239, 24, 33, 222, 127, 239, 24, 33, 212, + 42, 207, 40, 239, 24, 33, 218, 219, 239, 24, 33, 212, 42, 248, 178, 239, + 24, 33, 212, 42, 251, 250, 211, 227, 239, 24, 33, 212, 42, 231, 218, 214, + 2, 226, 128, 239, 24, 33, 245, 200, 239, 24, 33, 212, 42, 227, 184, 227, + 238, 239, 24, 33, 253, 27, 239, 24, 33, 212, 42, 207, 84, 239, 24, 33, + 212, 42, 240, 153, 207, 9, 239, 24, 33, 212, 42, 232, 106, 230, 111, 239, + 24, 33, 245, 91, 239, 24, 33, 229, 212, 239, 24, 33, 233, 34, 210, 247, + 239, 24, 33, 5, 220, 134, 239, 24, 33, 252, 221, 247, 148, 239, 24, 33, + 250, 43, 247, 148, 9, 4, 232, 220, 9, 4, 232, 212, 9, 4, 74, 9, 4, 232, + 246, 9, 4, 233, 127, 9, 4, 233, 110, 9, 4, 233, 129, 9, 4, 233, 128, 9, + 4, 251, 199, 9, 4, 251, 161, 9, 4, 62, 9, 4, 252, 68, 9, 4, 209, 207, 9, + 4, 209, 210, 9, 4, 209, 208, 9, 4, 222, 103, 9, 4, 222, 76, 9, 4, 76, 9, + 4, 222, 143, 9, 4, 242, 172, 9, 4, 75, 9, 4, 206, 216, 9, 4, 249, 209, 9, + 4, 249, 206, 9, 4, 249, 244, 9, 4, 249, 219, 9, 4, 249, 233, 9, 4, 249, + 232, 9, 4, 249, 235, 9, 4, 249, 234, 9, 4, 250, 108, 9, 4, 250, 100, 9, + 4, 250, 183, 9, 4, 250, 130, 9, 4, 249, 71, 9, 4, 249, 75, 9, 4, 249, 72, + 9, 4, 249, 158, 9, 4, 249, 140, 9, 4, 249, 184, 9, 4, 249, 164, 9, 4, + 250, 3, 9, 4, 250, 61, 9, 4, 250, 15, 9, 4, 249, 56, 9, 4, 249, 52, 9, 4, + 249, 101, 9, 4, 249, 70, 9, 4, 249, 64, 9, 4, 249, 68, 9, 4, 249, 40, 9, + 4, 249, 38, 9, 4, 249, 45, 9, 4, 249, 43, 9, 4, 249, 41, 9, 4, 249, 42, + 9, 4, 220, 247, 9, 4, 220, 243, 9, 4, 221, 53, 9, 4, 221, 3, 9, 4, 221, + 19, 9, 4, 221, 46, 9, 4, 221, 42, 9, 4, 221, 195, 9, 4, 221, 184, 9, 4, + 179, 9, 4, 221, 236, 9, 4, 220, 66, 9, 4, 220, 68, 9, 4, 220, 67, 9, 4, + 220, 170, 9, 4, 220, 159, 9, 4, 220, 211, 9, 4, 220, 183, 9, 4, 220, 52, + 9, 4, 220, 48, 9, 4, 220, 82, 9, 4, 220, 65, 9, 4, 220, 57, 9, 4, 220, + 63, 9, 4, 220, 31, 9, 4, 220, 30, 9, 4, 220, 35, 9, 4, 220, 34, 9, 4, + 220, 32, 9, 4, 220, 33, 9, 4, 250, 82, 9, 4, 250, 81, 9, 4, 250, 88, 9, + 4, 250, 83, 9, 4, 250, 85, 9, 4, 250, 84, 9, 4, 250, 87, 9, 4, 250, 86, + 9, 4, 250, 94, 9, 4, 250, 93, 9, 4, 250, 97, 9, 4, 250, 95, 9, 4, 250, + 73, 9, 4, 250, 75, 9, 4, 250, 74, 9, 4, 250, 78, 9, 4, 250, 77, 9, 4, + 250, 80, 9, 4, 250, 79, 9, 4, 250, 89, 9, 4, 250, 92, 9, 4, 250, 90, 9, + 4, 250, 69, 9, 4, 250, 68, 9, 4, 250, 76, 9, 4, 250, 72, 9, 4, 250, 70, + 9, 4, 250, 71, 9, 4, 250, 65, 9, 4, 250, 64, 9, 4, 250, 67, 9, 4, 250, + 66, 9, 4, 225, 173, 9, 4, 225, 172, 9, 4, 225, 178, 9, 4, 225, 174, 9, 4, + 225, 175, 9, 4, 225, 177, 9, 4, 225, 176, 9, 4, 225, 181, 9, 4, 225, 180, + 9, 4, 225, 183, 9, 4, 225, 182, 9, 4, 225, 169, 9, 4, 225, 168, 9, 4, + 225, 171, 9, 4, 225, 170, 9, 4, 225, 162, 9, 4, 225, 161, 9, 4, 225, 166, + 9, 4, 225, 165, 9, 4, 225, 163, 9, 4, 225, 164, 9, 4, 225, 156, 9, 4, + 225, 155, 9, 4, 225, 160, 9, 4, 225, 159, 9, 4, 225, 157, 9, 4, 225, 158, + 9, 4, 238, 193, 9, 4, 238, 192, 9, 4, 238, 198, 9, 4, 238, 194, 9, 4, + 238, 195, 9, 4, 238, 197, 9, 4, 238, 196, 9, 4, 238, 201, 9, 4, 238, 200, + 9, 4, 238, 203, 9, 4, 238, 202, 9, 4, 238, 184, 9, 4, 238, 186, 9, 4, + 238, 185, 9, 4, 238, 189, 9, 4, 238, 188, 9, 4, 238, 191, 9, 4, 238, 190, + 9, 4, 238, 180, 9, 4, 238, 179, 9, 4, 238, 187, 9, 4, 238, 183, 9, 4, + 238, 181, 9, 4, 238, 182, 9, 4, 238, 174, 9, 4, 238, 178, 9, 4, 238, 177, + 9, 4, 238, 175, 9, 4, 238, 176, 9, 4, 226, 192, 9, 4, 226, 191, 9, 4, + 226, 254, 9, 4, 226, 198, 9, 4, 226, 226, 9, 4, 226, 244, 9, 4, 226, 242, + 9, 4, 227, 170, 9, 4, 227, 165, 9, 4, 185, 9, 4, 227, 205, 9, 4, 226, 83, + 9, 4, 226, 82, 9, 4, 226, 86, 9, 4, 226, 84, 9, 4, 226, 137, 9, 4, 226, + 120, 9, 4, 226, 181, 9, 4, 226, 142, 9, 4, 227, 50, 9, 4, 227, 119, 9, 4, + 226, 63, 9, 4, 226, 59, 9, 4, 226, 114, 9, 4, 226, 79, 9, 4, 226, 72, 9, + 4, 226, 77, 9, 4, 226, 36, 9, 4, 226, 35, 9, 4, 226, 41, 9, 4, 226, 38, + 9, 4, 241, 206, 9, 4, 241, 201, 9, 4, 241, 250, 9, 4, 241, 221, 9, 4, + 242, 41, 9, 4, 242, 32, 9, 4, 242, 73, 9, 4, 242, 44, 9, 4, 241, 117, 9, + 4, 241, 162, 9, 4, 241, 143, 9, 4, 241, 71, 9, 4, 241, 70, 9, 4, 241, 88, + 9, 4, 241, 76, 9, 4, 241, 74, 9, 4, 241, 75, 9, 4, 241, 58, 9, 4, 241, + 57, 9, 4, 241, 61, 9, 4, 241, 59, 9, 4, 208, 180, 9, 4, 208, 175, 9, 4, + 208, 214, 9, 4, 208, 189, 9, 4, 208, 203, 9, 4, 208, 200, 9, 4, 208, 206, + 9, 4, 208, 205, 9, 4, 209, 47, 9, 4, 209, 42, 9, 4, 209, 70, 9, 4, 209, + 59, 9, 4, 208, 157, 9, 4, 208, 153, 9, 4, 208, 173, 9, 4, 208, 159, 9, 4, + 208, 217, 9, 4, 209, 28, 9, 4, 207, 142, 9, 4, 207, 140, 9, 4, 207, 148, + 9, 4, 207, 145, 9, 4, 207, 143, 9, 4, 207, 144, 9, 4, 207, 133, 9, 4, + 207, 132, 9, 4, 207, 137, 9, 4, 207, 136, 9, 4, 207, 134, 9, 4, 207, 135, + 9, 4, 245, 85, 9, 4, 245, 72, 9, 4, 245, 168, 9, 4, 245, 110, 9, 4, 245, + 143, 9, 4, 245, 148, 9, 4, 245, 147, 9, 4, 246, 74, 9, 4, 246, 68, 9, 4, + 246, 145, 9, 4, 246, 94, 9, 4, 243, 221, 9, 4, 243, 222, 9, 4, 245, 23, + 9, 4, 244, 5, 9, 4, 245, 51, 9, 4, 245, 25, 9, 4, 245, 198, 9, 4, 246, 9, + 9, 4, 245, 218, 9, 4, 243, 212, 9, 4, 243, 210, 9, 4, 243, 237, 9, 4, + 243, 220, 9, 4, 243, 215, 9, 4, 243, 218, 9, 4, 211, 156, 9, 4, 211, 149, + 9, 4, 211, 211, 9, 4, 211, 166, 9, 4, 211, 201, 9, 4, 211, 203, 9, 4, + 211, 202, 9, 4, 212, 156, 9, 4, 212, 142, 9, 4, 212, 219, 9, 4, 212, 166, + 9, 4, 210, 153, 9, 4, 210, 152, 9, 4, 210, 155, 9, 4, 210, 154, 9, 4, + 211, 91, 9, 4, 211, 85, 9, 4, 124, 9, 4, 211, 101, 9, 4, 212, 62, 9, 4, + 212, 131, 9, 4, 212, 87, 9, 4, 210, 138, 9, 4, 210, 133, 9, 4, 210, 170, + 9, 4, 210, 151, 9, 4, 210, 139, 9, 4, 210, 149, 9, 4, 246, 26, 9, 4, 246, + 25, 9, 4, 246, 31, 9, 4, 246, 27, 9, 4, 246, 28, 9, 4, 246, 30, 9, 4, + 246, 29, 9, 4, 246, 47, 9, 4, 246, 46, 9, 4, 246, 54, 9, 4, 246, 48, 9, + 4, 246, 16, 9, 4, 246, 18, 9, 4, 246, 17, 9, 4, 246, 21, 9, 4, 246, 20, + 9, 4, 246, 24, 9, 4, 246, 22, 9, 4, 246, 39, 9, 4, 246, 42, 9, 4, 246, + 40, 9, 4, 246, 12, 9, 4, 246, 11, 9, 4, 246, 19, 9, 4, 246, 15, 9, 4, + 246, 13, 9, 4, 246, 14, 9, 4, 225, 129, 9, 4, 225, 128, 9, 4, 225, 136, + 9, 4, 225, 131, 9, 4, 225, 132, 9, 4, 225, 133, 9, 4, 225, 145, 9, 4, + 225, 144, 9, 4, 225, 151, 9, 4, 225, 146, 9, 4, 225, 121, 9, 4, 225, 120, + 9, 4, 225, 127, 9, 4, 225, 122, 9, 4, 225, 137, 9, 4, 225, 143, 9, 4, + 225, 141, 9, 4, 225, 113, 9, 4, 225, 112, 9, 4, 225, 118, 9, 4, 225, 116, + 9, 4, 225, 114, 9, 4, 225, 115, 9, 4, 238, 159, 9, 4, 238, 158, 9, 4, + 238, 165, 9, 4, 238, 160, 9, 4, 238, 162, 9, 4, 238, 161, 9, 4, 238, 164, + 9, 4, 238, 163, 9, 4, 238, 171, 9, 4, 238, 169, 9, 4, 238, 173, 9, 4, + 238, 172, 9, 4, 238, 152, 9, 4, 238, 153, 9, 4, 238, 156, 9, 4, 238, 155, + 9, 4, 238, 157, 9, 4, 238, 166, 9, 4, 238, 168, 9, 4, 238, 167, 9, 4, + 238, 151, 9, 4, 224, 184, 9, 4, 224, 182, 9, 4, 224, 230, 9, 4, 224, 187, + 9, 4, 224, 212, 9, 4, 224, 226, 9, 4, 224, 225, 9, 4, 225, 187, 9, 4, + 199, 9, 4, 225, 202, 9, 4, 223, 165, 9, 4, 223, 167, 9, 4, 223, 166, 9, + 4, 224, 42, 9, 4, 224, 27, 9, 4, 224, 67, 9, 4, 224, 52, 9, 4, 225, 83, + 9, 4, 225, 110, 9, 4, 225, 96, 9, 4, 223, 160, 9, 4, 223, 156, 9, 4, 223, + 217, 9, 4, 223, 164, 9, 4, 223, 162, 9, 4, 223, 163, 9, 4, 238, 224, 9, + 4, 238, 223, 9, 4, 238, 229, 9, 4, 238, 225, 9, 4, 238, 226, 9, 4, 238, + 228, 9, 4, 238, 227, 9, 4, 238, 235, 9, 4, 238, 233, 9, 4, 238, 237, 9, + 4, 238, 236, 9, 4, 238, 216, 9, 4, 238, 218, 9, 4, 238, 217, 9, 4, 238, + 220, 9, 4, 238, 222, 9, 4, 238, 221, 9, 4, 238, 230, 9, 4, 238, 232, 9, + 4, 238, 231, 9, 4, 238, 212, 9, 4, 238, 211, 9, 4, 238, 219, 9, 4, 238, + 215, 9, 4, 238, 213, 9, 4, 238, 214, 9, 4, 238, 206, 9, 4, 238, 205, 9, + 4, 238, 210, 9, 4, 238, 209, 9, 4, 238, 207, 9, 4, 238, 208, 9, 4, 229, + 184, 9, 4, 229, 177, 9, 4, 229, 235, 9, 4, 229, 193, 9, 4, 229, 227, 9, + 4, 229, 226, 9, 4, 229, 230, 9, 4, 229, 228, 9, 4, 230, 80, 9, 4, 230, + 69, 9, 4, 230, 141, 9, 4, 230, 89, 9, 4, 229, 60, 9, 4, 229, 59, 9, 4, + 229, 62, 9, 4, 229, 61, 9, 4, 229, 103, 9, 4, 229, 90, 9, 4, 229, 144, 9, + 4, 229, 108, 9, 4, 229, 252, 9, 4, 230, 58, 9, 4, 230, 13, 9, 4, 229, 54, + 9, 4, 229, 52, 9, 4, 229, 81, 9, 4, 229, 58, 9, 4, 229, 56, 9, 4, 229, + 57, 9, 4, 229, 33, 9, 4, 229, 32, 9, 4, 229, 42, 9, 4, 229, 36, 9, 4, + 229, 34, 9, 4, 229, 35, 9, 4, 240, 34, 9, 4, 240, 33, 9, 4, 240, 61, 9, + 4, 240, 45, 9, 4, 240, 53, 9, 4, 240, 52, 9, 4, 240, 55, 9, 4, 240, 54, + 9, 4, 240, 197, 9, 4, 240, 192, 9, 4, 240, 244, 9, 4, 240, 207, 9, 4, + 239, 189, 9, 4, 239, 188, 9, 4, 239, 191, 9, 4, 239, 190, 9, 4, 239, 254, + 9, 4, 239, 252, 9, 4, 240, 19, 9, 4, 240, 6, 9, 4, 240, 139, 9, 4, 240, + 137, 9, 4, 240, 170, 9, 4, 240, 150, 9, 4, 239, 178, 9, 4, 239, 177, 9, + 4, 239, 213, 9, 4, 239, 187, 9, 4, 239, 179, 9, 4, 239, 186, 9, 4, 231, + 89, 9, 4, 231, 86, 9, 4, 231, 123, 9, 4, 231, 103, 9, 4, 231, 113, 9, 4, + 231, 116, 9, 4, 231, 114, 9, 4, 231, 249, 9, 4, 231, 232, 9, 4, 172, 9, + 4, 232, 20, 9, 4, 230, 214, 9, 4, 230, 219, 9, 4, 230, 216, 9, 4, 231, + 21, 9, 4, 231, 16, 9, 4, 231, 53, 9, 4, 231, 28, 9, 4, 231, 193, 9, 4, + 231, 176, 9, 4, 231, 224, 9, 4, 231, 197, 9, 4, 230, 203, 9, 4, 230, 199, + 9, 4, 230, 236, 9, 4, 230, 213, 9, 4, 230, 206, 9, 4, 230, 210, 9, 4, + 240, 121, 9, 4, 240, 120, 9, 4, 240, 125, 9, 4, 240, 122, 9, 4, 240, 124, + 9, 4, 240, 123, 9, 4, 240, 132, 9, 4, 240, 131, 9, 4, 240, 135, 9, 4, + 240, 133, 9, 4, 240, 112, 9, 4, 240, 111, 9, 4, 240, 114, 9, 4, 240, 113, + 9, 4, 240, 117, 9, 4, 240, 116, 9, 4, 240, 119, 9, 4, 240, 118, 9, 4, + 240, 127, 9, 4, 240, 126, 9, 4, 240, 130, 9, 4, 240, 128, 9, 4, 240, 107, + 9, 4, 240, 106, 9, 4, 240, 115, 9, 4, 240, 110, 9, 4, 240, 108, 9, 4, + 240, 109, 9, 4, 227, 17, 9, 4, 227, 18, 9, 4, 227, 36, 9, 4, 227, 35, 9, + 4, 227, 38, 9, 4, 227, 37, 9, 4, 227, 8, 9, 4, 227, 10, 9, 4, 227, 9, 9, + 4, 227, 13, 9, 4, 227, 12, 9, 4, 227, 15, 9, 4, 227, 14, 9, 4, 227, 19, + 9, 4, 227, 21, 9, 4, 227, 20, 9, 4, 227, 4, 9, 4, 227, 3, 9, 4, 227, 11, + 9, 4, 227, 7, 9, 4, 227, 5, 9, 4, 227, 6, 9, 4, 237, 251, 9, 4, 237, 250, + 9, 4, 238, 1, 9, 4, 237, 252, 9, 4, 237, 254, 9, 4, 237, 253, 9, 4, 238, + 0, 9, 4, 237, 255, 9, 4, 238, 6, 9, 4, 238, 5, 9, 4, 238, 8, 9, 4, 238, + 7, 9, 4, 237, 243, 9, 4, 237, 242, 9, 4, 237, 245, 9, 4, 237, 244, 9, 4, + 237, 247, 9, 4, 237, 246, 9, 4, 237, 249, 9, 4, 237, 248, 9, 4, 238, 2, + 9, 4, 238, 4, 9, 4, 238, 3, 9, 4, 225, 22, 9, 4, 225, 24, 9, 4, 225, 23, + 9, 4, 225, 67, 9, 4, 225, 65, 9, 4, 225, 77, 9, 4, 225, 70, 9, 4, 224, + 240, 9, 4, 224, 239, 9, 4, 224, 241, 9, 4, 224, 250, 9, 4, 224, 247, 9, + 4, 225, 2, 9, 4, 224, 252, 9, 4, 225, 58, 9, 4, 225, 64, 9, 4, 225, 60, + 9, 4, 238, 242, 9, 4, 238, 253, 9, 4, 239, 6, 9, 4, 239, 86, 9, 4, 239, + 76, 9, 4, 155, 9, 4, 239, 97, 9, 4, 238, 24, 9, 4, 238, 23, 9, 4, 238, + 26, 9, 4, 238, 25, 9, 4, 238, 62, 9, 4, 238, 53, 9, 4, 238, 149, 9, 4, + 238, 124, 9, 4, 239, 26, 9, 4, 239, 71, 9, 4, 239, 38, 9, 4, 207, 72, 9, + 4, 207, 57, 9, 4, 207, 96, 9, 4, 207, 81, 9, 4, 206, 205, 9, 4, 206, 207, + 9, 4, 206, 206, 9, 4, 206, 224, 9, 4, 206, 250, 9, 4, 206, 233, 9, 4, + 207, 32, 9, 4, 207, 51, 9, 4, 207, 37, 9, 4, 205, 26, 9, 4, 205, 25, 9, + 4, 205, 40, 9, 4, 205, 28, 9, 4, 205, 33, 9, 4, 205, 35, 9, 4, 205, 34, + 9, 4, 205, 101, 9, 4, 205, 98, 9, 4, 205, 116, 9, 4, 205, 105, 9, 4, 205, + 2, 9, 4, 205, 4, 9, 4, 205, 3, 9, 4, 205, 15, 9, 4, 205, 14, 9, 4, 205, + 19, 9, 4, 205, 16, 9, 4, 205, 83, 9, 4, 205, 93, 9, 4, 205, 87, 9, 4, + 204, 254, 9, 4, 204, 253, 9, 4, 205, 9, 9, 4, 205, 1, 9, 4, 204, 255, 9, + 4, 205, 0, 9, 4, 204, 240, 9, 4, 204, 239, 9, 4, 204, 245, 9, 4, 204, + 243, 9, 4, 204, 241, 9, 4, 204, 242, 9, 4, 247, 225, 9, 4, 247, 219, 9, + 4, 247, 251, 9, 4, 247, 235, 9, 4, 247, 248, 9, 4, 247, 242, 9, 4, 247, + 250, 9, 4, 247, 249, 9, 4, 248, 183, 9, 4, 248, 175, 9, 4, 249, 1, 9, 4, + 248, 213, 9, 4, 247, 31, 9, 4, 247, 33, 9, 4, 247, 32, 9, 4, 247, 84, 9, + 4, 247, 74, 9, 4, 247, 174, 9, 4, 247, 100, 9, 4, 248, 113, 9, 4, 248, + 148, 9, 4, 248, 118, 9, 4, 247, 10, 9, 4, 247, 8, 9, 4, 247, 40, 9, 4, + 247, 29, 9, 4, 247, 16, 9, 4, 247, 28, 9, 4, 246, 243, 9, 4, 246, 242, 9, + 4, 246, 255, 9, 4, 246, 249, 9, 4, 246, 244, 9, 4, 246, 246, 9, 4, 204, + 223, 9, 4, 204, 222, 9, 4, 204, 229, 9, 4, 204, 224, 9, 4, 204, 226, 9, + 4, 204, 225, 9, 4, 204, 228, 9, 4, 204, 227, 9, 4, 204, 235, 9, 4, 204, + 234, 9, 4, 204, 238, 9, 4, 204, 236, 9, 4, 204, 219, 9, 4, 204, 221, 9, + 4, 204, 220, 9, 4, 204, 230, 9, 4, 204, 233, 9, 4, 204, 231, 9, 4, 204, + 212, 9, 4, 204, 216, 9, 4, 204, 215, 9, 4, 204, 213, 9, 4, 204, 214, 9, + 4, 204, 206, 9, 4, 204, 205, 9, 4, 204, 211, 9, 4, 204, 209, 9, 4, 204, + 207, 9, 4, 204, 208, 9, 4, 223, 78, 9, 4, 223, 77, 9, 4, 223, 83, 9, 4, + 223, 79, 9, 4, 223, 80, 9, 4, 223, 82, 9, 4, 223, 81, 9, 4, 223, 88, 9, + 4, 223, 87, 9, 4, 223, 91, 9, 4, 223, 90, 9, 4, 223, 71, 9, 4, 223, 72, + 9, 4, 223, 75, 9, 4, 223, 76, 9, 4, 223, 84, 9, 4, 223, 86, 9, 4, 223, + 66, 9, 4, 223, 74, 9, 4, 223, 70, 9, 4, 223, 67, 9, 4, 223, 68, 9, 4, + 223, 61, 9, 4, 223, 60, 9, 4, 223, 65, 9, 4, 223, 64, 9, 4, 223, 62, 9, + 4, 223, 63, 9, 4, 215, 12, 9, 4, 184, 9, 4, 215, 80, 9, 4, 215, 15, 9, 4, + 215, 69, 9, 4, 215, 72, 9, 4, 215, 70, 9, 4, 217, 133, 9, 4, 217, 119, 9, + 4, 217, 199, 9, 4, 217, 141, 9, 4, 213, 144, 9, 4, 213, 146, 9, 4, 213, + 145, 9, 4, 214, 168, 9, 4, 214, 158, 9, 4, 214, 193, 9, 4, 214, 172, 9, + 4, 216, 15, 9, 4, 217, 86, 9, 4, 216, 41, 9, 4, 213, 121, 9, 4, 213, 118, + 9, 4, 213, 203, 9, 4, 213, 143, 9, 4, 213, 125, 9, 4, 213, 133, 9, 4, + 213, 24, 9, 4, 213, 23, 9, 4, 213, 91, 9, 4, 213, 32, 9, 4, 213, 26, 9, + 4, 213, 31, 9, 4, 214, 58, 9, 4, 214, 57, 9, 4, 214, 64, 9, 4, 214, 59, + 9, 4, 214, 61, 9, 4, 214, 63, 9, 4, 214, 62, 9, 4, 214, 73, 9, 4, 214, + 71, 9, 4, 214, 96, 9, 4, 214, 74, 9, 4, 214, 53, 9, 4, 214, 52, 9, 4, + 214, 56, 9, 4, 214, 54, 9, 4, 214, 67, 9, 4, 214, 70, 9, 4, 214, 68, 9, + 4, 214, 49, 9, 4, 214, 47, 9, 4, 214, 51, 9, 4, 214, 50, 9, 4, 214, 42, + 9, 4, 214, 41, 9, 4, 214, 46, 9, 4, 214, 45, 9, 4, 214, 43, 9, 4, 214, + 44, 9, 4, 205, 76, 9, 4, 205, 75, 9, 4, 205, 81, 9, 4, 205, 78, 9, 4, + 205, 55, 9, 4, 205, 57, 9, 4, 205, 56, 9, 4, 205, 60, 9, 4, 205, 59, 9, + 4, 205, 64, 9, 4, 205, 61, 9, 4, 205, 69, 9, 4, 205, 68, 9, 4, 205, 72, + 9, 4, 205, 70, 9, 4, 205, 51, 9, 4, 205, 50, 9, 4, 205, 58, 9, 4, 205, + 54, 9, 4, 205, 52, 9, 4, 205, 53, 9, 4, 205, 43, 9, 4, 205, 42, 9, 4, + 205, 47, 9, 4, 205, 46, 9, 4, 205, 44, 9, 4, 205, 45, 9, 4, 248, 88, 9, + 4, 248, 84, 9, 4, 248, 110, 9, 4, 248, 97, 9, 4, 248, 10, 9, 4, 248, 9, + 9, 4, 248, 12, 9, 4, 248, 11, 9, 4, 248, 25, 9, 4, 248, 24, 9, 4, 248, + 32, 9, 4, 248, 27, 9, 4, 248, 63, 9, 4, 248, 61, 9, 4, 248, 82, 9, 4, + 248, 70, 9, 4, 248, 4, 9, 4, 248, 14, 9, 4, 248, 8, 9, 4, 248, 5, 9, 4, + 248, 7, 9, 4, 247, 253, 9, 4, 247, 252, 9, 4, 248, 1, 9, 4, 248, 0, 9, 4, + 247, 254, 9, 4, 247, 255, 9, 4, 218, 85, 9, 4, 218, 89, 9, 4, 218, 68, 9, + 4, 218, 69, 9, 4, 218, 72, 9, 4, 218, 71, 9, 4, 218, 75, 9, 4, 218, 73, + 9, 4, 218, 79, 9, 4, 218, 78, 9, 4, 218, 84, 9, 4, 218, 80, 9, 4, 218, + 64, 9, 4, 218, 62, 9, 4, 218, 70, 9, 4, 218, 67, 9, 4, 218, 65, 9, 4, + 218, 66, 9, 4, 218, 57, 9, 4, 218, 56, 9, 4, 218, 61, 9, 4, 218, 60, 9, + 4, 218, 58, 9, 4, 218, 59, 9, 4, 224, 22, 9, 4, 224, 21, 9, 4, 224, 24, + 9, 4, 224, 23, 9, 4, 224, 13, 9, 4, 224, 15, 9, 4, 224, 14, 9, 4, 224, + 17, 9, 4, 224, 16, 9, 4, 224, 20, 9, 4, 224, 19, 9, 4, 224, 7, 9, 4, 224, + 6, 9, 4, 224, 12, 9, 4, 224, 10, 9, 4, 224, 8, 9, 4, 224, 9, 9, 4, 224, + 1, 9, 4, 224, 0, 9, 4, 224, 5, 9, 4, 224, 4, 9, 4, 224, 2, 9, 4, 224, 3, + 9, 4, 215, 224, 9, 4, 215, 219, 9, 4, 216, 2, 9, 4, 215, 235, 9, 4, 215, + 105, 9, 4, 215, 107, 9, 4, 215, 106, 9, 4, 215, 128, 9, 4, 215, 125, 9, + 4, 215, 158, 9, 4, 215, 148, 9, 4, 215, 193, 9, 4, 215, 186, 9, 4, 215, + 214, 9, 4, 215, 201, 9, 4, 215, 101, 9, 4, 215, 99, 9, 4, 215, 116, 9, 4, + 215, 104, 9, 4, 215, 102, 9, 4, 215, 103, 9, 4, 215, 83, 9, 4, 215, 82, + 9, 4, 215, 89, 9, 4, 215, 86, 9, 4, 215, 84, 9, 4, 215, 85, 9, 4, 219, + 65, 9, 4, 219, 59, 9, 4, 219, 113, 9, 4, 219, 71, 9, 4, 218, 29, 9, 4, + 218, 31, 9, 4, 218, 30, 9, 4, 218, 98, 9, 4, 218, 91, 9, 4, 218, 124, 9, + 4, 218, 102, 9, 4, 218, 217, 9, 4, 219, 51, 9, 4, 219, 0, 9, 4, 218, 22, + 9, 4, 218, 19, 9, 4, 218, 50, 9, 4, 218, 28, 9, 4, 218, 24, 9, 4, 218, + 25, 9, 4, 218, 4, 9, 4, 218, 3, 9, 4, 218, 9, 9, 4, 218, 7, 9, 4, 218, 5, + 9, 4, 218, 6, 9, 4, 232, 152, 9, 4, 232, 151, 9, 4, 232, 162, 9, 4, 232, + 153, 9, 4, 232, 158, 9, 4, 232, 157, 9, 4, 232, 160, 9, 4, 232, 159, 9, + 4, 232, 94, 9, 4, 232, 93, 9, 4, 232, 96, 9, 4, 232, 95, 9, 4, 232, 110, + 9, 4, 232, 108, 9, 4, 232, 122, 9, 4, 232, 112, 9, 4, 232, 87, 9, 4, 232, + 85, 9, 4, 232, 104, 9, 4, 232, 92, 9, 4, 232, 89, 9, 4, 232, 90, 9, 4, + 232, 79, 9, 4, 232, 78, 9, 4, 232, 83, 9, 4, 232, 82, 9, 4, 232, 80, 9, + 4, 232, 81, 9, 4, 219, 230, 9, 4, 219, 228, 9, 4, 219, 237, 9, 4, 219, + 231, 9, 4, 219, 234, 9, 4, 219, 233, 9, 4, 219, 236, 9, 4, 219, 235, 9, + 4, 219, 181, 9, 4, 219, 178, 9, 4, 219, 183, 9, 4, 219, 182, 9, 4, 219, + 217, 9, 4, 219, 216, 9, 4, 219, 226, 9, 4, 219, 220, 9, 4, 219, 173, 9, + 4, 219, 169, 9, 4, 219, 214, 9, 4, 219, 177, 9, 4, 219, 175, 9, 4, 219, + 176, 9, 4, 219, 153, 9, 4, 219, 151, 9, 4, 219, 163, 9, 4, 219, 156, 9, + 4, 219, 154, 9, 4, 219, 155, 9, 4, 232, 141, 9, 4, 232, 140, 9, 4, 232, + 147, 9, 4, 232, 142, 9, 4, 232, 144, 9, 4, 232, 143, 9, 4, 232, 146, 9, + 4, 232, 145, 9, 4, 232, 132, 9, 4, 232, 134, 9, 4, 232, 133, 9, 4, 232, + 137, 9, 4, 232, 136, 9, 4, 232, 139, 9, 4, 232, 138, 9, 4, 232, 128, 9, + 4, 232, 127, 9, 4, 232, 135, 9, 4, 232, 131, 9, 4, 232, 129, 9, 4, 232, + 130, 9, 4, 232, 124, 9, 4, 232, 123, 9, 4, 232, 126, 9, 4, 232, 125, 9, + 4, 224, 157, 9, 4, 224, 156, 9, 4, 224, 164, 9, 4, 224, 158, 9, 4, 224, + 160, 9, 4, 224, 159, 9, 4, 224, 163, 9, 4, 224, 161, 9, 4, 224, 146, 9, + 4, 224, 147, 9, 4, 224, 152, 9, 4, 224, 151, 9, 4, 224, 155, 9, 4, 224, + 153, 9, 4, 224, 141, 9, 4, 224, 150, 9, 4, 224, 145, 9, 4, 224, 142, 9, + 4, 224, 143, 9, 4, 224, 136, 9, 4, 224, 135, 9, 4, 224, 140, 9, 4, 224, + 139, 9, 4, 224, 137, 9, 4, 224, 138, 9, 4, 223, 113, 9, 4, 223, 112, 9, + 4, 223, 125, 9, 4, 223, 117, 9, 4, 223, 122, 9, 4, 223, 121, 9, 4, 223, + 124, 9, 4, 223, 123, 9, 4, 223, 98, 9, 4, 223, 100, 9, 4, 223, 99, 9, 4, + 223, 105, 9, 4, 223, 104, 9, 4, 223, 110, 9, 4, 223, 106, 9, 4, 223, 96, + 9, 4, 223, 94, 9, 4, 223, 103, 9, 4, 223, 97, 9, 4, 206, 161, 9, 4, 206, + 160, 9, 4, 206, 169, 9, 4, 206, 163, 9, 4, 206, 165, 9, 4, 206, 164, 9, + 4, 206, 167, 9, 4, 206, 166, 9, 4, 206, 149, 9, 4, 206, 150, 9, 4, 206, + 154, 9, 4, 206, 153, 9, 4, 206, 159, 9, 4, 206, 157, 9, 4, 206, 127, 9, + 4, 206, 125, 9, 4, 206, 140, 9, 4, 206, 130, 9, 4, 206, 128, 9, 4, 206, + 129, 9, 4, 205, 253, 9, 4, 205, 251, 9, 4, 206, 11, 9, 4, 205, 254, 9, 4, + 206, 5, 9, 4, 206, 4, 9, 4, 206, 8, 9, 4, 206, 6, 9, 4, 205, 191, 9, 4, + 205, 190, 9, 4, 205, 194, 9, 4, 205, 192, 9, 4, 205, 227, 9, 4, 205, 223, + 9, 4, 205, 247, 9, 4, 205, 231, 9, 4, 205, 182, 9, 4, 205, 178, 9, 4, + 205, 213, 9, 4, 205, 189, 9, 4, 205, 185, 9, 4, 205, 186, 9, 4, 205, 162, + 9, 4, 205, 161, 9, 4, 205, 169, 9, 4, 205, 165, 9, 4, 205, 163, 9, 4, + 205, 164, 9, 37, 219, 217, 9, 37, 229, 235, 9, 37, 231, 89, 9, 37, 223, + 117, 9, 37, 246, 249, 9, 37, 214, 64, 9, 37, 240, 118, 9, 37, 240, 150, + 9, 37, 226, 254, 9, 37, 237, 251, 9, 37, 229, 35, 9, 37, 250, 69, 9, 37, + 226, 142, 9, 37, 205, 247, 9, 37, 220, 52, 9, 37, 237, 245, 9, 37, 212, + 156, 9, 37, 240, 244, 9, 37, 205, 1, 9, 37, 246, 243, 9, 37, 246, 14, 9, + 37, 249, 68, 9, 37, 240, 114, 9, 37, 223, 106, 9, 37, 210, 170, 9, 37, + 222, 143, 9, 37, 232, 128, 9, 37, 205, 15, 9, 37, 220, 31, 9, 37, 238, + 191, 9, 37, 205, 253, 9, 37, 207, 144, 9, 37, 215, 89, 9, 37, 209, 28, 9, + 37, 205, 116, 9, 37, 232, 122, 9, 37, 223, 70, 9, 37, 232, 126, 9, 37, + 239, 254, 9, 37, 232, 146, 9, 37, 206, 250, 9, 37, 243, 237, 9, 37, 215, + 103, 9, 37, 229, 230, 9, 37, 246, 255, 9, 37, 247, 32, 9, 37, 247, 235, + 9, 37, 237, 248, 9, 37, 215, 224, 9, 37, 205, 0, 9, 37, 215, 148, 9, 37, + 248, 82, 9, 37, 204, 226, 9, 37, 225, 177, 9, 37, 231, 224, 229, 185, 1, + 250, 183, 229, 185, 1, 179, 229, 185, 1, 221, 93, 229, 185, 1, 246, 145, + 229, 185, 1, 212, 219, 229, 185, 1, 212, 56, 229, 185, 1, 240, 244, 229, + 185, 1, 172, 229, 185, 1, 231, 167, 229, 185, 1, 232, 200, 229, 185, 1, + 249, 1, 229, 185, 1, 248, 110, 229, 185, 1, 243, 196, 229, 185, 1, 210, + 243, 229, 185, 1, 210, 233, 229, 185, 1, 185, 229, 185, 1, 199, 229, 185, + 1, 230, 141, 229, 185, 1, 217, 199, 229, 185, 1, 205, 81, 229, 185, 1, + 205, 116, 229, 185, 1, 225, 77, 229, 185, 1, 155, 229, 185, 1, 206, 181, + 229, 185, 1, 239, 20, 229, 185, 1, 242, 73, 229, 185, 1, 207, 96, 229, + 185, 1, 216, 2, 229, 185, 1, 190, 229, 185, 1, 240, 99, 229, 185, 1, 62, + 229, 185, 1, 252, 248, 229, 185, 1, 75, 229, 185, 1, 242, 192, 229, 185, + 1, 74, 229, 185, 1, 76, 229, 185, 1, 71, 229, 185, 1, 210, 3, 229, 185, + 1, 209, 253, 229, 185, 1, 222, 206, 229, 185, 1, 135, 226, 40, 211, 211, + 229, 185, 1, 135, 225, 237, 220, 211, 229, 185, 1, 135, 226, 40, 246, + 254, 229, 185, 1, 135, 226, 40, 249, 184, 229, 185, 1, 135, 226, 40, 199, + 229, 185, 1, 135, 226, 40, 232, 171, 229, 185, 220, 72, 247, 155, 229, + 185, 220, 72, 241, 82, 213, 251, 46, 4, 243, 104, 46, 4, 243, 100, 46, 4, + 239, 53, 46, 4, 207, 45, 46, 4, 207, 44, 46, 4, 221, 164, 46, 4, 249, + 251, 46, 4, 250, 50, 46, 4, 227, 145, 46, 4, 231, 10, 46, 4, 227, 30, 46, + 4, 240, 183, 46, 4, 242, 21, 46, 4, 209, 34, 46, 4, 212, 120, 46, 4, 212, + 39, 46, 4, 245, 182, 46, 4, 245, 179, 46, 4, 230, 50, 46, 4, 219, 29, 46, + 4, 245, 251, 46, 4, 225, 142, 46, 4, 217, 74, 46, 4, 215, 212, 46, 4, + 205, 91, 46, 4, 205, 71, 46, 4, 248, 140, 46, 4, 232, 180, 46, 4, 224, + 171, 46, 4, 206, 49, 46, 4, 231, 221, 46, 4, 225, 50, 46, 4, 240, 162, + 46, 4, 227, 107, 46, 4, 225, 106, 46, 4, 223, 133, 46, 4, 74, 46, 4, 233, + 68, 46, 4, 239, 11, 46, 4, 238, 246, 46, 4, 207, 20, 46, 4, 207, 11, 46, + 4, 221, 53, 46, 4, 249, 249, 46, 4, 249, 244, 46, 4, 227, 138, 46, 4, + 231, 7, 46, 4, 227, 27, 46, 4, 240, 179, 46, 4, 241, 250, 46, 4, 208, + 214, 46, 4, 211, 211, 46, 4, 212, 19, 46, 4, 245, 174, 46, 4, 245, 178, + 46, 4, 229, 235, 46, 4, 218, 208, 46, 4, 245, 168, 46, 4, 225, 136, 46, + 4, 215, 80, 46, 4, 215, 183, 46, 4, 205, 40, 46, 4, 205, 67, 46, 4, 247, + 251, 46, 4, 232, 162, 46, 4, 224, 164, 46, 4, 206, 11, 46, 4, 231, 123, + 46, 4, 225, 42, 46, 4, 240, 61, 46, 4, 226, 254, 46, 4, 224, 230, 46, 4, + 223, 125, 46, 4, 62, 46, 4, 252, 122, 46, 4, 225, 72, 46, 4, 155, 46, 4, + 239, 110, 46, 4, 207, 96, 46, 4, 207, 85, 46, 4, 179, 46, 4, 250, 0, 46, + 4, 250, 183, 46, 4, 227, 153, 46, 4, 231, 15, 46, 4, 231, 13, 46, 4, 227, + 34, 46, 4, 240, 187, 46, 4, 242, 73, 46, 4, 209, 70, 46, 4, 212, 219, 46, + 4, 212, 56, 46, 4, 245, 192, 46, 4, 245, 181, 46, 4, 230, 141, 46, 4, + 219, 113, 46, 4, 246, 145, 46, 4, 225, 151, 46, 4, 217, 199, 46, 4, 216, + 2, 46, 4, 205, 116, 46, 4, 205, 81, 46, 4, 249, 1, 46, 4, 232, 200, 46, + 4, 224, 180, 46, 4, 190, 46, 4, 172, 46, 4, 232, 27, 46, 4, 225, 56, 46, + 4, 240, 244, 46, 4, 185, 46, 4, 199, 46, 4, 223, 144, 46, 4, 222, 152, + 46, 4, 222, 147, 46, 4, 238, 131, 46, 4, 206, 238, 46, 4, 206, 234, 46, + 4, 220, 187, 46, 4, 249, 247, 46, 4, 249, 172, 46, 4, 227, 133, 46, 4, + 231, 5, 46, 4, 227, 23, 46, 4, 240, 175, 46, 4, 241, 151, 46, 4, 208, + 161, 46, 4, 211, 105, 46, 4, 211, 248, 46, 4, 245, 171, 46, 4, 245, 176, + 46, 4, 229, 115, 46, 4, 218, 107, 46, 4, 245, 28, 46, 4, 225, 123, 46, 4, + 214, 174, 46, 4, 215, 152, 46, 4, 205, 17, 46, 4, 205, 62, 46, 4, 247, + 105, 46, 4, 232, 113, 46, 4, 224, 154, 46, 4, 205, 232, 46, 4, 231, 33, + 46, 4, 225, 40, 46, 4, 240, 8, 46, 4, 226, 150, 46, 4, 224, 56, 46, 4, + 223, 107, 46, 4, 71, 46, 4, 209, 234, 46, 4, 238, 42, 46, 4, 238, 31, 46, + 4, 206, 216, 46, 4, 206, 209, 46, 4, 220, 82, 46, 4, 249, 246, 46, 4, + 249, 101, 46, 4, 227, 132, 46, 4, 231, 3, 46, 4, 227, 22, 46, 4, 240, + 174, 46, 4, 241, 88, 46, 4, 207, 148, 46, 4, 210, 170, 46, 4, 211, 230, + 46, 4, 245, 169, 46, 4, 245, 175, 46, 4, 229, 81, 46, 4, 218, 50, 46, 4, + 243, 237, 46, 4, 225, 118, 46, 4, 213, 203, 46, 4, 215, 116, 46, 4, 205, + 9, 46, 4, 205, 58, 46, 4, 247, 40, 46, 4, 232, 104, 46, 4, 224, 150, 46, + 4, 205, 213, 46, 4, 230, 236, 46, 4, 225, 39, 46, 4, 239, 213, 46, 4, + 226, 114, 46, 4, 223, 217, 46, 4, 223, 103, 46, 4, 76, 46, 4, 222, 165, + 46, 4, 224, 254, 46, 4, 238, 149, 46, 4, 238, 134, 46, 4, 206, 250, 46, + 4, 206, 239, 46, 4, 220, 211, 46, 4, 249, 248, 46, 4, 249, 184, 46, 4, + 227, 134, 46, 4, 231, 6, 46, 4, 227, 25, 46, 4, 240, 177, 46, 4, 240, + 176, 46, 4, 241, 162, 46, 4, 208, 173, 46, 4, 124, 46, 4, 211, 253, 46, + 4, 245, 172, 46, 4, 245, 177, 46, 4, 229, 144, 46, 4, 218, 124, 46, 4, + 245, 51, 46, 4, 225, 127, 46, 4, 214, 193, 46, 4, 215, 158, 46, 4, 205, + 19, 46, 4, 205, 64, 46, 4, 247, 174, 46, 4, 232, 122, 46, 4, 224, 155, + 46, 4, 205, 247, 46, 4, 231, 53, 46, 4, 225, 41, 46, 4, 240, 19, 46, 4, + 226, 181, 46, 4, 224, 67, 46, 4, 223, 110, 46, 4, 75, 46, 4, 243, 41, 46, + 4, 225, 61, 46, 4, 239, 71, 46, 4, 239, 41, 46, 4, 207, 51, 46, 4, 207, + 39, 46, 4, 221, 174, 46, 4, 249, 252, 46, 4, 250, 61, 46, 4, 227, 146, + 46, 4, 231, 11, 46, 4, 231, 9, 46, 4, 227, 31, 46, 4, 240, 184, 46, 4, + 240, 182, 46, 4, 242, 28, 46, 4, 209, 39, 46, 4, 212, 131, 46, 4, 212, + 41, 46, 4, 245, 183, 46, 4, 245, 180, 46, 4, 230, 58, 46, 4, 219, 51, 46, + 4, 246, 9, 46, 4, 225, 143, 46, 4, 217, 86, 46, 4, 215, 214, 46, 4, 205, + 93, 46, 4, 205, 72, 46, 4, 248, 148, 46, 4, 232, 182, 46, 4, 224, 173, + 46, 4, 206, 52, 46, 4, 231, 224, 46, 4, 225, 51, 46, 4, 225, 47, 46, 4, + 240, 170, 46, 4, 240, 157, 46, 4, 227, 119, 46, 4, 225, 110, 46, 4, 223, + 134, 46, 4, 225, 79, 46, 4, 230, 19, 46, 247, 155, 46, 241, 82, 213, 251, + 46, 219, 196, 83, 46, 4, 225, 126, 242, 73, 46, 4, 225, 126, 172, 46, 4, + 225, 126, 214, 174, 46, 16, 242, 17, 46, 16, 231, 219, 46, 16, 211, 171, + 46, 16, 224, 205, 46, 16, 250, 135, 46, 16, 242, 72, 46, 16, 212, 215, + 46, 16, 246, 98, 46, 16, 245, 27, 46, 16, 230, 220, 46, 16, 211, 109, 46, + 16, 245, 50, 46, 16, 232, 114, 46, 18, 205, 85, 46, 18, 102, 46, 18, 105, + 46, 18, 142, 46, 18, 139, 46, 18, 168, 46, 18, 184, 46, 18, 195, 46, 18, + 193, 46, 18, 200, 46, 4, 225, 126, 185, 46, 4, 225, 126, 245, 51, 34, 6, + 1, 205, 89, 34, 5, 1, 205, 89, 34, 6, 1, 243, 191, 34, 5, 1, 243, 191, + 34, 6, 1, 218, 224, 243, 193, 34, 5, 1, 218, 224, 243, 193, 34, 6, 1, + 232, 249, 34, 5, 1, 232, 249, 34, 6, 1, 245, 67, 34, 5, 1, 245, 67, 34, + 6, 1, 226, 158, 209, 249, 34, 5, 1, 226, 158, 209, 249, 34, 6, 1, 249, + 112, 222, 170, 34, 5, 1, 249, 112, 222, 170, 34, 6, 1, 225, 88, 206, 34, + 34, 5, 1, 225, 88, 206, 34, 34, 6, 1, 206, 31, 2, 250, 177, 206, 34, 34, + 5, 1, 206, 31, 2, 250, 177, 206, 34, 34, 6, 1, 232, 247, 206, 65, 34, 5, + 1, 232, 247, 206, 65, 34, 6, 1, 218, 224, 205, 213, 34, 5, 1, 218, 224, + 205, 213, 34, 6, 1, 232, 247, 62, 34, 5, 1, 232, 247, 62, 34, 6, 1, 247, + 192, 229, 180, 205, 183, 34, 5, 1, 247, 192, 229, 180, 205, 183, 34, 6, + 1, 249, 194, 205, 183, 34, 5, 1, 249, 194, 205, 183, 34, 6, 1, 232, 247, + 247, 192, 229, 180, 205, 183, 34, 5, 1, 232, 247, 247, 192, 229, 180, + 205, 183, 34, 6, 1, 205, 249, 34, 5, 1, 205, 249, 34, 6, 1, 218, 224, + 210, 237, 34, 5, 1, 218, 224, 210, 237, 34, 6, 1, 214, 187, 246, 9, 34, + 5, 1, 214, 187, 246, 9, 34, 6, 1, 214, 187, 243, 68, 34, 5, 1, 214, 187, + 243, 68, 34, 6, 1, 214, 187, 243, 50, 34, 5, 1, 214, 187, 243, 50, 34, 6, + 1, 226, 162, 76, 34, 5, 1, 226, 162, 76, 34, 6, 1, 249, 221, 76, 34, 5, + 1, 249, 221, 76, 34, 6, 1, 50, 226, 162, 76, 34, 5, 1, 50, 226, 162, 76, + 34, 1, 226, 96, 76, 36, 34, 207, 131, 36, 34, 212, 99, 226, 213, 53, 36, + 34, 238, 30, 226, 213, 53, 36, 34, 211, 243, 226, 213, 53, 214, 233, 251, + 209, 36, 34, 1, 209, 246, 233, 129, 36, 34, 1, 74, 36, 34, 1, 206, 11, + 36, 34, 1, 71, 36, 34, 1, 239, 94, 53, 36, 34, 1, 206, 30, 36, 34, 1, + 214, 187, 53, 36, 34, 1, 222, 170, 36, 34, 231, 236, 36, 34, 221, 181, + 34, 231, 236, 34, 221, 181, 34, 6, 1, 243, 205, 34, 5, 1, 243, 205, 34, + 6, 1, 243, 182, 34, 5, 1, 243, 182, 34, 6, 1, 205, 48, 34, 5, 1, 205, 48, + 34, 6, 1, 248, 164, 34, 5, 1, 248, 164, 34, 6, 1, 243, 179, 34, 5, 1, + 243, 179, 34, 6, 1, 212, 132, 2, 226, 247, 109, 34, 5, 1, 212, 132, 2, + 226, 247, 109, 34, 6, 1, 210, 128, 34, 5, 1, 210, 128, 34, 6, 1, 210, + 212, 34, 5, 1, 210, 212, 34, 6, 1, 210, 217, 34, 5, 1, 210, 217, 34, 6, + 1, 212, 137, 34, 5, 1, 212, 137, 34, 6, 1, 238, 13, 34, 5, 1, 238, 13, + 34, 6, 1, 215, 95, 34, 5, 1, 215, 95, 34, 6, 1, 50, 76, 34, 5, 1, 50, 76, + 34, 6, 1, 247, 57, 76, 34, 5, 1, 247, 57, 76, 65, 1, 34, 239, 94, 53, 65, + 1, 34, 214, 187, 53, 36, 34, 1, 232, 247, 75, 21, 1, 62, 21, 1, 172, 21, + 1, 71, 21, 1, 230, 236, 21, 1, 243, 104, 21, 1, 219, 29, 21, 1, 212, 200, + 21, 1, 76, 21, 1, 223, 125, 21, 1, 74, 21, 1, 230, 141, 21, 1, 179, 21, + 1, 218, 154, 21, 1, 218, 201, 21, 1, 230, 49, 21, 1, 227, 106, 21, 1, + 212, 215, 21, 1, 225, 149, 21, 1, 224, 178, 21, 1, 229, 28, 21, 1, 213, + 119, 21, 1, 226, 114, 21, 1, 215, 178, 21, 1, 215, 80, 21, 1, 215, 188, + 21, 1, 216, 24, 21, 1, 230, 165, 21, 1, 231, 193, 21, 1, 223, 188, 21, 1, + 223, 217, 21, 1, 224, 149, 21, 1, 205, 229, 21, 1, 215, 116, 21, 1, 205, + 187, 21, 1, 190, 21, 1, 223, 251, 21, 1, 231, 179, 21, 1, 221, 97, 21, 1, + 224, 171, 21, 1, 223, 232, 21, 1, 220, 75, 21, 1, 206, 213, 21, 1, 221, + 164, 21, 1, 242, 21, 21, 1, 218, 50, 21, 1, 229, 81, 21, 1, 226, 254, 21, + 1, 224, 230, 21, 1, 218, 226, 21, 1, 219, 95, 21, 1, 231, 203, 21, 1, + 225, 5, 21, 1, 225, 56, 21, 1, 225, 77, 21, 1, 215, 158, 21, 1, 220, 79, + 21, 1, 241, 88, 21, 1, 241, 155, 21, 1, 207, 96, 21, 1, 199, 21, 1, 229, + 235, 21, 1, 221, 53, 21, 1, 229, 107, 21, 1, 231, 53, 21, 1, 227, 143, + 21, 1, 219, 2, 21, 1, 227, 83, 21, 1, 185, 21, 1, 211, 211, 21, 1, 231, + 123, 21, 1, 226, 181, 21, 1, 227, 151, 21, 1, 212, 80, 21, 1, 231, 15, + 21, 1, 212, 98, 21, 1, 223, 219, 21, 1, 217, 159, 21, 1, 242, 69, 21, 1, + 231, 17, 21, 1, 231, 48, 21, 36, 141, 231, 26, 21, 36, 141, 210, 161, 21, + 224, 177, 21, 241, 82, 213, 251, 21, 247, 162, 21, 247, 155, 21, 216, 52, + 21, 219, 196, 83, 65, 1, 248, 44, 135, 206, 1, 221, 5, 65, 1, 248, 44, + 135, 206, 76, 221, 5, 65, 1, 248, 44, 135, 206, 1, 215, 236, 65, 1, 248, + 44, 135, 206, 76, 215, 236, 65, 1, 248, 44, 135, 206, 1, 219, 214, 65, 1, + 248, 44, 135, 206, 76, 219, 214, 65, 1, 248, 44, 135, 206, 1, 218, 50, + 65, 1, 248, 44, 135, 206, 76, 218, 50, 65, 1, 242, 156, 244, 21, 135, + 134, 65, 1, 127, 244, 21, 135, 134, 65, 1, 226, 249, 244, 21, 135, 134, + 65, 1, 114, 244, 21, 135, 134, 65, 1, 242, 155, 244, 21, 135, 134, 65, 1, + 242, 156, 244, 21, 230, 38, 135, 134, 65, 1, 127, 244, 21, 230, 38, 135, + 134, 65, 1, 226, 249, 244, 21, 230, 38, 135, 134, 65, 1, 114, 244, 21, + 230, 38, 135, 134, 65, 1, 242, 155, 244, 21, 230, 38, 135, 134, 65, 1, + 242, 156, 230, 38, 135, 134, 65, 1, 127, 230, 38, 135, 134, 65, 1, 226, + 249, 230, 38, 135, 134, 65, 1, 114, 230, 38, 135, 134, 65, 1, 242, 155, + 230, 38, 135, 134, 65, 1, 67, 79, 134, 65, 1, 67, 214, 235, 65, 1, 67, + 194, 134, 65, 1, 229, 92, 48, 247, 92, 252, 108, 65, 1, 219, 81, 120, 45, + 65, 1, 219, 81, 130, 45, 65, 1, 219, 81, 242, 168, 83, 65, 1, 219, 81, + 233, 2, 242, 168, 83, 65, 1, 114, 233, 2, 242, 168, 83, 65, 1, 213, 233, + 23, 127, 211, 118, 65, 1, 213, 233, 23, 114, 211, 118, 7, 6, 1, 243, 94, + 252, 172, 7, 5, 1, 243, 94, 252, 172, 7, 6, 1, 243, 94, 252, 200, 7, 5, + 1, 243, 94, 252, 200, 7, 6, 1, 239, 39, 7, 5, 1, 239, 39, 7, 6, 1, 210, + 86, 7, 5, 1, 210, 86, 7, 6, 1, 211, 55, 7, 5, 1, 211, 55, 7, 6, 1, 247, + 37, 7, 5, 1, 247, 37, 7, 6, 1, 247, 38, 2, 247, 155, 7, 5, 1, 247, 38, 2, + 247, 155, 7, 1, 5, 6, 242, 139, 7, 1, 5, 6, 182, 7, 6, 1, 253, 164, 7, 5, + 1, 253, 164, 7, 6, 1, 252, 71, 7, 5, 1, 252, 71, 7, 6, 1, 251, 184, 7, 5, + 1, 251, 184, 7, 6, 1, 251, 168, 7, 5, 1, 251, 168, 7, 6, 1, 251, 169, 2, + 194, 134, 7, 5, 1, 251, 169, 2, 194, 134, 7, 6, 1, 251, 159, 7, 5, 1, + 251, 159, 7, 6, 1, 218, 224, 249, 35, 2, 245, 23, 7, 5, 1, 218, 224, 249, + 35, 2, 245, 23, 7, 6, 1, 232, 77, 2, 91, 7, 5, 1, 232, 77, 2, 91, 7, 6, + 1, 232, 77, 2, 245, 163, 91, 7, 5, 1, 232, 77, 2, 245, 163, 91, 7, 6, 1, + 232, 77, 2, 213, 225, 23, 245, 163, 91, 7, 5, 1, 232, 77, 2, 213, 225, + 23, 245, 163, 91, 7, 6, 1, 249, 111, 149, 7, 5, 1, 249, 111, 149, 7, 6, + 1, 230, 159, 2, 127, 91, 7, 5, 1, 230, 159, 2, 127, 91, 7, 6, 1, 148, 2, + 152, 213, 225, 222, 82, 7, 5, 1, 148, 2, 152, 213, 225, 222, 82, 7, 6, 1, + 148, 2, 229, 111, 7, 5, 1, 148, 2, 229, 111, 7, 6, 1, 222, 152, 7, 5, 1, + 222, 152, 7, 6, 1, 222, 68, 2, 213, 225, 211, 233, 245, 211, 7, 5, 1, + 222, 68, 2, 213, 225, 211, 233, 245, 211, 7, 6, 1, 222, 68, 2, 241, 174, + 7, 5, 1, 222, 68, 2, 241, 174, 7, 6, 1, 222, 68, 2, 214, 102, 212, 191, + 7, 5, 1, 222, 68, 2, 214, 102, 212, 191, 7, 6, 1, 220, 28, 2, 213, 225, + 211, 233, 245, 211, 7, 5, 1, 220, 28, 2, 213, 225, 211, 233, 245, 211, 7, + 6, 1, 220, 28, 2, 245, 163, 91, 7, 5, 1, 220, 28, 2, 245, 163, 91, 7, 6, + 1, 219, 150, 218, 96, 7, 5, 1, 219, 150, 218, 96, 7, 6, 1, 218, 39, 218, + 96, 7, 5, 1, 218, 39, 218, 96, 7, 6, 1, 209, 149, 2, 245, 163, 91, 7, 5, + 1, 209, 149, 2, 245, 163, 91, 7, 6, 1, 207, 137, 7, 5, 1, 207, 137, 7, 6, + 1, 208, 181, 205, 159, 7, 5, 1, 208, 181, 205, 159, 7, 6, 1, 211, 247, 2, + 91, 7, 5, 1, 211, 247, 2, 91, 7, 6, 1, 211, 247, 2, 213, 225, 211, 233, + 245, 211, 7, 5, 1, 211, 247, 2, 213, 225, 211, 233, 245, 211, 7, 6, 1, + 209, 29, 7, 5, 1, 209, 29, 7, 6, 1, 242, 203, 7, 5, 1, 242, 203, 7, 6, 1, + 232, 234, 7, 5, 1, 232, 234, 7, 6, 1, 247, 140, 7, 5, 1, 247, 140, 65, 1, + 209, 177, 7, 5, 1, 243, 228, 7, 5, 1, 229, 65, 7, 5, 1, 226, 90, 7, 5, 1, + 223, 180, 7, 5, 1, 218, 38, 7, 1, 5, 6, 218, 38, 7, 5, 1, 210, 159, 7, 5, + 1, 209, 241, 7, 6, 1, 233, 23, 246, 240, 7, 5, 1, 233, 23, 246, 240, 7, + 6, 1, 233, 23, 242, 139, 7, 5, 1, 233, 23, 242, 139, 7, 6, 1, 233, 23, + 241, 55, 7, 6, 1, 201, 233, 23, 241, 55, 7, 5, 1, 201, 233, 23, 241, 55, + 7, 6, 1, 201, 149, 7, 5, 1, 201, 149, 7, 6, 1, 233, 23, 137, 7, 5, 1, + 233, 23, 137, 7, 6, 1, 233, 23, 182, 7, 5, 1, 233, 23, 182, 7, 6, 1, 233, + 23, 213, 10, 7, 5, 1, 233, 23, 213, 10, 65, 1, 114, 247, 228, 253, 21, + 65, 1, 247, 162, 65, 1, 215, 144, 242, 242, 53, 7, 6, 1, 217, 163, 7, 5, + 1, 217, 163, 7, 6, 1, 201, 239, 155, 7, 5, 1, 230, 159, 2, 218, 230, 238, + 130, 23, 250, 24, 7, 6, 1, 226, 34, 2, 245, 211, 7, 5, 1, 226, 34, 2, + 245, 211, 7, 6, 1, 249, 35, 2, 134, 7, 5, 1, 249, 35, 2, 134, 7, 5, 1, + 249, 35, 2, 222, 26, 109, 7, 5, 1, 239, 156, 2, 222, 26, 109, 7, 6, 1, + 63, 2, 241, 174, 7, 5, 1, 63, 2, 241, 174, 7, 6, 1, 242, 140, 2, 91, 7, + 5, 1, 242, 140, 2, 91, 7, 6, 1, 208, 166, 252, 248, 7, 5, 1, 208, 166, + 252, 248, 7, 6, 1, 208, 166, 222, 206, 7, 5, 1, 208, 166, 222, 206, 7, 6, + 1, 208, 166, 210, 3, 7, 5, 1, 208, 166, 210, 3, 7, 6, 1, 241, 56, 2, 222, + 222, 91, 7, 5, 1, 241, 56, 2, 222, 222, 91, 7, 6, 1, 232, 77, 2, 222, + 222, 91, 7, 5, 1, 232, 77, 2, 222, 222, 91, 7, 6, 1, 226, 34, 2, 222, + 222, 91, 7, 5, 1, 226, 34, 2, 222, 222, 91, 7, 6, 1, 219, 150, 2, 222, + 222, 91, 7, 5, 1, 219, 150, 2, 222, 222, 91, 7, 6, 1, 218, 1, 2, 222, + 222, 91, 7, 5, 1, 218, 1, 2, 222, 222, 91, 7, 6, 1, 239, 156, 2, 109, 7, + 6, 1, 218, 224, 222, 142, 75, 7, 6, 1, 121, 241, 55, 7, 6, 1, 230, 159, + 2, 250, 24, 7, 6, 1, 201, 232, 76, 7, 6, 1, 201, 213, 10, 7, 242, 247, 1, + 215, 73, 74, 65, 1, 6, 239, 156, 2, 91, 65, 1, 5, 28, 222, 206, 7, 1, 5, + 6, 201, 229, 28, 7, 242, 247, 1, 218, 224, 242, 139, 7, 242, 247, 1, 218, + 224, 222, 67, 7, 242, 247, 1, 233, 2, 229, 28, 7, 242, 247, 1, 237, 225, + 229, 117, 7, 242, 247, 1, 252, 19, 229, 28, 213, 89, 225, 220, 1, 62, + 213, 89, 225, 220, 1, 74, 213, 89, 225, 220, 3, 243, 207, 213, 89, 225, + 220, 1, 71, 213, 89, 225, 220, 1, 75, 213, 89, 225, 220, 1, 76, 213, 89, + 225, 220, 3, 239, 88, 213, 89, 225, 220, 1, 231, 53, 213, 89, 225, 220, + 1, 231, 138, 213, 89, 225, 220, 1, 240, 19, 213, 89, 225, 220, 1, 240, + 71, 213, 89, 225, 220, 3, 252, 73, 213, 89, 225, 220, 1, 247, 174, 213, + 89, 225, 220, 1, 248, 32, 213, 89, 225, 220, 1, 232, 122, 213, 89, 225, + 220, 1, 232, 164, 213, 89, 225, 220, 1, 210, 185, 213, 89, 225, 220, 1, + 210, 191, 213, 89, 225, 220, 1, 246, 24, 213, 89, 225, 220, 1, 246, 33, + 213, 89, 225, 220, 1, 124, 213, 89, 225, 220, 1, 211, 253, 213, 89, 225, + 220, 1, 245, 51, 213, 89, 225, 220, 1, 245, 172, 213, 89, 225, 220, 1, + 224, 67, 213, 89, 225, 220, 1, 220, 211, 213, 89, 225, 220, 1, 221, 66, + 213, 89, 225, 220, 1, 249, 184, 213, 89, 225, 220, 1, 249, 248, 213, 89, + 225, 220, 1, 226, 181, 213, 89, 225, 220, 1, 218, 124, 213, 89, 225, 220, + 1, 229, 144, 213, 89, 225, 220, 1, 218, 75, 213, 89, 225, 220, 1, 214, + 193, 213, 89, 225, 220, 1, 238, 149, 213, 89, 225, 220, 22, 3, 62, 213, + 89, 225, 220, 22, 3, 74, 213, 89, 225, 220, 22, 3, 71, 213, 89, 225, 220, + 22, 3, 75, 213, 89, 225, 220, 22, 3, 222, 152, 213, 89, 225, 220, 220, + 206, 227, 191, 213, 89, 225, 220, 220, 206, 227, 190, 213, 89, 225, 220, + 220, 206, 227, 189, 213, 89, 225, 220, 220, 206, 227, 188, 143, 233, 51, + 241, 116, 119, 219, 204, 143, 233, 51, 241, 116, 119, 239, 121, 143, 233, + 51, 241, 116, 129, 219, 202, 143, 233, 51, 241, 116, 119, 215, 2, 143, + 233, 51, 241, 116, 119, 243, 83, 143, 233, 51, 241, 116, 129, 215, 1, + 143, 233, 51, 219, 205, 83, 143, 233, 51, 220, 238, 83, 143, 233, 51, + 218, 27, 83, 143, 233, 51, 219, 206, 83, 221, 89, 1, 172, 221, 89, 1, + 231, 167, 221, 89, 1, 240, 244, 221, 89, 1, 225, 77, 221, 89, 1, 249, 1, + 221, 89, 1, 248, 110, 221, 89, 1, 232, 200, 221, 89, 1, 223, 144, 221, + 89, 1, 212, 219, 221, 89, 1, 212, 56, 221, 89, 1, 246, 145, 221, 89, 1, + 199, 221, 89, 1, 179, 221, 89, 1, 221, 93, 221, 89, 1, 250, 183, 221, 89, + 1, 185, 221, 89, 1, 210, 243, 221, 89, 1, 210, 233, 221, 89, 1, 243, 196, + 221, 89, 1, 207, 96, 221, 89, 1, 205, 81, 221, 89, 1, 205, 116, 221, 89, + 1, 5, 62, 221, 89, 1, 190, 221, 89, 1, 219, 113, 221, 89, 1, 230, 141, + 221, 89, 1, 216, 2, 221, 89, 1, 217, 199, 221, 89, 1, 155, 221, 89, 1, + 62, 221, 89, 1, 74, 221, 89, 1, 71, 221, 89, 1, 75, 221, 89, 1, 76, 221, + 89, 1, 220, 19, 221, 89, 1, 206, 181, 221, 89, 1, 242, 73, 221, 89, 1, + 240, 135, 221, 89, 1, 243, 104, 221, 89, 213, 191, 1, 207, 96, 221, 89, + 213, 191, 1, 190, 221, 89, 1, 210, 208, 221, 89, 1, 210, 196, 221, 89, 1, + 246, 54, 221, 89, 1, 224, 103, 221, 89, 1, 252, 141, 190, 221, 89, 1, + 208, 169, 216, 2, 221, 89, 1, 208, 170, 155, 221, 89, 1, 251, 216, 242, + 73, 221, 89, 213, 191, 1, 219, 113, 221, 89, 213, 141, 1, 219, 113, 221, + 89, 1, 248, 217, 221, 89, 215, 41, 239, 69, 83, 221, 89, 50, 239, 69, 83, + 221, 89, 141, 215, 251, 221, 89, 141, 50, 215, 251, 217, 123, 3, 252, 73, + 217, 123, 3, 208, 183, 217, 123, 1, 62, 217, 123, 1, 253, 164, 217, 123, + 1, 74, 217, 123, 1, 233, 102, 217, 123, 1, 71, 217, 123, 1, 209, 162, + 217, 123, 1, 115, 137, 217, 123, 1, 115, 218, 90, 217, 123, 1, 115, 149, + 217, 123, 1, 115, 229, 173, 217, 123, 1, 75, 217, 123, 1, 243, 104, 217, + 123, 1, 252, 205, 217, 123, 1, 76, 217, 123, 1, 222, 152, 217, 123, 1, + 251, 184, 217, 123, 1, 172, 217, 123, 1, 231, 167, 217, 123, 1, 240, 244, + 217, 123, 1, 240, 99, 217, 123, 1, 225, 77, 217, 123, 1, 249, 1, 217, + 123, 1, 248, 110, 217, 123, 1, 232, 200, 217, 123, 1, 232, 170, 217, 123, + 1, 223, 144, 217, 123, 1, 210, 208, 217, 123, 1, 210, 196, 217, 123, 1, + 246, 54, 217, 123, 1, 246, 38, 217, 123, 1, 224, 103, 217, 123, 1, 212, + 219, 217, 123, 1, 212, 56, 217, 123, 1, 246, 145, 217, 123, 1, 245, 192, + 217, 123, 1, 199, 217, 123, 1, 179, 217, 123, 1, 221, 93, 217, 123, 1, + 250, 183, 217, 123, 1, 250, 0, 217, 123, 1, 185, 217, 123, 1, 190, 217, + 123, 1, 219, 113, 217, 123, 1, 230, 141, 217, 123, 1, 209, 70, 217, 123, + 1, 216, 2, 217, 123, 1, 214, 96, 217, 123, 1, 217, 199, 217, 123, 1, 155, + 217, 123, 1, 229, 172, 217, 123, 107, 3, 239, 139, 217, 123, 22, 3, 253, + 164, 217, 123, 22, 3, 74, 217, 123, 22, 3, 233, 102, 217, 123, 22, 3, 71, + 217, 123, 22, 3, 209, 162, 217, 123, 22, 3, 115, 137, 217, 123, 22, 3, + 115, 218, 90, 217, 123, 22, 3, 115, 149, 217, 123, 22, 3, 115, 229, 173, + 217, 123, 22, 3, 75, 217, 123, 22, 3, 243, 104, 217, 123, 22, 3, 252, + 205, 217, 123, 22, 3, 76, 217, 123, 22, 3, 222, 152, 217, 123, 22, 3, + 251, 184, 217, 123, 3, 208, 188, 217, 123, 246, 100, 217, 123, 50, 246, + 100, 217, 123, 18, 205, 85, 217, 123, 18, 102, 217, 123, 18, 105, 217, + 123, 18, 142, 217, 123, 18, 139, 217, 123, 18, 168, 217, 123, 18, 184, + 217, 123, 18, 195, 217, 123, 18, 193, 217, 123, 18, 200, 36, 89, 18, 205, + 85, 36, 89, 18, 102, 36, 89, 18, 105, 36, 89, 18, 142, 36, 89, 18, 139, + 36, 89, 18, 168, 36, 89, 18, 184, 36, 89, 18, 195, 36, 89, 18, 193, 36, + 89, 18, 200, 36, 89, 1, 62, 36, 89, 1, 71, 36, 89, 1, 172, 36, 89, 1, + 199, 36, 89, 1, 179, 36, 89, 1, 219, 113, 36, 89, 1, 208, 214, 36, 89, 3, + 251, 167, 89, 3, 214, 152, 248, 217, 89, 3, 248, 218, 208, 188, 89, 3, + 50, 248, 218, 208, 188, 89, 3, 248, 218, 105, 89, 3, 248, 218, 142, 89, + 3, 248, 218, 251, 167, 89, 3, 220, 55, 89, 240, 208, 241, 232, 89, 248, + 199, 89, 239, 63, 231, 230, 229, 236, 18, 205, 85, 231, 230, 229, 236, + 18, 102, 231, 230, 229, 236, 18, 105, 231, 230, 229, 236, 18, 142, 231, + 230, 229, 236, 18, 139, 231, 230, 229, 236, 18, 168, 231, 230, 229, 236, + 18, 184, 231, 230, 229, 236, 18, 195, 231, 230, 229, 236, 18, 193, 231, + 230, 229, 236, 18, 200, 231, 230, 229, 236, 1, 172, 231, 230, 229, 236, + 1, 231, 167, 231, 230, 229, 236, 1, 240, 244, 231, 230, 229, 236, 1, 225, + 77, 231, 230, 229, 236, 1, 217, 199, 231, 230, 229, 236, 1, 216, 2, 231, + 230, 229, 236, 1, 205, 116, 231, 230, 229, 236, 1, 223, 144, 231, 230, + 229, 236, 1, 212, 219, 231, 230, 229, 236, 1, 238, 46, 231, 230, 229, + 236, 1, 199, 231, 230, 229, 236, 1, 179, 231, 230, 229, 236, 1, 221, 93, + 231, 230, 229, 236, 1, 185, 231, 230, 229, 236, 1, 246, 145, 231, 230, + 229, 236, 1, 250, 183, 231, 230, 229, 236, 1, 219, 113, 231, 230, 229, + 236, 1, 190, 231, 230, 229, 236, 1, 230, 141, 231, 230, 229, 236, 1, 207, + 96, 231, 230, 229, 236, 1, 212, 56, 231, 230, 229, 236, 1, 155, 231, 230, + 229, 236, 1, 209, 70, 231, 230, 229, 236, 1, 249, 1, 231, 230, 229, 236, + 1, 62, 231, 230, 229, 236, 1, 222, 206, 231, 230, 229, 236, 1, 74, 231, + 230, 229, 236, 1, 222, 152, 231, 230, 229, 236, 22, 210, 3, 231, 230, + 229, 236, 22, 75, 231, 230, 229, 236, 22, 71, 231, 230, 229, 236, 22, + 243, 104, 231, 230, 229, 236, 22, 76, 231, 230, 229, 236, 135, 220, 226, + 231, 230, 229, 236, 135, 248, 233, 231, 230, 229, 236, 135, 248, 234, + 220, 226, 231, 230, 229, 236, 3, 247, 3, 231, 230, 229, 236, 3, 215, 88, + 219, 13, 1, 172, 219, 13, 1, 240, 244, 219, 13, 1, 225, 77, 219, 13, 1, + 212, 219, 219, 13, 1, 246, 145, 219, 13, 1, 199, 219, 13, 1, 179, 219, + 13, 1, 250, 183, 219, 13, 1, 185, 219, 13, 1, 249, 1, 219, 13, 1, 232, + 200, 219, 13, 1, 223, 144, 219, 13, 1, 217, 199, 219, 13, 1, 219, 113, + 219, 13, 1, 230, 141, 219, 13, 1, 190, 219, 13, 1, 207, 96, 219, 13, 1, + 155, 219, 13, 1, 227, 153, 219, 13, 1, 225, 56, 219, 13, 1, 225, 151, + 219, 13, 1, 223, 111, 219, 13, 1, 62, 219, 13, 22, 3, 74, 219, 13, 22, 3, + 71, 219, 13, 22, 3, 75, 219, 13, 22, 3, 252, 205, 219, 13, 22, 3, 76, + 219, 13, 22, 3, 251, 184, 219, 13, 22, 3, 242, 192, 219, 13, 22, 3, 243, + 130, 219, 13, 107, 3, 225, 79, 219, 13, 107, 3, 226, 33, 219, 13, 107, 3, + 137, 219, 13, 107, 3, 239, 155, 219, 13, 208, 188, 219, 13, 217, 77, 83, + 25, 113, 211, 189, 25, 113, 211, 188, 25, 113, 211, 186, 25, 113, 211, + 191, 25, 113, 218, 193, 25, 113, 218, 177, 25, 113, 218, 172, 25, 113, + 218, 174, 25, 113, 218, 190, 25, 113, 218, 183, 25, 113, 218, 176, 25, + 113, 218, 195, 25, 113, 218, 178, 25, 113, 218, 197, 25, 113, 218, 194, + 25, 113, 226, 236, 25, 113, 226, 227, 25, 113, 226, 230, 25, 113, 221, + 24, 25, 113, 221, 35, 25, 113, 221, 36, 25, 113, 214, 80, 25, 113, 233, + 115, 25, 113, 233, 122, 25, 113, 214, 91, 25, 113, 214, 78, 25, 113, 221, + 75, 25, 113, 238, 254, 25, 113, 214, 75, 176, 3, 221, 242, 176, 3, 248, + 145, 176, 3, 230, 66, 176, 3, 207, 13, 176, 1, 62, 176, 1, 237, 225, 231, + 234, 176, 1, 74, 176, 1, 233, 102, 176, 1, 71, 176, 1, 222, 52, 248, 116, + 176, 1, 225, 78, 230, 25, 176, 1, 225, 78, 230, 26, 219, 66, 176, 1, 75, + 176, 1, 252, 205, 176, 1, 76, 176, 1, 172, 176, 1, 232, 66, 217, 135, + 176, 1, 232, 66, 226, 75, 176, 1, 240, 244, 176, 1, 240, 245, 226, 75, + 176, 1, 225, 77, 176, 1, 249, 1, 176, 1, 249, 2, 226, 75, 176, 1, 232, + 200, 176, 1, 223, 145, 226, 75, 176, 1, 232, 201, 227, 243, 176, 1, 223, + 144, 176, 1, 210, 208, 176, 1, 210, 209, 227, 243, 176, 1, 246, 54, 176, + 1, 246, 55, 227, 243, 176, 1, 225, 237, 226, 75, 176, 1, 212, 219, 176, + 1, 212, 220, 226, 75, 176, 1, 246, 145, 176, 1, 246, 146, 227, 243, 176, + 1, 199, 176, 1, 179, 176, 1, 222, 52, 226, 75, 176, 1, 250, 183, 176, 1, + 250, 184, 226, 75, 176, 1, 185, 176, 1, 190, 176, 1, 219, 113, 176, 1, + 219, 114, 252, 214, 176, 1, 230, 141, 176, 1, 207, 96, 176, 1, 217, 200, + 226, 75, 176, 1, 217, 200, 227, 243, 176, 1, 217, 199, 176, 1, 155, 176, + 3, 248, 146, 212, 101, 176, 22, 3, 212, 158, 176, 22, 3, 211, 123, 176, + 22, 3, 206, 210, 176, 22, 3, 206, 211, 227, 94, 176, 22, 3, 213, 164, + 176, 22, 3, 213, 165, 227, 82, 176, 22, 3, 212, 179, 176, 22, 3, 245, + 101, 226, 74, 176, 22, 3, 221, 134, 176, 107, 3, 231, 196, 176, 107, 3, + 221, 147, 176, 107, 3, 248, 242, 176, 221, 255, 176, 47, 218, 244, 176, + 48, 218, 244, 176, 222, 41, 252, 116, 176, 222, 41, 228, 5, 176, 222, 41, + 229, 69, 176, 222, 41, 207, 7, 176, 222, 41, 222, 0, 176, 222, 41, 229, + 197, 176, 222, 41, 229, 63, 176, 222, 41, 252, 255, 176, 222, 41, 253, 0, + 252, 255, 176, 222, 41, 220, 249, 176, 201, 222, 41, 220, 249, 176, 221, + 251, 176, 18, 205, 85, 176, 18, 102, 176, 18, 105, 176, 18, 142, 176, 18, + 139, 176, 18, 168, 176, 18, 184, 176, 18, 195, 176, 18, 193, 176, 18, + 200, 176, 222, 41, 211, 158, 210, 157, 176, 222, 41, 232, 230, 66, 1, + 215, 238, 240, 99, 66, 1, 215, 238, 248, 110, 66, 1, 215, 238, 232, 170, + 66, 1, 215, 238, 224, 103, 66, 1, 215, 238, 250, 0, 66, 3, 215, 238, 217, + 121, 66, 65, 1, 215, 238, 219, 30, 66, 1, 41, 230, 113, 223, 144, 66, 1, + 41, 230, 113, 242, 73, 66, 1, 41, 230, 113, 240, 244, 66, 1, 41, 230, + 113, 240, 99, 66, 1, 41, 230, 113, 232, 200, 66, 1, 41, 230, 113, 232, + 170, 66, 1, 41, 230, 113, 246, 54, 66, 1, 41, 230, 113, 246, 38, 66, 1, + 41, 230, 113, 224, 103, 66, 41, 230, 113, 18, 205, 85, 66, 41, 230, 113, + 18, 102, 66, 41, 230, 113, 18, 105, 66, 41, 230, 113, 18, 142, 66, 41, + 230, 113, 18, 139, 66, 41, 230, 113, 18, 168, 66, 41, 230, 113, 18, 184, + 66, 41, 230, 113, 18, 195, 66, 41, 230, 113, 18, 193, 66, 41, 230, 113, + 18, 200, 66, 1, 41, 230, 113, 229, 172, 66, 1, 41, 230, 113, 246, 145, + 66, 1, 41, 230, 113, 245, 192, 66, 1, 41, 230, 113, 250, 183, 66, 1, 41, + 230, 113, 250, 0, 203, 1, 62, 203, 1, 74, 203, 1, 71, 203, 1, 75, 203, 1, + 252, 205, 203, 1, 76, 203, 1, 172, 203, 1, 231, 167, 203, 1, 240, 244, + 203, 1, 240, 99, 203, 1, 224, 242, 203, 1, 225, 77, 203, 1, 248, 110, + 203, 1, 248, 60, 203, 1, 232, 200, 203, 1, 232, 170, 203, 1, 224, 232, + 203, 1, 224, 234, 203, 1, 224, 233, 203, 1, 212, 219, 203, 1, 212, 56, + 203, 1, 246, 145, 203, 1, 245, 192, 203, 1, 223, 186, 203, 1, 199, 203, + 1, 246, 54, 203, 1, 179, 203, 1, 220, 157, 203, 1, 221, 93, 203, 1, 250, + 183, 203, 1, 250, 0, 203, 1, 226, 106, 203, 1, 185, 203, 1, 250, 97, 203, + 1, 190, 203, 1, 219, 113, 203, 1, 230, 141, 203, 1, 209, 70, 203, 1, 214, + 96, 203, 1, 217, 199, 203, 1, 155, 203, 22, 3, 253, 164, 203, 22, 3, 74, + 203, 22, 3, 233, 102, 203, 22, 3, 243, 90, 203, 22, 3, 71, 203, 22, 3, + 222, 206, 203, 22, 3, 76, 203, 22, 3, 252, 205, 203, 22, 3, 251, 184, + 203, 22, 3, 210, 3, 203, 107, 3, 190, 203, 107, 3, 219, 113, 203, 107, 3, + 230, 141, 203, 107, 3, 207, 96, 203, 1, 42, 232, 76, 203, 1, 42, 241, 55, + 203, 1, 42, 225, 79, 203, 107, 3, 42, 225, 79, 203, 1, 42, 248, 111, 203, + 1, 42, 213, 10, 203, 1, 42, 226, 33, 203, 1, 42, 222, 67, 203, 1, 42, + 206, 123, 203, 1, 42, 137, 203, 1, 42, 149, 203, 1, 42, 214, 99, 203, + 107, 3, 42, 229, 28, 203, 107, 3, 42, 239, 155, 203, 18, 205, 85, 203, + 18, 102, 203, 18, 105, 203, 18, 142, 203, 18, 139, 203, 18, 168, 203, 18, + 184, 203, 18, 195, 203, 18, 193, 203, 18, 200, 203, 220, 72, 214, 127, + 203, 220, 72, 246, 100, 203, 220, 72, 50, 246, 100, 203, 220, 72, 211, + 36, 246, 100, 66, 1, 231, 160, 240, 244, 66, 1, 231, 160, 249, 1, 66, 1, + 231, 160, 248, 110, 66, 1, 231, 160, 232, 200, 66, 1, 231, 160, 232, 170, + 66, 1, 231, 160, 223, 144, 66, 1, 231, 160, 210, 208, 66, 1, 231, 160, + 210, 196, 66, 1, 231, 160, 246, 54, 66, 1, 231, 160, 246, 38, 66, 1, 231, + 160, 245, 192, 66, 1, 231, 160, 199, 66, 1, 231, 160, 217, 199, 66, 1, + 231, 160, 155, 66, 1, 231, 160, 239, 20, 66, 1, 231, 160, 242, 73, 66, + 65, 1, 231, 160, 219, 30, 66, 1, 231, 160, 206, 181, 66, 1, 231, 160, + 205, 116, 66, 1, 231, 160, 219, 113, 66, 229, 133, 231, 160, 222, 227, + 66, 229, 133, 231, 160, 219, 227, 66, 229, 133, 231, 160, 238, 204, 66, + 16, 252, 193, 242, 167, 66, 16, 252, 193, 102, 66, 16, 252, 193, 105, 66, + 1, 252, 193, 219, 113, 66, 3, 221, 238, 232, 4, 211, 118, 66, 3, 41, 230, + 113, 211, 116, 66, 3, 41, 230, 113, 211, 113, 66, 1, 215, 96, 222, 23, + 248, 110, 66, 1, 215, 96, 222, 23, 216, 2, 41, 208, 204, 1, 114, 231, 53, + 41, 208, 204, 1, 127, 231, 53, 41, 208, 204, 1, 114, 231, 138, 41, 208, + 204, 1, 127, 231, 138, 41, 208, 204, 1, 114, 231, 147, 41, 208, 204, 1, + 127, 231, 147, 41, 208, 204, 1, 114, 240, 19, 41, 208, 204, 1, 127, 240, + 19, 41, 208, 204, 1, 114, 225, 2, 41, 208, 204, 1, 127, 225, 2, 41, 208, + 204, 1, 114, 247, 174, 41, 208, 204, 1, 127, 247, 174, 41, 208, 204, 1, + 114, 248, 32, 41, 208, 204, 1, 127, 248, 32, 41, 208, 204, 1, 114, 214, + 193, 41, 208, 204, 1, 127, 214, 193, 41, 208, 204, 1, 114, 223, 110, 41, + 208, 204, 1, 127, 223, 110, 41, 208, 204, 1, 114, 245, 51, 41, 208, 204, + 1, 127, 245, 51, 41, 208, 204, 1, 114, 124, 41, 208, 204, 1, 127, 124, + 41, 208, 204, 1, 114, 211, 253, 41, 208, 204, 1, 127, 211, 253, 41, 208, + 204, 1, 114, 224, 67, 41, 208, 204, 1, 127, 224, 67, 41, 208, 204, 1, + 114, 249, 184, 41, 208, 204, 1, 127, 249, 184, 41, 208, 204, 1, 114, 220, + 211, 41, 208, 204, 1, 127, 220, 211, 41, 208, 204, 1, 114, 221, 66, 41, + 208, 204, 1, 127, 221, 66, 41, 208, 204, 1, 114, 241, 162, 41, 208, 204, + 1, 127, 241, 162, 41, 208, 204, 1, 114, 226, 181, 41, 208, 204, 1, 127, + 226, 181, 41, 208, 204, 1, 114, 205, 247, 41, 208, 204, 1, 127, 205, 247, + 41, 208, 204, 1, 114, 218, 124, 41, 208, 204, 1, 127, 218, 124, 41, 208, + 204, 1, 114, 229, 144, 41, 208, 204, 1, 127, 229, 144, 41, 208, 204, 1, + 114, 208, 173, 41, 208, 204, 1, 127, 208, 173, 41, 208, 204, 1, 114, 238, + 149, 41, 208, 204, 1, 127, 238, 149, 41, 208, 204, 1, 114, 76, 41, 208, + 204, 1, 127, 76, 41, 208, 204, 227, 240, 232, 23, 41, 208, 204, 22, 253, + 164, 41, 208, 204, 22, 74, 41, 208, 204, 22, 210, 3, 41, 208, 204, 22, + 71, 41, 208, 204, 22, 75, 41, 208, 204, 22, 76, 41, 208, 204, 227, 240, + 231, 141, 41, 208, 204, 22, 237, 190, 41, 208, 204, 22, 210, 2, 41, 208, + 204, 22, 210, 18, 41, 208, 204, 22, 251, 182, 41, 208, 204, 22, 251, 159, + 41, 208, 204, 22, 252, 122, 41, 208, 204, 22, 252, 136, 41, 208, 204, + 135, 227, 240, 243, 75, 41, 208, 204, 135, 227, 240, 223, 185, 41, 208, + 204, 135, 227, 240, 211, 253, 41, 208, 204, 135, 227, 240, 214, 176, 41, + 208, 204, 16, 231, 36, 41, 208, 204, 16, 223, 185, 41, 208, 204, 16, 217, + 161, 41, 208, 204, 16, 238, 150, 238, 145, 41, 208, 204, 16, 231, 46, + 231, 45, 227, 101, 227, 160, 1, 75, 227, 101, 227, 160, 1, 76, 227, 101, + 227, 160, 1, 248, 110, 227, 101, 227, 160, 1, 223, 144, 227, 101, 227, + 160, 1, 210, 208, 227, 101, 227, 160, 1, 210, 196, 227, 101, 227, 160, 1, + 246, 54, 227, 101, 227, 160, 1, 246, 38, 227, 101, 227, 160, 1, 224, 103, + 227, 101, 227, 160, 1, 216, 2, 227, 101, 227, 160, 1, 214, 96, 227, 101, + 227, 160, 22, 3, 233, 102, 227, 101, 227, 160, 22, 3, 209, 162, 227, 101, + 227, 160, 22, 3, 253, 128, 227, 101, 227, 160, 22, 3, 251, 184, 227, 101, + 227, 160, 22, 3, 253, 121, 227, 101, 227, 160, 248, 74, 227, 101, 227, + 160, 252, 210, 231, 130, 227, 101, 227, 160, 252, 102, 227, 101, 227, + 160, 4, 218, 249, 83, 227, 101, 227, 160, 206, 232, 218, 249, 83, 227, + 101, 227, 160, 22, 3, 208, 183, 227, 101, 227, 160, 208, 188, 31, 4, 210, + 189, 31, 4, 210, 192, 31, 4, 210, 195, 31, 4, 210, 193, 31, 4, 210, 194, + 31, 4, 210, 191, 31, 4, 246, 32, 31, 4, 246, 34, 31, 4, 246, 37, 31, 4, + 246, 35, 31, 4, 246, 36, 31, 4, 246, 33, 31, 4, 243, 183, 31, 4, 243, + 187, 31, 4, 243, 195, 31, 4, 243, 192, 31, 4, 243, 193, 31, 4, 243, 184, + 31, 4, 248, 162, 31, 4, 248, 156, 31, 4, 248, 158, 31, 4, 248, 161, 31, + 4, 248, 159, 31, 4, 248, 160, 31, 4, 248, 157, 31, 4, 250, 97, 31, 4, + 250, 76, 31, 4, 250, 88, 31, 4, 250, 96, 31, 4, 250, 91, 31, 4, 250, 92, + 31, 4, 250, 80, 7, 5, 1, 250, 123, 252, 144, 7, 5, 1, 32, 218, 222, 7, 5, + 1, 249, 198, 75, 7, 5, 1, 250, 123, 75, 7, 5, 1, 174, 2, 241, 174, 7, 5, + 1, 230, 18, 242, 139, 7, 5, 1, 121, 241, 56, 2, 247, 56, 7, 5, 1, 230, + 159, 2, 233, 2, 230, 65, 182, 7, 5, 1, 230, 159, 2, 50, 226, 247, 211, + 180, 7, 5, 1, 230, 159, 2, 226, 247, 218, 148, 7, 5, 1, 229, 29, 2, 247, + 56, 7, 5, 1, 226, 34, 2, 247, 56, 7, 5, 1, 243, 29, 2, 247, 56, 7, 5, 1, + 249, 198, 76, 7, 5, 1, 249, 198, 148, 2, 91, 7, 5, 1, 222, 142, 148, 2, + 91, 7, 5, 1, 233, 2, 222, 206, 7, 5, 1, 201, 222, 207, 2, 91, 7, 5, 1, + 201, 222, 207, 2, 194, 91, 7, 5, 1, 201, 148, 222, 138, 7, 5, 1, 201, + 148, 222, 139, 2, 91, 7, 5, 1, 214, 0, 137, 7, 1, 5, 6, 219, 150, 2, 48, + 230, 34, 7, 5, 1, 219, 150, 206, 253, 239, 105, 7, 5, 1, 50, 137, 7, 5, + 1, 219, 150, 2, 247, 56, 7, 5, 1, 50, 219, 150, 2, 247, 56, 7, 5, 1, 121, + 137, 7, 5, 1, 121, 219, 150, 2, 218, 148, 7, 5, 1, 250, 114, 242, 215, 7, + 5, 1, 106, 2, 215, 144, 48, 230, 34, 7, 5, 1, 106, 250, 129, 2, 215, 144, + 48, 230, 34, 7, 5, 1, 209, 252, 7, 5, 1, 201, 209, 252, 7, 5, 1, 106, 2, + 47, 109, 7, 5, 1, 248, 58, 7, 5, 1, 248, 59, 2, 114, 48, 218, 148, 7, 5, + 1, 248, 59, 2, 114, 47, 216, 36, 7, 5, 1, 206, 196, 2, 114, 48, 218, 148, + 7, 5, 1, 206, 196, 2, 152, 47, 230, 34, 7, 5, 1, 206, 196, 2, 152, 47, + 230, 35, 23, 114, 48, 218, 148, 7, 5, 1, 206, 196, 2, 152, 47, 230, 35, + 2, 216, 36, 7, 5, 1, 206, 124, 2, 215, 144, 48, 230, 34, 65, 249, 123, 2, + 233, 2, 249, 122, 65, 1, 5, 239, 39, 65, 1, 5, 230, 159, 2, 233, 2, 230, + 65, 182, 65, 1, 5, 230, 159, 2, 226, 247, 211, 180, 65, 1, 5, 106, 2, 47, + 109, 7, 5, 1, 233, 2, 252, 144, 27, 1, 5, 6, 222, 170, 227, 101, 227, + 160, 1, 231, 43, 227, 101, 227, 160, 1, 217, 161, 227, 101, 227, 160, 1, + 230, 114, 227, 101, 227, 160, 1, 226, 192, 227, 101, 227, 160, 1, 179, + 227, 101, 227, 160, 1, 199, 227, 101, 227, 160, 1, 248, 50, 227, 101, + 227, 160, 1, 211, 182, 227, 101, 227, 160, 1, 231, 133, 227, 101, 227, + 160, 1, 224, 248, 227, 101, 227, 160, 1, 211, 245, 227, 101, 227, 160, 1, + 207, 90, 227, 101, 227, 160, 1, 206, 75, 227, 101, 227, 160, 1, 238, 35, + 227, 101, 227, 160, 1, 209, 234, 227, 101, 227, 160, 1, 74, 227, 101, + 227, 160, 1, 221, 87, 227, 101, 227, 160, 1, 251, 195, 227, 101, 227, + 160, 1, 240, 12, 227, 101, 227, 160, 1, 232, 168, 227, 101, 227, 160, 1, + 219, 90, 227, 101, 227, 160, 1, 250, 183, 227, 101, 227, 160, 1, 232, + 154, 227, 101, 227, 160, 1, 245, 126, 227, 101, 227, 160, 1, 240, 68, + 227, 101, 227, 160, 1, 245, 170, 227, 101, 227, 160, 1, 249, 254, 227, + 101, 227, 160, 1, 231, 44, 229, 116, 227, 101, 227, 160, 1, 230, 115, + 229, 116, 227, 101, 227, 160, 1, 226, 193, 229, 116, 227, 101, 227, 160, + 1, 222, 52, 229, 116, 227, 101, 227, 160, 1, 225, 237, 229, 116, 227, + 101, 227, 160, 1, 211, 183, 229, 116, 227, 101, 227, 160, 1, 224, 249, + 229, 116, 227, 101, 227, 160, 1, 237, 225, 229, 116, 227, 101, 227, 160, + 22, 3, 222, 164, 227, 101, 227, 160, 22, 3, 233, 66, 227, 101, 227, 160, + 22, 3, 252, 121, 227, 101, 227, 160, 22, 3, 206, 41, 227, 101, 227, 160, + 22, 3, 214, 166, 227, 101, 227, 160, 22, 3, 209, 231, 227, 101, 227, 160, + 22, 3, 248, 72, 227, 101, 227, 160, 22, 3, 223, 170, 227, 101, 227, 160, + 248, 73, 227, 101, 227, 160, 229, 66, 232, 209, 227, 101, 227, 160, 252, + 42, 232, 209, 227, 101, 227, 160, 18, 205, 85, 227, 101, 227, 160, 18, + 102, 227, 101, 227, 160, 18, 105, 227, 101, 227, 160, 18, 142, 227, 101, + 227, 160, 18, 139, 227, 101, 227, 160, 18, 168, 227, 101, 227, 160, 18, + 184, 227, 101, 227, 160, 18, 195, 227, 101, 227, 160, 18, 193, 227, 101, + 227, 160, 18, 200, 25, 162, 223, 51, 25, 162, 223, 56, 25, 162, 205, 246, + 25, 162, 205, 245, 25, 162, 205, 244, 25, 162, 210, 68, 25, 162, 210, 72, + 25, 162, 205, 211, 25, 162, 205, 207, 25, 162, 242, 191, 25, 162, 242, + 189, 25, 162, 242, 190, 25, 162, 242, 187, 25, 162, 237, 215, 25, 162, + 237, 214, 25, 162, 237, 212, 25, 162, 237, 213, 25, 162, 237, 218, 25, + 162, 237, 211, 25, 162, 237, 210, 25, 162, 237, 220, 25, 162, 252, 29, + 25, 162, 252, 28, 25, 100, 224, 216, 25, 100, 224, 222, 25, 100, 214, 77, + 25, 100, 214, 76, 25, 100, 211, 188, 25, 100, 211, 186, 25, 100, 211, + 185, 25, 100, 211, 191, 25, 100, 211, 192, 25, 100, 211, 184, 25, 100, + 218, 177, 25, 100, 218, 192, 25, 100, 214, 83, 25, 100, 218, 189, 25, + 100, 218, 179, 25, 100, 218, 181, 25, 100, 218, 168, 25, 100, 218, 169, + 25, 100, 232, 10, 25, 100, 226, 235, 25, 100, 226, 229, 25, 100, 214, 87, + 25, 100, 226, 232, 25, 100, 226, 238, 25, 100, 221, 20, 25, 100, 221, 29, + 25, 100, 221, 33, 25, 100, 214, 85, 25, 100, 221, 23, 25, 100, 221, 37, + 25, 100, 221, 38, 25, 100, 215, 25, 25, 100, 215, 28, 25, 100, 214, 81, + 25, 100, 214, 79, 25, 100, 215, 23, 25, 100, 215, 31, 25, 100, 215, 32, + 25, 100, 215, 17, 25, 100, 215, 30, 25, 100, 221, 245, 25, 100, 221, 246, + 25, 100, 206, 27, 25, 100, 206, 28, 25, 100, 247, 244, 25, 100, 247, 243, + 25, 100, 214, 92, 25, 100, 221, 73, 25, 100, 221, 72, 10, 15, 235, 93, + 10, 15, 235, 92, 10, 15, 235, 91, 10, 15, 235, 90, 10, 15, 235, 89, 10, + 15, 235, 88, 10, 15, 235, 87, 10, 15, 235, 86, 10, 15, 235, 85, 10, 15, + 235, 84, 10, 15, 235, 83, 10, 15, 235, 82, 10, 15, 235, 81, 10, 15, 235, + 80, 10, 15, 235, 79, 10, 15, 235, 78, 10, 15, 235, 77, 10, 15, 235, 76, + 10, 15, 235, 75, 10, 15, 235, 74, 10, 15, 235, 73, 10, 15, 235, 72, 10, + 15, 235, 71, 10, 15, 235, 70, 10, 15, 235, 69, 10, 15, 235, 68, 10, 15, + 235, 67, 10, 15, 235, 66, 10, 15, 235, 65, 10, 15, 235, 64, 10, 15, 235, + 63, 10, 15, 235, 62, 10, 15, 235, 61, 10, 15, 235, 60, 10, 15, 235, 59, + 10, 15, 235, 58, 10, 15, 235, 57, 10, 15, 235, 56, 10, 15, 235, 55, 10, + 15, 235, 54, 10, 15, 235, 53, 10, 15, 235, 52, 10, 15, 235, 51, 10, 15, + 235, 50, 10, 15, 235, 49, 10, 15, 235, 48, 10, 15, 235, 47, 10, 15, 235, + 46, 10, 15, 235, 45, 10, 15, 235, 44, 10, 15, 235, 43, 10, 15, 235, 42, + 10, 15, 235, 41, 10, 15, 235, 40, 10, 15, 235, 39, 10, 15, 235, 38, 10, + 15, 235, 37, 10, 15, 235, 36, 10, 15, 235, 35, 10, 15, 235, 34, 10, 15, + 235, 33, 10, 15, 235, 32, 10, 15, 235, 31, 10, 15, 235, 30, 10, 15, 235, + 29, 10, 15, 235, 28, 10, 15, 235, 27, 10, 15, 235, 26, 10, 15, 235, 25, + 10, 15, 235, 24, 10, 15, 235, 23, 10, 15, 235, 22, 10, 15, 235, 21, 10, + 15, 235, 20, 10, 15, 235, 19, 10, 15, 235, 18, 10, 15, 235, 17, 10, 15, + 235, 16, 10, 15, 235, 15, 10, 15, 235, 14, 10, 15, 235, 13, 10, 15, 235, + 12, 10, 15, 235, 11, 10, 15, 235, 10, 10, 15, 235, 9, 10, 15, 235, 8, 10, + 15, 235, 7, 10, 15, 235, 6, 10, 15, 235, 5, 10, 15, 235, 4, 10, 15, 235, + 3, 10, 15, 235, 2, 10, 15, 235, 1, 10, 15, 235, 0, 10, 15, 234, 255, 10, + 15, 234, 254, 10, 15, 234, 253, 10, 15, 234, 252, 10, 15, 234, 251, 10, + 15, 234, 250, 10, 15, 234, 249, 10, 15, 234, 248, 10, 15, 234, 247, 10, + 15, 234, 246, 10, 15, 234, 245, 10, 15, 234, 244, 10, 15, 234, 243, 10, + 15, 234, 242, 10, 15, 234, 241, 10, 15, 234, 240, 10, 15, 234, 239, 10, + 15, 234, 238, 10, 15, 234, 237, 10, 15, 234, 236, 10, 15, 234, 235, 10, + 15, 234, 234, 10, 15, 234, 233, 10, 15, 234, 232, 10, 15, 234, 231, 10, + 15, 234, 230, 10, 15, 234, 229, 10, 15, 234, 228, 10, 15, 234, 227, 10, + 15, 234, 226, 10, 15, 234, 225, 10, 15, 234, 224, 10, 15, 234, 223, 10, + 15, 234, 222, 10, 15, 234, 221, 10, 15, 234, 220, 10, 15, 234, 219, 10, + 15, 234, 218, 10, 15, 234, 217, 10, 15, 234, 216, 10, 15, 234, 215, 10, + 15, 234, 214, 10, 15, 234, 213, 10, 15, 234, 212, 10, 15, 234, 211, 10, + 15, 234, 210, 10, 15, 234, 209, 10, 15, 234, 208, 10, 15, 234, 207, 10, + 15, 234, 206, 10, 15, 234, 205, 10, 15, 234, 204, 10, 15, 234, 203, 10, + 15, 234, 202, 10, 15, 234, 201, 10, 15, 234, 200, 10, 15, 234, 199, 10, + 15, 234, 198, 10, 15, 234, 197, 10, 15, 234, 196, 10, 15, 234, 195, 10, + 15, 234, 194, 10, 15, 234, 193, 10, 15, 234, 192, 10, 15, 234, 191, 10, + 15, 234, 190, 10, 15, 234, 189, 10, 15, 234, 188, 10, 15, 234, 187, 10, + 15, 234, 186, 10, 15, 234, 185, 10, 15, 234, 184, 10, 15, 234, 183, 10, + 15, 234, 182, 10, 15, 234, 181, 10, 15, 234, 180, 10, 15, 234, 179, 10, + 15, 234, 178, 10, 15, 234, 177, 10, 15, 234, 176, 10, 15, 234, 175, 10, + 15, 234, 174, 10, 15, 234, 173, 10, 15, 234, 172, 10, 15, 234, 171, 10, + 15, 234, 170, 10, 15, 234, 169, 10, 15, 234, 168, 10, 15, 234, 167, 10, + 15, 234, 166, 10, 15, 234, 165, 10, 15, 234, 164, 10, 15, 234, 163, 10, + 15, 234, 162, 10, 15, 234, 161, 10, 15, 234, 160, 10, 15, 234, 159, 10, + 15, 234, 158, 10, 15, 234, 157, 10, 15, 234, 156, 10, 15, 234, 155, 10, + 15, 234, 154, 10, 15, 234, 153, 10, 15, 234, 152, 10, 15, 234, 151, 10, + 15, 234, 150, 10, 15, 234, 149, 10, 15, 234, 148, 10, 15, 234, 147, 10, + 15, 234, 146, 10, 15, 234, 145, 10, 15, 234, 144, 10, 15, 234, 143, 10, + 15, 234, 142, 10, 15, 234, 141, 10, 15, 234, 140, 10, 15, 234, 139, 10, + 15, 234, 138, 10, 15, 234, 137, 10, 15, 234, 136, 10, 15, 234, 135, 10, + 15, 234, 134, 10, 15, 234, 133, 10, 15, 234, 132, 10, 15, 234, 131, 10, + 15, 234, 130, 10, 15, 234, 129, 10, 15, 234, 128, 10, 15, 234, 127, 10, + 15, 234, 126, 10, 15, 234, 125, 10, 15, 234, 124, 10, 15, 234, 123, 10, + 15, 234, 122, 10, 15, 234, 121, 10, 15, 234, 120, 10, 15, 234, 119, 10, + 15, 234, 118, 10, 15, 234, 117, 10, 15, 234, 116, 10, 15, 234, 115, 10, + 15, 234, 114, 10, 15, 234, 113, 10, 15, 234, 112, 10, 15, 234, 111, 10, + 15, 234, 110, 10, 15, 234, 109, 10, 15, 234, 108, 10, 15, 234, 107, 10, + 15, 234, 106, 10, 15, 234, 105, 10, 15, 234, 104, 10, 15, 234, 103, 10, + 15, 234, 102, 10, 15, 234, 101, 10, 15, 234, 100, 10, 15, 234, 99, 10, + 15, 234, 98, 10, 15, 234, 97, 10, 15, 234, 96, 10, 15, 234, 95, 10, 15, + 234, 94, 10, 15, 234, 93, 10, 15, 234, 92, 10, 15, 234, 91, 10, 15, 234, + 90, 10, 15, 234, 89, 10, 15, 234, 88, 10, 15, 234, 87, 10, 15, 234, 86, + 10, 15, 234, 85, 10, 15, 234, 84, 10, 15, 234, 83, 10, 15, 234, 82, 10, + 15, 234, 81, 10, 15, 234, 80, 10, 15, 234, 79, 10, 15, 234, 78, 10, 15, + 234, 77, 10, 15, 234, 76, 10, 15, 234, 75, 10, 15, 234, 74, 10, 15, 234, + 73, 10, 15, 234, 72, 10, 15, 234, 71, 10, 15, 234, 70, 10, 15, 234, 69, + 10, 15, 234, 68, 10, 15, 234, 67, 10, 15, 234, 66, 10, 15, 234, 65, 10, + 15, 234, 64, 10, 15, 234, 63, 10, 15, 234, 62, 10, 15, 234, 61, 10, 15, + 234, 60, 10, 15, 234, 59, 10, 15, 234, 58, 10, 15, 234, 57, 10, 15, 234, + 56, 10, 15, 234, 55, 10, 15, 234, 54, 10, 15, 234, 53, 10, 15, 234, 52, + 10, 15, 234, 51, 10, 15, 234, 50, 10, 15, 234, 49, 10, 15, 234, 48, 10, + 15, 234, 47, 10, 15, 234, 46, 10, 15, 234, 45, 10, 15, 234, 44, 10, 15, + 234, 43, 10, 15, 234, 42, 10, 15, 234, 41, 10, 15, 234, 40, 10, 15, 234, + 39, 10, 15, 234, 38, 10, 15, 234, 37, 10, 15, 234, 36, 10, 15, 234, 35, + 10, 15, 234, 34, 10, 15, 234, 33, 10, 15, 234, 32, 10, 15, 234, 31, 10, + 15, 234, 30, 10, 15, 234, 29, 10, 15, 234, 28, 10, 15, 234, 27, 10, 15, + 234, 26, 10, 15, 234, 25, 10, 15, 234, 24, 10, 15, 234, 23, 10, 15, 234, + 22, 10, 15, 234, 21, 10, 15, 234, 20, 10, 15, 234, 19, 10, 15, 234, 18, + 10, 15, 234, 17, 10, 15, 234, 16, 10, 15, 234, 15, 10, 15, 234, 14, 10, + 15, 234, 13, 10, 15, 234, 12, 10, 15, 234, 11, 10, 15, 234, 10, 10, 15, + 234, 9, 10, 15, 234, 8, 10, 15, 234, 7, 10, 15, 234, 6, 10, 15, 234, 5, + 10, 15, 234, 4, 10, 15, 234, 3, 10, 15, 234, 2, 10, 15, 234, 1, 10, 15, + 234, 0, 10, 15, 233, 255, 10, 15, 233, 254, 10, 15, 233, 253, 10, 15, + 233, 252, 10, 15, 233, 251, 10, 15, 233, 250, 10, 15, 233, 249, 10, 15, + 233, 248, 10, 15, 233, 247, 10, 15, 233, 246, 10, 15, 233, 245, 10, 15, + 233, 244, 10, 15, 233, 243, 10, 15, 233, 242, 10, 15, 233, 241, 10, 15, + 233, 240, 10, 15, 233, 239, 10, 15, 233, 238, 10, 15, 233, 237, 10, 15, + 233, 236, 10, 15, 233, 235, 10, 15, 233, 234, 10, 15, 233, 233, 10, 15, + 233, 232, 10, 15, 233, 231, 10, 15, 233, 230, 10, 15, 233, 229, 10, 15, + 233, 228, 10, 15, 233, 227, 10, 15, 233, 226, 10, 15, 233, 225, 10, 15, + 233, 224, 10, 15, 233, 223, 10, 15, 233, 222, 10, 15, 233, 221, 10, 15, + 233, 220, 10, 15, 233, 219, 10, 15, 233, 218, 10, 15, 233, 217, 10, 15, + 233, 216, 10, 15, 233, 215, 10, 15, 233, 214, 10, 15, 233, 213, 10, 15, + 233, 212, 10, 15, 233, 211, 10, 15, 233, 210, 10, 15, 233, 209, 10, 15, + 233, 208, 10, 15, 233, 207, 10, 15, 233, 206, 10, 15, 233, 205, 10, 15, + 233, 204, 10, 15, 233, 203, 10, 15, 233, 202, 10, 15, 233, 201, 10, 15, + 233, 200, 10, 15, 233, 199, 10, 15, 233, 198, 10, 15, 233, 197, 10, 15, + 233, 196, 10, 15, 233, 195, 10, 15, 233, 194, 10, 15, 233, 193, 10, 15, + 233, 192, 10, 15, 233, 191, 10, 15, 233, 190, 10, 15, 233, 189, 10, 15, + 233, 188, 10, 15, 233, 187, 10, 15, 233, 186, 10, 15, 233, 185, 10, 15, + 233, 184, 10, 15, 233, 183, 10, 15, 233, 182, 10, 15, 233, 181, 10, 15, + 233, 180, 10, 15, 233, 179, 10, 15, 233, 178, 10, 15, 233, 177, 10, 15, + 233, 176, 10, 15, 233, 175, 10, 15, 233, 174, 10, 15, 233, 173, 10, 15, + 233, 172, 10, 15, 233, 171, 10, 15, 233, 170, 10, 15, 233, 169, 10, 15, + 233, 168, 10, 15, 233, 167, 10, 15, 233, 166, 10, 15, 233, 165, 10, 15, + 233, 164, 10, 15, 233, 163, 10, 15, 233, 162, 10, 15, 233, 161, 10, 15, + 233, 160, 10, 15, 233, 159, 10, 15, 233, 158, 10, 15, 233, 157, 10, 15, + 233, 156, 10, 15, 233, 155, 10, 15, 233, 154, 10, 15, 233, 153, 10, 15, + 233, 152, 10, 15, 233, 151, 10, 15, 233, 150, 10, 15, 233, 149, 10, 15, + 233, 148, 10, 15, 233, 147, 10, 15, 233, 146, 10, 15, 233, 145, 10, 15, + 233, 144, 10, 15, 233, 143, 10, 15, 233, 142, 10, 15, 233, 141, 10, 15, + 233, 140, 10, 15, 233, 139, 10, 15, 233, 138, 10, 15, 233, 137, 10, 15, + 233, 136, 10, 15, 233, 135, 10, 15, 233, 134, 7, 5, 28, 241, 254, 7, 5, + 28, 241, 250, 7, 5, 28, 241, 199, 7, 5, 28, 241, 253, 7, 5, 28, 241, 252, + 7, 5, 28, 152, 218, 1, 213, 10, 7, 5, 28, 214, 40, 164, 5, 28, 227, 84, + 224, 29, 164, 5, 28, 227, 84, 243, 108, 164, 5, 28, 227, 84, 233, 38, + 164, 5, 28, 208, 219, 224, 29, 164, 5, 28, 227, 84, 206, 173, 103, 1, + 205, 237, 2, 238, 244, 103, 220, 205, 232, 103, 209, 51, 103, 28, 206, 9, + 205, 237, 205, 237, 221, 194, 103, 1, 252, 139, 251, 154, 103, 1, 207, + 17, 252, 172, 103, 1, 207, 17, 246, 111, 103, 1, 207, 17, 239, 71, 103, + 1, 207, 17, 232, 45, 103, 1, 207, 17, 230, 98, 103, 1, 207, 17, 42, 227, + 90, 103, 1, 207, 17, 218, 242, 103, 1, 207, 17, 212, 147, 103, 1, 252, + 139, 101, 53, 103, 1, 215, 172, 2, 215, 172, 245, 23, 103, 1, 215, 172, + 2, 215, 45, 245, 23, 103, 1, 215, 172, 2, 246, 131, 23, 215, 172, 245, + 23, 103, 1, 215, 172, 2, 246, 131, 23, 215, 45, 245, 23, 103, 1, 126, 2, + 221, 194, 103, 1, 126, 2, 220, 7, 103, 1, 126, 2, 227, 204, 103, 1, 250, + 11, 2, 246, 130, 103, 1, 240, 48, 2, 246, 130, 103, 1, 246, 112, 2, 246, + 130, 103, 1, 239, 72, 2, 227, 204, 103, 1, 209, 44, 2, 246, 130, 103, 1, + 205, 97, 2, 246, 130, 103, 1, 212, 81, 2, 246, 130, 103, 1, 205, 237, 2, + 246, 130, 103, 1, 42, 232, 46, 2, 246, 130, 103, 1, 232, 46, 2, 246, 130, + 103, 1, 230, 99, 2, 246, 130, 103, 1, 227, 91, 2, 246, 130, 103, 1, 223, + 174, 2, 246, 130, 103, 1, 217, 158, 2, 246, 130, 103, 1, 42, 221, 175, 2, + 246, 130, 103, 1, 221, 175, 2, 246, 130, 103, 1, 210, 239, 2, 246, 130, + 103, 1, 219, 224, 2, 246, 130, 103, 1, 218, 243, 2, 246, 130, 103, 1, + 215, 172, 2, 246, 130, 103, 1, 212, 148, 2, 246, 130, 103, 1, 209, 44, 2, + 238, 142, 103, 1, 250, 11, 2, 219, 93, 103, 1, 232, 46, 2, 219, 93, 103, + 1, 221, 175, 2, 219, 93, 103, 28, 126, 230, 98, 8, 1, 126, 207, 77, 61, + 17, 8, 1, 126, 207, 77, 42, 17, 8, 1, 250, 49, 61, 17, 8, 1, 250, 49, 42, + 17, 8, 1, 250, 49, 78, 17, 8, 1, 250, 49, 169, 17, 8, 1, 221, 158, 61, + 17, 8, 1, 221, 158, 42, 17, 8, 1, 221, 158, 78, 17, 8, 1, 221, 158, 169, + 17, 8, 1, 250, 37, 61, 17, 8, 1, 250, 37, 42, 17, 8, 1, 250, 37, 78, 17, + 8, 1, 250, 37, 169, 17, 8, 1, 210, 199, 61, 17, 8, 1, 210, 199, 42, 17, + 8, 1, 210, 199, 78, 17, 8, 1, 210, 199, 169, 17, 8, 1, 212, 114, 61, 17, + 8, 1, 212, 114, 42, 17, 8, 1, 212, 114, 78, 17, 8, 1, 212, 114, 169, 17, + 8, 1, 210, 201, 61, 17, 8, 1, 210, 201, 42, 17, 8, 1, 210, 201, 78, 17, + 8, 1, 210, 201, 169, 17, 8, 1, 209, 33, 61, 17, 8, 1, 209, 33, 42, 17, 8, + 1, 209, 33, 78, 17, 8, 1, 209, 33, 169, 17, 8, 1, 221, 156, 61, 17, 8, 1, + 221, 156, 42, 17, 8, 1, 221, 156, 78, 17, 8, 1, 221, 156, 169, 17, 8, 1, + 243, 202, 61, 17, 8, 1, 243, 202, 42, 17, 8, 1, 243, 202, 78, 17, 8, 1, + 243, 202, 169, 17, 8, 1, 223, 132, 61, 17, 8, 1, 223, 132, 42, 17, 8, 1, + 223, 132, 78, 17, 8, 1, 223, 132, 169, 17, 8, 1, 212, 136, 61, 17, 8, 1, + 212, 136, 42, 17, 8, 1, 212, 136, 78, 17, 8, 1, 212, 136, 169, 17, 8, 1, + 212, 134, 61, 17, 8, 1, 212, 134, 42, 17, 8, 1, 212, 134, 78, 17, 8, 1, + 212, 134, 169, 17, 8, 1, 246, 52, 61, 17, 8, 1, 246, 52, 42, 17, 8, 1, + 246, 125, 61, 17, 8, 1, 246, 125, 42, 17, 8, 1, 243, 230, 61, 17, 8, 1, + 243, 230, 42, 17, 8, 1, 246, 50, 61, 17, 8, 1, 246, 50, 42, 17, 8, 1, + 232, 177, 61, 17, 8, 1, 232, 177, 42, 17, 8, 1, 218, 82, 61, 17, 8, 1, + 218, 82, 42, 17, 8, 1, 231, 213, 61, 17, 8, 1, 231, 213, 42, 17, 8, 1, + 231, 213, 78, 17, 8, 1, 231, 213, 169, 17, 8, 1, 240, 232, 61, 17, 8, 1, + 240, 232, 42, 17, 8, 1, 240, 232, 78, 17, 8, 1, 240, 232, 169, 17, 8, 1, + 239, 201, 61, 17, 8, 1, 239, 201, 42, 17, 8, 1, 239, 201, 78, 17, 8, 1, + 239, 201, 169, 17, 8, 1, 225, 1, 61, 17, 8, 1, 225, 1, 42, 17, 8, 1, 225, + 1, 78, 17, 8, 1, 225, 1, 169, 17, 8, 1, 224, 55, 240, 66, 61, 17, 8, 1, + 224, 55, 240, 66, 42, 17, 8, 1, 218, 128, 61, 17, 8, 1, 218, 128, 42, 17, + 8, 1, 218, 128, 78, 17, 8, 1, 218, 128, 169, 17, 8, 1, 239, 51, 2, 87, + 84, 61, 17, 8, 1, 239, 51, 2, 87, 84, 42, 17, 8, 1, 239, 51, 240, 17, 61, + 17, 8, 1, 239, 51, 240, 17, 42, 17, 8, 1, 239, 51, 240, 17, 78, 17, 8, 1, + 239, 51, 240, 17, 169, 17, 8, 1, 239, 51, 245, 48, 61, 17, 8, 1, 239, 51, + 245, 48, 42, 17, 8, 1, 239, 51, 245, 48, 78, 17, 8, 1, 239, 51, 245, 48, + 169, 17, 8, 1, 87, 250, 122, 61, 17, 8, 1, 87, 250, 122, 42, 17, 8, 1, + 87, 250, 122, 2, 239, 112, 84, 61, 17, 8, 1, 87, 250, 122, 2, 239, 112, + 84, 42, 17, 8, 16, 67, 52, 8, 16, 67, 55, 8, 16, 118, 177, 52, 8, 16, + 118, 177, 55, 8, 16, 129, 177, 52, 8, 16, 129, 177, 55, 8, 16, 129, 177, + 220, 201, 173, 52, 8, 16, 129, 177, 220, 201, 173, 55, 8, 16, 241, 125, + 177, 52, 8, 16, 241, 125, 177, 55, 8, 16, 50, 79, 250, 129, 55, 8, 16, + 118, 177, 208, 228, 52, 8, 16, 118, 177, 208, 228, 55, 8, 16, 218, 148, + 8, 16, 5, 212, 195, 52, 8, 16, 5, 212, 195, 55, 8, 1, 225, 80, 61, 17, 8, + 1, 225, 80, 42, 17, 8, 1, 225, 80, 78, 17, 8, 1, 225, 80, 169, 17, 8, 1, + 106, 61, 17, 8, 1, 106, 42, 17, 8, 1, 222, 207, 61, 17, 8, 1, 222, 207, + 42, 17, 8, 1, 205, 214, 61, 17, 8, 1, 205, 214, 42, 17, 8, 1, 106, 2, + 239, 112, 84, 61, 17, 8, 1, 209, 40, 61, 17, 8, 1, 209, 40, 42, 17, 8, 1, + 231, 101, 222, 207, 61, 17, 8, 1, 231, 101, 222, 207, 42, 17, 8, 1, 231, + 101, 205, 214, 61, 17, 8, 1, 231, 101, 205, 214, 42, 17, 8, 1, 174, 61, + 17, 8, 1, 174, 42, 17, 8, 1, 174, 78, 17, 8, 1, 174, 169, 17, 8, 1, 209, + 251, 231, 228, 231, 101, 126, 227, 229, 78, 17, 8, 1, 209, 251, 231, 228, + 231, 101, 126, 227, 229, 169, 17, 8, 28, 87, 2, 239, 112, 84, 2, 126, 61, + 17, 8, 28, 87, 2, 239, 112, 84, 2, 126, 42, 17, 8, 28, 87, 2, 239, 112, + 84, 2, 252, 249, 61, 17, 8, 28, 87, 2, 239, 112, 84, 2, 252, 249, 42, 17, + 8, 28, 87, 2, 239, 112, 84, 2, 207, 60, 61, 17, 8, 28, 87, 2, 239, 112, + 84, 2, 207, 60, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, 106, 61, 17, 8, + 28, 87, 2, 239, 112, 84, 2, 106, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, + 222, 207, 61, 17, 8, 28, 87, 2, 239, 112, 84, 2, 222, 207, 42, 17, 8, 28, + 87, 2, 239, 112, 84, 2, 205, 214, 61, 17, 8, 28, 87, 2, 239, 112, 84, 2, + 205, 214, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, 174, 61, 17, 8, 28, 87, + 2, 239, 112, 84, 2, 174, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, 174, 78, + 17, 8, 28, 209, 251, 231, 101, 87, 2, 239, 112, 84, 2, 126, 227, 229, 61, + 17, 8, 28, 209, 251, 231, 101, 87, 2, 239, 112, 84, 2, 126, 227, 229, 42, + 17, 8, 28, 209, 251, 231, 101, 87, 2, 239, 112, 84, 2, 126, 227, 229, 78, + 17, 8, 1, 242, 42, 87, 61, 17, 8, 1, 242, 42, 87, 42, 17, 8, 1, 242, 42, + 87, 78, 17, 8, 1, 242, 42, 87, 169, 17, 8, 28, 87, 2, 239, 112, 84, 2, + 171, 61, 17, 8, 28, 87, 2, 239, 112, 84, 2, 140, 61, 17, 8, 28, 87, 2, + 239, 112, 84, 2, 80, 61, 17, 8, 28, 87, 2, 239, 112, 84, 2, 126, 227, + 229, 61, 17, 8, 28, 87, 2, 239, 112, 84, 2, 87, 61, 17, 8, 28, 250, 39, + 2, 171, 61, 17, 8, 28, 250, 39, 2, 140, 61, 17, 8, 28, 250, 39, 2, 231, + 164, 61, 17, 8, 28, 250, 39, 2, 80, 61, 17, 8, 28, 250, 39, 2, 126, 227, + 229, 61, 17, 8, 28, 250, 39, 2, 87, 61, 17, 8, 28, 212, 116, 2, 171, 61, + 17, 8, 28, 212, 116, 2, 140, 61, 17, 8, 28, 212, 116, 2, 231, 164, 61, + 17, 8, 28, 212, 116, 2, 80, 61, 17, 8, 28, 212, 116, 2, 126, 227, 229, + 61, 17, 8, 28, 212, 116, 2, 87, 61, 17, 8, 28, 212, 38, 2, 171, 61, 17, + 8, 28, 212, 38, 2, 80, 61, 17, 8, 28, 212, 38, 2, 126, 227, 229, 61, 17, + 8, 28, 212, 38, 2, 87, 61, 17, 8, 28, 171, 2, 140, 61, 17, 8, 28, 171, 2, + 80, 61, 17, 8, 28, 140, 2, 171, 61, 17, 8, 28, 140, 2, 80, 61, 17, 8, 28, + 231, 164, 2, 171, 61, 17, 8, 28, 231, 164, 2, 140, 61, 17, 8, 28, 231, + 164, 2, 80, 61, 17, 8, 28, 217, 71, 2, 171, 61, 17, 8, 28, 217, 71, 2, + 140, 61, 17, 8, 28, 217, 71, 2, 231, 164, 61, 17, 8, 28, 217, 71, 2, 80, + 61, 17, 8, 28, 217, 192, 2, 140, 61, 17, 8, 28, 217, 192, 2, 80, 61, 17, + 8, 28, 246, 141, 2, 171, 61, 17, 8, 28, 246, 141, 2, 140, 61, 17, 8, 28, + 246, 141, 2, 231, 164, 61, 17, 8, 28, 246, 141, 2, 80, 61, 17, 8, 28, + 212, 195, 2, 140, 61, 17, 8, 28, 212, 195, 2, 80, 61, 17, 8, 28, 205, + 112, 2, 80, 61, 17, 8, 28, 252, 201, 2, 171, 61, 17, 8, 28, 252, 201, 2, + 80, 61, 17, 8, 28, 240, 95, 2, 171, 61, 17, 8, 28, 240, 95, 2, 80, 61, + 17, 8, 28, 242, 16, 2, 171, 61, 17, 8, 28, 242, 16, 2, 140, 61, 17, 8, + 28, 242, 16, 2, 231, 164, 61, 17, 8, 28, 242, 16, 2, 80, 61, 17, 8, 28, + 242, 16, 2, 126, 227, 229, 61, 17, 8, 28, 242, 16, 2, 87, 61, 17, 8, 28, + 220, 13, 2, 140, 61, 17, 8, 28, 220, 13, 2, 80, 61, 17, 8, 28, 220, 13, + 2, 126, 227, 229, 61, 17, 8, 28, 220, 13, 2, 87, 61, 17, 8, 28, 232, 46, + 2, 126, 61, 17, 8, 28, 232, 46, 2, 171, 61, 17, 8, 28, 232, 46, 2, 140, + 61, 17, 8, 28, 232, 46, 2, 231, 164, 61, 17, 8, 28, 232, 46, 2, 230, 107, + 61, 17, 8, 28, 232, 46, 2, 80, 61, 17, 8, 28, 232, 46, 2, 126, 227, 229, + 61, 17, 8, 28, 232, 46, 2, 87, 61, 17, 8, 28, 230, 107, 2, 171, 61, 17, + 8, 28, 230, 107, 2, 140, 61, 17, 8, 28, 230, 107, 2, 231, 164, 61, 17, 8, + 28, 230, 107, 2, 80, 61, 17, 8, 28, 230, 107, 2, 126, 227, 229, 61, 17, + 8, 28, 230, 107, 2, 87, 61, 17, 8, 28, 80, 2, 171, 61, 17, 8, 28, 80, 2, + 140, 61, 17, 8, 28, 80, 2, 231, 164, 61, 17, 8, 28, 80, 2, 80, 61, 17, 8, + 28, 80, 2, 126, 227, 229, 61, 17, 8, 28, 80, 2, 87, 61, 17, 8, 28, 224, + 55, 2, 171, 61, 17, 8, 28, 224, 55, 2, 140, 61, 17, 8, 28, 224, 55, 2, + 231, 164, 61, 17, 8, 28, 224, 55, 2, 80, 61, 17, 8, 28, 224, 55, 2, 126, + 227, 229, 61, 17, 8, 28, 224, 55, 2, 87, 61, 17, 8, 28, 239, 51, 2, 171, + 61, 17, 8, 28, 239, 51, 2, 80, 61, 17, 8, 28, 239, 51, 2, 126, 227, 229, + 61, 17, 8, 28, 239, 51, 2, 87, 61, 17, 8, 28, 87, 2, 171, 61, 17, 8, 28, + 87, 2, 140, 61, 17, 8, 28, 87, 2, 231, 164, 61, 17, 8, 28, 87, 2, 80, 61, + 17, 8, 28, 87, 2, 126, 227, 229, 61, 17, 8, 28, 87, 2, 87, 61, 17, 8, 28, + 212, 50, 2, 213, 139, 126, 61, 17, 8, 28, 219, 17, 2, 213, 139, 126, 61, + 17, 8, 28, 126, 227, 229, 2, 213, 139, 126, 61, 17, 8, 28, 215, 250, 2, + 246, 105, 61, 17, 8, 28, 215, 250, 2, 231, 251, 61, 17, 8, 28, 215, 250, + 2, 242, 40, 61, 17, 8, 28, 215, 250, 2, 246, 107, 61, 17, 8, 28, 215, + 250, 2, 231, 253, 61, 17, 8, 28, 215, 250, 2, 213, 139, 126, 61, 17, 8, + 28, 87, 2, 239, 112, 84, 2, 219, 17, 42, 17, 8, 28, 87, 2, 239, 112, 84, + 2, 205, 109, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, 80, 42, 17, 8, 28, + 87, 2, 239, 112, 84, 2, 224, 55, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, + 126, 227, 229, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, 87, 42, 17, 8, 28, + 250, 39, 2, 219, 17, 42, 17, 8, 28, 250, 39, 2, 205, 109, 42, 17, 8, 28, + 250, 39, 2, 80, 42, 17, 8, 28, 250, 39, 2, 224, 55, 42, 17, 8, 28, 250, + 39, 2, 126, 227, 229, 42, 17, 8, 28, 250, 39, 2, 87, 42, 17, 8, 28, 212, + 116, 2, 219, 17, 42, 17, 8, 28, 212, 116, 2, 205, 109, 42, 17, 8, 28, + 212, 116, 2, 80, 42, 17, 8, 28, 212, 116, 2, 224, 55, 42, 17, 8, 28, 212, + 116, 2, 126, 227, 229, 42, 17, 8, 28, 212, 116, 2, 87, 42, 17, 8, 28, + 212, 38, 2, 219, 17, 42, 17, 8, 28, 212, 38, 2, 205, 109, 42, 17, 8, 28, + 212, 38, 2, 80, 42, 17, 8, 28, 212, 38, 2, 224, 55, 42, 17, 8, 28, 212, + 38, 2, 126, 227, 229, 42, 17, 8, 28, 212, 38, 2, 87, 42, 17, 8, 28, 242, + 16, 2, 126, 227, 229, 42, 17, 8, 28, 242, 16, 2, 87, 42, 17, 8, 28, 220, + 13, 2, 126, 227, 229, 42, 17, 8, 28, 220, 13, 2, 87, 42, 17, 8, 28, 232, + 46, 2, 126, 42, 17, 8, 28, 232, 46, 2, 230, 107, 42, 17, 8, 28, 232, 46, + 2, 80, 42, 17, 8, 28, 232, 46, 2, 126, 227, 229, 42, 17, 8, 28, 232, 46, + 2, 87, 42, 17, 8, 28, 230, 107, 2, 80, 42, 17, 8, 28, 230, 107, 2, 126, + 227, 229, 42, 17, 8, 28, 230, 107, 2, 87, 42, 17, 8, 28, 80, 2, 126, 42, + 17, 8, 28, 80, 2, 80, 42, 17, 8, 28, 224, 55, 2, 219, 17, 42, 17, 8, 28, + 224, 55, 2, 205, 109, 42, 17, 8, 28, 224, 55, 2, 80, 42, 17, 8, 28, 224, + 55, 2, 224, 55, 42, 17, 8, 28, 224, 55, 2, 126, 227, 229, 42, 17, 8, 28, + 224, 55, 2, 87, 42, 17, 8, 28, 126, 227, 229, 2, 213, 139, 126, 42, 17, + 8, 28, 87, 2, 219, 17, 42, 17, 8, 28, 87, 2, 205, 109, 42, 17, 8, 28, 87, + 2, 80, 42, 17, 8, 28, 87, 2, 224, 55, 42, 17, 8, 28, 87, 2, 126, 227, + 229, 42, 17, 8, 28, 87, 2, 87, 42, 17, 8, 28, 87, 2, 239, 112, 84, 2, + 171, 78, 17, 8, 28, 87, 2, 239, 112, 84, 2, 140, 78, 17, 8, 28, 87, 2, + 239, 112, 84, 2, 231, 164, 78, 17, 8, 28, 87, 2, 239, 112, 84, 2, 80, 78, + 17, 8, 28, 87, 2, 239, 112, 84, 2, 239, 51, 78, 17, 8, 28, 250, 39, 2, + 171, 78, 17, 8, 28, 250, 39, 2, 140, 78, 17, 8, 28, 250, 39, 2, 231, 164, + 78, 17, 8, 28, 250, 39, 2, 80, 78, 17, 8, 28, 250, 39, 2, 239, 51, 78, + 17, 8, 28, 212, 116, 2, 171, 78, 17, 8, 28, 212, 116, 2, 140, 78, 17, 8, + 28, 212, 116, 2, 231, 164, 78, 17, 8, 28, 212, 116, 2, 80, 78, 17, 8, 28, + 212, 116, 2, 239, 51, 78, 17, 8, 28, 212, 38, 2, 80, 78, 17, 8, 28, 171, + 2, 140, 78, 17, 8, 28, 171, 2, 80, 78, 17, 8, 28, 140, 2, 171, 78, 17, 8, + 28, 140, 2, 80, 78, 17, 8, 28, 231, 164, 2, 171, 78, 17, 8, 28, 231, 164, + 2, 80, 78, 17, 8, 28, 217, 71, 2, 171, 78, 17, 8, 28, 217, 71, 2, 140, + 78, 17, 8, 28, 217, 71, 2, 231, 164, 78, 17, 8, 28, 217, 71, 2, 80, 78, + 17, 8, 28, 217, 192, 2, 140, 78, 17, 8, 28, 217, 192, 2, 231, 164, 78, + 17, 8, 28, 217, 192, 2, 80, 78, 17, 8, 28, 246, 141, 2, 171, 78, 17, 8, + 28, 246, 141, 2, 140, 78, 17, 8, 28, 246, 141, 2, 231, 164, 78, 17, 8, + 28, 246, 141, 2, 80, 78, 17, 8, 28, 212, 195, 2, 140, 78, 17, 8, 28, 205, + 112, 2, 80, 78, 17, 8, 28, 252, 201, 2, 171, 78, 17, 8, 28, 252, 201, 2, + 80, 78, 17, 8, 28, 240, 95, 2, 171, 78, 17, 8, 28, 240, 95, 2, 80, 78, + 17, 8, 28, 242, 16, 2, 171, 78, 17, 8, 28, 242, 16, 2, 140, 78, 17, 8, + 28, 242, 16, 2, 231, 164, 78, 17, 8, 28, 242, 16, 2, 80, 78, 17, 8, 28, + 220, 13, 2, 140, 78, 17, 8, 28, 220, 13, 2, 80, 78, 17, 8, 28, 232, 46, + 2, 171, 78, 17, 8, 28, 232, 46, 2, 140, 78, 17, 8, 28, 232, 46, 2, 231, + 164, 78, 17, 8, 28, 232, 46, 2, 230, 107, 78, 17, 8, 28, 232, 46, 2, 80, + 78, 17, 8, 28, 230, 107, 2, 171, 78, 17, 8, 28, 230, 107, 2, 140, 78, 17, + 8, 28, 230, 107, 2, 231, 164, 78, 17, 8, 28, 230, 107, 2, 80, 78, 17, 8, + 28, 230, 107, 2, 239, 51, 78, 17, 8, 28, 80, 2, 171, 78, 17, 8, 28, 80, + 2, 140, 78, 17, 8, 28, 80, 2, 231, 164, 78, 17, 8, 28, 80, 2, 80, 78, 17, + 8, 28, 224, 55, 2, 171, 78, 17, 8, 28, 224, 55, 2, 140, 78, 17, 8, 28, + 224, 55, 2, 231, 164, 78, 17, 8, 28, 224, 55, 2, 80, 78, 17, 8, 28, 224, + 55, 2, 239, 51, 78, 17, 8, 28, 239, 51, 2, 171, 78, 17, 8, 28, 239, 51, + 2, 80, 78, 17, 8, 28, 239, 51, 2, 213, 139, 126, 78, 17, 8, 28, 87, 2, + 171, 78, 17, 8, 28, 87, 2, 140, 78, 17, 8, 28, 87, 2, 231, 164, 78, 17, + 8, 28, 87, 2, 80, 78, 17, 8, 28, 87, 2, 239, 51, 78, 17, 8, 28, 87, 2, + 239, 112, 84, 2, 80, 169, 17, 8, 28, 87, 2, 239, 112, 84, 2, 239, 51, + 169, 17, 8, 28, 250, 39, 2, 80, 169, 17, 8, 28, 250, 39, 2, 239, 51, 169, + 17, 8, 28, 212, 116, 2, 80, 169, 17, 8, 28, 212, 116, 2, 239, 51, 169, + 17, 8, 28, 212, 38, 2, 80, 169, 17, 8, 28, 212, 38, 2, 239, 51, 169, 17, + 8, 28, 217, 71, 2, 80, 169, 17, 8, 28, 217, 71, 2, 239, 51, 169, 17, 8, + 28, 215, 211, 2, 80, 169, 17, 8, 28, 215, 211, 2, 239, 51, 169, 17, 8, + 28, 232, 46, 2, 230, 107, 169, 17, 8, 28, 232, 46, 2, 80, 169, 17, 8, 28, + 230, 107, 2, 80, 169, 17, 8, 28, 224, 55, 2, 80, 169, 17, 8, 28, 224, 55, + 2, 239, 51, 169, 17, 8, 28, 87, 2, 80, 169, 17, 8, 28, 87, 2, 239, 51, + 169, 17, 8, 28, 215, 250, 2, 242, 40, 169, 17, 8, 28, 215, 250, 2, 246, + 107, 169, 17, 8, 28, 215, 250, 2, 231, 253, 169, 17, 8, 28, 212, 195, 2, + 126, 227, 229, 61, 17, 8, 28, 212, 195, 2, 87, 61, 17, 8, 28, 252, 201, + 2, 126, 227, 229, 61, 17, 8, 28, 252, 201, 2, 87, 61, 17, 8, 28, 240, 95, + 2, 126, 227, 229, 61, 17, 8, 28, 240, 95, 2, 87, 61, 17, 8, 28, 217, 71, + 2, 126, 227, 229, 61, 17, 8, 28, 217, 71, 2, 87, 61, 17, 8, 28, 215, 211, + 2, 126, 227, 229, 61, 17, 8, 28, 215, 211, 2, 87, 61, 17, 8, 28, 140, 2, + 126, 227, 229, 61, 17, 8, 28, 140, 2, 87, 61, 17, 8, 28, 171, 2, 126, + 227, 229, 61, 17, 8, 28, 171, 2, 87, 61, 17, 8, 28, 231, 164, 2, 126, + 227, 229, 61, 17, 8, 28, 231, 164, 2, 87, 61, 17, 8, 28, 217, 192, 2, + 126, 227, 229, 61, 17, 8, 28, 217, 192, 2, 87, 61, 17, 8, 28, 246, 141, + 2, 126, 227, 229, 61, 17, 8, 28, 246, 141, 2, 87, 61, 17, 8, 28, 215, + 211, 2, 171, 61, 17, 8, 28, 215, 211, 2, 140, 61, 17, 8, 28, 215, 211, 2, + 231, 164, 61, 17, 8, 28, 215, 211, 2, 80, 61, 17, 8, 28, 215, 211, 2, + 219, 17, 61, 17, 8, 28, 217, 71, 2, 219, 17, 61, 17, 8, 28, 217, 192, 2, + 219, 17, 61, 17, 8, 28, 246, 141, 2, 219, 17, 61, 17, 8, 28, 212, 195, 2, + 126, 227, 229, 42, 17, 8, 28, 212, 195, 2, 87, 42, 17, 8, 28, 252, 201, + 2, 126, 227, 229, 42, 17, 8, 28, 252, 201, 2, 87, 42, 17, 8, 28, 240, 95, + 2, 126, 227, 229, 42, 17, 8, 28, 240, 95, 2, 87, 42, 17, 8, 28, 217, 71, + 2, 126, 227, 229, 42, 17, 8, 28, 217, 71, 2, 87, 42, 17, 8, 28, 215, 211, + 2, 126, 227, 229, 42, 17, 8, 28, 215, 211, 2, 87, 42, 17, 8, 28, 140, 2, + 126, 227, 229, 42, 17, 8, 28, 140, 2, 87, 42, 17, 8, 28, 171, 2, 126, + 227, 229, 42, 17, 8, 28, 171, 2, 87, 42, 17, 8, 28, 231, 164, 2, 126, + 227, 229, 42, 17, 8, 28, 231, 164, 2, 87, 42, 17, 8, 28, 217, 192, 2, + 126, 227, 229, 42, 17, 8, 28, 217, 192, 2, 87, 42, 17, 8, 28, 246, 141, + 2, 126, 227, 229, 42, 17, 8, 28, 246, 141, 2, 87, 42, 17, 8, 28, 215, + 211, 2, 171, 42, 17, 8, 28, 215, 211, 2, 140, 42, 17, 8, 28, 215, 211, 2, + 231, 164, 42, 17, 8, 28, 215, 211, 2, 80, 42, 17, 8, 28, 215, 211, 2, + 219, 17, 42, 17, 8, 28, 217, 71, 2, 219, 17, 42, 17, 8, 28, 217, 192, 2, + 219, 17, 42, 17, 8, 28, 246, 141, 2, 219, 17, 42, 17, 8, 28, 215, 211, 2, + 171, 78, 17, 8, 28, 215, 211, 2, 140, 78, 17, 8, 28, 215, 211, 2, 231, + 164, 78, 17, 8, 28, 215, 211, 2, 80, 78, 17, 8, 28, 217, 71, 2, 239, 51, + 78, 17, 8, 28, 215, 211, 2, 239, 51, 78, 17, 8, 28, 212, 195, 2, 80, 78, + 17, 8, 28, 217, 71, 2, 171, 169, 17, 8, 28, 217, 71, 2, 140, 169, 17, 8, + 28, 217, 71, 2, 231, 164, 169, 17, 8, 28, 215, 211, 2, 171, 169, 17, 8, + 28, 215, 211, 2, 140, 169, 17, 8, 28, 215, 211, 2, 231, 164, 169, 17, 8, + 28, 212, 195, 2, 80, 169, 17, 8, 28, 205, 112, 2, 80, 169, 17, 8, 28, + 126, 2, 242, 38, 42, 17, 8, 28, 126, 2, 242, 38, 61, 17, 222, 110, 47, + 221, 216, 222, 110, 48, 221, 216, 8, 28, 212, 116, 2, 171, 2, 80, 78, 17, + 8, 28, 212, 116, 2, 140, 2, 171, 42, 17, 8, 28, 212, 116, 2, 140, 2, 171, + 78, 17, 8, 28, 212, 116, 2, 140, 2, 80, 78, 17, 8, 28, 212, 116, 2, 231, + 164, 2, 80, 78, 17, 8, 28, 212, 116, 2, 80, 2, 171, 78, 17, 8, 28, 212, + 116, 2, 80, 2, 140, 78, 17, 8, 28, 212, 116, 2, 80, 2, 231, 164, 78, 17, + 8, 28, 171, 2, 80, 2, 140, 42, 17, 8, 28, 171, 2, 80, 2, 140, 78, 17, 8, + 28, 140, 2, 80, 2, 87, 42, 17, 8, 28, 140, 2, 80, 2, 126, 227, 229, 42, + 17, 8, 28, 217, 71, 2, 140, 2, 171, 78, 17, 8, 28, 217, 71, 2, 171, 2, + 140, 78, 17, 8, 28, 217, 71, 2, 171, 2, 126, 227, 229, 42, 17, 8, 28, + 217, 71, 2, 80, 2, 140, 42, 17, 8, 28, 217, 71, 2, 80, 2, 140, 78, 17, 8, + 28, 217, 71, 2, 80, 2, 171, 78, 17, 8, 28, 217, 71, 2, 80, 2, 80, 42, 17, + 8, 28, 217, 71, 2, 80, 2, 80, 78, 17, 8, 28, 217, 192, 2, 140, 2, 140, + 42, 17, 8, 28, 217, 192, 2, 140, 2, 140, 78, 17, 8, 28, 217, 192, 2, 80, + 2, 80, 42, 17, 8, 28, 215, 211, 2, 140, 2, 80, 42, 17, 8, 28, 215, 211, + 2, 140, 2, 80, 78, 17, 8, 28, 215, 211, 2, 171, 2, 87, 42, 17, 8, 28, + 215, 211, 2, 80, 2, 231, 164, 42, 17, 8, 28, 215, 211, 2, 80, 2, 231, + 164, 78, 17, 8, 28, 215, 211, 2, 80, 2, 80, 42, 17, 8, 28, 215, 211, 2, + 80, 2, 80, 78, 17, 8, 28, 246, 141, 2, 140, 2, 126, 227, 229, 42, 17, 8, + 28, 246, 141, 2, 231, 164, 2, 80, 42, 17, 8, 28, 246, 141, 2, 231, 164, + 2, 80, 78, 17, 8, 28, 212, 195, 2, 80, 2, 140, 42, 17, 8, 28, 212, 195, + 2, 80, 2, 140, 78, 17, 8, 28, 212, 195, 2, 80, 2, 80, 78, 17, 8, 28, 212, + 195, 2, 80, 2, 87, 42, 17, 8, 28, 252, 201, 2, 171, 2, 80, 42, 17, 8, 28, + 252, 201, 2, 80, 2, 80, 42, 17, 8, 28, 252, 201, 2, 80, 2, 80, 78, 17, 8, + 28, 252, 201, 2, 80, 2, 126, 227, 229, 42, 17, 8, 28, 240, 95, 2, 80, 2, + 80, 42, 17, 8, 28, 240, 95, 2, 80, 2, 87, 42, 17, 8, 28, 240, 95, 2, 80, + 2, 126, 227, 229, 42, 17, 8, 28, 242, 16, 2, 231, 164, 2, 80, 42, 17, 8, + 28, 242, 16, 2, 231, 164, 2, 80, 78, 17, 8, 28, 220, 13, 2, 80, 2, 140, + 42, 17, 8, 28, 220, 13, 2, 80, 2, 80, 42, 17, 8, 28, 230, 107, 2, 140, 2, + 80, 42, 17, 8, 28, 230, 107, 2, 140, 2, 87, 42, 17, 8, 28, 230, 107, 2, + 140, 2, 126, 227, 229, 42, 17, 8, 28, 230, 107, 2, 171, 2, 171, 78, 17, + 8, 28, 230, 107, 2, 171, 2, 171, 42, 17, 8, 28, 230, 107, 2, 231, 164, 2, + 80, 42, 17, 8, 28, 230, 107, 2, 231, 164, 2, 80, 78, 17, 8, 28, 230, 107, + 2, 80, 2, 140, 42, 17, 8, 28, 230, 107, 2, 80, 2, 140, 78, 17, 8, 28, 80, + 2, 140, 2, 171, 78, 17, 8, 28, 80, 2, 140, 2, 80, 78, 17, 8, 28, 80, 2, + 140, 2, 87, 42, 17, 8, 28, 80, 2, 171, 2, 140, 78, 17, 8, 28, 80, 2, 171, + 2, 80, 78, 17, 8, 28, 80, 2, 231, 164, 2, 171, 78, 17, 8, 28, 80, 2, 231, + 164, 2, 80, 78, 17, 8, 28, 80, 2, 171, 2, 231, 164, 78, 17, 8, 28, 239, + 51, 2, 80, 2, 171, 78, 17, 8, 28, 239, 51, 2, 80, 2, 80, 78, 17, 8, 28, + 224, 55, 2, 140, 2, 80, 78, 17, 8, 28, 224, 55, 2, 140, 2, 126, 227, 229, + 42, 17, 8, 28, 224, 55, 2, 171, 2, 80, 42, 17, 8, 28, 224, 55, 2, 171, 2, + 80, 78, 17, 8, 28, 224, 55, 2, 171, 2, 126, 227, 229, 42, 17, 8, 28, 224, + 55, 2, 80, 2, 87, 42, 17, 8, 28, 224, 55, 2, 80, 2, 126, 227, 229, 42, + 17, 8, 28, 87, 2, 80, 2, 80, 42, 17, 8, 28, 87, 2, 80, 2, 80, 78, 17, 8, + 28, 250, 39, 2, 231, 164, 2, 87, 42, 17, 8, 28, 212, 116, 2, 171, 2, 87, + 42, 17, 8, 28, 212, 116, 2, 171, 2, 126, 227, 229, 42, 17, 8, 28, 212, + 116, 2, 231, 164, 2, 87, 42, 17, 8, 28, 212, 116, 2, 231, 164, 2, 126, + 227, 229, 42, 17, 8, 28, 212, 116, 2, 80, 2, 87, 42, 17, 8, 28, 212, 116, + 2, 80, 2, 126, 227, 229, 42, 17, 8, 28, 171, 2, 80, 2, 87, 42, 17, 8, 28, + 171, 2, 140, 2, 126, 227, 229, 42, 17, 8, 28, 171, 2, 80, 2, 126, 227, + 229, 42, 17, 8, 28, 217, 71, 2, 231, 164, 2, 126, 227, 229, 42, 17, 8, + 28, 217, 192, 2, 140, 2, 87, 42, 17, 8, 28, 215, 211, 2, 140, 2, 87, 42, + 17, 8, 28, 246, 141, 2, 140, 2, 87, 42, 17, 8, 28, 230, 107, 2, 171, 2, + 87, 42, 17, 8, 28, 230, 107, 2, 80, 2, 87, 42, 17, 8, 28, 87, 2, 140, 2, + 87, 42, 17, 8, 28, 87, 2, 171, 2, 87, 42, 17, 8, 28, 87, 2, 80, 2, 87, + 42, 17, 8, 28, 80, 2, 80, 2, 87, 42, 17, 8, 28, 220, 13, 2, 80, 2, 87, + 42, 17, 8, 28, 224, 55, 2, 140, 2, 87, 42, 17, 8, 28, 220, 13, 2, 80, 2, + 140, 78, 17, 8, 28, 230, 107, 2, 140, 2, 80, 78, 17, 8, 28, 252, 201, 2, + 80, 2, 87, 42, 17, 8, 28, 232, 46, 2, 80, 2, 87, 42, 17, 8, 28, 224, 55, + 2, 171, 2, 140, 78, 17, 8, 28, 80, 2, 231, 164, 2, 87, 42, 17, 8, 28, + 230, 107, 2, 171, 2, 80, 78, 17, 8, 28, 232, 46, 2, 80, 2, 80, 42, 17, 8, + 28, 230, 107, 2, 171, 2, 80, 42, 17, 8, 28, 224, 55, 2, 171, 2, 140, 42, + 17, 8, 28, 171, 2, 140, 2, 87, 42, 17, 8, 28, 140, 2, 171, 2, 87, 42, 17, + 8, 28, 80, 2, 171, 2, 87, 42, 17, 8, 28, 242, 16, 2, 80, 2, 87, 42, 17, + 8, 28, 250, 39, 2, 140, 2, 87, 42, 17, 8, 28, 232, 46, 2, 80, 2, 80, 78, + 17, 8, 28, 252, 201, 2, 171, 2, 80, 78, 17, 8, 28, 217, 192, 2, 80, 2, + 80, 78, 17, 8, 28, 217, 71, 2, 231, 164, 2, 87, 42, 17, 8, 28, 224, 55, + 2, 171, 2, 87, 42, 17, 8, 28, 217, 168, 209, 172, 251, 232, 231, 25, 213, + 252, 3, 61, 17, 8, 28, 220, 9, 209, 172, 251, 232, 231, 25, 213, 252, 3, + 61, 17, 8, 28, 252, 155, 61, 17, 8, 28, 252, 186, 61, 17, 8, 28, 226, + 171, 61, 17, 8, 28, 217, 169, 61, 17, 8, 28, 219, 67, 61, 17, 8, 28, 252, + 175, 61, 17, 8, 28, 207, 79, 61, 17, 8, 28, 217, 168, 61, 17, 8, 28, 217, + 167, 252, 175, 207, 78, 8, 28, 232, 192, 218, 207, 53, 8, 28, 249, 211, + 252, 35, 252, 36, 54, 217, 58, 54, 216, 203, 54, 216, 135, 54, 216, 124, + 54, 216, 113, 54, 216, 102, 54, 216, 91, 54, 216, 80, 54, 216, 69, 54, + 217, 57, 54, 217, 46, 54, 217, 35, 54, 217, 24, 54, 217, 13, 54, 217, 2, + 54, 216, 247, 220, 131, 241, 136, 33, 79, 247, 155, 220, 131, 241, 136, + 33, 79, 128, 247, 155, 220, 131, 241, 136, 33, 79, 128, 241, 82, 213, + 251, 220, 131, 241, 136, 33, 79, 247, 162, 220, 131, 241, 136, 33, 79, + 216, 52, 220, 131, 241, 136, 33, 79, 242, 168, 83, 220, 131, 241, 136, + 33, 79, 219, 196, 83, 220, 131, 241, 136, 33, 79, 47, 59, 230, 16, 145, + 220, 131, 241, 136, 33, 79, 48, 59, 230, 16, 249, 132, 220, 131, 241, + 136, 33, 79, 194, 243, 54, 36, 28, 47, 239, 121, 36, 28, 48, 239, 121, + 36, 50, 211, 181, 47, 239, 121, 36, 50, 211, 181, 48, 239, 121, 36, 228, + 14, 47, 239, 121, 36, 228, 14, 48, 239, 121, 36, 247, 130, 228, 13, 36, + 28, 47, 160, 55, 36, 28, 48, 160, 55, 36, 211, 181, 47, 160, 55, 36, 211, + 181, 48, 160, 55, 36, 228, 14, 47, 160, 55, 36, 228, 14, 48, 160, 55, 36, + 247, 130, 228, 14, 55, 220, 131, 241, 136, 33, 79, 118, 67, 230, 56, 220, + 131, 241, 136, 33, 79, 243, 51, 246, 78, 220, 131, 241, 136, 33, 79, 243, + 42, 246, 78, 220, 131, 241, 136, 33, 79, 114, 229, 205, 220, 131, 241, + 136, 33, 79, 207, 61, 114, 229, 205, 220, 131, 241, 136, 33, 79, 47, 221, + 216, 220, 131, 241, 136, 33, 79, 48, 221, 216, 220, 131, 241, 136, 33, + 79, 47, 247, 26, 145, 220, 131, 241, 136, 33, 79, 48, 247, 26, 145, 220, + 131, 241, 136, 33, 79, 47, 211, 93, 215, 204, 145, 220, 131, 241, 136, + 33, 79, 48, 211, 93, 215, 204, 145, 220, 131, 241, 136, 33, 79, 47, 60, + 230, 16, 145, 220, 131, 241, 136, 33, 79, 48, 60, 230, 16, 145, 220, 131, + 241, 136, 33, 79, 47, 50, 252, 109, 145, 220, 131, 241, 136, 33, 79, 48, + 50, 252, 109, 145, 220, 131, 241, 136, 33, 79, 47, 252, 109, 145, 220, + 131, 241, 136, 33, 79, 48, 252, 109, 145, 220, 131, 241, 136, 33, 79, 47, + 247, 92, 145, 220, 131, 241, 136, 33, 79, 48, 247, 92, 145, 220, 131, + 241, 136, 33, 79, 47, 59, 247, 92, 145, 220, 131, 241, 136, 33, 79, 48, + 59, 247, 92, 145, 216, 32, 245, 23, 59, 216, 32, 245, 23, 220, 131, 241, + 136, 33, 79, 47, 49, 145, 220, 131, 241, 136, 33, 79, 48, 49, 145, 246, + 77, 222, 81, 248, 125, 222, 81, 207, 61, 222, 81, 50, 207, 61, 222, 81, + 246, 77, 114, 229, 205, 248, 125, 114, 229, 205, 207, 61, 114, 229, 205, + 5, 247, 155, 5, 128, 247, 155, 5, 241, 82, 213, 251, 5, 216, 52, 5, 247, + 162, 5, 219, 196, 83, 5, 242, 168, 83, 5, 243, 51, 246, 78, 5, 47, 221, + 216, 5, 48, 221, 216, 5, 47, 247, 26, 145, 5, 48, 247, 26, 145, 5, 47, + 211, 93, 215, 204, 145, 5, 48, 211, 93, 215, 204, 145, 5, 43, 53, 5, 252, + 125, 5, 251, 209, 5, 101, 53, 5, 237, 238, 5, 230, 10, 53, 5, 239, 230, + 53, 5, 242, 242, 53, 5, 218, 225, 214, 180, 5, 245, 35, 53, 5, 221, 131, + 53, 5, 247, 153, 251, 199, 8, 242, 38, 61, 17, 8, 212, 154, 2, 242, 38, + 52, 8, 246, 105, 61, 17, 8, 212, 192, 241, 115, 8, 231, 251, 61, 17, 8, + 242, 40, 61, 17, 8, 242, 40, 169, 17, 8, 246, 107, 61, 17, 8, 246, 107, + 169, 17, 8, 231, 253, 61, 17, 8, 231, 253, 169, 17, 8, 215, 250, 61, 17, + 8, 215, 250, 169, 17, 8, 213, 163, 61, 17, 8, 213, 163, 169, 17, 8, 1, + 239, 112, 61, 17, 8, 1, 126, 2, 228, 9, 84, 61, 17, 8, 1, 126, 2, 228, 9, + 84, 42, 17, 8, 1, 126, 2, 239, 112, 84, 61, 17, 8, 1, 126, 2, 239, 112, + 84, 42, 17, 8, 1, 207, 60, 2, 239, 112, 84, 61, 17, 8, 1, 207, 60, 2, + 239, 112, 84, 42, 17, 8, 1, 126, 2, 239, 112, 250, 26, 61, 17, 8, 1, 126, + 2, 239, 112, 250, 26, 42, 17, 8, 1, 87, 2, 239, 112, 84, 61, 17, 8, 1, + 87, 2, 239, 112, 84, 42, 17, 8, 1, 87, 2, 239, 112, 84, 78, 17, 8, 1, 87, + 2, 239, 112, 84, 169, 17, 8, 1, 126, 61, 17, 8, 1, 126, 42, 17, 8, 1, + 250, 39, 61, 17, 8, 1, 250, 39, 42, 17, 8, 1, 250, 39, 78, 17, 8, 1, 250, + 39, 169, 17, 8, 1, 212, 116, 227, 198, 61, 17, 8, 1, 212, 116, 227, 198, + 42, 17, 8, 1, 212, 116, 61, 17, 8, 1, 212, 116, 42, 17, 8, 1, 212, 116, + 78, 17, 8, 1, 212, 116, 169, 17, 8, 1, 212, 38, 61, 17, 8, 1, 212, 38, + 42, 17, 8, 1, 212, 38, 78, 17, 8, 1, 212, 38, 169, 17, 8, 1, 171, 61, 17, + 8, 1, 171, 42, 17, 8, 1, 171, 78, 17, 8, 1, 171, 169, 17, 8, 1, 140, 61, + 17, 8, 1, 140, 42, 17, 8, 1, 140, 78, 17, 8, 1, 140, 169, 17, 8, 1, 231, + 164, 61, 17, 8, 1, 231, 164, 42, 17, 8, 1, 231, 164, 78, 17, 8, 1, 231, + 164, 169, 17, 8, 1, 246, 118, 61, 17, 8, 1, 246, 118, 42, 17, 8, 1, 212, + 50, 61, 17, 8, 1, 212, 50, 42, 17, 8, 1, 219, 17, 61, 17, 8, 1, 219, 17, + 42, 17, 8, 1, 205, 109, 61, 17, 8, 1, 205, 109, 42, 17, 8, 1, 217, 71, + 61, 17, 8, 1, 217, 71, 42, 17, 8, 1, 217, 71, 78, 17, 8, 1, 217, 71, 169, + 17, 8, 1, 215, 211, 61, 17, 8, 1, 215, 211, 42, 17, 8, 1, 215, 211, 78, + 17, 8, 1, 215, 211, 169, 17, 8, 1, 217, 192, 61, 17, 8, 1, 217, 192, 42, + 17, 8, 1, 217, 192, 78, 17, 8, 1, 217, 192, 169, 17, 8, 1, 246, 141, 61, + 17, 8, 1, 246, 141, 42, 17, 8, 1, 246, 141, 78, 17, 8, 1, 246, 141, 169, + 17, 8, 1, 212, 195, 61, 17, 8, 1, 212, 195, 42, 17, 8, 1, 212, 195, 78, + 17, 8, 1, 212, 195, 169, 17, 8, 1, 205, 112, 61, 17, 8, 1, 205, 112, 42, + 17, 8, 1, 205, 112, 78, 17, 8, 1, 205, 112, 169, 17, 8, 1, 252, 201, 61, + 17, 8, 1, 252, 201, 42, 17, 8, 1, 252, 201, 78, 17, 8, 1, 252, 201, 169, + 17, 8, 1, 240, 95, 61, 17, 8, 1, 240, 95, 42, 17, 8, 1, 240, 95, 78, 17, + 8, 1, 240, 95, 169, 17, 8, 1, 242, 16, 61, 17, 8, 1, 242, 16, 42, 17, 8, + 1, 242, 16, 78, 17, 8, 1, 242, 16, 169, 17, 8, 1, 220, 13, 61, 17, 8, 1, + 220, 13, 42, 17, 8, 1, 220, 13, 78, 17, 8, 1, 220, 13, 169, 17, 8, 1, + 232, 46, 61, 17, 8, 1, 232, 46, 42, 17, 8, 1, 232, 46, 78, 17, 8, 1, 232, + 46, 169, 17, 8, 1, 230, 107, 61, 17, 8, 1, 230, 107, 42, 17, 8, 1, 230, + 107, 78, 17, 8, 1, 230, 107, 169, 17, 8, 1, 80, 61, 17, 8, 1, 80, 42, 17, + 8, 1, 80, 78, 17, 8, 1, 80, 169, 17, 8, 1, 224, 55, 61, 17, 8, 1, 224, + 55, 42, 17, 8, 1, 224, 55, 78, 17, 8, 1, 224, 55, 169, 17, 8, 1, 239, 51, + 61, 17, 8, 1, 239, 51, 42, 17, 8, 1, 239, 51, 78, 17, 8, 1, 239, 51, 169, + 17, 8, 1, 207, 60, 61, 17, 8, 1, 207, 60, 42, 17, 8, 1, 126, 227, 229, + 61, 17, 8, 1, 126, 227, 229, 42, 17, 8, 1, 87, 61, 17, 8, 1, 87, 42, 17, + 8, 1, 87, 78, 17, 8, 1, 87, 169, 17, 8, 28, 230, 107, 2, 126, 2, 228, 9, + 84, 61, 17, 8, 28, 230, 107, 2, 126, 2, 228, 9, 84, 42, 17, 8, 28, 230, + 107, 2, 126, 2, 239, 112, 84, 61, 17, 8, 28, 230, 107, 2, 126, 2, 239, + 112, 84, 42, 17, 8, 28, 230, 107, 2, 126, 2, 239, 112, 250, 26, 61, 17, + 8, 28, 230, 107, 2, 126, 2, 239, 112, 250, 26, 42, 17, 8, 28, 230, 107, + 2, 126, 61, 17, 8, 28, 230, 107, 2, 126, 42, 17, 205, 86, 207, 15, 224, + 66, 214, 153, 144, 242, 168, 83, 144, 219, 180, 83, 144, 43, 53, 144, + 245, 35, 53, 144, 221, 131, 53, 144, 252, 125, 144, 252, 53, 144, 47, + 221, 216, 144, 48, 221, 216, 144, 251, 209, 144, 101, 53, 144, 247, 155, + 144, 237, 238, 144, 241, 82, 213, 251, 144, 214, 180, 144, 18, 205, 85, + 144, 18, 102, 144, 18, 105, 144, 18, 142, 144, 18, 139, 144, 18, 168, + 144, 18, 184, 144, 18, 195, 144, 18, 193, 144, 18, 200, 144, 247, 162, + 144, 216, 52, 144, 230, 10, 53, 144, 242, 242, 53, 144, 239, 230, 53, + 144, 219, 196, 83, 144, 247, 153, 251, 199, 144, 7, 6, 1, 62, 144, 7, 6, + 1, 251, 150, 144, 7, 6, 1, 249, 34, 144, 7, 6, 1, 246, 240, 144, 7, 6, 1, + 75, 144, 7, 6, 1, 242, 139, 144, 7, 6, 1, 241, 55, 144, 7, 6, 1, 239, + 155, 144, 7, 6, 1, 74, 144, 7, 6, 1, 232, 203, 144, 7, 6, 1, 232, 76, + 144, 7, 6, 1, 149, 144, 7, 6, 1, 229, 28, 144, 7, 6, 1, 226, 33, 144, 7, + 6, 1, 76, 144, 7, 6, 1, 222, 67, 144, 7, 6, 1, 220, 27, 144, 7, 6, 1, + 137, 144, 7, 6, 1, 182, 144, 7, 6, 1, 213, 10, 144, 7, 6, 1, 71, 144, 7, + 6, 1, 209, 148, 144, 7, 6, 1, 207, 129, 144, 7, 6, 1, 206, 195, 144, 7, + 6, 1, 206, 123, 144, 7, 6, 1, 205, 159, 144, 47, 49, 145, 144, 218, 225, + 214, 180, 144, 48, 49, 145, 144, 247, 228, 253, 21, 144, 114, 229, 205, + 144, 239, 237, 253, 21, 144, 7, 5, 1, 62, 144, 7, 5, 1, 251, 150, 144, 7, + 5, 1, 249, 34, 144, 7, 5, 1, 246, 240, 144, 7, 5, 1, 75, 144, 7, 5, 1, + 242, 139, 144, 7, 5, 1, 241, 55, 144, 7, 5, 1, 239, 155, 144, 7, 5, 1, + 74, 144, 7, 5, 1, 232, 203, 144, 7, 5, 1, 232, 76, 144, 7, 5, 1, 149, + 144, 7, 5, 1, 229, 28, 144, 7, 5, 1, 226, 33, 144, 7, 5, 1, 76, 144, 7, + 5, 1, 222, 67, 144, 7, 5, 1, 220, 27, 144, 7, 5, 1, 137, 144, 7, 5, 1, + 182, 144, 7, 5, 1, 213, 10, 144, 7, 5, 1, 71, 144, 7, 5, 1, 209, 148, + 144, 7, 5, 1, 207, 129, 144, 7, 5, 1, 206, 195, 144, 7, 5, 1, 206, 123, + 144, 7, 5, 1, 205, 159, 144, 47, 247, 26, 145, 144, 79, 229, 205, 144, + 48, 247, 26, 145, 144, 211, 180, 144, 47, 59, 221, 216, 144, 48, 59, 221, + 216, 116, 128, 241, 82, 213, 251, 116, 47, 247, 92, 145, 116, 48, 247, + 92, 145, 116, 128, 247, 155, 116, 64, 226, 247, 245, 23, 116, 64, 1, 206, + 250, 116, 64, 1, 5, 62, 116, 64, 1, 5, 74, 116, 64, 1, 5, 71, 116, 64, 1, + 5, 75, 116, 64, 1, 5, 76, 116, 64, 1, 5, 190, 116, 64, 1, 5, 205, 213, + 116, 64, 1, 5, 205, 247, 116, 64, 1, 5, 210, 170, 116, 231, 248, 220, + 106, 214, 165, 83, 116, 64, 1, 62, 116, 64, 1, 74, 116, 64, 1, 71, 116, + 64, 1, 75, 116, 64, 1, 76, 116, 64, 1, 172, 116, 64, 1, 231, 123, 116, + 64, 1, 230, 236, 116, 64, 1, 231, 224, 116, 64, 1, 231, 53, 116, 64, 1, + 217, 199, 116, 64, 1, 215, 80, 116, 64, 1, 213, 203, 116, 64, 1, 217, 86, + 116, 64, 1, 214, 193, 116, 64, 1, 212, 219, 116, 64, 1, 211, 211, 116, + 64, 1, 210, 170, 116, 64, 1, 212, 131, 116, 64, 1, 124, 116, 64, 1, 199, + 116, 64, 1, 224, 230, 116, 64, 1, 223, 217, 116, 64, 1, 225, 110, 116, + 64, 1, 224, 67, 116, 64, 1, 155, 116, 64, 1, 239, 11, 116, 64, 1, 238, + 42, 116, 64, 1, 239, 71, 116, 64, 1, 238, 149, 116, 64, 1, 185, 116, 64, + 1, 226, 254, 116, 64, 1, 226, 114, 116, 64, 1, 227, 119, 116, 64, 1, 226, + 181, 116, 64, 1, 190, 116, 64, 1, 205, 213, 116, 64, 1, 205, 247, 116, + 64, 1, 219, 113, 116, 64, 1, 218, 208, 116, 64, 1, 218, 50, 116, 64, 1, + 219, 51, 116, 64, 1, 218, 124, 116, 64, 1, 207, 96, 116, 64, 1, 226, 33, + 116, 64, 208, 170, 214, 165, 83, 116, 64, 216, 57, 214, 165, 83, 116, 25, + 241, 232, 116, 25, 1, 231, 84, 116, 25, 1, 214, 88, 116, 25, 1, 231, 77, + 116, 25, 1, 224, 223, 116, 25, 1, 224, 221, 116, 25, 1, 224, 220, 116, + 25, 1, 211, 193, 116, 25, 1, 214, 77, 116, 25, 1, 218, 198, 116, 25, 1, + 218, 193, 116, 25, 1, 218, 190, 116, 25, 1, 218, 183, 116, 25, 1, 218, + 178, 116, 25, 1, 218, 173, 116, 25, 1, 218, 184, 116, 25, 1, 218, 196, + 116, 25, 1, 226, 240, 116, 25, 1, 221, 39, 116, 25, 1, 214, 85, 116, 25, + 1, 221, 28, 116, 25, 1, 215, 33, 116, 25, 1, 214, 82, 116, 25, 1, 233, + 125, 116, 25, 1, 247, 246, 116, 25, 1, 214, 92, 116, 25, 1, 248, 54, 116, + 25, 1, 231, 143, 116, 25, 1, 212, 15, 116, 25, 1, 221, 76, 116, 25, 1, + 239, 3, 116, 25, 1, 62, 116, 25, 1, 252, 248, 116, 25, 1, 190, 116, 25, + 1, 206, 98, 116, 25, 1, 243, 6, 116, 25, 1, 75, 116, 25, 1, 206, 39, 116, + 25, 1, 206, 52, 116, 25, 1, 76, 116, 25, 1, 207, 96, 116, 25, 1, 207, 92, + 116, 25, 1, 222, 206, 116, 25, 1, 205, 247, 116, 25, 1, 71, 116, 25, 1, + 207, 38, 116, 25, 1, 207, 51, 116, 25, 1, 207, 20, 116, 25, 1, 205, 213, + 116, 25, 1, 242, 192, 116, 25, 1, 206, 11, 116, 25, 1, 74, 144, 248, 131, + 53, 144, 220, 165, 53, 144, 224, 43, 53, 144, 228, 13, 144, 249, 111, + 134, 144, 206, 43, 53, 144, 206, 240, 53, 116, 241, 133, 147, 209, 22, + 116, 92, 45, 116, 167, 45, 116, 86, 45, 116, 173, 45, 116, 60, 214, 107, + 116, 59, 247, 233, 233, 14, 252, 98, 252, 119, 233, 14, 252, 98, 216, 39, + 233, 14, 252, 98, 212, 86, 222, 223, 218, 247, 248, 94, 218, 247, 248, + 94, 26, 63, 4, 251, 134, 62, 26, 63, 4, 251, 103, 75, 26, 63, 4, 251, + 112, 74, 26, 63, 4, 251, 80, 76, 26, 63, 4, 251, 130, 71, 26, 63, 4, 251, + 149, 246, 145, 26, 63, 4, 251, 96, 246, 9, 26, 63, 4, 251, 136, 245, 168, + 26, 63, 4, 251, 126, 245, 51, 26, 63, 4, 251, 90, 243, 237, 26, 63, 4, + 251, 84, 232, 200, 26, 63, 4, 251, 95, 232, 182, 26, 63, 4, 251, 105, + 232, 122, 26, 63, 4, 251, 76, 232, 104, 26, 63, 4, 251, 64, 172, 26, 63, + 4, 251, 97, 231, 224, 26, 63, 4, 251, 74, 231, 123, 26, 63, 4, 251, 71, + 231, 53, 26, 63, 4, 251, 60, 230, 236, 26, 63, 4, 251, 61, 185, 26, 63, + 4, 251, 127, 227, 119, 26, 63, 4, 251, 68, 226, 254, 26, 63, 4, 251, 125, + 226, 181, 26, 63, 4, 251, 117, 226, 114, 26, 63, 4, 251, 138, 199, 26, + 63, 4, 251, 116, 225, 110, 26, 63, 4, 251, 110, 224, 230, 26, 63, 4, 251, + 89, 224, 67, 26, 63, 4, 251, 86, 223, 217, 26, 63, 4, 251, 145, 179, 26, + 63, 4, 251, 69, 221, 174, 26, 63, 4, 251, 102, 221, 53, 26, 63, 4, 251, + 129, 220, 211, 26, 63, 4, 251, 91, 220, 82, 26, 63, 4, 251, 124, 220, 19, + 26, 63, 4, 251, 63, 219, 255, 26, 63, 4, 251, 119, 219, 237, 26, 63, 4, + 251, 108, 219, 226, 26, 63, 4, 251, 81, 219, 113, 26, 63, 4, 251, 113, + 219, 51, 26, 63, 4, 251, 88, 218, 208, 26, 63, 4, 251, 147, 218, 124, 26, + 63, 4, 251, 114, 218, 50, 26, 63, 4, 251, 109, 217, 199, 26, 63, 4, 251, + 132, 217, 86, 26, 63, 4, 251, 100, 215, 80, 26, 63, 4, 251, 128, 214, + 193, 26, 63, 4, 251, 83, 213, 203, 26, 63, 4, 251, 82, 212, 219, 26, 63, + 4, 251, 143, 212, 131, 26, 63, 4, 251, 104, 211, 211, 26, 63, 4, 251, + 141, 124, 26, 63, 4, 251, 72, 210, 170, 26, 63, 4, 251, 87, 207, 96, 26, + 63, 4, 251, 66, 207, 51, 26, 63, 4, 251, 101, 207, 20, 26, 63, 4, 251, + 99, 206, 250, 26, 63, 4, 251, 123, 205, 116, 26, 63, 4, 251, 67, 205, 93, + 26, 63, 4, 251, 120, 205, 19, 26, 63, 4, 251, 115, 254, 166, 26, 63, 4, + 251, 98, 254, 165, 26, 63, 4, 251, 57, 251, 184, 26, 63, 4, 251, 70, 243, + 205, 26, 63, 4, 251, 53, 243, 204, 26, 63, 4, 251, 93, 223, 153, 26, 63, + 4, 251, 111, 220, 80, 26, 63, 4, 251, 79, 220, 84, 26, 63, 4, 251, 65, + 219, 111, 26, 63, 4, 251, 107, 219, 110, 26, 63, 4, 251, 73, 218, 123, + 26, 63, 4, 251, 75, 212, 216, 26, 63, 4, 251, 55, 210, 128, 26, 63, 4, + 251, 52, 105, 26, 63, 16, 251, 122, 26, 63, 16, 251, 121, 26, 63, 16, + 251, 118, 26, 63, 16, 251, 106, 26, 63, 16, 251, 94, 26, 63, 16, 251, 92, + 26, 63, 16, 251, 85, 26, 63, 16, 251, 78, 26, 63, 16, 251, 77, 26, 63, + 16, 251, 62, 26, 63, 16, 251, 59, 26, 63, 16, 251, 58, 26, 63, 16, 251, + 56, 26, 63, 16, 251, 54, 26, 63, 122, 251, 51, 227, 221, 26, 63, 122, + 251, 50, 206, 244, 26, 63, 122, 251, 49, 245, 248, 26, 63, 122, 251, 48, + 242, 239, 26, 63, 122, 251, 47, 227, 192, 26, 63, 122, 251, 46, 214, 33, + 26, 63, 122, 251, 45, 242, 174, 26, 63, 122, 251, 44, 219, 77, 26, 63, + 122, 251, 43, 215, 213, 26, 63, 122, 251, 42, 239, 70, 26, 63, 122, 251, + 41, 214, 160, 26, 63, 122, 251, 40, 249, 182, 26, 63, 122, 251, 39, 247, + 75, 26, 63, 122, 251, 38, 249, 87, 26, 63, 122, 251, 37, 207, 28, 26, 63, + 122, 251, 36, 250, 125, 26, 63, 122, 251, 35, 222, 175, 26, 63, 122, 251, + 34, 214, 132, 26, 63, 122, 251, 33, 246, 248, 26, 63, 226, 160, 251, 32, + 232, 16, 26, 63, 226, 160, 251, 31, 232, 25, 26, 63, 122, 251, 30, 222, + 189, 26, 63, 122, 251, 29, 207, 5, 26, 63, 122, 251, 28, 26, 63, 226, + 160, 251, 27, 252, 12, 26, 63, 226, 160, 251, 26, 227, 76, 26, 63, 122, + 251, 25, 249, 110, 26, 63, 122, 251, 24, 240, 11, 26, 63, 122, 251, 23, + 26, 63, 122, 251, 22, 206, 235, 26, 63, 122, 251, 21, 26, 63, 122, 251, + 20, 26, 63, 122, 251, 19, 238, 69, 26, 63, 122, 251, 18, 26, 63, 122, + 251, 17, 26, 63, 122, 251, 16, 26, 63, 226, 160, 251, 14, 210, 142, 26, + 63, 122, 251, 13, 26, 63, 122, 251, 12, 26, 63, 122, 251, 11, 247, 186, + 26, 63, 122, 251, 10, 26, 63, 122, 251, 9, 26, 63, 122, 251, 8, 240, 201, + 26, 63, 122, 251, 7, 251, 255, 26, 63, 122, 251, 6, 26, 63, 122, 251, 5, + 26, 63, 122, 251, 4, 26, 63, 122, 251, 3, 26, 63, 122, 251, 2, 26, 63, + 122, 251, 1, 26, 63, 122, 251, 0, 26, 63, 122, 250, 255, 26, 63, 122, + 250, 254, 26, 63, 122, 250, 253, 226, 152, 26, 63, 122, 250, 252, 26, 63, + 122, 250, 251, 211, 61, 26, 63, 122, 250, 250, 26, 63, 122, 250, 249, 26, + 63, 122, 250, 248, 26, 63, 122, 250, 247, 26, 63, 122, 250, 246, 26, 63, + 122, 250, 245, 26, 63, 122, 250, 244, 26, 63, 122, 250, 243, 26, 63, 122, + 250, 242, 26, 63, 122, 250, 241, 26, 63, 122, 250, 240, 26, 63, 122, 250, + 239, 239, 43, 26, 63, 122, 250, 218, 241, 144, 26, 63, 122, 250, 215, + 250, 103, 26, 63, 122, 250, 210, 214, 139, 26, 63, 122, 250, 209, 45, 26, + 63, 122, 250, 208, 26, 63, 122, 250, 207, 213, 95, 26, 63, 122, 250, 206, + 26, 63, 122, 250, 205, 26, 63, 122, 250, 204, 207, 24, 248, 91, 26, 63, + 122, 250, 203, 248, 91, 26, 63, 122, 250, 202, 248, 92, 241, 112, 26, 63, + 122, 250, 201, 207, 26, 26, 63, 122, 250, 200, 26, 63, 122, 250, 199, 26, + 63, 226, 160, 250, 198, 245, 105, 26, 63, 122, 250, 197, 26, 63, 122, + 250, 196, 26, 63, 122, 250, 194, 26, 63, 122, 250, 193, 26, 63, 122, 250, + 192, 26, 63, 122, 250, 191, 246, 81, 26, 63, 122, 250, 190, 26, 63, 122, + 250, 189, 26, 63, 122, 250, 188, 26, 63, 122, 250, 187, 26, 63, 122, 250, + 186, 26, 63, 122, 208, 225, 251, 15, 26, 63, 122, 208, 225, 250, 238, 26, + 63, 122, 208, 225, 250, 237, 26, 63, 122, 208, 225, 250, 236, 26, 63, + 122, 208, 225, 250, 235, 26, 63, 122, 208, 225, 250, 234, 26, 63, 122, + 208, 225, 250, 233, 26, 63, 122, 208, 225, 250, 232, 26, 63, 122, 208, + 225, 250, 231, 26, 63, 122, 208, 225, 250, 230, 26, 63, 122, 208, 225, + 250, 229, 26, 63, 122, 208, 225, 250, 228, 26, 63, 122, 208, 225, 250, + 227, 26, 63, 122, 208, 225, 250, 226, 26, 63, 122, 208, 225, 250, 225, + 26, 63, 122, 208, 225, 250, 224, 26, 63, 122, 208, 225, 250, 223, 26, 63, + 122, 208, 225, 250, 222, 26, 63, 122, 208, 225, 250, 221, 26, 63, 122, + 208, 225, 250, 220, 26, 63, 122, 208, 225, 250, 219, 26, 63, 122, 208, + 225, 250, 217, 26, 63, 122, 208, 225, 250, 216, 26, 63, 122, 208, 225, + 250, 214, 26, 63, 122, 208, 225, 250, 213, 26, 63, 122, 208, 225, 250, + 212, 26, 63, 122, 208, 225, 250, 211, 26, 63, 122, 208, 225, 250, 195, + 26, 63, 122, 208, 225, 250, 185, 252, 241, 206, 232, 216, 40, 229, 205, + 252, 241, 206, 232, 216, 40, 245, 23, 252, 241, 248, 81, 83, 252, 241, + 43, 102, 252, 241, 43, 105, 252, 241, 43, 142, 252, 241, 43, 139, 252, + 241, 43, 168, 252, 241, 43, 184, 252, 241, 43, 195, 252, 241, 43, 193, + 252, 241, 43, 200, 252, 241, 43, 212, 98, 252, 241, 43, 210, 123, 252, + 241, 43, 212, 3, 252, 241, 43, 241, 130, 252, 241, 43, 241, 243, 252, + 241, 43, 214, 252, 252, 241, 43, 216, 17, 252, 241, 43, 243, 79, 252, + 241, 43, 224, 190, 252, 241, 43, 119, 238, 29, 252, 241, 43, 118, 238, + 29, 252, 241, 43, 129, 238, 29, 252, 241, 43, 241, 125, 238, 29, 252, + 241, 43, 241, 204, 238, 29, 252, 241, 43, 215, 10, 238, 29, 252, 241, 43, + 216, 23, 238, 29, 252, 241, 43, 243, 88, 238, 29, 252, 241, 43, 224, 195, + 238, 29, 252, 241, 43, 119, 211, 242, 252, 241, 43, 118, 211, 242, 252, + 241, 43, 129, 211, 242, 252, 241, 43, 241, 125, 211, 242, 252, 241, 43, + 241, 204, 211, 242, 252, 241, 43, 215, 10, 211, 242, 252, 241, 43, 216, + 23, 211, 242, 252, 241, 43, 243, 88, 211, 242, 252, 241, 43, 224, 195, + 211, 242, 252, 241, 43, 212, 99, 211, 242, 252, 241, 43, 210, 124, 211, + 242, 252, 241, 43, 212, 4, 211, 242, 252, 241, 43, 241, 131, 211, 242, + 252, 241, 43, 241, 244, 211, 242, 252, 241, 43, 214, 253, 211, 242, 252, + 241, 43, 216, 18, 211, 242, 252, 241, 43, 243, 80, 211, 242, 252, 241, + 43, 224, 191, 211, 242, 252, 241, 207, 41, 250, 117, 209, 216, 252, 241, + 207, 41, 241, 215, 213, 177, 252, 241, 207, 41, 217, 80, 213, 177, 252, + 241, 207, 41, 212, 11, 213, 177, 252, 241, 207, 41, 241, 118, 213, 177, + 252, 241, 243, 240, 227, 118, 241, 215, 213, 177, 252, 241, 229, 189, + 227, 118, 241, 215, 213, 177, 252, 241, 227, 118, 217, 80, 213, 177, 252, + 241, 227, 118, 212, 11, 213, 177, 27, 253, 12, 251, 186, 119, 219, 204, + 27, 253, 12, 251, 186, 119, 239, 121, 27, 253, 12, 251, 186, 119, 244, 3, + 27, 253, 12, 251, 186, 168, 27, 253, 12, 251, 186, 241, 243, 27, 253, 12, + 251, 186, 241, 204, 238, 29, 27, 253, 12, 251, 186, 241, 204, 211, 242, + 27, 253, 12, 251, 186, 241, 244, 211, 242, 27, 253, 12, 251, 186, 241, + 204, 212, 181, 27, 253, 12, 251, 186, 212, 99, 212, 181, 27, 253, 12, + 251, 186, 241, 244, 212, 181, 27, 253, 12, 251, 186, 119, 238, 30, 212, + 181, 27, 253, 12, 251, 186, 241, 204, 238, 30, 212, 181, 27, 253, 12, + 251, 186, 119, 211, 243, 212, 181, 27, 253, 12, 251, 186, 241, 204, 211, + 243, 212, 181, 27, 253, 12, 251, 186, 241, 204, 214, 20, 27, 253, 12, + 251, 186, 212, 99, 214, 20, 27, 253, 12, 251, 186, 241, 244, 214, 20, 27, + 253, 12, 251, 186, 119, 238, 30, 214, 20, 27, 253, 12, 251, 186, 241, + 204, 238, 30, 214, 20, 27, 253, 12, 251, 186, 119, 211, 243, 214, 20, 27, + 253, 12, 251, 186, 212, 99, 211, 243, 214, 20, 27, 253, 12, 251, 186, + 241, 244, 211, 243, 214, 20, 27, 253, 12, 251, 186, 212, 99, 226, 184, + 27, 253, 12, 239, 37, 119, 220, 228, 27, 253, 12, 212, 25, 102, 27, 253, + 12, 239, 33, 102, 27, 253, 12, 242, 248, 105, 27, 253, 12, 212, 25, 105, + 27, 253, 12, 246, 245, 118, 244, 2, 27, 253, 12, 242, 248, 118, 244, 2, + 27, 253, 12, 211, 28, 168, 27, 253, 12, 211, 28, 212, 98, 27, 253, 12, + 211, 28, 212, 99, 252, 141, 17, 27, 253, 12, 239, 33, 212, 98, 27, 253, + 12, 227, 65, 212, 98, 27, 253, 12, 212, 25, 212, 98, 27, 253, 12, 212, + 25, 212, 3, 27, 253, 12, 211, 28, 241, 243, 27, 253, 12, 211, 28, 241, + 244, 252, 141, 17, 27, 253, 12, 239, 33, 241, 243, 27, 253, 12, 212, 25, + 241, 243, 27, 253, 12, 212, 25, 119, 238, 29, 27, 253, 12, 212, 25, 129, + 238, 29, 27, 253, 12, 242, 248, 241, 204, 238, 29, 27, 253, 12, 211, 28, + 241, 204, 238, 29, 27, 253, 12, 212, 25, 241, 204, 238, 29, 27, 253, 12, + 248, 187, 241, 204, 238, 29, 27, 253, 12, 225, 186, 241, 204, 238, 29, + 27, 253, 12, 212, 25, 119, 211, 242, 27, 253, 12, 212, 25, 241, 204, 211, + 242, 27, 253, 12, 245, 230, 241, 204, 226, 184, 27, 253, 12, 213, 240, + 241, 244, 226, 184, 27, 119, 160, 53, 27, 119, 160, 3, 252, 141, 17, 27, + 118, 212, 8, 53, 27, 129, 219, 203, 53, 27, 206, 50, 53, 27, 212, 182, + 53, 27, 244, 4, 53, 27, 222, 220, 53, 27, 118, 222, 219, 53, 27, 129, + 222, 219, 53, 27, 241, 125, 222, 219, 53, 27, 241, 204, 222, 219, 53, 27, + 227, 59, 53, 27, 230, 167, 250, 117, 53, 27, 229, 182, 53, 27, 222, 94, + 53, 27, 206, 172, 53, 27, 251, 237, 53, 27, 251, 251, 53, 27, 239, 244, + 53, 27, 210, 246, 250, 117, 53, 27, 205, 86, 53, 27, 119, 219, 205, 53, + 27, 215, 35, 53, 218, 109, 216, 14, 53, 218, 109, 209, 228, 53, 218, 109, + 216, 44, 53, 218, 109, 216, 12, 53, 218, 109, 245, 120, 216, 12, 53, 218, + 109, 215, 54, 53, 218, 109, 245, 226, 53, 218, 109, 219, 188, 53, 218, + 109, 216, 30, 53, 218, 109, 243, 219, 53, 218, 109, 251, 232, 53, 218, + 109, 248, 124, 53, 27, 16, 212, 152, 218, 210, 221, 88, 245, 98, 3, 221, + 166, 221, 88, 245, 98, 3, 220, 220, 239, 68, 221, 88, 245, 98, 3, 212, + 155, 239, 68, 221, 88, 245, 98, 3, 248, 207, 221, 88, 245, 98, 3, 248, + 49, 221, 88, 245, 98, 3, 206, 244, 221, 88, 245, 98, 3, 239, 43, 221, 88, + 245, 98, 3, 240, 193, 221, 88, 245, 98, 3, 211, 209, 221, 88, 245, 98, 3, + 45, 221, 88, 245, 98, 3, 249, 146, 221, 88, 245, 98, 3, 215, 180, 221, + 88, 245, 98, 3, 247, 180, 221, 88, 245, 98, 3, 227, 220, 221, 88, 245, + 98, 3, 227, 167, 221, 88, 245, 98, 3, 217, 121, 221, 88, 245, 98, 3, 229, + 231, 221, 88, 245, 98, 3, 249, 167, 221, 88, 245, 98, 3, 248, 192, 220, + 233, 221, 88, 245, 98, 3, 245, 36, 221, 88, 245, 98, 3, 247, 159, 221, + 88, 245, 98, 3, 214, 224, 221, 88, 245, 98, 3, 247, 160, 221, 88, 245, + 98, 3, 250, 47, 221, 88, 245, 98, 3, 215, 167, 221, 88, 245, 98, 3, 238, + 69, 221, 88, 245, 98, 3, 239, 9, 221, 88, 245, 98, 3, 249, 82, 230, 34, + 221, 88, 245, 98, 3, 248, 183, 221, 88, 245, 98, 3, 219, 77, 221, 88, + 245, 98, 3, 243, 127, 221, 88, 245, 98, 3, 244, 9, 221, 88, 245, 98, 3, + 210, 156, 221, 88, 245, 98, 3, 250, 50, 221, 88, 245, 98, 3, 220, 234, + 211, 61, 221, 88, 245, 98, 3, 208, 195, 221, 88, 245, 98, 3, 221, 232, + 221, 88, 245, 98, 3, 218, 100, 221, 88, 245, 98, 3, 229, 216, 221, 88, + 245, 98, 3, 222, 77, 250, 176, 221, 88, 245, 98, 3, 241, 168, 221, 88, + 245, 98, 3, 239, 238, 221, 88, 245, 98, 3, 213, 241, 221, 88, 245, 98, 3, + 5, 251, 160, 221, 88, 245, 98, 3, 207, 61, 250, 136, 221, 88, 245, 98, 3, + 36, 222, 222, 91, 229, 40, 1, 62, 229, 40, 1, 75, 229, 40, 1, 251, 150, + 229, 40, 1, 250, 1, 229, 40, 1, 241, 55, 229, 40, 1, 246, 240, 229, 40, + 1, 74, 229, 40, 1, 207, 129, 229, 40, 1, 205, 159, 229, 40, 1, 212, 58, + 229, 40, 1, 232, 203, 229, 40, 1, 232, 76, 229, 40, 1, 220, 27, 229, 40, + 1, 149, 229, 40, 1, 229, 28, 229, 40, 1, 226, 33, 229, 40, 1, 226, 186, + 229, 40, 1, 224, 104, 229, 40, 1, 71, 229, 40, 1, 222, 67, 229, 40, 1, + 231, 73, 229, 40, 1, 137, 229, 40, 1, 182, 229, 40, 1, 213, 10, 229, 40, + 1, 210, 211, 229, 40, 1, 252, 122, 229, 40, 1, 243, 41, 229, 40, 1, 239, + 155, 229, 40, 1, 206, 195, 248, 198, 1, 62, 248, 198, 1, 222, 53, 248, + 198, 1, 246, 240, 248, 198, 1, 149, 248, 198, 1, 209, 160, 248, 198, 1, + 137, 248, 198, 1, 230, 62, 248, 198, 1, 254, 166, 248, 198, 1, 220, 27, + 248, 198, 1, 251, 150, 248, 198, 1, 229, 28, 248, 198, 1, 76, 248, 198, + 1, 246, 147, 248, 198, 1, 213, 10, 248, 198, 1, 216, 4, 248, 198, 1, 216, + 3, 248, 198, 1, 182, 248, 198, 1, 249, 33, 248, 198, 1, 71, 248, 198, 1, + 224, 104, 248, 198, 1, 206, 195, 248, 198, 1, 226, 33, 248, 198, 1, 210, + 210, 248, 198, 1, 222, 67, 248, 198, 1, 214, 99, 248, 198, 1, 74, 248, + 198, 1, 75, 248, 198, 1, 209, 157, 248, 198, 1, 232, 76, 248, 198, 1, + 232, 67, 248, 198, 1, 225, 153, 248, 198, 1, 209, 162, 248, 198, 1, 241, + 55, 248, 198, 1, 240, 246, 248, 198, 1, 214, 40, 248, 198, 1, 214, 39, + 248, 198, 1, 225, 79, 248, 198, 1, 233, 102, 248, 198, 1, 249, 32, 248, + 198, 1, 210, 211, 248, 198, 1, 209, 159, 248, 198, 1, 218, 90, 248, 198, + 1, 227, 158, 248, 198, 1, 227, 157, 248, 198, 1, 227, 156, 248, 198, 1, + 227, 155, 248, 198, 1, 230, 61, 248, 198, 1, 243, 131, 248, 198, 1, 209, + 158, 81, 242, 251, 211, 241, 83, 81, 242, 251, 18, 102, 81, 242, 251, 18, + 105, 81, 242, 251, 18, 142, 81, 242, 251, 18, 139, 81, 242, 251, 18, 168, + 81, 242, 251, 18, 184, 81, 242, 251, 18, 195, 81, 242, 251, 18, 193, 81, + 242, 251, 18, 200, 81, 242, 251, 43, 212, 98, 81, 242, 251, 43, 210, 123, + 81, 242, 251, 43, 212, 3, 81, 242, 251, 43, 241, 130, 81, 242, 251, 43, + 241, 243, 81, 242, 251, 43, 214, 252, 81, 242, 251, 43, 216, 17, 81, 242, + 251, 43, 243, 79, 81, 242, 251, 43, 224, 190, 81, 242, 251, 43, 119, 238, + 29, 81, 242, 251, 43, 118, 238, 29, 81, 242, 251, 43, 129, 238, 29, 81, + 242, 251, 43, 241, 125, 238, 29, 81, 242, 251, 43, 241, 204, 238, 29, 81, + 242, 251, 43, 215, 10, 238, 29, 81, 242, 251, 43, 216, 23, 238, 29, 81, + 242, 251, 43, 243, 88, 238, 29, 81, 242, 251, 43, 224, 195, 238, 29, 44, + 35, 1, 62, 44, 35, 1, 250, 61, 44, 35, 1, 231, 224, 44, 35, 1, 246, 9, + 44, 35, 1, 75, 44, 35, 1, 209, 39, 44, 35, 1, 205, 93, 44, 35, 1, 239, + 71, 44, 35, 1, 212, 41, 44, 35, 1, 74, 44, 35, 1, 172, 44, 35, 1, 243, + 68, 44, 35, 1, 243, 50, 44, 35, 1, 243, 41, 44, 35, 1, 242, 215, 44, 35, + 1, 76, 44, 35, 1, 221, 174, 44, 35, 1, 215, 214, 44, 35, 1, 230, 236, 44, + 35, 1, 242, 235, 44, 35, 1, 242, 225, 44, 35, 1, 212, 131, 44, 35, 1, 71, + 44, 35, 1, 243, 71, 44, 35, 1, 221, 81, 44, 35, 1, 231, 152, 44, 35, 1, + 243, 97, 44, 35, 1, 242, 227, 44, 35, 1, 248, 82, 44, 35, 1, 233, 102, + 44, 35, 1, 209, 162, 44, 35, 1, 242, 208, 44, 35, 223, 177, 102, 44, 35, + 223, 177, 168, 44, 35, 223, 177, 212, 98, 44, 35, 223, 177, 241, 243, + 239, 253, 1, 252, 208, 239, 253, 1, 250, 153, 239, 253, 1, 240, 58, 239, + 253, 1, 246, 127, 239, 253, 1, 252, 204, 239, 253, 1, 220, 10, 239, 253, + 1, 232, 215, 239, 253, 1, 239, 134, 239, 253, 1, 211, 255, 239, 253, 1, + 243, 78, 239, 253, 1, 230, 204, 239, 253, 1, 230, 118, 239, 253, 1, 227, + 213, 239, 253, 1, 225, 188, 239, 253, 1, 232, 175, 239, 253, 1, 209, 180, + 239, 253, 1, 222, 29, 239, 253, 1, 224, 190, 239, 253, 1, 219, 89, 239, + 253, 1, 217, 124, 239, 253, 1, 212, 112, 239, 253, 1, 207, 3, 239, 253, + 1, 242, 54, 239, 253, 1, 233, 106, 239, 253, 1, 238, 14, 239, 253, 1, + 222, 102, 239, 253, 1, 224, 195, 238, 29, 44, 221, 122, 1, 252, 122, 44, + 221, 122, 1, 249, 68, 44, 221, 122, 1, 240, 228, 44, 221, 122, 1, 245, + 39, 44, 221, 122, 1, 75, 44, 221, 122, 1, 205, 63, 44, 221, 122, 1, 243, + 188, 44, 221, 122, 1, 205, 100, 44, 221, 122, 1, 243, 186, 44, 221, 122, + 1, 74, 44, 221, 122, 1, 231, 42, 44, 221, 122, 1, 230, 30, 44, 221, 122, + 1, 227, 81, 44, 221, 122, 1, 225, 99, 44, 221, 122, 1, 208, 160, 44, 221, + 122, 1, 221, 163, 44, 221, 122, 1, 219, 15, 44, 221, 122, 1, 215, 61, 44, + 221, 122, 1, 212, 193, 44, 221, 122, 1, 71, 44, 221, 122, 1, 248, 66, 44, + 221, 122, 1, 215, 151, 44, 221, 122, 1, 215, 216, 44, 221, 122, 1, 205, + 215, 44, 221, 122, 1, 206, 30, 44, 221, 122, 1, 76, 44, 221, 122, 1, 222, + 152, 44, 221, 122, 1, 243, 97, 44, 221, 122, 1, 155, 44, 221, 122, 1, + 210, 221, 44, 221, 122, 1, 209, 27, 44, 221, 122, 1, 206, 34, 44, 221, + 122, 1, 206, 32, 44, 221, 122, 1, 206, 65, 44, 221, 122, 1, 233, 129, 44, + 221, 122, 1, 205, 213, 44, 221, 122, 1, 190, 44, 221, 122, 1, 237, 190, + 36, 44, 221, 122, 1, 252, 122, 36, 44, 221, 122, 1, 245, 39, 36, 44, 221, + 122, 1, 205, 100, 36, 44, 221, 122, 1, 225, 99, 36, 44, 221, 122, 1, 215, + 61, 209, 254, 1, 252, 148, 209, 254, 1, 250, 8, 209, 254, 1, 240, 216, + 209, 254, 1, 231, 167, 209, 254, 1, 245, 227, 209, 254, 1, 238, 149, 209, + 254, 1, 206, 250, 209, 254, 1, 205, 84, 209, 254, 1, 238, 61, 209, 254, + 1, 212, 80, 209, 254, 1, 205, 236, 209, 254, 1, 232, 45, 209, 254, 1, + 215, 171, 209, 254, 1, 230, 102, 209, 254, 1, 227, 90, 209, 254, 1, 245, + 188, 209, 254, 1, 223, 173, 209, 254, 1, 205, 9, 209, 254, 1, 217, 156, + 209, 254, 1, 252, 200, 209, 254, 1, 220, 82, 209, 254, 1, 217, 190, 209, + 254, 1, 219, 219, 209, 254, 1, 219, 68, 209, 254, 1, 212, 45, 209, 254, + 1, 240, 94, 209, 254, 1, 124, 209, 254, 1, 74, 209, 254, 1, 71, 209, 254, + 1, 214, 51, 209, 254, 206, 232, 245, 79, 44, 221, 116, 3, 62, 44, 221, + 116, 3, 74, 44, 221, 116, 3, 71, 44, 221, 116, 3, 172, 44, 221, 116, 3, + 230, 236, 44, 221, 116, 3, 240, 244, 44, 221, 116, 3, 239, 213, 44, 221, + 116, 3, 206, 181, 44, 221, 116, 3, 249, 1, 44, 221, 116, 3, 232, 200, 44, + 221, 116, 3, 232, 162, 44, 221, 116, 3, 212, 219, 44, 221, 116, 3, 210, + 170, 44, 221, 116, 3, 246, 145, 44, 221, 116, 3, 245, 168, 44, 221, 116, + 3, 243, 237, 44, 221, 116, 3, 212, 56, 44, 221, 116, 3, 179, 44, 221, + 116, 3, 250, 183, 44, 221, 116, 3, 242, 73, 44, 221, 116, 3, 199, 44, + 221, 116, 3, 223, 217, 44, 221, 116, 3, 185, 44, 221, 116, 3, 226, 254, + 44, 221, 116, 3, 226, 114, 44, 221, 116, 3, 190, 44, 221, 116, 3, 209, + 70, 44, 221, 116, 3, 208, 214, 44, 221, 116, 3, 219, 113, 44, 221, 116, + 3, 218, 50, 44, 221, 116, 3, 230, 141, 44, 221, 116, 3, 217, 199, 44, + 221, 116, 3, 205, 116, 44, 221, 116, 3, 216, 2, 44, 221, 116, 3, 214, 96, + 44, 221, 116, 3, 155, 44, 221, 116, 3, 251, 178, 44, 221, 116, 3, 251, + 177, 44, 221, 116, 3, 251, 176, 44, 221, 116, 3, 206, 152, 44, 221, 116, + 3, 246, 123, 44, 221, 116, 3, 246, 122, 44, 221, 116, 3, 250, 161, 44, + 221, 116, 3, 249, 53, 44, 221, 116, 206, 232, 245, 79, 44, 221, 116, 43, + 102, 44, 221, 116, 43, 105, 44, 221, 116, 43, 212, 98, 44, 221, 116, 43, + 210, 123, 44, 221, 116, 43, 238, 29, 245, 208, 6, 1, 152, 74, 245, 208, + 6, 1, 152, 75, 245, 208, 6, 1, 152, 62, 245, 208, 6, 1, 152, 252, 213, + 245, 208, 6, 1, 152, 76, 245, 208, 6, 1, 152, 222, 152, 245, 208, 6, 1, + 215, 144, 74, 245, 208, 6, 1, 215, 144, 75, 245, 208, 6, 1, 215, 144, 62, + 245, 208, 6, 1, 215, 144, 252, 213, 245, 208, 6, 1, 215, 144, 76, 245, + 208, 6, 1, 215, 144, 222, 152, 245, 208, 6, 1, 251, 159, 245, 208, 6, 1, + 222, 78, 245, 208, 6, 1, 206, 216, 245, 208, 6, 1, 206, 49, 245, 208, 6, + 1, 239, 155, 245, 208, 6, 1, 221, 164, 245, 208, 6, 1, 250, 50, 245, 208, + 6, 1, 212, 120, 245, 208, 6, 1, 245, 251, 245, 208, 6, 1, 248, 78, 245, + 208, 6, 1, 232, 180, 245, 208, 6, 1, 231, 231, 245, 208, 6, 1, 240, 191, + 245, 208, 6, 1, 243, 97, 245, 208, 6, 1, 209, 34, 245, 208, 6, 1, 242, + 196, 245, 208, 6, 1, 212, 39, 245, 208, 6, 1, 242, 225, 245, 208, 6, 1, + 205, 91, 245, 208, 6, 1, 242, 215, 245, 208, 6, 1, 205, 71, 245, 208, 6, + 1, 242, 235, 245, 208, 6, 1, 243, 68, 245, 208, 6, 1, 243, 50, 245, 208, + 6, 1, 243, 41, 245, 208, 6, 1, 243, 28, 245, 208, 6, 1, 222, 191, 245, + 208, 6, 1, 242, 175, 245, 208, 5, 1, 152, 74, 245, 208, 5, 1, 152, 75, + 245, 208, 5, 1, 152, 62, 245, 208, 5, 1, 152, 252, 213, 245, 208, 5, 1, + 152, 76, 245, 208, 5, 1, 152, 222, 152, 245, 208, 5, 1, 215, 144, 74, + 245, 208, 5, 1, 215, 144, 75, 245, 208, 5, 1, 215, 144, 62, 245, 208, 5, + 1, 215, 144, 252, 213, 245, 208, 5, 1, 215, 144, 76, 245, 208, 5, 1, 215, + 144, 222, 152, 245, 208, 5, 1, 251, 159, 245, 208, 5, 1, 222, 78, 245, + 208, 5, 1, 206, 216, 245, 208, 5, 1, 206, 49, 245, 208, 5, 1, 239, 155, + 245, 208, 5, 1, 221, 164, 245, 208, 5, 1, 250, 50, 245, 208, 5, 1, 212, + 120, 245, 208, 5, 1, 245, 251, 245, 208, 5, 1, 248, 78, 245, 208, 5, 1, + 232, 180, 245, 208, 5, 1, 231, 231, 245, 208, 5, 1, 240, 191, 245, 208, + 5, 1, 243, 97, 245, 208, 5, 1, 209, 34, 245, 208, 5, 1, 242, 196, 245, + 208, 5, 1, 212, 39, 245, 208, 5, 1, 242, 225, 245, 208, 5, 1, 205, 91, + 245, 208, 5, 1, 242, 215, 245, 208, 5, 1, 205, 71, 245, 208, 5, 1, 242, + 235, 245, 208, 5, 1, 243, 68, 245, 208, 5, 1, 243, 50, 245, 208, 5, 1, + 243, 41, 245, 208, 5, 1, 243, 28, 245, 208, 5, 1, 222, 191, 245, 208, 5, + 1, 242, 175, 215, 221, 1, 221, 161, 215, 221, 1, 211, 91, 215, 221, 1, + 231, 119, 215, 221, 1, 242, 21, 215, 221, 1, 212, 14, 215, 221, 1, 214, + 193, 215, 221, 1, 213, 130, 215, 221, 1, 248, 6, 215, 221, 1, 206, 51, + 215, 221, 1, 238, 27, 215, 221, 1, 249, 243, 215, 221, 1, 246, 8, 215, + 221, 1, 240, 230, 215, 221, 1, 208, 155, 215, 221, 1, 212, 20, 215, 221, + 1, 205, 17, 215, 221, 1, 227, 117, 215, 221, 1, 232, 102, 215, 221, 1, + 206, 248, 215, 221, 1, 239, 143, 215, 221, 1, 229, 130, 215, 221, 1, 226, + 210, 215, 221, 1, 233, 109, 215, 221, 1, 243, 96, 215, 221, 1, 251, 225, + 215, 221, 1, 252, 252, 215, 221, 1, 222, 165, 215, 221, 1, 206, 235, 215, + 221, 1, 222, 93, 215, 221, 1, 252, 213, 215, 221, 1, 218, 121, 215, 221, + 1, 223, 173, 215, 221, 1, 243, 113, 215, 221, 1, 252, 218, 215, 221, 1, + 237, 181, 215, 221, 1, 209, 206, 215, 221, 1, 222, 228, 215, 221, 1, 222, + 144, 215, 221, 1, 222, 189, 215, 221, 1, 251, 162, 215, 221, 1, 252, 14, + 215, 221, 1, 222, 122, 215, 221, 1, 252, 196, 215, 221, 1, 242, 229, 215, + 221, 1, 251, 248, 215, 221, 1, 243, 124, 215, 221, 1, 237, 189, 215, 221, + 1, 206, 16, 222, 104, 1, 252, 172, 222, 104, 1, 250, 183, 222, 104, 1, + 212, 219, 222, 104, 1, 232, 200, 222, 104, 1, 206, 181, 222, 104, 1, 231, + 167, 222, 104, 1, 245, 250, 222, 104, 1, 219, 113, 222, 104, 1, 217, 199, + 222, 104, 1, 215, 177, 222, 104, 1, 245, 192, 222, 104, 1, 248, 173, 222, + 104, 1, 240, 244, 222, 104, 1, 242, 73, 222, 104, 1, 220, 17, 222, 104, + 1, 232, 61, 222, 104, 1, 230, 136, 222, 104, 1, 226, 223, 222, 104, 1, + 223, 157, 222, 104, 1, 207, 59, 222, 104, 1, 155, 222, 104, 1, 190, 222, + 104, 1, 62, 222, 104, 1, 75, 222, 104, 1, 74, 222, 104, 1, 76, 222, 104, + 1, 71, 222, 104, 1, 253, 164, 222, 104, 1, 243, 104, 222, 104, 1, 222, + 152, 222, 104, 18, 205, 85, 222, 104, 18, 102, 222, 104, 18, 105, 222, + 104, 18, 142, 222, 104, 18, 139, 222, 104, 18, 168, 222, 104, 18, 184, + 222, 104, 18, 195, 222, 104, 18, 193, 222, 104, 18, 200, 243, 64, 1, 62, + 243, 64, 1, 250, 61, 243, 64, 1, 248, 148, 243, 64, 1, 248, 82, 243, 64, + 1, 246, 9, 243, 64, 1, 225, 143, 243, 64, 1, 245, 183, 243, 64, 1, 243, + 90, 243, 64, 1, 75, 243, 64, 1, 242, 28, 243, 64, 1, 240, 170, 243, 64, + 1, 240, 32, 243, 64, 1, 239, 71, 243, 64, 1, 74, 243, 64, 1, 232, 182, + 243, 64, 1, 231, 224, 243, 64, 1, 230, 58, 243, 64, 1, 229, 168, 243, 64, + 1, 227, 119, 243, 64, 1, 225, 110, 243, 64, 1, 199, 243, 64, 1, 224, 173, + 243, 64, 1, 76, 243, 64, 1, 221, 174, 243, 64, 1, 219, 255, 243, 64, 1, + 219, 51, 243, 64, 1, 218, 84, 243, 64, 1, 217, 86, 243, 64, 1, 215, 214, + 243, 64, 1, 212, 131, 243, 64, 1, 212, 41, 243, 64, 1, 71, 243, 64, 1, + 209, 39, 243, 64, 1, 206, 175, 243, 64, 1, 206, 123, 243, 64, 1, 205, 93, + 243, 64, 1, 205, 72, 243, 64, 1, 240, 85, 243, 64, 1, 240, 91, 243, 64, + 1, 231, 152, 248, 180, 252, 173, 1, 252, 143, 248, 180, 252, 173, 1, 250, + 10, 248, 180, 252, 173, 1, 240, 49, 248, 180, 252, 173, 1, 246, 74, 248, + 180, 252, 173, 1, 243, 112, 248, 180, 252, 173, 1, 205, 103, 248, 180, + 252, 173, 1, 242, 147, 248, 180, 252, 173, 1, 205, 66, 248, 180, 252, + 173, 1, 212, 157, 248, 180, 252, 173, 1, 248, 110, 248, 180, 252, 173, 1, + 205, 224, 248, 180, 252, 173, 1, 205, 81, 248, 180, 252, 173, 1, 232, + 242, 248, 180, 252, 173, 1, 216, 2, 248, 180, 252, 173, 1, 230, 95, 248, + 180, 252, 173, 1, 232, 254, 248, 180, 252, 173, 1, 206, 171, 248, 180, + 252, 173, 1, 243, 203, 248, 180, 252, 173, 1, 248, 204, 248, 180, 252, + 173, 1, 232, 163, 248, 180, 252, 173, 1, 232, 7, 248, 180, 252, 173, 1, + 229, 37, 248, 180, 252, 173, 1, 239, 22, 248, 180, 252, 173, 1, 220, 0, + 248, 180, 252, 173, 1, 252, 70, 248, 180, 252, 173, 1, 248, 23, 248, 180, + 252, 173, 1, 248, 58, 248, 180, 252, 173, 1, 246, 252, 248, 180, 252, + 173, 1, 227, 202, 248, 180, 252, 173, 1, 220, 4, 248, 180, 252, 173, 1, + 224, 28, 248, 180, 252, 173, 1, 243, 181, 248, 180, 252, 173, 1, 215, + 242, 248, 180, 252, 173, 1, 232, 183, 248, 180, 252, 173, 1, 222, 165, + 248, 180, 252, 173, 1, 210, 99, 248, 180, 252, 173, 1, 242, 49, 248, 180, + 252, 173, 1, 243, 194, 248, 180, 252, 173, 1, 248, 88, 248, 180, 252, + 173, 1, 221, 150, 248, 180, 252, 173, 1, 240, 75, 248, 180, 252, 173, 1, + 219, 65, 248, 180, 252, 173, 1, 216, 11, 248, 180, 252, 173, 1, 208, 216, + 248, 180, 252, 173, 1, 211, 150, 248, 180, 252, 173, 1, 215, 124, 248, + 180, 252, 173, 1, 232, 213, 248, 180, 252, 173, 1, 246, 253, 248, 180, + 252, 173, 1, 248, 173, 248, 180, 252, 173, 1, 206, 56, 248, 180, 252, + 173, 1, 220, 244, 248, 180, 252, 173, 1, 231, 87, 248, 180, 252, 173, + 247, 224, 83, 26, 32, 3, 253, 114, 26, 32, 3, 253, 113, 26, 32, 3, 253, + 112, 26, 32, 3, 253, 111, 26, 32, 3, 253, 110, 26, 32, 3, 253, 109, 26, + 32, 3, 253, 108, 26, 32, 3, 253, 107, 26, 32, 3, 253, 106, 26, 32, 3, + 253, 105, 26, 32, 3, 253, 104, 26, 32, 3, 253, 103, 26, 32, 3, 253, 102, + 26, 32, 3, 253, 101, 26, 32, 3, 253, 100, 26, 32, 3, 253, 99, 26, 32, 3, + 253, 98, 26, 32, 3, 253, 97, 26, 32, 3, 253, 96, 26, 32, 3, 253, 95, 26, + 32, 3, 253, 94, 26, 32, 3, 253, 93, 26, 32, 3, 253, 92, 26, 32, 3, 253, + 91, 26, 32, 3, 253, 90, 26, 32, 3, 253, 89, 26, 32, 3, 253, 88, 26, 32, + 3, 254, 217, 26, 32, 3, 253, 87, 26, 32, 3, 253, 86, 26, 32, 3, 253, 85, + 26, 32, 3, 253, 84, 26, 32, 3, 253, 83, 26, 32, 3, 253, 82, 26, 32, 3, + 253, 81, 26, 32, 3, 253, 80, 26, 32, 3, 253, 79, 26, 32, 3, 253, 78, 26, + 32, 3, 253, 77, 26, 32, 3, 253, 76, 26, 32, 3, 253, 75, 26, 32, 3, 253, + 74, 26, 32, 3, 253, 73, 26, 32, 3, 253, 72, 26, 32, 3, 253, 71, 26, 32, + 3, 253, 70, 26, 32, 3, 253, 69, 26, 32, 3, 253, 68, 26, 32, 3, 253, 67, + 26, 32, 3, 253, 66, 26, 32, 3, 253, 65, 26, 32, 3, 253, 64, 26, 32, 3, + 253, 63, 26, 32, 3, 253, 62, 26, 32, 3, 253, 61, 26, 32, 3, 253, 60, 26, + 32, 3, 253, 59, 26, 32, 3, 253, 58, 26, 32, 3, 253, 57, 26, 32, 3, 253, + 56, 26, 32, 3, 253, 55, 26, 32, 3, 253, 54, 26, 32, 3, 253, 53, 26, 32, + 3, 253, 52, 26, 32, 3, 253, 51, 26, 32, 3, 253, 50, 26, 32, 3, 253, 49, + 26, 32, 3, 253, 48, 26, 32, 3, 253, 47, 26, 32, 3, 253, 46, 26, 32, 3, + 253, 45, 26, 32, 3, 254, 169, 26, 32, 3, 253, 44, 26, 32, 3, 253, 43, 26, + 32, 3, 254, 168, 26, 32, 3, 253, 42, 26, 32, 3, 253, 41, 26, 32, 3, 253, + 40, 26, 32, 3, 253, 39, 26, 32, 3, 254, 167, 26, 32, 3, 253, 38, 26, 32, + 3, 253, 37, 26, 32, 3, 253, 36, 26, 32, 3, 253, 35, 26, 32, 3, 253, 34, + 26, 32, 3, 254, 164, 26, 32, 3, 254, 163, 26, 32, 3, 254, 162, 26, 32, 3, + 254, 161, 26, 32, 3, 254, 160, 26, 32, 3, 254, 159, 26, 32, 3, 254, 158, + 26, 32, 3, 254, 157, 26, 32, 3, 254, 156, 26, 32, 3, 254, 155, 26, 32, 3, + 254, 154, 26, 32, 3, 254, 153, 26, 32, 3, 254, 152, 26, 32, 3, 254, 151, + 26, 32, 3, 254, 150, 26, 32, 3, 254, 149, 26, 32, 3, 254, 148, 26, 32, 3, + 254, 147, 26, 32, 3, 254, 146, 26, 32, 3, 254, 145, 26, 32, 3, 254, 144, + 26, 32, 3, 254, 143, 26, 32, 3, 254, 142, 26, 32, 3, 254, 141, 26, 32, 3, + 254, 140, 26, 32, 3, 254, 139, 26, 32, 3, 254, 138, 26, 32, 3, 254, 137, + 26, 32, 3, 254, 136, 26, 32, 3, 254, 135, 26, 32, 3, 254, 134, 26, 32, 3, + 254, 133, 26, 32, 3, 254, 132, 26, 32, 3, 254, 131, 26, 32, 3, 254, 130, + 26, 32, 3, 254, 129, 26, 32, 3, 254, 128, 26, 32, 3, 254, 127, 26, 32, 3, + 254, 126, 26, 32, 3, 254, 125, 26, 32, 3, 254, 124, 26, 32, 3, 254, 123, + 26, 32, 3, 254, 122, 26, 32, 3, 254, 121, 26, 32, 3, 254, 120, 26, 32, 3, + 254, 119, 26, 32, 3, 254, 118, 26, 32, 3, 254, 117, 26, 32, 3, 254, 116, + 26, 32, 3, 254, 115, 26, 32, 3, 254, 114, 26, 32, 3, 254, 113, 26, 32, 3, + 254, 112, 26, 32, 3, 254, 111, 26, 32, 3, 254, 110, 26, 32, 3, 254, 109, + 26, 32, 3, 254, 108, 26, 32, 3, 254, 107, 26, 32, 3, 254, 106, 26, 32, 3, + 254, 105, 26, 32, 3, 254, 104, 26, 32, 3, 254, 103, 26, 32, 3, 254, 102, + 26, 32, 3, 254, 101, 26, 32, 3, 254, 100, 26, 32, 3, 254, 99, 26, 32, 3, + 254, 98, 26, 32, 3, 254, 97, 26, 32, 3, 254, 96, 26, 32, 3, 254, 95, 26, + 32, 3, 254, 94, 26, 32, 3, 254, 93, 26, 32, 3, 254, 92, 26, 32, 3, 254, + 91, 26, 32, 3, 254, 90, 26, 32, 3, 254, 89, 26, 32, 3, 254, 88, 26, 32, + 3, 254, 87, 26, 32, 3, 254, 86, 26, 32, 3, 254, 85, 26, 32, 3, 254, 84, + 26, 32, 3, 254, 83, 26, 32, 3, 254, 82, 26, 32, 3, 254, 81, 26, 32, 3, + 254, 80, 26, 32, 3, 254, 79, 26, 32, 3, 254, 78, 26, 32, 3, 254, 77, 26, + 32, 3, 254, 76, 26, 32, 3, 254, 75, 26, 32, 3, 254, 74, 26, 32, 3, 254, + 73, 26, 32, 3, 254, 72, 26, 32, 3, 254, 71, 26, 32, 3, 254, 70, 26, 32, + 3, 254, 69, 26, 32, 3, 254, 68, 26, 32, 3, 254, 67, 26, 32, 3, 254, 66, + 26, 32, 3, 254, 65, 26, 32, 3, 254, 64, 26, 32, 3, 254, 63, 26, 32, 3, + 254, 62, 26, 32, 3, 254, 61, 26, 32, 3, 254, 60, 26, 32, 3, 254, 59, 26, + 32, 3, 254, 58, 26, 32, 3, 254, 57, 26, 32, 3, 254, 56, 26, 32, 3, 254, + 55, 26, 32, 3, 254, 54, 26, 32, 3, 254, 53, 26, 32, 3, 254, 52, 26, 32, + 3, 254, 51, 26, 32, 3, 254, 50, 26, 32, 3, 254, 49, 26, 32, 3, 254, 48, + 26, 32, 3, 254, 47, 26, 32, 3, 254, 46, 26, 32, 3, 254, 45, 26, 32, 3, + 254, 44, 26, 32, 3, 254, 43, 26, 32, 3, 254, 42, 26, 32, 3, 254, 41, 26, + 32, 3, 254, 40, 26, 32, 3, 254, 39, 26, 32, 3, 254, 38, 26, 32, 3, 254, + 37, 26, 32, 3, 254, 36, 26, 32, 3, 254, 35, 26, 32, 3, 254, 34, 26, 32, + 3, 254, 33, 26, 32, 3, 254, 32, 26, 32, 3, 254, 31, 26, 32, 3, 254, 30, + 26, 32, 3, 254, 29, 26, 32, 3, 254, 28, 26, 32, 3, 254, 27, 26, 32, 3, + 254, 26, 26, 32, 3, 254, 25, 26, 32, 3, 254, 24, 26, 32, 3, 254, 23, 26, + 32, 3, 254, 22, 26, 32, 3, 254, 21, 26, 32, 3, 254, 20, 26, 32, 3, 254, + 19, 26, 32, 3, 254, 18, 26, 32, 3, 254, 17, 26, 32, 3, 254, 16, 26, 32, + 3, 254, 15, 26, 32, 3, 254, 14, 26, 32, 3, 254, 13, 26, 32, 3, 254, 12, + 26, 32, 3, 254, 11, 26, 32, 3, 254, 10, 26, 32, 3, 254, 9, 26, 32, 3, + 254, 8, 26, 32, 3, 254, 7, 26, 32, 3, 254, 6, 26, 32, 3, 254, 5, 26, 32, + 3, 254, 4, 26, 32, 3, 254, 3, 26, 32, 3, 254, 2, 26, 32, 3, 254, 1, 26, + 32, 3, 254, 0, 26, 32, 3, 253, 255, 26, 32, 3, 253, 254, 26, 32, 3, 253, + 253, 26, 32, 3, 253, 252, 26, 32, 3, 253, 251, 26, 32, 3, 253, 250, 26, + 32, 3, 253, 249, 26, 32, 3, 253, 248, 26, 32, 3, 253, 247, 26, 32, 3, + 253, 246, 26, 32, 3, 253, 245, 26, 32, 3, 253, 244, 26, 32, 3, 253, 243, + 26, 32, 3, 253, 242, 26, 32, 3, 253, 241, 26, 32, 3, 253, 240, 26, 32, 3, + 253, 239, 26, 32, 3, 253, 238, 26, 32, 3, 253, 237, 26, 32, 3, 253, 236, + 26, 32, 3, 253, 235, 26, 32, 3, 253, 234, 26, 32, 3, 253, 233, 26, 32, 3, + 253, 232, 26, 32, 3, 253, 231, 26, 32, 3, 253, 230, 26, 32, 3, 253, 229, + 26, 32, 3, 253, 228, 26, 32, 3, 253, 227, 26, 32, 3, 253, 226, 26, 32, 3, + 253, 225, 26, 32, 3, 253, 224, 26, 32, 3, 253, 223, 26, 32, 3, 253, 222, + 26, 32, 3, 253, 221, 26, 32, 3, 253, 220, 26, 32, 3, 253, 219, 26, 32, 3, + 253, 218, 26, 32, 3, 253, 217, 26, 32, 3, 253, 216, 26, 32, 3, 253, 215, + 26, 32, 3, 253, 214, 26, 32, 3, 253, 213, 26, 32, 3, 253, 212, 26, 32, 3, + 253, 211, 26, 32, 3, 253, 210, 26, 32, 3, 253, 209, 26, 32, 3, 253, 208, + 26, 32, 3, 253, 207, 26, 32, 3, 253, 206, 26, 32, 3, 253, 205, 26, 32, 3, + 253, 204, 26, 32, 3, 253, 203, 26, 32, 3, 253, 202, 26, 32, 3, 253, 201, + 26, 32, 3, 253, 200, 26, 32, 3, 253, 199, 26, 32, 3, 253, 198, 26, 32, 3, + 253, 197, 26, 32, 3, 253, 196, 26, 32, 3, 253, 195, 26, 32, 3, 253, 194, + 62, 26, 32, 3, 253, 193, 251, 150, 26, 32, 3, 253, 192, 246, 240, 26, 32, + 3, 253, 191, 75, 26, 32, 3, 253, 190, 242, 139, 26, 32, 3, 253, 189, 239, + 155, 26, 32, 3, 253, 188, 232, 203, 26, 32, 3, 253, 187, 232, 76, 26, 32, + 3, 253, 186, 149, 26, 32, 3, 253, 185, 230, 146, 26, 32, 3, 253, 184, + 230, 145, 26, 32, 3, 253, 183, 230, 144, 26, 32, 3, 253, 182, 230, 143, + 26, 32, 3, 253, 181, 207, 129, 26, 32, 3, 253, 180, 206, 195, 26, 32, 3, + 253, 179, 206, 123, 26, 32, 3, 253, 178, 222, 170, 26, 32, 3, 253, 177, + 253, 30, 26, 32, 3, 253, 176, 250, 98, 26, 32, 3, 253, 175, 246, 56, 26, + 32, 3, 253, 174, 242, 146, 26, 32, 3, 253, 173, 232, 182, 26, 32, 3, 253, + 172, 26, 32, 3, 253, 171, 26, 32, 3, 253, 170, 26, 32, 3, 253, 169, 26, + 32, 3, 253, 168, 26, 32, 3, 253, 167, 26, 32, 3, 253, 166, 26, 32, 3, + 253, 165, 246, 247, 4, 62, 246, 247, 4, 75, 246, 247, 4, 74, 246, 247, 4, + 76, 246, 247, 4, 71, 246, 247, 4, 232, 200, 246, 247, 4, 232, 122, 246, + 247, 4, 172, 246, 247, 4, 231, 224, 246, 247, 4, 231, 123, 246, 247, 4, + 231, 53, 246, 247, 4, 230, 236, 246, 247, 4, 230, 141, 246, 247, 4, 230, + 58, 246, 247, 4, 229, 235, 246, 247, 4, 229, 144, 246, 247, 4, 229, 81, + 246, 247, 4, 185, 246, 247, 4, 227, 119, 246, 247, 4, 226, 254, 246, 247, + 4, 226, 181, 246, 247, 4, 226, 114, 246, 247, 4, 199, 246, 247, 4, 225, + 110, 246, 247, 4, 224, 230, 246, 247, 4, 224, 67, 246, 247, 4, 223, 217, + 246, 247, 4, 179, 246, 247, 4, 221, 174, 246, 247, 4, 221, 53, 246, 247, + 4, 220, 211, 246, 247, 4, 220, 82, 246, 247, 4, 219, 113, 246, 247, 4, + 219, 51, 246, 247, 4, 218, 208, 246, 247, 4, 218, 124, 246, 247, 4, 218, + 50, 246, 247, 4, 217, 199, 246, 247, 4, 217, 86, 246, 247, 4, 215, 80, + 246, 247, 4, 214, 193, 246, 247, 4, 213, 203, 246, 247, 4, 212, 219, 246, + 247, 4, 212, 131, 246, 247, 4, 211, 211, 246, 247, 4, 124, 246, 247, 4, + 210, 170, 246, 247, 4, 207, 96, 246, 247, 4, 207, 51, 246, 247, 4, 207, + 20, 246, 247, 4, 206, 250, 246, 247, 4, 206, 181, 246, 247, 4, 206, 175, + 246, 247, 4, 205, 116, 246, 247, 4, 205, 19, 233, 70, 252, 23, 1, 252, + 170, 233, 70, 252, 23, 1, 250, 7, 233, 70, 252, 23, 1, 240, 47, 233, 70, + 252, 23, 1, 246, 110, 233, 70, 252, 23, 1, 239, 71, 233, 70, 252, 23, 1, + 207, 59, 233, 70, 252, 23, 1, 205, 96, 233, 70, 252, 23, 1, 239, 27, 233, + 70, 252, 23, 1, 212, 76, 233, 70, 252, 23, 1, 205, 235, 233, 70, 252, 23, + 1, 232, 17, 233, 70, 252, 23, 1, 230, 97, 233, 70, 252, 23, 1, 227, 90, + 233, 70, 252, 23, 1, 223, 173, 233, 70, 252, 23, 1, 217, 157, 233, 70, + 252, 23, 1, 251, 154, 233, 70, 252, 23, 1, 221, 174, 233, 70, 252, 23, 1, + 217, 189, 233, 70, 252, 23, 1, 219, 218, 233, 70, 252, 23, 1, 218, 242, + 233, 70, 252, 23, 1, 215, 171, 233, 70, 252, 23, 1, 212, 145, 233, 70, + 252, 23, 217, 77, 53, 233, 70, 252, 23, 43, 102, 233, 70, 252, 23, 43, + 105, 233, 70, 252, 23, 43, 142, 233, 70, 252, 23, 43, 212, 98, 233, 70, + 252, 23, 43, 210, 123, 233, 70, 252, 23, 43, 119, 238, 29, 233, 70, 252, + 23, 43, 119, 211, 242, 233, 70, 252, 23, 43, 212, 99, 211, 242, 222, 18, + 1, 252, 170, 222, 18, 1, 250, 7, 222, 18, 1, 240, 47, 222, 18, 1, 246, + 110, 222, 18, 1, 239, 71, 222, 18, 1, 207, 59, 222, 18, 1, 205, 96, 222, + 18, 1, 239, 27, 222, 18, 1, 212, 76, 222, 18, 1, 205, 235, 222, 18, 1, + 232, 17, 222, 18, 1, 230, 97, 222, 18, 1, 227, 90, 222, 18, 1, 42, 223, + 173, 222, 18, 1, 223, 173, 222, 18, 1, 217, 157, 222, 18, 1, 251, 154, + 222, 18, 1, 221, 174, 222, 18, 1, 217, 189, 222, 18, 1, 219, 218, 222, + 18, 1, 218, 242, 222, 18, 1, 215, 171, 222, 18, 1, 212, 145, 222, 18, + 230, 41, 241, 183, 222, 18, 218, 162, 241, 183, 222, 18, 43, 102, 222, + 18, 43, 105, 222, 18, 43, 142, 222, 18, 43, 139, 222, 18, 43, 168, 222, + 18, 43, 212, 98, 222, 18, 43, 210, 123, 225, 228, 1, 42, 252, 170, 225, + 228, 1, 252, 170, 225, 228, 1, 42, 250, 7, 225, 228, 1, 250, 7, 225, 228, + 1, 240, 47, 225, 228, 1, 246, 110, 225, 228, 1, 42, 239, 71, 225, 228, 1, + 239, 71, 225, 228, 1, 207, 59, 225, 228, 1, 205, 96, 225, 228, 1, 239, + 27, 225, 228, 1, 212, 76, 225, 228, 1, 42, 205, 235, 225, 228, 1, 205, + 235, 225, 228, 1, 42, 232, 17, 225, 228, 1, 232, 17, 225, 228, 1, 42, + 230, 97, 225, 228, 1, 230, 97, 225, 228, 1, 42, 227, 90, 225, 228, 1, + 227, 90, 225, 228, 1, 42, 223, 173, 225, 228, 1, 223, 173, 225, 228, 1, + 217, 157, 225, 228, 1, 251, 154, 225, 228, 1, 221, 174, 225, 228, 1, 217, + 189, 225, 228, 1, 219, 218, 225, 228, 1, 218, 242, 225, 228, 1, 42, 215, + 171, 225, 228, 1, 215, 171, 225, 228, 1, 212, 145, 225, 228, 43, 102, + 225, 228, 43, 105, 225, 228, 43, 142, 225, 228, 43, 139, 225, 228, 247, + 46, 43, 139, 225, 228, 43, 168, 225, 228, 43, 212, 98, 225, 228, 43, 210, + 123, 225, 228, 43, 119, 238, 29, 221, 64, 1, 252, 167, 221, 64, 1, 250, + 10, 221, 64, 1, 240, 217, 221, 64, 1, 245, 229, 221, 64, 1, 239, 71, 221, + 64, 1, 207, 66, 221, 64, 1, 205, 110, 221, 64, 1, 239, 29, 221, 64, 1, + 212, 80, 221, 64, 1, 205, 236, 221, 64, 1, 232, 45, 221, 64, 1, 230, 103, + 221, 64, 1, 227, 90, 221, 64, 1, 223, 173, 221, 64, 1, 216, 46, 221, 64, + 1, 252, 200, 221, 64, 1, 221, 174, 221, 64, 1, 217, 190, 221, 64, 1, 219, + 223, 221, 64, 1, 218, 99, 221, 64, 1, 215, 171, 221, 64, 1, 212, 151, + 221, 64, 43, 102, 221, 64, 43, 212, 98, 221, 64, 43, 210, 123, 221, 64, + 43, 119, 238, 29, 221, 64, 43, 105, 221, 64, 43, 142, 221, 64, 206, 232, + 216, 39, 229, 39, 1, 62, 229, 39, 1, 251, 150, 229, 39, 1, 241, 55, 229, + 39, 1, 246, 240, 229, 39, 1, 75, 229, 39, 1, 209, 148, 229, 39, 1, 74, + 229, 39, 1, 206, 123, 229, 39, 1, 232, 76, 229, 39, 1, 149, 229, 39, 1, + 229, 28, 229, 39, 1, 226, 33, 229, 39, 1, 76, 229, 39, 1, 137, 229, 39, + 1, 214, 99, 229, 39, 1, 213, 10, 229, 39, 1, 71, 229, 39, 1, 242, 139, + 229, 39, 1, 220, 27, 229, 39, 1, 182, 229, 39, 1, 210, 211, 229, 39, 1, + 252, 122, 229, 39, 1, 243, 41, 229, 39, 1, 229, 42, 229, 39, 1, 224, 104, + 229, 39, 1, 249, 34, 229, 39, 211, 48, 83, 227, 72, 239, 5, 1, 62, 227, + 72, 239, 5, 1, 75, 227, 72, 239, 5, 1, 74, 227, 72, 239, 5, 1, 76, 227, + 72, 239, 5, 1, 190, 227, 72, 239, 5, 1, 207, 96, 227, 72, 239, 5, 1, 250, + 183, 227, 72, 239, 5, 1, 250, 182, 227, 72, 239, 5, 1, 179, 227, 72, 239, + 5, 1, 185, 227, 72, 239, 5, 1, 199, 227, 72, 239, 5, 1, 225, 236, 227, + 72, 239, 5, 1, 225, 110, 227, 72, 239, 5, 1, 225, 109, 227, 72, 239, 5, + 1, 219, 113, 227, 72, 239, 5, 1, 219, 112, 227, 72, 239, 5, 1, 230, 141, + 227, 72, 239, 5, 1, 231, 167, 227, 72, 239, 5, 1, 239, 20, 227, 72, 239, + 5, 1, 217, 199, 227, 72, 239, 5, 1, 217, 198, 227, 72, 239, 5, 1, 217, + 86, 227, 72, 239, 5, 1, 172, 227, 72, 239, 5, 1, 220, 19, 227, 72, 239, + 5, 1, 212, 219, 227, 72, 239, 5, 1, 212, 218, 227, 72, 239, 5, 1, 212, + 131, 227, 72, 239, 5, 1, 212, 130, 227, 72, 239, 5, 1, 124, 227, 72, 239, + 5, 1, 246, 145, 227, 72, 239, 5, 16, 208, 208, 227, 72, 239, 5, 16, 208, + 207, 227, 72, 247, 21, 1, 62, 227, 72, 247, 21, 1, 75, 227, 72, 247, 21, + 1, 74, 227, 72, 247, 21, 1, 76, 227, 72, 247, 21, 1, 190, 227, 72, 247, + 21, 1, 207, 96, 227, 72, 247, 21, 1, 250, 183, 227, 72, 247, 21, 1, 179, + 227, 72, 247, 21, 1, 185, 227, 72, 247, 21, 1, 199, 227, 72, 247, 21, 1, + 225, 110, 227, 72, 247, 21, 1, 219, 113, 227, 72, 247, 21, 1, 230, 141, + 227, 72, 247, 21, 1, 231, 167, 227, 72, 247, 21, 1, 239, 20, 227, 72, + 247, 21, 1, 217, 199, 227, 72, 247, 21, 1, 252, 19, 217, 199, 227, 72, + 247, 21, 1, 217, 86, 227, 72, 247, 21, 1, 172, 227, 72, 247, 21, 1, 220, + 19, 227, 72, 247, 21, 1, 212, 219, 227, 72, 247, 21, 1, 212, 131, 227, + 72, 247, 21, 1, 124, 227, 72, 247, 21, 1, 246, 145, 227, 72, 247, 21, + 229, 133, 218, 130, 227, 72, 247, 21, 229, 133, 233, 75, 231, 154, 1, 62, + 231, 154, 22, 3, 74, 231, 154, 22, 3, 71, 231, 154, 22, 3, 115, 137, 231, + 154, 22, 3, 75, 231, 154, 22, 3, 76, 231, 154, 22, 230, 20, 83, 231, 154, + 3, 50, 218, 149, 55, 231, 154, 3, 252, 73, 231, 154, 3, 208, 183, 231, + 154, 1, 172, 231, 154, 1, 231, 167, 231, 154, 1, 240, 244, 231, 154, 1, + 240, 99, 231, 154, 1, 249, 1, 231, 154, 1, 248, 110, 231, 154, 1, 232, + 200, 231, 154, 1, 223, 144, 231, 154, 1, 210, 208, 231, 154, 1, 210, 196, + 231, 154, 1, 246, 54, 231, 154, 1, 246, 38, 231, 154, 1, 224, 103, 231, + 154, 1, 212, 219, 231, 154, 1, 212, 56, 231, 154, 1, 246, 145, 231, 154, + 1, 245, 192, 231, 154, 1, 199, 231, 154, 1, 179, 231, 154, 1, 221, 93, + 231, 154, 1, 250, 183, 231, 154, 1, 250, 0, 231, 154, 1, 185, 231, 154, + 1, 190, 231, 154, 1, 219, 113, 231, 154, 1, 230, 141, 231, 154, 1, 209, + 70, 231, 154, 1, 216, 2, 231, 154, 1, 214, 96, 231, 154, 1, 217, 199, + 231, 154, 1, 205, 116, 231, 154, 1, 155, 231, 154, 1, 231, 72, 231, 154, + 1, 210, 176, 231, 154, 3, 250, 129, 52, 231, 154, 3, 248, 179, 231, 154, + 3, 67, 55, 231, 154, 208, 188, 231, 154, 18, 102, 231, 154, 18, 105, 231, + 154, 18, 142, 231, 154, 18, 139, 231, 154, 43, 212, 98, 231, 154, 43, + 210, 123, 231, 154, 43, 119, 238, 29, 231, 154, 43, 119, 211, 242, 231, + 154, 220, 72, 245, 23, 231, 154, 220, 72, 5, 247, 233, 231, 154, 220, 72, + 247, 233, 231, 154, 220, 72, 247, 66, 134, 231, 154, 220, 72, 227, 215, + 231, 154, 220, 72, 229, 102, 231, 154, 220, 72, 246, 100, 231, 154, 220, + 72, 50, 246, 100, 231, 154, 220, 72, 229, 199, 44, 188, 252, 34, 1, 239, + 71, 44, 188, 252, 34, 1, 230, 97, 44, 188, 252, 34, 1, 239, 27, 44, 188, + 252, 34, 1, 227, 90, 44, 188, 252, 34, 1, 219, 218, 44, 188, 252, 34, 1, + 207, 59, 44, 188, 252, 34, 1, 215, 171, 44, 188, 252, 34, 1, 218, 242, + 44, 188, 252, 34, 1, 250, 7, 44, 188, 252, 34, 1, 212, 145, 44, 188, 252, + 34, 1, 217, 133, 44, 188, 252, 34, 1, 232, 17, 44, 188, 252, 34, 1, 223, + 173, 44, 188, 252, 34, 1, 231, 149, 44, 188, 252, 34, 1, 217, 189, 44, + 188, 252, 34, 1, 217, 157, 44, 188, 252, 34, 1, 242, 28, 44, 188, 252, + 34, 1, 252, 172, 44, 188, 252, 34, 1, 251, 153, 44, 188, 252, 34, 1, 245, + 189, 44, 188, 252, 34, 1, 240, 47, 44, 188, 252, 34, 1, 246, 110, 44, + 188, 252, 34, 1, 240, 87, 44, 188, 252, 34, 1, 212, 76, 44, 188, 252, 34, + 1, 205, 95, 44, 188, 252, 34, 1, 245, 186, 44, 188, 252, 34, 1, 205, 235, + 44, 188, 252, 34, 1, 212, 43, 44, 188, 252, 34, 1, 212, 22, 44, 188, 252, + 34, 43, 102, 44, 188, 252, 34, 43, 241, 243, 44, 188, 252, 34, 133, 233, + 49, 44, 143, 252, 34, 1, 239, 50, 44, 143, 252, 34, 1, 230, 106, 44, 143, + 252, 34, 1, 239, 132, 44, 143, 252, 34, 1, 227, 104, 44, 143, 252, 34, 1, + 220, 12, 44, 143, 252, 34, 1, 207, 59, 44, 143, 252, 34, 1, 242, 223, 44, + 143, 252, 34, 1, 219, 16, 44, 143, 252, 34, 1, 250, 38, 44, 143, 252, 34, + 1, 212, 115, 44, 143, 252, 34, 1, 242, 224, 44, 143, 252, 34, 1, 232, 45, + 44, 143, 252, 34, 1, 224, 54, 44, 143, 252, 34, 1, 231, 163, 44, 143, + 252, 34, 1, 217, 191, 44, 143, 252, 34, 1, 242, 222, 44, 143, 252, 34, 1, + 242, 15, 44, 143, 252, 34, 1, 252, 172, 44, 143, 252, 34, 1, 252, 200, + 44, 143, 252, 34, 1, 246, 140, 44, 143, 252, 34, 1, 240, 161, 44, 143, + 252, 34, 1, 246, 117, 44, 143, 252, 34, 1, 240, 94, 44, 143, 252, 34, 1, + 212, 194, 44, 143, 252, 34, 1, 205, 108, 44, 143, 252, 34, 1, 212, 49, + 44, 143, 252, 34, 1, 206, 47, 44, 143, 252, 34, 1, 212, 37, 44, 143, 252, + 34, 1, 205, 111, 44, 143, 252, 34, 43, 102, 44, 143, 252, 34, 43, 212, + 98, 44, 143, 252, 34, 43, 210, 123, 227, 214, 1, 252, 170, 227, 214, 1, + 250, 7, 227, 214, 1, 249, 250, 227, 214, 1, 240, 47, 227, 214, 1, 240, + 72, 227, 214, 1, 246, 110, 227, 214, 1, 239, 71, 227, 214, 1, 207, 59, + 227, 214, 3, 210, 8, 227, 214, 1, 205, 96, 227, 214, 1, 205, 74, 227, + 214, 1, 232, 184, 227, 214, 1, 232, 166, 227, 214, 1, 239, 27, 227, 214, + 1, 212, 76, 227, 214, 1, 205, 235, 227, 214, 1, 232, 17, 227, 214, 1, + 206, 178, 227, 214, 1, 231, 156, 227, 214, 1, 230, 97, 227, 214, 1, 245, + 185, 227, 214, 1, 212, 48, 227, 214, 1, 227, 90, 227, 214, 1, 223, 173, + 227, 214, 1, 217, 157, 227, 214, 1, 251, 154, 227, 214, 1, 253, 117, 227, + 214, 1, 221, 174, 227, 214, 1, 242, 28, 227, 214, 1, 217, 189, 227, 214, + 1, 219, 218, 227, 214, 1, 206, 156, 227, 214, 1, 219, 244, 227, 214, 1, + 218, 242, 227, 214, 1, 215, 171, 227, 214, 1, 214, 65, 227, 214, 1, 212, + 145, 227, 214, 253, 29, 141, 52, 227, 214, 253, 29, 141, 55, 227, 214, + 43, 102, 227, 214, 43, 168, 227, 214, 43, 212, 98, 227, 214, 43, 210, + 123, 227, 214, 43, 119, 238, 29, 227, 214, 220, 72, 214, 26, 227, 214, + 220, 72, 241, 183, 227, 214, 220, 72, 50, 67, 206, 255, 245, 23, 227, + 214, 220, 72, 67, 206, 255, 245, 23, 227, 214, 220, 72, 245, 23, 227, + 214, 220, 72, 118, 245, 21, 227, 214, 220, 72, 229, 206, 241, 232, 251, + 164, 1, 62, 251, 164, 1, 253, 164, 251, 164, 1, 252, 71, 251, 164, 1, + 253, 123, 251, 164, 1, 252, 122, 251, 164, 1, 253, 124, 251, 164, 1, 252, + 248, 251, 164, 1, 252, 244, 251, 164, 1, 75, 251, 164, 1, 243, 104, 251, + 164, 1, 76, 251, 164, 1, 222, 152, 251, 164, 1, 74, 251, 164, 1, 233, + 102, 251, 164, 1, 71, 251, 164, 1, 209, 162, 251, 164, 1, 231, 224, 251, + 164, 1, 206, 175, 251, 164, 1, 206, 137, 251, 164, 1, 206, 147, 251, 164, + 1, 240, 170, 251, 164, 1, 240, 130, 251, 164, 1, 240, 85, 251, 164, 1, + 248, 148, 251, 164, 1, 232, 182, 251, 164, 1, 212, 131, 251, 164, 1, 212, + 41, 251, 164, 1, 246, 9, 251, 164, 1, 245, 183, 251, 164, 1, 210, 203, + 251, 164, 1, 221, 174, 251, 164, 1, 242, 28, 251, 164, 1, 250, 61, 251, + 164, 1, 249, 252, 251, 164, 1, 225, 64, 251, 164, 1, 224, 236, 251, 164, + 1, 224, 237, 251, 164, 1, 225, 110, 251, 164, 1, 223, 134, 251, 164, 1, + 224, 98, 251, 164, 1, 227, 119, 251, 164, 1, 238, 199, 251, 164, 1, 205, + 166, 251, 164, 1, 206, 52, 251, 164, 1, 209, 39, 251, 164, 1, 219, 51, + 251, 164, 1, 230, 58, 251, 164, 1, 217, 86, 251, 164, 1, 205, 93, 251, + 164, 1, 215, 214, 251, 164, 1, 205, 72, 251, 164, 1, 215, 87, 251, 164, + 1, 214, 66, 251, 164, 1, 239, 71, 251, 164, 253, 29, 83, 211, 169, 118, + 177, 131, 119, 67, 220, 71, 5, 118, 177, 131, 119, 67, 220, 71, 230, 86, + 118, 177, 131, 119, 67, 220, 71, 230, 86, 119, 67, 131, 118, 177, 220, + 71, 230, 86, 118, 218, 146, 131, 119, 218, 149, 220, 71, 230, 86, 119, + 218, 149, 131, 118, 218, 146, 220, 71, 233, 29, 221, 210, 1, 252, 170, + 233, 29, 221, 210, 1, 250, 7, 233, 29, 221, 210, 1, 240, 47, 233, 29, + 221, 210, 1, 246, 110, 233, 29, 221, 210, 1, 239, 71, 233, 29, 221, 210, + 1, 207, 59, 233, 29, 221, 210, 1, 205, 96, 233, 29, 221, 210, 1, 239, 27, + 233, 29, 221, 210, 1, 212, 76, 233, 29, 221, 210, 1, 205, 235, 233, 29, + 221, 210, 1, 232, 17, 233, 29, 221, 210, 1, 230, 97, 233, 29, 221, 210, + 1, 227, 90, 233, 29, 221, 210, 1, 223, 173, 233, 29, 221, 210, 1, 217, + 157, 233, 29, 221, 210, 1, 251, 154, 233, 29, 221, 210, 1, 221, 174, 233, + 29, 221, 210, 1, 217, 189, 233, 29, 221, 210, 1, 219, 218, 233, 29, 221, + 210, 1, 218, 242, 233, 29, 221, 210, 1, 215, 171, 233, 29, 221, 210, 1, + 212, 145, 233, 29, 221, 210, 43, 102, 233, 29, 221, 210, 43, 105, 233, + 29, 221, 210, 43, 142, 233, 29, 221, 210, 43, 139, 233, 29, 221, 210, 43, + 212, 98, 233, 29, 221, 210, 43, 210, 123, 233, 29, 221, 210, 43, 119, + 238, 29, 233, 29, 221, 210, 43, 119, 211, 242, 233, 29, 222, 33, 1, 252, + 170, 233, 29, 222, 33, 1, 250, 7, 233, 29, 222, 33, 1, 240, 47, 233, 29, + 222, 33, 1, 246, 110, 233, 29, 222, 33, 1, 239, 71, 233, 29, 222, 33, 1, + 207, 58, 233, 29, 222, 33, 1, 205, 96, 233, 29, 222, 33, 1, 239, 27, 233, + 29, 222, 33, 1, 212, 76, 233, 29, 222, 33, 1, 205, 235, 233, 29, 222, 33, + 1, 232, 17, 233, 29, 222, 33, 1, 230, 97, 233, 29, 222, 33, 1, 227, 89, + 233, 29, 222, 33, 1, 223, 173, 233, 29, 222, 33, 1, 217, 157, 233, 29, + 222, 33, 1, 221, 174, 233, 29, 222, 33, 1, 217, 189, 233, 29, 222, 33, 1, + 215, 171, 233, 29, 222, 33, 1, 212, 145, 233, 29, 222, 33, 43, 102, 233, + 29, 222, 33, 43, 105, 233, 29, 222, 33, 43, 142, 233, 29, 222, 33, 43, + 139, 233, 29, 222, 33, 43, 212, 98, 233, 29, 222, 33, 43, 210, 123, 233, + 29, 222, 33, 43, 119, 238, 29, 233, 29, 222, 33, 43, 119, 211, 242, 220, + 94, 222, 33, 1, 252, 170, 220, 94, 222, 33, 1, 250, 7, 220, 94, 222, 33, + 1, 240, 47, 220, 94, 222, 33, 1, 246, 110, 220, 94, 222, 33, 1, 239, 71, + 220, 94, 222, 33, 1, 207, 58, 220, 94, 222, 33, 1, 205, 96, 220, 94, 222, + 33, 1, 239, 27, 220, 94, 222, 33, 1, 205, 235, 220, 94, 222, 33, 1, 232, + 17, 220, 94, 222, 33, 1, 230, 97, 220, 94, 222, 33, 1, 227, 89, 220, 94, + 222, 33, 1, 223, 173, 220, 94, 222, 33, 1, 217, 157, 220, 94, 222, 33, 1, + 221, 174, 220, 94, 222, 33, 1, 217, 189, 220, 94, 222, 33, 1, 215, 171, + 220, 94, 222, 33, 1, 212, 145, 220, 94, 222, 33, 217, 77, 83, 220, 94, + 222, 33, 201, 217, 77, 83, 220, 94, 222, 33, 241, 125, 177, 2, 247, 59, + 220, 94, 222, 33, 241, 125, 177, 2, 245, 23, 220, 94, 222, 33, 43, 102, + 220, 94, 222, 33, 43, 105, 220, 94, 222, 33, 43, 142, 220, 94, 222, 33, + 43, 139, 220, 94, 222, 33, 43, 212, 98, 220, 94, 222, 33, 43, 210, 123, + 220, 94, 222, 33, 43, 119, 238, 29, 44, 210, 147, 1, 222, 113, 62, 44, + 210, 147, 1, 206, 40, 62, 44, 210, 147, 1, 206, 40, 252, 248, 44, 210, + 147, 1, 222, 113, 74, 44, 210, 147, 1, 206, 40, 74, 44, 210, 147, 1, 206, + 40, 75, 44, 210, 147, 1, 222, 113, 76, 44, 210, 147, 1, 222, 113, 222, + 206, 44, 210, 147, 1, 206, 40, 222, 206, 44, 210, 147, 1, 222, 113, 253, + 115, 44, 210, 147, 1, 206, 40, 253, 115, 44, 210, 147, 1, 222, 113, 252, + 247, 44, 210, 147, 1, 206, 40, 252, 247, 44, 210, 147, 1, 222, 113, 252, + 220, 44, 210, 147, 1, 206, 40, 252, 220, 44, 210, 147, 1, 222, 113, 252, + 242, 44, 210, 147, 1, 206, 40, 252, 242, 44, 210, 147, 1, 222, 113, 253, + 5, 44, 210, 147, 1, 206, 40, 253, 5, 44, 210, 147, 1, 222, 113, 252, 246, + 44, 210, 147, 1, 222, 113, 242, 145, 44, 210, 147, 1, 206, 40, 242, 145, + 44, 210, 147, 1, 222, 113, 251, 159, 44, 210, 147, 1, 206, 40, 251, 159, + 44, 210, 147, 1, 222, 113, 252, 229, 44, 210, 147, 1, 206, 40, 252, 229, + 44, 210, 147, 1, 222, 113, 252, 240, 44, 210, 147, 1, 206, 40, 252, 240, + 44, 210, 147, 1, 222, 113, 222, 205, 44, 210, 147, 1, 206, 40, 222, 205, + 44, 210, 147, 1, 222, 113, 252, 181, 44, 210, 147, 1, 206, 40, 252, 181, + 44, 210, 147, 1, 222, 113, 252, 239, 44, 210, 147, 1, 222, 113, 243, 52, + 44, 210, 147, 1, 222, 113, 243, 50, 44, 210, 147, 1, 222, 113, 252, 122, + 44, 210, 147, 1, 222, 113, 252, 237, 44, 210, 147, 1, 206, 40, 252, 237, + 44, 210, 147, 1, 222, 113, 243, 20, 44, 210, 147, 1, 206, 40, 243, 20, + 44, 210, 147, 1, 222, 113, 243, 38, 44, 210, 147, 1, 206, 40, 243, 38, + 44, 210, 147, 1, 222, 113, 243, 7, 44, 210, 147, 1, 206, 40, 243, 7, 44, + 210, 147, 1, 206, 40, 252, 114, 44, 210, 147, 1, 222, 113, 243, 28, 44, + 210, 147, 1, 206, 40, 252, 236, 44, 210, 147, 1, 222, 113, 242, 253, 44, + 210, 147, 1, 222, 113, 222, 143, 44, 210, 147, 1, 222, 113, 237, 183, 44, + 210, 147, 1, 222, 113, 243, 110, 44, 210, 147, 1, 206, 40, 243, 110, 44, + 210, 147, 1, 222, 113, 252, 41, 44, 210, 147, 1, 206, 40, 252, 41, 44, + 210, 147, 1, 222, 113, 232, 245, 44, 210, 147, 1, 206, 40, 232, 245, 44, + 210, 147, 1, 222, 113, 222, 124, 44, 210, 147, 1, 206, 40, 222, 124, 44, + 210, 147, 1, 222, 113, 252, 37, 44, 210, 147, 1, 206, 40, 252, 37, 44, + 210, 147, 1, 222, 113, 252, 235, 44, 210, 147, 1, 222, 113, 251, 231, 44, + 210, 147, 1, 222, 113, 252, 233, 44, 210, 147, 1, 222, 113, 251, 225, 44, + 210, 147, 1, 206, 40, 251, 225, 44, 210, 147, 1, 222, 113, 242, 215, 44, + 210, 147, 1, 206, 40, 242, 215, 44, 210, 147, 1, 222, 113, 251, 199, 44, + 210, 147, 1, 206, 40, 251, 199, 44, 210, 147, 1, 222, 113, 252, 230, 44, + 210, 147, 1, 206, 40, 252, 230, 44, 210, 147, 1, 222, 113, 222, 103, 44, + 210, 147, 1, 222, 113, 250, 113, 218, 36, 18, 102, 218, 36, 18, 105, 218, + 36, 18, 142, 218, 36, 18, 139, 218, 36, 18, 168, 218, 36, 18, 184, 218, + 36, 18, 195, 218, 36, 18, 193, 218, 36, 18, 200, 218, 36, 43, 212, 98, + 218, 36, 43, 210, 123, 218, 36, 43, 212, 3, 218, 36, 43, 241, 130, 218, + 36, 43, 241, 243, 218, 36, 43, 214, 252, 218, 36, 43, 216, 17, 218, 36, + 43, 243, 79, 218, 36, 43, 224, 190, 218, 36, 43, 119, 238, 29, 218, 36, + 43, 118, 238, 29, 218, 36, 43, 129, 238, 29, 218, 36, 43, 241, 125, 238, + 29, 218, 36, 43, 241, 204, 238, 29, 218, 36, 43, 215, 10, 238, 29, 218, + 36, 43, 216, 23, 238, 29, 218, 36, 43, 243, 88, 238, 29, 218, 36, 43, + 224, 195, 238, 29, 218, 36, 241, 116, 119, 239, 121, 218, 36, 241, 116, + 119, 219, 204, 218, 36, 241, 116, 119, 212, 10, 218, 36, 241, 116, 118, + 212, 7, 136, 3, 248, 217, 136, 3, 252, 73, 136, 3, 208, 183, 136, 3, 232, + 156, 136, 3, 209, 204, 136, 1, 62, 136, 1, 253, 164, 136, 1, 74, 136, 1, + 233, 102, 136, 1, 71, 136, 1, 209, 162, 136, 1, 115, 137, 136, 1, 115, + 218, 90, 136, 1, 115, 149, 136, 1, 115, 229, 173, 136, 1, 75, 136, 1, + 252, 205, 136, 1, 76, 136, 1, 251, 184, 136, 1, 172, 136, 1, 231, 167, + 136, 1, 240, 244, 136, 1, 240, 99, 136, 1, 225, 77, 136, 1, 249, 1, 136, + 1, 248, 110, 136, 1, 232, 200, 136, 1, 232, 170, 136, 1, 223, 144, 136, + 1, 210, 208, 136, 1, 210, 196, 136, 1, 246, 54, 136, 1, 246, 38, 136, 1, + 224, 103, 136, 1, 212, 219, 136, 1, 212, 56, 136, 1, 246, 145, 136, 1, + 245, 192, 136, 1, 199, 136, 1, 179, 136, 1, 221, 93, 136, 1, 250, 183, + 136, 1, 250, 0, 136, 1, 185, 136, 1, 190, 136, 1, 219, 113, 136, 1, 230, + 141, 136, 1, 209, 70, 136, 1, 216, 2, 136, 1, 214, 96, 136, 1, 217, 199, + 136, 1, 155, 136, 1, 229, 172, 136, 1, 44, 40, 229, 163, 136, 1, 44, 40, + 218, 89, 136, 1, 44, 40, 224, 85, 136, 22, 3, 253, 164, 136, 22, 3, 249, + 253, 253, 164, 136, 22, 3, 74, 136, 22, 3, 233, 102, 136, 22, 3, 71, 136, + 22, 3, 209, 162, 136, 22, 3, 115, 137, 136, 22, 3, 115, 218, 90, 136, 22, + 3, 115, 149, 136, 22, 3, 115, 229, 173, 136, 22, 3, 75, 136, 22, 3, 252, + 205, 136, 22, 3, 76, 136, 22, 3, 251, 184, 136, 208, 188, 136, 246, 100, + 136, 50, 246, 100, 136, 220, 72, 245, 23, 136, 220, 72, 50, 245, 23, 136, + 220, 72, 229, 205, 136, 220, 72, 247, 66, 134, 136, 220, 72, 229, 102, + 136, 43, 102, 136, 43, 105, 136, 43, 142, 136, 43, 139, 136, 43, 168, + 136, 43, 184, 136, 43, 195, 136, 43, 193, 136, 43, 200, 136, 43, 212, 98, + 136, 43, 210, 123, 136, 43, 212, 3, 136, 43, 241, 130, 136, 43, 241, 243, + 136, 43, 214, 252, 136, 43, 216, 17, 136, 43, 243, 79, 136, 43, 224, 190, + 136, 43, 119, 238, 29, 136, 43, 119, 211, 242, 136, 18, 205, 85, 136, 18, + 102, 136, 18, 105, 136, 18, 142, 136, 18, 139, 136, 18, 168, 136, 18, + 184, 136, 18, 195, 136, 18, 193, 136, 18, 200, 136, 43, 232, 117, 232, + 38, 3, 248, 217, 232, 38, 3, 252, 73, 232, 38, 3, 208, 183, 232, 38, 1, + 62, 232, 38, 1, 253, 164, 232, 38, 1, 74, 232, 38, 1, 233, 102, 232, 38, + 1, 71, 232, 38, 1, 209, 162, 232, 38, 1, 75, 232, 38, 1, 252, 205, 232, + 38, 1, 76, 232, 38, 1, 251, 184, 232, 38, 1, 172, 232, 38, 1, 231, 167, + 232, 38, 1, 240, 244, 232, 38, 1, 240, 99, 232, 38, 1, 225, 77, 232, 38, + 1, 249, 1, 232, 38, 1, 248, 110, 232, 38, 1, 232, 200, 232, 38, 1, 232, + 170, 232, 38, 1, 223, 144, 232, 38, 1, 210, 208, 232, 38, 1, 210, 196, + 232, 38, 1, 246, 54, 232, 38, 1, 246, 43, 232, 38, 1, 246, 38, 232, 38, + 1, 218, 212, 232, 38, 1, 224, 103, 232, 38, 1, 212, 219, 232, 38, 1, 212, + 56, 232, 38, 1, 246, 145, 232, 38, 1, 245, 192, 232, 38, 1, 199, 232, 38, + 1, 179, 232, 38, 1, 221, 93, 232, 38, 1, 250, 183, 232, 38, 1, 250, 0, + 232, 38, 1, 185, 232, 38, 1, 190, 232, 38, 1, 219, 113, 232, 38, 1, 230, + 141, 232, 38, 1, 209, 70, 232, 38, 1, 216, 2, 232, 38, 1, 214, 96, 232, + 38, 1, 217, 199, 232, 38, 1, 155, 232, 38, 22, 3, 253, 164, 232, 38, 22, + 3, 74, 232, 38, 22, 3, 233, 102, 232, 38, 22, 3, 71, 232, 38, 22, 3, 209, + 162, 232, 38, 22, 3, 75, 232, 38, 22, 3, 252, 205, 232, 38, 22, 3, 76, + 232, 38, 22, 3, 251, 184, 232, 38, 3, 208, 188, 232, 38, 3, 223, 184, + 232, 38, 253, 29, 53, 232, 38, 243, 10, 53, 232, 38, 43, 53, 232, 38, + 217, 77, 83, 232, 38, 50, 217, 77, 83, 232, 38, 246, 100, 232, 38, 50, + 246, 100, 214, 170, 214, 178, 1, 217, 182, 214, 170, 214, 178, 1, 212, + 194, 214, 170, 214, 178, 1, 250, 158, 214, 170, 214, 178, 1, 248, 246, + 214, 170, 214, 178, 1, 246, 126, 214, 170, 214, 178, 1, 240, 229, 214, + 170, 214, 178, 1, 227, 247, 214, 170, 214, 178, 1, 225, 74, 214, 170, + 214, 178, 1, 230, 117, 214, 170, 214, 178, 1, 225, 219, 214, 170, 214, + 178, 1, 209, 66, 214, 170, 214, 178, 1, 222, 34, 214, 170, 214, 178, 1, + 206, 90, 214, 170, 214, 178, 1, 219, 92, 214, 170, 214, 178, 1, 239, 132, + 214, 170, 214, 178, 1, 232, 43, 214, 170, 214, 178, 1, 232, 194, 214, + 170, 214, 178, 1, 223, 141, 214, 170, 214, 178, 1, 252, 213, 214, 170, + 214, 178, 1, 243, 102, 214, 170, 214, 178, 1, 233, 103, 214, 170, 214, + 178, 1, 209, 253, 214, 170, 214, 178, 1, 222, 194, 214, 170, 214, 178, 1, + 243, 92, 214, 170, 214, 178, 1, 228, 4, 214, 170, 214, 178, 18, 205, 85, + 214, 170, 214, 178, 18, 102, 214, 170, 214, 178, 18, 105, 214, 170, 214, + 178, 18, 142, 214, 170, 214, 178, 18, 139, 214, 170, 214, 178, 18, 168, + 214, 170, 214, 178, 18, 184, 214, 170, 214, 178, 18, 195, 214, 170, 214, + 178, 18, 193, 214, 170, 214, 178, 18, 200, 248, 104, 3, 248, 217, 248, + 104, 3, 252, 73, 248, 104, 3, 208, 183, 248, 104, 1, 253, 164, 248, 104, + 1, 74, 248, 104, 1, 71, 248, 104, 1, 75, 248, 104, 1, 232, 63, 248, 104, + 1, 231, 166, 248, 104, 1, 240, 241, 248, 104, 1, 240, 98, 248, 104, 1, + 225, 76, 248, 104, 1, 249, 0, 248, 104, 1, 248, 109, 248, 104, 1, 232, + 199, 248, 104, 1, 232, 169, 248, 104, 1, 223, 143, 248, 104, 1, 210, 207, + 248, 104, 1, 210, 195, 248, 104, 1, 246, 53, 248, 104, 1, 246, 37, 248, + 104, 1, 224, 102, 248, 104, 1, 212, 215, 248, 104, 1, 212, 55, 248, 104, + 1, 246, 144, 248, 104, 1, 245, 191, 248, 104, 1, 225, 232, 248, 104, 1, + 222, 51, 248, 104, 1, 221, 92, 248, 104, 1, 250, 181, 248, 104, 1, 249, + 255, 248, 104, 1, 228, 18, 248, 104, 1, 205, 167, 248, 104, 1, 206, 109, + 248, 104, 1, 219, 109, 248, 104, 1, 230, 140, 248, 104, 1, 207, 95, 248, + 104, 1, 217, 196, 248, 104, 1, 239, 141, 248, 104, 22, 3, 62, 248, 104, + 22, 3, 74, 248, 104, 22, 3, 233, 102, 248, 104, 22, 3, 71, 248, 104, 22, + 3, 209, 162, 248, 104, 22, 3, 75, 248, 104, 22, 3, 252, 205, 248, 104, + 22, 3, 76, 248, 104, 22, 3, 251, 184, 248, 104, 22, 3, 222, 191, 248, + 104, 148, 83, 248, 104, 251, 185, 83, 248, 104, 208, 188, 248, 104, 228, + 16, 248, 104, 18, 205, 85, 248, 104, 18, 102, 248, 104, 18, 105, 248, + 104, 18, 142, 248, 104, 18, 139, 248, 104, 18, 168, 248, 104, 18, 184, + 248, 104, 18, 195, 248, 104, 18, 193, 248, 104, 18, 200, 248, 104, 217, + 77, 83, 248, 104, 246, 100, 248, 104, 50, 246, 100, 248, 104, 219, 196, + 83, 227, 245, 1, 62, 227, 245, 1, 74, 227, 245, 1, 71, 227, 245, 1, 75, + 227, 245, 1, 76, 227, 245, 1, 172, 227, 245, 1, 231, 167, 227, 245, 1, + 240, 244, 227, 245, 1, 240, 99, 227, 245, 1, 249, 1, 227, 245, 1, 248, + 110, 227, 245, 1, 232, 200, 227, 245, 1, 232, 170, 227, 245, 1, 223, 144, + 227, 245, 1, 210, 208, 227, 245, 1, 210, 196, 227, 245, 1, 246, 54, 227, + 245, 1, 246, 38, 227, 245, 1, 224, 103, 227, 245, 1, 212, 219, 227, 245, + 1, 212, 56, 227, 245, 1, 246, 145, 227, 245, 1, 245, 192, 227, 245, 1, + 199, 227, 245, 1, 179, 227, 245, 1, 221, 93, 227, 245, 1, 250, 183, 227, + 245, 1, 250, 0, 227, 245, 1, 185, 227, 245, 1, 219, 113, 227, 245, 1, + 230, 141, 227, 245, 1, 209, 70, 227, 245, 1, 217, 199, 227, 245, 1, 155, + 227, 245, 1, 218, 89, 227, 245, 3, 223, 184, 227, 245, 253, 29, 53, 227, + 245, 217, 77, 83, 227, 245, 28, 215, 123, 196, 3, 248, 217, 196, 3, 252, + 73, 196, 3, 208, 183, 196, 1, 62, 196, 1, 253, 164, 196, 1, 74, 196, 1, + 233, 102, 196, 1, 71, 196, 1, 209, 162, 196, 1, 115, 137, 196, 1, 115, + 218, 90, 196, 1, 115, 149, 196, 1, 115, 229, 173, 196, 1, 75, 196, 1, + 252, 205, 196, 1, 76, 196, 1, 251, 184, 196, 1, 172, 196, 1, 231, 167, + 196, 1, 240, 244, 196, 1, 240, 99, 196, 1, 225, 77, 196, 1, 249, 1, 196, + 1, 248, 110, 196, 1, 232, 200, 196, 1, 232, 170, 196, 1, 223, 144, 196, + 1, 210, 208, 196, 1, 210, 196, 196, 1, 246, 54, 196, 1, 246, 38, 196, 1, + 224, 103, 196, 1, 212, 219, 196, 1, 212, 56, 196, 1, 246, 145, 196, 1, + 245, 192, 196, 1, 199, 196, 1, 179, 196, 1, 221, 93, 196, 1, 250, 183, + 196, 1, 250, 0, 196, 1, 185, 196, 1, 190, 196, 1, 219, 113, 196, 1, 230, + 141, 196, 1, 229, 172, 196, 1, 209, 70, 196, 1, 216, 2, 196, 1, 214, 96, + 196, 1, 217, 199, 196, 1, 155, 196, 22, 3, 253, 164, 196, 22, 3, 74, 196, + 22, 3, 233, 102, 196, 22, 3, 71, 196, 22, 3, 209, 162, 196, 22, 3, 115, + 137, 196, 22, 3, 115, 218, 90, 196, 22, 3, 115, 149, 196, 22, 3, 115, + 229, 173, 196, 22, 3, 75, 196, 22, 3, 252, 205, 196, 22, 3, 76, 196, 22, + 3, 251, 184, 196, 3, 208, 188, 196, 3, 251, 167, 196, 3, 232, 156, 196, + 3, 209, 204, 196, 222, 173, 196, 246, 100, 196, 50, 246, 100, 196, 253, + 29, 53, 196, 216, 39, 196, 213, 120, 83, 196, 18, 205, 85, 196, 18, 102, + 196, 18, 105, 196, 18, 142, 196, 18, 139, 196, 18, 168, 196, 18, 184, + 196, 18, 195, 196, 18, 193, 196, 18, 200, 196, 243, 74, 132, 252, 19, 18, + 102, 132, 252, 19, 18, 105, 132, 252, 19, 18, 142, 132, 252, 19, 18, 139, + 132, 252, 19, 18, 168, 132, 252, 19, 18, 184, 132, 252, 19, 18, 195, 132, + 252, 19, 18, 193, 132, 252, 19, 18, 200, 132, 252, 19, 43, 212, 98, 132, + 252, 19, 43, 210, 123, 132, 252, 19, 43, 212, 3, 132, 252, 19, 43, 241, + 130, 132, 252, 19, 43, 241, 243, 132, 252, 19, 43, 214, 252, 132, 252, + 19, 43, 216, 17, 132, 252, 19, 43, 243, 79, 132, 252, 19, 43, 224, 190, + 132, 252, 19, 43, 119, 238, 29, 132, 252, 19, 43, 119, 211, 242, 231, + 137, 1, 62, 231, 137, 1, 253, 164, 231, 137, 1, 74, 231, 137, 1, 71, 231, + 137, 1, 75, 231, 137, 1, 252, 205, 231, 137, 1, 76, 231, 137, 1, 251, + 184, 231, 137, 1, 172, 231, 137, 1, 231, 167, 231, 137, 1, 240, 244, 231, + 137, 1, 240, 135, 231, 137, 1, 240, 99, 231, 137, 1, 225, 77, 231, 137, + 1, 249, 1, 231, 137, 1, 248, 110, 231, 137, 1, 232, 200, 231, 137, 1, + 232, 150, 231, 137, 1, 223, 144, 231, 137, 1, 210, 208, 231, 137, 1, 210, + 196, 231, 137, 1, 246, 54, 231, 137, 1, 246, 38, 231, 137, 1, 224, 103, + 231, 137, 1, 212, 219, 231, 137, 1, 212, 56, 231, 137, 1, 246, 145, 231, + 137, 1, 246, 44, 231, 137, 1, 245, 192, 231, 137, 1, 199, 231, 137, 1, + 179, 231, 137, 1, 221, 93, 231, 137, 1, 250, 183, 231, 137, 1, 250, 97, + 231, 137, 1, 250, 0, 231, 137, 1, 185, 231, 137, 1, 190, 231, 137, 1, + 219, 113, 231, 137, 1, 230, 141, 231, 137, 1, 209, 70, 231, 137, 1, 217, + 199, 231, 137, 1, 155, 231, 137, 1, 229, 172, 231, 137, 22, 3, 253, 164, + 231, 137, 22, 3, 74, 231, 137, 22, 3, 233, 102, 231, 137, 22, 3, 71, 231, + 137, 22, 3, 75, 231, 137, 22, 3, 252, 205, 231, 137, 22, 3, 76, 231, 137, + 22, 3, 251, 184, 231, 137, 3, 252, 73, 231, 137, 3, 208, 188, 231, 137, + 3, 223, 184, 231, 137, 3, 215, 249, 231, 137, 246, 100, 231, 137, 50, + 246, 100, 231, 137, 206, 232, 216, 39, 231, 137, 217, 77, 83, 231, 137, + 50, 217, 77, 83, 231, 137, 253, 29, 53, 231, 129, 1, 62, 231, 129, 1, + 253, 164, 231, 129, 1, 74, 231, 129, 1, 233, 102, 231, 129, 1, 71, 231, + 129, 1, 209, 162, 231, 129, 1, 75, 231, 129, 1, 252, 205, 231, 129, 1, + 76, 231, 129, 1, 251, 184, 231, 129, 1, 172, 231, 129, 1, 231, 167, 231, + 129, 1, 240, 244, 231, 129, 1, 240, 135, 231, 129, 1, 240, 99, 231, 129, + 1, 225, 77, 231, 129, 1, 249, 1, 231, 129, 1, 248, 110, 231, 129, 1, 232, + 200, 231, 129, 1, 232, 150, 231, 129, 1, 232, 170, 231, 129, 1, 223, 144, + 231, 129, 1, 210, 208, 231, 129, 1, 210, 196, 231, 129, 1, 246, 54, 231, + 129, 1, 246, 44, 231, 129, 1, 218, 89, 231, 129, 1, 246, 38, 231, 129, 1, + 224, 103, 231, 129, 1, 212, 219, 231, 129, 1, 212, 56, 231, 129, 1, 246, + 145, 231, 129, 1, 245, 192, 231, 129, 1, 199, 231, 129, 1, 179, 231, 129, + 1, 221, 93, 231, 129, 1, 250, 183, 231, 129, 1, 250, 97, 231, 129, 1, + 250, 0, 231, 129, 1, 185, 231, 129, 1, 190, 231, 129, 1, 219, 113, 231, + 129, 1, 230, 141, 231, 129, 1, 209, 70, 231, 129, 1, 216, 2, 231, 129, 1, + 217, 199, 231, 129, 1, 155, 231, 129, 3, 252, 73, 231, 129, 22, 3, 253, + 164, 231, 129, 22, 3, 74, 231, 129, 22, 3, 233, 102, 231, 129, 22, 3, 71, + 231, 129, 22, 3, 209, 162, 231, 129, 22, 3, 75, 231, 129, 22, 3, 252, + 205, 231, 129, 22, 3, 76, 231, 129, 22, 3, 251, 184, 231, 129, 3, 223, + 184, 231, 129, 3, 208, 188, 231, 129, 18, 205, 85, 231, 129, 18, 102, + 231, 129, 18, 105, 231, 129, 18, 142, 231, 129, 18, 139, 231, 129, 18, + 168, 231, 129, 18, 184, 231, 129, 18, 195, 231, 129, 18, 193, 231, 129, + 18, 200, 204, 204, 3, 248, 217, 204, 204, 3, 252, 73, 204, 204, 3, 208, + 183, 204, 204, 1, 62, 204, 204, 1, 253, 164, 204, 204, 1, 74, 204, 204, + 1, 233, 102, 204, 204, 1, 71, 204, 204, 1, 209, 162, 204, 204, 1, 115, + 137, 204, 204, 1, 115, 149, 204, 204, 1, 243, 104, 204, 204, 1, 252, 205, + 204, 204, 1, 222, 152, 204, 204, 1, 251, 184, 204, 204, 1, 172, 204, 204, + 1, 231, 167, 204, 204, 1, 240, 244, 204, 204, 1, 240, 99, 204, 204, 1, + 225, 77, 204, 204, 1, 249, 1, 204, 204, 1, 248, 110, 204, 204, 1, 232, + 200, 204, 204, 1, 232, 170, 204, 204, 1, 223, 144, 204, 204, 1, 210, 208, + 204, 204, 1, 210, 196, 204, 204, 1, 246, 54, 204, 204, 1, 246, 38, 204, + 204, 1, 224, 103, 204, 204, 1, 212, 219, 204, 204, 1, 212, 56, 204, 204, + 1, 246, 145, 204, 204, 1, 245, 192, 204, 204, 1, 199, 204, 204, 1, 179, + 204, 204, 1, 221, 93, 204, 204, 1, 250, 183, 204, 204, 1, 250, 0, 204, + 204, 1, 185, 204, 204, 1, 190, 204, 204, 1, 219, 113, 204, 204, 1, 230, + 141, 204, 204, 1, 229, 172, 204, 204, 1, 209, 70, 204, 204, 1, 216, 2, + 204, 204, 1, 214, 96, 204, 204, 1, 217, 199, 204, 204, 1, 155, 204, 204, + 3, 223, 184, 204, 204, 3, 251, 167, 204, 204, 22, 3, 253, 164, 204, 204, + 22, 3, 74, 204, 204, 22, 3, 233, 102, 204, 204, 22, 3, 71, 204, 204, 22, + 3, 209, 162, 204, 204, 22, 3, 115, 137, 204, 204, 22, 3, 115, 218, 90, + 204, 204, 22, 3, 243, 104, 204, 204, 22, 3, 252, 205, 204, 204, 22, 3, + 222, 152, 204, 204, 22, 3, 251, 184, 204, 204, 3, 208, 188, 204, 204, + 251, 185, 230, 20, 83, 204, 204, 3, 220, 216, 204, 204, 1, 209, 36, 252, + 73, 204, 204, 1, 209, 36, 50, 252, 73, 204, 204, 1, 115, 218, 90, 204, + 204, 1, 115, 229, 173, 204, 204, 22, 3, 115, 149, 204, 204, 22, 3, 115, + 229, 173, 36, 204, 204, 18, 205, 85, 36, 204, 204, 18, 102, 36, 204, 204, + 18, 105, 36, 204, 204, 18, 142, 36, 204, 204, 18, 139, 36, 204, 204, 18, + 168, 36, 204, 204, 18, 184, 36, 204, 204, 1, 62, 36, 204, 204, 1, 172, + 36, 204, 204, 1, 199, 36, 204, 204, 1, 208, 214, 36, 204, 204, 1, 179, + 211, 160, 252, 102, 211, 160, 1, 62, 211, 160, 1, 253, 164, 211, 160, 1, + 74, 211, 160, 1, 233, 102, 211, 160, 1, 71, 211, 160, 1, 209, 162, 211, + 160, 1, 115, 137, 211, 160, 1, 115, 218, 90, 211, 160, 1, 115, 149, 211, + 160, 1, 115, 229, 173, 211, 160, 1, 75, 211, 160, 1, 252, 205, 211, 160, + 1, 76, 211, 160, 1, 251, 184, 211, 160, 1, 172, 211, 160, 1, 231, 167, + 211, 160, 1, 240, 244, 211, 160, 1, 240, 99, 211, 160, 1, 225, 77, 211, + 160, 1, 249, 1, 211, 160, 1, 248, 110, 211, 160, 1, 232, 200, 211, 160, + 1, 232, 170, 211, 160, 1, 223, 144, 211, 160, 1, 210, 208, 211, 160, 1, + 210, 196, 211, 160, 1, 246, 54, 211, 160, 1, 246, 38, 211, 160, 1, 224, + 103, 211, 160, 1, 212, 219, 211, 160, 1, 212, 56, 211, 160, 1, 246, 145, + 211, 160, 1, 245, 192, 211, 160, 1, 199, 211, 160, 1, 179, 211, 160, 1, + 221, 93, 211, 160, 1, 250, 183, 211, 160, 1, 250, 0, 211, 160, 1, 185, + 211, 160, 1, 190, 211, 160, 1, 219, 113, 211, 160, 1, 230, 141, 211, 160, + 1, 209, 70, 211, 160, 1, 216, 2, 211, 160, 1, 214, 96, 211, 160, 1, 217, + 199, 211, 160, 1, 155, 211, 160, 22, 3, 253, 164, 211, 160, 22, 3, 74, + 211, 160, 22, 3, 233, 102, 211, 160, 22, 3, 71, 211, 160, 22, 3, 209, + 162, 211, 160, 22, 3, 115, 137, 211, 160, 22, 3, 115, 218, 90, 211, 160, + 22, 3, 115, 149, 211, 160, 22, 3, 115, 229, 173, 211, 160, 22, 3, 75, + 211, 160, 22, 3, 215, 144, 75, 211, 160, 22, 3, 252, 205, 211, 160, 22, + 3, 76, 211, 160, 22, 3, 215, 144, 76, 211, 160, 22, 3, 251, 184, 211, + 160, 3, 248, 217, 211, 160, 3, 252, 73, 211, 160, 3, 208, 183, 211, 160, + 3, 208, 188, 211, 160, 3, 223, 184, 211, 160, 3, 251, 167, 211, 160, 239, + 175, 211, 160, 253, 29, 53, 211, 160, 222, 173, 211, 160, 18, 205, 85, + 211, 160, 18, 102, 211, 160, 18, 105, 211, 160, 18, 142, 211, 160, 18, + 139, 211, 160, 18, 168, 211, 160, 18, 184, 211, 160, 18, 195, 211, 160, + 18, 193, 211, 160, 18, 200, 215, 75, 1, 62, 215, 75, 1, 253, 164, 215, + 75, 1, 74, 215, 75, 1, 233, 102, 215, 75, 1, 71, 215, 75, 1, 209, 162, + 215, 75, 1, 115, 137, 215, 75, 1, 115, 218, 90, 215, 75, 1, 115, 149, + 215, 75, 1, 115, 229, 173, 215, 75, 1, 75, 215, 75, 1, 252, 205, 215, 75, + 1, 76, 215, 75, 1, 251, 184, 215, 75, 1, 172, 215, 75, 1, 231, 167, 215, + 75, 1, 240, 244, 215, 75, 1, 240, 99, 215, 75, 1, 225, 77, 215, 75, 1, + 249, 1, 215, 75, 1, 248, 110, 215, 75, 1, 232, 200, 215, 75, 1, 232, 170, + 215, 75, 1, 223, 144, 215, 75, 1, 210, 208, 215, 75, 1, 210, 196, 215, + 75, 1, 246, 54, 215, 75, 1, 246, 38, 215, 75, 1, 224, 103, 215, 75, 1, + 212, 219, 215, 75, 1, 212, 56, 215, 75, 1, 246, 145, 215, 75, 1, 245, + 192, 215, 75, 1, 199, 215, 75, 1, 179, 215, 75, 1, 221, 93, 215, 75, 1, + 250, 183, 215, 75, 1, 250, 0, 215, 75, 1, 185, 215, 75, 1, 190, 215, 75, + 1, 219, 113, 215, 75, 1, 230, 141, 215, 75, 1, 209, 70, 215, 75, 1, 216, + 2, 215, 75, 1, 214, 96, 215, 75, 1, 217, 199, 215, 75, 1, 155, 215, 75, + 22, 3, 253, 164, 215, 75, 22, 3, 74, 215, 75, 22, 3, 233, 102, 215, 75, + 22, 3, 71, 215, 75, 22, 3, 209, 162, 215, 75, 22, 3, 115, 137, 215, 75, + 22, 3, 115, 218, 90, 215, 75, 22, 3, 75, 215, 75, 22, 3, 252, 205, 215, + 75, 22, 3, 76, 215, 75, 22, 3, 251, 184, 215, 75, 3, 248, 217, 215, 75, + 3, 252, 73, 215, 75, 3, 208, 183, 215, 75, 3, 208, 188, 215, 75, 3, 223, + 184, 215, 75, 3, 215, 74, 215, 75, 246, 100, 215, 75, 50, 246, 100, 215, + 75, 216, 40, 245, 23, 215, 75, 216, 40, 134, 215, 75, 218, 249, 227, 191, + 215, 75, 218, 249, 227, 190, 215, 75, 218, 249, 227, 189, 215, 75, 243, + 34, 73, 212, 61, 83, 226, 173, 1, 62, 226, 173, 1, 253, 164, 226, 173, 1, + 74, 226, 173, 1, 233, 102, 226, 173, 1, 71, 226, 173, 1, 209, 162, 226, + 173, 1, 115, 137, 226, 173, 1, 115, 218, 90, 226, 173, 1, 115, 149, 226, + 173, 1, 115, 229, 173, 226, 173, 1, 75, 226, 173, 1, 252, 205, 226, 173, + 1, 76, 226, 173, 1, 251, 184, 226, 173, 1, 172, 226, 173, 1, 231, 167, + 226, 173, 1, 240, 244, 226, 173, 1, 240, 99, 226, 173, 1, 225, 77, 226, + 173, 1, 249, 1, 226, 173, 1, 248, 110, 226, 173, 1, 232, 200, 226, 173, + 1, 232, 170, 226, 173, 1, 223, 144, 226, 173, 1, 210, 208, 226, 173, 1, + 210, 196, 226, 173, 1, 246, 54, 226, 173, 1, 246, 38, 226, 173, 1, 224, + 103, 226, 173, 1, 212, 219, 226, 173, 1, 212, 56, 226, 173, 1, 246, 145, + 226, 173, 1, 245, 192, 226, 173, 1, 199, 226, 173, 1, 179, 226, 173, 1, + 221, 93, 226, 173, 1, 250, 183, 226, 173, 1, 250, 0, 226, 173, 1, 185, + 226, 173, 1, 190, 226, 173, 1, 219, 113, 226, 173, 1, 230, 141, 226, 173, + 1, 209, 70, 226, 173, 1, 216, 2, 226, 173, 1, 214, 96, 226, 173, 1, 217, + 199, 226, 173, 1, 155, 226, 173, 1, 229, 172, 226, 173, 22, 3, 253, 164, + 226, 173, 22, 3, 74, 226, 173, 22, 3, 233, 102, 226, 173, 22, 3, 71, 226, + 173, 22, 3, 209, 162, 226, 173, 22, 3, 115, 137, 226, 173, 22, 3, 115, + 218, 90, 226, 173, 22, 3, 115, 149, 226, 173, 22, 3, 115, 229, 173, 226, + 173, 22, 3, 75, 226, 173, 22, 3, 252, 205, 226, 173, 22, 3, 76, 226, 173, + 22, 3, 251, 184, 226, 173, 3, 252, 73, 226, 173, 3, 208, 183, 226, 173, + 3, 208, 188, 226, 173, 3, 252, 16, 226, 173, 246, 100, 226, 173, 50, 246, + 100, 226, 173, 253, 29, 53, 226, 173, 3, 238, 18, 226, 173, 18, 205, 85, + 226, 173, 18, 102, 226, 173, 18, 105, 226, 173, 18, 142, 226, 173, 18, + 139, 226, 173, 18, 168, 226, 173, 18, 184, 226, 173, 18, 195, 226, 173, + 18, 193, 226, 173, 18, 200, 212, 183, 1, 62, 212, 183, 1, 253, 164, 212, + 183, 1, 74, 212, 183, 1, 233, 102, 212, 183, 1, 71, 212, 183, 1, 209, + 162, 212, 183, 1, 75, 212, 183, 1, 252, 205, 212, 183, 1, 76, 212, 183, + 1, 251, 184, 212, 183, 1, 172, 212, 183, 1, 231, 167, 212, 183, 1, 240, + 244, 212, 183, 1, 240, 99, 212, 183, 1, 225, 77, 212, 183, 1, 249, 1, + 212, 183, 1, 248, 110, 212, 183, 1, 232, 200, 212, 183, 1, 232, 170, 212, + 183, 1, 223, 144, 212, 183, 1, 210, 208, 212, 183, 1, 210, 196, 212, 183, + 1, 246, 54, 212, 183, 1, 246, 38, 212, 183, 1, 224, 103, 212, 183, 1, + 212, 219, 212, 183, 1, 212, 56, 212, 183, 1, 246, 145, 212, 183, 1, 245, + 192, 212, 183, 1, 199, 212, 183, 1, 179, 212, 183, 1, 221, 93, 212, 183, + 1, 250, 183, 212, 183, 1, 250, 0, 212, 183, 1, 185, 212, 183, 1, 190, + 212, 183, 1, 219, 113, 212, 183, 1, 230, 141, 212, 183, 1, 209, 70, 212, + 183, 1, 216, 2, 212, 183, 1, 217, 199, 212, 183, 1, 155, 212, 183, 1, + 218, 89, 212, 183, 3, 252, 73, 212, 183, 3, 208, 183, 212, 183, 22, 3, + 253, 164, 212, 183, 22, 3, 74, 212, 183, 22, 3, 233, 102, 212, 183, 22, + 3, 71, 212, 183, 22, 3, 209, 162, 212, 183, 22, 3, 75, 212, 183, 22, 3, + 252, 205, 212, 183, 22, 3, 76, 212, 183, 22, 3, 251, 184, 212, 183, 3, + 208, 188, 212, 183, 3, 223, 184, 212, 183, 18, 205, 85, 212, 183, 18, + 102, 212, 183, 18, 105, 212, 183, 18, 142, 212, 183, 18, 139, 212, 183, + 18, 168, 212, 183, 18, 184, 212, 183, 18, 195, 212, 183, 18, 193, 212, + 183, 18, 200, 202, 197, 6, 1, 225, 76, 202, 197, 6, 1, 62, 202, 197, 6, + 1, 207, 20, 202, 197, 6, 1, 205, 213, 202, 197, 6, 1, 190, 202, 197, 6, + 1, 205, 247, 202, 197, 6, 1, 233, 102, 202, 197, 6, 1, 209, 162, 202, + 197, 6, 1, 75, 202, 197, 6, 1, 76, 202, 197, 6, 1, 252, 114, 202, 197, 6, + 1, 240, 244, 202, 197, 6, 1, 231, 53, 202, 197, 6, 1, 243, 7, 202, 197, + 6, 1, 205, 197, 202, 197, 6, 1, 210, 10, 202, 197, 6, 1, 243, 25, 202, + 197, 6, 1, 222, 209, 202, 197, 6, 1, 210, 203, 202, 197, 6, 1, 223, 170, + 202, 197, 6, 1, 246, 145, 202, 197, 6, 1, 251, 199, 202, 197, 6, 1, 252, + 136, 202, 197, 6, 1, 249, 101, 202, 197, 6, 1, 220, 82, 202, 197, 6, 1, + 238, 241, 202, 197, 6, 1, 238, 138, 202, 197, 6, 1, 238, 67, 202, 197, 6, + 1, 239, 95, 202, 197, 6, 1, 214, 48, 202, 197, 6, 1, 215, 61, 202, 197, + 6, 1, 208, 174, 202, 197, 5, 1, 225, 76, 202, 197, 5, 1, 62, 202, 197, 5, + 1, 207, 20, 202, 197, 5, 1, 205, 213, 202, 197, 5, 1, 190, 202, 197, 5, + 1, 205, 247, 202, 197, 5, 1, 233, 102, 202, 197, 5, 1, 209, 162, 202, + 197, 5, 1, 75, 202, 197, 5, 1, 76, 202, 197, 5, 1, 252, 114, 202, 197, 5, + 1, 240, 244, 202, 197, 5, 1, 231, 53, 202, 197, 5, 1, 243, 7, 202, 197, + 5, 1, 205, 197, 202, 197, 5, 1, 210, 10, 202, 197, 5, 1, 243, 25, 202, + 197, 5, 1, 222, 209, 202, 197, 5, 1, 210, 203, 202, 197, 5, 1, 223, 170, + 202, 197, 5, 1, 246, 145, 202, 197, 5, 1, 251, 199, 202, 197, 5, 1, 252, + 136, 202, 197, 5, 1, 249, 101, 202, 197, 5, 1, 220, 82, 202, 197, 5, 1, + 238, 241, 202, 197, 5, 1, 238, 138, 202, 197, 5, 1, 238, 67, 202, 197, 5, + 1, 239, 95, 202, 197, 5, 1, 214, 48, 202, 197, 5, 1, 215, 61, 202, 197, + 5, 1, 208, 174, 202, 197, 18, 205, 85, 202, 197, 18, 102, 202, 197, 18, + 105, 202, 197, 18, 142, 202, 197, 18, 139, 202, 197, 18, 168, 202, 197, + 18, 184, 202, 197, 18, 195, 202, 197, 18, 193, 202, 197, 18, 200, 202, + 197, 43, 212, 98, 202, 197, 43, 210, 123, 202, 197, 43, 212, 3, 202, 197, + 43, 241, 130, 202, 197, 43, 241, 243, 202, 197, 43, 214, 252, 202, 197, + 43, 216, 17, 202, 197, 43, 243, 79, 202, 197, 43, 224, 190, 202, 197, + 222, 173, 221, 189, 247, 238, 239, 81, 1, 179, 221, 189, 247, 238, 239, + 81, 1, 172, 221, 189, 247, 238, 239, 81, 1, 230, 141, 221, 189, 247, 238, + 239, 81, 1, 185, 221, 189, 247, 238, 239, 81, 1, 246, 145, 221, 189, 247, + 238, 239, 81, 1, 205, 116, 221, 189, 247, 238, 239, 81, 1, 209, 70, 221, + 189, 247, 238, 239, 81, 1, 225, 77, 221, 189, 247, 238, 239, 81, 1, 155, + 221, 189, 247, 238, 239, 81, 1, 240, 244, 221, 189, 247, 238, 239, 81, 1, + 231, 167, 221, 189, 247, 238, 239, 81, 1, 217, 199, 221, 189, 247, 238, + 239, 81, 1, 250, 183, 221, 189, 247, 238, 239, 81, 1, 249, 1, 221, 189, + 247, 238, 239, 81, 1, 212, 219, 221, 189, 247, 238, 239, 81, 1, 212, 56, + 221, 189, 247, 238, 239, 81, 1, 199, 221, 189, 247, 238, 239, 81, 1, 221, + 93, 221, 189, 247, 238, 239, 81, 1, 219, 113, 221, 189, 247, 238, 239, + 81, 1, 242, 73, 221, 189, 247, 238, 239, 81, 1, 248, 110, 221, 189, 247, + 238, 239, 81, 1, 62, 221, 189, 247, 238, 239, 81, 1, 75, 221, 189, 247, + 238, 239, 81, 1, 74, 221, 189, 247, 238, 239, 81, 1, 76, 221, 189, 247, + 238, 239, 81, 1, 71, 221, 189, 247, 238, 239, 81, 1, 210, 18, 221, 189, + 247, 238, 239, 81, 1, 237, 190, 221, 189, 247, 238, 239, 81, 1, 42, 222, + 67, 221, 189, 247, 238, 239, 81, 1, 42, 232, 76, 221, 189, 247, 238, 239, + 81, 1, 42, 213, 10, 221, 189, 247, 238, 239, 81, 1, 42, 229, 28, 221, + 189, 247, 238, 239, 81, 1, 42, 226, 33, 221, 189, 247, 238, 239, 81, 1, + 42, 149, 221, 189, 247, 238, 239, 81, 1, 42, 207, 129, 221, 189, 247, + 238, 239, 81, 1, 42, 225, 79, 221, 189, 247, 238, 239, 81, 1, 42, 206, + 123, 221, 189, 247, 238, 239, 81, 218, 142, 135, 229, 125, 221, 189, 247, + 238, 239, 81, 218, 142, 211, 118, 221, 189, 247, 238, 239, 81, 217, 147, + 240, 25, 213, 251, 221, 189, 247, 238, 239, 81, 218, 142, 135, 152, 241, + 230, 221, 189, 247, 238, 239, 81, 218, 142, 135, 241, 230, 221, 189, 247, + 238, 239, 81, 217, 147, 240, 25, 213, 252, 241, 230, 221, 189, 247, 238, + 239, 81, 217, 147, 135, 229, 125, 221, 189, 247, 238, 239, 81, 217, 147, + 211, 118, 221, 189, 247, 238, 239, 81, 217, 147, 135, 152, 241, 230, 221, + 189, 247, 238, 239, 81, 217, 147, 135, 241, 230, 221, 189, 247, 238, 239, + 81, 226, 248, 211, 118, 221, 189, 247, 238, 239, 81, 240, 25, 213, 252, + 209, 52, 221, 189, 247, 238, 239, 81, 226, 248, 135, 152, 241, 230, 221, + 189, 247, 238, 239, 81, 226, 248, 135, 241, 230, 221, 189, 247, 238, 239, + 81, 229, 95, 135, 229, 125, 221, 189, 247, 238, 239, 81, 229, 95, 211, + 118, 221, 189, 247, 238, 239, 81, 240, 25, 213, 251, 221, 189, 247, 238, + 239, 81, 229, 95, 135, 152, 241, 230, 221, 189, 247, 238, 239, 81, 229, + 95, 135, 241, 230, 221, 189, 247, 238, 239, 81, 240, 25, 213, 252, 241, + 230, 14, 3, 62, 14, 3, 32, 29, 62, 14, 3, 32, 29, 250, 167, 14, 3, 32, + 29, 240, 213, 212, 89, 14, 3, 32, 29, 155, 14, 3, 32, 29, 233, 104, 14, + 3, 32, 29, 230, 121, 239, 192, 14, 3, 32, 29, 226, 69, 14, 3, 32, 29, + 217, 185, 14, 3, 254, 166, 14, 3, 253, 115, 14, 3, 253, 116, 29, 251, + 223, 14, 3, 253, 116, 29, 243, 226, 239, 192, 14, 3, 253, 116, 29, 240, + 226, 14, 3, 253, 116, 29, 240, 213, 212, 89, 14, 3, 253, 116, 29, 155, + 14, 3, 253, 116, 29, 233, 105, 239, 192, 14, 3, 253, 116, 29, 233, 78, + 14, 3, 253, 116, 29, 230, 122, 14, 3, 253, 116, 29, 215, 199, 14, 3, 253, + 116, 29, 106, 101, 106, 101, 71, 14, 3, 253, 116, 239, 192, 14, 3, 253, + 32, 14, 3, 253, 33, 29, 250, 150, 14, 3, 253, 33, 29, 240, 213, 212, 89, + 14, 3, 253, 33, 29, 227, 120, 101, 243, 41, 14, 3, 253, 33, 29, 216, 0, + 14, 3, 253, 33, 29, 212, 186, 14, 3, 253, 5, 14, 3, 252, 189, 14, 3, 252, + 190, 29, 242, 230, 14, 3, 252, 190, 29, 215, 161, 101, 240, 35, 14, 3, + 252, 181, 14, 3, 252, 182, 29, 252, 181, 14, 3, 252, 182, 29, 245, 123, + 14, 3, 252, 182, 29, 240, 35, 14, 3, 252, 182, 29, 155, 14, 3, 252, 182, + 29, 232, 50, 14, 3, 252, 182, 29, 231, 123, 14, 3, 252, 182, 29, 215, + 214, 14, 3, 252, 182, 29, 209, 170, 14, 3, 252, 178, 14, 3, 252, 170, 14, + 3, 252, 132, 14, 3, 252, 133, 29, 215, 214, 14, 3, 252, 122, 14, 3, 252, + 123, 131, 252, 122, 14, 3, 252, 123, 129, 211, 175, 14, 3, 252, 123, 101, + 225, 223, 222, 129, 252, 123, 101, 225, 222, 14, 3, 252, 123, 101, 225, + 223, 214, 106, 14, 3, 252, 93, 14, 3, 252, 63, 14, 3, 252, 31, 14, 3, + 252, 32, 29, 230, 210, 14, 3, 252, 3, 14, 3, 251, 230, 14, 3, 251, 225, + 14, 3, 251, 226, 205, 36, 212, 89, 14, 3, 251, 226, 232, 54, 212, 89, 14, + 3, 251, 226, 131, 251, 226, 210, 165, 131, 210, 165, 210, 165, 131, 210, + 165, 221, 236, 14, 3, 251, 226, 131, 251, 226, 131, 251, 225, 14, 3, 251, + 226, 131, 251, 226, 131, 251, 226, 247, 54, 251, 226, 131, 251, 226, 131, + 251, 225, 14, 3, 251, 223, 14, 3, 251, 219, 14, 3, 250, 183, 14, 3, 250, + 167, 14, 3, 250, 162, 14, 3, 250, 157, 14, 3, 250, 151, 14, 3, 250, 152, + 131, 250, 151, 14, 3, 250, 150, 14, 3, 134, 14, 3, 250, 128, 14, 3, 249, + 244, 14, 3, 249, 245, 29, 62, 14, 3, 249, 245, 29, 240, 204, 14, 3, 249, + 245, 29, 233, 105, 239, 192, 14, 3, 249, 101, 14, 3, 249, 102, 131, 249, + 102, 253, 115, 14, 3, 249, 102, 131, 249, 102, 209, 234, 14, 3, 249, 102, + 247, 54, 249, 101, 14, 3, 249, 79, 14, 3, 249, 80, 131, 249, 79, 14, 3, + 249, 68, 14, 3, 249, 67, 14, 3, 246, 145, 14, 3, 246, 136, 14, 3, 246, + 137, 231, 94, 29, 32, 101, 227, 178, 14, 3, 246, 137, 231, 94, 29, 252, + 132, 14, 3, 246, 137, 231, 94, 29, 250, 150, 14, 3, 246, 137, 231, 94, + 29, 249, 244, 14, 3, 246, 137, 231, 94, 29, 240, 244, 14, 3, 246, 137, + 231, 94, 29, 240, 245, 101, 227, 178, 14, 3, 246, 137, 231, 94, 29, 240, + 61, 14, 3, 246, 137, 231, 94, 29, 240, 43, 14, 3, 246, 137, 231, 94, 29, + 239, 202, 14, 3, 246, 137, 231, 94, 29, 155, 14, 3, 246, 137, 231, 94, + 29, 232, 243, 14, 3, 246, 137, 231, 94, 29, 232, 244, 101, 229, 81, 14, + 3, 246, 137, 231, 94, 29, 232, 35, 14, 3, 246, 137, 231, 94, 29, 230, + 141, 14, 3, 246, 137, 231, 94, 29, 229, 81, 14, 3, 246, 137, 231, 94, 29, + 229, 82, 101, 227, 177, 14, 3, 246, 137, 231, 94, 29, 229, 65, 14, 3, + 246, 137, 231, 94, 29, 225, 110, 14, 3, 246, 137, 231, 94, 29, 221, 237, + 101, 221, 236, 14, 3, 246, 137, 231, 94, 29, 215, 80, 14, 3, 246, 137, + 231, 94, 29, 212, 186, 14, 3, 246, 137, 231, 94, 29, 210, 20, 101, 240, + 43, 14, 3, 246, 137, 231, 94, 29, 209, 170, 14, 3, 246, 109, 14, 3, 246, + 88, 14, 3, 246, 87, 14, 3, 246, 86, 14, 3, 245, 168, 14, 3, 245, 150, 14, + 3, 245, 124, 14, 3, 245, 125, 29, 215, 214, 14, 3, 245, 123, 14, 3, 245, + 113, 14, 3, 245, 114, 231, 255, 106, 239, 193, 245, 94, 14, 3, 245, 94, + 14, 3, 243, 237, 14, 3, 243, 238, 131, 243, 237, 14, 3, 243, 238, 239, + 192, 14, 3, 243, 238, 215, 196, 14, 3, 243, 235, 14, 3, 243, 236, 29, + 242, 212, 14, 3, 243, 234, 14, 3, 243, 233, 14, 3, 243, 232, 14, 3, 243, + 231, 14, 3, 243, 227, 14, 3, 243, 225, 14, 3, 243, 226, 239, 192, 14, 3, + 243, 226, 239, 193, 239, 192, 14, 3, 243, 224, 14, 3, 243, 217, 14, 3, + 75, 14, 3, 174, 29, 221, 236, 14, 3, 174, 131, 174, 223, 174, 131, 223, + 173, 14, 3, 243, 131, 14, 3, 243, 132, 29, 32, 101, 239, 144, 101, 246, + 145, 14, 3, 243, 132, 29, 240, 204, 14, 3, 243, 132, 29, 226, 254, 14, 3, + 243, 132, 29, 217, 172, 14, 3, 243, 132, 29, 215, 214, 14, 3, 243, 132, + 29, 71, 14, 3, 243, 106, 14, 3, 243, 95, 14, 3, 243, 68, 14, 3, 243, 41, + 14, 3, 243, 42, 29, 240, 212, 14, 3, 243, 42, 29, 240, 213, 212, 89, 14, + 3, 243, 42, 29, 227, 119, 14, 3, 243, 42, 247, 54, 243, 41, 14, 3, 243, + 42, 222, 129, 243, 41, 14, 3, 243, 42, 214, 106, 14, 3, 242, 232, 14, 3, + 242, 230, 14, 3, 242, 212, 14, 3, 242, 143, 14, 3, 242, 144, 29, 62, 14, + 3, 242, 144, 29, 32, 101, 230, 108, 14, 3, 242, 144, 29, 32, 101, 230, + 109, 29, 230, 108, 14, 3, 242, 144, 29, 252, 122, 14, 3, 242, 144, 29, + 250, 167, 14, 3, 242, 144, 29, 243, 226, 239, 192, 14, 3, 242, 144, 29, + 243, 226, 239, 193, 239, 192, 14, 3, 242, 144, 29, 155, 14, 3, 242, 144, + 29, 239, 144, 239, 192, 14, 3, 242, 144, 29, 233, 105, 239, 192, 14, 3, + 242, 144, 29, 231, 254, 14, 3, 242, 144, 29, 231, 255, 214, 106, 14, 3, + 242, 144, 29, 230, 234, 14, 3, 242, 144, 29, 230, 141, 14, 3, 242, 144, + 29, 230, 109, 29, 230, 108, 14, 3, 242, 144, 29, 229, 235, 14, 3, 242, + 144, 29, 229, 81, 14, 3, 242, 144, 29, 210, 19, 14, 3, 242, 144, 29, 210, + 8, 14, 3, 240, 244, 14, 3, 240, 245, 239, 192, 14, 3, 240, 242, 14, 3, + 240, 243, 29, 32, 101, 246, 146, 101, 155, 14, 3, 240, 243, 29, 32, 101, + 155, 14, 3, 240, 243, 29, 32, 101, 233, 104, 14, 3, 240, 243, 29, 253, + 33, 212, 90, 101, 212, 207, 14, 3, 240, 243, 29, 252, 122, 14, 3, 240, + 243, 29, 251, 225, 14, 3, 240, 243, 29, 251, 224, 101, 240, 226, 14, 3, + 240, 243, 29, 250, 167, 14, 3, 240, 243, 29, 250, 129, 101, 219, 113, 14, + 3, 240, 243, 29, 249, 68, 14, 3, 240, 243, 29, 249, 69, 101, 219, 113, + 14, 3, 240, 243, 29, 246, 145, 14, 3, 240, 243, 29, 245, 168, 14, 3, 240, + 243, 29, 245, 125, 29, 215, 214, 14, 3, 240, 243, 29, 243, 235, 14, 3, + 240, 243, 29, 243, 68, 14, 3, 240, 243, 29, 243, 69, 101, 230, 141, 14, + 3, 240, 243, 29, 243, 41, 14, 3, 240, 243, 29, 243, 42, 29, 240, 213, + 212, 89, 14, 3, 240, 243, 29, 240, 213, 212, 89, 14, 3, 240, 243, 29, + 240, 204, 14, 3, 240, 243, 29, 240, 61, 14, 3, 240, 243, 29, 240, 59, 14, + 3, 240, 243, 29, 240, 60, 101, 62, 14, 3, 240, 243, 29, 240, 44, 101, + 213, 203, 14, 3, 240, 243, 29, 239, 144, 101, 229, 82, 101, 242, 212, 14, + 3, 240, 243, 29, 239, 124, 14, 3, 240, 243, 29, 239, 125, 101, 230, 141, + 14, 3, 240, 243, 29, 239, 12, 101, 229, 235, 14, 3, 240, 243, 29, 238, + 37, 14, 3, 240, 243, 29, 233, 105, 239, 192, 14, 3, 240, 243, 29, 232, + 229, 101, 238, 43, 101, 251, 225, 14, 3, 240, 243, 29, 232, 35, 14, 3, + 240, 243, 29, 231, 254, 14, 3, 240, 243, 29, 231, 117, 14, 3, 240, 243, + 29, 231, 118, 101, 230, 108, 14, 3, 240, 243, 29, 230, 235, 101, 252, + 122, 14, 3, 240, 243, 29, 230, 141, 14, 3, 240, 243, 29, 227, 120, 101, + 243, 41, 14, 3, 240, 243, 29, 226, 254, 14, 3, 240, 243, 29, 223, 173, + 14, 3, 240, 243, 29, 223, 174, 131, 223, 173, 14, 3, 240, 243, 29, 179, + 14, 3, 240, 243, 29, 217, 172, 14, 3, 240, 243, 29, 217, 138, 14, 3, 240, + 243, 29, 215, 214, 14, 3, 240, 243, 29, 215, 215, 101, 210, 149, 14, 3, + 240, 243, 29, 215, 181, 14, 3, 240, 243, 29, 213, 160, 14, 3, 240, 243, + 29, 212, 186, 14, 3, 240, 243, 29, 71, 14, 3, 240, 243, 29, 210, 8, 14, + 3, 240, 243, 29, 210, 9, 101, 243, 237, 14, 3, 240, 243, 131, 240, 242, + 14, 3, 240, 237, 14, 3, 240, 238, 247, 54, 240, 237, 14, 3, 240, 235, 14, + 3, 240, 236, 131, 240, 236, 240, 205, 131, 240, 204, 14, 3, 240, 226, 14, + 3, 240, 227, 240, 236, 131, 240, 236, 240, 205, 131, 240, 204, 14, 3, + 240, 225, 14, 3, 240, 223, 14, 3, 240, 214, 14, 3, 240, 212, 14, 3, 240, + 213, 212, 89, 14, 3, 240, 213, 131, 240, 212, 14, 3, 240, 213, 247, 54, + 240, 212, 14, 3, 240, 204, 14, 3, 240, 203, 14, 3, 240, 198, 14, 3, 240, + 142, 14, 3, 240, 143, 29, 230, 210, 14, 3, 240, 61, 14, 3, 240, 62, 29, + 75, 14, 3, 240, 62, 29, 71, 14, 3, 240, 62, 247, 54, 240, 61, 14, 3, 240, + 59, 14, 3, 240, 60, 131, 240, 59, 14, 3, 240, 60, 247, 54, 240, 59, 14, + 3, 240, 56, 14, 3, 240, 43, 14, 3, 240, 44, 239, 192, 14, 3, 240, 41, 14, + 3, 240, 42, 29, 32, 101, 233, 104, 14, 3, 240, 42, 29, 240, 213, 212, 89, + 14, 3, 240, 42, 29, 233, 104, 14, 3, 240, 42, 29, 229, 82, 101, 233, 104, + 14, 3, 240, 42, 29, 179, 14, 3, 240, 37, 14, 3, 240, 35, 14, 3, 240, 36, + 247, 54, 240, 35, 14, 3, 240, 36, 29, 250, 167, 14, 3, 240, 36, 29, 212, + 186, 14, 3, 240, 36, 212, 89, 14, 3, 239, 213, 14, 3, 239, 214, 247, 54, + 239, 213, 14, 3, 239, 211, 14, 3, 239, 212, 29, 232, 35, 14, 3, 239, 212, + 29, 232, 36, 29, 233, 105, 239, 192, 14, 3, 239, 212, 29, 223, 173, 14, + 3, 239, 212, 29, 217, 173, 101, 210, 164, 14, 3, 239, 212, 239, 192, 14, + 3, 239, 202, 14, 3, 239, 203, 29, 32, 101, 230, 210, 14, 3, 239, 203, 29, + 230, 210, 14, 3, 239, 203, 131, 239, 203, 229, 72, 14, 3, 239, 196, 14, + 3, 239, 194, 14, 3, 239, 195, 29, 215, 214, 14, 3, 239, 186, 14, 3, 239, + 185, 14, 3, 239, 181, 14, 3, 239, 180, 14, 3, 155, 14, 3, 239, 144, 212, + 89, 14, 3, 239, 144, 239, 192, 14, 3, 239, 124, 14, 3, 239, 11, 14, 3, + 239, 12, 29, 251, 225, 14, 3, 239, 12, 29, 251, 223, 14, 3, 239, 12, 29, + 250, 167, 14, 3, 239, 12, 29, 245, 94, 14, 3, 239, 12, 29, 240, 235, 14, + 3, 239, 12, 29, 231, 109, 14, 3, 239, 12, 29, 223, 173, 14, 3, 239, 12, + 29, 215, 214, 14, 3, 239, 12, 29, 71, 14, 3, 238, 42, 14, 3, 238, 37, 14, + 3, 238, 38, 29, 252, 122, 14, 3, 238, 38, 29, 239, 124, 14, 3, 238, 38, + 29, 231, 254, 14, 3, 238, 38, 29, 229, 186, 14, 3, 238, 38, 29, 210, 8, + 14, 3, 238, 34, 14, 3, 74, 14, 3, 237, 225, 62, 14, 3, 237, 185, 14, 3, + 233, 132, 14, 3, 233, 133, 131, 233, 133, 249, 68, 14, 3, 233, 133, 131, + 233, 133, 214, 106, 14, 3, 233, 107, 14, 3, 233, 104, 14, 3, 233, 105, + 245, 150, 14, 3, 233, 105, 218, 208, 14, 3, 233, 105, 131, 233, 105, 215, + 165, 131, 215, 165, 210, 9, 131, 210, 8, 14, 3, 233, 105, 239, 192, 14, + 3, 233, 96, 14, 3, 233, 97, 29, 240, 213, 212, 89, 14, 3, 233, 95, 14, 3, + 233, 85, 14, 3, 233, 86, 29, 212, 186, 14, 3, 233, 86, 247, 54, 233, 85, + 14, 3, 233, 86, 222, 129, 233, 85, 14, 3, 233, 86, 214, 106, 14, 3, 233, + 78, 14, 3, 233, 68, 14, 3, 232, 243, 14, 3, 232, 228, 14, 3, 172, 14, 3, + 232, 66, 29, 62, 14, 3, 232, 66, 29, 253, 5, 14, 3, 232, 66, 29, 253, 6, + 101, 230, 234, 14, 3, 232, 66, 29, 251, 223, 14, 3, 232, 66, 29, 250, + 167, 14, 3, 232, 66, 29, 250, 150, 14, 3, 232, 66, 29, 134, 14, 3, 232, + 66, 29, 249, 244, 14, 3, 232, 66, 29, 242, 230, 14, 3, 232, 66, 29, 242, + 212, 14, 3, 232, 66, 29, 240, 244, 14, 3, 232, 66, 29, 240, 226, 14, 3, + 232, 66, 29, 240, 213, 212, 89, 14, 3, 232, 66, 29, 240, 204, 14, 3, 232, + 66, 29, 240, 205, 101, 216, 1, 101, 62, 14, 3, 232, 66, 29, 240, 61, 14, + 3, 232, 66, 29, 240, 43, 14, 3, 232, 66, 29, 240, 36, 101, 217, 138, 14, + 3, 232, 66, 29, 240, 36, 247, 54, 240, 35, 14, 3, 232, 66, 29, 239, 213, + 14, 3, 232, 66, 29, 239, 185, 14, 3, 232, 66, 29, 233, 104, 14, 3, 232, + 66, 29, 233, 85, 14, 3, 232, 66, 29, 232, 35, 14, 3, 232, 66, 29, 231, + 123, 14, 3, 232, 66, 29, 231, 117, 14, 3, 232, 66, 29, 229, 235, 14, 3, + 232, 66, 29, 229, 81, 14, 3, 232, 66, 29, 227, 119, 14, 3, 232, 66, 29, + 227, 120, 101, 243, 237, 14, 3, 232, 66, 29, 227, 120, 101, 240, 61, 14, + 3, 232, 66, 29, 227, 120, 101, 212, 131, 14, 3, 232, 66, 29, 226, 254, + 14, 3, 232, 66, 29, 226, 255, 101, 223, 168, 14, 3, 232, 66, 29, 225, + 110, 14, 3, 232, 66, 29, 223, 173, 14, 3, 232, 66, 29, 221, 53, 14, 3, + 232, 66, 29, 218, 50, 14, 3, 232, 66, 29, 217, 199, 14, 3, 232, 66, 29, + 217, 138, 14, 3, 232, 66, 29, 216, 2, 14, 3, 232, 66, 29, 215, 214, 14, + 3, 232, 66, 29, 215, 181, 14, 3, 232, 66, 29, 215, 116, 14, 3, 232, 66, + 29, 215, 68, 14, 3, 232, 66, 29, 213, 169, 14, 3, 232, 66, 29, 212, 162, + 14, 3, 232, 66, 29, 71, 14, 3, 232, 66, 29, 210, 19, 14, 3, 232, 66, 29, + 210, 8, 14, 3, 232, 66, 29, 209, 237, 29, 179, 14, 3, 232, 66, 29, 209, + 170, 14, 3, 232, 66, 29, 205, 40, 14, 3, 232, 64, 14, 3, 232, 65, 247, + 54, 232, 64, 14, 3, 232, 55, 14, 3, 232, 52, 14, 3, 232, 50, 14, 3, 232, + 49, 14, 3, 232, 47, 14, 3, 232, 48, 131, 232, 47, 14, 3, 232, 35, 14, 3, + 232, 36, 29, 233, 105, 239, 192, 14, 3, 232, 31, 14, 3, 232, 32, 29, 250, + 167, 14, 3, 232, 32, 247, 54, 232, 31, 14, 3, 232, 29, 14, 3, 232, 28, + 14, 3, 231, 254, 14, 3, 231, 255, 230, 123, 29, 106, 131, 230, 123, 29, + 71, 14, 3, 231, 255, 131, 231, 255, 230, 123, 29, 106, 131, 230, 123, 29, + 71, 14, 3, 231, 194, 14, 3, 231, 123, 14, 3, 231, 124, 29, 250, 167, 14, + 3, 231, 124, 29, 71, 14, 3, 231, 124, 29, 210, 8, 14, 3, 231, 117, 14, 3, + 231, 109, 14, 3, 231, 96, 14, 3, 231, 95, 14, 3, 231, 93, 14, 3, 231, 94, + 131, 231, 93, 14, 3, 230, 236, 14, 3, 230, 237, 131, 239, 12, 29, 251, + 224, 230, 237, 131, 239, 12, 29, 251, 223, 14, 3, 230, 234, 14, 3, 230, + 232, 14, 3, 230, 233, 209, 53, 17, 14, 3, 230, 231, 14, 3, 230, 223, 14, + 3, 230, 224, 239, 192, 14, 3, 230, 222, 14, 3, 230, 210, 14, 3, 230, 211, + 222, 129, 230, 210, 14, 3, 230, 205, 14, 3, 230, 183, 14, 3, 230, 141, + 14, 3, 230, 122, 14, 3, 230, 123, 29, 62, 14, 3, 230, 123, 29, 32, 101, + 246, 146, 101, 155, 14, 3, 230, 123, 29, 32, 101, 240, 204, 14, 3, 230, + 123, 29, 32, 101, 230, 108, 14, 3, 230, 123, 29, 252, 181, 14, 3, 230, + 123, 29, 252, 122, 14, 3, 230, 123, 29, 251, 226, 205, 36, 212, 89, 14, + 3, 230, 123, 29, 250, 167, 14, 3, 230, 123, 29, 249, 244, 14, 3, 230, + 123, 29, 246, 88, 14, 3, 230, 123, 29, 243, 41, 14, 3, 230, 123, 29, 240, + 244, 14, 3, 230, 123, 29, 240, 204, 14, 3, 230, 123, 29, 239, 202, 14, 3, + 230, 123, 29, 239, 203, 101, 239, 202, 14, 3, 230, 123, 29, 155, 14, 3, + 230, 123, 29, 239, 124, 14, 3, 230, 123, 29, 239, 12, 29, 223, 173, 14, + 3, 230, 123, 29, 233, 105, 239, 192, 14, 3, 230, 123, 29, 233, 85, 14, 3, + 230, 123, 29, 233, 86, 101, 155, 14, 3, 230, 123, 29, 233, 86, 101, 229, + 81, 14, 3, 230, 123, 29, 231, 123, 14, 3, 230, 123, 29, 231, 109, 14, 3, + 230, 123, 29, 230, 234, 14, 3, 230, 123, 29, 230, 223, 14, 3, 230, 123, + 29, 230, 224, 101, 239, 12, 101, 62, 14, 3, 230, 123, 29, 230, 122, 14, + 3, 230, 123, 29, 229, 186, 14, 3, 230, 123, 29, 229, 81, 14, 3, 230, 123, + 29, 229, 67, 14, 3, 230, 123, 29, 227, 119, 14, 3, 230, 123, 29, 227, + 120, 101, 243, 41, 14, 3, 230, 123, 29, 226, 69, 14, 3, 230, 123, 29, + 225, 110, 14, 3, 230, 123, 29, 215, 215, 101, 213, 160, 14, 3, 230, 123, + 29, 215, 161, 101, 240, 36, 101, 242, 230, 14, 3, 230, 123, 29, 215, 161, + 101, 240, 36, 212, 89, 14, 3, 230, 123, 29, 215, 114, 14, 3, 230, 123, + 29, 215, 115, 101, 215, 114, 14, 3, 230, 123, 29, 213, 160, 14, 3, 230, + 123, 29, 212, 198, 14, 3, 230, 123, 29, 212, 186, 14, 3, 230, 123, 29, + 212, 132, 101, 32, 101, 213, 204, 101, 199, 14, 3, 230, 123, 29, 71, 14, + 3, 230, 123, 29, 106, 101, 62, 14, 3, 230, 123, 29, 106, 101, 106, 101, + 71, 14, 3, 230, 123, 29, 210, 20, 101, 251, 225, 14, 3, 230, 123, 29, + 210, 8, 14, 3, 230, 123, 29, 209, 170, 14, 3, 230, 123, 214, 106, 14, 3, + 230, 120, 14, 3, 230, 121, 29, 215, 214, 14, 3, 230, 121, 29, 215, 215, + 101, 213, 160, 14, 3, 230, 121, 239, 192, 14, 3, 230, 121, 239, 193, 131, + 230, 121, 239, 193, 215, 214, 14, 3, 230, 116, 14, 3, 230, 108, 14, 3, + 230, 109, 29, 230, 108, 14, 3, 230, 106, 14, 3, 230, 107, 29, 230, 210, + 14, 3, 230, 107, 29, 230, 211, 101, 218, 50, 14, 3, 229, 235, 14, 3, 229, + 218, 14, 3, 229, 208, 14, 3, 229, 186, 14, 3, 229, 81, 14, 3, 229, 82, + 29, 250, 167, 14, 3, 229, 79, 14, 3, 229, 80, 29, 252, 181, 14, 3, 229, + 80, 29, 250, 167, 14, 3, 229, 80, 29, 242, 212, 14, 3, 229, 80, 29, 242, + 213, 212, 89, 14, 3, 229, 80, 29, 240, 213, 212, 89, 14, 3, 229, 80, 29, + 239, 12, 29, 250, 167, 14, 3, 229, 80, 29, 233, 85, 14, 3, 229, 80, 29, + 232, 52, 14, 3, 229, 80, 29, 232, 50, 14, 3, 229, 80, 29, 232, 51, 101, + 251, 225, 14, 3, 229, 80, 29, 231, 123, 14, 3, 229, 80, 29, 230, 142, + 101, 251, 225, 14, 3, 229, 80, 29, 230, 122, 14, 3, 229, 80, 29, 227, + 120, 101, 243, 41, 14, 3, 229, 80, 29, 225, 110, 14, 3, 229, 80, 29, 223, + 217, 14, 3, 229, 80, 29, 215, 81, 101, 251, 225, 14, 3, 229, 80, 29, 215, + 60, 101, 249, 101, 14, 3, 229, 80, 29, 210, 164, 14, 3, 229, 80, 212, 89, + 14, 3, 229, 80, 247, 54, 229, 79, 14, 3, 229, 80, 222, 129, 229, 79, 14, + 3, 229, 80, 214, 106, 14, 3, 229, 80, 215, 196, 14, 3, 229, 78, 14, 3, + 229, 72, 14, 3, 229, 73, 131, 229, 72, 14, 3, 229, 73, 222, 129, 229, 72, + 14, 3, 229, 73, 215, 196, 14, 3, 229, 70, 14, 3, 229, 67, 14, 3, 229, 65, + 14, 3, 229, 66, 131, 229, 65, 14, 3, 229, 66, 131, 229, 66, 240, 205, + 131, 240, 204, 14, 3, 185, 14, 3, 228, 20, 29, 212, 186, 14, 3, 228, 20, + 239, 192, 14, 3, 228, 19, 14, 3, 227, 247, 14, 3, 227, 199, 14, 3, 227, + 178, 14, 3, 227, 177, 14, 3, 227, 119, 14, 3, 227, 71, 14, 3, 226, 254, + 14, 3, 226, 209, 14, 3, 226, 114, 14, 3, 226, 115, 131, 226, 114, 14, 3, + 226, 103, 14, 3, 226, 104, 239, 192, 14, 3, 226, 87, 14, 3, 226, 73, 14, + 3, 226, 69, 14, 3, 226, 70, 29, 62, 14, 3, 226, 70, 29, 230, 210, 14, 3, + 226, 70, 29, 205, 116, 14, 3, 226, 70, 131, 226, 69, 14, 3, 226, 70, 131, + 226, 70, 29, 32, 101, 199, 14, 3, 226, 70, 247, 54, 226, 69, 14, 3, 226, + 67, 14, 3, 226, 68, 29, 62, 14, 3, 226, 68, 29, 32, 101, 245, 168, 14, 3, + 226, 68, 29, 245, 168, 14, 3, 226, 68, 239, 192, 14, 3, 199, 14, 3, 225, + 235, 14, 3, 225, 222, 14, 3, 225, 223, 233, 1, 14, 3, 225, 223, 29, 215, + 117, 212, 89, 14, 3, 225, 223, 222, 129, 225, 222, 14, 3, 225, 221, 14, + 3, 225, 214, 223, 159, 14, 3, 225, 213, 14, 3, 225, 212, 14, 3, 225, 110, + 14, 3, 225, 111, 29, 62, 14, 3, 225, 111, 29, 210, 8, 14, 3, 225, 111, + 215, 196, 14, 3, 224, 230, 14, 3, 224, 231, 29, 75, 14, 3, 224, 229, 14, + 3, 224, 200, 14, 3, 224, 201, 29, 240, 213, 212, 89, 14, 3, 224, 201, 29, + 240, 205, 101, 240, 213, 212, 89, 14, 3, 224, 196, 14, 3, 224, 197, 29, + 252, 122, 14, 3, 224, 197, 29, 251, 225, 14, 3, 224, 197, 29, 251, 226, + 101, 251, 225, 14, 3, 224, 197, 29, 239, 202, 14, 3, 224, 197, 29, 227, + 120, 101, 240, 213, 212, 89, 14, 3, 224, 197, 29, 225, 110, 14, 3, 224, + 197, 29, 223, 173, 14, 3, 224, 197, 29, 215, 214, 14, 3, 224, 197, 29, + 215, 215, 101, 32, 252, 122, 14, 3, 224, 197, 29, 215, 215, 101, 251, + 225, 14, 3, 224, 197, 29, 215, 215, 101, 251, 226, 101, 251, 225, 14, 3, + 224, 197, 29, 210, 20, 101, 251, 225, 14, 3, 224, 197, 29, 209, 170, 14, + 3, 224, 185, 14, 3, 223, 217, 14, 3, 223, 189, 14, 3, 223, 173, 14, 3, + 223, 174, 230, 121, 29, 240, 204, 14, 3, 223, 174, 230, 121, 29, 227, + 178, 14, 3, 223, 174, 230, 121, 29, 217, 172, 14, 3, 223, 174, 230, 121, + 29, 217, 173, 131, 223, 174, 230, 121, 29, 217, 172, 14, 3, 223, 174, + 230, 121, 29, 209, 170, 14, 3, 223, 174, 212, 89, 14, 3, 223, 174, 131, + 223, 173, 14, 3, 223, 174, 247, 54, 223, 173, 14, 3, 223, 174, 247, 54, + 223, 174, 230, 121, 131, 230, 120, 14, 3, 223, 168, 14, 3, 223, 169, 253, + 33, 29, 251, 219, 14, 3, 223, 169, 253, 33, 29, 249, 244, 14, 3, 223, + 169, 253, 33, 29, 243, 233, 14, 3, 223, 169, 253, 33, 29, 239, 202, 14, + 3, 223, 169, 253, 33, 29, 233, 105, 239, 192, 14, 3, 223, 169, 253, 33, + 29, 232, 50, 14, 3, 223, 169, 253, 33, 29, 230, 141, 14, 3, 223, 169, + 253, 33, 29, 225, 110, 14, 3, 223, 169, 253, 33, 29, 215, 57, 14, 3, 223, + 169, 253, 33, 29, 210, 19, 14, 3, 223, 169, 231, 94, 29, 249, 244, 14, 3, + 223, 169, 231, 94, 29, 249, 245, 71, 14, 3, 179, 14, 3, 222, 42, 14, 3, + 222, 6, 14, 3, 221, 236, 14, 3, 221, 107, 14, 3, 221, 53, 14, 3, 221, 54, + 29, 62, 14, 3, 221, 54, 29, 253, 115, 14, 3, 221, 54, 29, 249, 244, 14, + 3, 221, 54, 29, 249, 101, 14, 3, 221, 54, 29, 75, 14, 3, 221, 54, 29, 74, + 14, 3, 221, 54, 29, 237, 185, 14, 3, 221, 54, 29, 71, 14, 3, 221, 54, 29, + 210, 19, 14, 3, 221, 54, 247, 54, 221, 53, 14, 3, 220, 251, 14, 3, 220, + 252, 29, 232, 31, 14, 3, 220, 252, 29, 210, 8, 14, 3, 220, 252, 29, 205, + 116, 14, 3, 220, 252, 222, 129, 220, 251, 14, 3, 219, 113, 14, 3, 219, + 107, 14, 3, 218, 208, 14, 3, 218, 50, 14, 3, 217, 199, 14, 3, 217, 186, + 223, 159, 14, 3, 217, 185, 14, 3, 217, 186, 29, 62, 14, 3, 217, 186, 29, + 243, 237, 14, 3, 217, 186, 29, 243, 235, 14, 3, 217, 186, 29, 155, 14, 3, + 217, 186, 29, 232, 35, 14, 3, 217, 186, 29, 230, 210, 14, 3, 217, 186, + 29, 229, 65, 14, 3, 217, 186, 29, 226, 254, 14, 3, 217, 186, 29, 223, + 173, 14, 3, 217, 186, 29, 217, 172, 14, 3, 217, 186, 29, 215, 181, 14, 3, + 217, 186, 29, 212, 207, 14, 3, 217, 186, 29, 210, 19, 14, 3, 217, 186, + 29, 210, 14, 14, 3, 217, 186, 29, 209, 241, 14, 3, 217, 186, 29, 209, + 194, 14, 3, 217, 186, 29, 209, 170, 14, 3, 217, 186, 131, 217, 185, 14, + 3, 217, 186, 239, 192, 14, 3, 217, 172, 14, 3, 217, 173, 230, 123, 29, + 251, 223, 14, 3, 217, 146, 14, 3, 217, 138, 14, 3, 216, 2, 14, 3, 216, 0, + 14, 3, 216, 1, 29, 62, 14, 3, 216, 1, 29, 250, 167, 14, 3, 216, 1, 29, + 240, 35, 14, 3, 216, 1, 29, 225, 110, 14, 3, 216, 1, 29, 215, 114, 14, 3, + 216, 1, 29, 210, 149, 14, 3, 216, 1, 29, 71, 14, 3, 216, 1, 29, 106, 101, + 62, 14, 3, 215, 255, 14, 3, 215, 253, 14, 3, 215, 230, 14, 3, 215, 214, + 14, 3, 215, 215, 238, 42, 14, 3, 215, 215, 131, 215, 215, 240, 236, 131, + 240, 236, 240, 205, 131, 240, 204, 14, 3, 215, 215, 131, 215, 215, 212, + 208, 131, 212, 208, 240, 205, 131, 240, 204, 14, 3, 215, 207, 14, 3, 215, + 202, 14, 3, 215, 199, 14, 3, 215, 198, 14, 3, 215, 195, 14, 3, 215, 181, + 14, 3, 215, 182, 29, 62, 14, 3, 215, 182, 29, 233, 85, 14, 3, 215, 175, + 14, 3, 215, 176, 29, 62, 14, 3, 215, 176, 29, 250, 151, 14, 3, 215, 176, + 29, 249, 79, 14, 3, 215, 176, 29, 245, 113, 14, 3, 215, 176, 29, 240, + 204, 14, 3, 215, 176, 29, 233, 104, 14, 3, 215, 176, 29, 233, 105, 239, + 192, 14, 3, 215, 176, 29, 230, 205, 14, 3, 215, 176, 29, 229, 67, 14, 3, + 215, 176, 29, 226, 103, 14, 3, 215, 176, 29, 217, 172, 14, 3, 215, 169, + 14, 3, 215, 164, 14, 3, 215, 165, 212, 89, 14, 3, 215, 165, 131, 215, + 165, 249, 69, 131, 249, 68, 14, 3, 215, 160, 14, 3, 215, 116, 14, 3, 215, + 117, 131, 233, 2, 215, 116, 14, 3, 215, 114, 14, 3, 215, 113, 14, 3, 215, + 80, 14, 3, 215, 81, 239, 192, 14, 3, 215, 68, 14, 3, 215, 66, 14, 3, 215, + 67, 131, 215, 67, 215, 114, 14, 3, 215, 59, 14, 3, 215, 57, 14, 3, 213, + 203, 14, 3, 213, 204, 131, 213, 203, 14, 3, 213, 172, 14, 3, 213, 171, + 14, 3, 213, 169, 14, 3, 213, 160, 14, 3, 213, 159, 14, 3, 213, 133, 14, + 3, 213, 132, 14, 3, 212, 219, 14, 3, 212, 220, 251, 209, 14, 3, 212, 220, + 29, 239, 11, 14, 3, 212, 220, 29, 226, 254, 14, 3, 212, 220, 239, 192, + 14, 3, 212, 207, 14, 3, 212, 208, 131, 212, 208, 224, 231, 131, 224, 231, + 245, 95, 131, 245, 94, 14, 3, 212, 208, 214, 106, 14, 3, 212, 198, 14, 3, + 150, 29, 249, 244, 14, 3, 150, 29, 239, 202, 14, 3, 150, 29, 215, 214, + 14, 3, 150, 29, 215, 116, 14, 3, 150, 29, 210, 164, 14, 3, 150, 29, 210, + 8, 14, 3, 212, 186, 14, 3, 212, 162, 14, 3, 212, 131, 14, 3, 212, 132, + 239, 192, 14, 3, 211, 211, 14, 3, 211, 212, 212, 89, 14, 3, 211, 182, 14, + 3, 211, 162, 14, 3, 211, 163, 29, 212, 186, 14, 3, 211, 163, 131, 211, + 162, 14, 3, 211, 163, 131, 211, 163, 240, 236, 131, 240, 236, 240, 205, + 131, 240, 204, 14, 3, 210, 170, 14, 3, 210, 164, 14, 3, 210, 162, 14, 3, + 210, 159, 14, 3, 210, 149, 14, 3, 210, 150, 131, 210, 150, 205, 117, 131, + 205, 116, 14, 3, 71, 14, 3, 106, 239, 202, 14, 3, 106, 106, 71, 14, 3, + 106, 131, 106, 222, 52, 131, 222, 52, 240, 205, 131, 240, 204, 14, 3, + 106, 131, 106, 213, 134, 131, 213, 133, 14, 3, 106, 131, 106, 106, 218, + 224, 131, 106, 218, 223, 14, 3, 210, 19, 14, 3, 210, 14, 14, 3, 210, 8, + 14, 3, 210, 9, 230, 205, 14, 3, 210, 9, 29, 250, 167, 14, 3, 210, 9, 29, + 226, 254, 14, 3, 210, 9, 29, 106, 101, 106, 101, 71, 14, 3, 210, 9, 29, + 106, 101, 106, 101, 106, 239, 192, 14, 3, 210, 9, 239, 192, 14, 3, 210, + 9, 215, 196, 14, 3, 210, 9, 215, 197, 29, 250, 167, 14, 3, 210, 4, 14, 3, + 209, 241, 14, 3, 209, 242, 29, 230, 122, 14, 3, 209, 242, 29, 227, 120, + 101, 246, 145, 14, 3, 209, 242, 29, 216, 0, 14, 3, 209, 242, 29, 71, 14, + 3, 209, 240, 14, 3, 209, 236, 14, 3, 209, 237, 29, 231, 254, 14, 3, 209, + 237, 29, 179, 14, 3, 209, 234, 14, 3, 209, 235, 239, 192, 14, 3, 209, + 194, 14, 3, 209, 195, 247, 54, 209, 194, 14, 3, 209, 195, 215, 196, 14, + 3, 209, 192, 14, 3, 209, 193, 29, 32, 101, 155, 14, 3, 209, 193, 29, 32, + 101, 199, 14, 3, 209, 193, 29, 252, 181, 14, 3, 209, 193, 29, 155, 14, 3, + 209, 193, 29, 223, 173, 14, 3, 209, 193, 29, 210, 19, 14, 3, 209, 193, + 29, 210, 20, 101, 251, 225, 14, 3, 209, 193, 29, 210, 20, 101, 249, 244, + 14, 3, 209, 191, 14, 3, 209, 188, 14, 3, 209, 187, 14, 3, 209, 183, 14, + 3, 209, 184, 29, 62, 14, 3, 209, 184, 29, 251, 219, 14, 3, 209, 184, 29, + 134, 14, 3, 209, 184, 29, 243, 227, 14, 3, 209, 184, 29, 240, 244, 14, 3, + 209, 184, 29, 240, 226, 14, 3, 209, 184, 29, 240, 213, 212, 89, 14, 3, + 209, 184, 29, 240, 204, 14, 3, 209, 184, 29, 239, 213, 14, 3, 209, 184, + 29, 155, 14, 3, 209, 184, 29, 233, 104, 14, 3, 209, 184, 29, 233, 85, 14, + 3, 209, 184, 29, 232, 228, 14, 3, 209, 184, 29, 231, 123, 14, 3, 209, + 184, 29, 229, 65, 14, 3, 209, 184, 29, 226, 209, 14, 3, 209, 184, 29, + 179, 14, 3, 209, 184, 29, 215, 214, 14, 3, 209, 184, 29, 215, 66, 14, 3, + 209, 184, 29, 210, 170, 14, 3, 209, 184, 29, 106, 101, 239, 202, 14, 3, + 209, 184, 29, 210, 8, 14, 3, 209, 184, 29, 209, 181, 14, 3, 209, 181, 14, + 3, 209, 182, 29, 71, 14, 3, 209, 170, 14, 3, 209, 171, 29, 62, 14, 3, + 209, 171, 29, 230, 236, 14, 3, 209, 171, 29, 230, 210, 14, 3, 209, 171, + 29, 212, 186, 14, 3, 209, 166, 14, 3, 209, 169, 14, 3, 209, 167, 14, 3, + 209, 163, 14, 3, 209, 151, 14, 3, 209, 152, 29, 231, 254, 14, 3, 209, + 150, 14, 3, 205, 116, 14, 3, 205, 117, 212, 89, 14, 3, 205, 117, 98, 29, + 230, 210, 14, 3, 205, 113, 14, 3, 205, 106, 14, 3, 205, 92, 14, 3, 205, + 40, 14, 3, 205, 41, 131, 205, 40, 14, 3, 205, 39, 14, 3, 205, 37, 14, 3, + 205, 38, 232, 54, 212, 89, 14, 3, 205, 32, 14, 3, 205, 24, 14, 3, 205, 9, + 14, 3, 205, 7, 14, 3, 205, 8, 29, 62, 14, 3, 205, 6, 14, 3, 205, 5, 14, + 3, 232, 21, 243, 65, 14, 3, 253, 116, 29, 223, 173, 14, 3, 253, 33, 29, + 62, 14, 3, 252, 133, 29, 230, 225, 14, 3, 246, 137, 231, 94, 29, 210, 20, + 101, 227, 178, 14, 3, 246, 135, 14, 3, 245, 95, 101, 215, 116, 14, 3, + 243, 236, 29, 215, 214, 14, 3, 242, 144, 29, 239, 202, 14, 3, 242, 144, + 29, 215, 214, 14, 3, 240, 243, 29, 252, 123, 101, 232, 36, 101, 62, 14, + 3, 240, 243, 29, 251, 223, 14, 3, 240, 169, 14, 3, 240, 51, 14, 3, 238, + 21, 14, 3, 232, 66, 29, 252, 93, 14, 3, 232, 66, 29, 251, 222, 14, 3, + 232, 66, 29, 240, 35, 14, 3, 232, 66, 29, 239, 202, 14, 3, 232, 66, 29, + 239, 12, 29, 251, 223, 14, 3, 232, 66, 29, 229, 65, 14, 3, 232, 66, 29, + 179, 14, 3, 232, 66, 29, 215, 109, 14, 3, 232, 66, 29, 210, 170, 14, 3, + 232, 66, 29, 209, 192, 14, 3, 230, 123, 29, 240, 61, 14, 3, 229, 80, 215, + 197, 29, 250, 167, 14, 3, 229, 80, 29, 242, 213, 101, 230, 108, 14, 3, + 229, 80, 29, 215, 116, 14, 3, 227, 70, 14, 3, 226, 68, 29, 205, 116, 14, + 3, 225, 234, 14, 3, 224, 199, 14, 3, 224, 198, 14, 3, 224, 197, 29, 250, + 151, 14, 3, 224, 197, 29, 240, 61, 14, 3, 223, 190, 218, 97, 224, 191, + 245, 244, 14, 3, 221, 108, 251, 209, 14, 3, 220, 255, 14, 3, 217, 186, + 29, 233, 105, 239, 192, 14, 3, 211, 210, 14, 3, 209, 242, 29, 227, 119, + 14, 133, 3, 118, 251, 225, 14, 133, 3, 129, 251, 225, 14, 133, 3, 241, + 125, 251, 225, 14, 133, 3, 241, 204, 251, 225, 14, 133, 3, 215, 10, 251, + 225, 14, 133, 3, 216, 23, 251, 225, 14, 133, 3, 243, 88, 251, 225, 14, + 133, 3, 224, 195, 251, 225, 14, 133, 3, 129, 245, 94, 14, 133, 3, 241, + 125, 245, 94, 14, 133, 3, 241, 204, 245, 94, 14, 133, 3, 215, 10, 245, + 94, 14, 133, 3, 216, 23, 245, 94, 14, 133, 3, 243, 88, 245, 94, 14, 133, + 3, 224, 195, 245, 94, 14, 133, 3, 241, 125, 71, 14, 133, 3, 241, 204, 71, + 14, 133, 3, 215, 10, 71, 14, 133, 3, 216, 23, 71, 14, 133, 3, 243, 88, + 71, 14, 133, 3, 224, 195, 71, 14, 133, 3, 119, 240, 144, 14, 133, 3, 118, + 240, 144, 14, 133, 3, 129, 240, 144, 14, 133, 3, 241, 125, 240, 144, 14, + 133, 3, 241, 204, 240, 144, 14, 133, 3, 215, 10, 240, 144, 14, 133, 3, + 216, 23, 240, 144, 14, 133, 3, 243, 88, 240, 144, 14, 133, 3, 224, 195, + 240, 144, 14, 133, 3, 119, 240, 141, 14, 133, 3, 118, 240, 141, 14, 133, + 3, 129, 240, 141, 14, 133, 3, 241, 125, 240, 141, 14, 133, 3, 241, 204, + 240, 141, 14, 133, 3, 118, 215, 230, 14, 133, 3, 129, 215, 230, 14, 133, + 3, 129, 215, 231, 209, 53, 17, 14, 133, 3, 241, 125, 215, 230, 14, 133, + 3, 241, 204, 215, 230, 14, 133, 3, 215, 10, 215, 230, 14, 133, 3, 216, + 23, 215, 230, 14, 133, 3, 243, 88, 215, 230, 14, 133, 3, 224, 195, 215, + 230, 14, 133, 3, 119, 215, 225, 14, 133, 3, 118, 215, 225, 14, 133, 3, + 129, 215, 225, 14, 133, 3, 129, 215, 226, 209, 53, 17, 14, 133, 3, 241, + 125, 215, 225, 14, 133, 3, 241, 204, 215, 225, 14, 133, 3, 215, 231, 29, + 240, 227, 101, 245, 94, 14, 133, 3, 215, 231, 29, 240, 227, 101, 226, + 209, 14, 133, 3, 119, 249, 65, 14, 133, 3, 118, 249, 65, 14, 133, 3, 129, + 249, 65, 14, 133, 3, 129, 249, 66, 209, 53, 17, 14, 133, 3, 241, 125, + 249, 65, 14, 133, 3, 241, 204, 249, 65, 14, 133, 3, 129, 209, 53, 241, + 136, 242, 214, 14, 133, 3, 129, 209, 53, 241, 136, 242, 211, 14, 133, 3, + 241, 125, 209, 53, 241, 136, 229, 209, 14, 133, 3, 241, 125, 209, 53, + 241, 136, 229, 207, 14, 133, 3, 241, 125, 209, 53, 241, 136, 229, 210, + 62, 14, 133, 3, 241, 125, 209, 53, 241, 136, 229, 210, 251, 150, 14, 133, + 3, 215, 10, 209, 53, 241, 136, 251, 221, 14, 133, 3, 216, 23, 209, 53, + 241, 136, 233, 77, 14, 133, 3, 216, 23, 209, 53, 241, 136, 233, 79, 62, + 14, 133, 3, 216, 23, 209, 53, 241, 136, 233, 79, 251, 150, 14, 133, 3, + 243, 88, 209, 53, 241, 136, 209, 165, 14, 133, 3, 243, 88, 209, 53, 241, + 136, 209, 164, 14, 133, 3, 224, 195, 209, 53, 241, 136, 233, 93, 14, 133, + 3, 224, 195, 209, 53, 241, 136, 233, 92, 14, 133, 3, 224, 195, 209, 53, + 241, 136, 233, 91, 14, 133, 3, 224, 195, 209, 53, 241, 136, 233, 94, 62, + 14, 133, 3, 118, 251, 226, 212, 89, 14, 133, 3, 129, 251, 226, 212, 89, + 14, 133, 3, 241, 125, 251, 226, 212, 89, 14, 133, 3, 241, 204, 251, 226, + 212, 89, 14, 133, 3, 215, 10, 251, 226, 212, 89, 14, 133, 3, 119, 250, + 138, 14, 133, 3, 118, 250, 138, 14, 133, 3, 129, 250, 138, 14, 133, 3, + 241, 125, 250, 138, 14, 133, 3, 241, 125, 250, 139, 209, 53, 17, 14, 133, + 3, 241, 204, 250, 138, 14, 133, 3, 241, 204, 250, 139, 209, 53, 17, 14, + 133, 3, 224, 207, 14, 133, 3, 224, 208, 14, 133, 3, 119, 242, 210, 14, + 133, 3, 118, 242, 210, 14, 133, 3, 119, 212, 11, 245, 94, 14, 133, 3, + 118, 212, 8, 245, 94, 14, 133, 3, 241, 204, 214, 255, 245, 94, 14, 133, + 3, 119, 212, 11, 209, 53, 241, 136, 62, 14, 133, 3, 118, 212, 8, 209, 53, + 241, 136, 62, 14, 133, 3, 119, 243, 84, 251, 225, 14, 133, 3, 119, 219, + 205, 251, 225, 14, 133, 3, 44, 251, 212, 119, 215, 0, 14, 133, 3, 44, + 251, 212, 119, 219, 204, 14, 133, 3, 119, 219, 205, 239, 186, 14, 133, 3, + 119, 160, 239, 186, 14, 133, 3, 243, 66, 119, 212, 10, 14, 133, 3, 243, + 66, 118, 212, 7, 14, 133, 3, 243, 66, 241, 130, 14, 133, 3, 243, 66, 241, + 243, 14, 133, 3, 241, 125, 106, 209, 53, 17, 14, 133, 3, 241, 204, 106, + 209, 53, 17, 14, 133, 3, 215, 10, 106, 209, 53, 17, 14, 133, 3, 216, 23, + 106, 209, 53, 17, 14, 133, 3, 243, 88, 106, 209, 53, 17, 14, 133, 3, 224, + 195, 106, 209, 53, 17, 14, 220, 72, 3, 44, 251, 212, 206, 232, 245, 79, + 14, 220, 72, 3, 79, 247, 162, 14, 220, 72, 3, 245, 163, 247, 162, 14, + 220, 72, 3, 245, 163, 211, 47, 14, 220, 72, 3, 245, 163, 219, 210, 12, + 13, 254, 250, 12, 13, 254, 249, 12, 13, 254, 248, 12, 13, 254, 247, 12, + 13, 254, 246, 12, 13, 254, 245, 12, 13, 254, 244, 12, 13, 254, 243, 12, + 13, 254, 242, 12, 13, 254, 241, 12, 13, 254, 240, 12, 13, 254, 239, 12, + 13, 254, 238, 12, 13, 254, 237, 12, 13, 254, 236, 12, 13, 254, 235, 12, + 13, 254, 234, 12, 13, 254, 233, 12, 13, 254, 232, 12, 13, 254, 231, 12, + 13, 254, 230, 12, 13, 254, 229, 12, 13, 254, 228, 12, 13, 254, 227, 12, + 13, 254, 226, 12, 13, 254, 225, 12, 13, 254, 224, 12, 13, 254, 223, 12, + 13, 254, 222, 12, 13, 254, 221, 12, 13, 254, 220, 12, 13, 254, 219, 12, + 13, 254, 218, 12, 13, 254, 216, 12, 13, 254, 215, 12, 13, 254, 214, 12, + 13, 254, 213, 12, 13, 254, 212, 12, 13, 254, 211, 12, 13, 254, 210, 12, + 13, 254, 209, 12, 13, 254, 208, 12, 13, 254, 207, 12, 13, 254, 206, 12, + 13, 254, 205, 12, 13, 254, 204, 12, 13, 254, 203, 12, 13, 254, 202, 12, + 13, 254, 201, 12, 13, 254, 200, 12, 13, 254, 199, 12, 13, 254, 198, 12, + 13, 254, 197, 12, 13, 254, 196, 12, 13, 254, 195, 12, 13, 254, 194, 12, + 13, 254, 193, 12, 13, 254, 192, 12, 13, 254, 191, 12, 13, 254, 190, 12, + 13, 254, 189, 12, 13, 254, 188, 12, 13, 254, 187, 12, 13, 254, 186, 12, + 13, 254, 185, 12, 13, 254, 184, 12, 13, 254, 183, 12, 13, 254, 182, 12, + 13, 254, 181, 12, 13, 254, 180, 12, 13, 254, 179, 12, 13, 254, 178, 12, + 13, 254, 177, 12, 13, 254, 176, 12, 13, 254, 175, 12, 13, 254, 174, 12, + 13, 254, 173, 12, 13, 254, 172, 12, 13, 254, 171, 12, 13, 254, 170, 12, + 13, 251, 148, 12, 13, 251, 146, 12, 13, 251, 144, 12, 13, 251, 142, 12, + 13, 251, 140, 12, 13, 251, 139, 12, 13, 251, 137, 12, 13, 251, 135, 12, + 13, 251, 133, 12, 13, 251, 131, 12, 13, 249, 30, 12, 13, 249, 29, 12, 13, + 249, 28, 12, 13, 249, 27, 12, 13, 249, 26, 12, 13, 249, 25, 12, 13, 249, + 24, 12, 13, 249, 23, 12, 13, 249, 22, 12, 13, 249, 21, 12, 13, 249, 20, + 12, 13, 249, 19, 12, 13, 249, 18, 12, 13, 249, 17, 12, 13, 249, 16, 12, + 13, 249, 15, 12, 13, 249, 14, 12, 13, 249, 13, 12, 13, 249, 12, 12, 13, + 249, 11, 12, 13, 249, 10, 12, 13, 249, 9, 12, 13, 249, 8, 12, 13, 249, 7, + 12, 13, 249, 6, 12, 13, 249, 5, 12, 13, 249, 4, 12, 13, 249, 3, 12, 13, + 246, 239, 12, 13, 246, 238, 12, 13, 246, 237, 12, 13, 246, 236, 12, 13, + 246, 235, 12, 13, 246, 234, 12, 13, 246, 233, 12, 13, 246, 232, 12, 13, + 246, 231, 12, 13, 246, 230, 12, 13, 246, 229, 12, 13, 246, 228, 12, 13, + 246, 227, 12, 13, 246, 226, 12, 13, 246, 225, 12, 13, 246, 224, 12, 13, + 246, 223, 12, 13, 246, 222, 12, 13, 246, 221, 12, 13, 246, 220, 12, 13, + 246, 219, 12, 13, 246, 218, 12, 13, 246, 217, 12, 13, 246, 216, 12, 13, + 246, 215, 12, 13, 246, 214, 12, 13, 246, 213, 12, 13, 246, 212, 12, 13, + 246, 211, 12, 13, 246, 210, 12, 13, 246, 209, 12, 13, 246, 208, 12, 13, + 246, 207, 12, 13, 246, 206, 12, 13, 246, 205, 12, 13, 246, 204, 12, 13, + 246, 203, 12, 13, 246, 202, 12, 13, 246, 201, 12, 13, 246, 200, 12, 13, + 246, 199, 12, 13, 246, 198, 12, 13, 246, 197, 12, 13, 246, 196, 12, 13, + 246, 195, 12, 13, 246, 194, 12, 13, 246, 193, 12, 13, 246, 192, 12, 13, + 246, 191, 12, 13, 246, 190, 12, 13, 246, 189, 12, 13, 246, 188, 12, 13, + 246, 187, 12, 13, 246, 186, 12, 13, 246, 185, 12, 13, 246, 184, 12, 13, + 246, 183, 12, 13, 246, 182, 12, 13, 246, 181, 12, 13, 246, 180, 12, 13, + 246, 179, 12, 13, 246, 178, 12, 13, 246, 177, 12, 13, 246, 176, 12, 13, + 246, 175, 12, 13, 246, 174, 12, 13, 246, 173, 12, 13, 246, 172, 12, 13, + 246, 171, 12, 13, 246, 170, 12, 13, 246, 169, 12, 13, 246, 168, 12, 13, + 246, 167, 12, 13, 246, 166, 12, 13, 246, 165, 12, 13, 246, 164, 12, 13, + 246, 163, 12, 13, 246, 162, 12, 13, 246, 161, 12, 13, 246, 160, 12, 13, + 246, 159, 12, 13, 246, 158, 12, 13, 246, 157, 12, 13, 246, 156, 12, 13, + 246, 155, 12, 13, 246, 154, 12, 13, 246, 153, 12, 13, 246, 152, 12, 13, + 246, 151, 12, 13, 246, 150, 12, 13, 246, 149, 12, 13, 246, 148, 12, 13, + 243, 176, 12, 13, 243, 175, 12, 13, 243, 174, 12, 13, 243, 173, 12, 13, + 243, 172, 12, 13, 243, 171, 12, 13, 243, 170, 12, 13, 243, 169, 12, 13, + 243, 168, 12, 13, 243, 167, 12, 13, 243, 166, 12, 13, 243, 165, 12, 13, + 243, 164, 12, 13, 243, 163, 12, 13, 243, 162, 12, 13, 243, 161, 12, 13, + 243, 160, 12, 13, 243, 159, 12, 13, 243, 158, 12, 13, 243, 157, 12, 13, + 243, 156, 12, 13, 243, 155, 12, 13, 243, 154, 12, 13, 243, 153, 12, 13, + 243, 152, 12, 13, 243, 151, 12, 13, 243, 150, 12, 13, 243, 149, 12, 13, + 243, 148, 12, 13, 243, 147, 12, 13, 243, 146, 12, 13, 243, 145, 12, 13, + 243, 144, 12, 13, 243, 143, 12, 13, 243, 142, 12, 13, 243, 141, 12, 13, + 243, 140, 12, 13, 243, 139, 12, 13, 243, 138, 12, 13, 243, 137, 12, 13, + 243, 136, 12, 13, 243, 135, 12, 13, 243, 134, 12, 13, 243, 133, 12, 13, + 242, 138, 12, 13, 242, 137, 12, 13, 242, 136, 12, 13, 242, 135, 12, 13, + 242, 134, 12, 13, 242, 133, 12, 13, 242, 132, 12, 13, 242, 131, 12, 13, + 242, 130, 12, 13, 242, 129, 12, 13, 242, 128, 12, 13, 242, 127, 12, 13, + 242, 126, 12, 13, 242, 125, 12, 13, 242, 124, 12, 13, 242, 123, 12, 13, + 242, 122, 12, 13, 242, 121, 12, 13, 242, 120, 12, 13, 242, 119, 12, 13, + 242, 118, 12, 13, 242, 117, 12, 13, 242, 116, 12, 13, 242, 115, 12, 13, + 242, 114, 12, 13, 242, 113, 12, 13, 242, 112, 12, 13, 242, 111, 12, 13, + 242, 110, 12, 13, 242, 109, 12, 13, 242, 108, 12, 13, 242, 107, 12, 13, + 242, 106, 12, 13, 242, 105, 12, 13, 242, 104, 12, 13, 242, 103, 12, 13, + 242, 102, 12, 13, 242, 101, 12, 13, 242, 100, 12, 13, 242, 99, 12, 13, + 242, 98, 12, 13, 242, 97, 12, 13, 242, 96, 12, 13, 242, 95, 12, 13, 242, + 94, 12, 13, 242, 93, 12, 13, 242, 92, 12, 13, 242, 91, 12, 13, 242, 90, + 12, 13, 242, 89, 12, 13, 242, 88, 12, 13, 242, 87, 12, 13, 242, 86, 12, + 13, 242, 85, 12, 13, 242, 84, 12, 13, 242, 83, 12, 13, 242, 82, 12, 13, + 242, 81, 12, 13, 242, 80, 12, 13, 242, 79, 12, 13, 242, 78, 12, 13, 242, + 77, 12, 13, 242, 76, 12, 13, 242, 75, 12, 13, 242, 74, 12, 13, 241, 54, + 12, 13, 241, 53, 12, 13, 241, 52, 12, 13, 241, 51, 12, 13, 241, 50, 12, + 13, 241, 49, 12, 13, 241, 48, 12, 13, 241, 47, 12, 13, 241, 46, 12, 13, + 241, 45, 12, 13, 241, 44, 12, 13, 241, 43, 12, 13, 241, 42, 12, 13, 241, + 41, 12, 13, 241, 40, 12, 13, 241, 39, 12, 13, 241, 38, 12, 13, 241, 37, + 12, 13, 241, 36, 12, 13, 241, 35, 12, 13, 241, 34, 12, 13, 241, 33, 12, + 13, 241, 32, 12, 13, 241, 31, 12, 13, 241, 30, 12, 13, 241, 29, 12, 13, + 241, 28, 12, 13, 241, 27, 12, 13, 241, 26, 12, 13, 241, 25, 12, 13, 241, + 24, 12, 13, 241, 23, 12, 13, 241, 22, 12, 13, 241, 21, 12, 13, 241, 20, + 12, 13, 241, 19, 12, 13, 241, 18, 12, 13, 241, 17, 12, 13, 241, 16, 12, + 13, 241, 15, 12, 13, 241, 14, 12, 13, 241, 13, 12, 13, 241, 12, 12, 13, + 241, 11, 12, 13, 241, 10, 12, 13, 241, 9, 12, 13, 241, 8, 12, 13, 241, 7, + 12, 13, 241, 6, 12, 13, 241, 5, 12, 13, 241, 4, 12, 13, 241, 3, 12, 13, + 241, 2, 12, 13, 241, 1, 12, 13, 241, 0, 12, 13, 240, 255, 12, 13, 240, + 254, 12, 13, 240, 253, 12, 13, 240, 252, 12, 13, 240, 251, 12, 13, 240, + 250, 12, 13, 240, 249, 12, 13, 240, 248, 12, 13, 240, 247, 12, 13, 239, + 153, 12, 13, 239, 152, 12, 13, 239, 151, 12, 13, 239, 150, 12, 13, 239, + 149, 12, 13, 239, 148, 12, 13, 239, 147, 12, 13, 239, 146, 12, 13, 239, + 145, 12, 13, 237, 209, 12, 13, 237, 208, 12, 13, 237, 207, 12, 13, 237, + 206, 12, 13, 237, 205, 12, 13, 237, 204, 12, 13, 237, 203, 12, 13, 237, + 202, 12, 13, 237, 201, 12, 13, 237, 200, 12, 13, 237, 199, 12, 13, 237, + 198, 12, 13, 237, 197, 12, 13, 237, 196, 12, 13, 237, 195, 12, 13, 237, + 194, 12, 13, 237, 193, 12, 13, 237, 192, 12, 13, 237, 191, 12, 13, 232, + 75, 12, 13, 232, 74, 12, 13, 232, 73, 12, 13, 232, 72, 12, 13, 232, 71, + 12, 13, 232, 70, 12, 13, 232, 69, 12, 13, 232, 68, 12, 13, 230, 156, 12, + 13, 230, 155, 12, 13, 230, 154, 12, 13, 230, 153, 12, 13, 230, 152, 12, + 13, 230, 151, 12, 13, 230, 150, 12, 13, 230, 149, 12, 13, 230, 148, 12, + 13, 230, 147, 12, 13, 229, 26, 12, 13, 229, 25, 12, 13, 229, 24, 12, 13, + 229, 22, 12, 13, 229, 20, 12, 13, 229, 19, 12, 13, 229, 17, 12, 13, 229, + 15, 12, 13, 229, 13, 12, 13, 229, 11, 12, 13, 229, 9, 12, 13, 229, 7, 12, + 13, 229, 5, 12, 13, 229, 4, 12, 13, 229, 2, 12, 13, 229, 0, 12, 13, 228, + 255, 12, 13, 228, 254, 12, 13, 228, 253, 12, 13, 228, 252, 12, 13, 228, + 251, 12, 13, 228, 250, 12, 13, 228, 249, 12, 13, 228, 248, 12, 13, 228, + 246, 12, 13, 228, 244, 12, 13, 228, 242, 12, 13, 228, 241, 12, 13, 228, + 239, 12, 13, 228, 238, 12, 13, 228, 236, 12, 13, 228, 235, 12, 13, 228, + 233, 12, 13, 228, 231, 12, 13, 228, 229, 12, 13, 228, 227, 12, 13, 228, + 225, 12, 13, 228, 224, 12, 13, 228, 222, 12, 13, 228, 220, 12, 13, 228, + 219, 12, 13, 228, 217, 12, 13, 228, 215, 12, 13, 228, 213, 12, 13, 228, + 211, 12, 13, 228, 210, 12, 13, 228, 208, 12, 13, 228, 206, 12, 13, 228, + 204, 12, 13, 228, 203, 12, 13, 228, 201, 12, 13, 228, 199, 12, 13, 228, + 198, 12, 13, 228, 197, 12, 13, 228, 195, 12, 13, 228, 193, 12, 13, 228, + 191, 12, 13, 228, 189, 12, 13, 228, 187, 12, 13, 228, 185, 12, 13, 228, + 183, 12, 13, 228, 182, 12, 13, 228, 180, 12, 13, 228, 178, 12, 13, 228, + 176, 12, 13, 228, 174, 12, 13, 226, 30, 12, 13, 226, 29, 12, 13, 226, 28, + 12, 13, 226, 27, 12, 13, 226, 26, 12, 13, 226, 25, 12, 13, 226, 24, 12, + 13, 226, 23, 12, 13, 226, 22, 12, 13, 226, 21, 12, 13, 226, 20, 12, 13, + 226, 19, 12, 13, 226, 18, 12, 13, 226, 17, 12, 13, 226, 16, 12, 13, 226, + 15, 12, 13, 226, 14, 12, 13, 226, 13, 12, 13, 226, 12, 12, 13, 226, 11, + 12, 13, 226, 10, 12, 13, 226, 9, 12, 13, 226, 8, 12, 13, 226, 7, 12, 13, + 226, 6, 12, 13, 226, 5, 12, 13, 226, 4, 12, 13, 226, 3, 12, 13, 226, 2, + 12, 13, 226, 1, 12, 13, 226, 0, 12, 13, 225, 255, 12, 13, 225, 254, 12, + 13, 225, 253, 12, 13, 225, 252, 12, 13, 225, 251, 12, 13, 225, 250, 12, + 13, 225, 249, 12, 13, 225, 248, 12, 13, 225, 247, 12, 13, 225, 246, 12, + 13, 225, 245, 12, 13, 225, 244, 12, 13, 225, 243, 12, 13, 225, 242, 12, + 13, 225, 241, 12, 13, 225, 240, 12, 13, 225, 239, 12, 13, 225, 238, 12, + 13, 224, 128, 12, 13, 224, 127, 12, 13, 224, 126, 12, 13, 224, 125, 12, + 13, 224, 124, 12, 13, 224, 123, 12, 13, 224, 122, 12, 13, 224, 121, 12, + 13, 224, 120, 12, 13, 224, 119, 12, 13, 224, 118, 12, 13, 224, 117, 12, + 13, 224, 116, 12, 13, 224, 115, 12, 13, 224, 114, 12, 13, 224, 113, 12, + 13, 224, 112, 12, 13, 224, 111, 12, 13, 224, 110, 12, 13, 224, 109, 12, + 13, 224, 108, 12, 13, 224, 107, 12, 13, 223, 216, 12, 13, 223, 215, 12, + 13, 223, 214, 12, 13, 223, 213, 12, 13, 223, 212, 12, 13, 223, 211, 12, + 13, 223, 210, 12, 13, 223, 209, 12, 13, 223, 208, 12, 13, 223, 207, 12, + 13, 223, 206, 12, 13, 223, 205, 12, 13, 223, 204, 12, 13, 223, 203, 12, + 13, 223, 202, 12, 13, 223, 201, 12, 13, 223, 200, 12, 13, 223, 199, 12, + 13, 223, 198, 12, 13, 223, 197, 12, 13, 223, 196, 12, 13, 223, 195, 12, + 13, 223, 194, 12, 13, 223, 193, 12, 13, 223, 192, 12, 13, 223, 191, 12, + 13, 223, 50, 12, 13, 223, 49, 12, 13, 223, 48, 12, 13, 223, 47, 12, 13, + 223, 46, 12, 13, 223, 45, 12, 13, 223, 44, 12, 13, 223, 43, 12, 13, 223, + 42, 12, 13, 223, 41, 12, 13, 223, 40, 12, 13, 223, 39, 12, 13, 223, 38, + 12, 13, 223, 37, 12, 13, 223, 36, 12, 13, 223, 35, 12, 13, 223, 34, 12, + 13, 223, 33, 12, 13, 223, 32, 12, 13, 223, 31, 12, 13, 223, 30, 12, 13, + 223, 29, 12, 13, 223, 28, 12, 13, 223, 27, 12, 13, 223, 26, 12, 13, 223, + 25, 12, 13, 223, 24, 12, 13, 223, 23, 12, 13, 223, 22, 12, 13, 223, 21, + 12, 13, 223, 20, 12, 13, 223, 19, 12, 13, 223, 18, 12, 13, 223, 17, 12, + 13, 223, 16, 12, 13, 223, 15, 12, 13, 223, 14, 12, 13, 223, 13, 12, 13, + 223, 12, 12, 13, 223, 11, 12, 13, 223, 10, 12, 13, 223, 9, 12, 13, 223, + 8, 12, 13, 223, 7, 12, 13, 223, 6, 12, 13, 223, 5, 12, 13, 223, 4, 12, + 13, 223, 3, 12, 13, 223, 2, 12, 13, 223, 1, 12, 13, 223, 0, 12, 13, 222, + 255, 12, 13, 222, 254, 12, 13, 222, 253, 12, 13, 222, 252, 12, 13, 222, + 251, 12, 13, 222, 250, 12, 13, 222, 249, 12, 13, 222, 248, 12, 13, 222, + 247, 12, 13, 222, 246, 12, 13, 222, 245, 12, 13, 222, 244, 12, 13, 222, + 243, 12, 13, 222, 242, 12, 13, 222, 241, 12, 13, 222, 240, 12, 13, 222, + 239, 12, 13, 222, 238, 12, 13, 222, 237, 12, 13, 222, 236, 12, 13, 222, + 235, 12, 13, 222, 234, 12, 13, 222, 233, 12, 13, 222, 232, 12, 13, 222, + 66, 12, 13, 222, 65, 12, 13, 222, 64, 12, 13, 222, 63, 12, 13, 222, 62, + 12, 13, 222, 61, 12, 13, 222, 60, 12, 13, 222, 59, 12, 13, 222, 58, 12, + 13, 222, 57, 12, 13, 222, 56, 12, 13, 222, 55, 12, 13, 222, 54, 12, 13, + 220, 26, 12, 13, 220, 25, 12, 13, 220, 24, 12, 13, 220, 23, 12, 13, 220, + 22, 12, 13, 220, 21, 12, 13, 220, 20, 12, 13, 219, 148, 12, 13, 219, 147, + 12, 13, 219, 146, 12, 13, 219, 145, 12, 13, 219, 144, 12, 13, 219, 143, + 12, 13, 219, 142, 12, 13, 219, 141, 12, 13, 219, 140, 12, 13, 219, 139, + 12, 13, 219, 138, 12, 13, 219, 137, 12, 13, 219, 136, 12, 13, 219, 135, + 12, 13, 219, 134, 12, 13, 219, 133, 12, 13, 219, 132, 12, 13, 219, 131, + 12, 13, 219, 130, 12, 13, 219, 129, 12, 13, 219, 128, 12, 13, 219, 127, + 12, 13, 219, 126, 12, 13, 219, 125, 12, 13, 219, 124, 12, 13, 219, 123, + 12, 13, 219, 122, 12, 13, 219, 121, 12, 13, 219, 120, 12, 13, 219, 119, + 12, 13, 219, 118, 12, 13, 219, 117, 12, 13, 219, 116, 12, 13, 219, 115, + 12, 13, 217, 254, 12, 13, 217, 253, 12, 13, 217, 252, 12, 13, 217, 251, + 12, 13, 217, 250, 12, 13, 217, 249, 12, 13, 217, 248, 12, 13, 217, 247, + 12, 13, 217, 246, 12, 13, 217, 245, 12, 13, 217, 244, 12, 13, 217, 243, + 12, 13, 217, 242, 12, 13, 217, 241, 12, 13, 217, 240, 12, 13, 217, 239, + 12, 13, 217, 238, 12, 13, 217, 237, 12, 13, 217, 236, 12, 13, 217, 235, + 12, 13, 217, 234, 12, 13, 217, 233, 12, 13, 217, 232, 12, 13, 217, 231, + 12, 13, 217, 230, 12, 13, 217, 229, 12, 13, 217, 228, 12, 13, 217, 227, + 12, 13, 217, 226, 12, 13, 217, 225, 12, 13, 217, 224, 12, 13, 217, 223, + 12, 13, 217, 222, 12, 13, 217, 221, 12, 13, 217, 220, 12, 13, 217, 219, + 12, 13, 217, 218, 12, 13, 217, 217, 12, 13, 217, 216, 12, 13, 217, 215, + 12, 13, 217, 214, 12, 13, 217, 213, 12, 13, 217, 212, 12, 13, 217, 211, + 12, 13, 217, 210, 12, 13, 217, 209, 12, 13, 217, 208, 12, 13, 217, 207, + 12, 13, 217, 206, 12, 13, 217, 205, 12, 13, 217, 204, 12, 13, 217, 203, + 12, 13, 217, 202, 12, 13, 217, 201, 12, 13, 213, 8, 12, 13, 213, 7, 12, + 13, 213, 6, 12, 13, 213, 5, 12, 13, 213, 4, 12, 13, 213, 3, 12, 13, 213, + 2, 12, 13, 213, 1, 12, 13, 213, 0, 12, 13, 212, 255, 12, 13, 212, 254, + 12, 13, 212, 253, 12, 13, 212, 252, 12, 13, 212, 251, 12, 13, 212, 250, + 12, 13, 212, 249, 12, 13, 212, 248, 12, 13, 212, 247, 12, 13, 212, 246, + 12, 13, 212, 245, 12, 13, 212, 244, 12, 13, 212, 243, 12, 13, 212, 242, + 12, 13, 212, 241, 12, 13, 212, 240, 12, 13, 212, 239, 12, 13, 212, 238, + 12, 13, 212, 237, 12, 13, 212, 236, 12, 13, 212, 235, 12, 13, 212, 234, + 12, 13, 212, 233, 12, 13, 212, 232, 12, 13, 212, 231, 12, 13, 212, 230, + 12, 13, 212, 229, 12, 13, 212, 228, 12, 13, 212, 227, 12, 13, 212, 226, + 12, 13, 212, 225, 12, 13, 212, 224, 12, 13, 212, 223, 12, 13, 212, 222, + 12, 13, 212, 221, 12, 13, 210, 67, 12, 13, 210, 66, 12, 13, 210, 65, 12, + 13, 210, 64, 12, 13, 210, 63, 12, 13, 210, 62, 12, 13, 210, 61, 12, 13, + 210, 60, 12, 13, 210, 59, 12, 13, 210, 58, 12, 13, 210, 57, 12, 13, 210, + 56, 12, 13, 210, 55, 12, 13, 210, 54, 12, 13, 210, 53, 12, 13, 210, 52, + 12, 13, 210, 51, 12, 13, 210, 50, 12, 13, 210, 49, 12, 13, 210, 48, 12, + 13, 210, 47, 12, 13, 210, 46, 12, 13, 210, 45, 12, 13, 210, 44, 12, 13, + 210, 43, 12, 13, 210, 42, 12, 13, 210, 41, 12, 13, 210, 40, 12, 13, 210, + 39, 12, 13, 210, 38, 12, 13, 210, 37, 12, 13, 210, 36, 12, 13, 210, 35, + 12, 13, 210, 34, 12, 13, 210, 33, 12, 13, 210, 32, 12, 13, 210, 31, 12, + 13, 210, 30, 12, 13, 210, 29, 12, 13, 210, 28, 12, 13, 210, 27, 12, 13, + 210, 26, 12, 13, 210, 25, 12, 13, 210, 24, 12, 13, 210, 23, 12, 13, 210, + 22, 12, 13, 210, 21, 12, 13, 209, 147, 12, 13, 209, 146, 12, 13, 209, + 145, 12, 13, 209, 144, 12, 13, 209, 143, 12, 13, 209, 142, 12, 13, 209, + 141, 12, 13, 209, 140, 12, 13, 209, 139, 12, 13, 209, 138, 12, 13, 209, + 137, 12, 13, 209, 136, 12, 13, 209, 135, 12, 13, 209, 134, 12, 13, 209, + 133, 12, 13, 209, 132, 12, 13, 209, 131, 12, 13, 209, 130, 12, 13, 209, + 129, 12, 13, 209, 128, 12, 13, 209, 127, 12, 13, 209, 126, 12, 13, 209, + 125, 12, 13, 209, 124, 12, 13, 209, 123, 12, 13, 209, 122, 12, 13, 209, + 121, 12, 13, 209, 120, 12, 13, 209, 119, 12, 13, 209, 118, 12, 13, 209, + 117, 12, 13, 209, 116, 12, 13, 209, 115, 12, 13, 209, 114, 12, 13, 209, + 113, 12, 13, 209, 112, 12, 13, 209, 111, 12, 13, 209, 110, 12, 13, 209, + 109, 12, 13, 209, 108, 12, 13, 209, 107, 12, 13, 209, 106, 12, 13, 209, + 105, 12, 13, 209, 104, 12, 13, 209, 103, 12, 13, 209, 102, 12, 13, 209, + 101, 12, 13, 209, 100, 12, 13, 209, 99, 12, 13, 209, 98, 12, 13, 209, 97, + 12, 13, 209, 96, 12, 13, 209, 95, 12, 13, 209, 94, 12, 13, 209, 93, 12, + 13, 209, 92, 12, 13, 209, 91, 12, 13, 209, 90, 12, 13, 209, 89, 12, 13, + 209, 88, 12, 13, 209, 87, 12, 13, 209, 86, 12, 13, 209, 85, 12, 13, 209, + 84, 12, 13, 209, 83, 12, 13, 209, 82, 12, 13, 209, 81, 12, 13, 209, 80, + 12, 13, 209, 79, 12, 13, 209, 78, 12, 13, 209, 77, 12, 13, 209, 76, 12, + 13, 209, 75, 12, 13, 209, 74, 12, 13, 209, 73, 12, 13, 209, 72, 12, 13, + 209, 71, 12, 13, 207, 128, 12, 13, 207, 127, 12, 13, 207, 126, 12, 13, + 207, 125, 12, 13, 207, 124, 12, 13, 207, 123, 12, 13, 207, 122, 12, 13, + 207, 121, 12, 13, 207, 120, 12, 13, 207, 119, 12, 13, 207, 118, 12, 13, + 207, 117, 12, 13, 207, 116, 12, 13, 207, 115, 12, 13, 207, 114, 12, 13, + 207, 113, 12, 13, 207, 112, 12, 13, 207, 111, 12, 13, 207, 110, 12, 13, + 207, 109, 12, 13, 207, 108, 12, 13, 207, 107, 12, 13, 207, 106, 12, 13, + 207, 105, 12, 13, 207, 104, 12, 13, 207, 103, 12, 13, 207, 102, 12, 13, + 207, 101, 12, 13, 207, 100, 12, 13, 207, 99, 12, 13, 207, 98, 12, 13, + 207, 97, 12, 13, 206, 193, 12, 13, 206, 192, 12, 13, 206, 191, 12, 13, + 206, 190, 12, 13, 206, 189, 12, 13, 206, 188, 12, 13, 206, 187, 12, 13, + 206, 186, 12, 13, 206, 185, 12, 13, 206, 184, 12, 13, 206, 183, 12, 13, + 206, 182, 12, 13, 206, 121, 12, 13, 206, 120, 12, 13, 206, 119, 12, 13, + 206, 118, 12, 13, 206, 117, 12, 13, 206, 116, 12, 13, 206, 115, 12, 13, + 206, 114, 12, 13, 206, 113, 12, 13, 205, 158, 12, 13, 205, 157, 12, 13, + 205, 156, 12, 13, 205, 155, 12, 13, 205, 154, 12, 13, 205, 153, 12, 13, + 205, 152, 12, 13, 205, 151, 12, 13, 205, 150, 12, 13, 205, 149, 12, 13, + 205, 148, 12, 13, 205, 147, 12, 13, 205, 146, 12, 13, 205, 145, 12, 13, + 205, 144, 12, 13, 205, 143, 12, 13, 205, 142, 12, 13, 205, 141, 12, 13, + 205, 140, 12, 13, 205, 139, 12, 13, 205, 138, 12, 13, 205, 137, 12, 13, + 205, 136, 12, 13, 205, 135, 12, 13, 205, 134, 12, 13, 205, 133, 12, 13, + 205, 132, 12, 13, 205, 131, 12, 13, 205, 130, 12, 13, 205, 129, 12, 13, + 205, 128, 12, 13, 205, 127, 12, 13, 205, 126, 12, 13, 205, 125, 12, 13, + 205, 124, 12, 13, 205, 123, 12, 13, 205, 122, 12, 13, 205, 121, 12, 13, + 205, 120, 12, 13, 205, 119, 12, 13, 205, 118, 12, 13, 253, 163, 12, 13, + 253, 162, 12, 13, 253, 161, 12, 13, 253, 160, 12, 13, 253, 159, 12, 13, + 253, 158, 12, 13, 253, 157, 12, 13, 253, 156, 12, 13, 253, 155, 12, 13, + 253, 154, 12, 13, 253, 153, 12, 13, 253, 152, 12, 13, 253, 151, 12, 13, + 253, 150, 12, 13, 253, 149, 12, 13, 253, 148, 12, 13, 253, 147, 12, 13, + 253, 146, 12, 13, 253, 145, 12, 13, 253, 144, 12, 13, 253, 143, 12, 13, + 253, 142, 12, 13, 253, 141, 12, 13, 253, 140, 12, 13, 253, 139, 12, 13, + 253, 138, 12, 13, 253, 137, 12, 13, 253, 136, 12, 13, 253, 135, 12, 13, + 253, 134, 12, 13, 253, 133, 12, 13, 253, 132, 12, 13, 253, 131, 12, 13, + 253, 130, 21, 1, 187, 225, 10, 227, 40, 21, 1, 187, 240, 178, 241, 154, + 21, 1, 187, 220, 189, 227, 41, 221, 1, 21, 1, 187, 220, 189, 227, 41, + 221, 2, 21, 1, 187, 225, 233, 227, 40, 21, 1, 187, 215, 112, 21, 1, 187, + 211, 155, 227, 40, 21, 1, 187, 223, 92, 227, 40, 21, 1, 187, 215, 170, + 222, 52, 224, 164, 21, 1, 187, 220, 189, 222, 52, 224, 165, 221, 1, 21, + 1, 187, 220, 189, 222, 52, 224, 165, 221, 2, 21, 1, 187, 227, 255, 21, 1, + 187, 210, 171, 228, 0, 21, 1, 187, 225, 71, 21, 1, 187, 227, 252, 21, 1, + 187, 227, 210, 21, 1, 187, 226, 56, 21, 1, 187, 216, 25, 21, 1, 187, 223, + 224, 21, 1, 187, 231, 186, 21, 1, 187, 224, 132, 21, 1, 187, 213, 119, + 21, 1, 187, 225, 9, 21, 1, 187, 230, 88, 21, 1, 187, 230, 7, 230, 203, + 21, 1, 187, 223, 234, 227, 48, 21, 1, 187, 228, 3, 21, 1, 187, 221, 202, + 21, 1, 187, 240, 80, 21, 1, 187, 222, 9, 21, 1, 187, 226, 169, 225, 44, + 21, 1, 187, 223, 73, 227, 51, 21, 1, 187, 106, 205, 188, 225, 226, 21, 1, + 187, 240, 81, 21, 1, 187, 223, 234, 223, 235, 21, 1, 187, 215, 13, 21, 1, + 187, 227, 33, 21, 1, 187, 227, 54, 21, 1, 187, 226, 146, 21, 1, 187, 232, + 44, 21, 1, 187, 222, 52, 230, 47, 21, 1, 187, 225, 152, 230, 47, 21, 1, + 187, 221, 104, 21, 1, 187, 227, 253, 21, 1, 187, 224, 204, 21, 1, 187, + 220, 65, 21, 1, 187, 210, 168, 21, 1, 187, 229, 77, 21, 1, 187, 214, 175, + 21, 1, 187, 212, 65, 21, 1, 187, 227, 250, 21, 1, 187, 231, 193, 21, 1, + 187, 225, 148, 21, 1, 187, 230, 215, 21, 1, 187, 226, 147, 21, 1, 187, + 215, 108, 21, 1, 187, 229, 126, 21, 1, 187, 241, 216, 21, 1, 187, 218, + 110, 21, 1, 187, 231, 4, 21, 1, 187, 214, 171, 21, 1, 187, 227, 206, 221, + 43, 21, 1, 187, 215, 163, 21, 1, 187, 223, 233, 21, 1, 187, 215, 146, + 223, 244, 205, 196, 21, 1, 187, 223, 114, 226, 166, 21, 1, 187, 222, 47, + 21, 1, 187, 224, 134, 21, 1, 187, 209, 213, 21, 1, 187, 225, 47, 21, 1, + 187, 227, 249, 21, 1, 187, 224, 176, 21, 1, 187, 227, 148, 21, 1, 187, + 223, 128, 21, 1, 187, 212, 69, 21, 1, 187, 214, 168, 21, 1, 187, 222, 48, + 21, 1, 187, 223, 248, 21, 1, 187, 228, 1, 21, 1, 187, 223, 125, 21, 1, + 187, 232, 8, 21, 1, 187, 223, 251, 21, 1, 187, 209, 34, 21, 1, 187, 229, + 81, 21, 1, 187, 225, 101, 21, 1, 187, 225, 201, 21, 1, 187, 227, 147, 21, + 1, 221, 83, 223, 246, 21, 1, 221, 83, 210, 171, 227, 254, 21, 1, 221, 83, + 215, 71, 21, 1, 221, 83, 216, 29, 210, 170, 21, 1, 221, 83, 229, 128, + 223, 230, 21, 1, 221, 83, 227, 154, 228, 2, 21, 1, 221, 83, 231, 115, 21, + 1, 221, 83, 206, 18, 21, 1, 221, 83, 227, 149, 21, 1, 221, 83, 232, 30, + 21, 1, 221, 83, 221, 160, 21, 1, 221, 83, 206, 95, 230, 47, 21, 1, 221, + 83, 230, 107, 223, 244, 223, 139, 21, 1, 221, 83, 223, 227, 215, 189, 21, + 1, 221, 83, 225, 119, 224, 179, 21, 1, 221, 83, 240, 78, 21, 1, 221, 83, + 220, 247, 21, 1, 221, 83, 210, 171, 223, 242, 21, 1, 221, 83, 215, 194, + 224, 174, 21, 1, 221, 83, 215, 190, 21, 1, 221, 83, 227, 41, 212, 68, 21, + 1, 221, 83, 227, 136, 227, 150, 21, 1, 221, 83, 223, 126, 223, 230, 21, + 1, 221, 83, 231, 182, 21, 1, 221, 83, 240, 79, 21, 1, 221, 83, 231, 178, + 21, 1, 221, 83, 230, 135, 21, 1, 221, 83, 221, 205, 21, 1, 221, 83, 208, + 221, 21, 1, 221, 83, 225, 11, 226, 54, 21, 1, 221, 83, 225, 46, 227, 132, + 21, 1, 221, 83, 206, 214, 21, 1, 221, 83, 217, 175, 21, 1, 221, 83, 212, + 211, 21, 1, 221, 83, 227, 53, 21, 1, 221, 83, 225, 30, 21, 1, 221, 83, + 225, 31, 230, 85, 21, 1, 221, 83, 227, 43, 21, 1, 221, 83, 213, 170, 21, + 1, 221, 83, 227, 140, 21, 1, 221, 83, 226, 151, 21, 1, 221, 83, 223, 142, + 21, 1, 221, 83, 220, 69, 21, 1, 221, 83, 227, 52, 225, 48, 21, 1, 221, + 83, 241, 255, 21, 1, 221, 83, 227, 127, 21, 1, 221, 83, 242, 21, 21, 1, + 221, 83, 231, 190, 21, 1, 221, 83, 228, 20, 224, 168, 21, 1, 221, 83, + 228, 20, 224, 144, 21, 1, 221, 83, 230, 6, 21, 1, 221, 83, 225, 54, 21, + 1, 221, 83, 223, 253, 21, 1, 221, 83, 185, 21, 1, 221, 83, 231, 102, 21, + 1, 221, 83, 224, 255, 21, 1, 158, 225, 10, 228, 0, 21, 1, 158, 223, 91, + 21, 1, 158, 205, 196, 21, 1, 158, 207, 83, 21, 1, 158, 225, 47, 21, 1, + 158, 225, 140, 21, 1, 158, 225, 17, 21, 1, 158, 240, 88, 21, 1, 158, 227, + 144, 21, 1, 158, 240, 185, 21, 1, 158, 223, 116, 226, 190, 227, 55, 21, + 1, 158, 223, 222, 227, 135, 21, 1, 158, 227, 141, 21, 1, 158, 220, 253, + 21, 1, 158, 225, 125, 21, 1, 158, 227, 152, 248, 253, 21, 1, 158, 231, + 180, 21, 1, 158, 240, 89, 21, 1, 158, 231, 187, 21, 1, 158, 205, 214, + 226, 85, 21, 1, 158, 223, 85, 21, 1, 158, 227, 129, 21, 1, 158, 223, 252, + 21, 1, 158, 227, 135, 21, 1, 158, 206, 19, 21, 1, 158, 231, 12, 21, 1, + 158, 232, 63, 21, 1, 158, 216, 24, 21, 1, 158, 225, 134, 21, 1, 158, 212, + 209, 21, 1, 158, 224, 148, 21, 1, 158, 211, 155, 205, 199, 21, 1, 158, + 213, 198, 21, 1, 158, 225, 37, 223, 139, 21, 1, 158, 208, 220, 21, 1, + 158, 225, 204, 21, 1, 158, 228, 20, 231, 189, 21, 1, 158, 223, 235, 21, + 1, 158, 225, 32, 21, 1, 158, 230, 89, 21, 1, 158, 227, 137, 21, 1, 158, + 227, 32, 21, 1, 158, 223, 229, 21, 1, 158, 212, 64, 21, 1, 158, 225, 34, + 21, 1, 158, 241, 86, 21, 1, 158, 225, 139, 21, 1, 158, 223, 254, 21, 1, + 158, 223, 250, 21, 1, 158, 249, 77, 21, 1, 158, 208, 222, 21, 1, 158, + 227, 142, 21, 1, 158, 218, 50, 21, 1, 158, 224, 178, 21, 1, 158, 230, + 106, 21, 1, 158, 211, 153, 21, 1, 158, 223, 236, 224, 255, 21, 1, 158, + 224, 170, 21, 1, 158, 231, 193, 21, 1, 158, 225, 39, 21, 1, 158, 227, + 249, 21, 1, 158, 227, 130, 21, 1, 158, 229, 81, 21, 1, 158, 230, 203, 21, + 1, 158, 224, 176, 21, 1, 158, 224, 255, 21, 1, 158, 206, 204, 21, 1, 158, + 225, 35, 21, 1, 158, 223, 239, 21, 1, 158, 223, 231, 21, 1, 158, 230, + 217, 224, 134, 21, 1, 158, 223, 237, 21, 1, 158, 225, 147, 21, 1, 158, + 228, 20, 223, 242, 21, 1, 158, 206, 109, 21, 1, 158, 225, 146, 21, 1, + 158, 215, 111, 21, 1, 158, 216, 27, 21, 1, 158, 227, 138, 21, 1, 158, + 228, 0, 21, 1, 158, 227, 148, 21, 1, 158, 231, 181, 21, 1, 158, 227, 139, + 21, 1, 158, 231, 185, 21, 1, 158, 227, 152, 221, 48, 21, 1, 158, 205, + 179, 21, 1, 158, 224, 166, 21, 1, 158, 226, 243, 21, 1, 158, 226, 112, + 21, 1, 158, 215, 166, 21, 1, 158, 231, 204, 230, 70, 21, 1, 158, 231, + 204, 242, 34, 21, 1, 158, 225, 69, 21, 1, 158, 225, 201, 21, 1, 158, 229, + 190, 21, 1, 158, 221, 9, 21, 1, 158, 221, 150, 21, 1, 158, 212, 80, 21, + 1, 123, 227, 128, 21, 1, 123, 207, 81, 21, 1, 123, 224, 164, 21, 1, 123, + 227, 40, 21, 1, 123, 224, 162, 21, 1, 123, 229, 229, 21, 1, 123, 224, + 167, 21, 1, 123, 223, 249, 21, 1, 123, 225, 53, 21, 1, 123, 223, 139, 21, + 1, 123, 206, 215, 21, 1, 123, 225, 7, 21, 1, 123, 215, 212, 21, 1, 123, + 225, 18, 21, 1, 123, 231, 188, 21, 1, 123, 212, 66, 21, 1, 123, 215, 192, + 21, 1, 123, 224, 175, 21, 1, 123, 213, 170, 21, 1, 123, 231, 193, 21, 1, + 123, 206, 97, 21, 1, 123, 230, 218, 21, 1, 123, 217, 141, 21, 1, 123, + 227, 45, 21, 1, 123, 225, 138, 21, 1, 123, 227, 224, 21, 1, 123, 227, 51, + 21, 1, 123, 216, 26, 21, 1, 123, 206, 42, 21, 1, 123, 224, 169, 21, 1, + 123, 231, 184, 227, 131, 21, 1, 123, 225, 14, 21, 1, 123, 210, 170, 21, + 1, 123, 240, 98, 21, 1, 123, 225, 4, 21, 1, 123, 242, 0, 21, 1, 123, 225, + 142, 21, 1, 123, 227, 24, 21, 1, 123, 230, 0, 21, 1, 123, 225, 124, 21, + 1, 123, 226, 165, 21, 1, 123, 227, 28, 21, 1, 123, 220, 49, 21, 1, 123, + 227, 26, 21, 1, 123, 227, 42, 21, 1, 123, 229, 65, 21, 1, 123, 223, 241, + 21, 1, 123, 227, 151, 21, 1, 123, 230, 193, 21, 1, 123, 223, 128, 21, 1, + 123, 212, 69, 21, 1, 123, 214, 168, 21, 1, 123, 205, 179, 21, 1, 123, + 231, 185, 21, 1, 123, 219, 94, 21, 1, 123, 212, 119, 21, 1, 123, 225, 15, + 21, 1, 123, 227, 47, 21, 1, 123, 223, 240, 21, 1, 123, 231, 183, 21, 1, + 123, 221, 3, 21, 1, 123, 221, 98, 21, 1, 123, 223, 102, 21, 1, 123, 230, + 6, 21, 1, 123, 225, 54, 21, 1, 123, 227, 44, 21, 1, 123, 225, 27, 21, 1, + 123, 205, 193, 21, 1, 123, 221, 236, 21, 1, 123, 205, 192, 21, 1, 123, + 225, 147, 21, 1, 123, 223, 230, 21, 1, 123, 213, 200, 21, 1, 123, 230, + 222, 21, 1, 123, 225, 43, 21, 1, 123, 225, 12, 21, 1, 123, 210, 153, 21, + 1, 123, 227, 55, 21, 1, 123, 230, 212, 21, 1, 123, 223, 238, 21, 1, 123, + 212, 67, 21, 1, 123, 227, 251, 21, 1, 123, 225, 52, 21, 1, 123, 229, 255, + 21, 1, 123, 225, 33, 21, 1, 123, 223, 243, 21, 1, 123, 224, 148, 21, 1, + 123, 240, 82, 21, 1, 123, 230, 236, 21, 1, 123, 219, 3, 222, 179, 21, 1, + 123, 212, 200, 21, 1, 123, 211, 98, 21, 1, 123, 223, 125, 21, 1, 123, + 218, 154, 21, 1, 123, 230, 49, 21, 1, 123, 227, 106, 21, 1, 123, 229, 28, + 21, 1, 123, 213, 119, 21, 1, 123, 226, 114, 21, 1, 123, 215, 178, 21, 1, + 123, 215, 188, 21, 1, 123, 230, 165, 21, 1, 123, 223, 217, 21, 1, 123, + 215, 116, 21, 1, 123, 223, 232, 21, 1, 123, 221, 164, 21, 1, 123, 224, + 230, 21, 1, 123, 215, 145, 21, 1, 123, 220, 64, 21, 1, 123, 226, 54, 21, + 1, 123, 229, 107, 21, 1, 123, 219, 3, 226, 107, 21, 1, 123, 211, 211, 21, + 1, 123, 223, 219, 21, 1, 123, 227, 152, 195, 21, 1, 123, 217, 139, 21, 1, + 123, 242, 72, 21, 1, 88, 225, 146, 21, 1, 88, 211, 104, 21, 1, 88, 227, + 141, 21, 1, 88, 230, 89, 21, 1, 88, 208, 162, 21, 1, 88, 229, 113, 21, 1, + 88, 222, 51, 21, 1, 88, 214, 179, 21, 1, 88, 219, 69, 21, 1, 88, 223, + 245, 21, 1, 88, 225, 117, 21, 1, 88, 220, 79, 21, 1, 88, 212, 176, 21, 1, + 88, 225, 20, 21, 1, 88, 231, 8, 21, 1, 88, 206, 207, 21, 1, 88, 217, 74, + 21, 1, 88, 225, 44, 21, 1, 88, 222, 48, 21, 1, 88, 211, 105, 21, 1, 88, + 230, 216, 21, 1, 88, 229, 127, 21, 1, 88, 223, 248, 21, 1, 88, 224, 252, + 21, 1, 88, 228, 1, 21, 1, 88, 225, 13, 21, 1, 88, 224, 251, 21, 1, 88, + 223, 247, 21, 1, 88, 218, 152, 21, 1, 88, 224, 166, 21, 1, 88, 221, 162, + 21, 1, 88, 217, 196, 21, 1, 88, 225, 28, 21, 1, 88, 227, 34, 21, 1, 88, + 240, 76, 21, 1, 88, 225, 16, 21, 1, 88, 224, 177, 21, 1, 88, 227, 205, + 21, 1, 88, 229, 109, 21, 1, 88, 225, 49, 21, 1, 88, 225, 130, 21, 1, 88, + 212, 199, 223, 230, 21, 1, 88, 216, 28, 21, 1, 88, 220, 74, 21, 1, 88, + 225, 150, 214, 186, 21, 1, 88, 225, 36, 223, 139, 21, 1, 88, 206, 7, 21, + 1, 88, 240, 77, 21, 1, 88, 210, 169, 21, 1, 88, 206, 22, 21, 1, 88, 220, + 211, 21, 1, 88, 210, 158, 21, 1, 88, 231, 191, 21, 1, 88, 213, 199, 21, + 1, 88, 212, 68, 21, 1, 88, 208, 223, 21, 1, 88, 207, 33, 21, 1, 88, 230, + 138, 21, 1, 88, 220, 82, 21, 1, 88, 212, 210, 21, 1, 88, 240, 97, 21, 1, + 88, 225, 59, 21, 1, 88, 215, 191, 21, 1, 88, 227, 29, 21, 1, 88, 227, + 145, 21, 1, 88, 223, 89, 21, 1, 88, 224, 130, 21, 1, 88, 240, 181, 21, 1, + 88, 210, 159, 21, 1, 88, 230, 226, 21, 1, 88, 206, 73, 21, 1, 88, 223, + 126, 247, 208, 21, 1, 88, 205, 253, 21, 1, 88, 227, 46, 21, 1, 88, 225, + 135, 21, 1, 88, 221, 44, 21, 1, 88, 205, 198, 21, 1, 88, 230, 1, 21, 1, + 88, 241, 86, 21, 1, 88, 240, 180, 21, 1, 88, 225, 6, 21, 1, 88, 231, 193, + 21, 1, 88, 228, 4, 21, 1, 88, 225, 19, 21, 1, 88, 240, 83, 21, 1, 88, + 242, 73, 21, 1, 88, 223, 220, 21, 1, 88, 221, 99, 21, 1, 88, 206, 20, 21, + 1, 88, 225, 45, 21, 1, 88, 223, 126, 250, 5, 21, 1, 88, 223, 69, 21, 1, + 88, 220, 185, 21, 1, 88, 226, 243, 21, 1, 88, 241, 84, 21, 1, 88, 225, + 226, 21, 1, 88, 226, 112, 21, 1, 88, 240, 82, 21, 1, 88, 241, 89, 74, 21, + 1, 88, 226, 55, 21, 1, 88, 220, 78, 21, 1, 88, 225, 8, 21, 1, 88, 230, + 203, 21, 1, 88, 221, 41, 21, 1, 88, 223, 233, 21, 1, 88, 206, 21, 21, 1, + 88, 225, 29, 21, 1, 88, 222, 52, 221, 137, 21, 1, 88, 241, 89, 248, 236, + 21, 1, 88, 241, 155, 21, 1, 88, 224, 171, 21, 1, 88, 62, 21, 1, 88, 211, + 98, 21, 1, 88, 76, 21, 1, 88, 74, 21, 1, 88, 230, 87, 21, 1, 88, 222, 52, + 220, 219, 21, 1, 88, 212, 215, 21, 1, 88, 212, 163, 21, 1, 88, 225, 150, + 226, 42, 238, 54, 21, 1, 88, 215, 166, 21, 1, 88, 206, 17, 21, 1, 88, + 224, 245, 21, 1, 88, 205, 203, 21, 1, 88, 205, 230, 213, 99, 21, 1, 88, + 205, 230, 247, 77, 21, 1, 88, 205, 187, 21, 1, 88, 205, 195, 21, 1, 88, + 231, 179, 21, 1, 88, 221, 97, 21, 1, 88, 224, 172, 242, 246, 21, 1, 88, + 220, 75, 21, 1, 88, 206, 213, 21, 1, 88, 242, 21, 21, 1, 88, 209, 34, 21, + 1, 88, 229, 81, 21, 1, 88, 226, 254, 21, 1, 88, 218, 226, 21, 1, 88, 219, + 95, 21, 1, 88, 224, 244, 21, 1, 88, 225, 77, 21, 1, 88, 215, 158, 21, 1, + 88, 215, 145, 21, 1, 88, 241, 89, 219, 6, 21, 1, 88, 199, 21, 1, 88, 221, + 53, 21, 1, 88, 229, 107, 21, 1, 88, 231, 53, 21, 1, 88, 227, 83, 21, 1, + 88, 185, 21, 1, 88, 227, 202, 21, 1, 88, 212, 70, 21, 1, 88, 231, 123, + 21, 1, 88, 226, 168, 21, 1, 88, 212, 98, 21, 1, 88, 242, 43, 21, 1, 88, + 240, 70, 21, 1, 221, 82, 172, 21, 1, 221, 82, 71, 21, 1, 221, 82, 230, + 236, 21, 1, 221, 82, 243, 104, 21, 1, 221, 82, 219, 29, 21, 1, 221, 82, + 212, 200, 21, 1, 221, 82, 223, 125, 21, 1, 221, 82, 230, 141, 21, 1, 221, + 82, 218, 154, 21, 1, 221, 82, 218, 201, 21, 1, 221, 82, 227, 106, 21, 1, + 221, 82, 212, 215, 21, 1, 221, 82, 225, 149, 21, 1, 221, 82, 224, 178, + 21, 1, 221, 82, 229, 28, 21, 1, 221, 82, 213, 119, 21, 1, 221, 82, 215, + 178, 21, 1, 221, 82, 215, 80, 21, 1, 221, 82, 216, 24, 21, 1, 221, 82, + 230, 165, 21, 1, 221, 82, 231, 193, 21, 1, 221, 82, 223, 188, 21, 1, 221, + 82, 223, 217, 21, 1, 221, 82, 224, 149, 21, 1, 221, 82, 205, 229, 21, 1, + 221, 82, 215, 116, 21, 1, 221, 82, 190, 21, 1, 221, 82, 223, 251, 21, 1, + 221, 82, 221, 97, 21, 1, 221, 82, 223, 232, 21, 1, 221, 82, 206, 213, 21, + 1, 221, 82, 221, 164, 21, 1, 221, 82, 218, 50, 21, 1, 221, 82, 224, 230, + 21, 1, 221, 82, 218, 226, 21, 1, 221, 82, 231, 203, 21, 1, 221, 82, 225, + 5, 21, 1, 221, 82, 225, 56, 21, 1, 221, 82, 215, 158, 21, 1, 221, 82, + 220, 79, 21, 1, 221, 82, 241, 155, 21, 1, 221, 82, 207, 96, 21, 1, 221, + 82, 229, 235, 21, 1, 221, 82, 229, 107, 21, 1, 221, 82, 231, 53, 21, 1, + 221, 82, 227, 143, 21, 1, 221, 82, 219, 2, 21, 1, 221, 82, 185, 21, 1, + 221, 82, 226, 181, 21, 1, 221, 82, 227, 151, 21, 1, 221, 82, 212, 80, 21, + 1, 221, 82, 231, 15, 21, 1, 221, 82, 217, 159, 21, 1, 221, 82, 207, 147, + 226, 117, 1, 212, 219, 226, 117, 1, 225, 25, 226, 117, 1, 205, 247, 226, + 117, 1, 226, 211, 226, 117, 1, 250, 183, 226, 117, 1, 246, 145, 226, 117, + 1, 62, 226, 117, 1, 221, 78, 226, 117, 1, 231, 162, 226, 117, 1, 239, 98, + 226, 117, 1, 246, 121, 226, 117, 1, 248, 14, 226, 117, 1, 231, 223, 226, + 117, 1, 222, 180, 226, 117, 1, 228, 1, 226, 117, 1, 224, 199, 226, 117, + 1, 179, 226, 117, 1, 222, 152, 226, 117, 1, 76, 226, 117, 1, 218, 124, + 226, 117, 1, 215, 183, 226, 117, 1, 212, 40, 226, 117, 1, 243, 130, 226, + 117, 1, 207, 96, 226, 117, 1, 75, 226, 117, 1, 231, 53, 226, 117, 1, 230, + 95, 226, 117, 1, 230, 141, 226, 117, 1, 239, 131, 226, 117, 1, 218, 208, + 226, 117, 1, 212, 111, 226, 117, 18, 205, 85, 226, 117, 18, 102, 226, + 117, 18, 105, 226, 117, 18, 142, 226, 117, 18, 139, 226, 117, 18, 168, + 226, 117, 18, 184, 226, 117, 18, 195, 226, 117, 18, 193, 226, 117, 18, + 200, 226, 117, 246, 100, 226, 117, 50, 246, 100, 250, 110, 209, 67, 1, + 243, 24, 250, 110, 209, 67, 1, 172, 250, 110, 209, 67, 1, 217, 86, 250, + 110, 209, 67, 1, 242, 73, 250, 110, 209, 67, 1, 227, 146, 250, 110, 209, + 67, 1, 206, 8, 250, 110, 209, 67, 1, 240, 229, 250, 110, 209, 67, 1, 245, + 173, 250, 110, 209, 67, 1, 231, 14, 250, 110, 209, 67, 1, 232, 122, 250, + 110, 209, 67, 1, 238, 15, 250, 110, 209, 67, 1, 207, 96, 250, 110, 209, + 67, 1, 205, 19, 250, 110, 209, 67, 1, 240, 174, 250, 110, 209, 67, 1, + 245, 51, 250, 110, 209, 67, 1, 248, 148, 250, 110, 209, 67, 1, 209, 155, + 250, 110, 209, 67, 1, 124, 250, 110, 209, 67, 1, 250, 183, 250, 110, 209, + 67, 1, 207, 148, 250, 110, 209, 67, 1, 206, 46, 250, 110, 209, 67, 1, + 179, 250, 110, 209, 67, 1, 207, 93, 250, 110, 209, 67, 1, 62, 250, 110, + 209, 67, 1, 76, 250, 110, 209, 67, 1, 222, 152, 250, 110, 209, 67, 1, 71, + 250, 110, 209, 67, 1, 243, 104, 250, 110, 209, 67, 1, 75, 250, 110, 209, + 67, 1, 74, 250, 110, 209, 67, 36, 127, 211, 118, 250, 110, 209, 67, 36, + 114, 211, 118, 250, 110, 209, 67, 36, 226, 249, 211, 118, 250, 110, 209, + 67, 36, 229, 94, 211, 118, 250, 110, 209, 67, 36, 238, 250, 211, 118, + 250, 110, 209, 67, 241, 82, 213, 251, 112, 111, 22, 231, 220, 112, 111, + 22, 231, 216, 112, 111, 22, 231, 120, 112, 111, 22, 231, 88, 112, 111, + 22, 231, 241, 112, 111, 22, 231, 238, 112, 111, 22, 230, 227, 112, 111, + 22, 230, 200, 112, 111, 22, 231, 222, 112, 111, 22, 231, 177, 112, 111, + 22, 232, 40, 112, 111, 22, 232, 37, 112, 111, 22, 231, 32, 112, 111, 22, + 231, 29, 112, 111, 22, 231, 235, 112, 111, 22, 231, 233, 112, 111, 22, + 230, 229, 112, 111, 22, 230, 228, 112, 111, 22, 231, 50, 112, 111, 22, + 231, 18, 112, 111, 22, 231, 122, 112, 111, 22, 231, 121, 112, 111, 22, + 232, 55, 112, 111, 22, 231, 237, 112, 111, 22, 230, 191, 112, 111, 22, + 230, 182, 112, 111, 22, 232, 62, 112, 111, 22, 232, 56, 112, 111, 107, + 209, 45, 112, 111, 107, 223, 223, 112, 111, 107, 230, 75, 112, 111, 107, + 239, 80, 112, 111, 107, 224, 106, 112, 111, 107, 219, 60, 112, 111, 107, + 224, 133, 112, 111, 107, 219, 249, 112, 111, 107, 206, 61, 112, 111, 107, + 238, 234, 112, 111, 107, 227, 166, 112, 111, 107, 248, 86, 112, 111, 107, + 225, 154, 112, 111, 107, 238, 170, 112, 111, 107, 220, 227, 112, 111, + 107, 223, 228, 112, 111, 107, 225, 191, 112, 111, 107, 251, 184, 112, + 111, 107, 206, 177, 112, 111, 107, 248, 181, 112, 111, 141, 247, 239, + 210, 166, 112, 111, 141, 247, 239, 214, 193, 112, 111, 141, 247, 239, + 231, 195, 112, 111, 141, 247, 239, 231, 153, 112, 111, 141, 247, 239, + 213, 197, 112, 111, 141, 247, 239, 238, 137, 112, 111, 141, 247, 239, + 212, 150, 112, 111, 3, 208, 158, 211, 250, 112, 111, 3, 208, 158, 210, + 232, 248, 139, 112, 111, 3, 247, 239, 248, 77, 112, 111, 3, 208, 158, + 212, 18, 112, 111, 3, 208, 158, 242, 18, 112, 111, 3, 206, 135, 223, 218, + 112, 111, 3, 206, 135, 218, 210, 112, 111, 3, 206, 135, 211, 87, 112, + 111, 3, 206, 135, 242, 55, 112, 111, 3, 208, 158, 217, 68, 112, 111, 3, + 227, 105, 213, 201, 112, 111, 3, 208, 158, 224, 11, 112, 111, 3, 237, + 186, 206, 80, 112, 111, 3, 206, 176, 112, 111, 3, 247, 239, 210, 219, + 218, 114, 112, 111, 18, 205, 85, 112, 111, 18, 102, 112, 111, 18, 105, + 112, 111, 18, 142, 112, 111, 18, 139, 112, 111, 18, 168, 112, 111, 18, + 184, 112, 111, 18, 195, 112, 111, 18, 193, 112, 111, 18, 200, 112, 111, + 43, 212, 93, 112, 111, 43, 238, 28, 112, 111, 43, 212, 99, 211, 240, 112, + 111, 43, 226, 212, 112, 111, 43, 238, 30, 226, 212, 112, 111, 43, 212, + 99, 249, 226, 112, 111, 43, 211, 38, 112, 111, 3, 208, 158, 229, 76, 112, + 111, 3, 206, 132, 112, 111, 3, 238, 229, 112, 111, 3, 212, 9, 238, 229, + 112, 111, 3, 204, 250, 212, 51, 112, 111, 3, 238, 154, 112, 111, 3, 224, + 25, 112, 111, 3, 206, 168, 112, 111, 3, 223, 221, 112, 111, 3, 251, 168, + 112, 111, 3, 210, 103, 248, 138, 112, 111, 3, 227, 105, 210, 235, 112, + 111, 3, 212, 151, 112, 111, 3, 229, 104, 112, 111, 3, 226, 71, 112, 111, + 3, 247, 239, 239, 127, 229, 55, 223, 226, 223, 225, 112, 111, 3, 247, + 239, 247, 39, 210, 226, 112, 111, 3, 247, 239, 210, 101, 112, 111, 3, + 247, 239, 210, 102, 248, 2, 112, 111, 3, 247, 239, 220, 77, 246, 69, 112, + 111, 3, 247, 239, 224, 18, 211, 92, 112, 111, 247, 215, 3, 210, 230, 112, + 111, 247, 215, 3, 206, 48, 112, 111, 247, 215, 3, 229, 187, 112, 111, + 247, 215, 3, 230, 74, 112, 111, 247, 215, 3, 206, 131, 112, 111, 247, + 215, 3, 231, 33, 112, 111, 247, 215, 3, 239, 77, 112, 111, 247, 215, 3, + 226, 110, 112, 111, 247, 215, 3, 211, 251, 112, 111, 247, 215, 3, 210, + 240, 112, 111, 247, 215, 3, 221, 90, 112, 111, 247, 215, 3, 231, 165, + 112, 111, 247, 215, 3, 239, 117, 112, 111, 247, 215, 3, 209, 64, 112, + 111, 247, 215, 3, 242, 52, 112, 111, 247, 215, 3, 206, 87, 112, 111, 247, + 215, 3, 210, 213, 112, 111, 247, 215, 3, 230, 186, 112, 111, 247, 215, 3, + 207, 138, 104, 1, 179, 104, 1, 250, 183, 104, 1, 9, 179, 104, 1, 220, + 240, 104, 1, 185, 104, 1, 227, 1, 104, 1, 252, 19, 185, 104, 1, 242, 73, + 104, 1, 209, 70, 104, 1, 208, 215, 104, 1, 212, 219, 104, 1, 246, 145, + 104, 1, 9, 210, 208, 104, 1, 9, 212, 219, 104, 1, 210, 208, 104, 1, 246, + 54, 104, 1, 199, 104, 1, 224, 234, 104, 1, 9, 224, 103, 104, 1, 252, 19, + 199, 104, 1, 224, 103, 104, 1, 224, 89, 104, 1, 230, 141, 104, 1, 229, + 41, 104, 1, 229, 248, 104, 1, 229, 237, 104, 1, 211, 144, 104, 1, 245, + 59, 104, 1, 211, 136, 104, 1, 245, 58, 104, 1, 172, 104, 1, 240, 244, + 104, 1, 9, 172, 104, 1, 220, 19, 104, 1, 219, 252, 104, 1, 225, 77, 104, + 1, 225, 26, 104, 1, 252, 19, 225, 77, 104, 1, 155, 104, 1, 206, 181, 104, + 1, 240, 99, 104, 1, 240, 74, 104, 1, 210, 218, 104, 1, 243, 180, 104, 1, + 223, 144, 104, 1, 223, 127, 104, 1, 210, 233, 104, 1, 243, 190, 104, 1, + 9, 210, 233, 104, 1, 9, 243, 190, 104, 1, 219, 27, 210, 233, 104, 1, 216, + 2, 104, 1, 214, 96, 104, 1, 205, 81, 104, 1, 205, 10, 104, 1, 210, 243, + 104, 1, 243, 196, 104, 1, 9, 210, 243, 104, 1, 217, 199, 104, 1, 205, + 116, 104, 1, 205, 11, 104, 1, 204, 238, 104, 1, 204, 218, 104, 1, 252, + 19, 204, 238, 104, 1, 204, 210, 104, 1, 204, 217, 104, 1, 207, 96, 104, + 1, 252, 213, 104, 1, 239, 20, 104, 1, 225, 196, 104, 3, 251, 215, 104, 3, + 219, 27, 208, 168, 104, 3, 219, 27, 251, 215, 104, 22, 3, 62, 104, 22, 3, + 253, 164, 104, 22, 3, 252, 209, 104, 22, 3, 252, 122, 104, 22, 3, 252, + 114, 104, 22, 3, 76, 104, 22, 3, 222, 152, 104, 22, 3, 206, 250, 104, 22, + 3, 207, 129, 104, 22, 3, 75, 104, 22, 3, 243, 41, 104, 22, 3, 243, 28, + 104, 22, 3, 222, 204, 104, 22, 3, 74, 104, 22, 3, 237, 190, 104, 22, 3, + 237, 189, 104, 22, 3, 237, 188, 104, 22, 3, 232, 253, 104, 22, 3, 233, + 129, 104, 22, 3, 233, 102, 104, 22, 3, 232, 216, 104, 22, 3, 233, 42, + 104, 22, 3, 71, 104, 22, 3, 210, 18, 104, 22, 3, 210, 17, 104, 22, 3, + 210, 16, 104, 22, 3, 209, 162, 104, 22, 3, 210, 0, 104, 22, 3, 209, 221, + 104, 22, 3, 206, 123, 104, 22, 3, 206, 11, 104, 22, 3, 252, 248, 104, 22, + 3, 252, 244, 104, 22, 3, 242, 229, 104, 22, 3, 218, 93, 242, 229, 104, + 22, 3, 242, 235, 104, 22, 3, 218, 93, 242, 235, 104, 22, 3, 252, 205, + 104, 22, 3, 243, 90, 104, 22, 3, 251, 184, 104, 22, 3, 222, 97, 104, 22, + 3, 226, 33, 104, 22, 3, 225, 79, 104, 135, 218, 167, 104, 135, 211, 102, + 218, 167, 104, 135, 52, 104, 135, 55, 104, 1, 211, 116, 104, 1, 211, 115, + 104, 1, 211, 114, 104, 1, 211, 113, 104, 1, 211, 112, 104, 1, 211, 111, + 104, 1, 211, 110, 104, 1, 219, 27, 211, 117, 104, 1, 219, 27, 211, 116, + 104, 1, 219, 27, 211, 114, 104, 1, 219, 27, 211, 113, 104, 1, 219, 27, + 211, 112, 104, 1, 219, 27, 211, 110, 64, 1, 252, 19, 75, 161, 1, 252, 19, + 206, 52, 95, 1, 239, 155, 95, 1, 206, 195, 95, 1, 222, 67, 95, 1, 213, + 10, 95, 1, 242, 139, 95, 1, 232, 76, 95, 1, 149, 95, 1, 251, 150, 95, 1, + 246, 240, 95, 1, 209, 148, 95, 1, 241, 55, 95, 1, 137, 95, 1, 222, 68, + 226, 33, 95, 1, 246, 241, 182, 95, 1, 242, 140, 226, 33, 95, 1, 232, 77, + 229, 28, 95, 1, 219, 150, 182, 95, 1, 212, 58, 95, 1, 214, 223, 245, 193, + 95, 1, 245, 193, 95, 1, 231, 73, 95, 1, 214, 223, 232, 203, 95, 1, 238, + 238, 95, 1, 229, 249, 95, 1, 218, 213, 95, 1, 229, 28, 95, 1, 226, 33, + 95, 1, 232, 203, 95, 1, 182, 95, 1, 229, 29, 226, 33, 95, 1, 226, 34, + 229, 28, 95, 1, 232, 204, 229, 28, 95, 1, 218, 1, 232, 203, 95, 1, 229, + 29, 2, 245, 23, 95, 1, 226, 34, 2, 245, 23, 95, 1, 232, 204, 2, 245, 23, + 95, 1, 232, 204, 2, 177, 233, 26, 23, 52, 95, 1, 218, 1, 2, 245, 23, 95, + 1, 218, 1, 2, 67, 55, 95, 1, 229, 29, 182, 95, 1, 226, 34, 182, 95, 1, + 232, 204, 182, 95, 1, 218, 1, 182, 95, 1, 229, 29, 226, 34, 182, 95, 1, + 226, 34, 229, 29, 182, 95, 1, 232, 204, 229, 29, 182, 95, 1, 218, 1, 232, + 204, 182, 95, 1, 232, 204, 218, 1, 2, 245, 23, 95, 1, 232, 204, 226, 33, + 95, 1, 232, 204, 226, 34, 182, 95, 1, 218, 1, 213, 10, 95, 1, 218, 1, + 213, 11, 137, 95, 1, 218, 1, 222, 67, 95, 1, 218, 1, 222, 68, 137, 95, 1, + 213, 11, 182, 95, 1, 213, 11, 219, 150, 182, 95, 1, 207, 129, 95, 1, 207, + 30, 95, 1, 207, 130, 137, 95, 1, 218, 1, 226, 33, 95, 1, 218, 1, 229, 28, + 95, 1, 232, 77, 219, 150, 182, 95, 1, 241, 56, 219, 150, 182, 95, 1, 218, + 1, 232, 76, 95, 1, 218, 1, 232, 77, 137, 95, 1, 62, 95, 1, 214, 223, 222, + 78, 95, 1, 222, 230, 95, 1, 76, 95, 1, 252, 69, 95, 1, 74, 95, 1, 75, 95, + 1, 233, 129, 95, 1, 215, 144, 74, 95, 1, 209, 252, 95, 1, 243, 104, 95, + 1, 214, 223, 243, 92, 95, 1, 218, 108, 74, 95, 1, 214, 223, 243, 104, 95, + 1, 152, 74, 95, 1, 206, 52, 95, 1, 71, 95, 1, 242, 192, 95, 1, 206, 146, + 95, 1, 106, 226, 33, 95, 1, 152, 71, 95, 1, 218, 108, 71, 95, 1, 209, + 253, 95, 1, 214, 223, 71, 95, 1, 222, 149, 95, 1, 222, 78, 95, 1, 222, + 97, 95, 1, 207, 96, 95, 1, 206, 250, 95, 1, 207, 20, 95, 1, 207, 43, 95, + 1, 206, 225, 95, 1, 225, 198, 71, 95, 1, 225, 198, 76, 95, 1, 225, 198, + 74, 95, 1, 225, 198, 62, 95, 1, 221, 120, 252, 122, 95, 1, 221, 120, 252, + 136, 95, 1, 214, 223, 243, 41, 95, 1, 214, 223, 252, 122, 95, 1, 214, + 223, 222, 165, 95, 1, 115, 229, 28, 95, 252, 227, 47, 194, 217, 81, 95, + 252, 227, 226, 249, 194, 217, 81, 95, 252, 227, 48, 194, 217, 81, 95, + 252, 227, 114, 79, 217, 81, 95, 252, 227, 226, 249, 79, 217, 81, 95, 252, + 227, 127, 79, 217, 81, 95, 252, 227, 251, 190, 217, 81, 95, 252, 227, + 251, 190, 230, 37, 217, 81, 95, 252, 227, 251, 190, 212, 170, 95, 252, + 227, 251, 190, 212, 191, 95, 252, 227, 251, 190, 174, 109, 95, 252, 227, + 251, 190, 237, 225, 109, 95, 252, 227, 251, 190, 212, 171, 109, 95, 252, + 227, 127, 153, 95, 252, 227, 127, 211, 197, 153, 95, 252, 227, 127, 239, + 236, 95, 252, 227, 127, 152, 239, 236, 95, 252, 227, 127, 245, 23, 95, + 252, 227, 127, 247, 233, 95, 252, 227, 127, 229, 205, 95, 252, 227, 127, + 207, 64, 95, 252, 227, 127, 209, 22, 95, 252, 227, 114, 153, 95, 252, + 227, 114, 211, 197, 153, 95, 252, 227, 114, 239, 236, 95, 252, 227, 114, + 152, 239, 236, 95, 252, 227, 114, 245, 23, 95, 252, 227, 114, 247, 233, + 95, 252, 227, 114, 229, 205, 95, 252, 227, 114, 207, 64, 95, 252, 227, + 114, 209, 22, 95, 252, 227, 114, 45, 95, 3, 148, 2, 247, 59, 95, 212, 17, + 1, 217, 59, 95, 50, 83, 95, 220, 72, 248, 42, 241, 82, 213, 251, 215, + 131, 241, 135, 1, 222, 84, 215, 131, 241, 135, 247, 115, 222, 84, 215, + 131, 241, 135, 130, 214, 7, 215, 131, 241, 135, 120, 214, 7, 58, 30, 16, + 220, 86, 58, 30, 16, 246, 80, 58, 30, 16, 221, 124, 58, 30, 16, 222, 75, + 243, 72, 58, 30, 16, 222, 75, 245, 108, 58, 30, 16, 209, 57, 243, 72, 58, + 30, 16, 209, 57, 245, 108, 58, 30, 16, 231, 244, 58, 30, 16, 213, 27, 58, + 30, 16, 221, 223, 58, 30, 16, 205, 219, 58, 30, 16, 205, 220, 245, 108, + 58, 30, 16, 230, 253, 58, 30, 16, 252, 64, 243, 72, 58, 30, 16, 242, 163, + 243, 72, 58, 30, 16, 212, 109, 58, 30, 16, 231, 199, 58, 30, 16, 252, 54, + 58, 30, 16, 252, 55, 245, 108, 58, 30, 16, 213, 34, 58, 30, 16, 212, 0, + 58, 30, 16, 222, 176, 252, 17, 58, 30, 16, 240, 3, 252, 17, 58, 30, 16, + 220, 85, 58, 30, 16, 248, 102, 58, 30, 16, 209, 46, 58, 30, 16, 232, 225, + 252, 17, 58, 30, 16, 231, 201, 252, 17, 58, 30, 16, 231, 200, 252, 17, + 58, 30, 16, 217, 118, 58, 30, 16, 221, 213, 58, 30, 16, 214, 16, 252, 57, + 58, 30, 16, 222, 74, 252, 17, 58, 30, 16, 209, 56, 252, 17, 58, 30, 16, + 252, 58, 252, 17, 58, 30, 16, 252, 52, 58, 30, 16, 231, 63, 58, 30, 16, + 218, 220, 58, 30, 16, 221, 51, 252, 17, 58, 30, 16, 211, 173, 58, 30, 16, + 252, 120, 58, 30, 16, 217, 62, 58, 30, 16, 213, 37, 252, 17, 58, 30, 16, + 213, 37, 227, 64, 214, 14, 58, 30, 16, 222, 69, 252, 17, 58, 30, 16, 212, + 35, 58, 30, 16, 230, 24, 58, 30, 16, 243, 199, 58, 30, 16, 211, 53, 58, + 30, 16, 212, 82, 58, 30, 16, 231, 0, 58, 30, 16, 252, 64, 242, 163, 225, + 97, 58, 30, 16, 241, 90, 252, 17, 58, 30, 16, 233, 81, 58, 30, 16, 211, + 24, 252, 17, 58, 30, 16, 231, 247, 211, 23, 58, 30, 16, 221, 152, 58, 30, + 16, 220, 90, 58, 30, 16, 231, 34, 58, 30, 16, 248, 26, 252, 17, 58, 30, + 16, 219, 70, 58, 30, 16, 221, 226, 252, 17, 58, 30, 16, 221, 224, 252, + 17, 58, 30, 16, 237, 179, 58, 30, 16, 225, 208, 58, 30, 16, 221, 102, 58, + 30, 16, 231, 35, 252, 151, 58, 30, 16, 211, 24, 252, 151, 58, 30, 16, + 213, 245, 58, 30, 16, 239, 223, 58, 30, 16, 232, 225, 225, 97, 58, 30, + 16, 222, 176, 225, 97, 58, 30, 16, 222, 75, 225, 97, 58, 30, 16, 221, + 101, 58, 30, 16, 231, 19, 58, 30, 16, 221, 100, 58, 30, 16, 230, 255, 58, + 30, 16, 221, 153, 225, 97, 58, 30, 16, 231, 200, 225, 98, 252, 95, 58, + 30, 16, 231, 201, 225, 98, 252, 95, 58, 30, 16, 205, 217, 58, 30, 16, + 252, 55, 225, 97, 58, 30, 16, 252, 56, 213, 35, 225, 97, 58, 30, 16, 205, + 218, 58, 30, 16, 230, 254, 58, 30, 16, 243, 67, 58, 30, 16, 248, 103, 58, + 30, 16, 226, 221, 232, 224, 58, 30, 16, 209, 57, 225, 97, 58, 30, 16, + 221, 51, 225, 97, 58, 30, 16, 220, 91, 225, 97, 58, 30, 16, 222, 172, 58, + 30, 16, 252, 82, 58, 30, 16, 229, 38, 58, 30, 16, 221, 224, 225, 97, 58, + 30, 16, 221, 226, 225, 97, 58, 30, 16, 242, 197, 221, 225, 58, 30, 16, + 230, 163, 58, 30, 16, 252, 83, 58, 30, 16, 211, 24, 225, 97, 58, 30, 16, + 243, 70, 58, 30, 16, 213, 37, 225, 97, 58, 30, 16, 213, 28, 58, 30, 16, + 248, 26, 225, 97, 58, 30, 16, 242, 250, 58, 30, 16, 217, 63, 225, 97, 58, + 30, 16, 206, 162, 231, 63, 58, 30, 16, 211, 21, 58, 30, 16, 220, 92, 58, + 30, 16, 211, 25, 58, 30, 16, 211, 22, 58, 30, 16, 220, 89, 58, 30, 16, + 211, 20, 58, 30, 16, 220, 88, 58, 30, 16, 240, 2, 58, 30, 16, 252, 9, 58, + 30, 16, 242, 197, 252, 9, 58, 30, 16, 222, 69, 225, 97, 58, 30, 16, 212, + 34, 242, 209, 58, 30, 16, 212, 34, 242, 162, 58, 30, 16, 212, 36, 252, + 59, 58, 30, 16, 212, 28, 232, 42, 252, 51, 58, 30, 16, 231, 246, 58, 30, + 16, 243, 30, 58, 30, 16, 206, 14, 231, 243, 58, 30, 16, 206, 14, 252, 95, + 58, 30, 16, 214, 15, 58, 30, 16, 231, 64, 252, 95, 58, 30, 16, 245, 109, + 252, 17, 58, 30, 16, 231, 1, 252, 17, 58, 30, 16, 231, 1, 252, 151, 58, + 30, 16, 231, 1, 225, 97, 58, 30, 16, 252, 58, 225, 97, 58, 30, 16, 252, + 60, 58, 30, 16, 245, 108, 58, 30, 16, 211, 35, 58, 30, 16, 212, 73, 58, + 30, 16, 231, 23, 58, 30, 16, 230, 29, 243, 23, 248, 16, 58, 30, 16, 230, + 29, 243, 200, 248, 17, 58, 30, 16, 230, 29, 211, 37, 248, 17, 58, 30, 16, + 230, 29, 212, 84, 248, 17, 58, 30, 16, 230, 29, 233, 76, 248, 16, 58, 30, + 16, 240, 3, 225, 98, 252, 95, 58, 30, 16, 240, 3, 221, 214, 252, 5, 58, + 30, 16, 240, 3, 221, 214, 245, 197, 58, 30, 16, 245, 132, 58, 30, 16, + 245, 133, 221, 214, 252, 6, 231, 243, 58, 30, 16, 245, 133, 221, 214, + 252, 6, 252, 95, 58, 30, 16, 245, 133, 221, 214, 245, 197, 58, 30, 16, + 211, 42, 58, 30, 16, 252, 10, 58, 30, 16, 233, 83, 58, 30, 16, 245, 154, + 58, 30, 16, 252, 215, 220, 194, 252, 11, 58, 30, 16, 252, 215, 252, 8, + 58, 30, 16, 252, 215, 252, 11, 58, 30, 16, 252, 215, 227, 58, 58, 30, 16, + 252, 215, 227, 69, 58, 30, 16, 252, 215, 240, 4, 58, 30, 16, 252, 215, + 240, 1, 58, 30, 16, 252, 215, 220, 194, 240, 4, 58, 30, 16, 227, 183, + 220, 98, 237, 177, 58, 30, 16, 227, 183, 252, 153, 220, 98, 237, 177, 58, + 30, 16, 227, 183, 245, 196, 237, 177, 58, 30, 16, 227, 183, 252, 153, + 245, 196, 237, 177, 58, 30, 16, 227, 183, 211, 30, 237, 177, 58, 30, 16, + 227, 183, 211, 43, 58, 30, 16, 227, 183, 212, 78, 237, 177, 58, 30, 16, + 227, 183, 212, 78, 230, 33, 237, 177, 58, 30, 16, 227, 183, 230, 33, 237, + 177, 58, 30, 16, 227, 183, 220, 237, 237, 177, 58, 30, 16, 232, 232, 212, + 102, 237, 178, 58, 30, 16, 252, 56, 212, 102, 237, 178, 58, 30, 16, 242, + 46, 212, 75, 58, 30, 16, 242, 46, 226, 161, 58, 30, 16, 242, 46, 245, + 137, 58, 30, 16, 227, 183, 209, 50, 237, 177, 58, 30, 16, 227, 183, 220, + 97, 237, 177, 58, 30, 16, 227, 183, 220, 237, 212, 78, 237, 177, 58, 30, + 16, 239, 255, 226, 34, 252, 59, 58, 30, 16, 239, 255, 226, 34, 245, 107, + 58, 30, 16, 243, 39, 232, 42, 241, 90, 208, 156, 58, 30, 16, 233, 82, 58, + 30, 16, 233, 80, 58, 30, 16, 241, 90, 252, 18, 245, 195, 237, 176, 58, + 30, 16, 241, 90, 245, 152, 179, 58, 30, 16, 241, 90, 245, 152, 225, 208, + 58, 30, 16, 241, 90, 225, 203, 237, 177, 58, 30, 16, 241, 90, 245, 152, + 245, 168, 58, 30, 16, 241, 90, 214, 242, 245, 151, 245, 168, 58, 30, 16, + 241, 90, 245, 152, 231, 224, 58, 30, 16, 241, 90, 245, 152, 205, 19, 58, + 30, 16, 241, 90, 245, 152, 224, 231, 231, 243, 58, 30, 16, 241, 90, 245, + 152, 224, 231, 252, 95, 58, 30, 16, 241, 90, 227, 227, 248, 18, 245, 137, + 58, 30, 16, 241, 90, 227, 227, 248, 18, 226, 161, 58, 30, 16, 241, 251, + 214, 242, 248, 18, 209, 49, 58, 30, 16, 241, 90, 214, 242, 248, 18, 213, + 38, 58, 30, 16, 241, 90, 225, 100, 58, 30, 16, 248, 19, 204, 244, 58, 30, + 16, 248, 19, 231, 62, 58, 30, 16, 248, 19, 214, 144, 58, 30, 16, 241, 90, + 237, 225, 206, 13, 212, 79, 58, 30, 16, 241, 90, 243, 40, 252, 84, 58, + 30, 16, 206, 13, 211, 31, 58, 30, 16, 245, 145, 211, 31, 58, 30, 16, 245, + 145, 212, 79, 58, 30, 16, 245, 145, 252, 61, 243, 200, 245, 43, 58, 30, + 16, 245, 145, 226, 159, 212, 83, 245, 43, 58, 30, 16, 245, 145, 245, 129, + 242, 173, 245, 43, 58, 30, 16, 245, 145, 211, 40, 222, 182, 245, 43, 58, + 30, 16, 206, 13, 252, 61, 243, 200, 245, 43, 58, 30, 16, 206, 13, 226, + 159, 212, 83, 245, 43, 58, 30, 16, 206, 13, 245, 129, 242, 173, 245, 43, + 58, 30, 16, 206, 13, 211, 40, 222, 182, 245, 43, 58, 30, 16, 240, 155, + 245, 144, 58, 30, 16, 240, 155, 206, 12, 58, 30, 16, 245, 153, 252, 61, + 226, 222, 58, 30, 16, 245, 153, 252, 61, 227, 98, 58, 30, 16, 245, 153, + 245, 108, 58, 30, 16, 245, 153, 212, 26, 58, 30, 16, 215, 49, 212, 26, + 58, 30, 16, 215, 49, 212, 27, 245, 93, 58, 30, 16, 215, 49, 212, 27, 211, + 32, 58, 30, 16, 215, 49, 212, 27, 212, 71, 58, 30, 16, 215, 49, 251, 238, + 58, 30, 16, 215, 49, 251, 239, 245, 93, 58, 30, 16, 215, 49, 251, 239, + 211, 32, 58, 30, 16, 215, 49, 251, 239, 212, 71, 58, 30, 16, 245, 130, + 240, 136, 58, 30, 16, 245, 136, 222, 97, 58, 30, 16, 214, 5, 58, 30, 16, + 252, 2, 179, 58, 30, 16, 252, 2, 208, 156, 58, 30, 16, 252, 2, 240, 244, + 58, 30, 16, 252, 2, 245, 168, 58, 30, 16, 252, 2, 231, 224, 58, 30, 16, + 252, 2, 205, 19, 58, 30, 16, 252, 2, 224, 230, 58, 30, 16, 231, 200, 225, + 98, 227, 68, 58, 30, 16, 231, 201, 225, 98, 227, 68, 58, 30, 16, 231, + 200, 225, 98, 231, 243, 58, 30, 16, 231, 201, 225, 98, 231, 243, 58, 30, + 16, 231, 64, 231, 243, 58, 30, 16, 240, 3, 225, 98, 231, 243, 30, 16, + 215, 41, 250, 124, 30, 16, 50, 250, 124, 30, 16, 42, 250, 124, 30, 16, + 218, 225, 42, 250, 124, 30, 16, 246, 77, 250, 124, 30, 16, 215, 144, 250, + 124, 30, 16, 47, 218, 252, 53, 30, 16, 48, 218, 252, 53, 30, 16, 218, + 252, 245, 21, 30, 16, 246, 118, 217, 66, 30, 16, 246, 146, 248, 210, 30, + 16, 217, 66, 30, 16, 247, 170, 30, 16, 218, 250, 241, 240, 30, 16, 218, + 250, 241, 239, 30, 16, 218, 250, 241, 238, 30, 16, 242, 4, 30, 16, 242, + 5, 55, 30, 16, 249, 124, 83, 30, 16, 248, 247, 30, 16, 249, 135, 30, 16, + 145, 30, 16, 222, 162, 214, 34, 30, 16, 210, 107, 214, 34, 30, 16, 211, + 236, 214, 34, 30, 16, 241, 124, 214, 34, 30, 16, 241, 203, 214, 34, 30, + 16, 215, 9, 214, 34, 30, 16, 215, 7, 241, 105, 30, 16, 241, 122, 241, + 105, 30, 16, 241, 56, 247, 206, 30, 16, 241, 56, 247, 207, 222, 99, 252, + 142, 30, 16, 241, 56, 247, 207, 222, 99, 250, 109, 30, 16, 249, 35, 247, + 206, 30, 16, 242, 140, 247, 206, 30, 16, 242, 140, 247, 207, 222, 99, + 252, 142, 30, 16, 242, 140, 247, 207, 222, 99, 250, 109, 30, 16, 243, + 242, 247, 205, 30, 16, 243, 242, 247, 204, 30, 16, 226, 95, 227, 118, + 218, 236, 30, 16, 50, 215, 227, 30, 16, 50, 241, 187, 30, 16, 241, 188, + 209, 206, 30, 16, 241, 188, 244, 8, 30, 16, 225, 192, 209, 206, 30, 16, + 225, 192, 244, 8, 30, 16, 215, 228, 209, 206, 30, 16, 215, 228, 244, 8, + 30, 16, 219, 205, 135, 215, 227, 30, 16, 219, 205, 135, 241, 187, 30, 16, + 247, 152, 211, 177, 30, 16, 247, 11, 211, 177, 30, 16, 222, 99, 252, 142, + 30, 16, 222, 99, 250, 109, 30, 16, 219, 186, 252, 142, 30, 16, 219, 186, + 250, 109, 30, 16, 226, 98, 218, 236, 30, 16, 207, 21, 218, 236, 30, 16, + 160, 218, 236, 30, 16, 219, 205, 218, 236, 30, 16, 243, 84, 218, 236, 30, + 16, 215, 3, 218, 236, 30, 16, 212, 1, 218, 236, 30, 16, 214, 251, 218, + 236, 30, 16, 119, 238, 30, 210, 121, 218, 236, 30, 16, 206, 196, 224, 33, + 30, 16, 101, 224, 33, 30, 16, 247, 234, 206, 196, 224, 33, 30, 16, 49, + 224, 34, 207, 23, 30, 16, 49, 224, 34, 249, 202, 30, 16, 211, 52, 224, + 34, 120, 207, 23, 30, 16, 211, 52, 224, 34, 120, 249, 202, 30, 16, 211, + 52, 224, 34, 47, 207, 23, 30, 16, 211, 52, 224, 34, 47, 249, 202, 30, 16, + 211, 52, 224, 34, 48, 207, 23, 30, 16, 211, 52, 224, 34, 48, 249, 202, + 30, 16, 211, 52, 224, 34, 130, 207, 23, 30, 16, 211, 52, 224, 34, 130, + 249, 202, 30, 16, 211, 52, 224, 34, 120, 48, 207, 23, 30, 16, 211, 52, + 224, 34, 120, 48, 249, 202, 30, 16, 226, 145, 224, 34, 207, 23, 30, 16, + 226, 145, 224, 34, 249, 202, 30, 16, 211, 49, 224, 34, 130, 207, 23, 30, + 16, 211, 49, 224, 34, 130, 249, 202, 30, 16, 221, 217, 224, 33, 30, 16, + 208, 167, 224, 33, 30, 16, 224, 34, 249, 202, 30, 16, 223, 182, 224, 33, + 30, 16, 247, 177, 224, 34, 207, 23, 30, 16, 247, 177, 224, 34, 249, 202, + 30, 16, 249, 122, 30, 16, 207, 21, 224, 37, 30, 16, 160, 224, 37, 30, 16, + 219, 205, 224, 37, 30, 16, 243, 84, 224, 37, 30, 16, 215, 3, 224, 37, 30, + 16, 212, 1, 224, 37, 30, 16, 214, 251, 224, 37, 30, 16, 119, 238, 30, + 210, 121, 224, 37, 30, 16, 36, 214, 9, 30, 16, 36, 214, 114, 214, 9, 30, + 16, 36, 211, 60, 30, 16, 36, 211, 59, 30, 16, 36, 211, 58, 30, 16, 241, + 226, 211, 60, 30, 16, 241, 226, 211, 59, 30, 16, 241, 226, 211, 58, 30, + 16, 36, 251, 181, 245, 23, 30, 16, 36, 241, 195, 30, 16, 36, 241, 194, + 30, 16, 36, 241, 193, 30, 16, 36, 241, 192, 30, 16, 36, 241, 191, 30, 16, + 250, 42, 250, 59, 30, 16, 243, 34, 250, 59, 30, 16, 250, 42, 211, 203, + 30, 16, 243, 34, 211, 203, 30, 16, 250, 42, 214, 216, 30, 16, 243, 34, + 214, 216, 30, 16, 250, 42, 221, 60, 30, 16, 243, 34, 221, 60, 30, 16, 36, + 253, 21, 30, 16, 36, 214, 37, 30, 16, 36, 212, 88, 30, 16, 36, 214, 38, + 30, 16, 36, 227, 195, 30, 16, 36, 227, 194, 30, 16, 36, 253, 20, 30, 16, + 36, 229, 99, 30, 16, 251, 249, 209, 206, 30, 16, 251, 249, 244, 8, 30, + 16, 36, 245, 38, 30, 16, 36, 218, 145, 30, 16, 36, 241, 179, 30, 16, 36, + 214, 212, 30, 16, 36, 250, 21, 30, 16, 36, 50, 211, 107, 30, 16, 36, 211, + 36, 211, 107, 30, 16, 218, 150, 30, 16, 213, 193, 30, 16, 205, 159, 30, + 16, 221, 52, 30, 16, 227, 49, 30, 16, 241, 132, 30, 16, 247, 67, 30, 16, + 245, 252, 30, 16, 239, 250, 224, 38, 214, 235, 30, 16, 239, 250, 224, 38, + 224, 68, 214, 235, 30, 16, 211, 84, 30, 16, 210, 144, 30, 16, 233, 2, + 210, 144, 30, 16, 210, 145, 214, 235, 30, 16, 210, 145, 209, 206, 30, 16, + 222, 112, 213, 224, 30, 16, 222, 112, 213, 221, 30, 16, 222, 112, 213, + 220, 30, 16, 222, 112, 213, 219, 30, 16, 222, 112, 213, 218, 30, 16, 222, + 112, 213, 217, 30, 16, 222, 112, 213, 216, 30, 16, 222, 112, 213, 215, + 30, 16, 222, 112, 213, 214, 30, 16, 222, 112, 213, 223, 30, 16, 222, 112, + 213, 222, 30, 16, 239, 79, 30, 16, 225, 108, 30, 16, 243, 34, 73, 214, 1, + 30, 16, 245, 245, 214, 235, 30, 16, 36, 130, 249, 146, 30, 16, 36, 120, + 249, 146, 30, 16, 36, 239, 91, 30, 16, 36, 214, 203, 220, 241, 30, 16, + 221, 169, 83, 30, 16, 221, 169, 120, 83, 30, 16, 160, 221, 169, 83, 30, + 16, 240, 27, 209, 206, 30, 16, 240, 27, 244, 8, 30, 16, 2, 241, 225, 30, + 16, 246, 102, 30, 16, 246, 103, 252, 156, 30, 16, 227, 164, 30, 16, 229, + 117, 30, 16, 249, 119, 30, 16, 216, 56, 207, 23, 30, 16, 216, 56, 249, + 202, 30, 16, 226, 205, 30, 16, 226, 206, 249, 202, 30, 16, 216, 50, 207, + 23, 30, 16, 216, 50, 249, 202, 30, 16, 241, 73, 207, 23, 30, 16, 241, 73, + 249, 202, 30, 16, 229, 118, 221, 129, 218, 236, 30, 16, 229, 118, 233, + 73, 218, 236, 30, 16, 249, 120, 218, 236, 30, 16, 216, 56, 218, 236, 30, + 16, 226, 206, 218, 236, 30, 16, 216, 50, 218, 236, 30, 16, 212, 100, 221, + 127, 247, 34, 220, 107, 221, 128, 30, 16, 212, 100, 221, 127, 247, 34, + 220, 107, 233, 72, 30, 16, 212, 100, 221, 127, 247, 34, 220, 107, 221, + 129, 245, 118, 30, 16, 212, 100, 233, 71, 247, 34, 220, 107, 221, 128, + 30, 16, 212, 100, 233, 71, 247, 34, 220, 107, 233, 72, 30, 16, 212, 100, + 233, 71, 247, 34, 220, 107, 233, 73, 245, 118, 30, 16, 212, 100, 233, 71, + 247, 34, 220, 107, 233, 73, 245, 117, 30, 16, 212, 100, 233, 71, 247, 34, + 220, 107, 233, 73, 245, 116, 30, 16, 247, 62, 30, 16, 239, 226, 249, 35, + 247, 206, 30, 16, 239, 226, 242, 140, 247, 206, 30, 16, 49, 251, 150, 30, + 16, 208, 187, 30, 16, 220, 208, 30, 16, 247, 197, 30, 16, 217, 108, 30, + 16, 247, 201, 30, 16, 211, 95, 30, 16, 220, 180, 30, 16, 220, 181, 241, + 181, 30, 16, 217, 109, 241, 181, 30, 16, 211, 96, 218, 233, 30, 16, 221, + 110, 213, 184, 27, 208, 172, 224, 41, 213, 88, 27, 208, 172, 224, 41, + 213, 77, 27, 208, 172, 224, 41, 213, 67, 27, 208, 172, 224, 41, 213, 60, + 27, 208, 172, 224, 41, 213, 52, 27, 208, 172, 224, 41, 213, 46, 27, 208, + 172, 224, 41, 213, 45, 27, 208, 172, 224, 41, 213, 44, 27, 208, 172, 224, + 41, 213, 43, 27, 208, 172, 224, 41, 213, 87, 27, 208, 172, 224, 41, 213, + 86, 27, 208, 172, 224, 41, 213, 85, 27, 208, 172, 224, 41, 213, 84, 27, + 208, 172, 224, 41, 213, 83, 27, 208, 172, 224, 41, 213, 82, 27, 208, 172, + 224, 41, 213, 81, 27, 208, 172, 224, 41, 213, 80, 27, 208, 172, 224, 41, + 213, 79, 27, 208, 172, 224, 41, 213, 78, 27, 208, 172, 224, 41, 213, 76, + 27, 208, 172, 224, 41, 213, 75, 27, 208, 172, 224, 41, 213, 74, 27, 208, + 172, 224, 41, 213, 73, 27, 208, 172, 224, 41, 213, 72, 27, 208, 172, 224, + 41, 213, 51, 27, 208, 172, 224, 41, 213, 50, 27, 208, 172, 224, 41, 213, + 49, 27, 208, 172, 224, 41, 213, 48, 27, 208, 172, 224, 41, 213, 47, 27, + 233, 24, 224, 41, 213, 88, 27, 233, 24, 224, 41, 213, 77, 27, 233, 24, + 224, 41, 213, 60, 27, 233, 24, 224, 41, 213, 52, 27, 233, 24, 224, 41, + 213, 45, 27, 233, 24, 224, 41, 213, 44, 27, 233, 24, 224, 41, 213, 86, + 27, 233, 24, 224, 41, 213, 85, 27, 233, 24, 224, 41, 213, 84, 27, 233, + 24, 224, 41, 213, 83, 27, 233, 24, 224, 41, 213, 80, 27, 233, 24, 224, + 41, 213, 79, 27, 233, 24, 224, 41, 213, 78, 27, 233, 24, 224, 41, 213, + 73, 27, 233, 24, 224, 41, 213, 72, 27, 233, 24, 224, 41, 213, 71, 27, + 233, 24, 224, 41, 213, 70, 27, 233, 24, 224, 41, 213, 69, 27, 233, 24, + 224, 41, 213, 68, 27, 233, 24, 224, 41, 213, 66, 27, 233, 24, 224, 41, + 213, 65, 27, 233, 24, 224, 41, 213, 64, 27, 233, 24, 224, 41, 213, 63, + 27, 233, 24, 224, 41, 213, 62, 27, 233, 24, 224, 41, 213, 61, 27, 233, + 24, 224, 41, 213, 59, 27, 233, 24, 224, 41, 213, 58, 27, 233, 24, 224, + 41, 213, 57, 27, 233, 24, 224, 41, 213, 56, 27, 233, 24, 224, 41, 213, + 55, 27, 233, 24, 224, 41, 213, 54, 27, 233, 24, 224, 41, 213, 53, 27, + 233, 24, 224, 41, 213, 51, 27, 233, 24, 224, 41, 213, 50, 27, 233, 24, + 224, 41, 213, 49, 27, 233, 24, 224, 41, 213, 48, 27, 233, 24, 224, 41, + 213, 47, 36, 27, 30, 211, 33, 36, 27, 30, 212, 72, 36, 27, 30, 221, 138, + 27, 30, 230, 28, 226, 160, 33, 243, 120, 245, 131, 33, 239, 55, 243, 120, + 245, 131, 33, 238, 33, 243, 120, 245, 131, 33, 243, 119, 239, 56, 245, + 131, 33, 243, 119, 238, 32, 245, 131, 33, 243, 120, 212, 74, 33, 248, + 128, 212, 74, 33, 241, 82, 247, 233, 212, 74, 33, 226, 197, 212, 74, 33, + 250, 119, 212, 74, 33, 231, 218, 214, 215, 212, 74, 33, 247, 110, 212, + 74, 33, 251, 227, 212, 74, 33, 222, 128, 212, 74, 33, 249, 129, 222, 93, + 212, 74, 33, 245, 247, 222, 123, 245, 86, 212, 74, 33, 245, 83, 212, 74, + 33, 205, 225, 212, 74, 33, 233, 59, 212, 74, 33, 221, 148, 212, 74, 33, + 219, 50, 212, 74, 33, 247, 121, 212, 74, 33, 238, 141, 250, 176, 212, 74, + 33, 207, 89, 212, 74, 33, 241, 157, 212, 74, 33, 252, 251, 212, 74, 33, + 219, 9, 212, 74, 33, 218, 240, 212, 74, 33, 243, 118, 212, 74, 33, 232, + 107, 212, 74, 33, 247, 116, 212, 74, 33, 243, 33, 212, 74, 33, 243, 211, + 212, 74, 33, 248, 98, 212, 74, 33, 246, 1, 212, 74, 33, 24, 218, 239, + 212, 74, 33, 222, 43, 212, 74, 33, 230, 32, 212, 74, 33, 247, 190, 212, + 74, 33, 231, 105, 212, 74, 33, 240, 194, 212, 74, 33, 213, 234, 212, 74, + 33, 220, 61, 212, 74, 33, 241, 81, 212, 74, 33, 218, 241, 212, 74, 33, + 230, 71, 222, 123, 226, 177, 212, 74, 33, 218, 237, 212, 74, 33, 240, 13, + 211, 130, 227, 102, 212, 74, 33, 243, 35, 212, 74, 33, 213, 246, 212, 74, + 33, 239, 228, 212, 74, 33, 243, 26, 212, 74, 33, 221, 190, 212, 74, 33, + 218, 139, 212, 74, 33, 241, 180, 212, 74, 33, 209, 48, 222, 123, 207, 73, + 212, 74, 33, 247, 126, 212, 74, 33, 227, 117, 212, 74, 33, 242, 198, 212, + 74, 33, 209, 215, 212, 74, 33, 245, 119, 212, 74, 33, 247, 192, 226, 123, + 212, 74, 33, 239, 205, 212, 74, 33, 240, 195, 233, 68, 212, 74, 33, 227, + 172, 212, 74, 33, 253, 16, 212, 74, 33, 243, 48, 212, 74, 33, 244, 12, + 212, 74, 33, 207, 71, 212, 74, 33, 215, 36, 212, 74, 33, 233, 33, 212, + 74, 33, 245, 215, 212, 74, 33, 246, 82, 212, 74, 33, 245, 115, 212, 74, + 33, 242, 166, 212, 74, 33, 216, 16, 212, 74, 33, 213, 250, 212, 74, 33, + 239, 93, 212, 74, 33, 247, 148, 212, 74, 33, 247, 187, 212, 74, 33, 242, + 53, 212, 74, 33, 252, 216, 212, 74, 33, 247, 147, 212, 74, 33, 222, 166, + 212, 42, 209, 25, 212, 74, 33, 245, 139, 212, 74, 33, 230, 129, 212, 74, + 33, 241, 128, 247, 79, 218, 115, 209, 217, 18, 102, 247, 79, 218, 115, + 209, 217, 18, 105, 247, 79, 218, 115, 209, 217, 18, 142, 247, 79, 218, + 115, 209, 217, 18, 139, 247, 79, 218, 115, 209, 217, 18, 168, 247, 79, + 218, 115, 209, 217, 18, 184, 247, 79, 218, 115, 209, 217, 18, 195, 247, + 79, 218, 115, 209, 217, 18, 193, 247, 79, 218, 115, 209, 217, 18, 200, + 247, 79, 218, 115, 212, 94, 18, 102, 247, 79, 218, 115, 212, 94, 18, 105, + 247, 79, 218, 115, 212, 94, 18, 142, 247, 79, 218, 115, 212, 94, 18, 139, + 247, 79, 218, 115, 212, 94, 18, 168, 247, 79, 218, 115, 212, 94, 18, 184, + 247, 79, 218, 115, 212, 94, 18, 195, 247, 79, 218, 115, 212, 94, 18, 193, + 247, 79, 218, 115, 212, 94, 18, 200, 11, 24, 6, 62, 11, 24, 6, 251, 150, + 11, 24, 6, 249, 34, 11, 24, 6, 246, 240, 11, 24, 6, 75, 11, 24, 6, 242, + 139, 11, 24, 6, 241, 55, 11, 24, 6, 239, 155, 11, 24, 6, 74, 11, 24, 6, + 232, 203, 11, 24, 6, 232, 76, 11, 24, 6, 149, 11, 24, 6, 229, 28, 11, 24, + 6, 226, 33, 11, 24, 6, 76, 11, 24, 6, 222, 67, 11, 24, 6, 220, 27, 11, + 24, 6, 137, 11, 24, 6, 182, 11, 24, 6, 213, 10, 11, 24, 6, 71, 11, 24, 6, + 209, 148, 11, 24, 6, 207, 129, 11, 24, 6, 206, 195, 11, 24, 6, 206, 123, + 11, 24, 6, 205, 159, 11, 24, 5, 62, 11, 24, 5, 251, 150, 11, 24, 5, 249, + 34, 11, 24, 5, 246, 240, 11, 24, 5, 75, 11, 24, 5, 242, 139, 11, 24, 5, + 241, 55, 11, 24, 5, 239, 155, 11, 24, 5, 74, 11, 24, 5, 232, 203, 11, 24, + 5, 232, 76, 11, 24, 5, 149, 11, 24, 5, 229, 28, 11, 24, 5, 226, 33, 11, + 24, 5, 76, 11, 24, 5, 222, 67, 11, 24, 5, 220, 27, 11, 24, 5, 137, 11, + 24, 5, 182, 11, 24, 5, 213, 10, 11, 24, 5, 71, 11, 24, 5, 209, 148, 11, + 24, 5, 207, 129, 11, 24, 5, 206, 195, 11, 24, 5, 206, 123, 11, 24, 5, + 205, 159, 11, 35, 6, 62, 11, 35, 6, 251, 150, 11, 35, 6, 249, 34, 11, 35, + 6, 246, 240, 11, 35, 6, 75, 11, 35, 6, 242, 139, 11, 35, 6, 241, 55, 11, + 35, 6, 239, 155, 11, 35, 6, 74, 11, 35, 6, 232, 203, 11, 35, 6, 232, 76, + 11, 35, 6, 149, 11, 35, 6, 229, 28, 11, 35, 6, 226, 33, 11, 35, 6, 76, + 11, 35, 6, 222, 67, 11, 35, 6, 220, 27, 11, 35, 6, 137, 11, 35, 6, 182, + 11, 35, 6, 213, 10, 11, 35, 6, 71, 11, 35, 6, 209, 148, 11, 35, 6, 207, + 129, 11, 35, 6, 206, 195, 11, 35, 6, 206, 123, 11, 35, 6, 205, 159, 11, + 35, 5, 62, 11, 35, 5, 251, 150, 11, 35, 5, 249, 34, 11, 35, 5, 246, 240, + 11, 35, 5, 75, 11, 35, 5, 242, 139, 11, 35, 5, 241, 55, 11, 35, 5, 74, + 11, 35, 5, 232, 203, 11, 35, 5, 232, 76, 11, 35, 5, 149, 11, 35, 5, 229, + 28, 11, 35, 5, 226, 33, 11, 35, 5, 76, 11, 35, 5, 222, 67, 11, 35, 5, + 220, 27, 11, 35, 5, 137, 11, 35, 5, 182, 11, 35, 5, 213, 10, 11, 35, 5, + 71, 11, 35, 5, 209, 148, 11, 35, 5, 207, 129, 11, 35, 5, 206, 195, 11, + 35, 5, 206, 123, 11, 35, 5, 205, 159, 11, 24, 35, 6, 62, 11, 24, 35, 6, + 251, 150, 11, 24, 35, 6, 249, 34, 11, 24, 35, 6, 246, 240, 11, 24, 35, 6, + 75, 11, 24, 35, 6, 242, 139, 11, 24, 35, 6, 241, 55, 11, 24, 35, 6, 239, + 155, 11, 24, 35, 6, 74, 11, 24, 35, 6, 232, 203, 11, 24, 35, 6, 232, 76, + 11, 24, 35, 6, 149, 11, 24, 35, 6, 229, 28, 11, 24, 35, 6, 226, 33, 11, + 24, 35, 6, 76, 11, 24, 35, 6, 222, 67, 11, 24, 35, 6, 220, 27, 11, 24, + 35, 6, 137, 11, 24, 35, 6, 182, 11, 24, 35, 6, 213, 10, 11, 24, 35, 6, + 71, 11, 24, 35, 6, 209, 148, 11, 24, 35, 6, 207, 129, 11, 24, 35, 6, 206, + 195, 11, 24, 35, 6, 206, 123, 11, 24, 35, 6, 205, 159, 11, 24, 35, 5, 62, + 11, 24, 35, 5, 251, 150, 11, 24, 35, 5, 249, 34, 11, 24, 35, 5, 246, 240, + 11, 24, 35, 5, 75, 11, 24, 35, 5, 242, 139, 11, 24, 35, 5, 241, 55, 11, + 24, 35, 5, 239, 155, 11, 24, 35, 5, 74, 11, 24, 35, 5, 232, 203, 11, 24, + 35, 5, 232, 76, 11, 24, 35, 5, 149, 11, 24, 35, 5, 229, 28, 11, 24, 35, + 5, 226, 33, 11, 24, 35, 5, 76, 11, 24, 35, 5, 222, 67, 11, 24, 35, 5, + 220, 27, 11, 24, 35, 5, 137, 11, 24, 35, 5, 182, 11, 24, 35, 5, 213, 10, + 11, 24, 35, 5, 71, 11, 24, 35, 5, 209, 148, 11, 24, 35, 5, 207, 129, 11, + 24, 35, 5, 206, 195, 11, 24, 35, 5, 206, 123, 11, 24, 35, 5, 205, 159, + 11, 121, 6, 62, 11, 121, 6, 249, 34, 11, 121, 6, 246, 240, 11, 121, 6, + 241, 55, 11, 121, 6, 232, 203, 11, 121, 6, 232, 76, 11, 121, 6, 226, 33, + 11, 121, 6, 76, 11, 121, 6, 222, 67, 11, 121, 6, 220, 27, 11, 121, 6, + 182, 11, 121, 6, 213, 10, 11, 121, 6, 71, 11, 121, 6, 209, 148, 11, 121, + 6, 207, 129, 11, 121, 6, 206, 195, 11, 121, 6, 206, 123, 11, 121, 6, 205, + 159, 11, 121, 5, 62, 11, 121, 5, 251, 150, 11, 121, 5, 249, 34, 11, 121, + 5, 246, 240, 11, 121, 5, 242, 139, 11, 121, 5, 239, 155, 11, 121, 5, 74, + 11, 121, 5, 232, 203, 11, 121, 5, 232, 76, 11, 121, 5, 149, 11, 121, 5, + 229, 28, 11, 121, 5, 226, 33, 11, 121, 5, 222, 67, 11, 121, 5, 220, 27, + 11, 121, 5, 137, 11, 121, 5, 182, 11, 121, 5, 213, 10, 11, 121, 5, 71, + 11, 121, 5, 209, 148, 11, 121, 5, 207, 129, 11, 121, 5, 206, 195, 11, + 121, 5, 206, 123, 11, 121, 5, 205, 159, 11, 24, 121, 6, 62, 11, 24, 121, + 6, 251, 150, 11, 24, 121, 6, 249, 34, 11, 24, 121, 6, 246, 240, 11, 24, + 121, 6, 75, 11, 24, 121, 6, 242, 139, 11, 24, 121, 6, 241, 55, 11, 24, + 121, 6, 239, 155, 11, 24, 121, 6, 74, 11, 24, 121, 6, 232, 203, 11, 24, + 121, 6, 232, 76, 11, 24, 121, 6, 149, 11, 24, 121, 6, 229, 28, 11, 24, + 121, 6, 226, 33, 11, 24, 121, 6, 76, 11, 24, 121, 6, 222, 67, 11, 24, + 121, 6, 220, 27, 11, 24, 121, 6, 137, 11, 24, 121, 6, 182, 11, 24, 121, + 6, 213, 10, 11, 24, 121, 6, 71, 11, 24, 121, 6, 209, 148, 11, 24, 121, 6, + 207, 129, 11, 24, 121, 6, 206, 195, 11, 24, 121, 6, 206, 123, 11, 24, + 121, 6, 205, 159, 11, 24, 121, 5, 62, 11, 24, 121, 5, 251, 150, 11, 24, + 121, 5, 249, 34, 11, 24, 121, 5, 246, 240, 11, 24, 121, 5, 75, 11, 24, + 121, 5, 242, 139, 11, 24, 121, 5, 241, 55, 11, 24, 121, 5, 239, 155, 11, + 24, 121, 5, 74, 11, 24, 121, 5, 232, 203, 11, 24, 121, 5, 232, 76, 11, + 24, 121, 5, 149, 11, 24, 121, 5, 229, 28, 11, 24, 121, 5, 226, 33, 11, + 24, 121, 5, 76, 11, 24, 121, 5, 222, 67, 11, 24, 121, 5, 220, 27, 11, 24, + 121, 5, 137, 11, 24, 121, 5, 182, 11, 24, 121, 5, 213, 10, 11, 24, 121, + 5, 71, 11, 24, 121, 5, 209, 148, 11, 24, 121, 5, 207, 129, 11, 24, 121, + 5, 206, 195, 11, 24, 121, 5, 206, 123, 11, 24, 121, 5, 205, 159, 11, 154, + 6, 62, 11, 154, 6, 251, 150, 11, 154, 6, 246, 240, 11, 154, 6, 75, 11, + 154, 6, 242, 139, 11, 154, 6, 241, 55, 11, 154, 6, 232, 203, 11, 154, 6, + 232, 76, 11, 154, 6, 149, 11, 154, 6, 229, 28, 11, 154, 6, 226, 33, 11, + 154, 6, 76, 11, 154, 6, 222, 67, 11, 154, 6, 220, 27, 11, 154, 6, 182, + 11, 154, 6, 213, 10, 11, 154, 6, 71, 11, 154, 6, 209, 148, 11, 154, 6, + 207, 129, 11, 154, 6, 206, 195, 11, 154, 6, 206, 123, 11, 154, 5, 62, 11, + 154, 5, 251, 150, 11, 154, 5, 249, 34, 11, 154, 5, 246, 240, 11, 154, 5, + 75, 11, 154, 5, 242, 139, 11, 154, 5, 241, 55, 11, 154, 5, 239, 155, 11, + 154, 5, 74, 11, 154, 5, 232, 203, 11, 154, 5, 232, 76, 11, 154, 5, 149, + 11, 154, 5, 229, 28, 11, 154, 5, 226, 33, 11, 154, 5, 76, 11, 154, 5, + 222, 67, 11, 154, 5, 220, 27, 11, 154, 5, 137, 11, 154, 5, 182, 11, 154, + 5, 213, 10, 11, 154, 5, 71, 11, 154, 5, 209, 148, 11, 154, 5, 207, 129, + 11, 154, 5, 206, 195, 11, 154, 5, 206, 123, 11, 154, 5, 205, 159, 11, + 159, 6, 62, 11, 159, 6, 251, 150, 11, 159, 6, 246, 240, 11, 159, 6, 75, + 11, 159, 6, 242, 139, 11, 159, 6, 241, 55, 11, 159, 6, 74, 11, 159, 6, + 232, 203, 11, 159, 6, 232, 76, 11, 159, 6, 149, 11, 159, 6, 229, 28, 11, + 159, 6, 76, 11, 159, 6, 182, 11, 159, 6, 213, 10, 11, 159, 6, 71, 11, + 159, 6, 209, 148, 11, 159, 6, 207, 129, 11, 159, 6, 206, 195, 11, 159, 6, + 206, 123, 11, 159, 5, 62, 11, 159, 5, 251, 150, 11, 159, 5, 249, 34, 11, + 159, 5, 246, 240, 11, 159, 5, 75, 11, 159, 5, 242, 139, 11, 159, 5, 241, + 55, 11, 159, 5, 239, 155, 11, 159, 5, 74, 11, 159, 5, 232, 203, 11, 159, + 5, 232, 76, 11, 159, 5, 149, 11, 159, 5, 229, 28, 11, 159, 5, 226, 33, + 11, 159, 5, 76, 11, 159, 5, 222, 67, 11, 159, 5, 220, 27, 11, 159, 5, + 137, 11, 159, 5, 182, 11, 159, 5, 213, 10, 11, 159, 5, 71, 11, 159, 5, + 209, 148, 11, 159, 5, 207, 129, 11, 159, 5, 206, 195, 11, 159, 5, 206, + 123, 11, 159, 5, 205, 159, 11, 24, 154, 6, 62, 11, 24, 154, 6, 251, 150, + 11, 24, 154, 6, 249, 34, 11, 24, 154, 6, 246, 240, 11, 24, 154, 6, 75, + 11, 24, 154, 6, 242, 139, 11, 24, 154, 6, 241, 55, 11, 24, 154, 6, 239, + 155, 11, 24, 154, 6, 74, 11, 24, 154, 6, 232, 203, 11, 24, 154, 6, 232, + 76, 11, 24, 154, 6, 149, 11, 24, 154, 6, 229, 28, 11, 24, 154, 6, 226, + 33, 11, 24, 154, 6, 76, 11, 24, 154, 6, 222, 67, 11, 24, 154, 6, 220, 27, + 11, 24, 154, 6, 137, 11, 24, 154, 6, 182, 11, 24, 154, 6, 213, 10, 11, + 24, 154, 6, 71, 11, 24, 154, 6, 209, 148, 11, 24, 154, 6, 207, 129, 11, + 24, 154, 6, 206, 195, 11, 24, 154, 6, 206, 123, 11, 24, 154, 6, 205, 159, + 11, 24, 154, 5, 62, 11, 24, 154, 5, 251, 150, 11, 24, 154, 5, 249, 34, + 11, 24, 154, 5, 246, 240, 11, 24, 154, 5, 75, 11, 24, 154, 5, 242, 139, + 11, 24, 154, 5, 241, 55, 11, 24, 154, 5, 239, 155, 11, 24, 154, 5, 74, + 11, 24, 154, 5, 232, 203, 11, 24, 154, 5, 232, 76, 11, 24, 154, 5, 149, + 11, 24, 154, 5, 229, 28, 11, 24, 154, 5, 226, 33, 11, 24, 154, 5, 76, 11, + 24, 154, 5, 222, 67, 11, 24, 154, 5, 220, 27, 11, 24, 154, 5, 137, 11, + 24, 154, 5, 182, 11, 24, 154, 5, 213, 10, 11, 24, 154, 5, 71, 11, 24, + 154, 5, 209, 148, 11, 24, 154, 5, 207, 129, 11, 24, 154, 5, 206, 195, 11, + 24, 154, 5, 206, 123, 11, 24, 154, 5, 205, 159, 11, 38, 6, 62, 11, 38, 6, + 251, 150, 11, 38, 6, 249, 34, 11, 38, 6, 246, 240, 11, 38, 6, 75, 11, 38, + 6, 242, 139, 11, 38, 6, 241, 55, 11, 38, 6, 239, 155, 11, 38, 6, 74, 11, + 38, 6, 232, 203, 11, 38, 6, 232, 76, 11, 38, 6, 149, 11, 38, 6, 229, 28, + 11, 38, 6, 226, 33, 11, 38, 6, 76, 11, 38, 6, 222, 67, 11, 38, 6, 220, + 27, 11, 38, 6, 137, 11, 38, 6, 182, 11, 38, 6, 213, 10, 11, 38, 6, 71, + 11, 38, 6, 209, 148, 11, 38, 6, 207, 129, 11, 38, 6, 206, 195, 11, 38, 6, + 206, 123, 11, 38, 6, 205, 159, 11, 38, 5, 62, 11, 38, 5, 251, 150, 11, + 38, 5, 249, 34, 11, 38, 5, 246, 240, 11, 38, 5, 75, 11, 38, 5, 242, 139, + 11, 38, 5, 241, 55, 11, 38, 5, 239, 155, 11, 38, 5, 74, 11, 38, 5, 232, + 203, 11, 38, 5, 232, 76, 11, 38, 5, 149, 11, 38, 5, 229, 28, 11, 38, 5, + 226, 33, 11, 38, 5, 76, 11, 38, 5, 222, 67, 11, 38, 5, 220, 27, 11, 38, + 5, 137, 11, 38, 5, 182, 11, 38, 5, 213, 10, 11, 38, 5, 71, 11, 38, 5, + 209, 148, 11, 38, 5, 207, 129, 11, 38, 5, 206, 195, 11, 38, 5, 206, 123, + 11, 38, 5, 205, 159, 11, 38, 24, 6, 62, 11, 38, 24, 6, 251, 150, 11, 38, + 24, 6, 249, 34, 11, 38, 24, 6, 246, 240, 11, 38, 24, 6, 75, 11, 38, 24, + 6, 242, 139, 11, 38, 24, 6, 241, 55, 11, 38, 24, 6, 239, 155, 11, 38, 24, + 6, 74, 11, 38, 24, 6, 232, 203, 11, 38, 24, 6, 232, 76, 11, 38, 24, 6, + 149, 11, 38, 24, 6, 229, 28, 11, 38, 24, 6, 226, 33, 11, 38, 24, 6, 76, + 11, 38, 24, 6, 222, 67, 11, 38, 24, 6, 220, 27, 11, 38, 24, 6, 137, 11, + 38, 24, 6, 182, 11, 38, 24, 6, 213, 10, 11, 38, 24, 6, 71, 11, 38, 24, 6, + 209, 148, 11, 38, 24, 6, 207, 129, 11, 38, 24, 6, 206, 195, 11, 38, 24, + 6, 206, 123, 11, 38, 24, 6, 205, 159, 11, 38, 24, 5, 62, 11, 38, 24, 5, + 251, 150, 11, 38, 24, 5, 249, 34, 11, 38, 24, 5, 246, 240, 11, 38, 24, 5, + 75, 11, 38, 24, 5, 242, 139, 11, 38, 24, 5, 241, 55, 11, 38, 24, 5, 239, + 155, 11, 38, 24, 5, 74, 11, 38, 24, 5, 232, 203, 11, 38, 24, 5, 232, 76, + 11, 38, 24, 5, 149, 11, 38, 24, 5, 229, 28, 11, 38, 24, 5, 226, 33, 11, + 38, 24, 5, 76, 11, 38, 24, 5, 222, 67, 11, 38, 24, 5, 220, 27, 11, 38, + 24, 5, 137, 11, 38, 24, 5, 182, 11, 38, 24, 5, 213, 10, 11, 38, 24, 5, + 71, 11, 38, 24, 5, 209, 148, 11, 38, 24, 5, 207, 129, 11, 38, 24, 5, 206, + 195, 11, 38, 24, 5, 206, 123, 11, 38, 24, 5, 205, 159, 11, 38, 35, 6, 62, + 11, 38, 35, 6, 251, 150, 11, 38, 35, 6, 249, 34, 11, 38, 35, 6, 246, 240, + 11, 38, 35, 6, 75, 11, 38, 35, 6, 242, 139, 11, 38, 35, 6, 241, 55, 11, + 38, 35, 6, 239, 155, 11, 38, 35, 6, 74, 11, 38, 35, 6, 232, 203, 11, 38, + 35, 6, 232, 76, 11, 38, 35, 6, 149, 11, 38, 35, 6, 229, 28, 11, 38, 35, + 6, 226, 33, 11, 38, 35, 6, 76, 11, 38, 35, 6, 222, 67, 11, 38, 35, 6, + 220, 27, 11, 38, 35, 6, 137, 11, 38, 35, 6, 182, 11, 38, 35, 6, 213, 10, + 11, 38, 35, 6, 71, 11, 38, 35, 6, 209, 148, 11, 38, 35, 6, 207, 129, 11, + 38, 35, 6, 206, 195, 11, 38, 35, 6, 206, 123, 11, 38, 35, 6, 205, 159, + 11, 38, 35, 5, 62, 11, 38, 35, 5, 251, 150, 11, 38, 35, 5, 249, 34, 11, + 38, 35, 5, 246, 240, 11, 38, 35, 5, 75, 11, 38, 35, 5, 242, 139, 11, 38, + 35, 5, 241, 55, 11, 38, 35, 5, 239, 155, 11, 38, 35, 5, 74, 11, 38, 35, + 5, 232, 203, 11, 38, 35, 5, 232, 76, 11, 38, 35, 5, 149, 11, 38, 35, 5, + 229, 28, 11, 38, 35, 5, 226, 33, 11, 38, 35, 5, 76, 11, 38, 35, 5, 222, + 67, 11, 38, 35, 5, 220, 27, 11, 38, 35, 5, 137, 11, 38, 35, 5, 182, 11, + 38, 35, 5, 213, 10, 11, 38, 35, 5, 71, 11, 38, 35, 5, 209, 148, 11, 38, + 35, 5, 207, 129, 11, 38, 35, 5, 206, 195, 11, 38, 35, 5, 206, 123, 11, + 38, 35, 5, 205, 159, 11, 38, 24, 35, 6, 62, 11, 38, 24, 35, 6, 251, 150, + 11, 38, 24, 35, 6, 249, 34, 11, 38, 24, 35, 6, 246, 240, 11, 38, 24, 35, + 6, 75, 11, 38, 24, 35, 6, 242, 139, 11, 38, 24, 35, 6, 241, 55, 11, 38, + 24, 35, 6, 239, 155, 11, 38, 24, 35, 6, 74, 11, 38, 24, 35, 6, 232, 203, + 11, 38, 24, 35, 6, 232, 76, 11, 38, 24, 35, 6, 149, 11, 38, 24, 35, 6, + 229, 28, 11, 38, 24, 35, 6, 226, 33, 11, 38, 24, 35, 6, 76, 11, 38, 24, + 35, 6, 222, 67, 11, 38, 24, 35, 6, 220, 27, 11, 38, 24, 35, 6, 137, 11, + 38, 24, 35, 6, 182, 11, 38, 24, 35, 6, 213, 10, 11, 38, 24, 35, 6, 71, + 11, 38, 24, 35, 6, 209, 148, 11, 38, 24, 35, 6, 207, 129, 11, 38, 24, 35, + 6, 206, 195, 11, 38, 24, 35, 6, 206, 123, 11, 38, 24, 35, 6, 205, 159, + 11, 38, 24, 35, 5, 62, 11, 38, 24, 35, 5, 251, 150, 11, 38, 24, 35, 5, + 249, 34, 11, 38, 24, 35, 5, 246, 240, 11, 38, 24, 35, 5, 75, 11, 38, 24, + 35, 5, 242, 139, 11, 38, 24, 35, 5, 241, 55, 11, 38, 24, 35, 5, 239, 155, + 11, 38, 24, 35, 5, 74, 11, 38, 24, 35, 5, 232, 203, 11, 38, 24, 35, 5, + 232, 76, 11, 38, 24, 35, 5, 149, 11, 38, 24, 35, 5, 229, 28, 11, 38, 24, + 35, 5, 226, 33, 11, 38, 24, 35, 5, 76, 11, 38, 24, 35, 5, 222, 67, 11, + 38, 24, 35, 5, 220, 27, 11, 38, 24, 35, 5, 137, 11, 38, 24, 35, 5, 182, + 11, 38, 24, 35, 5, 213, 10, 11, 38, 24, 35, 5, 71, 11, 38, 24, 35, 5, + 209, 148, 11, 38, 24, 35, 5, 207, 129, 11, 38, 24, 35, 5, 206, 195, 11, + 38, 24, 35, 5, 206, 123, 11, 38, 24, 35, 5, 205, 159, 11, 226, 156, 6, + 62, 11, 226, 156, 6, 251, 150, 11, 226, 156, 6, 249, 34, 11, 226, 156, 6, + 246, 240, 11, 226, 156, 6, 75, 11, 226, 156, 6, 242, 139, 11, 226, 156, + 6, 241, 55, 11, 226, 156, 6, 239, 155, 11, 226, 156, 6, 74, 11, 226, 156, + 6, 232, 203, 11, 226, 156, 6, 232, 76, 11, 226, 156, 6, 149, 11, 226, + 156, 6, 229, 28, 11, 226, 156, 6, 226, 33, 11, 226, 156, 6, 76, 11, 226, + 156, 6, 222, 67, 11, 226, 156, 6, 220, 27, 11, 226, 156, 6, 137, 11, 226, + 156, 6, 182, 11, 226, 156, 6, 213, 10, 11, 226, 156, 6, 71, 11, 226, 156, + 6, 209, 148, 11, 226, 156, 6, 207, 129, 11, 226, 156, 6, 206, 195, 11, + 226, 156, 6, 206, 123, 11, 226, 156, 6, 205, 159, 11, 226, 156, 5, 62, + 11, 226, 156, 5, 251, 150, 11, 226, 156, 5, 249, 34, 11, 226, 156, 5, + 246, 240, 11, 226, 156, 5, 75, 11, 226, 156, 5, 242, 139, 11, 226, 156, + 5, 241, 55, 11, 226, 156, 5, 239, 155, 11, 226, 156, 5, 74, 11, 226, 156, + 5, 232, 203, 11, 226, 156, 5, 232, 76, 11, 226, 156, 5, 149, 11, 226, + 156, 5, 229, 28, 11, 226, 156, 5, 226, 33, 11, 226, 156, 5, 76, 11, 226, + 156, 5, 222, 67, 11, 226, 156, 5, 220, 27, 11, 226, 156, 5, 137, 11, 226, + 156, 5, 182, 11, 226, 156, 5, 213, 10, 11, 226, 156, 5, 71, 11, 226, 156, + 5, 209, 148, 11, 226, 156, 5, 207, 129, 11, 226, 156, 5, 206, 195, 11, + 226, 156, 5, 206, 123, 11, 226, 156, 5, 205, 159, 11, 35, 5, 245, 22, 74, + 11, 35, 5, 245, 22, 232, 203, 11, 24, 6, 252, 144, 11, 24, 6, 250, 8, 11, + 24, 6, 240, 215, 11, 24, 6, 245, 227, 11, 24, 6, 242, 244, 11, 24, 6, + 205, 84, 11, 24, 6, 242, 201, 11, 24, 6, 212, 23, 11, 24, 6, 232, 249, + 11, 24, 6, 232, 14, 11, 24, 6, 230, 102, 11, 24, 6, 226, 114, 11, 24, 6, + 223, 217, 11, 24, 6, 206, 169, 11, 24, 6, 222, 168, 11, 24, 6, 221, 53, + 11, 24, 6, 218, 210, 11, 24, 6, 212, 24, 93, 11, 24, 6, 215, 63, 11, 24, + 6, 212, 151, 11, 24, 6, 209, 200, 11, 24, 6, 221, 78, 11, 24, 6, 248, 58, + 11, 24, 6, 220, 93, 11, 24, 6, 222, 170, 11, 24, 225, 227, 11, 24, 5, + 252, 144, 11, 24, 5, 250, 8, 11, 24, 5, 240, 215, 11, 24, 5, 245, 227, + 11, 24, 5, 242, 244, 11, 24, 5, 205, 84, 11, 24, 5, 242, 201, 11, 24, 5, + 212, 23, 11, 24, 5, 232, 249, 11, 24, 5, 232, 14, 11, 24, 5, 230, 102, + 11, 24, 5, 226, 114, 11, 24, 5, 223, 217, 11, 24, 5, 206, 169, 11, 24, 5, + 222, 168, 11, 24, 5, 221, 53, 11, 24, 5, 218, 210, 11, 24, 5, 42, 215, + 63, 11, 24, 5, 215, 63, 11, 24, 5, 212, 151, 11, 24, 5, 209, 200, 11, 24, + 5, 221, 78, 11, 24, 5, 248, 58, 11, 24, 5, 220, 93, 11, 24, 5, 222, 170, + 11, 24, 221, 209, 245, 140, 11, 24, 242, 245, 93, 11, 24, 212, 24, 93, + 11, 24, 232, 15, 93, 11, 24, 221, 79, 93, 11, 24, 218, 211, 93, 11, 24, + 221, 54, 93, 11, 35, 6, 252, 144, 11, 35, 6, 250, 8, 11, 35, 6, 240, 215, + 11, 35, 6, 245, 227, 11, 35, 6, 242, 244, 11, 35, 6, 205, 84, 11, 35, 6, + 242, 201, 11, 35, 6, 212, 23, 11, 35, 6, 232, 249, 11, 35, 6, 232, 14, + 11, 35, 6, 230, 102, 11, 35, 6, 226, 114, 11, 35, 6, 223, 217, 11, 35, 6, + 206, 169, 11, 35, 6, 222, 168, 11, 35, 6, 221, 53, 11, 35, 6, 218, 210, + 11, 35, 6, 212, 24, 93, 11, 35, 6, 215, 63, 11, 35, 6, 212, 151, 11, 35, + 6, 209, 200, 11, 35, 6, 221, 78, 11, 35, 6, 248, 58, 11, 35, 6, 220, 93, + 11, 35, 6, 222, 170, 11, 35, 225, 227, 11, 35, 5, 252, 144, 11, 35, 5, + 250, 8, 11, 35, 5, 240, 215, 11, 35, 5, 245, 227, 11, 35, 5, 242, 244, + 11, 35, 5, 205, 84, 11, 35, 5, 242, 201, 11, 35, 5, 212, 23, 11, 35, 5, + 232, 249, 11, 35, 5, 232, 14, 11, 35, 5, 230, 102, 11, 35, 5, 226, 114, + 11, 35, 5, 223, 217, 11, 35, 5, 206, 169, 11, 35, 5, 222, 168, 11, 35, 5, + 221, 53, 11, 35, 5, 218, 210, 11, 35, 5, 42, 215, 63, 11, 35, 5, 215, 63, + 11, 35, 5, 212, 151, 11, 35, 5, 209, 200, 11, 35, 5, 221, 78, 11, 35, 5, + 248, 58, 11, 35, 5, 220, 93, 11, 35, 5, 222, 170, 11, 35, 221, 209, 245, + 140, 11, 35, 242, 245, 93, 11, 35, 212, 24, 93, 11, 35, 232, 15, 93, 11, + 35, 221, 79, 93, 11, 35, 218, 211, 93, 11, 35, 221, 54, 93, 11, 24, 35, + 6, 252, 144, 11, 24, 35, 6, 250, 8, 11, 24, 35, 6, 240, 215, 11, 24, 35, + 6, 245, 227, 11, 24, 35, 6, 242, 244, 11, 24, 35, 6, 205, 84, 11, 24, 35, + 6, 242, 201, 11, 24, 35, 6, 212, 23, 11, 24, 35, 6, 232, 249, 11, 24, 35, + 6, 232, 14, 11, 24, 35, 6, 230, 102, 11, 24, 35, 6, 226, 114, 11, 24, 35, + 6, 223, 217, 11, 24, 35, 6, 206, 169, 11, 24, 35, 6, 222, 168, 11, 24, + 35, 6, 221, 53, 11, 24, 35, 6, 218, 210, 11, 24, 35, 6, 212, 24, 93, 11, + 24, 35, 6, 215, 63, 11, 24, 35, 6, 212, 151, 11, 24, 35, 6, 209, 200, 11, + 24, 35, 6, 221, 78, 11, 24, 35, 6, 248, 58, 11, 24, 35, 6, 220, 93, 11, + 24, 35, 6, 222, 170, 11, 24, 35, 225, 227, 11, 24, 35, 5, 252, 144, 11, + 24, 35, 5, 250, 8, 11, 24, 35, 5, 240, 215, 11, 24, 35, 5, 245, 227, 11, + 24, 35, 5, 242, 244, 11, 24, 35, 5, 205, 84, 11, 24, 35, 5, 242, 201, 11, + 24, 35, 5, 212, 23, 11, 24, 35, 5, 232, 249, 11, 24, 35, 5, 232, 14, 11, + 24, 35, 5, 230, 102, 11, 24, 35, 5, 226, 114, 11, 24, 35, 5, 223, 217, + 11, 24, 35, 5, 206, 169, 11, 24, 35, 5, 222, 168, 11, 24, 35, 5, 221, 53, + 11, 24, 35, 5, 218, 210, 11, 24, 35, 5, 42, 215, 63, 11, 24, 35, 5, 215, + 63, 11, 24, 35, 5, 212, 151, 11, 24, 35, 5, 209, 200, 11, 24, 35, 5, 221, + 78, 11, 24, 35, 5, 248, 58, 11, 24, 35, 5, 220, 93, 11, 24, 35, 5, 222, + 170, 11, 24, 35, 221, 209, 245, 140, 11, 24, 35, 242, 245, 93, 11, 24, + 35, 212, 24, 93, 11, 24, 35, 232, 15, 93, 11, 24, 35, 221, 79, 93, 11, + 24, 35, 218, 211, 93, 11, 24, 35, 221, 54, 93, 11, 38, 24, 6, 252, 144, + 11, 38, 24, 6, 250, 8, 11, 38, 24, 6, 240, 215, 11, 38, 24, 6, 245, 227, + 11, 38, 24, 6, 242, 244, 11, 38, 24, 6, 205, 84, 11, 38, 24, 6, 242, 201, + 11, 38, 24, 6, 212, 23, 11, 38, 24, 6, 232, 249, 11, 38, 24, 6, 232, 14, + 11, 38, 24, 6, 230, 102, 11, 38, 24, 6, 226, 114, 11, 38, 24, 6, 223, + 217, 11, 38, 24, 6, 206, 169, 11, 38, 24, 6, 222, 168, 11, 38, 24, 6, + 221, 53, 11, 38, 24, 6, 218, 210, 11, 38, 24, 6, 212, 24, 93, 11, 38, 24, + 6, 215, 63, 11, 38, 24, 6, 212, 151, 11, 38, 24, 6, 209, 200, 11, 38, 24, + 6, 221, 78, 11, 38, 24, 6, 248, 58, 11, 38, 24, 6, 220, 93, 11, 38, 24, + 6, 222, 170, 11, 38, 24, 225, 227, 11, 38, 24, 5, 252, 144, 11, 38, 24, + 5, 250, 8, 11, 38, 24, 5, 240, 215, 11, 38, 24, 5, 245, 227, 11, 38, 24, + 5, 242, 244, 11, 38, 24, 5, 205, 84, 11, 38, 24, 5, 242, 201, 11, 38, 24, + 5, 212, 23, 11, 38, 24, 5, 232, 249, 11, 38, 24, 5, 232, 14, 11, 38, 24, + 5, 230, 102, 11, 38, 24, 5, 226, 114, 11, 38, 24, 5, 223, 217, 11, 38, + 24, 5, 206, 169, 11, 38, 24, 5, 222, 168, 11, 38, 24, 5, 221, 53, 11, 38, + 24, 5, 218, 210, 11, 38, 24, 5, 42, 215, 63, 11, 38, 24, 5, 215, 63, 11, + 38, 24, 5, 212, 151, 11, 38, 24, 5, 209, 200, 11, 38, 24, 5, 221, 78, 11, + 38, 24, 5, 248, 58, 11, 38, 24, 5, 220, 93, 11, 38, 24, 5, 222, 170, 11, + 38, 24, 221, 209, 245, 140, 11, 38, 24, 242, 245, 93, 11, 38, 24, 212, + 24, 93, 11, 38, 24, 232, 15, 93, 11, 38, 24, 221, 79, 93, 11, 38, 24, + 218, 211, 93, 11, 38, 24, 221, 54, 93, 11, 38, 24, 35, 6, 252, 144, 11, + 38, 24, 35, 6, 250, 8, 11, 38, 24, 35, 6, 240, 215, 11, 38, 24, 35, 6, + 245, 227, 11, 38, 24, 35, 6, 242, 244, 11, 38, 24, 35, 6, 205, 84, 11, + 38, 24, 35, 6, 242, 201, 11, 38, 24, 35, 6, 212, 23, 11, 38, 24, 35, 6, + 232, 249, 11, 38, 24, 35, 6, 232, 14, 11, 38, 24, 35, 6, 230, 102, 11, + 38, 24, 35, 6, 226, 114, 11, 38, 24, 35, 6, 223, 217, 11, 38, 24, 35, 6, + 206, 169, 11, 38, 24, 35, 6, 222, 168, 11, 38, 24, 35, 6, 221, 53, 11, + 38, 24, 35, 6, 218, 210, 11, 38, 24, 35, 6, 212, 24, 93, 11, 38, 24, 35, + 6, 215, 63, 11, 38, 24, 35, 6, 212, 151, 11, 38, 24, 35, 6, 209, 200, 11, + 38, 24, 35, 6, 221, 78, 11, 38, 24, 35, 6, 248, 58, 11, 38, 24, 35, 6, + 220, 93, 11, 38, 24, 35, 6, 222, 170, 11, 38, 24, 35, 225, 227, 11, 38, + 24, 35, 5, 252, 144, 11, 38, 24, 35, 5, 250, 8, 11, 38, 24, 35, 5, 240, + 215, 11, 38, 24, 35, 5, 245, 227, 11, 38, 24, 35, 5, 242, 244, 11, 38, + 24, 35, 5, 205, 84, 11, 38, 24, 35, 5, 242, 201, 11, 38, 24, 35, 5, 212, + 23, 11, 38, 24, 35, 5, 232, 249, 11, 38, 24, 35, 5, 232, 14, 11, 38, 24, + 35, 5, 230, 102, 11, 38, 24, 35, 5, 226, 114, 11, 38, 24, 35, 5, 223, + 217, 11, 38, 24, 35, 5, 206, 169, 11, 38, 24, 35, 5, 222, 168, 11, 38, + 24, 35, 5, 221, 53, 11, 38, 24, 35, 5, 218, 210, 11, 38, 24, 35, 5, 42, + 215, 63, 11, 38, 24, 35, 5, 215, 63, 11, 38, 24, 35, 5, 212, 151, 11, 38, + 24, 35, 5, 209, 200, 11, 38, 24, 35, 5, 221, 78, 11, 38, 24, 35, 5, 248, + 58, 11, 38, 24, 35, 5, 220, 93, 11, 38, 24, 35, 5, 222, 170, 11, 38, 24, + 35, 221, 209, 245, 140, 11, 38, 24, 35, 242, 245, 93, 11, 38, 24, 35, + 212, 24, 93, 11, 38, 24, 35, 232, 15, 93, 11, 38, 24, 35, 221, 79, 93, + 11, 38, 24, 35, 218, 211, 93, 11, 38, 24, 35, 221, 54, 93, 11, 24, 6, + 245, 134, 11, 24, 5, 245, 134, 11, 24, 18, 205, 85, 11, 24, 18, 102, 11, + 24, 18, 105, 11, 24, 18, 142, 11, 24, 18, 139, 11, 24, 18, 168, 11, 24, + 18, 184, 11, 24, 18, 195, 11, 24, 18, 193, 11, 24, 18, 200, 11, 159, 18, + 205, 85, 11, 159, 18, 102, 11, 159, 18, 105, 11, 159, 18, 142, 11, 159, + 18, 139, 11, 159, 18, 168, 11, 159, 18, 184, 11, 159, 18, 195, 11, 159, + 18, 193, 11, 159, 18, 200, 11, 38, 18, 205, 85, 11, 38, 18, 102, 11, 38, + 18, 105, 11, 38, 18, 142, 11, 38, 18, 139, 11, 38, 18, 168, 11, 38, 18, + 184, 11, 38, 18, 195, 11, 38, 18, 193, 11, 38, 18, 200, 11, 38, 24, 18, + 205, 85, 11, 38, 24, 18, 102, 11, 38, 24, 18, 105, 11, 38, 24, 18, 142, + 11, 38, 24, 18, 139, 11, 38, 24, 18, 168, 11, 38, 24, 18, 184, 11, 38, + 24, 18, 195, 11, 38, 24, 18, 193, 11, 38, 24, 18, 200, 11, 226, 156, 18, + 205, 85, 11, 226, 156, 18, 102, 11, 226, 156, 18, 105, 11, 226, 156, 18, + 142, 11, 226, 156, 18, 139, 11, 226, 156, 18, 168, 11, 226, 156, 18, 184, + 11, 226, 156, 18, 195, 11, 226, 156, 18, 193, 11, 226, 156, 18, 200, 70, + 69, 4, 229, 27, 231, 123, 70, 69, 4, 229, 23, 172, 70, 69, 4, 229, 21, + 230, 236, 70, 69, 4, 228, 153, 231, 221, 70, 69, 4, 228, 123, 231, 224, + 70, 69, 4, 228, 142, 231, 33, 70, 69, 4, 228, 170, 231, 53, 70, 69, 4, + 228, 39, 230, 230, 70, 69, 4, 229, 18, 207, 20, 70, 69, 4, 229, 16, 207, + 96, 70, 69, 4, 229, 14, 206, 216, 70, 69, 4, 228, 92, 207, 45, 70, 69, 4, + 228, 100, 207, 51, 70, 69, 4, 228, 104, 206, 238, 70, 69, 4, 228, 173, + 206, 250, 70, 69, 4, 228, 24, 206, 212, 70, 69, 4, 228, 75, 207, 43, 70, + 69, 4, 228, 157, 206, 200, 70, 69, 4, 228, 169, 206, 202, 70, 69, 4, 228, + 79, 206, 201, 70, 69, 4, 229, 12, 226, 209, 70, 69, 4, 229, 10, 227, 221, + 70, 69, 4, 229, 8, 226, 89, 70, 69, 4, 228, 159, 227, 83, 70, 69, 4, 228, + 124, 226, 168, 70, 69, 4, 228, 64, 226, 111, 70, 69, 4, 228, 29, 226, + 105, 70, 69, 4, 229, 6, 249, 244, 70, 69, 4, 229, 3, 250, 183, 70, 69, 4, + 229, 1, 249, 101, 70, 69, 4, 228, 68, 250, 50, 70, 69, 4, 228, 121, 250, + 61, 70, 69, 4, 228, 115, 249, 172, 70, 69, 4, 228, 80, 249, 184, 70, 69, + 4, 228, 247, 74, 70, 69, 4, 228, 245, 62, 70, 69, 4, 228, 243, 71, 70, + 69, 4, 228, 55, 243, 104, 70, 69, 4, 228, 118, 75, 70, 69, 4, 228, 53, + 222, 152, 70, 69, 4, 228, 71, 76, 70, 69, 4, 228, 81, 243, 90, 70, 69, 4, + 228, 87, 233, 68, 70, 69, 4, 228, 83, 233, 68, 70, 69, 4, 228, 23, 252, + 122, 70, 69, 4, 228, 40, 243, 41, 70, 69, 4, 228, 232, 215, 80, 70, 69, + 4, 228, 230, 217, 199, 70, 69, 4, 228, 228, 213, 203, 70, 69, 4, 228, 56, + 217, 74, 70, 69, 4, 228, 102, 217, 86, 70, 69, 4, 228, 82, 214, 174, 70, + 69, 4, 228, 139, 214, 193, 70, 69, 4, 228, 22, 215, 79, 70, 69, 4, 228, + 218, 229, 235, 70, 69, 4, 228, 216, 230, 141, 70, 69, 4, 228, 214, 229, + 81, 70, 69, 4, 228, 134, 230, 50, 70, 69, 4, 228, 145, 230, 58, 70, 69, + 4, 228, 164, 229, 115, 70, 69, 4, 228, 65, 229, 144, 70, 69, 4, 228, 108, + 152, 230, 58, 70, 69, 4, 228, 240, 245, 168, 70, 69, 4, 228, 237, 246, + 145, 70, 69, 4, 228, 234, 243, 237, 70, 69, 4, 228, 129, 245, 251, 70, + 69, 4, 228, 38, 245, 28, 70, 69, 4, 228, 37, 245, 51, 70, 69, 4, 228, + 226, 211, 211, 70, 69, 4, 228, 223, 212, 219, 70, 69, 4, 228, 221, 210, + 170, 70, 69, 4, 228, 127, 212, 120, 70, 69, 4, 228, 163, 212, 131, 70, + 69, 4, 228, 114, 211, 105, 70, 69, 4, 228, 149, 124, 70, 69, 4, 228, 212, + 232, 162, 70, 69, 4, 228, 209, 232, 200, 70, 69, 4, 228, 207, 232, 104, + 70, 69, 4, 228, 61, 232, 180, 70, 69, 4, 228, 105, 232, 182, 70, 69, 4, + 228, 58, 232, 113, 70, 69, 4, 228, 155, 232, 122, 70, 69, 4, 228, 43, + 152, 232, 122, 70, 69, 4, 228, 205, 206, 11, 70, 69, 4, 228, 202, 190, + 70, 69, 4, 228, 200, 205, 213, 70, 69, 4, 228, 109, 206, 49, 70, 69, 4, + 228, 138, 206, 52, 70, 69, 4, 228, 77, 205, 232, 70, 69, 4, 228, 97, 205, + 247, 70, 69, 4, 228, 196, 241, 250, 70, 69, 4, 228, 194, 242, 73, 70, 69, + 4, 228, 192, 241, 88, 70, 69, 4, 228, 140, 242, 21, 70, 69, 4, 228, 143, + 242, 28, 70, 69, 4, 228, 85, 241, 151, 70, 69, 4, 228, 130, 241, 162, 70, + 69, 4, 228, 21, 241, 87, 70, 69, 4, 228, 117, 242, 47, 70, 69, 4, 228, + 190, 224, 199, 70, 69, 4, 228, 188, 225, 209, 70, 69, 4, 228, 186, 223, + 173, 70, 69, 4, 228, 101, 225, 101, 70, 69, 4, 228, 49, 224, 61, 70, 69, + 4, 228, 42, 239, 11, 70, 69, 4, 228, 181, 155, 70, 69, 4, 228, 32, 238, + 42, 70, 69, 4, 228, 184, 239, 53, 70, 69, 4, 228, 122, 239, 71, 70, 69, + 4, 228, 179, 238, 131, 70, 69, 4, 228, 78, 238, 149, 70, 69, 4, 228, 135, + 239, 52, 70, 69, 4, 228, 90, 238, 125, 70, 69, 4, 228, 165, 238, 246, 70, + 69, 4, 228, 88, 239, 110, 70, 69, 4, 228, 131, 238, 31, 70, 69, 4, 228, + 166, 239, 41, 70, 69, 4, 228, 25, 238, 134, 70, 69, 4, 228, 172, 238, 41, + 70, 69, 4, 228, 128, 225, 42, 70, 69, 4, 228, 177, 225, 56, 70, 69, 4, + 228, 136, 225, 39, 70, 69, 4, 228, 103, 225, 50, 70, 69, 4, 228, 72, 225, + 51, 70, 69, 4, 228, 62, 225, 40, 70, 69, 4, 228, 98, 225, 41, 70, 69, 4, + 228, 59, 225, 55, 70, 69, 4, 228, 91, 225, 38, 70, 69, 4, 228, 132, 152, + 225, 51, 70, 69, 4, 228, 112, 152, 225, 40, 70, 69, 4, 228, 35, 152, 225, + 41, 70, 69, 4, 228, 63, 240, 61, 70, 69, 4, 228, 107, 240, 244, 70, 69, + 4, 228, 50, 239, 213, 70, 69, 4, 228, 28, 240, 162, 70, 69, 4, 228, 52, + 239, 199, 70, 69, 4, 228, 51, 239, 209, 70, 69, 4, 228, 34, 225, 61, 70, + 69, 4, 228, 161, 224, 254, 70, 69, 4, 228, 41, 224, 243, 70, 69, 4, 228, + 150, 221, 53, 70, 69, 4, 228, 119, 179, 70, 69, 4, 228, 168, 220, 82, 70, + 69, 4, 228, 137, 221, 164, 70, 69, 4, 228, 167, 221, 174, 70, 69, 4, 228, + 116, 220, 187, 70, 69, 4, 228, 152, 220, 211, 70, 69, 4, 228, 73, 227, + 138, 70, 69, 4, 228, 156, 227, 153, 70, 69, 4, 228, 96, 227, 132, 70, 69, + 4, 228, 171, 227, 145, 70, 69, 4, 228, 30, 227, 145, 70, 69, 4, 228, 146, + 227, 146, 70, 69, 4, 228, 46, 227, 133, 70, 69, 4, 228, 44, 227, 134, 70, + 69, 4, 228, 31, 227, 126, 70, 69, 4, 228, 57, 152, 227, 146, 70, 69, 4, + 228, 113, 152, 227, 133, 70, 69, 4, 228, 76, 152, 227, 134, 70, 69, 4, + 228, 86, 231, 7, 70, 69, 4, 228, 126, 231, 15, 70, 69, 4, 228, 144, 231, + 3, 70, 69, 4, 228, 175, 231, 10, 70, 69, 4, 228, 110, 231, 11, 70, 69, 4, + 228, 106, 231, 5, 70, 69, 4, 228, 60, 231, 6, 70, 69, 4, 228, 94, 240, + 179, 70, 69, 4, 228, 162, 240, 187, 70, 69, 4, 228, 70, 240, 174, 70, 69, + 4, 228, 125, 240, 183, 70, 69, 4, 228, 111, 240, 184, 70, 69, 4, 228, + 147, 240, 175, 70, 69, 4, 228, 148, 240, 177, 70, 69, 4, 228, 47, 219, + 113, 70, 69, 4, 228, 95, 225, 136, 70, 69, 4, 228, 89, 225, 151, 70, 69, + 4, 228, 93, 225, 118, 70, 69, 4, 228, 27, 225, 142, 70, 69, 4, 228, 99, + 225, 143, 70, 69, 4, 228, 151, 225, 123, 70, 69, 4, 228, 154, 225, 127, + 70, 69, 4, 228, 66, 224, 180, 70, 69, 4, 228, 26, 224, 150, 70, 69, 4, + 228, 69, 224, 171, 70, 69, 4, 228, 84, 224, 154, 70, 69, 4, 228, 36, 208, + 214, 70, 69, 4, 228, 33, 209, 70, 70, 69, 4, 228, 67, 207, 148, 70, 69, + 4, 228, 45, 209, 34, 70, 69, 4, 228, 133, 209, 39, 70, 69, 4, 228, 74, + 208, 161, 70, 69, 4, 228, 141, 208, 173, 70, 69, 4, 228, 54, 223, 119, + 70, 69, 4, 228, 160, 223, 138, 70, 69, 4, 228, 48, 223, 101, 70, 69, 4, + 228, 120, 223, 130, 70, 69, 4, 228, 158, 223, 108, 70, 69, 18, 102, 70, + 69, 18, 105, 70, 69, 18, 142, 70, 69, 18, 139, 70, 69, 18, 168, 70, 69, + 18, 184, 70, 69, 18, 195, 70, 69, 18, 193, 70, 69, 18, 200, 70, 69, 36, + 43, 212, 118, 70, 69, 36, 43, 212, 93, 70, 69, 36, 43, 238, 28, 70, 69, + 36, 43, 211, 240, 70, 69, 36, 43, 212, 99, 211, 240, 70, 69, 36, 43, 238, + 30, 211, 240, 70, 69, 36, 43, 226, 212, 8, 11, 252, 172, 8, 11, 250, 38, + 8, 11, 232, 179, 8, 11, 246, 117, 8, 11, 207, 59, 8, 11, 205, 108, 8, 11, + 239, 132, 8, 11, 212, 194, 8, 11, 206, 47, 8, 11, 232, 45, 8, 11, 230, + 106, 8, 11, 227, 104, 8, 11, 224, 54, 8, 11, 217, 70, 8, 11, 252, 200, 8, + 11, 242, 15, 8, 11, 217, 191, 8, 11, 220, 12, 8, 11, 219, 16, 8, 11, 215, + 210, 8, 11, 212, 115, 8, 11, 212, 37, 8, 11, 231, 163, 8, 11, 212, 49, 8, + 11, 246, 140, 8, 11, 205, 111, 8, 11, 240, 94, 8, 11, 245, 22, 250, 38, + 8, 11, 245, 22, 224, 54, 8, 11, 245, 22, 242, 15, 8, 11, 245, 22, 220, + 12, 8, 11, 78, 250, 38, 8, 11, 78, 232, 179, 8, 11, 78, 239, 50, 8, 11, + 78, 239, 132, 8, 11, 78, 206, 47, 8, 11, 78, 232, 45, 8, 11, 78, 230, + 106, 8, 11, 78, 227, 104, 8, 11, 78, 224, 54, 8, 11, 78, 217, 70, 8, 11, + 78, 252, 200, 8, 11, 78, 242, 15, 8, 11, 78, 217, 191, 8, 11, 78, 220, + 12, 8, 11, 78, 215, 210, 8, 11, 78, 212, 115, 8, 11, 78, 212, 37, 8, 11, + 78, 231, 163, 8, 11, 78, 246, 140, 8, 11, 78, 240, 94, 8, 11, 212, 190, + 232, 179, 8, 11, 212, 190, 239, 132, 8, 11, 212, 190, 206, 47, 8, 11, + 212, 190, 230, 106, 8, 11, 212, 190, 224, 54, 8, 11, 212, 190, 217, 70, + 8, 11, 212, 190, 252, 200, 8, 11, 212, 190, 217, 191, 8, 11, 212, 190, + 220, 12, 8, 11, 212, 190, 215, 210, 8, 11, 212, 190, 231, 163, 8, 11, + 212, 190, 246, 140, 8, 11, 212, 190, 240, 94, 8, 11, 212, 190, 245, 22, + 224, 54, 8, 11, 212, 190, 245, 22, 220, 12, 8, 11, 213, 232, 250, 38, 8, + 11, 213, 232, 232, 179, 8, 11, 213, 232, 239, 50, 8, 11, 213, 232, 239, + 132, 8, 11, 213, 232, 212, 194, 8, 11, 213, 232, 206, 47, 8, 11, 213, + 232, 232, 45, 8, 11, 213, 232, 227, 104, 8, 11, 213, 232, 224, 54, 8, 11, + 213, 232, 217, 70, 8, 11, 213, 232, 252, 200, 8, 11, 213, 232, 242, 15, + 8, 11, 213, 232, 217, 191, 8, 11, 213, 232, 220, 12, 8, 11, 213, 232, + 215, 210, 8, 11, 213, 232, 212, 115, 8, 11, 213, 232, 212, 37, 8, 11, + 213, 232, 231, 163, 8, 11, 213, 232, 246, 140, 8, 11, 213, 232, 205, 111, + 8, 11, 213, 232, 240, 94, 8, 11, 213, 232, 245, 22, 250, 38, 8, 11, 213, + 232, 245, 22, 242, 15, 8, 11, 229, 110, 252, 172, 8, 11, 229, 110, 250, + 38, 8, 11, 229, 110, 232, 179, 8, 11, 229, 110, 246, 117, 8, 11, 229, + 110, 239, 50, 8, 11, 229, 110, 207, 59, 8, 11, 229, 110, 205, 108, 8, 11, + 229, 110, 239, 132, 8, 11, 229, 110, 212, 194, 8, 11, 229, 110, 206, 47, + 8, 11, 229, 110, 230, 106, 8, 11, 229, 110, 227, 104, 8, 11, 229, 110, + 224, 54, 8, 11, 229, 110, 217, 70, 8, 11, 229, 110, 252, 200, 8, 11, 229, + 110, 242, 15, 8, 11, 229, 110, 217, 191, 8, 11, 229, 110, 220, 12, 8, 11, + 229, 110, 219, 16, 8, 11, 229, 110, 215, 210, 8, 11, 229, 110, 212, 115, + 8, 11, 229, 110, 212, 37, 8, 11, 229, 110, 231, 163, 8, 11, 229, 110, + 212, 49, 8, 11, 229, 110, 246, 140, 8, 11, 229, 110, 205, 111, 8, 11, + 229, 110, 240, 94, 8, 11, 159, 250, 38, 8, 11, 159, 232, 179, 8, 11, 159, + 246, 117, 8, 11, 159, 207, 59, 8, 11, 159, 205, 108, 8, 11, 159, 239, + 132, 8, 11, 159, 212, 194, 8, 11, 159, 206, 47, 8, 11, 159, 230, 106, 8, + 11, 159, 227, 104, 8, 11, 159, 224, 54, 8, 11, 159, 217, 70, 8, 11, 159, + 252, 200, 8, 11, 159, 242, 15, 8, 11, 159, 217, 191, 8, 11, 159, 220, 12, + 8, 11, 159, 219, 16, 8, 11, 159, 215, 210, 8, 11, 159, 212, 115, 8, 11, + 159, 212, 37, 8, 11, 159, 231, 163, 8, 11, 159, 212, 49, 8, 11, 159, 246, + 140, 8, 11, 159, 205, 111, 8, 11, 159, 240, 94, 8, 11, 222, 133, 80, 2, + 140, 2, 212, 153, 8, 11, 222, 133, 140, 2, 246, 117, 227, 241, 94, 243, + 117, 207, 9, 227, 241, 94, 188, 207, 9, 227, 241, 94, 207, 36, 207, 9, + 227, 241, 94, 143, 207, 9, 227, 241, 94, 219, 32, 243, 255, 227, 241, 94, + 239, 227, 243, 255, 227, 241, 94, 59, 243, 255, 227, 241, 94, 119, 73, + 248, 93, 227, 241, 94, 118, 73, 248, 93, 227, 241, 94, 129, 73, 248, 93, + 227, 241, 94, 241, 125, 73, 248, 93, 227, 241, 94, 241, 204, 73, 248, 93, + 227, 241, 94, 215, 10, 73, 248, 93, 227, 241, 94, 216, 23, 73, 248, 93, + 227, 241, 94, 243, 88, 73, 248, 93, 227, 241, 94, 224, 195, 73, 248, 93, + 227, 241, 94, 119, 73, 250, 141, 227, 241, 94, 118, 73, 250, 141, 227, + 241, 94, 129, 73, 250, 141, 227, 241, 94, 241, 125, 73, 250, 141, 227, + 241, 94, 241, 204, 73, 250, 141, 227, 241, 94, 215, 10, 73, 250, 141, + 227, 241, 94, 216, 23, 73, 250, 141, 227, 241, 94, 243, 88, 73, 250, 141, + 227, 241, 94, 224, 195, 73, 250, 141, 227, 241, 94, 119, 73, 247, 232, + 227, 241, 94, 118, 73, 247, 232, 227, 241, 94, 129, 73, 247, 232, 227, + 241, 94, 241, 125, 73, 247, 232, 227, 241, 94, 241, 204, 73, 247, 232, + 227, 241, 94, 215, 10, 73, 247, 232, 227, 241, 94, 216, 23, 73, 247, 232, + 227, 241, 94, 243, 88, 73, 247, 232, 227, 241, 94, 224, 195, 73, 247, + 232, 227, 241, 94, 220, 221, 227, 241, 94, 222, 120, 227, 241, 94, 250, + 142, 227, 241, 94, 248, 15, 227, 241, 94, 214, 113, 227, 241, 94, 213, + 156, 227, 241, 94, 251, 171, 227, 241, 94, 207, 1, 227, 241, 94, 232, + 116, 227, 241, 94, 250, 176, 151, 94, 194, 250, 176, 151, 94, 238, 120, + 151, 94, 238, 119, 151, 94, 238, 118, 151, 94, 238, 117, 151, 94, 238, + 116, 151, 94, 238, 115, 151, 94, 238, 114, 151, 94, 238, 113, 151, 94, + 238, 112, 151, 94, 238, 111, 151, 94, 238, 110, 151, 94, 238, 109, 151, + 94, 238, 108, 151, 94, 238, 107, 151, 94, 238, 106, 151, 94, 238, 105, + 151, 94, 238, 104, 151, 94, 238, 103, 151, 94, 238, 102, 151, 94, 238, + 101, 151, 94, 238, 100, 151, 94, 238, 99, 151, 94, 238, 98, 151, 94, 238, + 97, 151, 94, 238, 96, 151, 94, 238, 95, 151, 94, 238, 94, 151, 94, 238, + 93, 151, 94, 238, 92, 151, 94, 238, 91, 151, 94, 238, 90, 151, 94, 238, + 89, 151, 94, 238, 88, 151, 94, 238, 87, 151, 94, 238, 86, 151, 94, 238, + 85, 151, 94, 238, 84, 151, 94, 238, 83, 151, 94, 238, 82, 151, 94, 238, + 81, 151, 94, 238, 80, 151, 94, 238, 79, 151, 94, 238, 78, 151, 94, 238, + 77, 151, 94, 238, 76, 151, 94, 238, 75, 151, 94, 238, 74, 151, 94, 238, + 73, 151, 94, 238, 72, 151, 94, 79, 250, 176, 151, 94, 209, 21, 151, 94, + 209, 20, 151, 94, 209, 19, 151, 94, 209, 18, 151, 94, 209, 17, 151, 94, + 209, 16, 151, 94, 209, 15, 151, 94, 209, 14, 151, 94, 209, 13, 151, 94, + 209, 12, 151, 94, 209, 11, 151, 94, 209, 10, 151, 94, 209, 9, 151, 94, + 209, 8, 151, 94, 209, 7, 151, 94, 209, 6, 151, 94, 209, 5, 151, 94, 209, + 4, 151, 94, 209, 3, 151, 94, 209, 2, 151, 94, 209, 1, 151, 94, 209, 0, + 151, 94, 208, 255, 151, 94, 208, 254, 151, 94, 208, 253, 151, 94, 208, + 252, 151, 94, 208, 251, 151, 94, 208, 250, 151, 94, 208, 249, 151, 94, + 208, 248, 151, 94, 208, 247, 151, 94, 208, 246, 151, 94, 208, 245, 151, + 94, 208, 244, 151, 94, 208, 243, 151, 94, 208, 242, 151, 94, 208, 241, + 151, 94, 208, 240, 151, 94, 208, 239, 151, 94, 208, 238, 151, 94, 208, + 237, 151, 94, 208, 236, 151, 94, 208, 235, 151, 94, 208, 234, 151, 94, + 208, 233, 151, 94, 208, 232, 151, 94, 208, 231, 151, 94, 208, 230, 151, + 94, 208, 229, 220, 230, 191, 250, 176, 220, 230, 191, 253, 15, 73, 214, + 150, 220, 230, 191, 118, 73, 214, 150, 220, 230, 191, 129, 73, 214, 150, + 220, 230, 191, 241, 125, 73, 214, 150, 220, 230, 191, 241, 204, 73, 214, + 150, 220, 230, 191, 215, 10, 73, 214, 150, 220, 230, 191, 216, 23, 73, + 214, 150, 220, 230, 191, 243, 88, 73, 214, 150, 220, 230, 191, 224, 195, + 73, 214, 150, 220, 230, 191, 212, 99, 73, 214, 150, 220, 230, 191, 232, + 198, 73, 214, 150, 220, 230, 191, 231, 57, 73, 214, 150, 220, 230, 191, + 219, 198, 73, 214, 150, 220, 230, 191, 231, 107, 73, 214, 150, 220, 230, + 191, 253, 15, 73, 239, 58, 220, 230, 191, 118, 73, 239, 58, 220, 230, + 191, 129, 73, 239, 58, 220, 230, 191, 241, 125, 73, 239, 58, 220, 230, + 191, 241, 204, 73, 239, 58, 220, 230, 191, 215, 10, 73, 239, 58, 220, + 230, 191, 216, 23, 73, 239, 58, 220, 230, 191, 243, 88, 73, 239, 58, 220, + 230, 191, 224, 195, 73, 239, 58, 220, 230, 191, 212, 99, 73, 239, 58, + 220, 230, 191, 232, 198, 73, 239, 58, 220, 230, 191, 231, 57, 73, 239, + 58, 220, 230, 191, 219, 198, 73, 239, 58, 220, 230, 191, 231, 107, 73, + 239, 58, 220, 230, 191, 219, 32, 232, 116, 220, 230, 191, 253, 15, 73, + 245, 155, 220, 230, 191, 118, 73, 245, 155, 220, 230, 191, 129, 73, 245, + 155, 220, 230, 191, 241, 125, 73, 245, 155, 220, 230, 191, 241, 204, 73, + 245, 155, 220, 230, 191, 215, 10, 73, 245, 155, 220, 230, 191, 216, 23, + 73, 245, 155, 220, 230, 191, 243, 88, 73, 245, 155, 220, 230, 191, 224, + 195, 73, 245, 155, 220, 230, 191, 212, 99, 73, 245, 155, 220, 230, 191, + 232, 198, 73, 245, 155, 220, 230, 191, 231, 57, 73, 245, 155, 220, 230, + 191, 219, 198, 73, 245, 155, 220, 230, 191, 231, 107, 73, 245, 155, 220, + 230, 191, 60, 232, 116, 220, 230, 191, 253, 15, 73, 247, 178, 220, 230, + 191, 118, 73, 247, 178, 220, 230, 191, 129, 73, 247, 178, 220, 230, 191, + 241, 125, 73, 247, 178, 220, 230, 191, 241, 204, 73, 247, 178, 220, 230, + 191, 215, 10, 73, 247, 178, 220, 230, 191, 216, 23, 73, 247, 178, 220, + 230, 191, 243, 88, 73, 247, 178, 220, 230, 191, 224, 195, 73, 247, 178, + 220, 230, 191, 212, 99, 73, 247, 178, 220, 230, 191, 232, 198, 73, 247, + 178, 220, 230, 191, 231, 57, 73, 247, 178, 220, 230, 191, 219, 198, 73, + 247, 178, 220, 230, 191, 231, 107, 73, 247, 178, 220, 230, 191, 59, 232, + 116, 220, 230, 191, 241, 149, 220, 230, 191, 211, 15, 220, 230, 191, 211, + 4, 220, 230, 191, 211, 1, 220, 230, 191, 211, 0, 220, 230, 191, 210, 255, + 220, 230, 191, 210, 254, 220, 230, 191, 210, 253, 220, 230, 191, 210, + 252, 220, 230, 191, 210, 251, 220, 230, 191, 211, 14, 220, 230, 191, 211, + 13, 220, 230, 191, 211, 12, 220, 230, 191, 211, 11, 220, 230, 191, 211, + 10, 220, 230, 191, 211, 9, 220, 230, 191, 211, 8, 220, 230, 191, 211, 7, + 220, 230, 191, 211, 6, 220, 230, 191, 211, 5, 220, 230, 191, 211, 3, 220, + 230, 191, 211, 2, 18, 205, 86, 241, 82, 213, 251, 18, 205, 86, 247, 155, + 18, 119, 247, 155, 18, 118, 247, 155, 18, 129, 247, 155, 18, 241, 125, + 247, 155, 18, 241, 204, 247, 155, 18, 215, 10, 247, 155, 18, 216, 23, + 247, 155, 18, 243, 88, 247, 155, 18, 224, 195, 247, 155, 245, 111, 39, + 38, 18, 205, 85, 245, 111, 170, 39, 38, 18, 205, 85, 97, 7, 6, 1, 62, 97, + 7, 6, 1, 251, 150, 97, 7, 6, 1, 249, 34, 97, 7, 6, 1, 246, 240, 97, 7, 6, + 1, 75, 97, 7, 6, 1, 242, 139, 97, 7, 6, 1, 241, 55, 97, 7, 6, 1, 239, + 155, 97, 7, 6, 1, 74, 97, 7, 6, 1, 232, 203, 97, 7, 6, 1, 232, 76, 97, 7, + 6, 1, 149, 97, 7, 6, 1, 229, 28, 97, 7, 6, 1, 226, 33, 97, 7, 6, 1, 76, + 97, 7, 6, 1, 222, 67, 97, 7, 6, 1, 220, 27, 97, 7, 6, 1, 137, 97, 7, 6, + 1, 182, 97, 7, 6, 1, 213, 10, 97, 7, 6, 1, 71, 97, 7, 6, 1, 209, 148, 97, + 7, 6, 1, 207, 129, 97, 7, 6, 1, 206, 195, 97, 7, 6, 1, 206, 123, 97, 7, + 6, 1, 205, 159, 211, 93, 215, 204, 249, 133, 7, 6, 1, 182, 39, 35, 7, 6, + 1, 249, 34, 39, 35, 7, 6, 1, 137, 39, 248, 149, 39, 206, 197, 98, 7, 6, + 1, 62, 98, 7, 6, 1, 251, 150, 98, 7, 6, 1, 249, 34, 98, 7, 6, 1, 246, + 240, 98, 7, 6, 1, 75, 98, 7, 6, 1, 242, 139, 98, 7, 6, 1, 241, 55, 98, 7, + 6, 1, 239, 155, 98, 7, 6, 1, 74, 98, 7, 6, 1, 232, 203, 98, 7, 6, 1, 232, + 76, 98, 7, 6, 1, 149, 98, 7, 6, 1, 229, 28, 98, 7, 6, 1, 226, 33, 98, 7, + 6, 1, 76, 98, 7, 6, 1, 222, 67, 98, 7, 6, 1, 220, 27, 98, 7, 6, 1, 137, + 98, 7, 6, 1, 182, 98, 7, 6, 1, 213, 10, 98, 7, 6, 1, 71, 98, 7, 6, 1, + 209, 148, 98, 7, 6, 1, 207, 129, 98, 7, 6, 1, 206, 195, 98, 7, 6, 1, 206, + 123, 98, 7, 6, 1, 205, 159, 98, 238, 17, 98, 226, 57, 98, 217, 88, 98, + 214, 99, 98, 220, 155, 98, 207, 52, 170, 39, 7, 6, 1, 62, 170, 39, 7, 6, + 1, 251, 150, 170, 39, 7, 6, 1, 249, 34, 170, 39, 7, 6, 1, 246, 240, 170, + 39, 7, 6, 1, 75, 170, 39, 7, 6, 1, 242, 139, 170, 39, 7, 6, 1, 241, 55, + 170, 39, 7, 6, 1, 239, 155, 170, 39, 7, 6, 1, 74, 170, 39, 7, 6, 1, 232, + 203, 170, 39, 7, 6, 1, 232, 76, 170, 39, 7, 6, 1, 149, 170, 39, 7, 6, 1, + 229, 28, 170, 39, 7, 6, 1, 226, 33, 170, 39, 7, 6, 1, 76, 170, 39, 7, 6, + 1, 222, 67, 170, 39, 7, 6, 1, 220, 27, 170, 39, 7, 6, 1, 137, 170, 39, 7, + 6, 1, 182, 170, 39, 7, 6, 1, 213, 10, 170, 39, 7, 6, 1, 71, 170, 39, 7, + 6, 1, 209, 148, 170, 39, 7, 6, 1, 207, 129, 170, 39, 7, 6, 1, 206, 195, + 170, 39, 7, 6, 1, 206, 123, 170, 39, 7, 6, 1, 205, 159, 219, 81, 227, + 125, 53, 219, 81, 227, 122, 53, 170, 98, 7, 6, 1, 62, 170, 98, 7, 6, 1, + 251, 150, 170, 98, 7, 6, 1, 249, 34, 170, 98, 7, 6, 1, 246, 240, 170, 98, + 7, 6, 1, 75, 170, 98, 7, 6, 1, 242, 139, 170, 98, 7, 6, 1, 241, 55, 170, + 98, 7, 6, 1, 239, 155, 170, 98, 7, 6, 1, 74, 170, 98, 7, 6, 1, 232, 203, + 170, 98, 7, 6, 1, 232, 76, 170, 98, 7, 6, 1, 149, 170, 98, 7, 6, 1, 229, + 28, 170, 98, 7, 6, 1, 226, 33, 170, 98, 7, 6, 1, 76, 170, 98, 7, 6, 1, + 222, 67, 170, 98, 7, 6, 1, 220, 27, 170, 98, 7, 6, 1, 137, 170, 98, 7, 6, + 1, 182, 170, 98, 7, 6, 1, 213, 10, 170, 98, 7, 6, 1, 71, 170, 98, 7, 6, + 1, 209, 148, 170, 98, 7, 6, 1, 207, 129, 170, 98, 7, 6, 1, 206, 195, 170, + 98, 7, 6, 1, 206, 123, 170, 98, 7, 6, 1, 205, 159, 247, 57, 170, 98, 7, + 6, 1, 222, 67, 170, 98, 237, 183, 170, 98, 179, 170, 98, 217, 199, 170, + 98, 253, 115, 170, 98, 207, 52, 49, 245, 70, 98, 247, 218, 98, 247, 101, + 98, 241, 107, 98, 237, 174, 98, 225, 87, 98, 225, 79, 98, 222, 185, 98, + 214, 169, 98, 120, 2, 242, 168, 83, 98, 208, 151, 219, 24, 233, 50, 16, + 1, 62, 219, 24, 233, 50, 16, 1, 251, 150, 219, 24, 233, 50, 16, 1, 249, + 34, 219, 24, 233, 50, 16, 1, 246, 240, 219, 24, 233, 50, 16, 1, 75, 219, + 24, 233, 50, 16, 1, 242, 139, 219, 24, 233, 50, 16, 1, 241, 55, 219, 24, + 233, 50, 16, 1, 239, 155, 219, 24, 233, 50, 16, 1, 74, 219, 24, 233, 50, + 16, 1, 232, 203, 219, 24, 233, 50, 16, 1, 232, 76, 219, 24, 233, 50, 16, + 1, 149, 219, 24, 233, 50, 16, 1, 229, 28, 219, 24, 233, 50, 16, 1, 226, + 33, 219, 24, 233, 50, 16, 1, 76, 219, 24, 233, 50, 16, 1, 222, 67, 219, + 24, 233, 50, 16, 1, 220, 27, 219, 24, 233, 50, 16, 1, 137, 219, 24, 233, + 50, 16, 1, 182, 219, 24, 233, 50, 16, 1, 213, 10, 219, 24, 233, 50, 16, + 1, 71, 219, 24, 233, 50, 16, 1, 209, 148, 219, 24, 233, 50, 16, 1, 207, + 129, 219, 24, 233, 50, 16, 1, 206, 195, 219, 24, 233, 50, 16, 1, 206, + 123, 219, 24, 233, 50, 16, 1, 205, 159, 49, 161, 238, 144, 98, 64, 231, + 41, 98, 64, 217, 199, 98, 10, 209, 220, 235, 119, 98, 10, 209, 220, 235, + 123, 98, 10, 209, 220, 235, 131, 98, 64, 246, 9, 98, 10, 209, 220, 235, + 138, 98, 10, 209, 220, 235, 125, 98, 10, 209, 220, 235, 97, 98, 10, 209, + 220, 235, 124, 98, 10, 209, 220, 235, 137, 98, 10, 209, 220, 235, 111, + 98, 10, 209, 220, 235, 104, 98, 10, 209, 220, 235, 113, 98, 10, 209, 220, + 235, 134, 98, 10, 209, 220, 235, 120, 98, 10, 209, 220, 235, 136, 98, 10, + 209, 220, 235, 112, 98, 10, 209, 220, 235, 135, 98, 10, 209, 220, 235, + 98, 98, 10, 209, 220, 235, 103, 98, 10, 209, 220, 235, 96, 98, 10, 209, + 220, 235, 126, 98, 10, 209, 220, 235, 128, 98, 10, 209, 220, 235, 106, + 98, 10, 209, 220, 235, 117, 98, 10, 209, 220, 235, 115, 98, 10, 209, 220, + 235, 141, 98, 10, 209, 220, 235, 140, 98, 10, 209, 220, 235, 94, 98, 10, + 209, 220, 235, 121, 98, 10, 209, 220, 235, 139, 98, 10, 209, 220, 235, + 130, 98, 10, 209, 220, 235, 116, 98, 10, 209, 220, 235, 95, 98, 10, 209, + 220, 235, 118, 98, 10, 209, 220, 235, 100, 98, 10, 209, 220, 235, 99, 98, + 10, 209, 220, 235, 129, 98, 10, 209, 220, 235, 107, 98, 10, 209, 220, + 235, 109, 98, 10, 209, 220, 235, 110, 98, 10, 209, 220, 235, 102, 98, 10, + 209, 220, 235, 133, 98, 10, 209, 220, 235, 127, 211, 93, 215, 204, 249, + 133, 10, 209, 220, 235, 108, 211, 93, 215, 204, 249, 133, 10, 209, 220, + 235, 140, 211, 93, 215, 204, 249, 133, 10, 209, 220, 235, 138, 211, 93, + 215, 204, 249, 133, 10, 209, 220, 235, 122, 211, 93, 215, 204, 249, 133, + 10, 209, 220, 235, 105, 211, 93, 215, 204, 249, 133, 10, 209, 220, 235, + 118, 211, 93, 215, 204, 249, 133, 10, 209, 220, 235, 101, 211, 93, 215, + 204, 249, 133, 10, 209, 220, 235, 132, 211, 93, 215, 204, 249, 133, 10, + 209, 220, 235, 114, 39, 175, 252, 250, 39, 175, 253, 19, 246, 251, 241, + 160, 247, 192, 209, 238, 224, 210, 2, 214, 23, 213, 149, 131, 226, 127, + 213, 148, 247, 222, 251, 200, 243, 213, 213, 147, 131, 249, 90, 219, 82, + 249, 116, 251, 200, 224, 209, 207, 70, 207, 64, 208, 165, 226, 217, 207, + 54, 243, 121, 240, 26, 242, 182, 243, 121, 240, 26, 252, 128, 243, 121, + 240, 26, 251, 218, 240, 26, 2, 227, 75, 186, 226, 145, 93, 207, 56, 247, + 66, 226, 145, 93, 241, 215, 219, 205, 226, 145, 93, 207, 56, 240, 57, + 226, 145, 93, 241, 82, 226, 145, 93, 207, 82, 240, 57, 226, 145, 93, 230, + 81, 219, 205, 226, 145, 93, 207, 82, 247, 66, 226, 145, 93, 247, 66, 226, + 144, 186, 226, 145, 2, 242, 67, 241, 215, 219, 205, 226, 145, 2, 242, 67, + 230, 81, 219, 205, 226, 145, 2, 242, 67, 241, 82, 226, 145, 2, 242, 67, + 213, 155, 2, 242, 67, 240, 24, 214, 26, 215, 149, 214, 26, 212, 29, 60, + 243, 244, 59, 213, 154, 59, 213, 155, 2, 5, 247, 183, 59, 213, 155, 250, + 35, 247, 183, 59, 213, 155, 250, 35, 247, 184, 2, 219, 83, 247, 184, 2, + 219, 83, 247, 184, 2, 214, 199, 247, 184, 2, 229, 220, 247, 184, 2, 211, + 94, 241, 161, 207, 10, 249, 188, 242, 67, 248, 64, 217, 72, 242, 176, + 211, 61, 246, 3, 211, 61, 222, 19, 211, 61, 248, 250, 238, 63, 221, 133, + 210, 160, 248, 67, 249, 190, 218, 101, 239, 10, 213, 152, 249, 190, 243, + 125, 73, 227, 230, 243, 125, 73, 218, 203, 239, 36, 241, 125, 230, 54, + 247, 182, 227, 203, 230, 53, 242, 51, 230, 53, 230, 54, 241, 167, 233, + 69, 207, 9, 226, 66, 211, 122, 251, 183, 239, 243, 227, 92, 207, 68, 212, + 169, 230, 23, 250, 137, 221, 6, 219, 32, 252, 50, 239, 227, 252, 50, 221, + 170, 221, 171, 248, 68, 213, 236, 239, 116, 214, 229, 73, 220, 242, 227, + 115, 222, 166, 249, 173, 220, 166, 230, 34, 218, 204, 247, 72, 218, 204, + 250, 149, 247, 104, 218, 203, 247, 22, 23, 218, 203, 214, 11, 249, 144, + 214, 149, 249, 127, 241, 106, 241, 102, 218, 120, 213, 105, 220, 168, + 246, 97, 222, 208, 213, 123, 241, 103, 215, 121, 241, 214, 248, 244, 2, + 213, 98, 245, 204, 214, 187, 237, 182, 247, 70, 215, 222, 237, 181, 237, + 182, 247, 70, 244, 11, 247, 103, 248, 30, 134, 248, 216, 229, 129, 247, + 14, 238, 133, 220, 170, 215, 133, 250, 18, 249, 140, 220, 171, 73, 241, + 150, 247, 102, 241, 140, 23, 231, 58, 212, 128, 206, 253, 239, 105, 217, + 176, 249, 156, 23, 247, 29, 207, 6, 240, 29, 247, 171, 240, 29, 211, 18, + 243, 249, 250, 46, 226, 103, 247, 199, 250, 46, 226, 102, 250, 179, 249, + 155, 241, 140, 23, 231, 59, 2, 220, 231, 218, 205, 206, 222, 220, 132, + 249, 216, 248, 243, 232, 197, 248, 22, 211, 61, 242, 36, 248, 21, 241, + 217, 241, 218, 214, 147, 250, 148, 221, 206, 220, 182, 247, 137, 250, + 149, 212, 173, 211, 61, 247, 57, 241, 190, 221, 7, 246, 0, 232, 189, 245, + 34, 248, 193, 213, 235, 207, 10, 248, 46, 226, 145, 208, 201, 248, 115, + 217, 104, 217, 131, 239, 248, 248, 213, 239, 61, 2, 211, 167, 222, 166, + 212, 42, 230, 46, 249, 149, 73, 241, 171, 226, 218, 227, 112, 219, 5, + 218, 205, 30, 231, 173, 2, 232, 196, 213, 208, 226, 251, 229, 254, 214, + 227, 247, 109, 231, 55, 250, 58, 251, 228, 30, 224, 32, 250, 58, 245, + 210, 30, 224, 32, 241, 231, 241, 111, 252, 253, 211, 205, 248, 194, 238, + 65, 242, 3, 207, 26, 218, 111, 247, 172, 241, 209, 220, 196, 23, 241, + 213, 226, 251, 226, 121, 248, 230, 247, 237, 239, 65, 251, 235, 222, 22, + 211, 102, 239, 86, 247, 226, 212, 92, 211, 206, 247, 213, 249, 181, 221, + 126, 251, 234, 208, 210, 240, 218, 245, 104, 238, 242, 214, 220, 228, 15, + 249, 227, 240, 219, 245, 148, 249, 143, 241, 173, 220, 230, 248, 202, 30, + 224, 37, 226, 95, 30, 224, 32, 217, 117, 239, 197, 30, 231, 172, 210, + 250, 208, 190, 30, 217, 97, 218, 33, 215, 162, 2, 217, 134, 212, 95, 219, + 102, 23, 250, 149, 214, 245, 23, 214, 245, 249, 166, 250, 111, 23, 238, + 127, 248, 69, 241, 196, 214, 198, 218, 34, 213, 128, 214, 117, 227, 112, + 211, 19, 238, 66, 219, 103, 252, 129, 241, 147, 218, 45, 241, 147, 213, + 100, 207, 41, 229, 224, 240, 10, 219, 104, 226, 134, 219, 104, 248, 204, + 214, 200, 248, 209, 226, 128, 248, 228, 250, 60, 2, 209, 238, 249, 92, + 247, 122, 238, 55, 249, 90, 247, 221, 245, 214, 238, 55, 249, 91, 247, + 211, 249, 91, 245, 206, 245, 207, 232, 227, 225, 193, 221, 212, 214, 36, + 238, 55, 249, 91, 238, 55, 2, 240, 202, 222, 201, 249, 91, 232, 189, 220, + 176, 222, 200, 242, 181, 220, 176, 222, 200, 238, 64, 250, 133, 251, 173, + 212, 103, 228, 15, 238, 60, 229, 98, 238, 60, 247, 107, 213, 247, 217, + 103, 245, 216, 213, 247, 242, 57, 232, 208, 230, 91, 232, 189, 248, 185, + 242, 181, 248, 185, 59, 221, 144, 60, 221, 144, 207, 62, 59, 241, 196, + 207, 62, 60, 241, 196, 218, 100, 60, 218, 100, 230, 133, 219, 65, 226, + 125, 222, 76, 207, 70, 249, 96, 247, 75, 211, 198, 230, 14, 219, 105, + 248, 183, 243, 255, 247, 64, 207, 29, 214, 206, 214, 204, 238, 65, 219, + 77, 240, 15, 215, 208, 226, 163, 218, 104, 248, 56, 245, 40, 221, 17, + 249, 182, 243, 60, 222, 211, 214, 128, 215, 203, 249, 95, 252, 91, 238, + 132, 230, 126, 250, 44, 241, 213, 211, 18, 241, 213, 249, 189, 210, 141, + 239, 84, 248, 57, 250, 179, 248, 57, 241, 97, 250, 179, 248, 57, 249, + 218, 221, 146, 231, 51, 220, 186, 243, 246, 248, 232, 250, 168, 248, 232, + 245, 33, 226, 126, 242, 67, 247, 76, 242, 67, 211, 199, 242, 67, 219, + 106, 242, 67, 248, 184, 242, 67, 244, 0, 242, 67, 214, 115, 207, 29, 238, + 66, 242, 67, 226, 164, 242, 67, 245, 41, 242, 67, 221, 18, 242, 67, 241, + 100, 242, 67, 239, 113, 242, 67, 206, 247, 242, 67, 250, 56, 242, 67, + 222, 4, 242, 67, 221, 18, 224, 44, 221, 186, 220, 121, 248, 41, 242, 148, + 242, 150, 243, 124, 224, 44, 226, 123, 211, 107, 59, 120, 220, 201, 250, + 174, 233, 53, 59, 130, 220, 201, 250, 174, 233, 53, 59, 47, 220, 201, + 250, 174, 233, 53, 59, 48, 220, 201, 250, 174, 233, 53, 241, 207, 239, + 108, 53, 207, 62, 239, 108, 53, 222, 186, 239, 108, 53, 211, 229, 120, + 53, 211, 229, 130, 53, 247, 212, 239, 103, 53, 222, 142, 239, 103, 53, + 247, 52, 206, 243, 239, 86, 242, 149, 225, 107, 213, 9, 232, 181, 243, + 251, 231, 110, 249, 229, 206, 243, 247, 185, 220, 58, 239, 106, 220, 167, + 227, 211, 215, 155, 251, 196, 215, 155, 238, 251, 215, 155, 206, 243, + 217, 148, 206, 243, 249, 165, 241, 145, 249, 59, 233, 69, 215, 55, 249, + 58, 233, 69, 215, 55, 249, 139, 240, 40, 227, 221, 206, 244, 242, 48, + 227, 222, 23, 206, 245, 238, 141, 239, 102, 118, 227, 84, 238, 141, 239, + 102, 118, 206, 242, 238, 141, 239, 102, 220, 193, 222, 199, 206, 245, 2, + 249, 76, 243, 122, 249, 117, 2, 209, 30, 221, 115, 2, 249, 192, 239, 129, + 227, 222, 2, 239, 210, 221, 54, 227, 207, 227, 222, 2, 210, 148, 222, + 178, 227, 221, 222, 178, 206, 244, 250, 178, 247, 123, 206, 228, 220, + 126, 232, 189, 222, 195, 232, 189, 240, 14, 240, 69, 250, 179, 252, 112, + 242, 154, 252, 162, 252, 163, 226, 154, 233, 74, 214, 240, 233, 43, 245, + 203, 221, 114, 239, 204, 246, 101, 229, 191, 225, 217, 220, 192, 242, 68, + 227, 173, 239, 128, 250, 127, 220, 195, 213, 29, 221, 10, 231, 92, 83, + 229, 98, 230, 5, 218, 148, 240, 160, 213, 253, 231, 91, 249, 148, 247, + 78, 2, 239, 60, 207, 47, 250, 54, 239, 60, 249, 111, 239, 60, 118, 239, + 58, 214, 145, 239, 60, 239, 220, 239, 60, 239, 61, 2, 45, 249, 187, 239, + 60, 239, 227, 239, 60, 206, 45, 239, 60, 220, 59, 239, 60, 239, 61, 2, + 218, 205, 218, 218, 239, 58, 239, 61, 246, 0, 245, 157, 215, 234, 2, 32, + 67, 233, 25, 243, 63, 147, 249, 88, 252, 111, 93, 249, 174, 214, 232, 93, + 247, 164, 93, 214, 122, 213, 107, 93, 243, 244, 246, 79, 93, 221, 11, 73, + 220, 187, 241, 182, 249, 241, 245, 71, 93, 214, 137, 250, 148, 211, 244, + 250, 148, 59, 241, 172, 238, 30, 220, 199, 93, 226, 167, 250, 163, 247, + 25, 242, 169, 77, 245, 35, 53, 247, 68, 248, 203, 250, 132, 2, 206, 43, + 53, 250, 132, 2, 245, 35, 53, 250, 132, 2, 242, 184, 53, 250, 132, 2, + 220, 165, 53, 226, 167, 2, 207, 4, 248, 90, 2, 167, 211, 57, 23, 206, 43, + 53, 217, 83, 221, 113, 247, 142, 249, 115, 226, 207, 241, 177, 245, 92, + 222, 126, 245, 97, 243, 208, 241, 236, 241, 158, 222, 142, 241, 236, 241, + 158, 222, 38, 2, 247, 27, 222, 38, 242, 60, 209, 206, 248, 237, 212, 127, + 248, 237, 191, 233, 53, 248, 90, 2, 167, 211, 56, 248, 90, 2, 173, 211, + 56, 250, 129, 248, 89, 247, 198, 220, 54, 218, 95, 220, 54, 221, 234, + 213, 243, 218, 40, 211, 48, 218, 40, 249, 170, 212, 205, 230, 51, 224, + 35, 224, 36, 2, 245, 255, 247, 77, 247, 192, 249, 171, 222, 142, 249, + 171, 239, 227, 249, 171, 249, 187, 249, 171, 222, 121, 249, 171, 249, + 168, 225, 211, 250, 166, 217, 91, 227, 85, 212, 108, 219, 45, 222, 36, + 242, 33, 228, 15, 217, 130, 252, 88, 220, 76, 253, 2, 229, 100, 248, 76, + 227, 97, 222, 92, 211, 64, 233, 65, 211, 64, 222, 44, 243, 177, 93, 233, + 62, 243, 8, 243, 9, 2, 173, 51, 52, 247, 192, 227, 236, 2, 229, 91, 241, + 196, 247, 192, 227, 236, 2, 219, 81, 241, 196, 222, 142, 227, 236, 2, + 219, 81, 241, 196, 222, 142, 227, 236, 2, 229, 91, 241, 196, 220, 173, + 220, 174, 238, 69, 225, 84, 226, 179, 221, 62, 226, 179, 221, 63, 2, 86, + 51, 251, 200, 230, 46, 208, 213, 226, 178, 226, 179, 221, 63, 222, 202, + 224, 68, 226, 179, 221, 61, 252, 89, 2, 250, 118, 248, 230, 248, 231, 2, + 241, 189, 208, 210, 248, 230, 212, 105, 219, 97, 208, 209, 241, 231, 220, + 108, 220, 179, 214, 6, 210, 110, 86, 251, 241, 247, 194, 86, 23, 92, 222, + 142, 247, 234, 251, 241, 247, 194, 86, 23, 92, 222, 142, 247, 234, 251, + 242, 2, 39, 119, 222, 82, 247, 194, 173, 23, 167, 222, 142, 247, 234, + 251, 241, 252, 87, 173, 23, 167, 222, 142, 247, 234, 251, 241, 114, 249, + 114, 93, 127, 249, 114, 93, 214, 142, 2, 248, 223, 91, 214, 141, 214, + 142, 2, 119, 214, 165, 207, 64, 214, 142, 2, 129, 214, 165, 207, 63, 250, + 102, 243, 63, 220, 223, 230, 41, 227, 248, 240, 29, 218, 162, 227, 248, + 240, 29, 229, 140, 2, 233, 36, 221, 150, 247, 192, 229, 140, 2, 231, 174, + 231, 174, 229, 139, 222, 142, 229, 139, 250, 28, 250, 29, 2, 248, 223, + 91, 249, 169, 229, 196, 93, 219, 98, 249, 54, 250, 177, 2, 92, 51, 52, + 243, 34, 2, 92, 51, 52, 222, 166, 2, 242, 168, 141, 2, 47, 48, 51, 52, + 214, 173, 2, 86, 51, 52, 211, 102, 2, 167, 51, 52, 224, 68, 119, 209, + 227, 243, 86, 93, 231, 171, 212, 98, 233, 30, 16, 33, 7, 6, 230, 4, 233, + 30, 16, 33, 7, 5, 230, 4, 233, 30, 16, 33, 223, 178, 233, 30, 16, 33, + 213, 42, 233, 30, 16, 33, 7, 230, 4, 241, 219, 243, 63, 211, 97, 206, + 220, 239, 114, 223, 161, 23, 249, 176, 238, 147, 220, 248, 226, 250, 212, + 106, 247, 42, 250, 149, 215, 10, 220, 203, 214, 27, 2, 226, 247, 245, 23, + 232, 189, 16, 33, 250, 41, 211, 46, 243, 47, 60, 49, 249, 54, 59, 49, + 249, 54, 230, 86, 219, 32, 247, 233, 230, 86, 249, 187, 247, 233, 230, + 86, 222, 121, 245, 156, 230, 86, 249, 187, 245, 156, 5, 222, 121, 245, + 156, 5, 249, 187, 245, 156, 209, 205, 219, 32, 211, 51, 244, 7, 219, 32, + 211, 51, 209, 205, 5, 219, 32, 211, 51, 244, 7, 5, 219, 32, 211, 51, 229, + 92, 48, 215, 246, 59, 247, 233, 209, 203, 48, 215, 246, 59, 247, 233, 39, + 247, 60, 220, 190, 247, 60, 220, 191, 2, 239, 120, 55, 247, 60, 220, 190, + 224, 39, 47, 216, 55, 2, 129, 245, 21, 224, 39, 48, 216, 55, 2, 129, 245, + 21, 16, 33, 227, 186, 248, 96, 59, 7, 247, 59, 77, 7, 247, 59, 248, 133, + 247, 59, 222, 174, 93, 244, 10, 73, 221, 172, 247, 196, 242, 68, 119, + 222, 216, 247, 196, 242, 68, 118, 222, 216, 247, 196, 242, 68, 129, 222, + 216, 247, 196, 242, 68, 241, 125, 222, 216, 247, 196, 242, 68, 241, 204, + 222, 216, 247, 196, 242, 68, 215, 10, 222, 216, 247, 196, 242, 68, 216, + 23, 222, 216, 247, 196, 242, 68, 243, 88, 222, 216, 247, 196, 242, 68, + 224, 195, 222, 216, 247, 196, 242, 68, 212, 99, 222, 216, 247, 196, 242, + 68, 243, 59, 222, 216, 247, 196, 242, 68, 210, 127, 222, 216, 247, 196, + 242, 68, 222, 161, 247, 196, 242, 68, 210, 106, 247, 196, 242, 68, 211, + 234, 247, 196, 242, 68, 241, 121, 247, 196, 242, 68, 241, 202, 247, 196, + 242, 68, 215, 6, 247, 196, 242, 68, 216, 22, 247, 196, 242, 68, 243, 87, + 247, 196, 242, 68, 224, 194, 247, 196, 242, 68, 212, 97, 247, 196, 242, + 68, 243, 57, 247, 196, 242, 68, 210, 125, 48, 214, 141, 48, 214, 142, 2, + 119, 214, 165, 207, 64, 48, 214, 142, 2, 129, 214, 165, 207, 63, 249, 83, + 249, 84, 2, 214, 165, 207, 63, 218, 147, 250, 28, 249, 171, 248, 221, + 227, 208, 247, 195, 60, 214, 241, 23, 247, 58, 224, 68, 220, 254, 238, + 140, 227, 222, 233, 69, 249, 61, 213, 168, 229, 253, 214, 230, 222, 123, + 214, 108, 246, 84, 213, 150, 214, 130, 214, 131, 207, 48, 232, 105, 47, + 239, 108, 212, 108, 219, 45, 212, 108, 219, 46, 2, 222, 37, 48, 239, 108, + 212, 108, 219, 45, 59, 211, 89, 212, 107, 60, 211, 89, 212, 107, 212, + 108, 222, 166, 211, 102, 73, 226, 175, 247, 216, 226, 179, 221, 62, 250, + 177, 73, 243, 8, 214, 32, 243, 8, 243, 9, 2, 229, 220, 241, 165, 243, 8, + 221, 151, 131, 214, 32, 243, 8, 229, 195, 221, 233, 60, 220, 54, 229, 92, + 47, 221, 149, 229, 92, 47, 250, 144, 221, 150, 229, 92, 47, 241, 127, + 221, 150, 229, 92, 47, 222, 31, 229, 92, 47, 247, 71, 47, 206, 219, 239, + 107, 201, 222, 186, 239, 108, 53, 219, 81, 239, 108, 2, 241, 224, 214, + 121, 218, 224, 219, 81, 239, 108, 2, 241, 224, 214, 121, 218, 224, 211, + 229, 120, 53, 218, 224, 211, 229, 130, 53, 218, 224, 208, 212, 239, 107, + 218, 224, 239, 108, 2, 226, 247, 241, 228, 242, 158, 219, 81, 239, 108, + 2, 221, 211, 250, 6, 226, 247, 23, 218, 149, 241, 223, 59, 130, 220, 201, + 47, 239, 108, 233, 53, 215, 73, 59, 47, 220, 201, 233, 53, 215, 73, 59, + 48, 220, 201, 233, 53, 215, 73, 60, 47, 220, 201, 233, 53, 215, 73, 60, + 48, 220, 201, 233, 53, 60, 47, 220, 201, 250, 174, 233, 53, 60, 48, 220, + 201, 250, 174, 233, 53, 215, 73, 59, 120, 220, 201, 233, 53, 215, 73, 59, + 130, 220, 201, 233, 53, 215, 73, 60, 120, 220, 201, 233, 53, 215, 73, 60, + 130, 220, 201, 233, 53, 60, 120, 220, 201, 250, 174, 233, 53, 60, 130, + 220, 201, 250, 174, 233, 53, 245, 202, 247, 142, 231, 173, 23, 226, 125, + 129, 225, 90, 247, 141, 220, 122, 220, 209, 248, 239, 60, 239, 94, 215, + 204, 241, 177, 245, 92, 59, 239, 94, 215, 204, 241, 177, 245, 92, 214, + 187, 215, 204, 241, 177, 245, 92, 212, 165, 248, 188, 207, 0, 231, 172, + 119, 249, 55, 226, 125, 118, 249, 55, 226, 125, 129, 249, 55, 226, 125, + 211, 81, 44, 221, 113, 247, 142, 239, 94, 245, 92, 217, 93, 220, 123, + 237, 175, 242, 33, 237, 175, 222, 126, 245, 98, 237, 175, 245, 45, 2, + 212, 60, 245, 45, 2, 212, 61, 23, 221, 47, 245, 45, 2, 221, 47, 241, 113, + 2, 221, 47, 241, 113, 2, 211, 178, 241, 113, 2, 252, 123, 206, 195, 60, + 241, 158, 241, 158, 222, 142, 241, 158, 191, 233, 54, 245, 78, 191, 241, + 236, 249, 140, 241, 236, 248, 252, 243, 43, 224, 37, 243, 43, 224, 38, + 222, 37, 243, 43, 224, 38, 222, 42, 224, 37, 224, 38, 222, 37, 224, 38, + 222, 42, 243, 43, 245, 44, 243, 43, 222, 37, 243, 43, 222, 35, 245, 44, + 222, 37, 222, 35, 207, 74, 214, 128, 224, 38, 222, 42, 214, 128, 248, + 238, 222, 42, 245, 202, 207, 8, 226, 204, 227, 163, 222, 84, 247, 194, + 48, 23, 47, 216, 55, 251, 241, 248, 223, 206, 195, 233, 60, 241, 152, + 214, 250, 93, 245, 254, 241, 152, 214, 250, 93, 247, 143, 44, 231, 174, + 218, 112, 225, 84, 222, 38, 2, 39, 212, 60, 213, 255, 248, 89, 246, 129, + 231, 58, 229, 192, 214, 140, 239, 69, 233, 69, 215, 55, 129, 219, 56, 52, + 129, 219, 56, 55, 129, 219, 56, 230, 46, 129, 219, 56, 218, 167, 47, 214, + 137, 249, 100, 48, 214, 137, 249, 100, 118, 214, 137, 249, 99, 129, 214, + 137, 249, 99, 47, 211, 244, 249, 100, 48, 211, 244, 249, 100, 47, 252, + 111, 249, 100, 48, 252, 111, 249, 100, 226, 149, 249, 100, 229, 221, 226, + 149, 249, 100, 229, 221, 226, 148, 250, 146, 96, 2, 250, 145, 250, 146, + 121, 206, 195, 250, 146, 96, 2, 121, 206, 195, 250, 146, 24, 121, 206, + 195, 250, 146, 96, 2, 24, 121, 206, 195, 147, 248, 81, 83, 250, 146, 96, + 2, 24, 248, 80, 206, 227, 227, 205, 226, 130, 241, 83, 211, 124, 211, 86, + 214, 18, 73, 229, 233, 215, 56, 73, 232, 190, 226, 119, 239, 224, 242, + 67, 239, 224, 242, 68, 2, 214, 210, 242, 148, 242, 68, 2, 212, 123, 73, + 232, 107, 214, 210, 242, 68, 2, 222, 142, 226, 123, 214, 210, 242, 68, 2, + 222, 142, 226, 124, 23, 214, 210, 242, 148, 214, 210, 242, 68, 2, 222, + 142, 226, 124, 23, 247, 166, 213, 106, 214, 210, 242, 68, 2, 222, 142, + 226, 124, 23, 211, 196, 242, 148, 214, 210, 242, 68, 2, 239, 119, 214, + 210, 242, 68, 2, 238, 68, 207, 2, 242, 67, 214, 210, 242, 68, 2, 214, + 210, 242, 148, 242, 68, 217, 122, 245, 235, 241, 150, 219, 8, 242, 67, + 214, 210, 242, 68, 2, 239, 59, 242, 148, 214, 210, 242, 68, 2, 213, 150, + 214, 209, 242, 67, 225, 88, 242, 67, 242, 160, 242, 67, 209, 232, 242, + 67, 242, 68, 2, 247, 166, 213, 106, 221, 142, 242, 67, 247, 134, 242, 67, + 247, 135, 242, 67, 231, 90, 242, 67, 242, 68, 211, 231, 32, 231, 91, 231, + 90, 242, 68, 2, 214, 210, 242, 148, 231, 90, 242, 68, 2, 247, 192, 242, + 148, 242, 68, 2, 213, 209, 211, 107, 242, 68, 2, 213, 209, 211, 108, 23, + 207, 2, 242, 150, 242, 68, 2, 213, 209, 211, 108, 23, 211, 196, 242, 148, + 245, 99, 242, 67, 206, 226, 242, 67, 252, 107, 242, 67, 220, 164, 242, + 67, 247, 44, 242, 67, 221, 117, 242, 67, 242, 68, 2, 229, 114, 73, 211, + 29, 245, 99, 249, 57, 219, 8, 242, 67, 241, 94, 242, 68, 2, 222, 142, + 226, 123, 252, 105, 242, 67, 242, 26, 242, 67, 207, 49, 242, 67, 214, + 231, 242, 67, 211, 161, 242, 67, 239, 225, 242, 67, 229, 101, 247, 44, + 242, 67, 242, 68, 2, 222, 142, 226, 123, 238, 20, 242, 67, 242, 68, 2, + 222, 142, 226, 124, 23, 247, 166, 213, 106, 242, 68, 217, 95, 233, 69, + 242, 27, 251, 206, 242, 67, 241, 169, 242, 67, 214, 232, 242, 67, 245, + 71, 242, 67, 242, 68, 206, 253, 226, 123, 242, 68, 2, 227, 111, 227, 175, + 239, 224, 248, 184, 242, 68, 2, 214, 210, 242, 148, 248, 184, 242, 68, 2, + 212, 123, 73, 232, 107, 214, 210, 248, 184, 242, 68, 2, 222, 142, 226, + 123, 214, 210, 248, 184, 242, 68, 2, 239, 59, 242, 148, 248, 184, 242, + 68, 2, 206, 217, 214, 211, 231, 90, 248, 184, 242, 68, 2, 247, 192, 242, + 148, 220, 164, 248, 184, 242, 67, 247, 44, 248, 184, 242, 67, 207, 49, + 248, 184, 242, 67, 214, 225, 241, 94, 242, 67, 214, 225, 214, 210, 242, + 67, 242, 68, 2, 224, 68, 240, 7, 240, 140, 242, 68, 2, 222, 186, 240, + 140, 221, 115, 249, 145, 245, 249, 217, 73, 226, 163, 239, 62, 226, 163, + 214, 143, 226, 163, 239, 96, 221, 115, 219, 80, 119, 239, 107, 221, 115, + 219, 80, 249, 157, 239, 103, 233, 69, 248, 135, 221, 115, 241, 93, 221, + 115, 2, 220, 164, 242, 67, 221, 115, 2, 241, 159, 239, 102, 143, 207, 36, + 220, 201, 230, 53, 188, 207, 36, 220, 201, 230, 53, 143, 243, 117, 220, + 201, 230, 53, 188, 243, 117, 220, 201, 230, 53, 201, 143, 207, 36, 220, + 201, 230, 53, 201, 188, 207, 36, 220, 201, 230, 53, 201, 143, 243, 117, + 220, 201, 230, 53, 201, 188, 243, 117, 220, 201, 230, 53, 143, 207, 36, + 220, 201, 208, 196, 230, 53, 188, 207, 36, 220, 201, 208, 196, 230, 53, + 143, 243, 117, 220, 201, 208, 196, 230, 53, 188, 243, 117, 220, 201, 208, + 196, 230, 53, 77, 143, 207, 36, 220, 201, 208, 196, 230, 53, 77, 188, + 207, 36, 220, 201, 208, 196, 230, 53, 77, 143, 243, 117, 220, 201, 208, + 196, 230, 53, 77, 188, 243, 117, 220, 201, 208, 196, 230, 53, 143, 207, + 36, 220, 201, 249, 97, 188, 207, 36, 220, 201, 249, 97, 143, 243, 117, + 220, 201, 249, 97, 188, 243, 117, 220, 201, 249, 97, 77, 143, 207, 36, + 220, 201, 249, 97, 77, 188, 207, 36, 220, 201, 249, 97, 77, 143, 243, + 117, 220, 201, 249, 97, 77, 188, 243, 117, 220, 201, 249, 97, 238, 139, + 219, 189, 49, 222, 111, 238, 139, 219, 189, 49, 222, 112, 233, 69, 60, + 214, 107, 214, 182, 219, 189, 49, 222, 111, 214, 182, 219, 189, 49, 222, + 112, 233, 69, 60, 214, 107, 92, 218, 116, 167, 218, 116, 86, 218, 116, + 173, 218, 116, 121, 28, 242, 204, 222, 111, 77, 121, 28, 242, 204, 222, + 111, 28, 222, 142, 242, 204, 222, 111, 77, 28, 222, 142, 242, 204, 222, + 111, 77, 252, 126, 222, 111, 213, 109, 252, 126, 222, 111, 38, 77, 50, + 201, 247, 156, 219, 180, 141, 222, 111, 38, 77, 50, 247, 156, 219, 180, + 141, 222, 111, 38, 77, 114, 50, 247, 156, 219, 180, 141, 222, 111, 77, + 233, 11, 222, 111, 38, 233, 11, 222, 111, 77, 38, 233, 11, 222, 111, 208, + 226, 77, 214, 180, 208, 226, 77, 218, 225, 214, 180, 248, 79, 249, 181, + 218, 225, 248, 79, 249, 181, 218, 116, 239, 46, 214, 13, 229, 137, 219, + 86, 248, 204, 238, 248, 211, 74, 238, 248, 211, 75, 2, 249, 86, 224, 44, + 211, 74, 227, 56, 147, 219, 87, 214, 19, 211, 72, 211, 73, 248, 204, 249, + 62, 222, 163, 249, 62, 211, 26, 249, 63, 213, 251, 226, 208, 252, 130, + 241, 220, 243, 27, 220, 193, 248, 204, 222, 163, 220, 193, 248, 204, 212, + 141, 222, 163, 212, 141, 251, 172, 222, 163, 251, 172, 219, 39, 209, 31, + 245, 231, 211, 17, 251, 236, 229, 105, 211, 80, 226, 157, 226, 129, 219, + 85, 213, 122, 219, 85, 226, 129, 248, 251, 252, 234, 211, 71, 215, 167, + 218, 92, 214, 135, 194, 211, 78, 229, 223, 79, 211, 78, 229, 223, 247, + 123, 53, 220, 193, 248, 190, 218, 218, 229, 223, 211, 48, 241, 197, 222, + 166, 220, 175, 245, 26, 224, 68, 243, 14, 53, 214, 208, 93, 224, 68, 214, + 208, 93, 220, 53, 229, 181, 233, 69, 232, 217, 220, 239, 93, 245, 52, + 224, 43, 229, 181, 93, 220, 169, 207, 70, 93, 224, 58, 207, 70, 93, 249, + 240, 224, 68, 249, 239, 249, 238, 226, 129, 249, 238, 221, 166, 224, 68, + 221, 165, 248, 48, 247, 53, 227, 80, 93, 206, 241, 93, 218, 234, 250, + 179, 93, 211, 125, 207, 70, 247, 189, 215, 126, 250, 105, 250, 103, 221, + 197, 247, 108, 247, 12, 250, 160, 247, 217, 47, 229, 71, 211, 52, 2, 218, + 93, 247, 90, 220, 111, 53, 39, 233, 43, 214, 163, 249, 138, 93, 240, 39, + 93, 247, 83, 23, 230, 96, 214, 232, 253, 18, 215, 147, 250, 159, 250, 27, + 250, 28, 250, 51, 239, 115, 23, 206, 220, 215, 180, 222, 190, 243, 241, + 226, 133, 219, 86, 211, 82, 226, 135, 249, 180, 209, 205, 226, 218, 252, + 194, 209, 205, 252, 194, 209, 205, 5, 252, 194, 5, 252, 194, 224, 47, + 252, 194, 252, 195, 245, 215, 252, 195, 251, 246, 217, 129, 222, 163, + 241, 220, 243, 27, 245, 146, 229, 137, 221, 200, 215, 167, 125, 16, 33, + 219, 185, 125, 16, 33, 252, 196, 125, 16, 33, 241, 219, 125, 16, 33, 243, + 120, 125, 16, 33, 207, 69, 125, 16, 33, 252, 39, 125, 16, 33, 252, 40, + 219, 26, 125, 16, 33, 252, 40, 219, 25, 125, 16, 33, 252, 40, 208, 179, + 125, 16, 33, 252, 40, 208, 178, 125, 16, 33, 208, 193, 125, 16, 33, 208, + 192, 125, 16, 33, 208, 191, 125, 16, 33, 213, 161, 125, 16, 33, 221, 70, + 213, 161, 125, 16, 33, 60, 213, 161, 125, 16, 33, 227, 79, 213, 189, 125, + 16, 33, 227, 79, 213, 188, 125, 16, 33, 227, 79, 213, 187, 125, 16, 33, + 247, 236, 125, 16, 33, 217, 165, 125, 16, 33, 224, 183, 125, 16, 33, 208, + 177, 125, 16, 33, 208, 176, 125, 16, 33, 218, 117, 217, 165, 125, 16, 33, + 218, 117, 217, 164, 125, 16, 33, 240, 11, 125, 16, 33, 215, 52, 125, 16, + 33, 232, 240, 222, 117, 125, 16, 33, 232, 240, 222, 116, 125, 16, 33, + 247, 63, 73, 232, 239, 125, 16, 33, 219, 22, 73, 232, 239, 125, 16, 33, + 247, 99, 222, 117, 125, 16, 33, 232, 238, 222, 117, 125, 16, 33, 213, + 190, 73, 247, 98, 125, 16, 33, 247, 63, 73, 247, 98, 125, 16, 33, 247, + 63, 73, 247, 97, 125, 16, 33, 247, 99, 252, 81, 125, 16, 33, 217, 166, + 73, 247, 99, 252, 81, 125, 16, 33, 213, 190, 73, 217, 166, 73, 247, 98, + 125, 16, 33, 209, 26, 125, 16, 33, 211, 174, 222, 117, 125, 16, 33, 230, + 57, 222, 117, 125, 16, 33, 252, 80, 222, 117, 125, 16, 33, 213, 190, 73, + 252, 79, 125, 16, 33, 217, 166, 73, 252, 79, 125, 16, 33, 213, 190, 73, + 217, 166, 73, 252, 79, 125, 16, 33, 208, 194, 73, 252, 79, 125, 16, 33, + 219, 22, 73, 252, 79, 125, 16, 33, 219, 22, 73, 252, 78, 125, 16, 33, + 219, 21, 125, 16, 33, 219, 20, 125, 16, 33, 219, 19, 125, 16, 33, 219, + 18, 125, 16, 33, 252, 159, 125, 16, 33, 252, 158, 125, 16, 33, 227, 196, + 125, 16, 33, 217, 171, 125, 16, 33, 251, 240, 125, 16, 33, 219, 48, 125, + 16, 33, 219, 47, 125, 16, 33, 251, 175, 125, 16, 33, 249, 210, 222, 117, + 125, 16, 33, 212, 160, 125, 16, 33, 212, 159, 125, 16, 33, 219, 191, 229, + 214, 125, 16, 33, 249, 162, 125, 16, 33, 249, 161, 125, 16, 33, 249, 160, + 125, 16, 33, 252, 138, 125, 16, 33, 222, 189, 125, 16, 33, 214, 124, 125, + 16, 33, 211, 172, 125, 16, 33, 239, 194, 125, 16, 33, 207, 57, 125, 16, + 33, 220, 163, 125, 16, 33, 248, 235, 125, 16, 33, 210, 136, 125, 16, 33, + 248, 206, 226, 138, 125, 16, 33, 217, 107, 73, 232, 109, 125, 16, 33, + 248, 248, 125, 16, 33, 211, 45, 125, 16, 33, 214, 24, 211, 45, 125, 16, + 33, 229, 136, 125, 16, 33, 214, 191, 125, 16, 33, 209, 186, 125, 16, 33, + 238, 66, 243, 223, 125, 16, 33, 251, 220, 125, 16, 33, 220, 171, 251, + 220, 125, 16, 33, 249, 118, 125, 16, 33, 220, 162, 249, 118, 125, 16, 33, + 252, 135, 125, 16, 33, 213, 239, 213, 142, 213, 238, 125, 16, 33, 213, + 239, 213, 142, 213, 237, 125, 16, 33, 213, 186, 125, 16, 33, 220, 137, + 125, 16, 33, 245, 88, 125, 16, 33, 245, 90, 125, 16, 33, 245, 89, 125, + 16, 33, 220, 62, 125, 16, 33, 220, 51, 125, 16, 33, 247, 51, 125, 16, 33, + 247, 50, 125, 16, 33, 247, 49, 125, 16, 33, 247, 48, 125, 16, 33, 247, + 47, 125, 16, 33, 252, 171, 125, 16, 33, 250, 106, 73, 227, 180, 125, 16, + 33, 250, 106, 73, 209, 58, 125, 16, 33, 218, 232, 125, 16, 33, 238, 58, + 125, 16, 33, 224, 209, 125, 16, 33, 246, 66, 125, 16, 33, 226, 152, 125, + 16, 33, 160, 243, 253, 125, 16, 33, 160, 222, 95, 60, 230, 41, 232, 223, + 48, 211, 51, 60, 209, 205, 232, 223, 48, 211, 51, 60, 218, 162, 232, 223, + 48, 211, 51, 60, 244, 7, 232, 223, 48, 211, 51, 60, 214, 225, 5, 247, + 233, 227, 109, 24, 59, 247, 233, 24, 59, 247, 233, 77, 59, 247, 233, 208, + 226, 77, 59, 247, 233, 242, 153, 77, 59, 247, 233, 59, 247, 234, 247, + 119, 60, 5, 247, 233, 218, 95, 212, 161, 60, 211, 169, 214, 107, 60, 214, + 225, 5, 214, 107, 147, 59, 214, 107, 227, 109, 59, 214, 107, 24, 59, 214, + 107, 77, 59, 214, 107, 208, 226, 77, 59, 214, 107, 242, 153, 77, 59, 214, + 107, 59, 49, 247, 119, 60, 208, 226, 5, 214, 107, 59, 49, 247, 119, 60, + 227, 109, 214, 107, 49, 212, 161, 60, 211, 169, 245, 156, 60, 208, 226, + 5, 245, 156, 60, 227, 109, 5, 245, 156, 59, 245, 157, 247, 119, 60, 208, + 226, 5, 245, 156, 59, 245, 157, 247, 119, 60, 227, 109, 245, 156, 245, + 157, 212, 161, 60, 211, 169, 229, 88, 60, 208, 226, 5, 229, 88, 60, 227, + 109, 5, 229, 88, 59, 229, 89, 247, 119, 60, 5, 229, 88, 212, 12, 27, 247, + 59, 147, 27, 247, 59, 227, 109, 27, 247, 59, 24, 27, 247, 59, 208, 226, + 24, 27, 247, 59, 208, 226, 77, 27, 247, 59, 242, 153, 77, 27, 247, 59, + 212, 12, 217, 162, 147, 217, 162, 227, 109, 217, 162, 24, 217, 162, 77, + 217, 162, 208, 226, 77, 217, 162, 242, 153, 77, 217, 162, 147, 241, 204, + 214, 119, 251, 209, 227, 109, 241, 204, 214, 119, 251, 209, 24, 241, 204, + 214, 119, 251, 209, 77, 241, 204, 214, 119, 251, 209, 208, 226, 77, 241, + 204, 214, 119, 251, 209, 242, 153, 77, 241, 204, 214, 119, 251, 209, 147, + 215, 10, 214, 119, 251, 209, 227, 109, 215, 10, 214, 119, 251, 209, 24, + 215, 10, 214, 119, 251, 209, 77, 215, 10, 214, 119, 251, 209, 208, 226, + 77, 215, 10, 214, 119, 251, 209, 242, 153, 77, 215, 10, 214, 119, 251, + 209, 147, 243, 88, 214, 119, 251, 209, 227, 109, 243, 88, 214, 119, 251, + 209, 24, 243, 88, 214, 119, 251, 209, 77, 243, 88, 214, 119, 251, 209, + 208, 226, 77, 243, 88, 214, 119, 251, 209, 147, 129, 220, 203, 60, 214, + 26, 227, 109, 129, 220, 203, 60, 214, 26, 129, 220, 203, 60, 214, 26, + 227, 109, 129, 220, 203, 221, 4, 214, 26, 147, 241, 125, 220, 203, 60, + 214, 26, 227, 109, 241, 125, 220, 203, 60, 214, 26, 241, 125, 220, 203, + 60, 214, 26, 227, 109, 241, 125, 220, 203, 221, 4, 214, 26, 218, 225, + 147, 241, 125, 220, 203, 221, 4, 214, 26, 147, 241, 204, 220, 203, 60, + 214, 26, 77, 241, 204, 220, 203, 60, 214, 26, 227, 109, 215, 10, 220, + 203, 60, 214, 26, 77, 215, 10, 220, 203, 60, 214, 26, 215, 10, 220, 203, + 221, 4, 214, 26, 227, 109, 243, 88, 220, 203, 60, 214, 26, 77, 243, 88, + 220, 203, 60, 214, 26, 208, 226, 77, 243, 88, 220, 203, 60, 214, 26, 77, + 243, 88, 220, 203, 221, 4, 214, 26, 147, 210, 127, 220, 203, 60, 214, 26, + 77, 210, 127, 220, 203, 60, 214, 26, 77, 210, 127, 220, 203, 221, 4, 214, + 26, 92, 51, 2, 5, 211, 52, 251, 243, 167, 51, 2, 5, 211, 52, 251, 243, + 86, 51, 2, 5, 211, 52, 251, 243, 173, 51, 2, 5, 211, 52, 251, 243, 92, + 51, 2, 227, 109, 211, 52, 251, 243, 167, 51, 2, 227, 109, 211, 52, 251, + 243, 86, 51, 2, 227, 109, 211, 52, 251, 243, 173, 51, 2, 227, 109, 211, + 52, 251, 243, 92, 51, 2, 230, 86, 211, 52, 251, 243, 167, 51, 2, 230, 86, + 211, 52, 251, 243, 86, 51, 2, 230, 86, 211, 52, 251, 243, 173, 51, 2, + 230, 86, 211, 52, 251, 243, 92, 51, 2, 5, 242, 238, 251, 243, 167, 51, 2, + 5, 242, 238, 251, 243, 86, 51, 2, 5, 242, 238, 251, 243, 173, 51, 2, 5, + 242, 238, 251, 243, 92, 51, 2, 242, 238, 251, 243, 167, 51, 2, 242, 238, + 251, 243, 86, 51, 2, 242, 238, 251, 243, 173, 51, 2, 242, 238, 251, 243, + 77, 92, 51, 2, 242, 238, 251, 243, 77, 167, 51, 2, 242, 238, 251, 243, + 77, 86, 51, 2, 242, 238, 251, 243, 77, 173, 51, 2, 242, 238, 251, 243, + 77, 92, 51, 2, 230, 86, 242, 238, 251, 243, 77, 167, 51, 2, 230, 86, 242, + 238, 251, 243, 77, 86, 51, 2, 230, 86, 242, 238, 251, 243, 77, 173, 51, + 2, 230, 86, 242, 238, 251, 243, 92, 211, 50, 51, 2, 225, 199, 215, 244, + 167, 211, 50, 51, 2, 225, 199, 215, 244, 86, 211, 50, 51, 2, 225, 199, + 215, 244, 173, 211, 50, 51, 2, 225, 199, 215, 244, 92, 211, 50, 51, 2, + 227, 109, 215, 244, 167, 211, 50, 51, 2, 227, 109, 215, 244, 86, 211, 50, + 51, 2, 227, 109, 215, 244, 173, 211, 50, 51, 2, 227, 109, 215, 244, 92, + 211, 50, 51, 2, 24, 215, 244, 167, 211, 50, 51, 2, 24, 215, 244, 86, 211, + 50, 51, 2, 24, 215, 244, 173, 211, 50, 51, 2, 24, 215, 244, 92, 211, 50, + 51, 2, 77, 215, 244, 167, 211, 50, 51, 2, 77, 215, 244, 86, 211, 50, 51, + 2, 77, 215, 244, 173, 211, 50, 51, 2, 77, 215, 244, 92, 211, 50, 51, 2, + 208, 226, 77, 215, 244, 167, 211, 50, 51, 2, 208, 226, 77, 215, 244, 86, + 211, 50, 51, 2, 208, 226, 77, 215, 244, 173, 211, 50, 51, 2, 208, 226, + 77, 215, 244, 92, 241, 227, 45, 167, 241, 227, 45, 86, 241, 227, 45, 173, + 241, 227, 45, 92, 98, 45, 167, 98, 45, 86, 98, 45, 173, 98, 45, 92, 247, + 144, 45, 167, 247, 144, 45, 86, 247, 144, 45, 173, 247, 144, 45, 92, 77, + 247, 144, 45, 167, 77, 247, 144, 45, 86, 77, 247, 144, 45, 173, 77, 247, + 144, 45, 92, 77, 45, 167, 77, 45, 86, 77, 45, 173, 77, 45, 92, 38, 45, + 167, 38, 45, 86, 38, 45, 173, 38, 45, 143, 207, 36, 38, 45, 143, 243, + 117, 38, 45, 188, 243, 117, 38, 45, 188, 207, 36, 38, 45, 47, 48, 38, 45, + 120, 130, 38, 45, 207, 16, 92, 147, 138, 45, 207, 16, 167, 147, 138, 45, + 207, 16, 86, 147, 138, 45, 207, 16, 173, 147, 138, 45, 207, 16, 143, 207, + 36, 147, 138, 45, 207, 16, 143, 243, 117, 147, 138, 45, 207, 16, 188, + 243, 117, 147, 138, 45, 207, 16, 188, 207, 36, 147, 138, 45, 207, 16, 92, + 138, 45, 207, 16, 167, 138, 45, 207, 16, 86, 138, 45, 207, 16, 173, 138, + 45, 207, 16, 143, 207, 36, 138, 45, 207, 16, 143, 243, 117, 138, 45, 207, + 16, 188, 243, 117, 138, 45, 207, 16, 188, 207, 36, 138, 45, 207, 16, 92, + 227, 109, 138, 45, 207, 16, 167, 227, 109, 138, 45, 207, 16, 86, 227, + 109, 138, 45, 207, 16, 173, 227, 109, 138, 45, 207, 16, 143, 207, 36, + 227, 109, 138, 45, 207, 16, 143, 243, 117, 227, 109, 138, 45, 207, 16, + 188, 243, 117, 227, 109, 138, 45, 207, 16, 188, 207, 36, 227, 109, 138, + 45, 207, 16, 92, 77, 138, 45, 207, 16, 167, 77, 138, 45, 207, 16, 86, 77, + 138, 45, 207, 16, 173, 77, 138, 45, 207, 16, 143, 207, 36, 77, 138, 45, + 207, 16, 143, 243, 117, 77, 138, 45, 207, 16, 188, 243, 117, 77, 138, 45, + 207, 16, 188, 207, 36, 77, 138, 45, 207, 16, 92, 208, 226, 77, 138, 45, + 207, 16, 167, 208, 226, 77, 138, 45, 207, 16, 86, 208, 226, 77, 138, 45, + 207, 16, 173, 208, 226, 77, 138, 45, 207, 16, 143, 207, 36, 208, 226, 77, + 138, 45, 207, 16, 143, 243, 117, 208, 226, 77, 138, 45, 207, 16, 188, + 243, 117, 208, 226, 77, 138, 45, 207, 16, 188, 207, 36, 208, 226, 77, + 138, 45, 92, 211, 52, 251, 243, 167, 211, 52, 251, 243, 86, 211, 52, 251, + 243, 173, 211, 52, 251, 243, 92, 59, 51, 206, 255, 211, 52, 251, 243, + 167, 59, 51, 206, 255, 211, 52, 251, 243, 86, 59, 51, 206, 255, 211, 52, + 251, 243, 173, 59, 51, 206, 255, 211, 52, 251, 243, 92, 51, 2, 224, 39, + 212, 191, 167, 51, 2, 224, 39, 212, 191, 86, 51, 2, 224, 39, 212, 191, + 173, 51, 2, 224, 39, 212, 191, 77, 51, 215, 245, 207, 15, 102, 77, 51, + 215, 245, 207, 15, 118, 212, 7, 77, 51, 215, 245, 207, 15, 119, 239, 121, + 77, 51, 215, 245, 207, 15, 119, 212, 10, 92, 249, 151, 59, 45, 86, 249, + 154, 215, 247, 59, 45, 92, 211, 102, 215, 247, 59, 45, 86, 211, 102, 215, + 247, 59, 45, 92, 230, 40, 59, 45, 86, 218, 161, 59, 45, 92, 218, 161, 59, + 45, 86, 230, 40, 59, 45, 92, 250, 175, 215, 246, 59, 45, 86, 250, 175, + 215, 246, 59, 45, 92, 241, 96, 215, 246, 59, 45, 86, 241, 96, 215, 246, + 59, 45, 59, 51, 215, 245, 207, 15, 102, 59, 51, 215, 245, 207, 15, 118, + 212, 7, 10, 15, 237, 171, 10, 15, 237, 170, 10, 15, 237, 169, 10, 15, + 237, 168, 10, 15, 237, 167, 10, 15, 237, 166, 10, 15, 237, 165, 10, 15, + 237, 164, 10, 15, 237, 163, 10, 15, 237, 162, 10, 15, 237, 161, 10, 15, + 237, 160, 10, 15, 237, 159, 10, 15, 237, 158, 10, 15, 237, 157, 10, 15, + 237, 156, 10, 15, 237, 155, 10, 15, 237, 154, 10, 15, 237, 153, 10, 15, + 237, 152, 10, 15, 237, 151, 10, 15, 237, 150, 10, 15, 237, 149, 10, 15, + 237, 148, 10, 15, 237, 147, 10, 15, 237, 146, 10, 15, 237, 145, 10, 15, + 237, 144, 10, 15, 237, 143, 10, 15, 237, 142, 10, 15, 237, 141, 10, 15, + 237, 140, 10, 15, 237, 139, 10, 15, 237, 138, 10, 15, 237, 137, 10, 15, + 237, 136, 10, 15, 237, 135, 10, 15, 237, 134, 10, 15, 237, 133, 10, 15, + 237, 132, 10, 15, 237, 131, 10, 15, 237, 130, 10, 15, 237, 129, 10, 15, + 237, 128, 10, 15, 237, 127, 10, 15, 237, 126, 10, 15, 237, 125, 10, 15, + 237, 124, 10, 15, 237, 123, 10, 15, 237, 122, 10, 15, 237, 121, 10, 15, + 237, 120, 10, 15, 237, 119, 10, 15, 237, 118, 10, 15, 237, 117, 10, 15, + 237, 116, 10, 15, 237, 115, 10, 15, 237, 114, 10, 15, 237, 113, 10, 15, + 237, 112, 10, 15, 237, 111, 10, 15, 237, 110, 10, 15, 237, 109, 10, 15, + 237, 108, 10, 15, 237, 107, 10, 15, 237, 106, 10, 15, 237, 105, 10, 15, + 237, 104, 10, 15, 237, 103, 10, 15, 237, 102, 10, 15, 237, 101, 10, 15, + 237, 100, 10, 15, 237, 99, 10, 15, 237, 98, 10, 15, 237, 97, 10, 15, 237, + 96, 10, 15, 237, 95, 10, 15, 237, 94, 10, 15, 237, 93, 10, 15, 237, 92, + 10, 15, 237, 91, 10, 15, 237, 90, 10, 15, 237, 89, 10, 15, 237, 88, 10, + 15, 237, 87, 10, 15, 237, 86, 10, 15, 237, 85, 10, 15, 237, 84, 10, 15, + 237, 83, 10, 15, 237, 82, 10, 15, 237, 81, 10, 15, 237, 80, 10, 15, 237, + 79, 10, 15, 237, 78, 10, 15, 237, 77, 10, 15, 237, 76, 10, 15, 237, 75, + 10, 15, 237, 74, 10, 15, 237, 73, 10, 15, 237, 72, 10, 15, 237, 71, 10, + 15, 237, 70, 10, 15, 237, 69, 10, 15, 237, 68, 10, 15, 237, 67, 10, 15, + 237, 66, 10, 15, 237, 65, 10, 15, 237, 64, 10, 15, 237, 63, 10, 15, 237, + 62, 10, 15, 237, 61, 10, 15, 237, 60, 10, 15, 237, 59, 10, 15, 237, 58, + 10, 15, 237, 57, 10, 15, 237, 56, 10, 15, 237, 55, 10, 15, 237, 54, 10, + 15, 237, 53, 10, 15, 237, 52, 10, 15, 237, 51, 10, 15, 237, 50, 10, 15, + 237, 49, 10, 15, 237, 48, 10, 15, 237, 47, 10, 15, 237, 46, 10, 15, 237, + 45, 10, 15, 237, 44, 10, 15, 237, 43, 10, 15, 237, 42, 10, 15, 237, 41, + 10, 15, 237, 40, 10, 15, 237, 39, 10, 15, 237, 38, 10, 15, 237, 37, 10, + 15, 237, 36, 10, 15, 237, 35, 10, 15, 237, 34, 10, 15, 237, 33, 10, 15, + 237, 32, 10, 15, 237, 31, 10, 15, 237, 30, 10, 15, 237, 29, 10, 15, 237, + 28, 10, 15, 237, 27, 10, 15, 237, 26, 10, 15, 237, 25, 10, 15, 237, 24, + 10, 15, 237, 23, 10, 15, 237, 22, 10, 15, 237, 21, 10, 15, 237, 20, 10, + 15, 237, 19, 10, 15, 237, 18, 10, 15, 237, 17, 10, 15, 237, 16, 10, 15, + 237, 15, 10, 15, 237, 14, 10, 15, 237, 13, 10, 15, 237, 12, 10, 15, 237, + 11, 10, 15, 237, 10, 10, 15, 237, 9, 10, 15, 237, 8, 10, 15, 237, 7, 10, + 15, 237, 6, 10, 15, 237, 5, 10, 15, 237, 4, 10, 15, 237, 3, 10, 15, 237, + 2, 10, 15, 237, 1, 10, 15, 237, 0, 10, 15, 236, 255, 10, 15, 236, 254, + 10, 15, 236, 253, 10, 15, 236, 252, 10, 15, 236, 251, 10, 15, 236, 250, + 10, 15, 236, 249, 10, 15, 236, 248, 10, 15, 236, 247, 10, 15, 236, 246, + 10, 15, 236, 245, 10, 15, 236, 244, 10, 15, 236, 243, 10, 15, 236, 242, + 10, 15, 236, 241, 10, 15, 236, 240, 10, 15, 236, 239, 10, 15, 236, 238, + 10, 15, 236, 237, 10, 15, 236, 236, 10, 15, 236, 235, 10, 15, 236, 234, + 10, 15, 236, 233, 10, 15, 236, 232, 10, 15, 236, 231, 10, 15, 236, 230, + 10, 15, 236, 229, 10, 15, 236, 228, 10, 15, 236, 227, 10, 15, 236, 226, + 10, 15, 236, 225, 10, 15, 236, 224, 10, 15, 236, 223, 10, 15, 236, 222, + 10, 15, 236, 221, 10, 15, 236, 220, 10, 15, 236, 219, 10, 15, 236, 218, + 10, 15, 236, 217, 10, 15, 236, 216, 10, 15, 236, 215, 10, 15, 236, 214, + 10, 15, 236, 213, 10, 15, 236, 212, 10, 15, 236, 211, 10, 15, 236, 210, + 10, 15, 236, 209, 10, 15, 236, 208, 10, 15, 236, 207, 10, 15, 236, 206, + 10, 15, 236, 205, 10, 15, 236, 204, 10, 15, 236, 203, 10, 15, 236, 202, + 10, 15, 236, 201, 10, 15, 236, 200, 10, 15, 236, 199, 10, 15, 236, 198, + 10, 15, 236, 197, 10, 15, 236, 196, 10, 15, 236, 195, 10, 15, 236, 194, + 10, 15, 236, 193, 10, 15, 236, 192, 10, 15, 236, 191, 10, 15, 236, 190, + 10, 15, 236, 189, 10, 15, 236, 188, 10, 15, 236, 187, 10, 15, 236, 186, + 10, 15, 236, 185, 10, 15, 236, 184, 10, 15, 236, 183, 10, 15, 236, 182, + 10, 15, 236, 181, 10, 15, 236, 180, 10, 15, 236, 179, 10, 15, 236, 178, + 10, 15, 236, 177, 10, 15, 236, 176, 10, 15, 236, 175, 10, 15, 236, 174, + 10, 15, 236, 173, 10, 15, 236, 172, 10, 15, 236, 171, 10, 15, 236, 170, + 10, 15, 236, 169, 10, 15, 236, 168, 10, 15, 236, 167, 10, 15, 236, 166, + 10, 15, 236, 165, 10, 15, 236, 164, 10, 15, 236, 163, 10, 15, 236, 162, + 10, 15, 236, 161, 10, 15, 236, 160, 10, 15, 236, 159, 10, 15, 236, 158, + 10, 15, 236, 157, 10, 15, 236, 156, 10, 15, 236, 155, 10, 15, 236, 154, + 10, 15, 236, 153, 10, 15, 236, 152, 10, 15, 236, 151, 10, 15, 236, 150, + 10, 15, 236, 149, 10, 15, 236, 148, 10, 15, 236, 147, 10, 15, 236, 146, + 10, 15, 236, 145, 10, 15, 236, 144, 10, 15, 236, 143, 10, 15, 236, 142, + 10, 15, 236, 141, 10, 15, 236, 140, 10, 15, 236, 139, 10, 15, 236, 138, + 10, 15, 236, 137, 10, 15, 236, 136, 10, 15, 236, 135, 10, 15, 236, 134, + 10, 15, 236, 133, 10, 15, 236, 132, 10, 15, 236, 131, 10, 15, 236, 130, + 10, 15, 236, 129, 10, 15, 236, 128, 10, 15, 236, 127, 10, 15, 236, 126, + 10, 15, 236, 125, 10, 15, 236, 124, 10, 15, 236, 123, 10, 15, 236, 122, + 10, 15, 236, 121, 10, 15, 236, 120, 10, 15, 236, 119, 10, 15, 236, 118, + 10, 15, 236, 117, 10, 15, 236, 116, 10, 15, 236, 115, 10, 15, 236, 114, + 10, 15, 236, 113, 10, 15, 236, 112, 10, 15, 236, 111, 10, 15, 236, 110, + 10, 15, 236, 109, 10, 15, 236, 108, 10, 15, 236, 107, 10, 15, 236, 106, + 10, 15, 236, 105, 10, 15, 236, 104, 10, 15, 236, 103, 10, 15, 236, 102, + 10, 15, 236, 101, 10, 15, 236, 100, 10, 15, 236, 99, 10, 15, 236, 98, 10, + 15, 236, 97, 10, 15, 236, 96, 10, 15, 236, 95, 10, 15, 236, 94, 10, 15, + 236, 93, 10, 15, 236, 92, 10, 15, 236, 91, 10, 15, 236, 90, 10, 15, 236, + 89, 10, 15, 236, 88, 10, 15, 236, 87, 10, 15, 236, 86, 10, 15, 236, 85, + 10, 15, 236, 84, 10, 15, 236, 83, 10, 15, 236, 82, 10, 15, 236, 81, 10, + 15, 236, 80, 10, 15, 236, 79, 10, 15, 236, 78, 10, 15, 236, 77, 10, 15, + 236, 76, 10, 15, 236, 75, 10, 15, 236, 74, 10, 15, 236, 73, 10, 15, 236, + 72, 10, 15, 236, 71, 10, 15, 236, 70, 10, 15, 236, 69, 10, 15, 236, 68, + 10, 15, 236, 67, 10, 15, 236, 66, 10, 15, 236, 65, 10, 15, 236, 64, 10, + 15, 236, 63, 10, 15, 236, 62, 10, 15, 236, 61, 10, 15, 236, 60, 10, 15, + 236, 59, 10, 15, 236, 58, 10, 15, 236, 57, 10, 15, 236, 56, 10, 15, 236, + 55, 10, 15, 236, 54, 10, 15, 236, 53, 10, 15, 236, 52, 10, 15, 236, 51, + 10, 15, 236, 50, 10, 15, 236, 49, 10, 15, 236, 48, 10, 15, 236, 47, 10, + 15, 236, 46, 10, 15, 236, 45, 10, 15, 236, 44, 10, 15, 236, 43, 10, 15, + 236, 42, 10, 15, 236, 41, 10, 15, 236, 40, 10, 15, 236, 39, 10, 15, 236, + 38, 10, 15, 236, 37, 10, 15, 236, 36, 10, 15, 236, 35, 10, 15, 236, 34, + 10, 15, 236, 33, 10, 15, 236, 32, 10, 15, 236, 31, 10, 15, 236, 30, 10, + 15, 236, 29, 10, 15, 236, 28, 10, 15, 236, 27, 10, 15, 236, 26, 10, 15, + 236, 25, 10, 15, 236, 24, 10, 15, 236, 23, 10, 15, 236, 22, 10, 15, 236, + 21, 10, 15, 236, 20, 10, 15, 236, 19, 10, 15, 236, 18, 10, 15, 236, 17, + 10, 15, 236, 16, 10, 15, 236, 15, 10, 15, 236, 14, 10, 15, 236, 13, 10, + 15, 236, 12, 10, 15, 236, 11, 10, 15, 236, 10, 10, 15, 236, 9, 10, 15, + 236, 8, 10, 15, 236, 7, 10, 15, 236, 6, 10, 15, 236, 5, 10, 15, 236, 4, + 10, 15, 236, 3, 10, 15, 236, 2, 10, 15, 236, 1, 10, 15, 236, 0, 10, 15, + 235, 255, 10, 15, 235, 254, 10, 15, 235, 253, 10, 15, 235, 252, 10, 15, + 235, 251, 10, 15, 235, 250, 10, 15, 235, 249, 10, 15, 235, 248, 10, 15, + 235, 247, 10, 15, 235, 246, 10, 15, 235, 245, 10, 15, 235, 244, 10, 15, + 235, 243, 10, 15, 235, 242, 10, 15, 235, 241, 10, 15, 235, 240, 10, 15, + 235, 239, 10, 15, 235, 238, 10, 15, 235, 237, 10, 15, 235, 236, 10, 15, + 235, 235, 10, 15, 235, 234, 10, 15, 235, 233, 10, 15, 235, 232, 10, 15, + 235, 231, 10, 15, 235, 230, 10, 15, 235, 229, 10, 15, 235, 228, 10, 15, + 235, 227, 10, 15, 235, 226, 10, 15, 235, 225, 10, 15, 235, 224, 10, 15, + 235, 223, 10, 15, 235, 222, 10, 15, 235, 221, 10, 15, 235, 220, 10, 15, + 235, 219, 10, 15, 235, 218, 10, 15, 235, 217, 10, 15, 235, 216, 10, 15, + 235, 215, 10, 15, 235, 214, 10, 15, 235, 213, 10, 15, 235, 212, 10, 15, + 235, 211, 10, 15, 235, 210, 10, 15, 235, 209, 10, 15, 235, 208, 10, 15, + 235, 207, 10, 15, 235, 206, 10, 15, 235, 205, 10, 15, 235, 204, 10, 15, + 235, 203, 10, 15, 235, 202, 10, 15, 235, 201, 10, 15, 235, 200, 10, 15, + 235, 199, 10, 15, 235, 198, 10, 15, 235, 197, 10, 15, 235, 196, 10, 15, + 235, 195, 10, 15, 235, 194, 10, 15, 235, 193, 10, 15, 235, 192, 10, 15, + 235, 191, 10, 15, 235, 190, 10, 15, 235, 189, 10, 15, 235, 188, 10, 15, + 235, 187, 10, 15, 235, 186, 10, 15, 235, 185, 10, 15, 235, 184, 10, 15, + 235, 183, 10, 15, 235, 182, 10, 15, 235, 181, 10, 15, 235, 180, 10, 15, + 235, 179, 10, 15, 235, 178, 10, 15, 235, 177, 10, 15, 235, 176, 10, 15, + 235, 175, 10, 15, 235, 174, 10, 15, 235, 173, 10, 15, 235, 172, 10, 15, + 235, 171, 10, 15, 235, 170, 10, 15, 235, 169, 10, 15, 235, 168, 10, 15, + 235, 167, 10, 15, 235, 166, 10, 15, 235, 165, 10, 15, 235, 164, 10, 15, + 235, 163, 10, 15, 235, 162, 10, 15, 235, 161, 10, 15, 235, 160, 10, 15, + 235, 159, 10, 15, 235, 158, 10, 15, 235, 157, 10, 15, 235, 156, 10, 15, + 235, 155, 10, 15, 235, 154, 10, 15, 235, 153, 10, 15, 235, 152, 10, 15, + 235, 151, 10, 15, 235, 150, 10, 15, 235, 149, 10, 15, 235, 148, 10, 15, + 235, 147, 10, 15, 235, 146, 10, 15, 235, 145, 10, 15, 235, 144, 10, 15, + 235, 143, 10, 15, 235, 142, 230, 92, 212, 198, 150, 214, 153, 150, 242, + 168, 83, 150, 219, 180, 83, 150, 43, 53, 150, 245, 35, 53, 150, 221, 131, + 53, 150, 252, 125, 150, 252, 53, 150, 47, 221, 216, 150, 48, 221, 216, + 150, 251, 209, 150, 101, 53, 150, 247, 155, 150, 237, 238, 150, 241, 82, + 213, 251, 150, 214, 180, 150, 18, 205, 85, 150, 18, 102, 150, 18, 105, + 150, 18, 142, 150, 18, 139, 150, 18, 168, 150, 18, 184, 150, 18, 195, + 150, 18, 193, 150, 18, 200, 150, 247, 162, 150, 216, 52, 150, 230, 10, + 53, 150, 242, 242, 53, 150, 239, 230, 53, 150, 219, 196, 83, 150, 247, + 153, 251, 199, 150, 7, 6, 1, 62, 150, 7, 6, 1, 251, 150, 150, 7, 6, 1, + 249, 34, 150, 7, 6, 1, 246, 240, 150, 7, 6, 1, 75, 150, 7, 6, 1, 242, + 139, 150, 7, 6, 1, 241, 55, 150, 7, 6, 1, 239, 155, 150, 7, 6, 1, 74, + 150, 7, 6, 1, 232, 203, 150, 7, 6, 1, 232, 76, 150, 7, 6, 1, 149, 150, 7, + 6, 1, 229, 28, 150, 7, 6, 1, 226, 33, 150, 7, 6, 1, 76, 150, 7, 6, 1, + 222, 67, 150, 7, 6, 1, 220, 27, 150, 7, 6, 1, 137, 150, 7, 6, 1, 182, + 150, 7, 6, 1, 213, 10, 150, 7, 6, 1, 71, 150, 7, 6, 1, 209, 148, 150, 7, + 6, 1, 207, 129, 150, 7, 6, 1, 206, 195, 150, 7, 6, 1, 206, 123, 150, 7, + 6, 1, 205, 159, 150, 47, 49, 145, 150, 218, 225, 214, 180, 150, 48, 49, + 145, 150, 247, 228, 253, 21, 150, 114, 229, 205, 150, 239, 237, 253, 21, + 150, 7, 5, 1, 62, 150, 7, 5, 1, 251, 150, 150, 7, 5, 1, 249, 34, 150, 7, + 5, 1, 246, 240, 150, 7, 5, 1, 75, 150, 7, 5, 1, 242, 139, 150, 7, 5, 1, + 241, 55, 150, 7, 5, 1, 239, 155, 150, 7, 5, 1, 74, 150, 7, 5, 1, 232, + 203, 150, 7, 5, 1, 232, 76, 150, 7, 5, 1, 149, 150, 7, 5, 1, 229, 28, + 150, 7, 5, 1, 226, 33, 150, 7, 5, 1, 76, 150, 7, 5, 1, 222, 67, 150, 7, + 5, 1, 220, 27, 150, 7, 5, 1, 137, 150, 7, 5, 1, 182, 150, 7, 5, 1, 213, + 10, 150, 7, 5, 1, 71, 150, 7, 5, 1, 209, 148, 150, 7, 5, 1, 207, 129, + 150, 7, 5, 1, 206, 195, 150, 7, 5, 1, 206, 123, 150, 7, 5, 1, 205, 159, + 150, 47, 247, 26, 145, 150, 79, 229, 205, 150, 48, 247, 26, 145, 150, + 211, 180, 248, 225, 212, 198, 54, 216, 236, 54, 216, 225, 54, 216, 214, + 54, 216, 202, 54, 216, 191, 54, 216, 180, 54, 216, 169, 54, 216, 158, 54, + 216, 147, 54, 216, 139, 54, 216, 138, 54, 216, 137, 54, 216, 136, 54, + 216, 134, 54, 216, 133, 54, 216, 132, 54, 216, 131, 54, 216, 130, 54, + 216, 129, 54, 216, 128, 54, 216, 127, 54, 216, 126, 54, 216, 125, 54, + 216, 123, 54, 216, 122, 54, 216, 121, 54, 216, 120, 54, 216, 119, 54, + 216, 118, 54, 216, 117, 54, 216, 116, 54, 216, 115, 54, 216, 114, 54, + 216, 112, 54, 216, 111, 54, 216, 110, 54, 216, 109, 54, 216, 108, 54, + 216, 107, 54, 216, 106, 54, 216, 105, 54, 216, 104, 54, 216, 103, 54, + 216, 101, 54, 216, 100, 54, 216, 99, 54, 216, 98, 54, 216, 97, 54, 216, + 96, 54, 216, 95, 54, 216, 94, 54, 216, 93, 54, 216, 92, 54, 216, 90, 54, + 216, 89, 54, 216, 88, 54, 216, 87, 54, 216, 86, 54, 216, 85, 54, 216, 84, + 54, 216, 83, 54, 216, 82, 54, 216, 81, 54, 216, 79, 54, 216, 78, 54, 216, + 77, 54, 216, 76, 54, 216, 75, 54, 216, 74, 54, 216, 73, 54, 216, 72, 54, + 216, 71, 54, 216, 70, 54, 216, 68, 54, 216, 67, 54, 216, 66, 54, 216, 65, + 54, 216, 64, 54, 216, 63, 54, 216, 62, 54, 216, 61, 54, 216, 60, 54, 216, + 59, 54, 217, 56, 54, 217, 55, 54, 217, 54, 54, 217, 53, 54, 217, 52, 54, + 217, 51, 54, 217, 50, 54, 217, 49, 54, 217, 48, 54, 217, 47, 54, 217, 45, + 54, 217, 44, 54, 217, 43, 54, 217, 42, 54, 217, 41, 54, 217, 40, 54, 217, + 39, 54, 217, 38, 54, 217, 37, 54, 217, 36, 54, 217, 34, 54, 217, 33, 54, + 217, 32, 54, 217, 31, 54, 217, 30, 54, 217, 29, 54, 217, 28, 54, 217, 27, + 54, 217, 26, 54, 217, 25, 54, 217, 23, 54, 217, 22, 54, 217, 21, 54, 217, + 20, 54, 217, 19, 54, 217, 18, 54, 217, 17, 54, 217, 16, 54, 217, 15, 54, + 217, 14, 54, 217, 12, 54, 217, 11, 54, 217, 10, 54, 217, 9, 54, 217, 8, + 54, 217, 7, 54, 217, 6, 54, 217, 5, 54, 217, 4, 54, 217, 3, 54, 217, 1, + 54, 217, 0, 54, 216, 255, 54, 216, 254, 54, 216, 253, 54, 216, 252, 54, + 216, 251, 54, 216, 250, 54, 216, 249, 54, 216, 248, 54, 216, 246, 54, + 216, 245, 54, 216, 244, 54, 216, 243, 54, 216, 242, 54, 216, 241, 54, + 216, 240, 54, 216, 239, 54, 216, 238, 54, 216, 237, 54, 216, 235, 54, + 216, 234, 54, 216, 233, 54, 216, 232, 54, 216, 231, 54, 216, 230, 54, + 216, 229, 54, 216, 228, 54, 216, 227, 54, 216, 226, 54, 216, 224, 54, + 216, 223, 54, 216, 222, 54, 216, 221, 54, 216, 220, 54, 216, 219, 54, + 216, 218, 54, 216, 217, 54, 216, 216, 54, 216, 215, 54, 216, 213, 54, + 216, 212, 54, 216, 211, 54, 216, 210, 54, 216, 209, 54, 216, 208, 54, + 216, 207, 54, 216, 206, 54, 216, 205, 54, 216, 204, 54, 216, 201, 54, + 216, 200, 54, 216, 199, 54, 216, 198, 54, 216, 197, 54, 216, 196, 54, + 216, 195, 54, 216, 194, 54, 216, 193, 54, 216, 192, 54, 216, 190, 54, + 216, 189, 54, 216, 188, 54, 216, 187, 54, 216, 186, 54, 216, 185, 54, + 216, 184, 54, 216, 183, 54, 216, 182, 54, 216, 181, 54, 216, 179, 54, + 216, 178, 54, 216, 177, 54, 216, 176, 54, 216, 175, 54, 216, 174, 54, + 216, 173, 54, 216, 172, 54, 216, 171, 54, 216, 170, 54, 216, 168, 54, + 216, 167, 54, 216, 166, 54, 216, 165, 54, 216, 164, 54, 216, 163, 54, + 216, 162, 54, 216, 161, 54, 216, 160, 54, 216, 159, 54, 216, 157, 54, + 216, 156, 54, 216, 155, 54, 216, 154, 54, 216, 153, 54, 216, 152, 54, + 216, 151, 54, 216, 150, 54, 216, 149, 54, 216, 148, 54, 216, 146, 54, + 216, 145, 54, 216, 144, 54, 216, 143, 54, 216, 142, 54, 216, 141, 54, + 216, 140, 223, 181, 223, 183, 214, 22, 73, 239, 66, 214, 183, 214, 22, + 73, 212, 60, 213, 205, 243, 34, 73, 212, 60, 242, 193, 243, 34, 73, 211, + 69, 242, 254, 243, 21, 243, 22, 253, 13, 253, 14, 252, 169, 250, 31, 250, + 170, 249, 107, 157, 212, 203, 194, 212, 203, 238, 47, 212, 207, 229, 206, + 242, 19, 186, 229, 205, 243, 34, 73, 229, 205, 229, 250, 224, 129, 243, + 1, 229, 206, 212, 203, 79, 212, 203, 207, 150, 241, 136, 242, 19, 241, + 254, 248, 191, 218, 228, 247, 73, 215, 179, 222, 93, 229, 138, 102, 214, + 193, 215, 179, 233, 68, 229, 138, 205, 85, 215, 80, 246, 73, 229, 196, + 242, 217, 245, 61, 245, 199, 247, 109, 102, 246, 62, 245, 199, 247, 109, + 105, 246, 61, 245, 199, 247, 109, 142, 246, 60, 245, 199, 247, 109, 139, + 246, 59, 170, 253, 13, 225, 215, 213, 36, 233, 131, 213, 39, 243, 34, 73, + 211, 70, 249, 193, 242, 200, 248, 224, 248, 226, 243, 34, 73, 227, 108, + 242, 255, 213, 179, 213, 196, 242, 217, 242, 218, 233, 43, 216, 40, 139, + 241, 236, 216, 39, 241, 92, 233, 43, 216, 40, 142, 239, 221, 216, 39, + 239, 218, 233, 43, 216, 40, 105, 219, 43, 216, 39, 218, 55, 233, 43, 216, + 40, 102, 209, 217, 216, 39, 209, 177, 214, 156, 245, 236, 245, 238, 222, + 40, 248, 94, 222, 42, 127, 222, 213, 220, 130, 238, 124, 249, 126, 221, + 121, 239, 35, 249, 137, 224, 68, 249, 126, 239, 35, 225, 179, 233, 53, + 233, 56, 225, 82, 229, 205, 225, 102, 214, 22, 73, 217, 61, 252, 13, 214, + 96, 243, 34, 73, 217, 61, 252, 13, 242, 220, 157, 212, 204, 216, 28, 194, + 212, 204, 216, 28, 238, 44, 157, 212, 204, 2, 232, 88, 194, 212, 204, 2, + 232, 88, 238, 45, 229, 206, 212, 204, 216, 28, 79, 212, 204, 216, 28, + 207, 149, 221, 209, 229, 206, 241, 129, 221, 209, 229, 206, 244, 8, 220, + 229, 221, 209, 229, 206, 250, 169, 221, 209, 229, 206, 209, 206, 220, + 224, 218, 225, 229, 206, 242, 19, 218, 225, 233, 53, 218, 208, 215, 41, + 215, 179, 105, 215, 38, 214, 98, 215, 41, 215, 179, 142, 215, 37, 214, + 97, 245, 199, 247, 109, 213, 227, 246, 57, 220, 118, 209, 176, 102, 220, + 118, 209, 174, 220, 81, 220, 118, 209, 176, 105, 220, 118, 209, 173, 220, + 80, 216, 29, 211, 68, 214, 21, 213, 210, 248, 225, 248, 94, 248, 167, + 227, 67, 207, 89, 226, 51, 214, 22, 73, 239, 206, 252, 13, 214, 22, 73, + 220, 99, 252, 13, 214, 155, 243, 34, 73, 239, 206, 252, 13, 243, 34, 73, + 220, 99, 252, 13, 242, 252, 214, 22, 73, 213, 227, 214, 169, 215, 41, + 239, 241, 157, 233, 4, 216, 7, 215, 41, 157, 233, 4, 217, 99, 247, 109, + 216, 37, 233, 4, 247, 41, 213, 228, 212, 86, 214, 40, 222, 134, 213, 25, + 247, 154, 222, 105, 220, 119, 227, 66, 220, 214, 252, 49, 220, 113, 247, + 154, 252, 65, 225, 167, 215, 89, 7, 6, 1, 240, 99, 7, 5, 1, 240, 99, 248, + 112, 252, 150, 213, 30, 213, 185, 247, 163, 214, 246, 230, 46, 183, 1, + 229, 163, 230, 90, 1, 241, 163, 241, 154, 230, 90, 1, 241, 163, 242, 31, + 230, 90, 1, 218, 124, 230, 90, 1, 229, 144, 72, 141, 249, 204, 215, 154, + 240, 62, 227, 16, 218, 215, 241, 69, 241, 68, 241, 67, 226, 53, 204, 246, + 204, 247, 204, 249, 229, 85, 218, 132, 229, 87, 218, 134, 221, 177, 229, + 84, 218, 131, 224, 99, 226, 185, 206, 252, 229, 86, 218, 133, 241, 91, + 221, 176, 207, 42, 243, 53, 241, 79, 226, 253, 222, 166, 209, 178, 93, + 226, 253, 246, 79, 93, 9, 4, 232, 218, 83, 220, 131, 241, 136, 33, 79, + 48, 59, 230, 16, 145, 208, 150, 208, 39, 207, 227, 207, 216, 207, 205, + 207, 194, 207, 183, 207, 172, 207, 161, 208, 149, 208, 138, 208, 127, + 208, 116, 208, 105, 208, 94, 208, 83, 249, 39, 222, 119, 83, 249, 175, + 204, 248, 14, 3, 223, 190, 212, 89, 14, 3, 223, 190, 131, 223, 190, 249, + 69, 131, 249, 68, 58, 30, 16, 241, 90, 214, 242, 248, 18, 209, 49, 208, + 72, 208, 61, 208, 50, 208, 38, 208, 27, 208, 16, 208, 5, 207, 250, 207, + 239, 207, 231, 207, 230, 207, 229, 207, 228, 207, 226, 207, 225, 207, + 224, 207, 223, 207, 222, 207, 221, 207, 220, 207, 219, 207, 218, 207, + 217, 207, 215, 207, 214, 207, 213, 207, 212, 207, 211, 207, 210, 207, + 209, 207, 208, 207, 207, 207, 206, 207, 204, 207, 203, 207, 202, 207, + 201, 207, 200, 207, 199, 207, 198, 207, 197, 207, 196, 207, 195, 207, + 193, 207, 192, 207, 191, 207, 190, 207, 189, 207, 188, 207, 187, 207, + 186, 207, 185, 207, 184, 207, 182, 207, 181, 207, 180, 207, 179, 207, + 178, 207, 177, 207, 176, 207, 175, 207, 174, 207, 173, 207, 171, 207, + 170, 207, 169, 207, 168, 207, 167, 207, 166, 207, 165, 207, 164, 207, + 163, 207, 162, 207, 160, 207, 159, 207, 158, 207, 157, 207, 156, 207, + 155, 207, 154, 207, 153, 207, 152, 207, 151, 208, 148, 208, 147, 208, + 146, 208, 145, 208, 144, 208, 143, 208, 142, 208, 141, 208, 140, 208, + 139, 208, 137, 208, 136, 208, 135, 208, 134, 208, 133, 208, 132, 208, + 131, 208, 130, 208, 129, 208, 128, 208, 126, 208, 125, 208, 124, 208, + 123, 208, 122, 208, 121, 208, 120, 208, 119, 208, 118, 208, 117, 208, + 115, 208, 114, 208, 113, 208, 112, 208, 111, 208, 110, 208, 109, 208, + 108, 208, 107, 208, 106, 208, 104, 208, 103, 208, 102, 208, 101, 208, + 100, 208, 99, 208, 98, 208, 97, 208, 96, 208, 95, 208, 93, 208, 92, 208, + 91, 208, 90, 208, 89, 208, 88, 208, 87, 208, 86, 208, 85, 208, 84, 208, + 82, 208, 81, 208, 80, 208, 79, 208, 78, 208, 77, 208, 76, 208, 75, 208, + 74, 208, 73, 208, 71, 208, 70, 208, 69, 208, 68, 208, 67, 208, 66, 208, + 65, 208, 64, 208, 63, 208, 62, 208, 60, 208, 59, 208, 58, 208, 57, 208, + 56, 208, 55, 208, 54, 208, 53, 208, 52, 208, 51, 208, 49, 208, 48, 208, + 47, 208, 46, 208, 45, 208, 44, 208, 43, 208, 42, 208, 41, 208, 40, 208, + 37, 208, 36, 208, 35, 208, 34, 208, 33, 208, 32, 208, 31, 208, 30, 208, + 29, 208, 28, 208, 26, 208, 25, 208, 24, 208, 23, 208, 22, 208, 21, 208, + 20, 208, 19, 208, 18, 208, 17, 208, 15, 208, 14, 208, 13, 208, 12, 208, + 11, 208, 10, 208, 9, 208, 8, 208, 7, 208, 6, 208, 4, 208, 3, 208, 2, 208, + 1, 208, 0, 207, 255, 207, 254, 207, 253, 207, 252, 207, 251, 207, 249, + 207, 248, 207, 247, 207, 246, 207, 245, 207, 244, 207, 243, 207, 242, + 207, 241, 207, 240, 207, 238, 207, 237, 207, 236, 207, 235, 207, 234, + 207, 233, 207, 232, 7, 6, 1, 32, 2, 228, 14, 23, 239, 236, 7, 5, 1, 32, + 2, 228, 14, 23, 239, 236, 7, 6, 1, 174, 2, 79, 229, 206, 55, 7, 5, 1, + 174, 2, 79, 229, 206, 55, 7, 6, 1, 174, 2, 79, 229, 206, 250, 26, 23, + 239, 236, 7, 5, 1, 174, 2, 79, 229, 206, 250, 26, 23, 239, 236, 7, 6, 1, + 174, 2, 79, 229, 206, 250, 26, 23, 153, 7, 5, 1, 174, 2, 79, 229, 206, + 250, 26, 23, 153, 7, 6, 1, 174, 2, 247, 228, 23, 228, 13, 7, 5, 1, 174, + 2, 247, 228, 23, 228, 13, 7, 6, 1, 174, 2, 247, 228, 23, 248, 195, 7, 5, + 1, 174, 2, 247, 228, 23, 248, 195, 7, 6, 1, 237, 225, 2, 228, 14, 23, + 239, 236, 7, 5, 1, 237, 225, 2, 228, 14, 23, 239, 236, 7, 5, 1, 237, 225, + 2, 67, 84, 23, 153, 7, 5, 1, 225, 80, 2, 211, 181, 52, 7, 6, 1, 148, 2, + 79, 229, 206, 55, 7, 5, 1, 148, 2, 79, 229, 206, 55, 7, 6, 1, 148, 2, 79, + 229, 206, 250, 26, 23, 239, 236, 7, 5, 1, 148, 2, 79, 229, 206, 250, 26, + 23, 239, 236, 7, 6, 1, 148, 2, 79, 229, 206, 250, 26, 23, 153, 7, 5, 1, + 148, 2, 79, 229, 206, 250, 26, 23, 153, 7, 6, 1, 218, 1, 2, 79, 229, 206, + 55, 7, 5, 1, 218, 1, 2, 79, 229, 206, 55, 7, 6, 1, 106, 2, 228, 14, 23, + 239, 236, 7, 5, 1, 106, 2, 228, 14, 23, 239, 236, 7, 6, 1, 32, 2, 222, + 197, 23, 153, 7, 5, 1, 32, 2, 222, 197, 23, 153, 7, 6, 1, 32, 2, 222, + 197, 23, 211, 180, 7, 5, 1, 32, 2, 222, 197, 23, 211, 180, 7, 6, 1, 174, + 2, 222, 197, 23, 153, 7, 5, 1, 174, 2, 222, 197, 23, 153, 7, 6, 1, 174, + 2, 222, 197, 23, 211, 180, 7, 5, 1, 174, 2, 222, 197, 23, 211, 180, 7, 6, + 1, 174, 2, 67, 84, 23, 153, 7, 5, 1, 174, 2, 67, 84, 23, 153, 7, 6, 1, + 174, 2, 67, 84, 23, 211, 180, 7, 5, 1, 174, 2, 67, 84, 23, 211, 180, 7, + 5, 1, 237, 225, 2, 67, 84, 23, 239, 236, 7, 5, 1, 237, 225, 2, 67, 84, + 23, 211, 180, 7, 6, 1, 237, 225, 2, 222, 197, 23, 153, 7, 5, 1, 237, 225, + 2, 222, 197, 23, 67, 84, 23, 153, 7, 6, 1, 237, 225, 2, 222, 197, 23, + 211, 180, 7, 5, 1, 237, 225, 2, 222, 197, 23, 67, 84, 23, 211, 180, 7, 6, + 1, 232, 204, 2, 211, 180, 7, 5, 1, 232, 204, 2, 67, 84, 23, 211, 180, 7, + 6, 1, 230, 159, 2, 211, 180, 7, 5, 1, 230, 159, 2, 211, 180, 7, 6, 1, + 229, 29, 2, 211, 180, 7, 5, 1, 229, 29, 2, 211, 180, 7, 6, 1, 219, 150, + 2, 211, 180, 7, 5, 1, 219, 150, 2, 211, 180, 7, 6, 1, 106, 2, 222, 197, + 23, 153, 7, 5, 1, 106, 2, 222, 197, 23, 153, 7, 6, 1, 106, 2, 222, 197, + 23, 211, 180, 7, 5, 1, 106, 2, 222, 197, 23, 211, 180, 7, 6, 1, 106, 2, + 228, 14, 23, 153, 7, 5, 1, 106, 2, 228, 14, 23, 153, 7, 6, 1, 106, 2, + 228, 14, 23, 211, 180, 7, 5, 1, 106, 2, 228, 14, 23, 211, 180, 7, 5, 1, + 252, 249, 2, 239, 236, 7, 5, 1, 222, 142, 148, 2, 239, 236, 7, 5, 1, 222, + 142, 148, 2, 153, 7, 5, 1, 201, 209, 149, 2, 239, 236, 7, 5, 1, 201, 209, + 149, 2, 153, 7, 5, 1, 217, 101, 2, 239, 236, 7, 5, 1, 217, 101, 2, 153, + 7, 5, 1, 238, 129, 217, 101, 2, 239, 236, 7, 5, 1, 238, 129, 217, 101, 2, + 153, 8, 216, 37, 87, 2, 239, 112, 84, 2, 252, 172, 8, 216, 37, 87, 2, + 239, 112, 84, 2, 207, 59, 8, 216, 37, 87, 2, 239, 112, 84, 2, 126, 227, + 228, 8, 216, 37, 87, 2, 239, 112, 84, 2, 222, 206, 8, 216, 37, 87, 2, + 239, 112, 84, 2, 71, 8, 216, 37, 87, 2, 239, 112, 84, 2, 205, 213, 8, + 216, 37, 87, 2, 239, 112, 84, 2, 75, 8, 216, 37, 87, 2, 239, 112, 84, 2, + 252, 248, 8, 216, 37, 224, 55, 2, 231, 212, 165, 1, 231, 142, 40, 107, + 232, 76, 40, 107, 225, 79, 40, 107, 249, 34, 40, 107, 223, 146, 40, 107, + 210, 211, 40, 107, 224, 104, 40, 107, 213, 10, 40, 107, 226, 33, 40, 107, + 222, 67, 40, 107, 229, 28, 40, 107, 206, 123, 40, 107, 137, 40, 107, 149, + 40, 107, 209, 148, 40, 107, 229, 164, 40, 107, 229, 173, 40, 107, 218, + 90, 40, 107, 224, 86, 40, 107, 232, 203, 40, 107, 216, 4, 40, 107, 214, + 99, 40, 107, 182, 40, 107, 239, 155, 40, 107, 230, 251, 40, 4, 232, 63, + 40, 4, 231, 123, 40, 4, 231, 111, 40, 4, 230, 236, 40, 4, 230, 202, 40, + 4, 231, 224, 40, 4, 231, 221, 40, 4, 232, 41, 40, 4, 231, 53, 40, 4, 231, + 33, 40, 4, 231, 242, 40, 4, 225, 76, 40, 4, 225, 25, 40, 4, 225, 21, 40, + 4, 224, 246, 40, 4, 224, 238, 40, 4, 225, 64, 40, 4, 225, 62, 40, 4, 225, + 73, 40, 4, 225, 2, 40, 4, 224, 253, 40, 4, 225, 66, 40, 4, 249, 0, 40, 4, + 247, 251, 40, 4, 247, 241, 40, 4, 247, 40, 40, 4, 247, 9, 40, 4, 248, + 148, 40, 4, 248, 140, 40, 4, 248, 245, 40, 4, 247, 174, 40, 4, 247, 105, + 40, 4, 248, 181, 40, 4, 223, 143, 40, 4, 223, 125, 40, 4, 223, 120, 40, + 4, 223, 103, 40, 4, 223, 95, 40, 4, 223, 134, 40, 4, 223, 133, 40, 4, + 223, 140, 40, 4, 223, 110, 40, 4, 223, 107, 40, 4, 223, 137, 40, 4, 210, + 207, 40, 4, 210, 187, 40, 4, 210, 186, 40, 4, 210, 175, 40, 4, 210, 172, + 40, 4, 210, 203, 40, 4, 210, 202, 40, 4, 210, 206, 40, 4, 210, 185, 40, + 4, 210, 184, 40, 4, 210, 205, 40, 4, 224, 102, 40, 4, 224, 88, 40, 4, + 224, 87, 40, 4, 224, 71, 40, 4, 224, 70, 40, 4, 224, 98, 40, 4, 224, 97, + 40, 4, 224, 101, 40, 4, 224, 73, 40, 4, 224, 72, 40, 4, 224, 100, 40, 4, + 212, 215, 40, 4, 211, 211, 40, 4, 211, 195, 40, 4, 210, 170, 40, 4, 210, + 135, 40, 4, 212, 131, 40, 4, 212, 120, 40, 4, 212, 193, 40, 4, 124, 40, + 4, 211, 105, 40, 4, 212, 151, 40, 4, 225, 232, 40, 4, 224, 230, 40, 4, + 224, 205, 40, 4, 223, 217, 40, 4, 223, 158, 40, 4, 225, 110, 40, 4, 225, + 106, 40, 4, 225, 218, 40, 4, 224, 67, 40, 4, 224, 56, 40, 4, 225, 191, + 40, 4, 222, 51, 40, 4, 221, 53, 40, 4, 221, 15, 40, 4, 220, 82, 40, 4, + 220, 50, 40, 4, 221, 174, 40, 4, 221, 164, 40, 4, 222, 32, 40, 4, 220, + 211, 40, 4, 220, 187, 40, 4, 221, 188, 40, 4, 228, 18, 40, 4, 226, 254, + 40, 4, 226, 224, 40, 4, 226, 114, 40, 4, 226, 62, 40, 4, 227, 119, 40, 4, + 227, 107, 40, 4, 227, 239, 40, 4, 226, 181, 40, 4, 226, 150, 40, 4, 227, + 166, 40, 4, 206, 109, 40, 4, 206, 11, 40, 4, 206, 2, 40, 4, 205, 213, 40, + 4, 205, 181, 40, 4, 206, 52, 40, 4, 206, 49, 40, 4, 206, 88, 40, 4, 205, + 247, 40, 4, 205, 232, 40, 4, 206, 61, 40, 4, 219, 109, 40, 4, 218, 208, + 40, 4, 218, 154, 40, 4, 218, 50, 40, 4, 218, 21, 40, 4, 219, 51, 40, 4, + 219, 29, 40, 4, 219, 90, 40, 4, 218, 124, 40, 4, 218, 107, 40, 4, 219, + 60, 40, 4, 230, 140, 40, 4, 229, 235, 40, 4, 229, 219, 40, 4, 229, 81, + 40, 4, 229, 53, 40, 4, 230, 58, 40, 4, 230, 50, 40, 4, 230, 114, 40, 4, + 229, 144, 40, 4, 229, 115, 40, 4, 230, 75, 40, 4, 209, 69, 40, 4, 208, + 214, 40, 4, 208, 199, 40, 4, 207, 148, 40, 4, 207, 141, 40, 4, 209, 39, + 40, 4, 209, 34, 40, 4, 209, 65, 40, 4, 208, 173, 40, 4, 208, 161, 40, 4, + 209, 45, 40, 4, 229, 162, 40, 4, 229, 157, 40, 4, 229, 156, 40, 4, 229, + 153, 40, 4, 229, 152, 40, 4, 229, 159, 40, 4, 229, 158, 40, 4, 229, 161, + 40, 4, 229, 155, 40, 4, 229, 154, 40, 4, 229, 160, 40, 4, 229, 171, 40, + 4, 229, 166, 40, 4, 229, 165, 40, 4, 229, 149, 40, 4, 229, 148, 40, 4, + 229, 168, 40, 4, 229, 167, 40, 4, 229, 170, 40, 4, 229, 151, 40, 4, 229, + 150, 40, 4, 229, 169, 40, 4, 218, 88, 40, 4, 218, 77, 40, 4, 218, 76, 40, + 4, 218, 70, 40, 4, 218, 63, 40, 4, 218, 84, 40, 4, 218, 83, 40, 4, 218, + 87, 40, 4, 218, 75, 40, 4, 218, 74, 40, 4, 218, 86, 40, 4, 224, 84, 40, + 4, 224, 79, 40, 4, 224, 78, 40, 4, 224, 75, 40, 4, 224, 74, 40, 4, 224, + 81, 40, 4, 224, 80, 40, 4, 224, 83, 40, 4, 224, 77, 40, 4, 224, 76, 40, + 4, 224, 82, 40, 4, 232, 199, 40, 4, 232, 162, 40, 4, 232, 155, 40, 4, + 232, 104, 40, 4, 232, 86, 40, 4, 232, 182, 40, 4, 232, 180, 40, 4, 232, + 193, 40, 4, 232, 122, 40, 4, 232, 113, 40, 4, 232, 187, 40, 4, 215, 254, + 40, 4, 215, 183, 40, 4, 215, 178, 40, 4, 215, 116, 40, 4, 215, 100, 40, + 4, 215, 214, 40, 4, 215, 212, 40, 4, 215, 243, 40, 4, 215, 158, 40, 4, + 215, 152, 40, 4, 215, 223, 40, 4, 214, 95, 40, 4, 214, 64, 40, 4, 214, + 60, 40, 4, 214, 51, 40, 4, 214, 48, 40, 4, 214, 70, 40, 4, 214, 69, 40, + 4, 214, 94, 40, 4, 214, 56, 40, 4, 214, 55, 40, 4, 214, 72, 40, 4, 217, + 196, 40, 4, 215, 80, 40, 4, 215, 61, 40, 4, 213, 203, 40, 4, 213, 119, + 40, 4, 217, 86, 40, 4, 217, 74, 40, 4, 217, 181, 40, 4, 214, 193, 40, 4, + 214, 174, 40, 4, 217, 125, 40, 4, 239, 141, 40, 4, 239, 11, 40, 4, 238, + 247, 40, 4, 238, 42, 40, 4, 238, 19, 40, 4, 239, 71, 40, 4, 239, 53, 40, + 4, 239, 131, 40, 4, 238, 149, 40, 4, 238, 131, 40, 4, 239, 80, 40, 4, + 230, 250, 40, 4, 230, 249, 40, 4, 230, 244, 40, 4, 230, 243, 40, 4, 230, + 240, 40, 4, 230, 239, 40, 4, 230, 246, 40, 4, 230, 245, 40, 4, 230, 248, + 40, 4, 230, 242, 40, 4, 230, 241, 40, 4, 230, 247, 40, 4, 215, 122, 132, + 107, 3, 206, 74, 132, 107, 3, 219, 79, 132, 107, 3, 218, 253, 108, 1, + 210, 74, 82, 107, 3, 247, 169, 172, 82, 107, 3, 247, 169, 231, 167, 82, + 107, 3, 247, 169, 231, 53, 82, 107, 3, 247, 169, 231, 138, 82, 107, 3, + 247, 169, 225, 2, 82, 107, 3, 247, 169, 249, 1, 82, 107, 3, 247, 169, + 248, 110, 82, 107, 3, 247, 169, 247, 174, 82, 107, 3, 247, 169, 248, 32, + 82, 107, 3, 247, 169, 223, 110, 82, 107, 3, 247, 169, 246, 145, 82, 107, + 3, 247, 169, 210, 196, 82, 107, 3, 247, 169, 245, 51, 82, 107, 3, 247, + 169, 210, 191, 82, 107, 3, 247, 169, 199, 82, 107, 3, 247, 169, 212, 219, + 82, 107, 3, 247, 169, 212, 56, 82, 107, 3, 247, 169, 124, 82, 107, 3, + 247, 169, 211, 253, 82, 107, 3, 247, 169, 224, 67, 82, 107, 3, 247, 169, + 250, 183, 82, 107, 3, 247, 169, 221, 93, 82, 107, 3, 247, 169, 220, 211, + 82, 107, 3, 247, 169, 221, 66, 82, 107, 3, 247, 169, 226, 181, 82, 107, + 3, 247, 169, 205, 247, 82, 107, 3, 247, 169, 218, 124, 82, 107, 3, 247, + 169, 229, 144, 82, 107, 3, 247, 169, 208, 173, 82, 107, 3, 247, 169, 216, + 2, 82, 107, 3, 247, 169, 214, 96, 82, 107, 3, 247, 169, 217, 199, 82, + 107, 3, 247, 169, 155, 82, 107, 3, 247, 169, 230, 141, 82, 22, 3, 247, + 169, 220, 19, 82, 233, 55, 22, 3, 247, 169, 219, 214, 82, 233, 55, 22, 3, + 247, 169, 218, 9, 82, 233, 55, 22, 3, 247, 169, 218, 2, 82, 233, 55, 22, + 3, 247, 169, 219, 255, 82, 22, 3, 222, 173, 82, 22, 3, 253, 125, 161, 1, + 249, 237, 225, 77, 161, 1, 249, 237, 225, 25, 161, 1, 249, 237, 224, 246, + 161, 1, 249, 237, 225, 64, 161, 1, 249, 237, 225, 2, 64, 1, 249, 237, + 225, 77, 64, 1, 249, 237, 225, 25, 64, 1, 249, 237, 224, 246, 64, 1, 249, + 237, 225, 64, 64, 1, 249, 237, 225, 2, 64, 1, 252, 198, 248, 148, 64, 1, + 252, 198, 210, 170, 64, 1, 252, 198, 124, 64, 1, 252, 198, 222, 67, 65, + 1, 242, 156, 242, 155, 247, 113, 135, 134, 65, 1, 242, 155, 242, 156, + 247, 113, 135, 134, }; static unsigned char phrasebook_offset1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 104, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 129, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 130, 131, - 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, - 146, 147, 87, 148, 149, 150, 151, 152, 87, 87, 87, 87, 87, 87, 153, 87, - 154, 155, 156, 87, 157, 87, 158, 87, 87, 87, 159, 87, 87, 87, 160, 161, - 162, 163, 87, 87, 87, 87, 87, 87, 87, 87, 87, 164, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 165, 166, 167, 168, - 169, 170, 171, 87, 172, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 173, 174, 175, 176, 177, 178, - 179, 180, 181, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 182, - 183, 184, 185, 186, 87, 87, 87, 87, 87, 87, 87, 87, 87, 187, 188, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 189, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 190, 191, 192, 193, 194, 87, 195, - 87, 196, 197, 198, 199, 200, 201, 202, 203, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 204, 205, 87, 87, 206, 207, 208, 209, 210, 87, 211, 212, 213, 214, - 215, 216, 217, 218, 219, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 220, 221, - 222, 223, 224, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 225, 87, 226, 227, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 228, 229, 230, 231, 232, 233, 234, 235, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 53, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 66, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 52, 87, 52, 88, + 89, 90, 91, 92, 93, 94, 52, 95, 52, 96, 52, 52, 52, 52, 52, 97, 98, 99, + 100, 101, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 102, 103, 104, 105, + 106, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 107, 108, + 109, 110, 52, 52, 52, 111, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 112, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 113, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 114, 115, 116, 117, + 118, 119, 120, 121, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 122, 52, 52, 52, 52, 52, 123, 52, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 133, 134, 135, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 136, 137, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 138, 139, 140, 141, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, }; static unsigned int phrasebook_offset2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 9, 11, 14, 17, 19, 21, 24, 27, 29, 31, 33, 35, 39, 41, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 69, 72, - 75, 78, 82, 86, 91, 96, 101, 105, 110, 115, 120, 124, 129, 134, 138, 142, - 147, 151, 156, 161, 165, 170, 175, 179, 184, 189, 194, 199, 204, 207, + 75, 78, 82, 86, 91, 96, 101, 105, 110, 115, 120, 124, 129, 134, 138, 143, + 148, 152, 157, 162, 166, 170, 175, 179, 184, 189, 194, 199, 204, 207, 211, 214, 218, 221, 225, 229, 234, 239, 244, 248, 253, 258, 263, 267, - 272, 277, 281, 285, 290, 294, 299, 304, 308, 313, 318, 322, 327, 332, + 272, 277, 281, 286, 291, 295, 300, 305, 309, 313, 318, 322, 327, 332, 337, 342, 347, 351, 354, 358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 359, 363, 368, - 371, 374, 377, 380, 383, 386, 388, 391, 397, 405, 408, 412, 415, 417, - 420, 423, 426, 429, 433, 436, 439, 443, 445, 448, 454, 462, 469, 476, - 483, 488, 495, 501, 508, 514, 521, 529, 534, 542, 549, 555, 562, 569, - 577, 584, 592, 600, 605, 612, 619, 625, 632, 638, 645, 648, 654, 661, - 667, 674, 681, 688, 693, 700, 707, 713, 720, 726, 733, 741, 746, 754, - 761, 767, 774, 781, 789, 796, 804, 812, 817, 824, 831, 837, 844, 850, - 857, 860, 866, 873, 879, 886, 893, 900, 905, 913, 920, 927, 934, 941, - 948, 955, 962, 969, 977, 985, 993, 1001, 1009, 1017, 1025, 1033, 1040, - 1047, 1054, 1061, 1068, 1075, 1082, 1089, 1096, 1103, 1110, 1117, 1125, - 1133, 1141, 1149, 1157, 1165, 1173, 1181, 1189, 1197, 1204, 1211, 1218, - 1225, 1233, 1241, 1249, 1257, 1265, 1273, 1281, 1287, 1292, 1297, 1305, - 1313, 1321, 1329, 1334, 1341, 1348, 1356, 1364, 1372, 1380, 1390, 1400, - 1407, 1414, 1421, 1428, 1436, 1444, 1452, 1460, 1471, 1476, 1481, 1488, - 1495, 1502, 1509, 1516, 1523, 1528, 1533, 1540, 1547, 1555, 1563, 1571, - 1579, 1586, 1593, 1601, 1609, 1617, 1625, 1633, 1641, 1649, 1657, 1665, - 1673, 1680, 1687, 1693, 1699, 1706, 1713, 1720, 1727, 1735, 1743, 1750, - 1757, 1764, 1771, 1779, 1787, 1795, 1803, 1811, 1818, 1825, 1833, 1841, - 1849, 1857, 1863, 1869, 1875, 1882, 1889, 1894, 1899, 1904, 1911, 1918, - 1925, 1932, 1940, 1948, 1955, 1961, 1966, 1971, 1978, 1985, 1992, 1997, - 2002, 2007, 2014, 2021, 2028, 2035, 2042, 2048, 2056, 2066, 2074, 2081, - 2088, 2093, 2098, 2105, 2112, 2116, 2121, 2126, 2131, 2139, 2148, 2155, - 2162, 2171, 2178, 2185, 2190, 2197, 2204, 2211, 2218, 2225, 2230, 2237, - 2244, 2252, 2257, 2262, 2267, 2277, 2281, 2287, 2293, 2299, 2305, 2313, - 2326, 2334, 2339, 2349, 2354, 2359, 2369, 2374, 2381, 2388, 2396, 2404, - 2411, 2418, 2425, 2432, 2442, 2452, 2461, 2470, 2480, 2490, 2500, 2510, - 2516, 2526, 2536, 2546, 2556, 2564, 2572, 2579, 2586, 2594, 2602, 2610, - 2618, 2625, 2632, 2642, 2652, 2660, 2668, 2676, 2681, 2691, 2696, 2703, - 2710, 2715, 2720, 2728, 2736, 2746, 2756, 2763, 2770, 2779, 2788, 2796, - 2804, 2813, 2822, 2830, 2838, 2847, 2856, 2865, 2874, 2884, 2894, 2902, - 2910, 2919, 2928, 2937, 2946, 2956, 2966, 2974, 2982, 2991, 3000, 3009, - 3018, 3027, 3036, 3041, 3046, 3054, 3062, 3072, 3080, 3085, 3090, 3097, - 3104, 3111, 3118, 3125, 3132, 3142, 3152, 3162, 3172, 3179, 3186, 3196, - 3206, 3214, 3222, 3230, 3238, 3246, 3253, 3260, 3267, 3273, 3280, 3287, - 3294, 3303, 3313, 3323, 3330, 3337, 3343, 3348, 3355, 3361, 3367, 3374, - 3381, 3392, 3402, 3409, 3416, 3423, 3430, 3436, 3441, 3448, 3454, 3459, - 3467, 3475, 3482, 3488, 3493, 3500, 3505, 3512, 3521, 3530, 3539, 3546, - 3552, 3558, 3563, 3570, 3577, 3584, 3591, 3598, 3603, 3608, 3617, 3625, - 3634, 3639, 3645, 3656, 3663, 3671, 3680, 3686, 3692, 3698, 3705, 3710, - 3716, 3727, 3736, 3745, 3753, 3761, 3771, 3776, 3783, 3790, 3795, 3807, - 3816, 3824, 3831, 3840, 3845, 3850, 3857, 3864, 3871, 3878, 3884, 3893, - 3901, 3906, 3914, 3920, 3928, 3936, 3942, 3948, 3954, 3961, 3969, 3975, - 3983, 3990, 3995, 4002, 4010, 4020, 4027, 4034, 4044, 4051, 4058, 4068, - 4075, 4082, 4089, 4095, 4101, 4111, 4124, 4129, 4136, 4141, 4145, 4151, - 4160, 4167, 4172, 4177, 4181, 4186, 4192, 4196, 4202, 4208, 4214, 4220, - 4228, 4233, 4238, 4243, 4248, 4254, 4256, 4261, 4265, 4271, 4277, 4283, - 4288, 4295, 4302, 4308, 4315, 4323, 4331, 4336, 4341, 4345, 4350, 4352, - 4354, 4357, 4359, 4361, 4366, 4371, 4377, 4382, 4386, 4391, 4396, 4405, - 4411, 4416, 4422, 4427, 4433, 4441, 4449, 4453, 4457, 4462, 4468, 4474, - 4480, 4486, 4491, 4499, 4508, 4517, 4521, 4527, 4534, 4541, 4548, 4555, - 4559, 4564, 4569, 4574, 4579, 4584, 4586, 4589, 4592, 4595, 4598, 4601, - 4605, 4609, 4615, 4618, 4623, 4629, 4635, 4638, 4643, 4649, 4653, 4659, - 4665, 4671, 4677, 4682, 4687, 4692, 4695, 4701, 4706, 4711, 4715, 4720, - 4726, 4732, 4735, 4739, 4743, 4747, 4750, 4753, 4758, 4762, 4769, 4773, - 4779, 4783, 4789, 4793, 4797, 4801, 4806, 4811, 4818, 4824, 4831, 4837, - 4843, 4849, 4852, 4856, 4860, 4863, 4867, 4872, 4877, 4881, 4885, 4891, - 4895, 4899, 4904, 4910, 4915, 4921, 4925, 4932, 4937, 4942, 4947, 4952, - 4958, 4961, 4965, 4970, 4975, 4984, 4990, 4995, 4999, 5004, 5008, 5013, - 5017, 5021, 5026, 5029, 5035, 5040, 5045, 5050, 5055, 5060, 5065, 5071, - 5077, 5083, 5088, 5093, 5099, 5105, 5111, 5116, 5121, 5128, 5135, 5139, - 5145, 5152, 0, 0, 5159, 5162, 5171, 5180, 5191, 0, 0, 0, 0, 0, 5195, - 5198, 5203, 5211, 5216, 5224, 5232, 0, 5240, 0, 5248, 5256, 5264, 5275, - 5280, 5285, 5290, 5295, 5300, 5305, 5310, 5315, 5320, 5325, 5330, 5335, - 5340, 5345, 5350, 5355, 0, 5360, 5365, 5370, 5375, 5380, 5385, 5390, - 5395, 5403, 5411, 5419, 5427, 5435, 5443, 5454, 5459, 5464, 5469, 5474, - 5479, 5484, 5489, 5494, 5499, 5504, 5509, 5514, 5519, 5524, 5529, 5534, - 5539, 5545, 5550, 5555, 5560, 5565, 5570, 5575, 5580, 5588, 5596, 5604, - 5612, 5620, 5625, 5629, 5633, 5640, 5650, 5660, 5664, 5668, 5672, 5678, - 5685, 5689, 5694, 5698, 5703, 5707, 5712, 5716, 5721, 5726, 5731, 5736, - 5741, 5746, 5751, 5756, 5761, 5766, 5771, 5776, 5781, 5786, 5791, 5795, - 5799, 5805, 5809, 5814, 5820, 5828, 5833, 5838, 5845, 5850, 5855, 5862, - 5871, 5880, 5891, 5899, 5904, 5909, 5914, 5921, 5926, 5932, 5937, 5942, - 5947, 5952, 5957, 5962, 5970, 5976, 5981, 5985, 5990, 5995, 6000, 6005, - 6010, 6015, 6020, 6024, 6030, 6034, 6039, 6044, 6049, 6053, 6058, 6063, - 6068, 6073, 6077, 6082, 6086, 6091, 6096, 6101, 6106, 6112, 6117, 6123, - 6127, 6132, 6136, 6140, 6145, 6150, 6155, 6160, 6165, 6170, 6175, 6179, - 6185, 6189, 6194, 6199, 6204, 6208, 6213, 6218, 6223, 6228, 6232, 6237, - 6241, 6246, 6251, 6256, 6261, 6267, 6272, 6278, 6282, 6287, 6291, 6299, - 6304, 6309, 6314, 6321, 6326, 6332, 6337, 6342, 6347, 6352, 6357, 6362, - 6370, 6376, 6381, 6386, 6391, 6396, 6401, 6407, 6413, 6420, 6427, 6436, - 6445, 6452, 6459, 6468, 6477, 6482, 6487, 6492, 6497, 6502, 6507, 6512, - 6517, 6528, 6539, 6544, 6549, 6556, 6563, 6571, 6579, 6584, 6589, 6594, - 6599, 6603, 6607, 6611, 6617, 6623, 6627, 6634, 6639, 6649, 6659, 6665, - 6671, 6679, 6687, 6695, 6703, 6710, 6717, 6726, 6735, 6743, 6751, 6759, - 6767, 6775, 6783, 6791, 6799, 6806, 6813, 6819, 6825, 6833, 6841, 6848, - 6855, 6864, 6873, 6879, 6885, 6893, 6901, 6909, 6917, 6923, 6929, 6937, - 6945, 6953, 6961, 6968, 6975, 6983, 6991, 6999, 7007, 7012, 7017, 7024, - 7031, 7041, 7051, 7055, 7063, 7071, 7078, 7085, 7093, 7101, 7108, 7115, - 7123, 7131, 7138, 7145, 7153, 7161, 7166, 7173, 7180, 7187, 7194, 7200, - 7206, 7214, 7222, 7227, 7232, 7240, 7248, 7256, 7264, 7272, 7280, 7287, - 7294, 7302, 7310, 7318, 7326, 7333, 7340, 7346, 7352, 7361, 7370, 7377, - 7384, 7391, 7398, 7405, 7412, 7419, 7426, 7434, 7442, 7450, 7458, 7466, - 7474, 7484, 7494, 7501, 7508, 7515, 7522, 7529, 7536, 7543, 7550, 7557, - 7564, 7571, 7578, 7585, 7592, 7599, 7606, 7613, 7620, 7627, 7634, 7641, - 7648, 7655, 7662, 7667, 7672, 7677, 7682, 7687, 7692, 7697, 7702, 7707, - 7712, 7718, 7724, 7733, 7742, 7751, 7760, 7768, 7776, 7784, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7792, 7797, 7802, 7807, 7812, 7817, 7822, 7827, 7832, - 7836, 7841, 7846, 7851, 7856, 7861, 7866, 7871, 7876, 7881, 7886, 7891, - 7896, 7901, 7906, 7911, 7916, 7921, 7926, 7930, 7935, 7940, 7945, 7950, - 7955, 7960, 7965, 7970, 7975, 0, 0, 7980, 7987, 7990, 7994, 7998, 8001, - 8005, 0, 8009, 8014, 8019, 8024, 8029, 8034, 8039, 8044, 8049, 8053, - 8058, 8063, 8068, 8073, 8078, 8083, 8088, 8093, 8098, 8103, 8108, 8113, - 8118, 8123, 8128, 8133, 8138, 8143, 8147, 8152, 8157, 8162, 8167, 8172, - 8177, 8182, 8187, 8192, 8197, 0, 8204, 8209, 0, 0, 0, 0, 8212, 0, 8216, - 8221, 8226, 8231, 8238, 8245, 8250, 8255, 8260, 8265, 8270, 8275, 8280, - 8287, 8292, 8299, 8306, 8311, 8318, 8323, 8328, 8333, 8340, 8345, 8350, - 8357, 8366, 8371, 8376, 8381, 8386, 8392, 8397, 8404, 8411, 8418, 8423, - 8428, 8433, 8438, 8443, 8448, 8458, 8463, 8471, 8476, 8481, 8486, 8491, - 8498, 8505, 8512, 8518, 8524, 8531, 0, 0, 0, 0, 0, 0, 0, 0, 8538, 8542, - 8546, 8550, 8554, 8558, 8562, 8566, 8570, 8574, 8578, 8583, 8587, 8591, - 8596, 8600, 8605, 8609, 8613, 8617, 8622, 8626, 8631, 8635, 8639, 8643, - 8647, 0, 0, 0, 0, 0, 8651, 8658, 8666, 8673, 8678, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8683, 8686, 8690, 8695, 8699, 0, 8703, 8709, 8715, 8718, - 8725, 8734, 8737, 8740, 8745, 8751, 8755, 8763, 8769, 8775, 8783, 8787, - 8792, 8803, 8808, 8812, 8816, 8820, 8823, 0, 8826, 8833, 8837, 8843, - 8847, 8854, 8860, 8867, 8873, 8879, 8883, 8887, 8893, 8897, 8901, 8905, - 8909, 8913, 8917, 8921, 8925, 8929, 8933, 8937, 8941, 8945, 8949, 8953, - 8957, 8961, 8969, 8977, 8987, 8996, 9005, 9008, 9012, 9016, 9020, 9024, - 9028, 9032, 9036, 9040, 9045, 9049, 9052, 9055, 9058, 9061, 9064, 9067, - 9070, 9073, 9077, 9080, 9083, 9088, 9093, 9099, 9102, 9109, 9118, 9123, - 9128, 9135, 9140, 9145, 9149, 9153, 9157, 9161, 9165, 9169, 9173, 9177, - 9181, 9185, 9190, 9195, 9202, 9208, 9214, 9220, 9225, 9233, 9241, 9246, - 9252, 9258, 9264, 9270, 9274, 9278, 9282, 9289, 9299, 9303, 9307, 9311, - 9317, 9325, 9329, 9333, 9340, 9344, 9348, 9352, 9359, 9366, 9378, 9382, - 9386, 9390, 9400, 9409, 9413, 9421, 9428, 9435, 9444, 9455, 9463, 9467, - 9476, 9487, 9495, 9508, 9516, 9524, 9532, 9540, 9546, 9555, 9562, 9566, - 9574, 9578, 9585, 9593, 9597, 9603, 9610, 9617, 9621, 9629, 9633, 9640, - 9644, 9652, 9656, 9664, 9672, 9679, 9687, 9695, 9702, 9708, 9712, 9719, - 9727, 9733, 9740, 9747, 9753, 9762, 9770, 9777, 9783, 9787, 9790, 9794, - 9800, 9808, 9812, 9818, 9824, 9831, 9838, 9841, 9848, 9853, 9861, 9866, - 9870, 9883, 9896, 9902, 9909, 9914, 9920, 9925, 9931, 9941, 9948, 9957, - 9967, 9973, 9978, 9983, 9987, 9991, 9996, 10001, 10007, 10015, 10023, - 10034, 10039, 10048, 10057, 10064, 10070, 10076, 10082, 10088, 10094, - 10100, 10106, 10112, 10118, 10125, 10132, 10139, 10145, 10153, 10162, - 10168, 10175, 10182, 10187, 10192, 10196, 10203, 10210, 10219, 10228, - 10231, 10236, 10241, 0, 10246, 10250, 10254, 10260, 10264, 10268, 10274, - 10278, 10286, 10290, 10294, 10298, 10302, 10306, 10312, 10316, 10322, - 10326, 10330, 10334, 10338, 10342, 10347, 10350, 10354, 10360, 10364, - 10368, 10372, 10376, 10380, 10386, 10392, 10398, 10402, 10406, 10411, - 10415, 10419, 10424, 10428, 10432, 10439, 10446, 10450, 10454, 10459, - 10463, 10467, 10470, 10475, 10478, 10481, 10486, 10491, 10495, 10499, - 10505, 10511, 10514, 0, 0, 10517, 10523, 10529, 10535, 10545, 10557, - 10569, 10586, 10598, 10609, 10617, 10624, 10635, 10650, 10661, 10667, - 10676, 10684, 10696, 10706, 10714, 10726, 10733, 10741, 10753, 10759, - 10765, 10773, 10781, 10789, 10795, 10805, 10812, 10822, 10832, 10845, - 10859, 10873, 10883, 10894, 10905, 10918, 10931, 10945, 10957, 10969, - 10982, 10995, 11007, 11020, 11029, 11037, 11042, 11047, 11052, 11057, - 11062, 11067, 11072, 11077, 11082, 11087, 11092, 11097, 11102, 11107, - 11112, 11117, 11122, 11127, 11132, 11137, 11142, 11147, 11152, 11157, - 11162, 11167, 11172, 11177, 11182, 11187, 11192, 11197, 11201, 11206, - 11211, 11216, 11221, 11226, 11230, 11234, 11238, 11242, 11246, 11250, - 11254, 11258, 11262, 11266, 11270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11275, 11280, 11284, 11288, 11292, 11296, 11300, 11304, 11308, 11312, - 11316, 11320, 11325, 11329, 11333, 11337, 11342, 11346, 11351, 11356, - 11361, 11365, 11370, 11375, 11380, 11385, 11389, 11394, 11398, 11403, - 11408, 11412, 11417, 11424, 11428, 11433, 11437, 11441, 11446, 11450, - 11457, 11464, 11471, 11477, 11485, 11493, 11502, 11510, 11517, 11524, - 11532, 11538, 11544, 11550, 11556, 11563, 11568, 11572, 11577, 0, 0, 0, - 0, 0, 11581, 11586, 11591, 11596, 11601, 11606, 11611, 11616, 11621, - 11626, 11631, 11636, 11641, 11646, 11651, 11656, 11661, 11666, 11671, - 11676, 11681, 11686, 11691, 11696, 11701, 11706, 11711, 11719, 11726, - 11732, 11737, 11745, 11752, 11758, 11765, 11771, 11776, 11783, 11790, - 11796, 11801, 11806, 11812, 11817, 11822, 11828, 0, 0, 11833, 11839, - 11845, 11851, 11857, 11863, 11869, 11874, 11882, 11888, 11894, 11900, - 11906, 11912, 11920, 0, 11926, 11931, 11936, 11941, 11946, 11951, 11956, - 11961, 11966, 11971, 11976, 11981, 11986, 11991, 11996, 12001, 12006, - 12011, 12016, 12021, 12026, 12031, 12036, 12041, 12046, 12051, 12056, - 12061, 0, 0, 12066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 364, 369, + 372, 375, 378, 381, 384, 387, 389, 392, 398, 406, 409, 413, 416, 418, + 421, 424, 427, 430, 434, 437, 440, 444, 446, 449, 455, 463, 470, 477, + 484, 489, 496, 502, 509, 516, 523, 531, 536, 544, 551, 557, 564, 571, + 579, 586, 594, 602, 607, 615, 622, 628, 635, 642, 649, 652, 658, 665, + 671, 678, 685, 692, 697, 703, 710, 716, 723, 730, 737, 745, 750, 758, + 765, 771, 778, 785, 793, 800, 808, 816, 821, 829, 836, 842, 849, 856, + 863, 866, 872, 879, 885, 892, 899, 906, 911, 919, 926, 933, 940, 947, + 954, 961, 968, 975, 983, 991, 999, 1007, 1015, 1023, 1031, 1039, 1046, + 1053, 1060, 1067, 1074, 1081, 1088, 1095, 1102, 1109, 1116, 1123, 1131, + 1139, 1147, 1155, 1163, 1171, 1179, 1187, 1195, 1203, 1210, 1217, 1225, + 1233, 1241, 1249, 1257, 1265, 1273, 1281, 1289, 1295, 1300, 1305, 1313, + 1321, 1329, 1337, 1342, 1349, 1356, 1364, 1372, 1380, 1388, 1398, 1408, + 1415, 1422, 1429, 1436, 1444, 1452, 1460, 1468, 1479, 1484, 1489, 1496, + 1503, 1510, 1517, 1524, 1531, 1536, 1541, 1548, 1555, 1563, 1571, 1579, + 1587, 1594, 1601, 1609, 1617, 1625, 1633, 1641, 1649, 1657, 1665, 1673, + 1681, 1688, 1695, 1702, 1709, 1716, 1723, 1730, 1737, 1745, 1753, 1760, + 1767, 1774, 1781, 1789, 1797, 1805, 1813, 1821, 1828, 1835, 1843, 1851, + 1859, 1867, 1872, 1878, 1884, 1891, 1898, 1903, 1908, 1914, 1921, 1928, + 1935, 1942, 1950, 1958, 1964, 1970, 1975, 1981, 1988, 1995, 2002, 2007, + 2012, 2017, 2024, 2031, 2038, 2045, 2052, 2058, 2066, 2076, 2085, 2092, + 2099, 2104, 2109, 2116, 2123, 2127, 2132, 2137, 2142, 2150, 2159, 2166, + 2173, 2182, 2189, 2196, 2201, 2208, 2215, 2222, 2229, 2236, 2241, 2248, + 2255, 2263, 2268, 2273, 2278, 2288, 2292, 2298, 2304, 2310, 2316, 2324, + 2337, 2345, 2350, 2360, 2365, 2370, 2380, 2385, 2392, 2399, 2407, 2415, + 2422, 2429, 2436, 2443, 2453, 2463, 2472, 2481, 2491, 2501, 2511, 2521, + 2526, 2536, 2546, 2556, 2566, 2574, 2582, 2589, 2596, 2604, 2612, 2620, + 2628, 2635, 2642, 2652, 2662, 2670, 2678, 2686, 2691, 2701, 2706, 2713, + 2720, 2725, 2730, 2738, 2746, 2756, 2766, 2773, 2780, 2789, 2798, 2806, + 2814, 2823, 2832, 2840, 2848, 2857, 2866, 2875, 2884, 2894, 2904, 2912, + 2920, 2929, 2938, 2947, 2956, 2966, 2976, 2984, 2992, 3001, 3010, 3019, + 3028, 3037, 3046, 3051, 3056, 3064, 3072, 3082, 3090, 3095, 3100, 3107, + 3114, 3121, 3128, 3135, 3142, 3152, 3162, 3172, 3182, 3189, 3196, 3206, + 3216, 3224, 3232, 3240, 3248, 3256, 3263, 3270, 3277, 3283, 3290, 3297, + 3304, 3313, 3323, 3333, 3340, 3347, 3353, 3358, 3364, 3370, 3376, 3383, + 3390, 3401, 3411, 3418, 3425, 3432, 3439, 3444, 3449, 3455, 3461, 3467, + 3475, 3483, 3490, 3496, 3501, 3508, 3514, 3522, 3532, 3542, 3551, 3558, + 3564, 3570, 3575, 3582, 3588, 3595, 3602, 3609, 3614, 3619, 3629, 3637, + 3646, 3651, 3657, 3667, 3674, 3682, 3691, 3697, 3703, 3709, 3716, 3721, + 3726, 3736, 3744, 3753, 3761, 3769, 3779, 3784, 3791, 3798, 3803, 3815, + 3824, 3832, 3838, 3847, 3852, 3857, 3864, 3870, 3876, 3882, 3888, 3897, + 3905, 3910, 3918, 3924, 3932, 3940, 3946, 3952, 3958, 3966, 3974, 3980, + 3988, 3994, 3999, 4006, 4014, 4024, 4031, 4038, 4048, 4055, 4062, 4072, + 4079, 4086, 4093, 4099, 4105, 4114, 4126, 4131, 4138, 4143, 4147, 4152, + 4160, 4167, 4172, 4177, 4181, 4186, 4191, 4195, 4201, 4207, 4213, 4219, + 4227, 4232, 4237, 4242, 4247, 4253, 4255, 4260, 4264, 4270, 4276, 4282, + 4287, 4294, 4301, 4307, 4314, 4322, 4330, 4335, 4340, 4344, 4349, 4351, + 4353, 4356, 4358, 4361, 4366, 4371, 4377, 4382, 4386, 4390, 4395, 4404, + 4410, 4415, 4421, 4426, 4432, 4440, 4448, 4452, 4456, 4461, 4467, 4473, + 4479, 4485, 4490, 4498, 4507, 4516, 4521, 4527, 4534, 4541, 4548, 4555, + 4559, 4565, 4570, 4575, 4580, 4585, 4588, 4591, 4594, 4597, 4600, 4603, + 4607, 4611, 4617, 4620, 4625, 4631, 4637, 4640, 4645, 4650, 4654, 4660, + 4666, 4672, 4678, 4683, 4688, 4693, 4696, 4702, 4707, 4712, 4716, 4721, + 4727, 4733, 4736, 4740, 4744, 4748, 4751, 4754, 4759, 4763, 4770, 4774, + 4780, 4784, 4790, 4794, 4798, 4802, 4807, 4812, 4819, 4825, 4832, 4838, + 4844, 4850, 4853, 4857, 4861, 4865, 4869, 4874, 4879, 4883, 4887, 4893, + 4897, 4901, 4906, 4912, 4917, 4923, 4927, 4934, 4939, 4943, 4948, 4953, + 4959, 4962, 4966, 4971, 4976, 4985, 4991, 4996, 5000, 5005, 5009, 5014, + 5018, 5022, 5027, 5031, 5037, 5042, 5047, 5052, 5057, 5062, 5067, 5073, + 5079, 5085, 5091, 5096, 5102, 5108, 5114, 5119, 5124, 5131, 5138, 5142, + 5148, 5155, 0, 0, 5162, 5165, 5174, 5183, 5194, 5198, 0, 0, 0, 0, 5203, + 5206, 5211, 5219, 5224, 5232, 5240, 0, 5248, 0, 5256, 5264, 5272, 5283, + 5288, 5293, 5298, 5303, 5308, 5313, 5318, 5323, 5328, 5333, 5338, 5343, + 5348, 5353, 5358, 5363, 0, 5368, 5373, 5378, 5383, 5388, 5393, 5398, + 5403, 5411, 5419, 5427, 5435, 5443, 5451, 5462, 5467, 5472, 5477, 5482, + 5487, 5492, 5497, 5502, 5507, 5512, 5517, 5522, 5527, 5532, 5537, 5542, + 5547, 5553, 5558, 5563, 5568, 5573, 5578, 5583, 5588, 5596, 5604, 5612, + 5620, 5628, 5633, 5637, 5641, 5648, 5658, 5668, 5672, 5676, 5680, 5686, + 5693, 5697, 5702, 5706, 5711, 5715, 5720, 5724, 5729, 5734, 5739, 5744, + 5749, 5754, 5759, 5764, 5769, 5774, 5779, 5784, 5789, 5794, 5799, 5803, + 5807, 5813, 5817, 5822, 5828, 5836, 5841, 5846, 5853, 5858, 5863, 5870, + 5879, 5888, 5899, 5907, 5912, 5917, 5922, 5929, 5934, 5940, 5945, 5950, + 5955, 5960, 5965, 5970, 5978, 5984, 5989, 5993, 5998, 6003, 6008, 6013, + 6018, 6023, 6028, 6032, 6038, 6042, 6047, 6052, 6057, 6061, 6066, 6071, + 6076, 6081, 6085, 6090, 6094, 6099, 6104, 6109, 6114, 6120, 6125, 6131, + 6135, 6140, 6144, 6148, 6153, 6158, 6163, 6168, 6173, 6178, 6183, 6187, + 6193, 6197, 6202, 6207, 6212, 6216, 6221, 6226, 6231, 6236, 6240, 6245, + 6249, 6254, 6259, 6264, 6269, 6275, 6280, 6286, 6290, 6295, 6299, 6307, + 6312, 6317, 6322, 6329, 6334, 6340, 6345, 6350, 6355, 6360, 6365, 6370, + 6378, 6384, 6389, 6394, 6399, 6404, 6409, 6415, 6421, 6428, 6435, 6444, + 6453, 6460, 6467, 6476, 6485, 6490, 6495, 6500, 6505, 6510, 6515, 6520, + 6525, 6536, 6547, 6552, 6557, 6564, 6571, 6579, 6587, 6592, 6597, 6602, + 6607, 6611, 6615, 6619, 6625, 6631, 6635, 6642, 6647, 6657, 6667, 6673, + 6679, 6687, 6695, 6703, 6711, 6718, 6725, 6734, 6743, 6751, 6759, 6767, + 6775, 6783, 6791, 6799, 6807, 6814, 6821, 6827, 6833, 6841, 6849, 6856, + 6863, 6872, 6881, 6887, 6893, 6901, 6909, 6917, 6925, 6931, 6937, 6945, + 6953, 6961, 6969, 6976, 6983, 6991, 6999, 7007, 7015, 7020, 7025, 7032, + 7039, 7049, 7059, 7063, 7071, 7079, 7086, 7093, 7101, 7109, 7116, 7123, + 7131, 7139, 7146, 7153, 7161, 7169, 7174, 7181, 7188, 7195, 7202, 7208, + 7214, 7222, 7230, 7235, 7240, 7248, 7256, 7264, 7272, 7280, 7288, 7295, + 7302, 7310, 7318, 7326, 7334, 7341, 7348, 7354, 7360, 7369, 7378, 7385, + 7392, 7399, 7406, 7413, 7420, 7427, 7434, 7442, 7450, 7458, 7466, 7474, + 7482, 7492, 7502, 7509, 7516, 7523, 7530, 7537, 7544, 7551, 7558, 7565, + 7572, 7579, 7586, 7593, 7600, 7607, 7614, 7621, 7628, 7635, 7642, 7649, + 7656, 7663, 7670, 7675, 7680, 7685, 7690, 7695, 7700, 7705, 7710, 7715, + 7720, 7726, 7732, 7741, 7750, 7759, 7768, 7776, 7784, 7792, 7800, 7808, + 7816, 7821, 7826, 7831, 7836, 7844, 0, 7852, 7857, 7862, 7867, 7872, + 7877, 7882, 7887, 7892, 7896, 7901, 7906, 7911, 7916, 7921, 7926, 7931, + 7936, 7941, 7946, 7951, 7956, 7961, 7966, 7971, 7976, 7981, 7986, 7991, + 7996, 8001, 8006, 8011, 8016, 8021, 8026, 8031, 8036, 0, 0, 8041, 8048, + 8051, 8055, 8059, 8062, 8066, 0, 8070, 8075, 8080, 8085, 8090, 8095, + 8100, 8105, 8110, 8114, 8119, 8124, 8129, 8134, 8139, 8144, 8149, 8154, + 8159, 8164, 8169, 8174, 8179, 8184, 8189, 8194, 8199, 8204, 8209, 8214, + 8219, 8224, 8229, 8234, 8239, 8244, 8249, 8254, 8259, 0, 8266, 8271, 0, + 0, 8274, 8280, 8286, 0, 8290, 8295, 8300, 8305, 8312, 8319, 8324, 8329, + 8334, 8339, 8344, 8349, 8354, 8361, 8366, 8373, 8380, 8385, 8392, 8397, + 8402, 8407, 8414, 8419, 8424, 8431, 8440, 8445, 8450, 8455, 8460, 8466, + 8471, 8478, 8485, 8492, 8497, 8502, 8507, 8512, 8517, 8522, 8532, 8537, + 8546, 8551, 8556, 8561, 8566, 8573, 8580, 8587, 8593, 8599, 8606, 0, 0, + 0, 0, 0, 0, 0, 0, 8613, 8617, 8621, 8625, 8629, 8633, 8637, 8641, 8645, + 8649, 8653, 8658, 8662, 8666, 8671, 8675, 8680, 8684, 8688, 8692, 8697, + 8701, 8706, 8710, 8714, 8718, 8722, 0, 0, 0, 0, 0, 8726, 8733, 8741, + 8748, 8753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8758, 8761, 8765, 8770, + 8774, 8778, 8782, 8788, 8794, 8797, 8804, 8813, 8816, 8819, 8824, 8830, + 8834, 8842, 8848, 8854, 8862, 8866, 8871, 8882, 8887, 8891, 8895, 8899, + 8902, 0, 8905, 8912, 8916, 8922, 8926, 8933, 8940, 8948, 8955, 8962, + 8966, 8970, 8976, 8980, 8984, 8988, 8992, 8996, 9000, 9004, 9008, 9012, + 9016, 9020, 9024, 9028, 9032, 9036, 9040, 9044, 9052, 9060, 9070, 9079, + 9088, 9091, 9095, 9099, 9103, 9107, 9111, 9115, 9119, 9123, 9128, 9132, + 9135, 9138, 9141, 9144, 9147, 9150, 9153, 9156, 9160, 9164, 9168, 9173, + 9178, 9184, 9187, 9194, 9203, 9208, 9213, 9220, 9226, 9231, 9235, 9239, + 9243, 9247, 9251, 9255, 9259, 9263, 9267, 9271, 9276, 9281, 9288, 9294, + 9300, 9306, 9311, 9320, 9329, 9334, 9341, 9348, 9355, 9362, 9366, 9370, + 9374, 9381, 9391, 9395, 9399, 9403, 9410, 9418, 9422, 9426, 9433, 9437, + 9441, 9445, 9452, 9459, 9471, 9475, 9479, 9483, 9493, 9502, 9506, 9514, + 9521, 9528, 9537, 9548, 9556, 9560, 9569, 9580, 9588, 9601, 9609, 9617, + 9625, 9633, 9639, 9648, 9655, 9659, 9667, 9671, 9678, 9686, 9690, 9696, + 9703, 9710, 9714, 9722, 9726, 9733, 9737, 9745, 9749, 9757, 9765, 9772, + 9780, 9788, 9795, 9801, 9805, 9812, 9820, 9826, 9833, 9840, 9846, 9856, + 9864, 9871, 9877, 9881, 9884, 9888, 9894, 9902, 9906, 9912, 9918, 9925, + 9932, 9935, 9942, 9947, 9956, 9961, 9965, 9978, 9991, 9997, 10004, 10009, + 10015, 10020, 10026, 10036, 10043, 10052, 10062, 10068, 10073, 10078, + 10082, 10086, 10091, 10096, 10102, 10110, 10118, 10129, 10134, 10143, + 10152, 10159, 10165, 10171, 10177, 10183, 10189, 10195, 10201, 10207, + 10213, 10220, 10227, 10234, 10240, 10248, 10257, 10264, 10272, 10280, + 10286, 10292, 10297, 10305, 10313, 10323, 10333, 10337, 10343, 10349, 0, + 10355, 10360, 10365, 10372, 10377, 10382, 10389, 10394, 10403, 10408, + 10413, 10418, 10423, 10428, 10435, 10440, 10447, 10452, 10457, 10462, + 10467, 10472, 10478, 10482, 10487, 10494, 10499, 10504, 10509, 10514, + 10519, 10526, 10533, 10540, 10545, 10550, 10556, 10561, 10566, 10572, + 10577, 10582, 10590, 10598, 10603, 10608, 10614, 10619, 10624, 10628, + 10634, 10638, 10642, 10648, 10654, 10659, 10664, 10671, 10678, 10682, 0, + 0, 10686, 10693, 10700, 10707, 10717, 10729, 10740, 10756, 10768, 10779, + 10787, 10794, 10804, 10819, 10830, 10836, 10845, 10853, 10864, 10874, + 10882, 10893, 10900, 10908, 10919, 10925, 10931, 10939, 10947, 10955, + 10961, 10971, 10979, 10989, 10999, 11012, 11026, 11040, 11050, 11061, + 11072, 11085, 11098, 11112, 11124, 11136, 11149, 11162, 11174, 11187, + 11196, 11204, 11209, 11214, 11219, 11224, 11229, 11234, 11239, 11244, + 11249, 11254, 11259, 11264, 11269, 11274, 11279, 11284, 11289, 11294, + 11299, 11304, 11309, 11314, 11319, 11324, 11329, 11334, 11339, 11344, + 11349, 11354, 11359, 11364, 11368, 11373, 11378, 11383, 11388, 11393, + 11397, 11401, 11405, 11409, 11413, 11417, 11421, 11425, 11429, 11433, + 11437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11442, 11447, 11451, + 11455, 11459, 11463, 11467, 11471, 11475, 11479, 11483, 11487, 11492, + 11496, 11500, 11504, 11509, 11513, 11518, 11523, 11528, 11532, 11537, + 11542, 11547, 11552, 11557, 11562, 11567, 11572, 11577, 11581, 11586, + 11593, 11597, 11602, 11606, 11610, 11615, 11619, 11626, 11633, 11640, + 11647, 11655, 11663, 11672, 11680, 11687, 11694, 11702, 11708, 11714, + 11720, 11726, 11733, 11738, 11742, 11747, 0, 0, 0, 0, 0, 11751, 11756, + 11761, 11766, 11771, 11776, 11781, 11786, 11791, 11796, 11801, 11806, + 11811, 11816, 11821, 11826, 11831, 11836, 11841, 11846, 11851, 11856, + 11861, 11866, 11871, 11876, 11881, 11889, 11896, 11902, 11907, 11915, + 11922, 11928, 11935, 11941, 11946, 11953, 11960, 11966, 11971, 11976, + 11982, 11987, 11992, 11998, 0, 0, 12003, 12009, 12015, 12021, 12027, + 12033, 12039, 12044, 12052, 12058, 12064, 12070, 12076, 12082, 12090, 0, + 12096, 12101, 12106, 12111, 12116, 12121, 12126, 12131, 12136, 12141, + 12146, 12151, 12156, 12161, 12166, 12171, 12176, 12181, 12186, 12191, + 12196, 12201, 12206, 12211, 12216, 12221, 12226, 12231, 0, 0, 12236, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12240, 12249, 12257, + 12264, 12272, 12284, 12291, 12298, 12305, 12317, 12328, 12335, 12343, + 12349, 12354, 12362, 12370, 12378, 12384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12394, 12399, 12404, 12409, + 12414, 12419, 12424, 12429, 12434, 12439, 12444, 12449, 12454, 12459, + 12464, 12469, 12474, 12480, 12486, 12492, 12497, 12502, 12507, 12512, + 12518, 12527, 12535, 12541, 12549, 12555, 12559, 12563, 12567, 12572, + 12575, 12579, 12582, 12586, 12589, 12593, 12597, 12601, 12606, 12611, + 12614, 12618, 12623, 12628, 12631, 12635, 12638, 12642, 12646, 12650, + 12654, 12658, 12662, 12666, 12670, 12674, 12678, 12682, 12686, 12690, + 12694, 12698, 12702, 12706, 12710, 12713, 12717, 12720, 12724, 12728, + 12732, 12735, 12738, 12742, 12746, 12750, 12754, 12758, 12762, 12766, + 12770, 12774, 12777, 12782, 12787, 12791, 12795, 12800, 12804, 12809, + 12813, 12818, 12823, 12829, 12835, 12841, 12845, 12850, 12856, 12862, + 12866, 12871, 12875, 12881, 12886, 12889, 12895, 12901, 12906, 12911, + 12918, 12923, 12928, 12932, 12936, 12940, 12944, 12948, 12952, 12956, + 12960, 12965, 12970, 12975, 12981, 12984, 12988, 12992, 12995, 12998, + 13001, 13004, 13007, 13010, 13013, 13016, 13019, 13023, 13030, 13035, + 13039, 13043, 13047, 13051, 13055, 13061, 13065, 13069, 13073, 13077, + 13083, 13087, 13091, 13094, 13098, 13102, 0, 13106, 13109, 13113, 13116, + 13120, 13123, 13127, 13131, 0, 0, 13135, 13138, 0, 0, 13142, 13145, + 13149, 13152, 13156, 13160, 13164, 13168, 13172, 13176, 13180, 13184, + 13188, 13192, 13196, 13200, 13204, 13208, 13212, 13216, 13220, 13224, 0, + 13227, 13230, 13234, 13238, 13242, 13245, 13248, 0, 13252, 0, 0, 0, + 13256, 13260, 13264, 13268, 0, 0, 13271, 13275, 13279, 13284, 13288, + 13293, 13297, 13302, 13307, 0, 0, 13313, 13317, 0, 0, 13322, 13326, + 13331, 13335, 0, 0, 0, 0, 0, 0, 0, 0, 13341, 0, 0, 0, 0, 13347, 13351, 0, + 13355, 13359, 13364, 13369, 13374, 0, 0, 13380, 13384, 13387, 13390, + 13393, 13396, 13399, 13402, 13405, 13408, 13411, 13420, 13429, 13433, + 13437, 13443, 13449, 13455, 13461, 13475, 13482, 13485, 0, 0, 0, 0, 0, + 13489, 13496, 13501, 0, 13506, 13510, 13515, 13519, 13524, 13528, 0, 0, + 0, 0, 13533, 13538, 0, 0, 13543, 13548, 13553, 13557, 13562, 13567, + 13572, 13577, 13582, 13587, 13592, 13597, 13602, 13607, 13612, 13617, + 13622, 13627, 13632, 13637, 13642, 13647, 0, 13651, 13655, 13660, 13665, + 13670, 13674, 13678, 0, 13683, 13688, 0, 13693, 13698, 0, 13703, 13708, + 0, 0, 13712, 0, 13717, 13723, 13728, 13734, 13739, 0, 0, 0, 0, 13745, + 13751, 0, 0, 13757, 13763, 13769, 0, 0, 0, 13774, 0, 0, 0, 0, 0, 0, 0, + 13779, 13784, 13789, 13794, 0, 13799, 0, 0, 0, 0, 0, 0, 0, 13804, 13809, + 13813, 13817, 13821, 13825, 13829, 13833, 13837, 13841, 13845, 13849, + 13853, 13857, 13861, 13867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13872, + 13876, 13880, 0, 13884, 13887, 13891, 13894, 13898, 13901, 13905, 13909, + 13913, 0, 13918, 13921, 13925, 0, 13930, 13933, 13937, 13940, 13944, + 13948, 13952, 13956, 13960, 13964, 13968, 13972, 13976, 13980, 13984, + 13988, 13992, 13996, 14000, 14004, 14008, 14012, 0, 14015, 14018, 14022, + 14026, 14030, 14033, 14036, 0, 14040, 14044, 0, 14048, 14052, 14056, + 14060, 14064, 0, 0, 14067, 14071, 14075, 14080, 14084, 14089, 14093, + 14098, 14103, 14109, 0, 14115, 14119, 14124, 0, 14130, 14134, 14139, 0, + 0, 14143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14146, 14151, + 14156, 14161, 0, 0, 14167, 14171, 14174, 14177, 14180, 14183, 14186, + 14189, 14192, 14195, 14198, 14202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14206, 14210, 14214, 0, 14218, 14221, 14225, 14228, 14232, 14235, + 14239, 14243, 0, 0, 14247, 14250, 0, 0, 14254, 14257, 14261, 14264, + 14268, 14272, 14276, 14280, 14284, 14288, 14292, 14296, 14300, 14304, + 14308, 14312, 14316, 14320, 14324, 14328, 14332, 14336, 0, 14339, 14342, + 14346, 14350, 14354, 14357, 14360, 0, 14364, 14368, 0, 14372, 14376, + 14380, 14384, 14388, 0, 0, 14391, 14395, 14399, 14404, 14408, 14413, + 14417, 14422, 14427, 0, 0, 14433, 14437, 0, 0, 14442, 14446, 14451, 0, 0, + 0, 0, 0, 0, 0, 0, 14455, 14461, 0, 0, 0, 0, 14467, 14471, 0, 14475, + 14479, 14484, 14489, 14494, 0, 0, 14500, 14504, 14507, 14510, 14513, + 14516, 14519, 14522, 14525, 14528, 14531, 14534, 14538, 14544, 14550, + 14556, 14562, 14568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14574, 14578, 0, + 14582, 14585, 14589, 14592, 14596, 14599, 0, 0, 0, 14603, 14606, 14610, + 0, 14614, 14617, 14621, 14625, 0, 0, 0, 14628, 14632, 0, 14636, 0, 14640, + 14644, 0, 0, 0, 14648, 14652, 0, 0, 0, 14656, 14659, 14663, 0, 0, 0, + 14666, 14669, 14672, 14676, 14680, 14684, 14688, 14692, 14696, 14700, + 14704, 14708, 0, 0, 0, 0, 14711, 14716, 14720, 14725, 14729, 0, 0, 0, + 14734, 14738, 14743, 0, 14748, 14752, 14757, 14762, 0, 0, 14766, 0, 0, 0, + 0, 0, 0, 14769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14775, 14779, + 14782, 14785, 14788, 14791, 14794, 14797, 14800, 14803, 14806, 14810, + 14815, 14820, 14824, 14828, 14832, 14836, 14840, 14845, 14849, 0, 0, 0, + 0, 0, 14852, 14858, 14862, 14866, 0, 14870, 14873, 14877, 14880, 14884, + 14887, 14891, 14895, 0, 14899, 14902, 14906, 0, 14910, 14913, 14917, + 14921, 14924, 14928, 14932, 14936, 14940, 14944, 14948, 14952, 14956, + 14960, 14964, 14968, 14972, 14976, 14980, 14984, 14988, 14992, 14996, 0, + 14999, 15002, 15006, 15010, 15014, 15017, 15020, 15024, 15028, 15032, + 15036, 15040, 15044, 15048, 15052, 15056, 0, 0, 0, 15059, 15063, 15068, + 15072, 15077, 15081, 15086, 15091, 0, 15097, 15101, 15106, 0, 15111, + 15115, 15120, 15125, 0, 0, 0, 0, 0, 0, 0, 15129, 15133, 0, 15139, 15143, + 0, 0, 0, 0, 0, 0, 15147, 15152, 15157, 15162, 0, 0, 15168, 15172, 15175, + 15178, 15181, 15184, 15187, 15190, 15193, 15196, 0, 0, 0, 0, 0, 0, 0, 0, + 15199, 15212, 15224, 15236, 15248, 15260, 15272, 15284, 0, 15288, 15292, + 15296, 0, 15300, 15303, 15307, 15310, 15314, 15317, 15321, 15325, 0, + 15329, 15332, 15336, 0, 15340, 15343, 15347, 15351, 15354, 15358, 15362, + 15366, 15370, 15374, 15378, 15382, 15386, 15390, 15394, 15398, 15402, + 15406, 15410, 15414, 15418, 15422, 15426, 0, 15429, 15432, 15436, 15440, + 15444, 15447, 15450, 15454, 15458, 15462, 0, 15466, 15470, 15474, 15478, + 15482, 0, 0, 15485, 15489, 15493, 15498, 15502, 15507, 15511, 15516, + 15521, 0, 15527, 15531, 15536, 0, 15541, 15545, 15550, 15555, 0, 0, 0, 0, + 0, 0, 0, 15559, 15563, 0, 0, 0, 0, 0, 0, 0, 15569, 0, 15573, 15578, + 15583, 15588, 0, 0, 15594, 15598, 15601, 15604, 15607, 15610, 15613, + 15616, 15619, 15622, 0, 15625, 15629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 15633, 15637, 15641, 0, 15645, 15648, 15652, 15655, 15659, 15662, + 15666, 15670, 0, 15674, 15677, 15681, 0, 15685, 15688, 15692, 15696, + 15699, 15703, 15707, 15711, 15715, 15719, 15723, 15727, 15731, 15735, + 15739, 15743, 15747, 15751, 15755, 15759, 15763, 15767, 15771, 15774, + 15778, 15781, 15785, 15789, 15793, 15796, 15799, 15803, 15807, 15811, + 15815, 15819, 15823, 15827, 15831, 15835, 15838, 0, 0, 15842, 15846, + 15851, 15855, 15860, 15864, 15869, 15874, 0, 15880, 15884, 15889, 0, + 15894, 15898, 15903, 15908, 15912, 0, 0, 0, 0, 0, 0, 0, 0, 15917, 0, 0, + 0, 0, 0, 0, 0, 0, 15923, 15928, 15933, 15938, 0, 0, 15944, 15948, 15951, + 15954, 15957, 15960, 15963, 15966, 15969, 15972, 15975, 15979, 15984, + 15989, 15995, 16001, 0, 0, 0, 16007, 16011, 16017, 16023, 16029, 16034, + 16040, 0, 0, 16046, 16050, 0, 16054, 16058, 16062, 16066, 16070, 16074, + 16078, 16082, 16086, 16090, 16094, 16098, 16102, 16106, 16110, 16114, + 16118, 16122, 0, 0, 0, 16126, 16132, 16138, 16144, 16150, 16156, 16162, + 16168, 16174, 16180, 16186, 16192, 16200, 16206, 16212, 16218, 16224, + 16230, 16236, 16242, 16248, 16254, 16260, 16266, 0, 16272, 16278, 16284, + 16290, 16296, 16302, 16306, 16312, 16316, 0, 16320, 0, 0, 16326, 16330, + 16336, 16342, 16348, 16352, 16358, 0, 0, 0, 16362, 0, 0, 0, 0, 16366, + 16371, 16378, 16385, 16392, 16399, 0, 16406, 0, 16413, 16418, 16423, + 16430, 16437, 16446, 16457, 16466, 0, 0, 0, 0, 0, 0, 16471, 16477, 16482, + 16487, 16492, 16497, 16502, 16507, 16512, 16517, 0, 0, 16522, 16529, + 16536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16541, 16547, 16553, 16559, + 16565, 16571, 16577, 16583, 16589, 16595, 16601, 16607, 16613, 16619, + 16625, 16631, 16637, 16643, 16649, 16655, 16661, 16667, 16673, 16679, + 16685, 16691, 16697, 16703, 16709, 16715, 16721, 16727, 16733, 16738, + 16744, 16750, 16754, 16760, 16764, 16770, 16776, 16782, 16788, 16794, + 16800, 16805, 16811, 16815, 16820, 16826, 16832, 16838, 16843, 16849, + 16855, 16861, 16866, 16872, 0, 0, 0, 0, 16876, 16882, 16887, 16893, + 16898, 16906, 16914, 16918, 16922, 16926, 16932, 16938, 16944, 16950, + 16954, 16958, 16962, 16966, 16970, 16973, 16976, 16979, 16982, 16985, + 16988, 16991, 16994, 16997, 17001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 17005, 17010, 0, 17017, 0, 0, 17024, 17029, 0, 17034, 0, 0, 17041, 0, 0, + 0, 0, 0, 0, 17046, 17051, 17055, 17062, 0, 17069, 17074, 17079, 17084, + 17091, 17098, 17105, 0, 17112, 17117, 17122, 0, 17129, 0, 17136, 0, 0, + 17141, 17148, 0, 17155, 17159, 17166, 17170, 17175, 17183, 17189, 17195, + 17200, 17206, 17212, 17218, 17223, 0, 17229, 17237, 17244, 0, 0, 17251, + 17256, 17262, 17267, 17273, 0, 17279, 0, 17285, 17292, 17299, 17306, + 17313, 17318, 0, 0, 17322, 17327, 17331, 17335, 17339, 17343, 17347, + 17351, 17355, 17359, 0, 0, 17363, 17369, 17375, 17382, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17389, 17393, 17404, 17419, 17434, 17444, 17455, 17468, 17479, + 17485, 17493, 17503, 17509, 17517, 17521, 17527, 17533, 17541, 17551, + 17559, 17572, 17578, 17586, 17594, 17606, 17613, 17621, 17629, 17637, + 17645, 17653, 17661, 17671, 17675, 17678, 17681, 17684, 17687, 17690, + 17693, 17696, 17699, 17702, 17706, 17710, 17714, 17718, 17722, 17726, + 17730, 17734, 17738, 17743, 17749, 17759, 17773, 17783, 17789, 17795, + 17803, 17811, 17819, 17827, 17833, 17839, 17842, 17846, 17850, 17854, + 17858, 17862, 17866, 0, 17870, 17874, 17878, 17882, 17886, 17890, 17894, + 17898, 17902, 17906, 17910, 17913, 17916, 17920, 17924, 17928, 17931, + 17935, 17939, 17943, 17947, 17951, 17955, 17959, 17963, 17966, 17970, + 17974, 17978, 17982, 17986, 17989, 17992, 17996, 18002, 18006, 0, 0, 0, + 0, 18010, 18015, 18019, 18024, 18028, 18033, 18038, 18044, 18049, 18055, + 18059, 18064, 18068, 18073, 18083, 18089, 18095, 18102, 18112, 18118, + 18122, 18126, 18132, 18138, 18146, 18152, 18160, 18168, 18176, 18186, + 18194, 18204, 18209, 18215, 18221, 18227, 18233, 18239, 18245, 0, 18251, + 18257, 18263, 18269, 18275, 18281, 18287, 18293, 18299, 18305, 18311, + 18316, 18321, 18327, 18333, 18339, 18344, 18350, 18356, 18362, 18368, + 18374, 18380, 18386, 18392, 18397, 18403, 18409, 18415, 18421, 18427, + 18432, 18437, 18443, 18451, 18458, 0, 18466, 18473, 18486, 18493, 18500, + 18508, 18516, 18522, 18528, 18534, 18544, 18549, 18555, 18565, 18575, 0, + 18585, 18595, 18603, 18615, 18627, 18633, 18647, 18662, 18667, 18672, + 18680, 18688, 18696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18704, 18707, + 18711, 18715, 18719, 18723, 18727, 18731, 18735, 18739, 18743, 18747, + 18751, 18755, 18759, 18763, 18767, 18771, 18775, 18779, 18783, 18786, + 18789, 18793, 18797, 18801, 18804, 18807, 18811, 18815, 18819, 18823, + 18826, 18830, 18833, 18838, 18841, 18845, 18848, 18852, 18855, 18860, + 18863, 18867, 18874, 18879, 18883, 18888, 18892, 18897, 18901, 18906, + 18913, 18919, 18924, 18928, 18932, 18936, 18940, 18944, 18949, 18955, + 18961, 18966, 18972, 18976, 18979, 18982, 18985, 18988, 18991, 18994, + 18997, 19000, 19003, 19009, 19013, 19017, 19021, 19025, 19029, 19033, + 19037, 19041, 19046, 19050, 19055, 19060, 19066, 19071, 19077, 19083, + 19089, 19095, 19101, 19108, 19115, 19123, 19131, 19140, 19149, 19160, + 19170, 19180, 19191, 19202, 19212, 19222, 19232, 19242, 19252, 19262, + 19272, 19282, 19290, 19297, 19303, 19310, 19315, 19321, 19327, 19333, + 19339, 19345, 19351, 19356, 19362, 19368, 19374, 19380, 19385, 19393, + 19400, 19406, 19413, 19421, 19427, 19433, 19439, 19445, 19453, 19461, + 19471, 19479, 19487, 19493, 19498, 19503, 19508, 19513, 19518, 19523, + 19528, 19533, 19538, 19544, 19550, 19556, 19563, 19568, 19574, 19579, + 19584, 19589, 19594, 19599, 19604, 19609, 19614, 19619, 19624, 19629, + 19634, 19639, 19644, 19649, 19654, 19659, 19664, 19669, 19674, 19679, + 19684, 19689, 19694, 19699, 19704, 19709, 19714, 19719, 19724, 19729, + 19734, 19739, 19744, 19749, 19754, 19759, 0, 19764, 0, 0, 0, 0, 0, 19769, + 0, 0, 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, 19943, 19947, 19952, 19957, 19961, 19966, 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, 20315, 20319, 20323, 20327, 20331, + 20335, 20339, 20343, 20347, 20351, 20355, 20359, 20362, 20366, 20369, + 20373, 20377, 20380, 20384, 20388, 20391, 20395, 20399, 20403, 20407, + 20410, 20414, 20418, 20422, 20426, 20430, 20434, 20437, 20441, 20445, + 20449, 20453, 20457, 20461, 20465, 20469, 20473, 20477, 20481, 20485, + 20489, 20493, 20497, 20501, 20505, 20509, 20513, 20517, 20521, 20525, + 20529, 20533, 20537, 20541, 20545, 20549, 20553, 20557, 20561, 20565, + 20569, 20573, 20577, 20581, 20585, 20589, 20593, 20597, 20601, 20605, + 20609, 20613, 20617, 20621, 20625, 20629, 20633, 20637, 20641, 20645, + 20649, 20653, 20657, 20661, 20665, 20669, 20673, 20677, 20681, 20685, + 20689, 20693, 20697, 20701, 20705, 20709, 20713, 20717, 20721, 20725, + 20729, 20733, 20737, 20741, 20745, 20749, 20753, 20757, 20761, 20765, + 20769, 20773, 20777, 20781, 20785, 20789, 20793, 20797, 20801, 20805, + 20809, 20813, 20817, 20821, 20825, 20829, 20833, 20837, 20841, 20845, + 20849, 20853, 20857, 20861, 20865, 20869, 20873, 20877, 20881, 20885, + 20889, 20893, 20897, 20901, 20905, 20909, 20913, 20917, 20921, 20925, + 20929, 20933, 20937, 20941, 20945, 20949, 20953, 20957, 20961, 20965, + 20969, 20973, 20977, 20981, 20985, 20989, 20992, 20996, 21000, 21004, + 21008, 21012, 21016, 21020, 21024, 21028, 21032, 21036, 21040, 21044, + 21048, 21052, 21056, 21060, 21064, 21068, 21072, 21076, 21080, 21084, + 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, 21215, 21219, 21223, 21227, 21231, 21235, 21239, 21243, + 21247, 21251, 21255, 21259, 21263, 21267, 21271, 21275, 0, 21279, 21283, + 21287, 21291, 0, 0, 21295, 21299, 21303, 21307, 21311, 21315, 21319, 0, + 21323, 0, 21327, 21331, 21335, 21339, 0, 0, 21343, 21347, 21351, 21355, + 21359, 21363, 21367, 21371, 21375, 21379, 21383, 21387, 21391, 21395, + 21399, 21403, 21407, 21411, 21415, 21419, 21423, 21427, 21431, 21434, + 21438, 21442, 21446, 21450, 21454, 21458, 21462, 21466, 21470, 21474, + 21478, 21482, 21486, 21490, 21494, 21498, 21502, 0, 21506, 21510, 21514, + 21518, 0, 0, 21522, 21525, 21529, 21533, 21537, 21541, 21545, 21549, + 21553, 21557, 21561, 21565, 21569, 21573, 21577, 21581, 21585, 21590, + 21595, 21600, 21606, 21612, 21617, 21622, 21628, 21631, 21635, 21639, + 21643, 21647, 21651, 21655, 21659, 0, 21663, 21667, 21671, 21675, 0, 0, + 21679, 21683, 21687, 21691, 21695, 21699, 21703, 0, 21707, 0, 21711, + 21715, 21719, 21723, 0, 0, 21727, 21731, 21735, 21739, 21743, 21747, + 21751, 21755, 21759, 21764, 21769, 21774, 21780, 21786, 21791, 0, 21796, + 21800, 21804, 21808, 21812, 21816, 21820, 21824, 21828, 21832, 21836, + 21840, 21844, 21848, 21852, 21856, 21860, 21863, 21867, 21871, 21875, + 21879, 21883, 21887, 21891, 21895, 21899, 21903, 21907, 21911, 21915, + 21919, 21923, 21927, 21931, 21935, 21939, 21943, 21947, 21951, 21955, + 21959, 21963, 21967, 21971, 21975, 21979, 21983, 21987, 21991, 21995, + 21999, 22003, 22007, 22011, 22015, 22019, 0, 22023, 22027, 22031, 22035, + 0, 0, 22039, 22043, 22047, 22051, 22055, 22059, 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, 22199, 22203, 22207, 22211, 22215, 22219, 22223, 22227, 22231, + 22235, 22239, 22243, 22247, 22251, 22255, 22259, 22263, 22266, 22270, + 22274, 22278, 22282, 22286, 22290, 22294, 22298, 22302, 0, 0, 22306, + 22315, 22321, 22326, 22330, 22333, 22338, 22341, 22344, 22347, 22352, + 22356, 22361, 22364, 22367, 22370, 22373, 22376, 22379, 22382, 22385, + 22388, 22392, 22396, 22400, 22404, 22408, 22412, 22416, 22420, 22424, + 22428, 0, 0, 0, 22434, 22440, 22444, 22448, 22452, 22458, 22462, 22466, + 22470, 22476, 22480, 22484, 22488, 22494, 22498, 22502, 22506, 22512, + 22518, 22524, 22532, 22538, 22544, 22550, 22556, 22562, 0, 0, 0, 0, 0, 0, + 22568, 22571, 22574, 22577, 22580, 22583, 22587, 22591, 22594, 22598, + 22602, 22606, 22610, 22614, 22617, 22621, 22625, 22629, 22633, 22637, + 22641, 22645, 22649, 22653, 22657, 22661, 22664, 22668, 22672, 22676, + 22680, 22683, 22687, 22691, 22695, 22699, 22703, 22707, 22711, 22715, + 22719, 22723, 22727, 22731, 22735, 22739, 22742, 22746, 22750, 22754, + 22758, 22762, 22766, 22770, 22774, 22778, 22782, 22786, 22790, 22794, + 22798, 22802, 22806, 22810, 22814, 22818, 22822, 22826, 22830, 22834, + 22838, 22842, 22846, 22850, 22854, 22858, 22862, 22866, 22870, 22874, + 22877, 22881, 22885, 22889, 22893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22897, 22901, 22904, 22908, 22911, 22915, 22918, 22922, 22928, 22933, + 22937, 22940, 22944, 22948, 22953, 22957, 22962, 22966, 22971, 22975, + 22980, 22984, 22989, 22995, 22999, 23004, 23008, 23013, 23019, 23023, + 23029, 23035, 23039, 23044, 23052, 23060, 23067, 23072, 23077, 23086, + 23093, 23100, 23105, 23111, 23115, 23119, 23123, 23127, 23131, 23135, + 23139, 23143, 23147, 23151, 23157, 23162, 23167, 23170, 23174, 23178, + 23183, 23187, 23192, 23196, 23201, 23205, 23210, 23214, 23219, 23223, + 23228, 23232, 23237, 23243, 23247, 23252, 23257, 23261, 23265, 23269, + 23273, 23276, 23280, 23286, 23291, 23296, 23300, 23304, 23308, 23313, + 23317, 23322, 23326, 23331, 23334, 23338, 23342, 23347, 23351, 23356, + 23360, 23365, 23371, 23375, 23379, 23383, 23387, 23391, 23395, 23399, + 23403, 23407, 23411, 23415, 23421, 23424, 23428, 23432, 23437, 23441, + 23446, 23450, 23455, 23459, 23464, 23468, 23473, 23477, 23482, 23486, + 23491, 23497, 23501, 23505, 23511, 23517, 23523, 23529, 23533, 23537, + 23541, 23545, 23549, 23553, 23559, 23563, 23567, 23571, 23576, 23580, + 23585, 23589, 23594, 23598, 23603, 23607, 23612, 23616, 23621, 23625, + 23630, 23636, 23640, 23646, 23650, 23654, 23658, 23662, 23666, 23670, + 23676, 23679, 23683, 23687, 23692, 23696, 23701, 23705, 23710, 23714, + 23719, 23723, 23728, 23732, 23737, 23741, 23746, 23752, 23756, 23761, + 23765, 23771, 23777, 23781, 23785, 23789, 23793, 23797, 23801, 23807, + 23810, 23814, 23818, 23823, 23827, 23832, 23836, 23841, 23847, 23851, + 23856, 23860, 23864, 23868, 23872, 23876, 23880, 23884, 23890, 23894, + 23898, 23902, 23907, 23911, 23916, 23920, 23925, 23929, 23934, 23938, + 23943, 23947, 23952, 23956, 23961, 23964, 23968, 23972, 23976, 23980, + 23984, 23988, 23992, 23996, 24002, 24006, 24010, 24014, 24019, 24023, + 24028, 24032, 24037, 24041, 24046, 24050, 24055, 24059, 24064, 24068, + 24073, 24079, 24082, 24087, 24091, 24096, 24102, 24108, 24114, 24120, + 24126, 24132, 24138, 24142, 24146, 24150, 24154, 24158, 24162, 24166, + 24170, 24175, 24179, 24184, 24188, 24193, 24197, 24202, 24206, 24211, + 24215, 24220, 24224, 24229, 24233, 24237, 24241, 24245, 24249, 24253, + 24257, 24263, 24266, 24270, 24274, 24279, 24283, 24288, 24292, 24297, + 24301, 24306, 24310, 24315, 24319, 24324, 24328, 24333, 24339, 24343, + 24349, 24354, 24360, 24364, 24370, 24375, 24379, 24383, 24387, 24391, + 24395, 24400, 24404, 24408, 24413, 24417, 24422, 24425, 24429, 24433, + 24437, 24441, 24445, 24449, 24453, 24457, 24461, 24465, 24469, 24474, + 24478, 24482, 24488, 24492, 24498, 24502, 24508, 24512, 24516, 24520, + 24524, 24528, 24533, 24537, 24541, 24545, 24549, 24553, 24557, 24561, + 24565, 24569, 24573, 24579, 24585, 24591, 24597, 24603, 24608, 24614, + 24620, 24626, 24630, 24634, 24638, 24642, 24646, 24650, 24654, 24658, + 24662, 24666, 24670, 24674, 24678, 24683, 24688, 24693, 24698, 24702, + 24706, 24710, 24714, 24718, 24722, 24726, 24730, 24734, 24740, 24746, + 24752, 24758, 24764, 24770, 24776, 24782, 24788, 24792, 24796, 24800, + 24804, 24808, 24812, 24816, 24822, 24828, 24834, 24840, 24846, 24852, + 24858, 24864, 24870, 24875, 24880, 24885, 24890, 24896, 24902, 24908, + 24914, 24920, 24926, 24932, 24937, 24943, 24949, 24955, 24960, 24966, + 24972, 24978, 24983, 24988, 24993, 24998, 25003, 25008, 25013, 25018, + 25023, 25028, 25033, 25038, 25043, 25048, 25053, 25058, 25063, 25068, + 25073, 25078, 25083, 25088, 25093, 25098, 25103, 25108, 25113, 25118, + 25123, 25128, 25133, 25138, 25143, 25148, 25153, 25158, 25163, 25168, + 25173, 25178, 25183, 25188, 25192, 25197, 25202, 25207, 25212, 25217, + 25222, 25227, 25232, 25237, 25242, 25247, 25252, 25257, 25262, 25267, + 25272, 25277, 25282, 25287, 25292, 25297, 25302, 25307, 25312, 25317, + 25321, 25326, 25331, 25336, 25341, 25346, 25350, 25355, 25360, 25365, + 25370, 25375, 25379, 25384, 25390, 25395, 25400, 25405, 25410, 25416, + 25421, 25426, 25431, 25436, 25441, 25446, 25451, 25456, 25461, 25466, + 25471, 25476, 25481, 25486, 25491, 25496, 25501, 25506, 25511, 25516, + 25521, 25526, 25531, 25536, 25541, 25546, 25551, 25556, 25561, 25566, + 25571, 25576, 25581, 25586, 25591, 25596, 25601, 25606, 25611, 25616, + 25621, 25626, 25631, 25636, 25642, 25647, 25652, 25657, 25662, 25667, + 25672, 25677, 25682, 25687, 25692, 25697, 25702, 25707, 25712, 25717, + 25722, 25727, 25732, 25737, 25742, 25747, 25752, 25757, 25762, 25767, + 25772, 25777, 25782, 25787, 25792, 25797, 25802, 25807, 25812, 25817, + 25822, 25827, 25832, 25838, 25842, 25846, 25850, 25854, 25858, 25862, + 25866, 25870, 25876, 25882, 25888, 25894, 25900, 25906, 25912, 25919, + 25925, 25930, 25935, 25940, 25945, 25950, 25955, 25960, 25965, 25970, + 25975, 25980, 25985, 25990, 25995, 26000, 26005, 26010, 26015, 26020, + 26025, 26030, 26035, 26040, 26045, 26050, 26055, 26060, 26065, 0, 0, 0, + 26072, 26082, 26086, 26093, 26097, 26101, 26105, 26113, 26117, 26122, + 26127, 26132, 26136, 26141, 26146, 26149, 26153, 26157, 26166, 26170, + 26174, 26180, 26184, 26188, 26196, 26200, 26208, 26214, 26220, 26226, + 26232, 26242, 26248, 26252, 26261, 26264, 26270, 26274, 26280, 26285, + 26291, 26299, 26305, 26310, 26317, 26322, 26326, 26330, 26340, 26346, + 26350, 26360, 26366, 26370, 26374, 26381, 26389, 26395, 26401, 26410, + 26414, 26418, 26422, 26430, 26437, 26441, 26445, 26449, 26453, 26457, + 26461, 26465, 26469, 26473, 26477, 26481, 26486, 26491, 26496, 26500, + 26504, 26508, 26512, 26516, 26520, 26528, 26536, 26544, 26552, 0, 0, 0, + 0, 0, 0, 0, 26560, 26564, 26568, 26572, 26576, 26581, 26586, 26591, + 26596, 26600, 26604, 26609, 26613, 0, 26617, 26622, 26627, 26632, 26636, + 26641, 26646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26651, 26655, 26659, + 26663, 26667, 26672, 26677, 26682, 26687, 26691, 26695, 26700, 26704, + 26708, 26713, 26718, 26723, 26728, 26732, 26737, 26742, 26747, 26753, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26758, 26762, 26766, 26770, 26774, 26779, 26784, + 26789, 26794, 26798, 26802, 26807, 26811, 26815, 26820, 26825, 26830, + 26835, 26839, 26844, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26849, 26853, + 26857, 26861, 26865, 26870, 26875, 26880, 26885, 26889, 26893, 26898, + 26902, 0, 26906, 26911, 26916, 0, 26921, 26926, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26931, 26934, 26938, 26942, 26946, 26950, 26954, 26958, + 26962, 26966, 26970, 26974, 26978, 26982, 26986, 26990, 26994, 26998, + 27001, 27005, 27009, 27013, 27017, 27021, 27025, 27029, 27033, 27037, + 27041, 27045, 27049, 27053, 27057, 27060, 27064, 27068, 27074, 27080, + 27086, 27092, 27098, 27104, 27110, 27116, 27122, 27128, 27134, 27140, + 27146, 27152, 27161, 27170, 27176, 27182, 27188, 27193, 27197, 27202, + 27207, 27212, 27216, 27221, 27226, 27231, 27235, 27240, 27244, 27249, + 27254, 27259, 27264, 27268, 27272, 27276, 27280, 27284, 27288, 27292, + 27296, 27300, 27304, 27310, 27314, 27318, 27322, 27326, 27330, 27338, + 27344, 27348, 27354, 27358, 27364, 27368, 0, 0, 27372, 27376, 27379, + 27382, 27385, 27388, 27391, 27394, 27397, 27400, 0, 0, 0, 0, 0, 0, 27403, + 27411, 27419, 27427, 27435, 27443, 27451, 27459, 27467, 27475, 0, 0, 0, + 0, 0, 0, 27483, 27486, 27489, 27492, 27497, 27500, 27505, 27512, 27520, + 27525, 27532, 27535, 27542, 27549, 27556, 0, 27560, 27564, 27567, 27570, + 27573, 27576, 27579, 27582, 27585, 27588, 0, 0, 0, 0, 0, 0, 27591, 27594, + 27597, 27600, 27603, 27606, 27610, 27614, 27618, 27621, 27625, 27629, + 27632, 27636, 27640, 27643, 27647, 27651, 27655, 27659, 27663, 27667, + 27671, 27674, 27678, 27682, 27686, 27689, 27693, 27697, 27701, 27705, + 27709, 27713, 27717, 27721, 27728, 27733, 27738, 27743, 27748, 27754, + 27760, 27766, 27772, 27777, 27783, 27789, 27794, 27800, 27806, 27812, + 27818, 27824, 27829, 27835, 27840, 27846, 27852, 27858, 27864, 27870, + 27875, 27880, 27886, 27892, 27897, 27903, 27908, 27914, 27919, 27924, + 27930, 27936, 27942, 27948, 27954, 27960, 27966, 27972, 27978, 27984, + 27990, 27996, 28001, 28006, 28012, 28018, 0, 0, 0, 0, 0, 0, 0, 0, 28024, + 28033, 28042, 28050, 28058, 28068, 28076, 28085, 28092, 28099, 28106, + 28114, 28122, 28130, 28138, 28146, 28154, 28162, 28170, 28177, 28185, + 28193, 28201, 28209, 28217, 28227, 28237, 28247, 28257, 28267, 28277, + 28287, 28297, 28307, 28317, 28327, 28337, 28347, 28357, 28365, 28373, + 28383, 28391, 0, 0, 0, 0, 0, 28401, 28405, 28409, 28413, 28417, 28421, + 28425, 28429, 28433, 28437, 28441, 28445, 28449, 28453, 28457, 28461, + 28465, 28469, 28473, 28477, 28481, 28485, 28489, 28493, 28499, 28503, + 28509, 28513, 28519, 28523, 28529, 28533, 28537, 28541, 28545, 28549, + 28553, 28559, 28565, 28571, 28577, 28583, 28589, 28594, 28600, 28606, + 28612, 28618, 28625, 28631, 28636, 28641, 28645, 28649, 28653, 28657, + 28661, 28665, 28669, 28675, 28681, 28687, 28692, 28699, 28704, 28709, + 28715, 28720, 28727, 28734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28740, 28746, + 28750, 28755, 28760, 28765, 28770, 28775, 28780, 28785, 28790, 28795, + 28800, 28805, 28810, 28815, 28819, 28823, 28828, 28833, 28838, 28842, + 28846, 28851, 28856, 28861, 28866, 28871, 28876, 28880, 28885, 0, 28890, + 28895, 28900, 28905, 28911, 28917, 28923, 28929, 28934, 28939, 28945, + 28952, 0, 0, 0, 0, 28959, 28964, 28970, 28976, 28982, 28987, 28992, + 28997, 29003, 29009, 29014, 29019, 0, 0, 0, 0, 29024, 0, 0, 0, 29029, + 29034, 29039, 29044, 29048, 29052, 29056, 29060, 29064, 29068, 29072, + 29076, 29080, 29085, 29091, 29097, 29103, 29109, 29114, 29120, 29126, + 29132, 29137, 29143, 29148, 29154, 29160, 29165, 29171, 29177, 29183, + 29188, 29193, 29198, 29204, 29210, 29215, 29221, 29226, 29232, 29237, + 29243, 0, 0, 29249, 29255, 29261, 29267, 29273, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29279, 29287, 29295, 29302, 29310, 29318, 29325, 29333, 29341, + 29349, 29357, 29364, 29372, 29380, 29387, 29395, 29403, 29410, 29418, + 29426, 29433, 29440, 29448, 29455, 29462, 29470, 29477, 29485, 29493, + 29501, 29509, 29517, 29525, 29532, 29540, 29548, 29555, 29563, 29571, + 29579, 29587, 29595, 29603, 29611, 0, 0, 0, 0, 29619, 29628, 29636, + 29644, 29651, 29659, 29666, 29674, 29681, 29689, 29697, 29705, 29713, + 29721, 29729, 29737, 29745, 29753, 29761, 29769, 29777, 29785, 29793, + 29801, 29809, 29816, 0, 0, 0, 0, 0, 0, 29823, 29830, 29836, 29842, 29848, + 29854, 29860, 29866, 29872, 29878, 29884, 0, 0, 0, 29891, 29898, 29905, + 29909, 29915, 29921, 29927, 29933, 29939, 29945, 29951, 29957, 29963, + 29969, 29975, 29981, 29987, 29993, 29999, 30003, 30009, 30015, 30021, + 30027, 30033, 30039, 30045, 30051, 30057, 30063, 30069, 30075, 30081, + 30087, 30093, 30097, 30102, 30107, 30112, 30116, 30121, 30125, 30130, + 30135, 30140, 30144, 30149, 30154, 30159, 30164, 30169, 30173, 30178, + 30183, 30188, 30193, 30197, 30201, 30206, 30211, 30216, 30221, 0, 0, + 30227, 30231, 30238, 30243, 30249, 30255, 30260, 30266, 30272, 30277, + 30283, 30289, 30295, 30301, 30307, 30312, 30317, 30323, 30328, 30334, + 30339, 30345, 30351, 30357, 30363, 30367, 30372, 30377, 30383, 30389, + 30394, 30400, 30406, 30410, 30415, 30420, 30425, 30430, 30435, 30440, + 30445, 30451, 30457, 30463, 30468, 30473, 30477, 30482, 30486, 30491, + 30495, 30500, 30505, 30510, 30515, 30522, 30529, 30536, 30546, 30555, + 30562, 30568, 30579, 30584, 30590, 0, 30596, 30601, 30606, 30614, 30620, + 30628, 30633, 30639, 30645, 30651, 30656, 30662, 30667, 30674, 30680, + 30685, 30691, 30697, 30703, 30710, 30717, 30724, 30729, 30734, 30741, + 30748, 30755, 30762, 30769, 0, 0, 30776, 30783, 30790, 30796, 30802, + 30808, 30814, 30820, 30826, 30832, 30838, 0, 0, 0, 0, 0, 0, 30844, 30850, + 30855, 30860, 30865, 30870, 30875, 30880, 30885, 30890, 0, 0, 0, 0, 0, 0, + 30895, 30900, 30905, 30910, 30915, 30920, 30925, 30934, 30941, 30946, + 30951, 30956, 30961, 30966, 0, 0, 30971, 30978, 30981, 30984, 30987, + 30992, 30996, 31002, 31007, 31013, 31020, 31028, 31032, 31037, 31041, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31046, 31052, 31058, + 31062, 31066, 31070, 31074, 31080, 31084, 31090, 31094, 31100, 31106, + 31114, 31120, 31128, 31132, 31136, 31140, 31146, 31149, 31155, 31159, + 31165, 31169, 31173, 31179, 31183, 31189, 31193, 31199, 31207, 31215, + 31223, 31229, 31233, 31239, 31243, 31249, 31252, 31255, 31261, 31265, + 31271, 31274, 31277, 31281, 31285, 31289, 31295, 31301, 31305, 31308, + 31312, 31317, 31322, 31329, 31334, 31341, 31348, 31357, 31364, 31373, + 31378, 31385, 31392, 31401, 31406, 31413, 31418, 31424, 31430, 31436, + 31442, 31448, 31454, 0, 0, 0, 0, 31460, 31464, 31467, 31470, 31473, + 31476, 31479, 31482, 31485, 31488, 31491, 31494, 31497, 31500, 31505, + 31510, 31515, 31518, 31523, 31528, 31533, 31538, 31545, 31550, 31555, + 31560, 31565, 31572, 31578, 31584, 31590, 31596, 31602, 31611, 31620, + 31626, 31632, 31641, 31650, 31659, 31668, 31677, 31686, 31695, 31704, 0, + 0, 0, 31713, 31718, 31723, 31728, 31732, 31736, 31740, 31745, 31749, + 31753, 31758, 31762, 31767, 31772, 31777, 31782, 31787, 31792, 31797, + 31802, 31807, 31811, 31815, 31820, 31825, 31830, 31834, 31838, 31843, + 31848, 31853, 31858, 31863, 31867, 31873, 31879, 31885, 31891, 31897, + 31903, 31909, 31915, 31921, 31926, 31931, 31938, 31946, 31951, 31956, + 31961, 31965, 31969, 31973, 31977, 31981, 31985, 31989, 31993, 31997, + 32001, 32006, 32011, 32016, 32022, 32028, 32032, 32038, 32042, 32048, + 32054, 32059, 32066, 32070, 32076, 32080, 32086, 32091, 32098, 32105, + 32110, 32117, 32122, 32127, 32132, 32139, 32143, 32149, 32156, 32163, + 32168, 32175, 32182, 32186, 32192, 32197, 32202, 32209, 32214, 32219, + 32224, 32229, 32233, 32237, 32242, 32247, 32254, 32260, 32265, 32272, + 32277, 32284, 32289, 32299, 32305, 32311, 32315, 0, 0, 0, 0, 0, 0, 0, 0, + 32319, 32328, 32335, 32342, 32349, 32353, 32358, 32363, 32368, 32373, + 32378, 32383, 32388, 32393, 32398, 32403, 32408, 32413, 32417, 32421, + 32426, 32431, 32436, 32441, 32446, 32451, 32455, 32460, 32465, 32470, + 32475, 32479, 32484, 32489, 32493, 32498, 32503, 32508, 32513, 32518, + 32522, 32528, 32535, 32541, 32546, 32551, 32557, 32562, 32568, 32573, + 32579, 32585, 32590, 32596, 32602, 32607, 32613, 32619, 32625, 32630, 0, + 0, 0, 32635, 32641, 32651, 32657, 32665, 32671, 32676, 32680, 32684, + 32688, 32692, 32696, 32700, 32704, 32708, 0, 0, 0, 32712, 32717, 32722, + 32727, 32734, 32740, 32746, 32752, 32758, 32764, 32770, 32776, 32782, + 32788, 32795, 32802, 32809, 32816, 32823, 32830, 32837, 32844, 32851, + 32858, 32865, 32872, 32879, 32886, 32893, 32900, 32907, 32914, 32921, + 32928, 32935, 32942, 32949, 32956, 32963, 32970, 32977, 32984, 32991, + 32998, 33006, 33014, 33022, 33028, 33034, 33040, 33048, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33057, 33065, 33073, 33081, 33089, 33099, + 33109, 33119, 0, 0, 0, 0, 0, 0, 0, 0, 33129, 33134, 33139, 33144, 33149, + 33158, 33169, 33178, 33189, 33195, 33208, 33214, 33221, 33228, 33233, + 33239, 33245, 33256, 33265, 33272, 33279, 33288, 33295, 33304, 33314, + 33324, 33331, 33338, 33345, 33355, 33360, 33368, 33374, 33382, 33391, + 33396, 33403, 33409, 33414, 0, 33419, 33425, 0, 0, 0, 0, 0, 0, 33432, + 33437, 33443, 33449, 33457, 33463, 33469, 33475, 33480, 33487, 33492, + 33498, 33504, 33512, 33518, 33526, 33531, 33538, 33544, 33552, 33560, + 33566, 33572, 33579, 33586, 33592, 33599, 33605, 33611, 33616, 33622, + 33630, 33638, 33644, 33650, 33656, 33662, 33670, 33674, 33680, 33686, + 33692, 33698, 33704, 33710, 33714, 33719, 33724, 33731, 33736, 33740, + 33746, 33751, 33756, 33760, 33765, 33770, 33774, 33779, 33784, 33791, + 33795, 33800, 33805, 33809, 33814, 33818, 33823, 33827, 33832, 33837, + 33843, 33848, 33853, 33857, 33862, 33868, 33875, 33880, 33885, 33890, + 33895, 33900, 33904, 33910, 33917, 33924, 33929, 33934, 33938, 33944, + 33950, 33955, 33960, 33965, 33971, 33976, 33982, 33987, 33993, 33999, + 34005, 34012, 34019, 34026, 34033, 34040, 34047, 34052, 34061, 34071, + 34081, 34091, 34101, 34111, 34121, 34134, 34144, 34154, 34164, 34170, + 34175, 34182, 34190, 34198, 34205, 34212, 34219, 34226, 34234, 34243, + 34252, 34261, 34270, 34279, 34288, 34297, 34306, 34315, 34324, 34333, + 34342, 34351, 34360, 34368, 34377, 34388, 34396, 34406, 34418, 34427, + 34436, 34446, 34455, 34463, 34472, 34478, 34483, 34491, 34496, 34504, + 34509, 34518, 34524, 34530, 34537, 34542, 34547, 34555, 34563, 34572, + 34581, 34586, 34593, 34603, 34611, 34620, 34626, 34632, 34637, 34644, + 34649, 34658, 34663, 34668, 34673, 34680, 34686, 34691, 34700, 34708, + 34713, 34718, 34725, 34732, 34736, 34740, 34743, 34746, 34749, 34752, + 34755, 34758, 34765, 34768, 34771, 34776, 34780, 34784, 34788, 34792, + 34796, 34806, 34812, 34818, 34824, 34832, 34840, 34846, 34852, 34859, + 34865, 34870, 34876, 34883, 34889, 34896, 34902, 34910, 34915, 34921, + 34927, 34933, 34939, 34945, 34951, 34957, 34969, 34979, 34985, 34991, + 35001, 35007, 35015, 35023, 35031, 0, 0, 0, 0, 0, 0, 35036, 35043, 35050, + 35055, 35064, 35072, 35080, 35087, 35094, 35101, 35108, 35116, 35124, + 35134, 35144, 35152, 35160, 35168, 35176, 35185, 35194, 35202, 35210, + 35219, 35228, 35238, 35248, 35257, 35266, 35274, 35282, 35290, 35298, + 35308, 35318, 35326, 35334, 35342, 35350, 35358, 35366, 35374, 35382, + 35390, 35398, 35406, 35414, 35423, 35432, 35441, 35450, 35460, 35470, + 35477, 35484, 35492, 35500, 35509, 35518, 35526, 35534, 35546, 35558, + 35567, 35576, 35585, 35594, 35601, 35608, 35616, 35624, 35632, 35640, + 35648, 35656, 35664, 35672, 35681, 35690, 35699, 35708, 35717, 35726, + 35736, 35746, 35756, 35766, 35775, 35784, 35791, 35798, 35806, 35814, + 35822, 35830, 35838, 35846, 35858, 35870, 35879, 35888, 35896, 35904, + 35912, 35920, 35931, 35942, 35953, 35964, 35976, 35988, 35996, 36004, + 36012, 36020, 36029, 36038, 36047, 36056, 36064, 36072, 36080, 36088, + 36096, 36104, 36113, 36122, 36132, 36142, 36150, 36158, 36166, 36174, + 36182, 36190, 36197, 36204, 36212, 36220, 36228, 36236, 36244, 36252, + 36260, 36268, 36276, 36284, 36292, 36300, 36308, 36316, 36324, 36332, + 36341, 36350, 36359, 36367, 36376, 36385, 36394, 36403, 36413, 36422, + 36428, 36433, 36440, 36447, 36455, 36463, 36472, 36481, 36491, 36501, + 36512, 36523, 36533, 36543, 36553, 36563, 36572, 36581, 36591, 36601, + 36612, 36623, 36633, 36643, 36653, 36663, 36670, 36677, 36685, 36693, + 36700, 36707, 36716, 36725, 36735, 36745, 36756, 36767, 36777, 36787, + 36797, 36807, 36816, 36825, 36833, 36841, 36848, 36855, 36863, 36871, + 36880, 36889, 36899, 36909, 36920, 36931, 36941, 36951, 36961, 36971, + 36980, 36989, 36999, 37009, 37020, 37031, 37041, 37051, 37061, 37071, + 37078, 37085, 37093, 37101, 37110, 37119, 37129, 37139, 37150, 37161, + 37171, 37181, 37191, 37201, 37209, 37217, 37225, 37233, 37242, 37251, + 37259, 37267, 37274, 37281, 37288, 37295, 37303, 37311, 37319, 37327, + 37338, 37349, 37360, 37371, 37382, 37393, 37401, 37409, 37420, 37431, + 37442, 37453, 37464, 37475, 37483, 37491, 37502, 37513, 37524, 0, 0, + 37535, 37543, 37551, 37562, 37573, 37584, 0, 0, 37595, 37603, 37611, + 37622, 37633, 37644, 37655, 37666, 37677, 37685, 37693, 37704, 37715, + 37726, 37737, 37748, 37759, 37767, 37775, 37786, 37797, 37808, 37819, + 37830, 37841, 37849, 37857, 37868, 37879, 37890, 37901, 37912, 37923, + 37931, 37939, 37950, 37961, 37972, 0, 0, 37983, 37991, 37999, 38010, + 38021, 38032, 0, 0, 38043, 38051, 38059, 38070, 38081, 38092, 38103, + 38114, 0, 38125, 0, 38133, 0, 38144, 0, 38155, 38166, 38174, 38182, + 38193, 38204, 38215, 38226, 38237, 38248, 38256, 38264, 38275, 38286, + 38297, 38308, 38319, 38330, 38338, 38346, 38354, 38362, 38370, 38378, + 38386, 38394, 38402, 38410, 38418, 38426, 38434, 0, 0, 38442, 38453, + 38464, 38478, 38492, 38506, 38520, 38534, 38548, 38559, 38570, 38584, + 38598, 38612, 38626, 38640, 38654, 38665, 38676, 38690, 38704, 38718, + 38732, 38746, 38760, 38771, 38782, 38796, 38810, 38824, 38838, 38852, + 38866, 38877, 38888, 38902, 38916, 38930, 38944, 38958, 38972, 38983, + 38994, 39008, 39022, 39036, 39050, 39064, 39078, 39086, 39094, 39105, + 39113, 0, 39124, 39132, 39143, 39151, 39159, 39167, 39175, 39183, 39186, + 39189, 39192, 39195, 39201, 39212, 39220, 0, 39231, 39239, 39250, 39258, + 39266, 39274, 39282, 39290, 39296, 39302, 39308, 39316, 39324, 39335, 0, + 0, 39346, 39354, 39365, 39373, 39381, 39389, 0, 39397, 39403, 39409, + 39415, 39423, 39431, 39442, 39453, 39461, 39469, 39477, 39488, 39496, + 39504, 39512, 39520, 39528, 39534, 39540, 0, 0, 39543, 39554, 39562, 0, + 39573, 39581, 39592, 39600, 39608, 39616, 39624, 39632, 39635, 0, 39638, + 39642, 39646, 39650, 39654, 39658, 39662, 39666, 39670, 39674, 39678, + 39682, 39688, 39694, 39700, 39703, 39706, 39708, 39712, 39716, 39720, + 39724, 39726, 39730, 39734, 39740, 39746, 39753, 39760, 39765, 39770, + 39776, 39782, 39784, 39787, 39789, 39793, 39797, 39801, 39804, 39808, + 39812, 39816, 39820, 39824, 39830, 39834, 39838, 39844, 39849, 39856, + 39858, 39861, 39865, 39869, 39874, 39880, 39882, 39891, 39900, 39903, + 39907, 39909, 39911, 39913, 39916, 39922, 39924, 39928, 39932, 39939, + 39946, 39950, 39955, 39960, 39965, 39970, 39974, 39978, 39981, 39985, + 39989, 39996, 40001, 40005, 40009, 40014, 40018, 40022, 40027, 40032, + 40036, 40040, 40044, 40046, 40051, 40056, 40060, 40064, 40068, 40072, 0, + 40076, 40080, 40084, 40090, 40096, 40102, 40108, 40115, 40122, 40127, + 40132, 40136, 0, 0, 40142, 40145, 40148, 40151, 40154, 40157, 40160, + 40164, 40168, 40173, 40178, 40183, 40190, 40194, 40197, 40200, 40203, + 40206, 40209, 40212, 40215, 40218, 40221, 40225, 40229, 40234, 40239, 0, + 40244, 40250, 40256, 40262, 40269, 40276, 40283, 40290, 40296, 40303, + 40310, 40317, 40323, 0, 0, 0, 40330, 40333, 40336, 40339, 40344, 40347, + 40350, 40353, 40356, 40359, 40362, 40366, 40369, 40372, 40375, 40378, + 40381, 40386, 40389, 40392, 40395, 40398, 40401, 40406, 40409, 40412, + 40417, 40422, 40426, 40429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 40432, 40437, 40442, 40449, 40457, 40462, 40467, 40471, 40475, + 40480, 40487, 40494, 40498, 40503, 40508, 40513, 40518, 40525, 40530, + 40535, 40540, 40549, 40556, 40563, 40567, 40572, 40578, 40583, 40590, + 40598, 40606, 40610, 40614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 40618, 40622, 40630, 40634, 40638, 40643, 40647, 40651, 40655, 40657, + 40661, 40665, 40669, 40674, 40678, 40682, 40690, 40693, 40697, 40700, + 40703, 40709, 40713, 40716, 40722, 40726, 40730, 40734, 40737, 40741, + 40744, 40748, 40750, 40753, 40756, 40760, 40762, 40766, 40769, 40772, + 40777, 40782, 40788, 40791, 40794, 40798, 40803, 40806, 40809, 40812, + 40816, 40820, 40824, 40827, 40829, 40832, 40835, 40838, 40842, 40847, + 40850, 40854, 40858, 40862, 40866, 40871, 40876, 40880, 40885, 40890, + 40895, 40900, 40904, 40908, 40913, 40917, 40920, 40923, 40925, 40929, + 40935, 40942, 40949, 40956, 40963, 40970, 40977, 40984, 40991, 40999, + 41006, 41014, 41021, 41028, 41036, 41044, 41049, 41054, 41059, 41064, + 41069, 41074, 41079, 41084, 41089, 41094, 41100, 41106, 41112, 41118, + 41125, 41133, 41140, 41146, 41152, 41158, 41164, 41170, 41176, 41182, + 41188, 41194, 41201, 41208, 41215, 41222, 41230, 41239, 41247, 41258, + 41266, 41274, 41283, 41290, 41299, 41308, 41316, 41325, 0, 0, 0, 0, 0, 0, + 41333, 41335, 41337, 41339, 41341, 41344, 41347, 41351, 41355, 41359, + 41363, 41367, 41371, 41375, 41379, 41384, 41389, 41394, 41399, 41404, + 41409, 41414, 41419, 41424, 41429, 41435, 41439, 41443, 41448, 41453, + 41458, 41463, 41467, 41474, 41481, 41488, 41495, 41502, 41509, 41516, + 41523, 41531, 41543, 41550, 41557, 41564, 41571, 41578, 41585, 41592, + 41599, 41606, 41613, 41618, 41624, 41629, 41634, 41639, 41644, 41649, + 41656, 41663, 41668, 41674, 41679, 41682, 41685, 41688, 41691, 41695, + 41699, 41704, 41709, 41714, 41719, 41723, 41727, 41731, 41735, 41740, + 41745, 41749, 41753, 41757, 41761, 41766, 41771, 41774, 41777, 41780, + 41783, 41789, 41796, 41806, 41816, 41820, 41828, 41835, 41843, 41851, + 41855, 41861, 41867, 41871, 41876, 41881, 41887, 41893, 41899, 41906, + 41910, 41914, 41919, 41922, 41924, 41928, 41932, 41940, 41944, 41946, + 41948, 41952, 41960, 41965, 41971, 41981, 41988, 41993, 41997, 42001, + 42005, 42008, 42011, 42014, 42018, 42022, 42026, 42030, 42034, 42037, + 42041, 42045, 42048, 42050, 42053, 42055, 42059, 42063, 42065, 42071, + 42074, 42079, 42083, 42087, 42089, 42091, 42093, 42096, 42100, 42104, + 42108, 42112, 42116, 42122, 42128, 42130, 42132, 42134, 42136, 42139, + 42141, 42145, 42147, 42151, 42155, 42160, 42164, 42168, 42172, 42176, + 42180, 42186, 42190, 42200, 42210, 42214, 42220, 42227, 42231, 42235, + 42238, 42243, 42247, 42253, 42257, 42270, 42279, 42283, 42287, 42293, + 42297, 42300, 42302, 42305, 42309, 42313, 42320, 42324, 42328, 42332, + 42335, 42340, 42345, 42351, 42357, 42362, 42367, 42375, 42383, 42387, + 42391, 42393, 42398, 42402, 42406, 42414, 42422, 42429, 42436, 42445, + 42454, 42460, 42466, 42474, 42482, 42484, 42486, 42492, 42498, 42505, + 42512, 42518, 42524, 42528, 42532, 42539, 42546, 42553, 42560, 42570, + 42580, 42588, 42596, 42598, 42602, 42606, 42611, 42616, 42624, 42632, + 42635, 42638, 42641, 42644, 42647, 42652, 42656, 42661, 42666, 42669, + 42672, 42675, 42678, 42681, 42685, 42688, 42691, 42694, 42697, 42699, + 42701, 42703, 42705, 42713, 42721, 42727, 42731, 42737, 42747, 42753, + 42759, 42765, 42773, 42782, 42794, 42798, 42802, 42804, 42810, 42812, + 42814, 42816, 42818, 42824, 42827, 42833, 42839, 42843, 42847, 42851, + 42854, 42858, 42862, 42864, 42873, 42882, 42887, 42892, 42898, 42904, + 42910, 42913, 42916, 42919, 42922, 42924, 42929, 42934, 42939, 42945, + 42951, 42960, 42969, 42976, 42983, 42990, 42997, 43007, 43017, 43027, + 43037, 43047, 43057, 43066, 43075, 43084, 43093, 43101, 43113, 43124, + 43140, 43143, 43148, 43154, 43160, 43167, 43181, 43196, 43202, 43208, + 43215, 43221, 43229, 43235, 43248, 43262, 43267, 43273, 43281, 43284, + 43287, 43289, 43292, 43295, 43297, 43299, 43303, 43306, 43309, 43312, + 43315, 43320, 43325, 43330, 43335, 43340, 43343, 43345, 43347, 43349, + 43353, 43357, 43361, 43367, 43371, 43373, 43375, 43380, 43385, 43390, + 43395, 43400, 43405, 43407, 43409, 43418, 43422, 43430, 43439, 43441, + 43446, 43451, 43459, 43463, 43465, 43469, 43471, 43475, 43479, 43483, + 43485, 43487, 43489, 43496, 43505, 43514, 43523, 43532, 43541, 43550, + 43559, 43568, 43576, 43584, 43593, 43602, 43611, 43620, 43628, 43636, + 43645, 43654, 43663, 43673, 43682, 43692, 43701, 43711, 43719, 43728, + 43738, 43747, 43757, 43766, 43776, 43784, 43793, 43802, 43811, 43820, + 43829, 43838, 43848, 43857, 43866, 43875, 43885, 43894, 43903, 43912, + 43921, 43931, 43941, 43950, 43959, 43967, 43976, 43983, 43992, 44001, + 44012, 44021, 44031, 44041, 44048, 44055, 44062, 44071, 44080, 44089, + 44098, 44105, 44110, 44118, 44124, 44127, 44135, 44138, 44143, 44148, + 44151, 44154, 44162, 44165, 44170, 44173, 44180, 44185, 44193, 44196, + 44199, 44202, 44207, 44212, 44215, 44218, 44226, 44229, 44236, 44243, + 44247, 44251, 44256, 44261, 44267, 44272, 44278, 44284, 44289, 44295, + 44303, 44309, 44317, 44325, 44331, 44339, 44347, 44356, 44364, 44370, + 44378, 44387, 44395, 44399, 44404, 44418, 44432, 44436, 44440, 44444, + 44448, 44458, 44462, 44467, 44472, 44477, 44482, 44487, 44492, 44502, + 44512, 44520, 44530, 44540, 44548, 44558, 44568, 44576, 44586, 44596, + 44604, 44612, 44622, 44632, 44635, 44638, 44641, 44646, 44650, 44656, + 44663, 44670, 44678, 44685, 44689, 44693, 44697, 44701, 44703, 44707, + 44711, 44716, 44721, 44728, 44735, 44738, 44745, 44747, 44749, 44753, + 44757, 44762, 44768, 44774, 44780, 44786, 44795, 44804, 44813, 44817, + 44819, 44823, 44830, 44837, 44844, 44851, 44858, 44861, 44866, 0, 0, 0, + 0, 0, 44872, 44876, 44883, 44890, 44897, 44904, 44908, 44912, 44916, + 44920, 44925, 44931, 44936, 44942, 44948, 44954, 44960, 44968, 44975, + 44982, 44989, 44996, 45001, 45007, 45016, 45020, 45027, 45031, 45035, + 45041, 45047, 45053, 45059, 45063, 45067, 45070, 45074, 45078, 45085, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45092, 45095, 45099, 45103, 45109, 45115, 45121, 45129, 45136, 45140, + 45148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 45153, 45156, 45159, 45162, 45165, 45168, 45171, 45174, 45177, 45180, + 45184, 45188, 45192, 45196, 45200, 45204, 45208, 45212, 45216, 45220, + 45224, 45227, 45230, 45233, 45236, 45239, 45242, 45245, 45248, 45251, + 45255, 45259, 45263, 45267, 45271, 45275, 45279, 45283, 45287, 45291, + 45295, 45301, 45307, 45313, 45320, 45327, 45334, 45341, 45348, 45355, + 45362, 45369, 45376, 45383, 45390, 45397, 45404, 45411, 45418, 45425, + 45432, 45437, 45443, 45449, 45455, 45460, 45466, 45472, 45478, 45483, + 45489, 45495, 45500, 45506, 45512, 45517, 45523, 45529, 45534, 45539, + 45545, 45550, 45556, 45562, 45568, 45574, 45580, 45585, 45591, 45597, + 45603, 45608, 45614, 45620, 45626, 45631, 45637, 45643, 45648, 45654, + 45660, 45665, 45671, 45677, 45682, 45687, 45693, 45698, 45704, 45710, + 45716, 45722, 45728, 45733, 45739, 45745, 45751, 45756, 45762, 45768, + 45774, 45779, 45785, 45791, 45796, 45802, 45808, 45813, 45819, 45825, + 45830, 45835, 45841, 45846, 45852, 45858, 45864, 45870, 45876, 45880, + 45885, 45890, 45895, 45900, 45905, 45910, 45915, 45920, 45925, 45930, + 45934, 45938, 45942, 45946, 45950, 45954, 45958, 45962, 45966, 45971, + 45976, 45981, 45986, 45991, 45996, 46005, 46014, 46023, 46032, 46041, + 46050, 46059, 46068, 46075, 46083, 46091, 46098, 46105, 46113, 46121, + 46128, 46135, 46143, 46151, 46158, 46165, 46173, 46181, 46188, 46195, + 46203, 46212, 46221, 46229, 46238, 46247, 46254, 46261, 46269, 46278, + 46287, 46295, 46304, 46313, 46320, 46327, 46336, 46345, 46353, 46361, + 46370, 46379, 46386, 46393, 46402, 46411, 46419, 46427, 46436, 46445, + 46452, 46459, 46468, 46477, 46485, 46494, 46503, 46511, 46521, 46531, + 46541, 46551, 46560, 46569, 46578, 46587, 46594, 46602, 46610, 46618, + 46626, 46631, 46636, 46645, 46653, 46660, 46669, 46677, 46684, 46693, + 46701, 46708, 46717, 46725, 46732, 46741, 46749, 46756, 46765, 46773, + 46780, 46789, 46797, 46804, 46813, 46821, 46828, 46837, 46845, 46852, + 46861, 46870, 46879, 46888, 46902, 46916, 46923, 46928, 46933, 46938, + 46943, 46948, 46953, 46958, 46963, 46971, 46979, 46987, 46995, 47000, + 47007, 47014, 47021, 47026, 47034, 47041, 47049, 47053, 47060, 47066, + 47073, 47077, 47083, 47089, 47095, 47099, 47102, 47106, 47110, 47117, + 47123, 47129, 47135, 47141, 47155, 47165, 47179, 47193, 47199, 47209, + 47223, 47226, 47229, 47236, 47244, 47249, 47254, 47262, 47274, 47286, + 47294, 47298, 47302, 47305, 47308, 47312, 47316, 47319, 47322, 47327, + 47332, 47338, 47344, 47349, 47354, 47360, 47366, 47371, 47376, 47381, + 47386, 47392, 47398, 47403, 47408, 47414, 47420, 47425, 47430, 47433, + 47436, 47445, 47447, 47449, 47452, 47456, 47462, 47464, 47467, 47474, + 47481, 47489, 47497, 47507, 47521, 47526, 47531, 47535, 47540, 47548, + 47556, 47565, 47574, 47583, 47592, 47597, 47602, 47608, 47614, 47620, + 47626, 47629, 47635, 47641, 47651, 47661, 47669, 47677, 47686, 47695, + 47699, 47707, 47715, 47723, 47731, 47740, 47749, 47758, 47767, 47772, + 47777, 47782, 47787, 47792, 47798, 47804, 47809, 47815, 47817, 47819, + 47821, 47823, 47826, 47829, 47831, 47833, 47835, 47839, 47843, 47845, + 47847, 47850, 47853, 47857, 47863, 47869, 47871, 47878, 47882, 47887, + 47892, 47894, 47904, 47910, 47916, 47922, 47928, 47934, 47940, 47945, + 47948, 47951, 47954, 47956, 47958, 47962, 47966, 47971, 47976, 47981, + 47984, 47988, 47993, 47996, 48000, 48005, 48010, 48015, 48020, 48025, + 48030, 48035, 48040, 48045, 48050, 48055, 48060, 48066, 48072, 48078, + 48080, 48083, 48085, 48088, 48090, 48092, 48094, 48096, 48098, 48100, + 48102, 48104, 48106, 48108, 48110, 48112, 48114, 48116, 48118, 48120, + 48122, 48127, 48132, 48137, 48142, 48147, 48152, 48157, 48162, 48167, + 48172, 48177, 48182, 48187, 48192, 48197, 48202, 48207, 48212, 48217, + 48222, 48226, 48230, 48234, 48240, 48246, 48251, 48256, 48261, 48267, + 48273, 48278, 48286, 48294, 48302, 48310, 48318, 48326, 48334, 48342, + 48348, 48353, 48358, 48363, 48366, 48370, 48374, 48378, 48382, 48386, + 48390, 48397, 48404, 48412, 48420, 48425, 48430, 48437, 48444, 48451, + 48458, 48461, 48464, 48469, 48471, 48475, 48480, 48482, 48484, 48486, + 48488, 48493, 48496, 48498, 48503, 48510, 48517, 48520, 48524, 48529, + 48534, 48542, 48548, 48554, 48566, 48573, 48580, 48585, 48590, 48596, + 48599, 48602, 48607, 48609, 48613, 48615, 48617, 48619, 48621, 48623, + 48625, 48630, 48632, 48634, 48636, 48638, 48642, 48644, 48647, 48652, + 48657, 48662, 48667, 48673, 48679, 48681, 48684, 48691, 48697, 48703, + 48710, 48714, 48718, 48720, 48722, 48726, 48732, 48737, 48739, 48743, + 48752, 48760, 48768, 48774, 48780, 48785, 48791, 48796, 48799, 48813, + 48816, 48821, 48826, 48832, 48842, 48844, 48850, 48856, 48860, 48867, + 48871, 48873, 48875, 48879, 48885, 48890, 48896, 48898, 48904, 48906, + 48912, 48914, 48916, 48921, 48923, 48927, 48932, 48934, 48939, 48944, + 48948, 48955, 48965, 48970, 48976, 48979, 48985, 48988, 48993, 48998, + 49002, 49004, 49006, 49010, 49014, 49018, 49022, 49027, 49029, 49034, + 49037, 49040, 49043, 49047, 49051, 49056, 49060, 49065, 49070, 49074, + 49080, 49087, 49090, 49096, 49101, 49105, 49110, 49116, 49122, 49129, + 49135, 49142, 49149, 49151, 49158, 49162, 49169, 49175, 49180, 49186, + 49190, 49195, 49198, 49204, 49210, 49217, 49225, 49232, 49241, 49251, + 49258, 49264, 49268, 49276, 49281, 49290, 49293, 49296, 49305, 49316, + 49323, 49325, 49331, 49336, 49338, 49341, 49345, 49353, 49362, 49365, + 49370, 49375, 49383, 49391, 49399, 49407, 49413, 49419, 49425, 49433, + 49438, 49441, 49445, 49448, 49459, 49469, 49479, 49488, 49499, 49509, + 49518, 49524, 49532, 49536, 49544, 49548, 49556, 49563, 49570, 49579, + 49588, 49598, 49608, 49618, 49628, 49637, 49646, 49656, 49666, 49675, + 49684, 49690, 49696, 49702, 49708, 49714, 49720, 49726, 49732, 49738, + 49745, 49751, 49757, 49763, 49769, 49775, 49781, 49787, 49793, 49799, + 49806, 49813, 49820, 49827, 49834, 49841, 49848, 49855, 49862, 49869, + 49877, 49882, 49885, 49889, 49893, 49898, 49901, 49906, 49912, 49917, + 49921, 49926, 49932, 49939, 49942, 49949, 49956, 49960, 49968, 49976, + 49981, 49987, 49992, 49997, 50004, 50011, 50019, 50027, 50036, 50040, + 50049, 50054, 50058, 50064, 50068, 50074, 50081, 50086, 50093, 50097, + 50102, 50106, 50111, 50115, 50120, 50125, 50134, 50136, 50140, 50144, + 50151, 50158, 50164, 50172, 50178, 50184, 50189, 50192, 50197, 50202, + 50207, 50215, 50219, 50226, 50234, 50242, 50247, 50252, 50258, 50263, + 50268, 50274, 50279, 50282, 50286, 50290, 50297, 50306, 50311, 50320, + 50329, 50335, 50341, 50346, 50351, 50356, 50361, 50367, 50373, 50381, + 50389, 50395, 50401, 50405, 50409, 50416, 50423, 50429, 50432, 50435, + 50439, 50443, 50447, 50452, 50458, 50464, 50471, 50478, 50483, 50487, + 50491, 50495, 50499, 50503, 50507, 50511, 50515, 50519, 50523, 50527, + 50531, 50535, 50539, 50543, 50547, 50551, 50555, 50559, 50563, 50567, + 50571, 50575, 50579, 50583, 50587, 50591, 50595, 50599, 50603, 50607, + 50611, 50615, 50619, 50623, 50627, 50631, 50635, 50639, 50643, 50647, + 50651, 50655, 50659, 50663, 50667, 50671, 50675, 50679, 50683, 50687, + 50691, 50695, 50699, 50703, 50707, 50711, 50715, 50719, 50723, 50727, + 50731, 50735, 50739, 50743, 50747, 50751, 50755, 50759, 50763, 50767, + 50771, 50775, 50779, 50783, 50787, 50791, 50795, 50799, 50803, 50807, + 50811, 50815, 50819, 50823, 50827, 50831, 50835, 50839, 50843, 50847, + 50851, 50855, 50859, 50863, 50867, 50871, 50875, 50879, 50883, 50887, + 50891, 50895, 50899, 50903, 50907, 50911, 50915, 50919, 50923, 50927, + 50931, 50935, 50939, 50943, 50947, 50951, 50955, 50959, 50963, 50967, + 50971, 50975, 50979, 50983, 50987, 50991, 50995, 50999, 51003, 51007, + 51011, 51015, 51019, 51023, 51027, 51031, 51035, 51039, 51043, 51047, + 51051, 51055, 51059, 51063, 51067, 51071, 51075, 51079, 51083, 51087, + 51091, 51095, 51099, 51103, 51107, 51111, 51115, 51119, 51123, 51127, + 51131, 51135, 51139, 51143, 51147, 51151, 51155, 51159, 51163, 51167, + 51171, 51175, 51179, 51183, 51187, 51191, 51195, 51199, 51203, 51207, + 51211, 51215, 51219, 51223, 51227, 51231, 51235, 51239, 51243, 51247, + 51251, 51255, 51259, 51263, 51267, 51271, 51275, 51279, 51283, 51287, + 51291, 51295, 51299, 51303, 51307, 51311, 51315, 51319, 51323, 51327, + 51331, 51335, 51339, 51343, 51347, 51351, 51355, 51359, 51363, 51367, + 51371, 51375, 51379, 51383, 51387, 51391, 51395, 51399, 51403, 51407, + 51411, 51415, 51419, 51423, 51427, 51431, 51435, 51439, 51443, 51447, + 51451, 51455, 51459, 51463, 51467, 51471, 51475, 51479, 51483, 51487, + 51491, 51495, 51499, 51503, 51507, 51514, 51522, 51528, 51534, 51541, + 51548, 51554, 51560, 51565, 51570, 51574, 51578, 51583, 51588, 51594, + 51600, 51608, 51615, 51620, 51625, 51633, 51642, 51649, 51659, 51670, + 51673, 51676, 51680, 51684, 51691, 51698, 51709, 51720, 51728, 51736, + 51742, 51748, 51754, 51760, 51769, 51778, 51787, 51796, 51806, 51816, + 51826, 51836, 51846, 51856, 51866, 51876, 51885, 51895, 51905, 51915, + 51925, 51932, 51939, 51946, 51953, 51963, 51973, 51981, 51989, 51996, + 52003, 52010, 52017, 52024, 52029, 52034, 52040, 52048, 52057, 52065, + 52073, 52081, 52089, 52097, 52105, 52113, 52121, 52130, 52139, 52148, + 52157, 52166, 52175, 52184, 52193, 52202, 52211, 52220, 52229, 52238, + 52247, 52256, 52265, 52279, 52294, 52308, 52323, 52337, 52351, 52365, + 52379, 52389, 52400, 52410, 52421, 52436, 52451, 52459, 52465, 52472, + 52479, 52486, 52493, 52498, 52504, 52509, 52514, 52520, 52525, 52530, + 52535, 52540, 52545, 52552, 52558, 52566, 52571, 52576, 52580, 52584, + 52592, 52600, 52608, 52616, 52623, 52630, 52643, 52656, 52669, 52682, + 52690, 52698, 52704, 52710, 52717, 52724, 52731, 52738, 52742, 52747, + 52755, 52763, 52771, 52778, 52782, 52790, 52798, 52801, 52805, 52810, + 52817, 52825, 52833, 52853, 52873, 52893, 52913, 52933, 52953, 52973, + 52993, 52999, 53006, 53015, 53023, 53031, 53036, 53039, 53042, 53047, + 53050, 53069, 53076, 53082, 53088, 53092, 53095, 53098, 53101, 53113, + 53126, 53133, 53140, 53143, 53147, 53150, 53155, 53160, 53165, 53171, + 53180, 53187, 53194, 53202, 53209, 53216, 53219, 53225, 53231, 53234, + 53237, 53242, 53247, 53253, 53259, 53263, 53268, 53275, 53279, 53285, + 53289, 53293, 53301, 53313, 53322, 53326, 53328, 53337, 53346, 53352, + 53355, 53361, 53367, 53372, 53377, 53382, 53387, 53392, 53397, 53399, + 53405, 53410, 53417, 53421, 53427, 53430, 53434, 53441, 53448, 53450, + 53452, 53458, 53464, 53470, 53479, 53488, 53495, 53502, 53508, 53515, + 53520, 53525, 53530, 53536, 53542, 53547, 53554, 53558, 53562, 53575, + 53588, 53600, 53609, 53615, 53622, 53627, 53632, 53637, 53642, 53647, + 53649, 53656, 53664, 53672, 53680, 53687, 53695, 53701, 53706, 53712, + 53718, 53724, 53731, 53737, 53745, 53753, 53761, 53769, 53777, 53783, + 53789, 53798, 53802, 53811, 53820, 53829, 53837, 53841, 53847, 53854, + 53861, 53865, 53871, 53879, 53885, 53890, 53896, 53901, 53906, 53913, + 53920, 53925, 53930, 53938, 53946, 53956, 53966, 53973, 53980, 53984, + 53988, 54000, 54006, 54013, 54018, 54023, 54030, 54037, 54043, 54049, + 54059, 54067, 54076, 54083, 54091, 54098, 54104, 54111, 54117, 54125, + 54133, 54141, 54149, 54155, 54160, 54169, 54179, 54186, 54195, 54201, + 54206, 54211, 54221, 54228, 54234, 54240, 54248, 54253, 54260, 54267, + 54278, 54285, 54292, 54299, 54306, 54313, 54321, 54329, 54342, 54355, + 54367, 54379, 54393, 54407, 54413, 54419, 54428, 54437, 54444, 54451, + 54460, 54469, 54478, 54487, 54495, 54503, 54513, 54523, 54537, 54551, + 54560, 54569, 54582, 54595, 54604, 54613, 54624, 54635, 54641, 54647, + 54656, 54665, 54670, 54675, 54683, 54689, 54695, 54703, 54711, 54724, + 54737, 54741, 54745, 54753, 54761, 54768, 54776, 54784, 54793, 54802, + 54808, 54814, 54821, 54828, 54835, 54842, 54851, 54860, 54863, 54866, + 54871, 54876, 54882, 54888, 54895, 54902, 54913, 54924, 54931, 54938, + 54946, 54954, 54962, 54970, 54978, 54986, 54993, 55000, 55004, 55008, + 55016, 55024, 55029, 55034, 55039, 55044, 55050, 55064, 55071, 55078, + 55082, 55084, 55086, 55091, 55096, 55101, 55105, 55113, 55120, 55127, + 55135, 55147, 55155, 55163, 55174, 55178, 55182, 55188, 55196, 55209, + 55216, 55223, 55230, 55235, 55242, 55251, 55259, 55265, 55271, 55277, + 55287, 55297, 55305, 55314, 55319, 55322, 55327, 55332, 55337, 55342, + 55347, 55351, 55354, 55357, 55360, 55365, 55370, 55375, 55380, 55384, + 55388, 55395, 55402, 55409, 55416, 55423, 55430, 55440, 55450, 55457, + 55464, 55472, 55480, 55484, 55489, 55494, 55500, 55506, 55509, 55512, + 55515, 55518, 55522, 55527, 55532, 55537, 55542, 55547, 55551, 55555, + 55559, 55563, 55567, 55571, 55575, 55581, 55585, 55591, 55596, 55603, + 55611, 55618, 55626, 55633, 55641, 55650, 55657, 55667, 55678, 55684, + 55693, 55699, 55708, 55717, 55723, 55729, 55733, 55737, 55746, 55755, + 55762, 55769, 55778, 55787, 55793, 55799, 55805, 55810, 55814, 55818, + 55823, 55828, 55833, 55841, 55849, 55852, 55856, 55865, 55874, 55882, + 55890, 55901, 55914, 55918, 55922, 55926, 55930, 55935, 55940, 55946, + 55952, 55958, 55964, 55970, 55976, 55982, 55988, 55997, 56006, 56013, + 56020, 56027, 0, 0, 56034, 56043, 56052, 56061, 56070, 56078, 56086, + 56094, 56102, 56107, 56112, 56121, 56131, 56140, 56150, 56157, 56164, + 56171, 56178, 56183, 56188, 56193, 56198, 56206, 56215, 56223, 56232, + 56236, 56240, 56244, 56248, 56258, 0, 0, 56261, 56270, 56279, 56288, + 56297, 56303, 56309, 56315, 56321, 56331, 56341, 56351, 56361, 56371, + 56381, 56391, 56401, 56408, 56415, 56422, 56429, 56436, 56443, 56450, + 56457, 56463, 56469, 56475, 56481, 56487, 56493, 56499, 56505, 56515, 0, + 0, 0, 56525, 56532, 56535, 56539, 56543, 56548, 56552, 56556, 56559, + 56568, 56577, 56586, 0, 56595, 56601, 56607, 56615, 56625, 56632, 56641, + 56646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56649, 56654, 56659, 56664, 56669, 56674, 56679, 56684, 56689, 56694, + 56699, 56705, 56709, 56714, 56719, 56724, 56729, 56734, 56739, 56744, + 56749, 56754, 56759, 56764, 56769, 56774, 56779, 56784, 56789, 56794, + 56799, 56804, 56809, 56814, 56819, 56825, 56830, 56836, 56845, 56850, + 56858, 56865, 56874, 56879, 56884, 56889, 56895, 0, 56902, 56907, 56912, + 56917, 56922, 56927, 56932, 56937, 56942, 56947, 56952, 56958, 56962, + 56967, 56972, 56977, 56982, 56987, 56992, 56997, 57002, 57007, 57012, + 57017, 57022, 57027, 57032, 57037, 57042, 57047, 57052, 57057, 57062, + 57067, 57072, 57078, 57083, 57089, 57098, 57103, 57111, 57118, 57127, + 57132, 57137, 57142, 57148, 0, 57155, 57163, 57171, 57181, 57188, 57196, + 57202, 57211, 57219, 57227, 57235, 57243, 57251, 57259, 57264, 57271, + 57276, 57282, 57290, 57297, 57304, 57312, 57318, 57324, 57331, 57338, + 57347, 57357, 57363, 57370, 57375, 57385, 57395, 57400, 57405, 57410, + 57415, 57420, 57425, 57430, 57435, 57440, 57445, 57450, 57455, 57460, + 57465, 57470, 57475, 57480, 57485, 57490, 57495, 57500, 57505, 57510, + 57515, 57520, 57525, 57530, 57535, 57540, 57545, 57549, 57553, 57558, + 57563, 57568, 57573, 57578, 57583, 57588, 57593, 57598, 57603, 57608, + 57613, 57618, 57623, 57628, 57633, 57638, 57643, 57650, 57657, 57664, + 57671, 57678, 57685, 57692, 57699, 57706, 57713, 57720, 57727, 57734, + 57741, 57746, 57751, 57758, 57765, 57772, 57779, 57786, 57793, 57800, + 57807, 57814, 57821, 57828, 57835, 57841, 57847, 57853, 57859, 57866, + 57873, 57880, 57887, 57894, 57901, 57908, 57915, 57922, 57929, 57937, + 57945, 57953, 57961, 57969, 57977, 57985, 57993, 57997, 58003, 58009, + 58013, 58019, 58025, 58031, 58038, 58045, 58052, 58059, 58064, 58070, + 58076, 58083, 0, 0, 0, 0, 0, 58090, 58098, 58107, 58116, 58124, 58130, + 58135, 58140, 58145, 58150, 58155, 58160, 58165, 58170, 58175, 58180, + 58185, 58190, 58195, 58200, 58205, 58210, 58215, 58220, 58225, 58230, + 58235, 58240, 58245, 58250, 58255, 58260, 58265, 58270, 58275, 58280, + 58285, 58290, 58295, 58300, 58305, 58310, 58315, 58320, 58325, 0, 58330, + 0, 0, 0, 0, 0, 58335, 0, 0, 58340, 58344, 58349, 58354, 58359, 58364, + 58373, 58378, 58383, 58388, 58393, 58398, 58403, 58408, 58413, 58420, + 58425, 58430, 58439, 58446, 58451, 58456, 58461, 58468, 58473, 58480, + 58485, 58490, 58497, 58504, 58509, 58514, 58519, 58526, 58533, 58538, + 58543, 58548, 58553, 58558, 58565, 58572, 58577, 58582, 58587, 58592, + 58597, 58602, 58607, 58612, 58617, 58622, 58627, 58634, 58639, 58644, 0, + 0, 0, 0, 0, 0, 0, 58649, 58656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58661, 58666, 58670, 58674, 58678, 58682, 58686, 58690, 58694, 58698, + 58702, 58706, 58712, 58716, 58720, 58724, 58728, 58732, 58736, 58740, + 58744, 58748, 58752, 58756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58760, 58764, + 58768, 58772, 58776, 58780, 58784, 0, 58788, 58792, 58796, 58800, 58804, + 58808, 58812, 0, 58816, 58820, 58824, 58828, 58832, 58836, 58840, 0, + 58844, 58848, 58852, 58856, 58860, 58864, 58868, 0, 58872, 58876, 58880, + 58884, 58888, 58892, 58896, 0, 58900, 58904, 58908, 58912, 58916, 58920, + 58924, 0, 58928, 58932, 58936, 58940, 58944, 58948, 58952, 0, 58956, + 58960, 58964, 58968, 58972, 58976, 58980, 0, 58984, 58989, 58994, 58999, + 59004, 59009, 59014, 59018, 59023, 59028, 59033, 59037, 59042, 59047, + 59052, 59057, 59061, 59066, 59071, 59076, 59081, 59086, 59091, 59095, + 59100, 59105, 59112, 59117, 59122, 59128, 59135, 59142, 59151, 59158, + 59167, 59171, 59175, 59181, 59187, 59193, 59201, 59207, 59211, 59215, + 59219, 59225, 59231, 59235, 59237, 59241, 59247, 59249, 59253, 59256, + 59259, 59265, 59270, 59274, 59278, 59283, 59289, 59294, 59299, 59304, + 59309, 59316, 59323, 59328, 59333, 59338, 59343, 59348, 59353, 59357, + 59361, 59368, 59375, 59381, 59385, 59390, 59393, 59397, 59405, 59408, + 59412, 59416, 59419, 59425, 59431, 59434, 59440, 59444, 59448, 59454, + 59459, 59464, 59466, 59469, 59473, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 59479, 59483, 59487, 59492, 59497, 59502, 59506, 59510, 59514, 59519, + 59524, 59528, 59532, 59536, 59540, 59545, 59550, 59555, 59560, 59564, + 59568, 59573, 59578, 59583, 59588, 59592, 0, 59596, 59600, 59604, 59608, + 59612, 59616, 59620, 59625, 59630, 59634, 59639, 59644, 59653, 59657, + 59661, 59665, 59672, 59676, 59681, 59686, 59690, 59694, 59700, 59705, + 59710, 59715, 59720, 59724, 59728, 59732, 59736, 59740, 59745, 59750, + 59754, 59758, 59763, 59768, 59773, 59777, 59781, 59786, 59791, 59797, + 59803, 59807, 59813, 59819, 59823, 59829, 59835, 59840, 59845, 59849, + 59855, 59859, 59863, 59869, 59875, 59880, 59885, 59889, 59893, 59901, + 59907, 59913, 59919, 59924, 59929, 59934, 59940, 59944, 59950, 59954, + 59958, 59964, 59970, 59976, 59982, 59988, 59994, 60000, 60006, 60012, + 60018, 60024, 60030, 60034, 60040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 60046, 60049, 60053, 60057, 60061, 60065, 60068, 60071, 60075, 60079, + 60083, 60087, 60090, 60095, 60099, 60103, 60107, 60113, 60117, 60121, + 60125, 60129, 60136, 60142, 60146, 60150, 60154, 60158, 60162, 60166, + 60170, 60174, 60178, 60182, 60186, 60192, 60196, 60200, 60204, 60208, + 60212, 60216, 60220, 60224, 60228, 60232, 60236, 60240, 60244, 60248, + 60252, 60256, 60262, 60268, 60273, 60278, 60282, 60286, 60290, 60294, + 60298, 60302, 60306, 60310, 60314, 60318, 60322, 60326, 60330, 60334, + 60338, 60342, 60346, 60350, 60354, 60358, 60362, 60366, 60370, 60374, + 60380, 60384, 60388, 60392, 60396, 60400, 60404, 60408, 60412, 60417, + 60424, 60428, 60432, 60436, 60440, 60444, 60448, 60452, 60456, 60460, + 60464, 60468, 60472, 60479, 60483, 60489, 60493, 60497, 60501, 60505, + 60509, 60512, 60516, 60520, 60524, 60528, 60532, 60536, 60540, 60544, + 60548, 60552, 60556, 60560, 60564, 60568, 60572, 60576, 60580, 60584, + 60588, 60592, 60596, 60600, 60604, 60608, 60612, 60616, 60620, 60624, + 60628, 60632, 60636, 60640, 60646, 60650, 60654, 60658, 60662, 60666, + 60670, 60674, 60678, 60682, 60686, 60690, 60694, 60698, 60702, 60706, + 60710, 60714, 60718, 60722, 60726, 60730, 60734, 60738, 60742, 60746, + 60750, 60754, 60762, 60766, 60770, 60774, 60778, 60782, 60788, 60792, + 60796, 60800, 60804, 60808, 60812, 60816, 60820, 60824, 60828, 60832, + 60836, 60840, 60846, 60850, 60854, 60858, 60862, 60866, 60870, 60874, + 60878, 60882, 60886, 60890, 60894, 60898, 60902, 60906, 60910, 60914, + 60918, 60922, 60926, 60930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60934, 60943, 60951, 60963, 60974, + 60982, 60991, 61000, 61010, 61022, 61034, 61046, 0, 0, 0, 0, 61052, + 61055, 61058, 61063, 61066, 61073, 61077, 61081, 61085, 61089, 61093, + 61098, 61103, 61107, 61111, 61116, 61121, 61126, 61131, 61134, 61137, + 61143, 61149, 61154, 61159, 61166, 61173, 61177, 61181, 61185, 61193, + 61199, 61206, 61211, 61216, 61221, 61226, 61231, 61236, 61241, 61246, + 61251, 61256, 61261, 61266, 61271, 61276, 61282, 61287, 61291, 61297, + 61308, 61318, 61333, 61343, 61347, 61357, 61363, 61369, 61375, 61380, + 61383, 61388, 61392, 0, 61398, 61402, 61405, 61409, 61412, 61416, 61419, + 61423, 61426, 61430, 61433, 61436, 61440, 61444, 61448, 61452, 61456, + 61460, 61464, 61468, 61472, 61476, 61480, 61484, 61488, 61492, 61496, + 61500, 61504, 61508, 61512, 61516, 61520, 61524, 61528, 61533, 61537, + 61541, 61545, 61549, 61552, 61556, 61559, 61563, 61567, 61571, 61575, + 61578, 61582, 61585, 61589, 61593, 61597, 61601, 61605, 61609, 61613, + 61617, 61621, 61625, 61629, 61633, 61636, 61640, 61644, 61648, 61652, + 61656, 61659, 61664, 61668, 61673, 61677, 61681, 61685, 61689, 61693, + 61697, 61702, 61706, 61710, 61714, 61718, 61722, 61726, 61730, 0, 0, + 61735, 61743, 61751, 61758, 61765, 61769, 61775, 61780, 61785, 61789, + 61792, 61796, 61799, 61803, 61806, 61810, 61813, 61817, 61820, 61823, + 61827, 61831, 61835, 61839, 61843, 61847, 61851, 61855, 61859, 61863, + 61867, 61871, 61875, 61879, 61883, 61887, 61891, 61895, 61899, 61903, + 61907, 61911, 61915, 61920, 61924, 61928, 61932, 61936, 61939, 61943, + 61946, 61950, 61954, 61958, 61962, 61965, 61969, 61972, 61976, 61980, + 61984, 61988, 61992, 61996, 62000, 62004, 62008, 62012, 62016, 62020, + 62023, 62027, 62031, 62035, 62039, 62043, 62046, 62051, 62055, 62060, + 62064, 62068, 62072, 62076, 62080, 62084, 62089, 62093, 62097, 62101, + 62105, 62109, 62113, 62117, 62122, 62126, 62130, 62134, 62138, 62143, + 62150, 62154, 62160, 0, 0, 0, 0, 0, 62165, 62170, 62175, 62180, 62185, + 62190, 62195, 62200, 62204, 62209, 62214, 62219, 62224, 62229, 62234, + 62239, 62244, 62249, 62253, 62258, 62263, 62267, 62271, 62275, 62279, + 62284, 62289, 62294, 62299, 62304, 62309, 62314, 62319, 62324, 62329, + 62333, 62337, 62342, 62347, 62352, 62357, 0, 0, 0, 62362, 62366, 62370, + 62374, 62378, 62382, 62386, 62390, 62394, 62398, 62402, 62406, 62410, + 62414, 62418, 62422, 62426, 62430, 62434, 62438, 62442, 62446, 62450, + 62454, 62458, 62462, 62466, 62470, 62474, 62478, 62482, 62485, 62489, + 62492, 62496, 62500, 62503, 62507, 62511, 62514, 62518, 62522, 62526, + 62530, 62533, 62537, 62541, 62545, 62549, 62553, 62557, 62560, 62563, + 62567, 62571, 62575, 62579, 62583, 62587, 62591, 62595, 62599, 62603, + 62607, 62611, 62615, 62619, 62623, 62627, 62631, 62635, 62639, 62643, + 62647, 62651, 62655, 62659, 62663, 62667, 62671, 62675, 62679, 62683, + 62687, 62691, 62695, 62699, 62703, 62707, 62711, 62715, 62719, 62723, + 62727, 0, 62731, 62737, 62743, 62748, 62753, 62758, 62764, 62770, 62776, + 62782, 62788, 62794, 62800, 62806, 62812, 62818, 62824, 62829, 62834, + 62839, 62844, 62849, 62854, 62859, 62864, 62869, 62874, 62879, 62884, + 62889, 62894, 62899, 62904, 62909, 62914, 62919, 62924, 62930, 62936, + 62942, 62948, 62953, 62958, 0, 0, 0, 0, 0, 62963, 62968, 62973, 62978, + 62983, 62988, 62993, 62998, 63003, 63008, 63013, 63018, 63023, 63028, + 63033, 63038, 63043, 63048, 63052, 63057, 63062, 63067, 63072, 63077, + 63082, 63087, 63092, 63097, 63102, 63107, 63112, 63117, 63122, 63127, + 63132, 63137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63142, 63147, 63152, + 63157, 63161, 63166, 63170, 63175, 63180, 63185, 63190, 63195, 63200, + 63205, 63210, 63215, 63220, 63224, 63228, 63232, 63236, 63240, 63244, + 63248, 63252, 63256, 63260, 63264, 63268, 63272, 63276, 63281, 63286, + 63291, 63296, 63301, 63306, 63311, 63316, 63321, 63326, 63331, 63336, + 63341, 63346, 63351, 63357, 0, 63364, 63367, 63370, 63373, 63376, 63379, + 63382, 63385, 63388, 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, 63524, 63533, 63542, 63551, 63560, + 63569, 63578, 63587, 63590, 63595, 63600, 63605, 63610, 63615, 63620, + 63625, 63630, 63635, 63639, 63644, 63649, 63654, 63659, 63664, 63668, + 63672, 63676, 63680, 63684, 63688, 63692, 63696, 63700, 63704, 63708, + 63712, 63716, 63720, 63725, 63730, 63735, 63740, 63745, 63750, 63755, + 63760, 63765, 63770, 63775, 63780, 63785, 63790, 63796, 63802, 63807, + 63812, 63815, 63818, 63821, 63824, 63827, 63830, 63833, 63836, 63839, + 63843, 63847, 63851, 63855, 63859, 63863, 63867, 63871, 63875, 63879, + 63883, 63887, 63891, 63895, 63899, 63903, 63907, 63911, 63915, 63919, + 63923, 63927, 63931, 63935, 63939, 63943, 63947, 63951, 63955, 63959, + 63963, 63967, 63971, 63975, 63979, 63983, 63987, 63991, 63995, 63999, + 64004, 64009, 64014, 64019, 64023, 64028, 64033, 64038, 64043, 64048, + 64053, 64058, 64063, 64068, 64072, 64079, 64086, 64093, 64100, 64107, + 64114, 64121, 64128, 64135, 64142, 64149, 64156, 64159, 64162, 64165, + 64170, 64173, 64176, 64179, 64182, 64185, 64188, 64192, 64196, 64200, + 64204, 64208, 64212, 64216, 64220, 64224, 64228, 64232, 64236, 64240, + 64243, 64246, 64250, 64254, 64258, 64262, 64265, 64269, 64273, 64277, + 64281, 64284, 64288, 64292, 64296, 64300, 64303, 64307, 64311, 64315, + 64319, 64323, 64327, 64331, 64335, 64339, 64343, 0, 64347, 64350, 64353, + 64356, 64359, 64362, 64365, 64368, 64371, 64374, 64377, 64380, 64383, + 64386, 64389, 64392, 64395, 64398, 64401, 64404, 64407, 64410, 64413, + 64416, 64419, 64422, 64425, 64428, 64431, 64434, 64437, 64440, 64443, + 64446, 64449, 64452, 64455, 64458, 64461, 64464, 64467, 64470, 64473, + 64476, 64479, 64482, 64485, 64488, 64491, 64494, 64497, 64500, 64503, + 64506, 64509, 64512, 64515, 64518, 64521, 64524, 64527, 64530, 64533, + 64536, 64539, 64542, 64545, 64548, 64551, 64554, 64557, 64560, 64563, + 64566, 64569, 64572, 64575, 64578, 64581, 64584, 64587, 64590, 64593, + 64596, 64599, 64602, 64605, 64608, 64611, 64620, 64628, 64636, 64644, + 64652, 64660, 64668, 64676, 64684, 64692, 64701, 64710, 64719, 64728, + 64737, 64746, 64755, 64764, 64773, 64782, 64791, 64800, 64809, 64818, + 64827, 64830, 64833, 64836, 64838, 64841, 64844, 64847, 64852, 64857, + 64860, 64867, 64874, 64881, 64888, 64891, 64896, 64898, 64902, 64904, + 64906, 64909, 64912, 64915, 64918, 64921, 64924, 64927, 64932, 64937, + 64940, 64943, 64946, 64949, 64952, 64955, 64958, 64962, 64965, 64968, + 64971, 64974, 64977, 64982, 64985, 64988, 64991, 64996, 65001, 65006, + 65011, 65016, 65021, 65026, 65031, 65036, 65044, 65046, 65049, 65052, + 65055, 65058, 65063, 65071, 65074, 65077, 65081, 65084, 65087, 65090, + 65095, 65098, 65101, 65106, 65109, 65112, 65117, 65120, 65123, 65128, + 65133, 65138, 65141, 65144, 65147, 65150, 65156, 65159, 65162, 65165, + 65167, 65170, 65173, 65176, 65181, 65184, 65187, 65190, 65193, 65196, + 65201, 65204, 65207, 65210, 65213, 65216, 65219, 65222, 65225, 65228, + 65234, 65239, 65247, 65255, 65263, 65271, 65279, 65287, 65295, 65303, + 65311, 65320, 65329, 65338, 65347, 65356, 65365, 65374, 65383, 65392, + 65401, 65410, 65419, 65428, 65437, 65446, 65455, 65464, 65473, 65482, + 65491, 65500, 65509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12070, 0, 12079, 12086, 12094, 12106, 12113, 12120, 12127, 12138, 12149, - 12156, 12164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12170, 12175, 12180, 12185, 12190, - 12195, 12200, 12205, 12210, 12215, 12220, 12225, 12230, 12234, 12238, - 12242, 12247, 12253, 12259, 12265, 12270, 12275, 12280, 12285, 12291, - 12300, 12308, 0, 12314, 12320, 12324, 12328, 12332, 12337, 12340, 12344, - 12347, 12351, 12354, 12358, 12362, 12366, 12371, 12376, 12379, 12383, - 12388, 12393, 12396, 12400, 12403, 12407, 12411, 12415, 12419, 12423, - 12427, 12431, 12435, 12439, 12443, 12447, 12451, 12455, 12459, 12463, - 12467, 12471, 12475, 12478, 12482, 12485, 12489, 12493, 12497, 12500, - 12503, 12506, 12510, 12514, 12518, 12522, 12526, 12530, 12534, 12537, - 12540, 12545, 12550, 12554, 12558, 12563, 12567, 12572, 12576, 12581, - 12586, 12592, 12598, 12604, 12608, 12613, 12619, 12625, 12629, 12634, - 12638, 12644, 12649, 12652, 12658, 12664, 12669, 12674, 12681, 12686, - 12691, 12695, 12699, 12703, 12707, 12711, 12715, 12719, 12723, 12728, - 12733, 12738, 12744, 12747, 12751, 12755, 12758, 12761, 12764, 12767, - 12770, 12773, 12776, 12779, 12782, 12786, 12793, 12798, 12802, 12806, - 12810, 12814, 0, 12818, 12822, 12826, 12830, 12834, 12840, 12844, 0, - 12848, 12852, 12856, 0, 12860, 12863, 12867, 12870, 12874, 12877, 12881, - 12885, 0, 0, 12889, 12892, 0, 0, 12896, 12899, 12903, 12906, 12910, - 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12942, 12946, 12950, - 12954, 12958, 12962, 12966, 12970, 12974, 12978, 0, 12981, 12984, 12988, - 12992, 12996, 12999, 13002, 0, 13005, 0, 0, 0, 13009, 13013, 13017, - 13020, 0, 0, 13023, 13027, 13031, 13036, 13040, 13045, 13049, 13054, - 13059, 0, 0, 13065, 13069, 0, 0, 13074, 13078, 13083, 13087, 0, 0, 0, 0, - 0, 0, 0, 0, 13093, 0, 0, 0, 0, 13099, 13103, 0, 13107, 13111, 13116, - 13121, 13126, 0, 0, 13132, 13136, 13139, 13142, 13145, 13148, 13151, - 13154, 13157, 13160, 13163, 13172, 13181, 13185, 13189, 13195, 13201, - 13207, 13213, 13227, 13234, 13237, 0, 0, 0, 0, 0, 13241, 13247, 13251, 0, - 13255, 13258, 13262, 13265, 13269, 13272, 0, 0, 0, 0, 13276, 13280, 0, 0, - 13284, 13288, 13292, 13295, 13299, 13303, 13307, 13311, 13315, 13319, - 13323, 13327, 13331, 13335, 13339, 13343, 13347, 13351, 13355, 13359, - 13363, 13367, 0, 13370, 13373, 13377, 13381, 13385, 13388, 13391, 0, - 13394, 13398, 0, 13402, 13406, 0, 13410, 13413, 0, 0, 13416, 0, 13420, - 13425, 13429, 13434, 13438, 0, 0, 0, 0, 13443, 13448, 0, 0, 13453, 13458, - 13463, 0, 0, 0, 13467, 0, 0, 0, 0, 0, 0, 0, 13471, 13475, 13479, 13483, - 0, 13487, 0, 0, 0, 0, 0, 0, 0, 13491, 13495, 13498, 13501, 13504, 13507, - 13510, 13513, 13516, 13519, 13522, 13525, 13528, 13531, 13534, 13539, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13543, 13547, 13551, 0, 13555, 13558, - 13562, 13565, 13569, 13572, 13576, 13580, 13584, 0, 13589, 13592, 13596, - 0, 13601, 13604, 13608, 13611, 13615, 13619, 13623, 13627, 13631, 13635, - 13639, 13643, 13647, 13651, 13655, 13659, 13663, 13667, 13671, 13675, - 13679, 13683, 0, 13686, 13689, 13693, 13697, 13701, 13704, 13707, 0, - 13710, 13714, 0, 13718, 13722, 13726, 13730, 13733, 0, 0, 13736, 13740, - 13744, 13749, 13753, 13758, 13762, 13767, 13772, 13778, 0, 13784, 13788, - 13793, 0, 13799, 13803, 13808, 0, 0, 13812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 13815, 13820, 13825, 13830, 0, 0, 13836, 13840, 13843, - 13846, 13849, 13852, 13855, 13858, 13861, 13864, 13867, 13871, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13875, 13879, 13883, 0, 13887, 13890, - 13894, 13897, 13901, 13904, 13908, 13912, 0, 0, 13916, 13919, 0, 0, - 13923, 13926, 13930, 13933, 13937, 13941, 13945, 13949, 13953, 13957, - 13961, 13965, 13969, 13973, 13977, 13981, 13985, 13989, 13993, 13997, - 14001, 14005, 0, 14008, 14011, 14015, 14019, 14023, 14026, 14029, 0, - 14032, 14036, 0, 14040, 14044, 14048, 14052, 14055, 0, 0, 14058, 14062, - 14066, 14071, 14075, 14080, 14084, 14089, 14094, 0, 0, 14100, 14104, 0, - 0, 14109, 14113, 14118, 0, 0, 0, 0, 0, 0, 0, 0, 14122, 14128, 0, 0, 0, 0, - 14134, 14138, 0, 14142, 14146, 14151, 14156, 14161, 0, 0, 14167, 14171, - 14174, 14177, 14180, 14183, 14186, 14189, 14192, 14195, 14198, 14201, - 14205, 14211, 14217, 14223, 14229, 14235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 14241, 14245, 0, 14249, 14252, 14256, 14259, 14263, 14266, 0, 0, 0, - 14270, 14273, 14277, 0, 14281, 14284, 14288, 14292, 0, 0, 0, 14295, - 14299, 0, 14303, 0, 14307, 14311, 0, 0, 0, 14315, 14319, 0, 0, 0, 14323, - 14326, 14330, 0, 0, 0, 14333, 14336, 14339, 14342, 14346, 14350, 14354, - 14358, 14362, 14366, 14370, 14373, 0, 0, 0, 0, 14376, 14381, 14385, - 14390, 14394, 0, 0, 0, 14399, 14403, 14408, 0, 14413, 14417, 14422, - 14427, 0, 0, 14431, 0, 0, 0, 0, 0, 0, 14434, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 14440, 14444, 14447, 14450, 14453, 14456, 14459, 14462, - 14465, 14468, 14471, 14475, 14480, 14485, 14489, 14493, 14497, 14501, - 14505, 14510, 14514, 0, 0, 0, 0, 0, 0, 14517, 14521, 14525, 0, 14529, - 14532, 14536, 14539, 14543, 14546, 14550, 14554, 0, 14558, 14561, 14565, - 0, 14569, 14572, 14576, 14580, 14583, 14587, 14591, 14595, 14599, 14603, - 14607, 14611, 14615, 14619, 14623, 14627, 14631, 14635, 14639, 14643, - 14647, 14651, 14655, 0, 14658, 14661, 14665, 14669, 14673, 14676, 14679, - 14682, 14686, 14690, 0, 14694, 14698, 14702, 14706, 14709, 0, 0, 0, - 14712, 14716, 14721, 14725, 14730, 14734, 14739, 14744, 0, 14750, 14754, - 14759, 0, 14764, 14768, 14773, 14778, 0, 0, 0, 0, 0, 0, 0, 14782, 14786, - 0, 14792, 14796, 0, 0, 0, 0, 0, 0, 14800, 14805, 14810, 14815, 0, 0, - 14821, 14825, 14828, 14831, 14834, 14837, 14840, 14843, 14846, 14849, 0, - 0, 0, 0, 0, 0, 0, 0, 14852, 14865, 14877, 14889, 14901, 14913, 14925, - 14937, 0, 0, 14941, 14945, 0, 14949, 14952, 14956, 14959, 14963, 14966, - 14970, 14974, 0, 14978, 14981, 14985, 0, 14989, 14992, 14996, 15000, - 15003, 15007, 15011, 15015, 15019, 15023, 15027, 15031, 15035, 15039, - 15043, 15047, 15051, 15055, 15059, 15063, 15067, 15071, 15075, 0, 15078, - 15081, 15085, 15089, 15093, 15096, 15099, 15102, 15106, 15110, 0, 15114, - 15118, 15122, 15126, 15129, 0, 0, 15132, 15136, 15140, 15145, 15149, - 15154, 15158, 15163, 15168, 0, 15174, 15178, 15183, 0, 15188, 15192, - 15197, 15202, 0, 0, 0, 0, 0, 0, 0, 15206, 15210, 0, 0, 0, 0, 0, 0, 0, - 15216, 0, 15220, 15225, 15230, 15235, 0, 0, 15241, 15245, 15248, 15251, - 15254, 15257, 15260, 15263, 15266, 15269, 0, 15272, 15276, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15280, 15284, 0, 15288, 15291, 15295, - 15298, 15302, 15305, 15309, 15313, 0, 15317, 15320, 15324, 0, 15328, - 15331, 15335, 15339, 15342, 15346, 15350, 15354, 15358, 15362, 15366, - 15370, 15374, 15378, 15382, 15386, 15390, 15394, 15398, 15402, 15406, - 15410, 15414, 15417, 15421, 15424, 15428, 15432, 15436, 15439, 15442, - 15445, 15449, 15453, 15457, 15461, 15465, 15469, 15473, 15476, 15479, 0, - 0, 15483, 15487, 15492, 15496, 15501, 15505, 15510, 15515, 0, 15521, - 15525, 15530, 0, 15535, 15539, 15544, 15549, 15553, 0, 0, 0, 0, 0, 0, 0, - 0, 15558, 0, 0, 0, 0, 0, 0, 0, 0, 15564, 15569, 15574, 15579, 0, 0, - 15585, 15589, 15592, 15595, 15598, 15601, 15604, 15607, 15610, 15613, - 15616, 15620, 15625, 15630, 15636, 15642, 0, 0, 0, 15648, 15652, 15658, - 15664, 15670, 15675, 15681, 0, 0, 15687, 15691, 0, 15695, 15699, 15703, - 15707, 15711, 15715, 15719, 15723, 15727, 15731, 15735, 15739, 15743, - 15747, 15751, 15755, 15759, 15763, 0, 0, 0, 15767, 15773, 15779, 15785, - 15791, 15797, 15803, 15809, 15815, 15821, 15827, 15833, 15841, 15847, - 15853, 15859, 15865, 15871, 15877, 15883, 15889, 15895, 15901, 15907, 0, - 15913, 15919, 15925, 15931, 15937, 15943, 15947, 15953, 15957, 0, 15961, - 0, 0, 15967, 15971, 15977, 15983, 15989, 15993, 15999, 0, 0, 0, 16003, 0, - 0, 0, 0, 16007, 16012, 16019, 16026, 16033, 16040, 0, 16047, 0, 16054, - 16059, 16064, 16071, 16078, 16087, 16098, 16107, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16112, 16119, 16126, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16131, 16137, 16143, 16149, 16155, 16161, 16167, 16173, - 16179, 16185, 16191, 16197, 16203, 16209, 16215, 16221, 16227, 16233, - 16239, 16245, 16251, 16257, 16263, 16269, 16275, 16281, 16287, 16293, - 16299, 16305, 16311, 16317, 16323, 16328, 16334, 16340, 16344, 16350, - 16354, 16360, 16366, 16372, 16378, 16384, 16390, 16395, 16401, 16405, - 16410, 16416, 16422, 16428, 16433, 16439, 16445, 16451, 16456, 16462, 0, - 0, 0, 0, 16466, 16472, 16477, 16483, 16488, 16496, 16504, 16508, 16512, - 16516, 16522, 16528, 16534, 16540, 16544, 16548, 16552, 16556, 16560, - 16563, 16566, 16569, 16572, 16575, 16578, 16581, 16584, 16587, 16591, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16595, 16600, 0, 16607, 0, 0, 16614, - 16619, 0, 16624, 0, 0, 16631, 0, 0, 0, 0, 0, 0, 16636, 16641, 16645, - 16652, 0, 16659, 16664, 16669, 16674, 16681, 16688, 16695, 0, 16702, - 16707, 16712, 0, 16719, 0, 16726, 0, 0, 16731, 16738, 0, 16745, 16749, - 16756, 16760, 16765, 16773, 16779, 16785, 16790, 16796, 16802, 16808, - 16813, 0, 16819, 16827, 16834, 0, 0, 16841, 16846, 16852, 16857, 16863, - 0, 16869, 0, 16875, 16882, 16889, 16896, 16903, 16908, 0, 0, 16912, - 16917, 16921, 16925, 16929, 16933, 16937, 16941, 16945, 16949, 0, 0, - 16953, 16959, 16965, 16972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16979, 16983, 16994, - 17009, 17024, 17034, 17045, 17058, 17069, 17075, 17083, 17093, 17099, - 17107, 17111, 17117, 17123, 17131, 17141, 17149, 17162, 17168, 17176, - 17184, 17196, 17203, 17211, 17219, 17227, 17235, 17243, 17251, 17261, - 17265, 17268, 17271, 17274, 17277, 17280, 17283, 17286, 17289, 17292, - 17296, 17300, 17304, 17308, 17312, 17316, 17320, 17324, 17328, 17333, - 17339, 17349, 17363, 17373, 17379, 17385, 17393, 17401, 17409, 17417, - 17423, 17429, 17432, 17436, 17440, 17444, 17448, 17452, 17456, 0, 17460, - 17464, 17468, 17472, 17476, 17480, 17484, 17488, 17492, 17496, 17500, - 17503, 17506, 17510, 17514, 17518, 17521, 17525, 17529, 17533, 17537, - 17541, 17545, 17549, 17553, 17556, 17559, 17563, 17567, 17571, 17574, - 17577, 17580, 17584, 17589, 17593, 0, 0, 0, 0, 17597, 17602, 17606, - 17611, 17615, 17620, 17625, 17631, 17636, 17642, 17646, 17651, 17655, - 17660, 17670, 17676, 17682, 17689, 17699, 17705, 17709, 17713, 17719, - 17725, 17733, 17739, 17747, 17755, 17763, 17773, 17781, 17791, 17796, - 17802, 17808, 17814, 17820, 17826, 17832, 0, 17838, 17844, 17850, 17856, - 17862, 17868, 17874, 17880, 17886, 17892, 17898, 17903, 17908, 17914, - 17920, 17926, 17931, 17937, 17943, 17949, 17955, 17961, 17967, 17973, - 17979, 17984, 17989, 17995, 18001, 18007, 18012, 18017, 18022, 18028, - 18036, 18043, 0, 18050, 18057, 18070, 18077, 18084, 18092, 18100, 18106, - 18112, 18118, 18128, 18133, 18139, 18149, 18159, 0, 18169, 18179, 18187, - 18199, 18211, 18217, 18231, 18246, 18251, 18256, 18264, 18272, 18280, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18288, 18291, 18295, 18299, 18303, - 18307, 18311, 18315, 18319, 18323, 18327, 18331, 18335, 18339, 18343, - 18347, 18351, 18355, 18359, 18363, 18367, 18370, 18373, 18377, 18381, - 18385, 18388, 18391, 18394, 18398, 18402, 18405, 18408, 18412, 18415, - 18420, 18423, 18427, 18430, 18434, 18437, 18442, 18445, 18449, 18456, - 18461, 18465, 18470, 18474, 18479, 18483, 18488, 18495, 18501, 18506, - 18510, 18514, 18518, 18522, 18526, 18531, 18536, 18542, 18547, 18552, - 18556, 18559, 18562, 18565, 18568, 18571, 18574, 18577, 18580, 18583, - 18589, 18593, 18597, 18601, 18605, 18609, 18613, 18617, 18621, 18626, - 18630, 18635, 18640, 18646, 18651, 18657, 18663, 18669, 18675, 18681, - 18688, 18695, 18703, 18711, 18720, 18729, 18740, 18750, 18760, 18771, - 18782, 18792, 18802, 18812, 18822, 18832, 18842, 18852, 18862, 18870, - 18877, 18883, 18890, 18895, 18901, 18907, 18913, 18919, 18925, 18931, - 18936, 18942, 18948, 18954, 18960, 18965, 18973, 18980, 18986, 18993, - 19001, 19007, 19013, 19019, 19025, 19033, 19041, 19051, 19059, 19067, - 19073, 19078, 19083, 19088, 19093, 19098, 19103, 19108, 19113, 19118, - 19124, 19130, 19136, 19143, 19148, 19154, 19159, 19164, 19169, 19174, - 19179, 19184, 19189, 19194, 19199, 19204, 19209, 19214, 19219, 19224, - 19229, 19234, 19239, 19244, 19249, 19254, 19259, 19264, 19269, 19274, - 19279, 19284, 19289, 19294, 19299, 19304, 19309, 19314, 19319, 19324, - 19329, 19334, 19339, 0, 19344, 0, 0, 0, 0, 0, 19349, 0, 0, 19354, 19358, - 19362, 19366, 19370, 19374, 19378, 19382, 19386, 19390, 19394, 19398, - 19402, 19406, 19410, 19414, 19418, 19422, 19426, 19430, 19434, 19438, - 19442, 19446, 19450, 19454, 19458, 19462, 19466, 19470, 19474, 19478, - 19482, 19486, 19490, 19494, 19498, 19502, 19506, 19510, 19514, 19518, - 19524, 19528, 19533, 19538, 19542, 19547, 19552, 19556, 19560, 19564, - 19568, 19572, 19576, 19580, 19584, 19588, 19592, 19596, 19600, 19604, - 19608, 19612, 19616, 19620, 19624, 19628, 19632, 19636, 19640, 19644, - 19648, 19652, 19656, 19660, 19664, 19668, 19672, 19676, 19680, 19684, - 19688, 19692, 19696, 19700, 19704, 19708, 19712, 19716, 19720, 19724, - 19728, 19732, 19736, 19740, 19744, 19748, 19752, 19756, 19760, 19764, - 19768, 19772, 19776, 19780, 19784, 19788, 19792, 19796, 19800, 19804, - 19808, 19812, 19816, 19820, 19824, 19828, 19832, 19836, 19840, 19844, - 19848, 19852, 19856, 19860, 19864, 19868, 19872, 19876, 19880, 19884, - 19888, 19892, 19896, 19900, 19904, 19908, 19912, 19916, 19920, 19924, - 19928, 19932, 19936, 19940, 19943, 19947, 19950, 19954, 19958, 19961, - 19965, 19969, 19972, 19976, 19980, 19984, 19988, 19991, 19995, 19999, - 20003, 20007, 20011, 20015, 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, 20186, 20190, 20194, 20198, - 20202, 20206, 20210, 20214, 20218, 20222, 20226, 20230, 20234, 20238, - 20242, 20246, 20250, 20254, 20258, 20262, 20266, 20270, 20274, 20278, - 20282, 20286, 20290, 20294, 20298, 20302, 20306, 20310, 20314, 20318, - 20322, 20326, 20330, 20334, 20338, 20342, 20346, 20350, 20354, 20358, - 20362, 20366, 20370, 20374, 20378, 20382, 20386, 20390, 20394, 20398, - 20402, 20406, 20410, 20414, 20418, 20422, 20426, 20430, 20434, 20438, - 20442, 20446, 20450, 20454, 20458, 20462, 20466, 20470, 20474, 20478, - 20482, 20486, 20490, 20494, 20498, 20502, 20506, 20510, 20514, 20518, - 20522, 20526, 20530, 20534, 20538, 20542, 20546, 20550, 20554, 20558, - 20562, 20566, 20570, 20573, 20577, 20581, 20585, 20589, 20593, 20597, - 20601, 20605, 20609, 20613, 20617, 20621, 20625, 20629, 20633, 20637, - 20641, 20645, 20649, 20653, 20657, 20661, 20665, 20668, 20672, 20676, - 20680, 20684, 20688, 20692, 20696, 20700, 20704, 20708, 20712, 20716, - 20720, 20724, 20728, 20731, 20735, 20739, 20743, 20747, 20751, 20755, - 20759, 20762, 20766, 20770, 20774, 20778, 20782, 20786, 20790, 20794, - 20798, 20802, 20806, 20810, 20814, 20818, 20822, 20826, 20830, 20834, - 20838, 20842, 20846, 20850, 20854, 0, 20858, 20862, 20866, 20870, 0, 0, - 20874, 20878, 20882, 20886, 20890, 20894, 20898, 0, 20902, 0, 20906, - 20910, 20914, 20918, 0, 0, 20922, 20926, 20930, 20934, 20938, 20942, - 20946, 20950, 20954, 20958, 20962, 20966, 20970, 20974, 20978, 20982, - 20986, 20990, 20994, 20998, 21002, 21006, 21010, 21013, 21017, 21021, - 21025, 21029, 21033, 21037, 21041, 21045, 21049, 21053, 21057, 21061, - 21065, 21069, 21073, 21077, 21081, 0, 21085, 21089, 21093, 21097, 0, 0, - 21101, 21104, 21108, 21112, 21116, 21120, 21124, 21128, 21132, 21136, - 21140, 21144, 21148, 21152, 21156, 21160, 21164, 21169, 21174, 21179, - 21185, 21191, 21196, 21201, 21207, 21210, 21214, 21218, 21222, 21226, - 21230, 21234, 21238, 0, 21242, 21246, 21250, 21254, 0, 0, 21258, 21262, - 21266, 21270, 21274, 21278, 21282, 0, 21286, 0, 21290, 21294, 21298, - 21302, 0, 0, 21306, 21310, 21314, 21318, 21322, 21326, 21330, 21334, - 21338, 21343, 21348, 21353, 21359, 21365, 21370, 0, 21375, 21379, 21383, - 21387, 21391, 21395, 21399, 21403, 21407, 21411, 21415, 21419, 21423, - 21427, 21431, 21435, 21439, 21442, 21446, 21450, 21454, 21458, 21462, - 21466, 21470, 21474, 21478, 21482, 21486, 21490, 21494, 21498, 21502, - 21506, 21510, 21514, 21518, 21522, 21526, 21530, 21534, 21538, 21542, - 21546, 21550, 21554, 21558, 21562, 21566, 21570, 21574, 21578, 21582, - 21586, 21590, 21594, 21598, 0, 21602, 21606, 21610, 21614, 0, 0, 21618, - 21622, 21626, 21630, 21634, 21638, 21642, 21646, 21650, 21654, 21658, - 21662, 21666, 21670, 21674, 21678, 21682, 21686, 21690, 21694, 21698, - 21702, 21706, 21710, 21714, 21718, 21722, 21726, 21730, 21734, 21738, - 21742, 21746, 21750, 21754, 21758, 21762, 21766, 21770, 21774, 21778, - 21782, 21786, 21790, 21794, 21798, 21802, 21806, 21810, 21814, 21818, - 21822, 21826, 21830, 21834, 21838, 21842, 21845, 21849, 21853, 21857, - 21861, 21865, 21869, 21873, 21877, 21881, 0, 0, 21885, 21894, 21900, - 21905, 21909, 21912, 21917, 21920, 21923, 21926, 21931, 21935, 21940, - 21943, 21946, 21949, 21952, 21955, 21958, 21961, 21964, 21967, 21971, - 21975, 21979, 21983, 21987, 21991, 21995, 21999, 22003, 22007, 0, 0, 0, - 22013, 22019, 22023, 22027, 22031, 22037, 22041, 22045, 22049, 22055, - 22059, 22063, 22067, 22073, 22077, 22081, 22085, 22091, 22097, 22103, - 22111, 22117, 22123, 22129, 22135, 22141, 0, 0, 0, 0, 0, 0, 22147, 22150, - 22153, 22156, 22159, 22162, 22166, 22170, 22173, 22177, 22181, 22185, - 22189, 22193, 22196, 22200, 22204, 22208, 22212, 22216, 22220, 22224, - 22228, 22232, 22236, 22240, 22243, 22247, 22251, 22255, 22259, 22262, - 22266, 22270, 22274, 22278, 22282, 22286, 22290, 22294, 22298, 22302, - 22306, 22310, 22314, 22317, 22321, 22325, 22329, 22333, 22337, 22341, - 22345, 22349, 22353, 22357, 22361, 22365, 22369, 22373, 22377, 22381, - 22385, 22389, 22393, 22397, 22401, 22405, 22409, 22413, 22417, 22421, - 22425, 22429, 22433, 22437, 22441, 22445, 22449, 22453, 22456, 22460, - 22464, 22468, 22472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22476, 22480, - 22483, 22487, 22490, 22494, 22497, 22501, 22507, 22512, 22516, 22519, - 22523, 22527, 22532, 22536, 22541, 22545, 22550, 22554, 22559, 22563, - 22568, 22574, 22578, 22583, 22587, 22592, 22598, 22602, 22608, 22614, - 22618, 22623, 22631, 22639, 22646, 22651, 22656, 22665, 22672, 22679, - 22684, 22690, 22694, 22698, 22702, 22706, 22710, 22714, 22718, 22722, - 22726, 22730, 22736, 22741, 22746, 22749, 22753, 22757, 22762, 22766, - 22771, 22775, 22780, 22784, 22789, 22793, 22798, 22802, 22807, 22811, - 22816, 22822, 22826, 22831, 22836, 22840, 22844, 22848, 22852, 22855, - 22859, 22865, 22870, 22875, 22879, 22883, 22887, 22892, 22896, 22901, - 22905, 22910, 22913, 22917, 22921, 22926, 22930, 22935, 22939, 22944, - 22950, 22954, 22958, 22962, 22966, 22970, 22974, 22978, 22982, 22986, - 22990, 22994, 23000, 23003, 23007, 23011, 23016, 23020, 23025, 23029, - 23034, 23038, 23043, 23047, 23052, 23056, 23061, 23065, 23070, 23076, - 23080, 23084, 23090, 23096, 23102, 23108, 23112, 23116, 23120, 23124, - 23128, 23132, 23138, 23142, 23146, 23150, 23155, 23159, 23164, 23168, - 23173, 23177, 23182, 23186, 23191, 23195, 23200, 23204, 23209, 23215, - 23219, 23225, 23229, 23233, 23237, 23241, 23245, 23249, 23255, 23258, - 23262, 23266, 23271, 23275, 23280, 23284, 23289, 23293, 23298, 23302, - 23307, 23311, 23316, 23320, 23325, 23331, 23334, 23338, 23342, 23347, - 23352, 23356, 23360, 23364, 23368, 23372, 23376, 23382, 23385, 23389, - 23393, 23398, 23402, 23407, 23411, 23416, 23422, 23426, 23431, 23435, - 23439, 23443, 23447, 23451, 23455, 23459, 23465, 23469, 23473, 23477, - 23482, 23486, 23491, 23495, 23500, 23504, 23509, 23513, 23518, 23522, - 23527, 23531, 23536, 23539, 23543, 23547, 23551, 23555, 23559, 23563, - 23567, 23571, 23577, 23580, 23584, 23588, 23593, 23597, 23602, 23606, - 23611, 23615, 23620, 23624, 23629, 23633, 23638, 23642, 23647, 23653, - 23657, 23663, 23667, 23673, 23679, 23685, 23691, 23697, 23703, 23709, - 23715, 23719, 23723, 23727, 23731, 23735, 23739, 23743, 23747, 23752, - 23756, 23761, 23765, 23770, 23774, 23779, 23783, 23788, 23792, 23797, - 23801, 23806, 23810, 23814, 23818, 23822, 23826, 23830, 23834, 23840, - 23843, 23847, 23851, 23856, 23860, 23865, 23869, 23874, 23878, 23883, - 23887, 23892, 23896, 23901, 23905, 23910, 23916, 23920, 23926, 23931, - 23937, 23941, 23947, 23952, 23956, 23960, 23964, 23968, 23972, 23977, - 23980, 23984, 23989, 23993, 23998, 24001, 24005, 24009, 24013, 24017, - 24021, 24025, 24029, 24033, 24037, 24041, 24045, 24050, 24054, 24058, - 24064, 24068, 24074, 24078, 24084, 24088, 24092, 24096, 24100, 24104, - 24109, 24113, 24117, 24121, 24125, 24129, 24133, 24137, 24141, 24145, - 24149, 24155, 24161, 24167, 24173, 24179, 24184, 24190, 24196, 24202, - 24206, 24210, 24214, 24218, 24222, 24226, 24230, 24234, 24238, 24242, - 24246, 24250, 24254, 24259, 24264, 24269, 24273, 24277, 24281, 24285, - 24289, 24293, 24297, 24301, 24305, 24309, 24315, 24321, 24327, 24333, - 24339, 24345, 24351, 24357, 24363, 24367, 24371, 24375, 24379, 24383, - 24387, 24391, 24397, 24403, 24409, 24415, 24421, 24427, 24433, 24439, - 24445, 24450, 24455, 24460, 24465, 24471, 24477, 24483, 24489, 24495, - 24501, 24507, 24512, 24518, 24524, 24530, 24535, 24541, 24547, 24553, - 24558, 24563, 24568, 24573, 24578, 24583, 24588, 24593, 24598, 24603, - 24608, 24613, 24617, 24622, 24627, 24632, 24637, 24642, 24647, 24652, - 24657, 24662, 24667, 24672, 24677, 24682, 24687, 24692, 24697, 24702, - 24707, 24712, 24717, 24722, 24727, 24732, 24737, 24742, 24747, 24752, - 24757, 24762, 24766, 24771, 24776, 24781, 24786, 24791, 24796, 24801, - 24806, 24811, 24816, 24821, 24826, 24831, 24836, 24841, 24846, 24851, - 24856, 24861, 24866, 24871, 24876, 24881, 24886, 24891, 24895, 24900, - 24905, 24910, 24915, 24920, 24924, 24929, 24934, 24939, 24944, 24949, - 24953, 24958, 24964, 24969, 24974, 24979, 24984, 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, 25150, - 25155, 25160, 25165, 25170, 25175, 25180, 25185, 25190, 25195, 25200, - 25205, 25210, 25216, 25221, 25226, 25231, 25236, 25241, 25246, 25251, - 25256, 25261, 25266, 25271, 25275, 25280, 25285, 25290, 25295, 25300, - 25305, 25310, 25315, 25320, 25325, 25330, 25335, 25340, 25345, 25350, - 25355, 25360, 25365, 25370, 25375, 25380, 25385, 25390, 25395, 25400, - 25405, 25411, 25415, 25419, 25423, 25427, 25431, 25435, 25439, 25443, - 25449, 25455, 25461, 25467, 25473, 25479, 25485, 25492, 25498, 25503, - 25508, 25513, 25518, 25523, 25528, 25533, 25538, 25543, 25548, 25553, - 25558, 25563, 25568, 25573, 25578, 25583, 25588, 25593, 25598, 25603, - 25608, 25613, 25618, 25623, 25628, 25633, 25638, 0, 0, 0, 25645, 25655, - 25659, 25666, 25670, 25674, 25678, 25686, 25690, 25695, 25700, 25705, - 25709, 25714, 25719, 25722, 25726, 25730, 25739, 25743, 25747, 25753, - 25757, 25761, 25769, 25773, 25781, 25787, 25793, 25799, 25805, 25815, - 25821, 25825, 25834, 25837, 25843, 25847, 25853, 25858, 25864, 25872, - 25878, 25884, 25892, 25898, 25902, 25906, 25916, 25922, 25926, 25936, - 25942, 25946, 25950, 25957, 25964, 25969, 25974, 25983, 25987, 25991, - 25995, 26003, 26010, 26014, 26018, 26022, 26026, 26030, 26034, 26038, - 26042, 26046, 26050, 26054, 26059, 26064, 26069, 26073, 26077, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26081, 26085, 26089, 26093, 26097, - 26102, 26107, 26112, 26117, 26121, 26125, 26130, 26134, 0, 26138, 26143, - 26148, 26152, 26156, 26161, 26166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 26171, 26175, 26179, 26183, 26187, 26192, 26197, 26202, 26207, 26211, - 26215, 26220, 26224, 26228, 26232, 26237, 26242, 26246, 26250, 26255, - 26260, 26265, 26271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26276, 26280, 26284, - 26288, 26292, 26297, 26302, 26307, 26312, 26316, 26320, 26325, 26329, - 26333, 26337, 26342, 26347, 26351, 26355, 26360, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26365, 26369, 26373, 26377, 26381, 26386, 26391, 26396, - 26401, 26405, 26409, 26414, 26418, 0, 26422, 26427, 26432, 0, 26436, - 26441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26446, 26449, 26453, 26457, - 26461, 26465, 26469, 26473, 26477, 26481, 26485, 26489, 26493, 26497, - 26501, 26505, 26509, 26513, 26516, 26520, 26524, 26528, 26532, 26536, - 26540, 26544, 26548, 26552, 26556, 26560, 26564, 26568, 26571, 26574, - 26578, 26582, 26588, 26594, 26600, 26606, 26612, 26618, 26624, 26630, - 26636, 26642, 26648, 26654, 26660, 26666, 26675, 26684, 26690, 26696, - 26702, 26707, 26711, 26716, 26721, 26726, 26730, 26735, 26740, 26745, - 26749, 26754, 26758, 26763, 26768, 26773, 26778, 26782, 26786, 26790, - 26794, 26798, 26802, 26806, 26810, 26814, 26818, 26824, 26828, 26832, - 26836, 26840, 26844, 26852, 26858, 26862, 26868, 26872, 26878, 26882, 0, - 0, 26886, 26890, 26893, 26896, 26899, 26902, 26905, 26908, 26911, 26914, - 0, 0, 0, 0, 0, 0, 26917, 26925, 26933, 26941, 26949, 26957, 26965, 26973, - 26981, 26989, 0, 0, 0, 0, 0, 0, 26997, 27000, 27003, 27006, 27011, 27014, - 27019, 27026, 27034, 27039, 27046, 27049, 27056, 27063, 27070, 0, 27074, - 27078, 27081, 27084, 27087, 27090, 27093, 27096, 27099, 27102, 0, 0, 0, - 0, 0, 0, 27105, 27108, 27111, 27114, 27117, 27120, 27124, 27128, 27132, - 27135, 27139, 27143, 27146, 27150, 27154, 27157, 27161, 27164, 27168, - 27172, 27176, 27180, 27184, 27187, 27190, 27194, 27198, 27201, 27205, - 27209, 27213, 27217, 27221, 27225, 27229, 27233, 27240, 27245, 27250, - 27255, 27260, 27266, 27272, 27278, 27284, 27289, 27295, 27301, 27306, - 27312, 27318, 27324, 27330, 27336, 27341, 27347, 27352, 27358, 27364, - 27370, 27376, 27382, 27387, 27392, 27398, 27404, 27409, 27415, 27420, - 27426, 27431, 27436, 27442, 27448, 27454, 27460, 27466, 27472, 27478, - 27484, 27490, 27496, 27502, 27508, 27513, 27518, 27523, 27529, 0, 0, 0, - 0, 0, 0, 0, 0, 27535, 27544, 27553, 27561, 27569, 27579, 27587, 27596, - 27603, 27610, 27617, 27625, 27633, 27641, 27649, 27657, 27665, 27673, - 27681, 27688, 27696, 27704, 27712, 27720, 27728, 27738, 27748, 27758, - 27768, 27778, 27788, 27798, 27808, 27818, 27828, 27838, 27848, 27858, - 27868, 27876, 27884, 27894, 27902, 0, 0, 0, 0, 0, 27912, 27916, 27920, - 27924, 27928, 27932, 27936, 27940, 27944, 27948, 27952, 27956, 27960, - 27964, 27968, 27972, 27976, 27980, 27984, 27988, 27992, 27996, 28000, - 28004, 28010, 28014, 28020, 28024, 28030, 28034, 28040, 28044, 28048, - 28052, 28056, 28060, 28064, 28070, 28076, 28082, 28088, 28093, 28099, - 28105, 28111, 28117, 28123, 28129, 28136, 28142, 28147, 28152, 28156, - 28160, 28164, 28168, 28172, 28176, 28180, 28186, 28192, 28198, 28203, - 28210, 28215, 28220, 28226, 28231, 28238, 28245, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 28252, 28258, 28262, 28267, 28272, 28277, 28282, 28287, 28292, - 28297, 28302, 28307, 28312, 28317, 28322, 28327, 28331, 28335, 28340, - 28345, 28350, 28354, 28358, 28362, 28367, 28372, 28377, 28382, 28386, 0, - 0, 0, 28390, 28395, 28400, 28405, 28411, 28417, 28423, 28429, 28434, - 28439, 28445, 28451, 0, 0, 0, 0, 28458, 28463, 28469, 28475, 28481, - 28486, 28491, 28496, 28501, 28507, 28512, 28517, 0, 0, 0, 0, 28522, 0, 0, - 0, 28527, 28532, 28537, 28542, 28546, 28550, 28554, 28558, 28562, 28566, - 28570, 28574, 28578, 28583, 28589, 28595, 28601, 28606, 28611, 28617, - 28623, 28629, 28634, 28640, 28645, 28651, 28657, 28662, 28668, 28674, - 28680, 28685, 28690, 28695, 28701, 28707, 28712, 28718, 28723, 28729, - 28734, 28740, 0, 0, 28746, 28752, 28758, 28764, 28770, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28776, 28783, 28790, 28796, 28803, 28810, 28816, 28823, - 28830, 28837, 28843, 28849, 28856, 28862, 28868, 28875, 28882, 28888, - 28895, 28902, 28908, 28914, 28921, 28927, 28933, 28940, 28946, 28953, - 28960, 28967, 28974, 28981, 28988, 28994, 29001, 29008, 29014, 29021, - 29028, 29035, 29042, 29049, 29056, 29063, 0, 0, 0, 0, 29070, 29078, - 29085, 29092, 29098, 29105, 29111, 29118, 29124, 29131, 29138, 29145, - 29152, 29159, 29166, 29173, 29180, 29187, 29194, 29201, 29208, 29214, - 29221, 29228, 29235, 29241, 0, 0, 0, 0, 0, 0, 29247, 29253, 29258, 29263, - 29268, 29273, 29278, 29283, 29288, 29293, 29298, 0, 0, 0, 29304, 29310, - 29316, 29320, 29326, 29332, 29338, 29344, 29350, 29356, 29362, 29368, - 29374, 29380, 29386, 29392, 29398, 29404, 29410, 29414, 29420, 29426, - 29432, 29438, 29444, 29450, 29456, 29462, 29468, 29474, 29480, 29486, - 29492, 29498, 29504, 29508, 29513, 29518, 29523, 29527, 29532, 29536, - 29541, 29546, 29551, 29555, 29560, 29565, 29570, 29575, 29580, 29584, - 29588, 29593, 29598, 29602, 29606, 29610, 29615, 29620, 29625, 29630, 0, - 0, 29636, 29640, 29647, 29652, 29658, 29664, 29669, 29675, 29681, 29686, - 29692, 29698, 29704, 29709, 29715, 29720, 29725, 29731, 29736, 29742, - 29747, 29753, 29759, 29765, 29771, 29775, 29780, 29785, 29791, 29797, - 29802, 29808, 29814, 29818, 29823, 29828, 29832, 29837, 29842, 29847, - 29852, 29858, 29864, 29869, 29874, 29879, 29883, 29888, 29892, 29897, - 29901, 29906, 29911, 29916, 29921, 29927, 29933, 29940, 29950, 29959, - 29966, 29972, 29982, 29987, 29993, 0, 29998, 30003, 30008, 30016, 30022, - 30030, 30035, 30041, 30047, 30053, 30058, 30064, 30069, 30076, 30082, - 30087, 30093, 30099, 30105, 30112, 30119, 30126, 30131, 30136, 30143, - 30150, 30157, 30164, 30171, 0, 0, 30178, 30185, 30192, 30198, 30204, - 30210, 30216, 30222, 30228, 30234, 30240, 0, 0, 0, 0, 0, 0, 30246, 30252, - 30257, 30262, 30267, 30272, 30277, 30282, 30287, 30292, 0, 0, 0, 0, 0, 0, - 30297, 30302, 30307, 30312, 30317, 30322, 30327, 30336, 30343, 30348, - 30353, 30358, 30363, 30368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30373, 30379, - 30385, 30389, 30393, 30397, 30401, 30407, 30411, 30417, 30421, 30427, - 30433, 30441, 30447, 30455, 30459, 30463, 30467, 30473, 30476, 30482, - 30486, 30492, 30496, 30500, 30506, 30510, 30516, 30520, 30526, 30534, - 30542, 30550, 30556, 30560, 30566, 30570, 30576, 30579, 30582, 30588, - 30592, 30598, 30601, 30604, 30607, 30611, 30615, 30621, 30627, 30630, - 30633, 30637, 30642, 30647, 30654, 30659, 30666, 30673, 30682, 30689, - 30698, 30703, 30710, 30717, 30726, 30731, 30738, 30743, 30749, 30755, - 30761, 30767, 30773, 30779, 0, 0, 0, 0, 30785, 30789, 30792, 30795, - 30798, 30801, 30804, 30807, 30810, 30813, 30816, 30819, 30822, 30825, - 30830, 30835, 30840, 30843, 30848, 30853, 30858, 30863, 30870, 30875, - 30880, 30885, 30890, 30897, 30903, 30909, 30915, 30921, 30927, 30936, - 30945, 30951, 30957, 30965, 30973, 30982, 30991, 30999, 31007, 31016, - 31025, 0, 0, 0, 31033, 31037, 31041, 31045, 31048, 31051, 31054, 31058, - 31061, 31064, 31068, 31071, 31075, 31079, 31083, 31087, 31091, 31095, - 31099, 31103, 31107, 31110, 31113, 31117, 31121, 31125, 31128, 31131, - 31134, 31138, 31142, 31145, 31149, 31152, 31157, 31162, 31167, 31172, - 31177, 31182, 31187, 31192, 31197, 31201, 31205, 31211, 31218, 31222, - 31226, 31230, 31233, 31236, 31239, 31242, 31245, 31248, 31251, 31254, - 31257, 31260, 31264, 31268, 31272, 31277, 31281, 31285, 31291, 31295, - 31301, 31307, 31312, 31319, 31323, 31329, 31333, 31339, 31344, 31351, - 31358, 31363, 31370, 31375, 31380, 31384, 31390, 31394, 31400, 31407, - 31414, 31418, 31424, 31430, 31434, 31440, 31445, 31450, 31457, 31462, - 31467, 31472, 31477, 31481, 31485, 31490, 31495, 31502, 31508, 31513, - 31520, 31525, 31532, 31537, 31546, 31552, 31558, 31562, 0, 0, 0, 0, 0, 0, - 0, 0, 31566, 31575, 31582, 31589, 31596, 31599, 31603, 31607, 31611, - 31615, 31619, 31623, 31627, 31631, 31635, 31639, 31643, 31647, 31650, - 31653, 31657, 31661, 31665, 31669, 31673, 31677, 31680, 31684, 31688, - 31692, 31696, 31699, 31702, 31706, 31709, 31713, 31717, 31720, 31724, - 31728, 31731, 31736, 31741, 31746, 31750, 31754, 31759, 31763, 31768, - 31772, 31777, 31781, 31785, 31790, 31795, 31799, 31804, 31809, 31814, - 31818, 0, 0, 0, 31822, 31827, 31836, 31841, 31848, 31853, 31857, 31860, - 31863, 31866, 31869, 31872, 31875, 31878, 31881, 0, 0, 0, 31884, 31888, - 31892, 31896, 31903, 31909, 31915, 31921, 31927, 31933, 31939, 31945, - 31951, 31957, 31964, 31971, 31978, 31985, 31992, 31999, 32006, 32013, - 32020, 32027, 32034, 32041, 32048, 32055, 32062, 32069, 32076, 32083, - 32090, 32097, 32104, 32111, 32118, 32125, 32132, 32139, 32146, 32153, - 32160, 32167, 32175, 32183, 32191, 32197, 32203, 32209, 32217, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32226, 32233, 32240, 32247, 32254, - 32263, 32272, 32281, 0, 0, 0, 0, 0, 0, 0, 0, 32290, 32295, 32300, 32305, - 32310, 32319, 32330, 32339, 32350, 32356, 32369, 32375, 32382, 32389, - 32394, 32400, 32406, 32417, 32426, 32433, 32440, 32449, 32456, 32465, - 32475, 32485, 32492, 32499, 32506, 32516, 32521, 32529, 32535, 32543, - 32552, 32557, 32564, 32570, 32575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32580, - 32585, 32591, 32598, 32606, 32612, 32618, 32624, 32629, 32636, 32642, - 32648, 32654, 32662, 32667, 32675, 32680, 32686, 32692, 32699, 32707, - 32714, 32720, 32727, 32734, 32740, 32747, 32754, 32760, 32765, 32771, - 32779, 32787, 32793, 32799, 32805, 32811, 32819, 32823, 32829, 32835, - 32841, 32847, 32853, 32859, 32863, 32868, 32873, 32880, 32885, 32889, - 32895, 32900, 32905, 32909, 32914, 32919, 32923, 32927, 32932, 32939, - 32943, 32948, 32953, 32957, 32962, 32966, 32971, 32975, 32981, 32986, - 32993, 32998, 33003, 33007, 33012, 33017, 33024, 33029, 33035, 33040, - 33044, 33049, 33053, 33058, 33065, 33072, 33077, 33082, 33086, 33092, - 33098, 33103, 33108, 33113, 33119, 33124, 33130, 33135, 33141, 33147, - 33153, 33160, 33167, 33174, 33181, 33188, 33195, 33200, 33208, 33217, - 33226, 33235, 33244, 33253, 33262, 33274, 33283, 33292, 33301, 33308, - 33313, 33320, 33328, 33336, 33343, 33350, 33357, 33364, 33372, 33381, - 33390, 33399, 33408, 33417, 33426, 33435, 33444, 33453, 33462, 33471, - 33480, 33489, 33498, 33506, 33515, 33526, 33534, 33543, 33554, 33563, - 33572, 33581, 33590, 33598, 33607, 33614, 33619, 33627, 33632, 33639, - 33644, 33653, 33659, 33666, 33673, 33678, 33683, 33691, 33699, 33708, - 33717, 33722, 33729, 33740, 33748, 33757, 33763, 33769, 33774, 33781, - 33786, 33795, 33800, 33805, 33810, 33817, 33824, 33829, 33838, 33846, - 33851, 33856, 33863, 33870, 33874, 33878, 33881, 33884, 33887, 33890, - 33893, 33896, 33903, 33906, 33909, 33914, 33918, 33922, 33926, 33930, - 33934, 33943, 33949, 33955, 33961, 33969, 33977, 33983, 33989, 33996, - 34002, 34007, 34013, 34019, 34025, 34032, 34038, 34046, 34052, 34059, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34065, 34072, - 34079, 34084, 34093, 34101, 34109, 34116, 34123, 34130, 34137, 34145, - 34153, 34163, 34173, 34181, 34189, 34197, 34205, 34214, 34223, 34231, - 34239, 34248, 34257, 34267, 34277, 34286, 34295, 34303, 34311, 34319, - 34327, 34337, 34347, 34355, 34363, 34371, 34379, 34387, 34395, 34403, - 34411, 34419, 34427, 34435, 34443, 34452, 34461, 34470, 34479, 34489, - 34499, 34506, 34513, 34521, 34529, 34538, 34547, 34555, 34563, 34575, - 34587, 34596, 34605, 34614, 34623, 34630, 34637, 34645, 34653, 34661, - 34669, 34677, 34685, 34693, 34701, 34710, 34719, 34728, 34737, 34746, - 34755, 34765, 34775, 34785, 34795, 34804, 34813, 34820, 34827, 34835, - 34843, 34851, 34859, 34867, 34875, 34887, 34899, 34908, 34917, 34925, - 34933, 34941, 34949, 34960, 34971, 34982, 34993, 35005, 35017, 35025, - 35033, 35041, 35049, 35058, 35067, 35076, 35085, 35093, 35101, 35109, - 35117, 35125, 35133, 35142, 35151, 35161, 35171, 35178, 35185, 35193, - 35201, 35209, 35217, 35224, 35231, 35239, 35247, 35255, 35263, 35271, - 35279, 35287, 35295, 35303, 35311, 35319, 35327, 35335, 35343, 35351, - 35359, 35368, 35377, 35386, 35394, 35403, 35412, 35421, 35430, 35440, - 35449, 35456, 35461, 35468, 35475, 35483, 35491, 35500, 35509, 35519, - 35529, 35540, 35551, 35560, 35569, 35579, 35589, 35598, 35607, 35617, - 35627, 35638, 35649, 35658, 35667, 35677, 35687, 35694, 35701, 35709, - 35717, 35723, 35729, 35738, 35747, 35757, 35767, 35778, 35789, 35798, - 35807, 35817, 35827, 35836, 35845, 35853, 35861, 35868, 35875, 35883, - 35891, 35900, 35909, 35919, 35929, 35940, 35951, 35960, 35969, 35979, - 35989, 35998, 36007, 36017, 36027, 36038, 36049, 36058, 36067, 36077, - 36087, 36094, 36101, 36109, 36117, 36126, 36135, 36145, 36155, 36166, - 36177, 36186, 36195, 36205, 36215, 36223, 36231, 36239, 36247, 36256, - 36265, 36272, 36279, 36286, 36293, 36300, 36307, 36315, 36323, 36331, - 36339, 36350, 36361, 36372, 36383, 36394, 36405, 36413, 36421, 36432, - 36443, 36454, 36465, 36476, 36487, 36495, 36503, 36514, 36525, 36536, 0, - 0, 36547, 36555, 36563, 36574, 36585, 36596, 0, 0, 36607, 36615, 36623, - 36634, 36645, 36656, 36667, 36678, 36689, 36697, 36705, 36716, 36727, - 36738, 36749, 36760, 36771, 36779, 36787, 36798, 36809, 36820, 36831, - 36842, 36853, 36861, 36869, 36880, 36891, 36902, 36913, 36924, 36935, - 36943, 36951, 36962, 36973, 36984, 0, 0, 36995, 37003, 37011, 37022, - 37033, 37044, 0, 0, 37055, 37063, 37071, 37082, 37093, 37104, 37115, - 37126, 0, 37137, 0, 37145, 0, 37156, 0, 37167, 37178, 37186, 37194, - 37205, 37216, 37227, 37238, 37249, 37260, 37268, 37276, 37287, 37298, - 37309, 37320, 37331, 37342, 37350, 37358, 37366, 37374, 37382, 37390, - 37398, 37406, 37414, 37422, 37430, 37438, 37446, 0, 0, 37454, 37465, - 37476, 37490, 37504, 37518, 37532, 37546, 37560, 37571, 37582, 37596, - 37610, 37624, 37638, 37652, 37666, 37677, 37688, 37702, 37716, 37730, - 37744, 37758, 37772, 37783, 37794, 37808, 37822, 37836, 37850, 37864, - 37878, 37889, 37900, 37914, 37928, 37942, 37956, 37970, 37984, 37995, - 38006, 38020, 38034, 38048, 38062, 38076, 38090, 38098, 38106, 38117, - 38125, 0, 38136, 38144, 38155, 38163, 38171, 38179, 38187, 38195, 38198, - 38201, 38204, 38207, 38213, 38224, 38232, 0, 38243, 38251, 38262, 38270, - 38278, 38286, 38294, 38302, 38308, 38314, 38320, 38328, 38336, 38347, 0, - 0, 38358, 38366, 38377, 38385, 38393, 38401, 0, 38409, 38415, 38421, - 38427, 38435, 38443, 38454, 38465, 38473, 38481, 38489, 38500, 38508, - 38516, 38524, 38532, 38540, 38546, 38552, 0, 0, 38555, 38566, 38574, 0, - 38585, 38593, 38604, 38612, 38620, 38628, 38636, 38644, 38647, 0, 38650, - 38654, 38658, 38662, 38666, 38670, 38674, 38678, 38682, 38686, 38690, - 38694, 38700, 38706, 38712, 38715, 38718, 38720, 38724, 38728, 38732, - 38736, 38738, 38742, 38746, 38752, 38758, 38765, 38772, 38777, 38782, - 38788, 38794, 38796, 38799, 38801, 38805, 38809, 38813, 38816, 38820, - 38824, 38828, 38832, 38836, 38842, 38846, 38850, 38856, 38861, 38868, - 38870, 38873, 38877, 38881, 38886, 38892, 38894, 38903, 38912, 38915, - 38919, 38921, 38923, 38925, 38928, 38934, 38936, 38940, 38944, 38951, - 38958, 38962, 38967, 38972, 38977, 38982, 38986, 38990, 38993, 38997, - 39001, 39008, 39013, 39017, 39021, 39026, 39030, 39034, 39039, 39044, - 39048, 39052, 39056, 39058, 39063, 39068, 39072, 39076, 39080, 39084, 0, - 39088, 39092, 39096, 39102, 39108, 39114, 39120, 39127, 39134, 39139, - 39144, 39148, 0, 0, 39154, 39157, 39160, 39163, 39166, 39169, 39172, - 39176, 39180, 39185, 39190, 39195, 39202, 39206, 39209, 39212, 39215, - 39218, 39221, 39224, 39227, 39230, 39233, 39237, 39241, 39246, 39251, 0, - 39256, 39262, 39268, 39274, 39281, 39288, 39295, 39302, 39308, 39314, - 39321, 39328, 39335, 0, 0, 0, 39342, 39345, 39348, 39351, 39356, 39359, - 39362, 39365, 39368, 39371, 39374, 39378, 39381, 39384, 39387, 39390, - 39393, 39398, 39401, 39404, 39407, 39410, 39413, 39418, 39421, 39424, - 39429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 39434, 39439, 39444, 39451, 39459, 39464, 39469, 39473, 39477, 39482, - 39489, 39496, 39500, 39505, 39510, 39515, 39520, 39527, 39532, 39537, - 39542, 39551, 39558, 39565, 39569, 39574, 39580, 39585, 39592, 39601, - 39610, 39614, 39618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39622, - 39626, 39634, 39638, 39642, 39647, 39651, 39655, 39659, 39661, 39665, - 39669, 39673, 39678, 39682, 39686, 39694, 39697, 39701, 39704, 39707, - 39713, 39717, 39720, 39726, 39730, 39734, 39738, 39741, 39745, 39748, - 39752, 39754, 39757, 39760, 39764, 39766, 39770, 39773, 39776, 39781, - 39786, 39793, 39796, 39799, 39803, 39808, 39811, 39814, 39817, 39821, - 39826, 39829, 39832, 39834, 39837, 39840, 39843, 39847, 39852, 39855, - 39859, 39863, 39867, 39871, 39876, 39882, 39887, 39892, 39898, 39903, - 39908, 39912, 39916, 39921, 39925, 39929, 39932, 39934, 39939, 39945, - 39952, 39959, 39966, 39973, 39980, 39987, 39994, 40001, 40009, 40016, - 40024, 40031, 40038, 40046, 40054, 40059, 40064, 40069, 40074, 40079, - 40084, 40089, 40094, 40099, 40104, 40110, 40116, 40122, 40128, 40135, - 40143, 40150, 40156, 40162, 40168, 40174, 40180, 40186, 40192, 40198, - 40204, 40211, 40218, 40225, 40232, 40240, 40249, 40257, 40268, 40276, - 40284, 40293, 40300, 40309, 40318, 40326, 40335, 0, 0, 0, 0, 0, 0, 40343, - 40345, 40348, 40350, 40353, 40356, 40359, 40364, 40369, 40374, 40379, - 40383, 40387, 40391, 40395, 40400, 40406, 40411, 40417, 40422, 40427, - 40432, 40438, 40443, 40449, 40455, 40459, 40463, 40468, 40473, 40478, - 40483, 40488, 40496, 40504, 40512, 40520, 40527, 40535, 40542, 40549, - 40558, 40570, 40576, 40582, 40590, 40598, 40607, 40616, 40624, 40632, - 40641, 40650, 40655, 40663, 40668, 40673, 40679, 40684, 40690, 40697, - 40704, 40709, 40715, 40720, 40723, 40727, 40730, 40734, 40738, 40742, - 40748, 40754, 40760, 40766, 40770, 40774, 40778, 40782, 40788, 40794, - 40798, 40803, 40807, 40812, 40817, 40822, 40825, 40829, 40832, 40836, - 40843, 40851, 40862, 40873, 40878, 40887, 40894, 40903, 40912, 40916, - 40922, 40930, 40934, 40939, 40944, 40950, 40956, 40962, 40969, 40973, - 40977, 40982, 40985, 40987, 40991, 40995, 41003, 41007, 41009, 41011, - 41015, 41023, 41028, 41034, 41044, 41051, 41056, 41060, 41064, 41068, - 41071, 41074, 41077, 41081, 41085, 41089, 41093, 41097, 41100, 41104, - 41108, 41111, 41113, 41116, 41118, 41122, 41126, 41128, 41134, 41137, - 41142, 41146, 41150, 41152, 41154, 41156, 41159, 41163, 41167, 41171, - 41175, 41179, 41185, 41191, 41193, 41195, 41197, 41199, 41202, 41204, - 41208, 41210, 41214, 41217, 41223, 41227, 41231, 41234, 41237, 41241, - 41247, 41251, 41261, 41271, 41275, 41281, 41287, 41290, 41294, 41297, - 41302, 41306, 41312, 41316, 41328, 41336, 41340, 41344, 41350, 41354, - 41357, 41359, 41362, 41366, 41370, 41377, 41381, 41385, 41389, 41392, - 41397, 41402, 41407, 41412, 41417, 41422, 41430, 41438, 41442, 41446, - 41448, 41453, 41457, 41461, 41469, 41477, 41483, 41489, 41498, 41507, - 41512, 41517, 41525, 41533, 41535, 41537, 41542, 41547, 41553, 41559, - 41565, 41571, 41575, 41579, 41586, 41593, 41599, 41605, 41615, 41625, - 41633, 41641, 41643, 41647, 41651, 41656, 41661, 41668, 41675, 41678, - 41681, 41684, 41687, 41690, 41695, 41699, 41704, 41709, 41712, 41715, - 41718, 41721, 41724, 41728, 41731, 41734, 41737, 41740, 41742, 41744, - 41746, 41748, 41756, 41764, 41770, 41774, 41780, 41790, 41796, 41802, - 41808, 41816, 41824, 41835, 41839, 41843, 41845, 41851, 41853, 41855, - 41857, 41859, 41865, 41868, 41874, 41880, 41884, 41888, 41892, 41895, - 41899, 41903, 41905, 41914, 41923, 41928, 41933, 41939, 41945, 41951, - 41954, 41957, 41960, 41963, 41965, 41970, 41975, 41980, 41986, 41992, - 42000, 42008, 42014, 42020, 42026, 42032, 42041, 42050, 42059, 42068, - 42077, 42086, 42095, 42104, 42113, 42122, 42130, 42142, 42152, 42167, - 42170, 42175, 42181, 42187, 42194, 42208, 42223, 42229, 42235, 42242, - 42248, 42256, 42262, 42275, 42289, 42294, 42300, 42307, 42310, 42313, - 42315, 42318, 42321, 42323, 42325, 42329, 42332, 42335, 42338, 42341, - 42346, 42351, 42356, 42361, 42366, 42369, 42371, 42373, 42375, 42379, - 42383, 42387, 42393, 42398, 42400, 42402, 42407, 42412, 42417, 42422, - 42427, 42432, 42434, 42436, 42445, 42449, 42457, 42466, 42468, 42473, - 42478, 42486, 42490, 42492, 42496, 42498, 42502, 42506, 42510, 42512, - 42514, 42516, 42523, 42532, 42541, 42550, 42559, 42568, 42577, 42586, - 42595, 42603, 42611, 42620, 42629, 42638, 42647, 42655, 42663, 42672, - 42681, 42690, 42700, 42709, 42719, 42728, 42738, 42747, 42757, 42767, - 42776, 42786, 42795, 42805, 42814, 42824, 42833, 42842, 42851, 42860, - 42869, 42879, 42888, 42897, 42906, 42916, 42925, 42934, 42943, 42952, - 42962, 42972, 42981, 42990, 42998, 43006, 43013, 43021, 43030, 43041, - 43050, 43059, 43068, 43075, 43082, 43089, 43098, 43107, 43116, 43125, - 43132, 43137, 43146, 43151, 43154, 43162, 43165, 43170, 43175, 43178, - 43181, 43189, 43192, 43197, 43200, 43207, 43212, 43220, 43223, 43226, - 43229, 43234, 43239, 43242, 43245, 43253, 43256, 43263, 43270, 43274, - 43278, 43283, 43288, 43294, 43299, 43305, 43311, 43316, 43322, 43330, - 43336, 43344, 43352, 43358, 43366, 43374, 43383, 43391, 43397, 43405, - 43414, 43422, 43426, 43431, 43444, 43457, 43461, 43465, 43469, 43473, - 43483, 43487, 43492, 43497, 43502, 43507, 43512, 43517, 43527, 43537, - 43545, 43555, 43565, 43573, 43583, 43593, 43601, 43611, 43621, 43629, - 43637, 43647, 43657, 43660, 43663, 43666, 43671, 43675, 43681, 43688, - 43695, 43703, 43710, 43714, 43718, 43722, 43726, 43728, 43732, 43736, - 43741, 43746, 43753, 43760, 43763, 43770, 43772, 43774, 43778, 43782, - 43787, 43793, 43799, 43805, 43811, 43820, 43829, 43838, 43842, 43844, - 43848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43855, 43859, 43866, 43873, - 43880, 43887, 43891, 43895, 43899, 43903, 43908, 43914, 43919, 43925, - 43931, 43937, 43943, 43951, 43958, 43965, 43972, 43979, 43984, 43990, - 43999, 44003, 44010, 44014, 44018, 44024, 44030, 44036, 44042, 44046, - 44050, 44053, 44056, 44060, 44067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44074, 44077, 44081, 44085, 44091, - 44097, 44103, 44111, 44118, 44122, 44130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44135, 44138, 44141, 44144, 44147, - 44150, 44153, 44156, 44159, 44162, 44166, 44170, 44174, 44178, 44182, - 44186, 44190, 44194, 44198, 44202, 44206, 44209, 44212, 44215, 44218, - 44221, 44224, 44227, 44230, 44233, 44237, 44241, 44245, 44249, 44253, - 44257, 44261, 44265, 44269, 44273, 44277, 44283, 44289, 44295, 44302, - 44309, 44316, 44323, 44330, 44337, 44344, 44351, 44358, 44365, 44372, - 44379, 44386, 44393, 44400, 44407, 44414, 44419, 44425, 44431, 44437, - 44442, 44448, 44454, 44460, 44465, 44471, 44477, 44482, 44487, 44493, - 44498, 44504, 44510, 44515, 44521, 44527, 44532, 44538, 44544, 44550, - 44556, 44562, 44567, 44573, 44579, 44585, 44590, 44596, 44602, 44608, - 44613, 44619, 44625, 44630, 44635, 44641, 44646, 44652, 44658, 44663, - 44669, 44675, 44680, 44686, 44692, 44698, 44704, 44710, 44715, 44721, - 44727, 44733, 44738, 44744, 44750, 44756, 44761, 44767, 44773, 44778, - 44783, 44789, 44794, 44800, 44806, 44811, 44817, 44823, 44828, 44834, - 44840, 44846, 44852, 44858, 44862, 44867, 44872, 44877, 44882, 44887, - 44892, 44897, 44902, 44907, 44912, 44916, 44920, 44924, 44928, 44932, - 44936, 44940, 44944, 44948, 44953, 44958, 44963, 44968, 44973, 44978, - 44987, 44996, 45005, 45014, 45023, 45032, 45041, 45050, 45057, 45065, - 45073, 45080, 45087, 45095, 45103, 45110, 45117, 45125, 45133, 45140, - 45147, 45155, 45163, 45170, 45177, 45185, 45194, 45203, 45211, 45220, - 45229, 45236, 45243, 45251, 45260, 45269, 45277, 45286, 45295, 45302, - 45309, 45318, 45327, 45335, 45343, 45352, 45361, 45368, 45375, 45384, - 45393, 45401, 45409, 45418, 45427, 45434, 45441, 45450, 45459, 45467, - 45476, 45485, 45493, 45503, 45513, 45523, 45533, 45542, 45551, 45560, - 45569, 45576, 45584, 45592, 45600, 45608, 45613, 45618, 45627, 45635, - 45642, 45651, 45659, 45666, 45675, 45683, 45690, 45699, 45707, 45714, - 45723, 45731, 45738, 45747, 45755, 45762, 45771, 45779, 45786, 45795, - 45803, 45810, 45819, 45827, 45834, 45843, 45852, 45861, 45870, 45884, - 45898, 45905, 45910, 45915, 45920, 45925, 45930, 45935, 45940, 45945, - 45953, 45961, 45969, 45977, 45982, 45989, 45996, 46003, 46008, 46016, - 46023, 46031, 46035, 46042, 46048, 46055, 46059, 46065, 46071, 46077, - 46081, 46084, 46088, 46092, 46099, 46105, 46111, 46117, 46123, 46137, - 46147, 46161, 46175, 46181, 46191, 46205, 46208, 46211, 46218, 46226, - 46231, 46236, 46244, 46256, 46268, 46276, 46280, 46284, 46287, 46290, - 46294, 46298, 46301, 46304, 46309, 46314, 46320, 46326, 46331, 46336, - 46342, 46348, 46353, 46358, 46363, 46368, 46374, 46380, 46385, 46390, - 46396, 46402, 46407, 46412, 46415, 46418, 46427, 46429, 46431, 46434, - 46438, 46444, 46446, 46449, 46456, 46463, 46471, 46479, 46489, 46503, - 46508, 46513, 46517, 46522, 46530, 46538, 46547, 46556, 46565, 46574, - 46579, 46584, 46590, 46596, 46602, 46608, 46611, 46617, 46623, 46633, - 46643, 46651, 46659, 46668, 46677, 46681, 46689, 46697, 46705, 46713, - 46722, 46731, 46740, 46749, 46754, 46759, 46764, 46769, 46774, 46780, - 46786, 46791, 46797, 46799, 46801, 46803, 46805, 46808, 46811, 46813, - 46815, 46817, 46821, 46825, 46827, 46829, 46832, 46835, 46839, 46845, - 46851, 46853, 46860, 46864, 46869, 46874, 46876, 46886, 46892, 46898, - 46904, 46910, 46916, 46922, 46927, 46930, 46933, 46936, 46938, 46940, - 46944, 46948, 46953, 46958, 46963, 46966, 46970, 46975, 46978, 46982, - 46987, 46992, 46997, 47002, 47007, 47012, 47017, 47022, 47027, 47032, - 47037, 47042, 47048, 47054, 47060, 47062, 47065, 47067, 47070, 47072, - 47074, 47076, 47078, 47080, 47082, 47084, 47086, 47088, 47090, 47092, - 47094, 47096, 47098, 47100, 47102, 47104, 47109, 47114, 47119, 47124, - 47129, 47134, 47139, 47144, 47149, 47154, 47159, 47164, 47169, 47174, - 47179, 47184, 47189, 47194, 47199, 47204, 47208, 47212, 47216, 47222, - 47228, 47233, 47238, 47243, 47248, 47253, 47258, 47266, 47274, 47282, - 47290, 47298, 47306, 47314, 47322, 47328, 47333, 47338, 47343, 47346, - 47350, 47354, 47358, 47362, 47366, 47370, 47377, 47384, 47392, 47400, - 47405, 47410, 47417, 47424, 47431, 47438, 47441, 47444, 47449, 47451, - 47455, 47460, 47462, 47464, 47466, 47468, 47473, 47476, 47478, 47483, - 47490, 47497, 47500, 47504, 47509, 47514, 47522, 47528, 47534, 47546, - 47553, 47560, 47565, 47570, 47576, 47579, 47582, 47587, 47589, 47593, - 47595, 47597, 47599, 47601, 47603, 47605, 47610, 47612, 47614, 47616, - 47618, 47622, 47624, 47627, 47632, 47637, 47642, 47647, 47653, 47659, - 47661, 47664, 47671, 47678, 47685, 47692, 47696, 47700, 47702, 47704, - 47708, 47714, 47719, 47721, 47725, 47734, 47742, 47750, 47756, 47762, - 47767, 47773, 47778, 47781, 47795, 47798, 47803, 47808, 47814, 47824, - 47826, 47832, 47838, 47842, 47849, 47853, 47855, 47857, 47861, 47867, - 47872, 47878, 47880, 47886, 47888, 47894, 47896, 47898, 47903, 47905, - 47909, 47914, 47916, 47921, 47926, 47930, 47937, 0, 47947, 47953, 47956, - 47962, 47965, 47970, 47975, 47979, 47981, 47983, 47987, 47991, 47995, - 47999, 48004, 48006, 48011, 48014, 48017, 48020, 48024, 48028, 48033, - 48037, 48042, 48047, 48051, 48056, 48062, 48065, 48071, 48076, 48080, - 48085, 48091, 48097, 48104, 48110, 48117, 48124, 48126, 48133, 48137, - 48143, 48149, 48154, 48160, 48164, 48169, 48172, 48177, 48183, 48190, - 48198, 48205, 48214, 48224, 48231, 48237, 48241, 48248, 48253, 48262, - 48265, 48268, 48277, 48287, 48294, 48296, 48302, 48307, 48309, 48312, - 48316, 48324, 48333, 48336, 48341, 48346, 48354, 48362, 48370, 48378, - 48384, 48390, 48396, 48404, 48409, 48412, 48416, 48419, 48431, 48441, - 48452, 48461, 48472, 48482, 48491, 48497, 48505, 48509, 48517, 48521, - 48529, 48536, 48543, 48552, 48561, 48571, 48581, 48591, 48601, 48610, - 48619, 48629, 48639, 48648, 48657, 48663, 48669, 48675, 48681, 48687, - 48693, 48699, 48705, 48711, 48718, 48724, 48730, 48736, 48742, 48748, - 48754, 48760, 48766, 48772, 48779, 48786, 48793, 48800, 48807, 48814, - 48821, 48828, 48835, 48842, 48850, 48855, 48858, 48862, 48866, 48872, - 48875, 48881, 48887, 48892, 48896, 48901, 48907, 48914, 48917, 48924, - 48931, 48935, 48944, 48953, 48958, 48964, 48969, 48974, 48981, 48988, - 48996, 49004, 49013, 49017, 49026, 49031, 49035, 49042, 49046, 49053, - 49061, 49066, 49074, 49078, 49083, 49087, 49092, 49096, 49101, 49106, - 49115, 49117, 49120, 49123, 49130, 49137, 49142, 49150, 49156, 49162, - 49167, 49170, 49175, 49180, 49185, 49193, 49197, 49204, 49212, 49220, - 49225, 49230, 49236, 49241, 49246, 49252, 49257, 49260, 49264, 49268, - 49275, 49284, 49289, 49298, 49307, 49313, 49319, 49324, 49329, 49334, - 49339, 49345, 49351, 49359, 49367, 49373, 49379, 49384, 49389, 49396, - 49403, 49409, 49412, 49415, 49419, 49423, 49427, 49432, 49438, 49444, - 49451, 49458, 49463, 49467, 49471, 49475, 49479, 49483, 49487, 49491, - 49495, 49499, 49503, 49507, 49511, 49515, 49519, 49523, 49527, 49531, - 49535, 49539, 49543, 49547, 49551, 49555, 49559, 49563, 49567, 49571, - 49575, 49579, 49583, 49587, 49591, 49595, 49599, 49603, 49607, 49611, - 49615, 49619, 49623, 49627, 49631, 49635, 49639, 49643, 49647, 49651, - 49655, 49659, 49663, 49667, 49671, 49675, 49679, 49683, 49687, 49691, - 49695, 49699, 49703, 49707, 49711, 49715, 49719, 49723, 49727, 49731, - 49735, 49739, 49743, 49747, 49751, 49755, 49759, 49763, 49767, 49771, - 49775, 49779, 49783, 49787, 49791, 49795, 49799, 49803, 49807, 49811, - 49815, 49819, 49823, 49827, 49831, 49835, 49839, 49843, 49847, 49851, - 49855, 49859, 49863, 49867, 49871, 49875, 49879, 49883, 49887, 49891, - 49895, 49899, 49903, 49907, 49911, 49915, 49919, 49923, 49927, 49931, - 49935, 49939, 49943, 49947, 49951, 49955, 49959, 49963, 49967, 49971, - 49975, 49979, 49983, 49987, 49991, 49995, 49999, 50003, 50007, 50011, - 50015, 50019, 50023, 50027, 50031, 50035, 50039, 50043, 50047, 50051, - 50055, 50059, 50063, 50067, 50071, 50075, 50079, 50083, 50087, 50091, - 50095, 50099, 50103, 50107, 50111, 50115, 50119, 50123, 50127, 50131, - 50135, 50139, 50143, 50147, 50151, 50155, 50159, 50163, 50167, 50171, - 50175, 50179, 50183, 50187, 50191, 50195, 50199, 50203, 50207, 50211, - 50215, 50219, 50223, 50227, 50231, 50235, 50239, 50243, 50247, 50251, - 50255, 50259, 50263, 50267, 50271, 50275, 50279, 50283, 50287, 50291, - 50295, 50299, 50303, 50307, 50311, 50315, 50319, 50323, 50327, 50331, - 50335, 50339, 50343, 50347, 50351, 50355, 50359, 50363, 50367, 50371, - 50375, 50379, 50383, 50387, 50391, 50395, 50399, 50403, 50407, 50411, - 50415, 50419, 50423, 50427, 50431, 50435, 50439, 50443, 50447, 50451, - 50455, 50459, 50463, 50467, 50471, 50475, 50479, 50483, 50487, 50494, - 50502, 50508, 50514, 50521, 50528, 50534, 50540, 50546, 50552, 50557, - 50562, 50567, 50572, 50578, 50584, 50592, 50599, 50605, 50611, 50619, - 50628, 50635, 50645, 50656, 50659, 50662, 50666, 50670, 50677, 50684, - 50695, 50706, 50716, 50726, 50733, 50740, 50747, 50754, 50765, 50776, - 50787, 50798, 50808, 50818, 50830, 50842, 50853, 50864, 50876, 50888, - 50897, 50907, 50917, 50928, 50939, 50946, 50953, 50960, 50967, 50977, - 50987, 50995, 51003, 51010, 51017, 51024, 51031, 51038, 51043, 51048, - 51054, 51062, 51072, 51082, 51092, 51102, 51112, 51122, 51132, 51142, - 51152, 51162, 51172, 51183, 51194, 51204, 51214, 51225, 51236, 51246, - 51256, 51267, 51278, 51288, 51298, 51309, 51320, 51336, 51355, 51371, - 51390, 51406, 51422, 51438, 51454, 51465, 51477, 51488, 51500, 51519, - 51538, 51546, 51552, 51559, 51566, 51573, 51580, 51585, 51591, 51596, - 51601, 51607, 51612, 51617, 51622, 51627, 51632, 51639, 51644, 51651, - 51656, 51661, 51665, 51669, 51676, 51683, 51690, 51697, 51704, 51711, - 51724, 51737, 51750, 51763, 51771, 51779, 51785, 51791, 51798, 51805, - 51812, 51819, 51823, 51828, 51836, 51844, 51852, 51859, 51863, 51871, - 51879, 51883, 51887, 51892, 51899, 51907, 51915, 51934, 51953, 51972, - 51991, 52010, 52029, 52048, 52067, 52073, 52080, 52089, 52097, 52105, - 52110, 52113, 52116, 52121, 52124, 52143, 52150, 52156, 52162, 52166, - 52169, 52172, 52175, 52187, 52200, 52207, 52214, 52217, 52221, 52224, - 52229, 52234, 52239, 52245, 52254, 52261, 52268, 52276, 52283, 52290, - 52293, 52299, 52305, 52308, 52311, 52316, 52321, 52327, 52333, 52337, - 52342, 52349, 52353, 52359, 52363, 52367, 52375, 52387, 52396, 52400, - 52402, 52411, 52420, 52426, 52429, 52435, 52441, 52446, 52451, 52456, - 52461, 52466, 52471, 52473, 52479, 52484, 52491, 52495, 52501, 52504, - 52508, 52515, 52522, 52524, 52526, 52532, 52538, 52544, 52553, 52562, - 52569, 52576, 52582, 52588, 52593, 52598, 52603, 52609, 52615, 52620, - 52627, 52631, 52635, 52648, 52661, 52673, 52682, 52688, 52695, 52700, - 52705, 52710, 52715, 52720, 52722, 52729, 52736, 52743, 52750, 52757, - 52765, 52771, 52776, 52782, 52788, 52794, 52801, 52807, 52815, 52823, - 52831, 52839, 52846, 52852, 52858, 52867, 52871, 52880, 52889, 52898, - 52906, 52910, 52916, 52923, 52930, 52934, 52940, 52947, 52952, 52957, - 52963, 52968, 52973, 52980, 52987, 52992, 52997, 53005, 53013, 53023, - 53033, 53040, 53047, 53051, 53055, 53067, 53073, 53079, 53084, 53089, - 53096, 53103, 53109, 53115, 53124, 53132, 53140, 53147, 53154, 53161, - 53167, 53174, 53180, 53187, 53194, 53201, 53208, 53214, 53219, 53228, - 53238, 53245, 53254, 53260, 53265, 53270, 53280, 53286, 53292, 53298, - 53306, 53311, 53318, 53325, 53336, 53343, 53350, 53357, 53364, 53371, - 53378, 53385, 53397, 53409, 53420, 53431, 53444, 53457, 53462, 53467, - 53476, 53485, 53492, 53499, 53508, 53517, 53525, 53533, 53541, 53549, - 53559, 53569, 53583, 53597, 53605, 53613, 53625, 53637, 53645, 53653, - 53663, 53673, 53678, 53683, 53692, 53701, 53706, 53711, 53719, 53725, - 53731, 53739, 53747, 53760, 53773, 53777, 53781, 53788, 53795, 53802, - 53810, 53818, 53827, 53836, 53842, 53848, 53855, 53862, 53869, 53876, - 53885, 53894, 53897, 53900, 53905, 53910, 53916, 53922, 53929, 53936, - 53946, 53956, 53963, 53970, 53978, 53986, 53994, 54002, 54010, 54018, - 54024, 54030, 54034, 54038, 54045, 54052, 54057, 54062, 54067, 54072, - 54078, 54092, 54099, 54106, 54110, 54112, 54114, 54119, 54124, 54129, - 54134, 54142, 54149, 54156, 54164, 54176, 54184, 54192, 54203, 54207, - 54211, 54217, 54225, 54238, 54245, 54252, 54259, 54264, 54271, 54280, - 54288, 54294, 54300, 54306, 54315, 54324, 54332, 54341, 54346, 54349, - 54354, 54360, 54366, 54372, 54378, 54382, 54385, 54389, 54393, 54399, - 54405, 54411, 54417, 54421, 54425, 54432, 54439, 54446, 54453, 54460, - 54467, 54477, 54487, 54494, 54501, 54509, 54517, 54521, 54526, 54531, - 54537, 54543, 54546, 54549, 54552, 54555, 54559, 54564, 54569, 54574, - 54579, 54584, 54588, 54592, 54596, 54600, 54604, 54608, 54612, 54618, - 54622, 54628, 54633, 54640, 54648, 54655, 54663, 54670, 54678, 54687, - 54694, 54704, 54715, 54721, 54730, 54736, 54745, 54754, 54760, 54766, - 54770, 54774, 54783, 54792, 54799, 54806, 54815, 0, 0, 0, 54824, 54829, - 54833, 54837, 54842, 54847, 54852, 54860, 54868, 54871, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54875, 54880, 54885, - 54890, 54895, 54900, 54905, 54910, 54915, 54920, 54925, 54931, 54935, - 54940, 54945, 54950, 54955, 54960, 54965, 54970, 54975, 54980, 54985, - 54990, 54995, 55000, 55005, 55010, 55015, 55020, 55025, 55030, 55035, - 55040, 55045, 55051, 55056, 55062, 55071, 55076, 55084, 55091, 55100, - 55105, 55110, 55115, 55121, 0, 55128, 55133, 55138, 55143, 55148, 55153, - 55158, 55163, 55168, 55173, 55178, 55184, 55188, 55193, 55198, 55203, - 55208, 55213, 55218, 55223, 55228, 55233, 55238, 55243, 55248, 55253, - 55258, 55263, 55268, 55273, 55278, 55283, 55288, 55293, 55298, 55304, - 55309, 55315, 55324, 55329, 55337, 55344, 55353, 55358, 55363, 55368, - 55374, 0, 55381, 55389, 55397, 55406, 55413, 55421, 55427, 55436, 55444, - 55452, 55460, 55468, 55476, 55484, 55489, 55496, 55502, 55509, 55517, - 55524, 55531, 55539, 55545, 55551, 55558, 55565, 55575, 55585, 55592, - 55599, 55604, 55614, 55624, 55629, 55634, 55639, 55644, 55649, 55654, - 55659, 55664, 55669, 55674, 55679, 55684, 55689, 55694, 55699, 55704, - 55709, 55714, 55719, 55724, 55729, 55734, 55739, 55744, 55749, 55754, - 55759, 55764, 55769, 55774, 55778, 55782, 55787, 55792, 55797, 55802, - 55807, 55812, 55817, 55822, 55827, 55832, 55837, 55842, 55847, 55852, - 55857, 55862, 55867, 55872, 55879, 55886, 55893, 55900, 55907, 55914, - 55921, 55928, 55935, 55942, 55949, 55956, 55963, 55970, 55975, 55980, - 55987, 55994, 56001, 56008, 56015, 56022, 56029, 56036, 56043, 56050, - 56057, 56064, 56070, 56076, 56082, 56088, 56095, 56102, 56109, 56116, - 56123, 56130, 56137, 56144, 56151, 56158, 56166, 56174, 56182, 56190, - 56198, 56206, 56214, 56222, 56226, 56232, 56238, 56242, 56248, 56254, - 56260, 56267, 56274, 56281, 56288, 56293, 56299, 56305, 56312, 0, 0, 0, - 0, 0, 56319, 56327, 56336, 56345, 56353, 56359, 56364, 56369, 56374, - 56379, 56384, 56389, 56394, 56399, 56404, 56409, 56414, 56419, 56424, - 56429, 56434, 56439, 56444, 56449, 56454, 56459, 56464, 56469, 56474, - 56479, 56484, 56489, 56494, 56499, 56504, 56509, 56514, 56519, 56524, - 56529, 56534, 56539, 56544, 56549, 56554, 0, 56559, 0, 0, 0, 0, 0, 56564, - 0, 0, 56569, 56573, 56578, 56583, 56588, 56593, 56602, 56607, 56612, - 56617, 56622, 56627, 56632, 56637, 56642, 56649, 56654, 56659, 56668, - 56675, 56680, 56685, 56690, 56697, 56702, 56709, 56714, 56719, 56726, - 56733, 56738, 56743, 56748, 56755, 56762, 56767, 56772, 56777, 56782, - 56787, 56794, 56801, 56806, 56811, 56816, 56821, 56826, 56831, 56836, - 56841, 56846, 56851, 56856, 56863, 56868, 56873, 0, 0, 0, 0, 0, 0, 0, - 56878, 56885, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56890, 56895, - 56899, 56903, 56907, 56911, 56915, 56919, 56923, 56927, 56931, 56935, - 56941, 56945, 56949, 56953, 56957, 56961, 56965, 56969, 56973, 56977, - 56981, 56985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56989, 56993, 56997, 57001, - 57005, 57009, 57013, 0, 57017, 57021, 57025, 57029, 57033, 57037, 57041, - 0, 57045, 57049, 57053, 57057, 57061, 57065, 57069, 0, 57073, 57077, - 57081, 57085, 57089, 57093, 57097, 0, 57101, 57105, 57109, 57113, 57117, - 57121, 57125, 0, 57129, 57133, 57137, 57141, 57145, 57149, 57153, 0, - 57157, 57161, 57165, 57169, 57173, 57177, 57181, 0, 57185, 57189, 57193, - 57197, 57201, 57205, 57209, 0, 57213, 57218, 57223, 57228, 57233, 57238, - 57243, 57247, 57252, 57257, 57262, 57266, 57271, 57276, 57281, 57286, - 57290, 57295, 57300, 57305, 57310, 57315, 57320, 57324, 57329, 57334, - 57341, 57346, 57351, 57357, 57364, 57371, 57380, 57387, 57396, 57400, - 57404, 57410, 57416, 57422, 57430, 57436, 57440, 57444, 57448, 57454, - 57460, 57464, 57466, 57470, 57476, 57478, 57482, 57486, 57490, 57496, - 57501, 57505, 57509, 57514, 57520, 57525, 57530, 57535, 57540, 57547, - 57554, 57559, 57564, 57569, 57574, 57579, 57584, 57588, 57592, 57599, - 57606, 57612, 57616, 57621, 57623, 57627, 57635, 57639, 57643, 57647, - 57651, 57657, 57663, 57667, 57673, 57677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57681, 57685, 57689, 57694, 57699, 57704, - 57708, 57712, 57716, 57721, 57726, 57730, 57734, 57738, 57742, 57747, - 57752, 57757, 57762, 57766, 57770, 57775, 57780, 57785, 57790, 57794, 0, - 57798, 57802, 57806, 57810, 57814, 57818, 57822, 57827, 57832, 57836, - 57841, 57846, 57855, 57859, 57863, 57867, 57874, 57878, 57883, 57888, - 57892, 57896, 57902, 57907, 57912, 57917, 57922, 57926, 57930, 57934, - 57938, 57942, 57947, 57952, 57956, 57960, 57965, 57970, 57975, 57979, - 57983, 57988, 57993, 57999, 58005, 58009, 58015, 58021, 58025, 58031, - 58037, 58042, 58047, 58051, 58057, 58061, 58065, 58071, 58077, 58082, - 58087, 58091, 58095, 58103, 58109, 58115, 58121, 58126, 58131, 58136, - 58142, 58146, 58152, 58156, 58160, 58166, 58172, 58178, 58184, 58190, - 58196, 58202, 58208, 58214, 58220, 58226, 58232, 58236, 58242, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 58248, 58251, 58255, 58259, 58263, 58267, - 58270, 58273, 58277, 58281, 58285, 58289, 58292, 58297, 58301, 58305, - 58309, 58314, 58318, 58322, 58326, 58330, 58336, 58342, 58346, 58350, - 58354, 58358, 58362, 58366, 58370, 58374, 58378, 58382, 58386, 58392, - 58396, 58400, 58404, 58408, 58412, 58416, 58420, 58424, 58428, 58432, - 58436, 58440, 58444, 58448, 58452, 58456, 58462, 58468, 58473, 58478, - 58482, 58486, 58490, 58494, 58498, 58502, 58506, 58510, 58514, 58518, - 58522, 58526, 58530, 58534, 58538, 58542, 58546, 58550, 58554, 58558, - 58562, 58566, 58570, 58574, 58580, 58584, 58588, 58592, 58596, 58600, - 58604, 58608, 58612, 58617, 58624, 58628, 58632, 58636, 58640, 58644, - 58648, 58652, 58656, 58660, 58664, 58668, 58672, 58679, 58683, 58689, - 58693, 58697, 58701, 58705, 58709, 58712, 58716, 58720, 58724, 58728, - 58732, 58736, 58740, 58744, 58748, 58752, 58756, 58760, 58764, 58768, - 58772, 58776, 58780, 58784, 58788, 58792, 58796, 58800, 58804, 58808, - 58812, 58816, 58820, 58824, 58828, 58832, 58836, 58840, 58846, 58850, - 58854, 58858, 58862, 58866, 58870, 58874, 58878, 58882, 58886, 58890, - 58894, 58898, 58902, 58906, 58910, 58914, 58918, 58922, 58926, 58930, - 58934, 58938, 58942, 58946, 58950, 58954, 58962, 58966, 58970, 58974, - 58978, 58982, 58988, 58992, 58996, 59000, 59004, 59008, 59012, 59016, - 59020, 59024, 59028, 59032, 59036, 59040, 59046, 59050, 59054, 59058, - 59062, 59066, 59070, 59074, 59078, 59082, 59086, 59090, 59094, 59098, - 59102, 59106, 59110, 59114, 59118, 59122, 59126, 59130, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59134, 59143, - 59151, 59163, 59174, 59182, 59191, 59200, 59210, 59222, 59234, 59246, 0, - 0, 0, 0, 59252, 59255, 59258, 59263, 59266, 59273, 59277, 59281, 59285, - 59289, 59293, 59298, 59303, 59307, 59311, 59316, 59321, 59326, 59331, - 59334, 59337, 59343, 59349, 59354, 59359, 59366, 59373, 59377, 59381, - 59385, 59393, 59399, 59406, 59411, 59416, 59421, 59426, 59431, 59436, - 59441, 59446, 59451, 59456, 59461, 59466, 59471, 59476, 59482, 59487, - 59491, 59497, 59508, 59518, 59533, 59543, 59547, 59557, 59563, 59569, - 59575, 59580, 59583, 59588, 59592, 0, 59598, 59602, 59605, 59609, 59612, - 59616, 59619, 59623, 59626, 59630, 59633, 59636, 59640, 59644, 59648, - 59652, 59656, 59660, 59664, 59668, 59672, 59675, 59679, 59683, 59687, - 59691, 59695, 59699, 59703, 59707, 59711, 59715, 59719, 59723, 59727, - 59732, 59736, 59740, 59744, 59748, 59751, 59755, 59758, 59762, 59766, - 59770, 59774, 59777, 59781, 59784, 59788, 59792, 59796, 59800, 59804, - 59808, 59812, 59816, 59820, 59824, 59828, 59832, 59835, 59839, 59843, - 59847, 59851, 59855, 59858, 59863, 59867, 59872, 59876, 59879, 59883, - 59887, 59891, 59895, 59900, 59904, 59908, 59912, 59916, 59920, 59924, - 59928, 0, 0, 59933, 59941, 59949, 59956, 59963, 59967, 59973, 59978, - 59983, 59987, 59990, 59994, 59997, 60001, 60004, 60008, 60011, 60015, - 60018, 60021, 60025, 60029, 60033, 60037, 60041, 60045, 60049, 60053, - 60057, 60060, 60064, 60068, 60072, 60076, 60080, 60084, 60088, 60092, - 60096, 60100, 60104, 60108, 60112, 60117, 60121, 60125, 60129, 60133, - 60136, 60140, 60143, 60147, 60151, 60155, 60159, 60162, 60166, 60169, - 60173, 60177, 60181, 60185, 60189, 60193, 60197, 60201, 60205, 60209, - 60213, 60217, 60220, 60224, 60228, 60232, 60236, 60240, 60243, 60248, - 60252, 60257, 60261, 60264, 60268, 60272, 60276, 60280, 60285, 60289, - 60293, 60297, 60301, 60305, 60309, 60313, 60318, 60322, 60326, 60330, - 60334, 60339, 60346, 60350, 60356, 0, 0, 0, 0, 0, 60361, 60366, 60371, - 60375, 60380, 60385, 60390, 60395, 60399, 60404, 60409, 60414, 60419, - 60424, 60429, 60434, 60439, 60444, 60448, 60453, 60458, 60463, 60467, - 60471, 60475, 60480, 60485, 60490, 60495, 60500, 60505, 60510, 60515, - 60520, 60525, 60529, 60533, 60538, 60543, 60548, 60553, 0, 0, 0, 60558, - 60562, 60566, 60570, 60574, 60578, 60582, 60586, 60590, 60594, 60598, - 60602, 60606, 60610, 60614, 60618, 60622, 60626, 60630, 60634, 60638, - 60642, 60646, 60650, 60654, 60658, 60662, 60666, 60670, 60674, 60678, - 60681, 60685, 60688, 60692, 60696, 60699, 60703, 60707, 60710, 60714, - 60718, 60722, 60726, 60729, 60733, 60737, 60741, 60745, 60749, 60753, - 60756, 60759, 60763, 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, 60895, 60899, 60903, 60907, 60911, - 60915, 60919, 60923, 0, 60927, 60933, 60939, 60944, 60949, 60954, 60960, - 60966, 60972, 60978, 60984, 60990, 60996, 61002, 61008, 61014, 61020, - 61025, 61030, 61035, 61040, 61045, 61050, 61055, 61060, 61065, 61070, - 61075, 61080, 61085, 61090, 61095, 61100, 61105, 61110, 61115, 61120, - 61126, 61132, 61138, 61144, 61149, 61154, 0, 0, 0, 0, 0, 61159, 61164, - 61169, 61174, 61179, 61184, 61189, 61194, 61199, 61204, 61209, 61214, - 61219, 61224, 61229, 61234, 61239, 61244, 61249, 61254, 61259, 61264, - 61269, 61274, 61279, 61284, 61289, 61294, 61299, 61304, 61309, 61314, - 61319, 61324, 61329, 61334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61339, - 61344, 61349, 61354, 61358, 61363, 61367, 61372, 61377, 61382, 61387, - 61392, 61396, 61401, 61406, 61411, 61416, 61420, 61424, 61428, 61432, - 61436, 61440, 61444, 61448, 61452, 61456, 61460, 61464, 61468, 61472, - 61477, 61482, 61487, 61492, 61497, 61502, 61507, 61512, 61517, 61522, - 61527, 61532, 61537, 61542, 61547, 61553, 0, 61560, 61563, 61566, 61569, - 61572, 61575, 61578, 61581, 61584, 61587, 61591, 61595, 61599, 61603, - 61607, 61611, 61615, 61619, 61623, 61627, 61631, 61635, 61639, 61643, - 61647, 61651, 61655, 61659, 61663, 61667, 61671, 61675, 61679, 61683, - 61687, 61691, 61695, 61699, 61703, 61707, 61711, 61720, 61729, 61738, - 61747, 61756, 61765, 61774, 61783, 61786, 61791, 61796, 61801, 61806, - 61811, 61816, 61821, 61826, 61831, 61835, 61840, 61845, 61850, 61855, - 61860, 61864, 61868, 61872, 61876, 61880, 61884, 61888, 61892, 61896, - 61900, 61904, 61908, 61912, 61916, 61921, 61926, 61931, 61936, 61941, - 61946, 61951, 61956, 61961, 61966, 61971, 61976, 61981, 61986, 61992, - 61998, 62003, 62008, 62011, 62014, 62017, 62020, 62023, 62026, 62029, - 62032, 62035, 62039, 62043, 62047, 62051, 62055, 62059, 62063, 62067, - 62071, 62075, 62079, 62083, 62087, 62091, 62095, 62099, 62103, 62107, - 62111, 62115, 62119, 62123, 62127, 62131, 62135, 62139, 62143, 62147, - 62151, 62155, 62159, 62163, 62167, 62171, 62175, 62179, 62183, 62187, - 62191, 62195, 62200, 62205, 62210, 62215, 62219, 62224, 62229, 62234, - 62239, 62244, 62249, 62254, 62259, 62264, 62268, 62275, 62282, 62289, - 62296, 62303, 62310, 62317, 62324, 62331, 62338, 62345, 62352, 62355, - 62358, 62361, 62366, 62369, 62372, 62375, 62378, 62381, 62384, 62388, - 62392, 62396, 62400, 62403, 62407, 62411, 62415, 62419, 62423, 62427, - 62431, 62435, 62438, 62441, 62445, 62449, 62453, 62457, 62460, 62464, - 62468, 62472, 62476, 62479, 62483, 62487, 62491, 62495, 62498, 62502, - 62506, 62509, 62513, 62517, 62521, 62525, 62529, 62533, 62537, 0, 62541, - 62544, 62547, 62550, 62553, 62556, 62559, 62562, 62565, 62568, 62571, - 62574, 62577, 62580, 62583, 62586, 62589, 62592, 62595, 62598, 62601, - 62604, 62607, 62610, 62613, 62616, 62619, 62622, 62625, 62628, 62631, - 62634, 62637, 62640, 62643, 62646, 62649, 62652, 62655, 62658, 62661, - 62664, 62667, 62670, 62673, 62676, 62679, 62682, 62685, 62688, 62691, - 62694, 62697, 62700, 62703, 62706, 62709, 62712, 62715, 62718, 62721, - 62724, 62727, 62730, 62733, 62736, 62739, 62742, 62745, 62748, 62751, - 62754, 62757, 62760, 62763, 62766, 62769, 62772, 62775, 62778, 62781, - 62784, 62787, 62790, 62793, 62796, 62799, 62802, 62805, 62814, 62822, - 62830, 62838, 62846, 62854, 62862, 62870, 62878, 62886, 62895, 62904, - 62913, 62922, 62931, 62940, 62949, 62958, 62967, 62976, 62985, 62994, - 63003, 63012, 63021, 63024, 63027, 63030, 63032, 63035, 63038, 63041, - 63046, 63051, 63054, 63061, 63068, 63075, 63082, 63085, 63090, 63092, - 63096, 63098, 63100, 63103, 63106, 63109, 63112, 63115, 63118, 63121, - 63126, 63131, 63134, 63137, 63140, 63143, 63146, 63149, 63152, 63156, - 63159, 63162, 63165, 63168, 63171, 63175, 63178, 63181, 63184, 63189, - 63194, 63199, 63204, 63209, 63214, 63219, 63224, 63230, 63238, 63240, - 63243, 63246, 63249, 63252, 63258, 63266, 63269, 63272, 63277, 63280, - 63283, 63286, 63291, 63294, 63297, 63302, 63305, 63308, 63313, 63316, - 63319, 63324, 63329, 63334, 63337, 63340, 63343, 63346, 63352, 63355, - 63358, 63361, 63363, 63366, 63369, 63372, 63377, 63380, 63383, 63386, - 63389, 63392, 63397, 63400, 63403, 63406, 63409, 63412, 63415, 63418, - 63421, 63424, 63429, 63433, 63441, 63449, 63457, 63465, 63473, 63481, - 63489, 63497, 63505, 63514, 63523, 63532, 63541, 63550, 63559, 63568, - 63577, 63586, 63595, 63604, 63613, 63622, 63631, 63640, 63649, 63658, - 63667, 63676, 63685, 63694, 63703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63706, 63715, 63724, 63735, 63742, 63747, 63752, 63759, 63766, - 63772, 63777, 63782, 63787, 63792, 63799, 63804, 63809, 63814, 63825, - 63830, 63835, 63842, 63847, 63854, 63859, 63864, 63871, 63878, 63885, - 63894, 63903, 63908, 63913, 63918, 63925, 63930, 63940, 63947, 63952, - 63957, 63962, 63967, 63972, 63977, 63986, 63993, 64000, 64005, 64012, - 64017, 64024, 64033, 64044, 64049, 64058, 64063, 64070, 64079, 64088, - 64093, 64098, 64105, 64111, 64118, 64125, 64129, 64133, 64136, 64140, - 64144, 64148, 64152, 64156, 64160, 64164, 64167, 64171, 64175, 64179, - 64183, 64187, 64191, 64194, 64198, 64202, 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, 64384, 64388, 64392, 64396, 64400, 64404, 64408, 64412, 64416, - 64420, 64424, 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, 64788, 64792, 64796, 64800, 64804, 64808, 64812, 64816, - 64820, 64824, 64828, 64832, 64836, 64840, 64844, 64848, 64852, 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, 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, 65677, 65681, 65685, 65689, 65693, - 65697, 65701, 65705, 65709, 65713, 65717, 65721, 65725, 65729, 65733, - 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, 66172, - 66176, 66180, 66184, 66188, 66192, 66196, 66200, 66204, 66208, 66212, - 66216, 66220, 66224, 66228, 66232, 66236, 66240, 66244, 66248, 66252, - 66256, 66260, 66264, 66268, 66272, 66276, 66280, 66284, 66288, 66292, - 66296, 66300, 66304, 66308, 66312, 66316, 66320, 66324, 66328, 66332, - 66336, 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, 66627, 66631, 66635, 66639, 66643, 66647, 66651, - 66655, 66659, 66663, 66667, 66671, 66675, 66679, 66683, 66687, 66691, - 66695, 66699, 66703, 66707, 66711, 66715, 66719, 66723, 66727, 66731, - 66735, 66739, 66743, 66747, 66751, 66755, 66759, 66763, 66767, 66771, - 66775, 66779, 66783, 66787, 66791, 66795, 66799, 66803, 66807, 66811, - 66815, 66819, 66823, 66827, 66831, 66835, 66839, 66843, 66847, 66851, - 66855, 66859, 66863, 66867, 66871, 66875, 66879, 66883, 66887, 66891, - 66895, 66899, 66903, 66907, 66911, 66915, 66919, 66923, 66927, 66931, - 66935, 66939, 66943, 66947, 66951, 66955, 66959, 66963, 66967, 66971, - 66975, 66979, 66983, 66987, 66991, 66995, 66999, 67003, 67007, 67011, - 67015, 67019, 67023, 67027, 67031, 67035, 67039, 67043, 67047, 67051, - 67055, 67059, 67063, 67067, 67071, 67075, 67079, 67083, 67087, 67091, - 67095, 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, 67230, 67234, 67238, 67242, 67246, 67250, - 67254, 67258, 67261, 67265, 67269, 67273, 67277, 67281, 67285, 67289, - 67293, 67297, 67301, 67305, 67309, 67313, 67317, 67321, 67325, 67329, - 67333, 67337, 67341, 67345, 67349, 67353, 67357, 67361, 67365, 67369, - 67373, 67377, 67381, 67385, 67389, 67393, 67397, 67401, 67405, 67409, - 67413, 67417, 67421, 67425, 67429, 67433, 67437, 67441, 67445, 67449, - 67453, 67457, 67461, 67465, 67469, 67473, 67477, 67481, 67485, 67489, - 67493, 67497, 67501, 67505, 67509, 67513, 67517, 67521, 67525, 67529, - 67533, 67537, 67541, 67545, 67549, 67553, 67557, 67561, 67565, 67569, - 67573, 67577, 67581, 67585, 67589, 67593, 67597, 67601, 67605, 67609, - 67613, 67617, 67621, 67625, 67629, 67633, 67637, 67641, 67645, 67649, - 67653, 67657, 67661, 67665, 67669, 67673, 67677, 67681, 67685, 67689, - 67693, 67697, 67701, 67705, 67709, 67713, 67717, 67721, 67725, 67729, - 67733, 67737, 67741, 67745, 67749, 67753, 67757, 67761, 67765, 67769, - 67773, 67777, 67781, 67785, 67789, 67793, 67797, 67801, 67805, 67809, - 67813, 67817, 67821, 67825, 67829, 67833, 67837, 67841, 67845, 67849, - 67853, 67857, 67861, 67865, 67869, 67873, 67877, 67881, 67885, 67889, - 67893, 67897, 67901, 67905, 67909, 67913, 67917, 67921, 67925, 67929, - 67933, 67937, 67941, 67945, 67949, 67953, 67957, 67961, 67965, 67969, - 67973, 67977, 67981, 67985, 67988, 67992, 67996, 68000, 68004, 68008, - 68012, 68016, 68020, 68024, 68028, 68032, 68036, 68040, 68044, 68048, - 68052, 68056, 68060, 68064, 68068, 68072, 68076, 68080, 68084, 68088, - 68092, 68096, 68100, 68104, 68108, 68112, 68116, 68120, 68124, 68128, - 68132, 68136, 68140, 68144, 68148, 68152, 68156, 68160, 68164, 68168, - 68172, 68176, 68180, 68184, 68188, 68192, 68196, 68200, 68204, 68208, - 68212, 68216, 68220, 68224, 68228, 68232, 68236, 68240, 68244, 68248, - 68252, 68256, 68260, 68264, 68268, 68272, 68276, 68280, 68284, 68288, - 68292, 68296, 68300, 68304, 68308, 68312, 68316, 68320, 68324, 68328, - 68332, 68336, 68340, 68344, 68348, 68352, 68356, 68360, 68364, 68368, - 68372, 68376, 68380, 68384, 68388, 68392, 68396, 68400, 68404, 68408, - 68412, 68416, 68420, 68424, 68428, 68432, 68436, 68440, 68444, 68448, - 68452, 68456, 68460, 68464, 68468, 68472, 68476, 68480, 68484, 68488, - 68492, 68496, 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, 68648, - 68652, 68656, 68660, 68664, 68668, 68672, 68676, 68680, 68684, 68688, - 68692, 68696, 68700, 68704, 68708, 68712, 68716, 68720, 68724, 68728, - 68732, 68736, 68740, 68744, 68748, 68752, 68756, 68760, 68764, 68768, 0, - 0, 0, 68772, 68776, 68780, 68784, 68788, 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, 68944, 68948, 68952, 68956, 68960, 68964, - 68968, 68972, 68976, 68980, 68984, 68988, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 68992, 68997, 69001, 69006, 69011, 69016, 69021, 69026, 69030, 69035, - 69040, 69045, 69050, 69055, 69060, 69065, 69069, 69073, 69078, 69082, - 69087, 69092, 69097, 69101, 69106, 69111, 69116, 69121, 69126, 69130, - 69135, 69139, 69144, 69148, 69153, 69157, 69161, 69165, 69170, 69175, - 69180, 69188, 69196, 69204, 69212, 69219, 69227, 69233, 69241, 69245, - 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277, 69281, 69285, - 69289, 69293, 69297, 69301, 69305, 69309, 69313, 69317, 69321, 69325, - 69329, 69333, 69337, 69341, 69345, 69349, 69353, 69357, 69361, 69365, - 69369, 69373, 69377, 69381, 69385, 69388, 69392, 69396, 69400, 69404, - 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436, 69440, 69444, - 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69476, 69480, 69484, - 69488, 69492, 69496, 69500, 69504, 69508, 69512, 69516, 69520, 69524, - 69528, 69532, 69535, 69539, 69543, 69546, 69550, 69554, 69558, 69561, - 69565, 69569, 69573, 69577, 69581, 69585, 69589, 69593, 69597, 69601, - 69605, 69609, 69613, 69617, 69620, 69624, 69628, 69631, 69635, 69639, - 69643, 69647, 69651, 69655, 69658, 69661, 69665, 69669, 69673, 69676, - 69679, 69683, 69687, 69691, 69695, 69699, 69703, 69707, 69711, 69715, - 69719, 69723, 69727, 69731, 69735, 69739, 69743, 69747, 69751, 69755, - 69759, 69763, 69767, 69771, 69775, 69779, 69783, 69787, 69791, 69795, - 69799, 69803, 69807, 69811, 69815, 69819, 69823, 69827, 69830, 69834, - 69838, 69842, 69846, 69850, 69854, 69858, 69862, 69866, 69870, 69874, - 69878, 69882, 69886, 69890, 69894, 69898, 69902, 69906, 69910, 69914, - 69918, 69922, 69926, 69930, 69934, 69938, 69942, 69946, 69950, 69954, - 69958, 69962, 69966, 69970, 69974, 69977, 69981, 69985, 69989, 69993, - 69997, 70001, 70005, 70009, 70013, 70017, 70021, 70025, 70029, 70033, - 70037, 70041, 70044, 70048, 70052, 70056, 70060, 70064, 70068, 70072, - 70076, 70080, 70084, 70088, 70092, 70096, 70100, 70104, 70108, 70112, - 70116, 70120, 70124, 70128, 70131, 70135, 70139, 70143, 70147, 70151, - 70155, 70159, 70163, 70167, 70171, 70175, 70179, 70183, 70187, 70191, - 70195, 70199, 70203, 70207, 70211, 70215, 70219, 70223, 70227, 70231, - 70235, 70239, 70243, 70247, 70251, 70255, 70259, 70263, 70267, 70271, - 70275, 70279, 70283, 70287, 70291, 70295, 70299, 70303, 70306, 70311, - 70315, 70321, 70326, 70332, 70336, 70340, 70344, 70348, 70352, 70356, - 70360, 70364, 70368, 70372, 70376, 70380, 70384, 70388, 70391, 70394, - 70397, 70400, 70403, 70406, 70409, 70412, 70415, 70420, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70426, 70431, 70436, 70441, - 70446, 70453, 70460, 70465, 70470, 70475, 70480, 70487, 70494, 70501, - 70508, 70515, 70522, 70532, 70542, 70549, 70556, 70563, 70570, 70576, - 70582, 70591, 70600, 70607, 70614, 70625, 70636, 70641, 70646, 70653, - 70660, 70667, 70674, 70681, 70688, 70695, 70702, 70708, 70714, 70720, - 70726, 70733, 70740, 70745, 70749, 70756, 70763, 70770, 70774, 70781, - 70785, 70790, 70794, 70800, 70805, 70811, 70816, 70820, 70824, 70827, - 70830, 70835, 70840, 70845, 70850, 70855, 70860, 70865, 70870, 70875, - 70880, 70889, 70898, 70903, 70908, 70913, 70918, 70923, 70928, 70933, - 70938, 70943, 70948, 70953, 0, 0, 0, 0, 0, 0, 0, 70958, 70964, 70967, - 70970, 70973, 70977, 70981, 70985, 70989, 70992, 70996, 70999, 71003, - 71006, 71010, 71014, 71018, 71022, 71026, 71030, 71034, 71037, 71041, - 71045, 71049, 71053, 71057, 71061, 71065, 71069, 71073, 71077, 71081, - 71085, 71089, 71093, 71096, 71100, 71104, 71108, 71112, 71116, 71120, - 71124, 71128, 71132, 71136, 71140, 71144, 71148, 71152, 71156, 71160, - 71164, 71168, 71172, 71176, 71180, 71184, 71188, 71192, 71195, 71199, - 71203, 71207, 71211, 71215, 71219, 71223, 71226, 71230, 71234, 71238, - 71242, 71246, 71250, 71254, 71258, 71262, 71266, 71270, 71274, 71279, - 71284, 71287, 71292, 71295, 71298, 71301, 0, 0, 0, 0, 0, 0, 0, 0, 71305, - 71314, 71323, 71332, 71341, 71350, 71359, 71368, 71377, 71385, 71392, - 71400, 71407, 71415, 71425, 71434, 71444, 71453, 71463, 71471, 71478, - 71486, 71493, 71501, 71506, 71511, 71516, 71525, 71531, 71537, 71544, - 71553, 71561, 71569, 71577, 71584, 71591, 71598, 71605, 71610, 71615, - 71620, 71625, 71630, 71635, 71640, 71645, 71653, 71661, 71667, 71673, - 71678, 71683, 71688, 71693, 71698, 71703, 71708, 71713, 71721, 71729, - 71734, 71739, 71749, 71759, 71766, 71773, 71782, 71791, 71803, 71815, - 71821, 71827, 71835, 71843, 71853, 71863, 71870, 71877, 71882, 71887, - 71899, 71911, 71919, 71927, 71937, 71947, 71959, 71971, 71980, 71989, - 71996, 72003, 72010, 72017, 72026, 72035, 72040, 72045, 72052, 72059, - 72066, 72073, 72085, 72097, 72102, 72107, 72112, 72117, 72122, 72127, - 72132, 72137, 72141, 72146, 72151, 72156, 72161, 72166, 72172, 72177, - 72182, 72189, 72196, 72203, 72210, 72217, 72226, 72235, 72241, 72247, - 72253, 72259, 72266, 72273, 72280, 72287, 72294, 72298, 72305, 72310, - 72315, 72322, 0, 72335, 72343, 72351, 72358, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 72365, 72374, 72383, 72392, 72401, 72410, 72419, 72428, 72437, - 72446, 72455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 72462, 72469, 72475, 72482, 72490, 72498, - 72505, 72513, 72520, 72526, 72532, 72539, 72545, 72551, 72557, 72564, - 72571, 72578, 72585, 72592, 72599, 72606, 72613, 72620, 72627, 72634, - 72641, 72648, 72655, 72661, 72668, 72675, 72682, 72689, 72696, 72703, - 72710, 72717, 72724, 72731, 72738, 72745, 72752, 72759, 72766, 72773, - 72780, 72787, 72795, 72803, 72811, 72819, 0, 0, 0, 0, 72827, 72836, - 72845, 72854, 72863, 72872, 72881, 72888, 72895, 72902, 0, 0, 0, 0, 0, 0, - 72909, 72913, 72918, 72923, 72928, 72933, 72938, 72943, 72948, 72953, - 72958, 72963, 72967, 72971, 72976, 72981, 72985, 72990, 72995, 73000, - 73005, 73010, 73015, 73020, 73024, 73028, 73033, 73038, 73042, 73046, - 73050, 73054, 73058, 73062, 73066, 73071, 73076, 73081, 73086, 73091, - 73098, 73104, 73109, 73114, 73119, 73124, 73130, 73137, 73143, 73150, - 73156, 73162, 73167, 73174, 73180, 73185, 0, 0, 0, 0, 0, 0, 0, 0, 73191, - 73195, 73199, 73202, 73206, 73209, 73213, 73216, 73220, 73224, 73229, - 73233, 73238, 73241, 73245, 73249, 73252, 73256, 73260, 73263, 73267, - 73271, 73275, 73279, 73283, 73287, 73291, 73295, 73299, 73303, 73307, - 73311, 73315, 73319, 73323, 73327, 73331, 73335, 73338, 73341, 73345, - 73349, 73353, 73356, 73359, 73362, 73366, 73370, 73374, 73378, 73381, - 73384, 73388, 73393, 73398, 73402, 73407, 73411, 73416, 73421, 73427, - 73432, 73438, 73442, 73447, 73452, 73456, 73461, 73466, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 73470, 73473, 73477, 73481, 73484, 73487, 73490, 73493, 73496, - 73499, 73502, 73505, 0, 0, 0, 0, 0, 0, 73508, 73513, 73517, 73521, 73525, - 73529, 73533, 73537, 73541, 73545, 73549, 73553, 73557, 73561, 73565, - 73569, 73573, 73578, 73583, 73589, 73595, 73602, 73607, 73612, 73618, - 73622, 73627, 73630, 0, 0, 0, 0, 73633, 73640, 73646, 73652, 73658, - 73664, 73670, 73676, 73682, 73688, 73694, 73700, 73707, 73714, 73721, - 73727, 73734, 73741, 73748, 73755, 73762, 73768, 73774, 73781, 73787, - 73794, 73801, 73807, 73813, 73820, 73827, 73834, 73840, 73847, 73854, - 73860, 73867, 73873, 73880, 73887, 73893, 73899, 73906, 73912, 73919, - 73926, 73935, 73942, 73949, 73953, 73958, 73963, 73968, 73973, 73977, - 73981, 73986, 73990, 73995, 74000, 74005, 74009, 74013, 74018, 74022, - 74027, 74031, 74036, 74041, 74046, 74051, 74055, 74060, 74065, 74070, - 74076, 74081, 74087, 74093, 74099, 74105, 74111, 74116, 74122, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 74126, 74131, 74135, 74139, 74143, 74147, 74151, - 74155, 74159, 74163, 74167, 74171, 74175, 74179, 74183, 74187, 74191, - 74195, 74199, 74203, 74207, 74211, 74215, 74219, 74223, 74227, 74231, - 74235, 74239, 74243, 0, 0, 0, 74247, 74251, 74255, 74259, 74263, 74266, - 74272, 74275, 74279, 74282, 74288, 74294, 74302, 74305, 74309, 74312, - 74315, 74321, 74327, 74331, 74337, 74341, 74345, 74351, 74355, 74361, - 74367, 74371, 74375, 74381, 74385, 74391, 74397, 74401, 74407, 74411, - 74417, 74420, 74423, 74429, 74433, 74439, 74442, 74445, 74448, 74454, - 74458, 74462, 74468, 74474, 74477, 74480, 74486, 74491, 74496, 74501, - 74508, 74513, 74520, 74525, 74532, 74537, 74542, 74547, 74552, 74555, - 74559, 74563, 74568, 74573, 74578, 74583, 74588, 74593, 74598, 74603, - 74610, 74615, 0, 74622, 74625, 74629, 74632, 74635, 74638, 74641, 74644, - 74647, 74650, 74653, 0, 0, 0, 0, 74656, 74663, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 74668, 74671, 74674, 74677, 74680, 74684, 74687, 74690, 74694, 74698, - 74702, 74706, 74710, 74714, 74718, 74722, 74726, 74730, 74734, 74738, - 74742, 74746, 74750, 74754, 74758, 74761, 74765, 74768, 74772, 74776, - 74780, 74784, 74788, 74791, 74795, 74798, 74801, 74805, 74809, 74813, - 74816, 74819, 74824, 74828, 74833, 74838, 74842, 74847, 74851, 74856, - 74861, 74866, 74870, 74874, 74879, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74884, - 74889, 74894, 74899, 74905, 74910, 74915, 74920, 74925, 74930, 74934, - 74938, 74943, 74948, 0, 0, 74954, 74958, 74961, 74964, 74967, 74970, - 74973, 74976, 74979, 74982, 0, 0, 74985, 74990, 74995, 75001, 75008, - 75014, 75020, 75026, 75032, 75038, 75044, 75050, 75056, 75062, 75068, - 75074, 75079, 75084, 75089, 75095, 75101, 75108, 75114, 75120, 75125, - 75132, 75139, 75146, 75152, 75157, 75162, 75167, 0, 0, 0, 0, 75175, - 75181, 75187, 75193, 75199, 75205, 75211, 75217, 75223, 75229, 75235, - 75241, 75247, 75253, 75259, 75265, 75271, 75277, 75283, 75289, 75295, - 75300, 75305, 75311, 75317, 75323, 75329, 75335, 75341, 75347, 75353, - 75359, 75365, 75371, 75377, 75383, 75389, 75395, 75401, 75407, 75413, - 75419, 75425, 75431, 75437, 75443, 75449, 75454, 75459, 75465, 75470, - 75474, 75479, 75483, 75487, 75491, 75497, 75502, 75507, 75512, 75517, - 75522, 75527, 75532, 75539, 75546, 75553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75560, 75565, 75570, 75575, - 75582, 75589, 75593, 75597, 75602, 75607, 75612, 75617, 75622, 75627, - 75632, 75637, 75642, 75648, 75654, 75660, 75666, 75672, 75676, 75682, - 75686, 75692, 75699, 75705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75709, 75713, - 75717, 75721, 75725, 75729, 0, 0, 75733, 75737, 75741, 75745, 75749, - 75753, 0, 0, 75757, 75761, 75765, 75769, 75773, 75777, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 75781, 75785, 75789, 75793, 75797, 75801, 75805, 0, 75809, - 75813, 75817, 75821, 75825, 75829, 75833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75837, 75842, 75847, 75852, - 75857, 75861, 75865, 75870, 75875, 75880, 75885, 75890, 75895, 75900, - 75905, 75910, 75914, 75919, 75924, 75929, 75934, 75939, 75944, 75949, - 75954, 75959, 75964, 75969, 75976, 75983, 75990, 75997, 76004, 76011, - 76018, 76025, 76031, 76037, 76043, 76049, 76055, 76061, 76067, 76073, - 76077, 76083, 0, 0, 76089, 76094, 76098, 76102, 76106, 76110, 76114, - 76118, 76122, 76126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76130, 76134, 76138, 76142, 76146, - 76150, 76154, 76158, 76162, 76166, 76170, 76174, 76178, 76182, 76186, - 76190, 76194, 76198, 76202, 76206, 76210, 76214, 76218, 0, 0, 0, 0, - 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, 0, 0, 0, - 0, 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, 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, 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, 77394, 77398, 77402, 77406, 77410, 77414, - 77418, 77422, 77426, 77430, 77434, 77438, 77442, 77446, 77450, 77454, - 77458, 77462, 77466, 77470, 77474, 77478, 77482, 77486, 77490, 77494, - 77498, 77502, 77506, 77510, 77514, 77518, 77522, 77526, 77530, 77534, - 77538, 77542, 77546, 77550, 77554, 77558, 77562, 77566, 77570, 77574, - 77578, 77582, 77586, 77590, 77594, 77598, 77602, 77606, 77610, 77614, - 77618, 77622, 77626, 77630, 77634, 77638, 77642, 77646, 77650, 77654, - 77658, 77662, 77666, 77670, 77674, 77678, 77682, 77686, 77690, 77694, - 77698, 77702, 77706, 77710, 77714, 77718, 77722, 77726, 77730, 77734, - 77738, 77742, 77746, 77750, 77754, 77758, 77762, 77766, 77770, 77774, - 77778, 77782, 77786, 77790, 77794, 77798, 77802, 77806, 77810, 77814, - 77818, 77822, 77826, 77830, 77834, 77838, 77842, 77846, 77850, 77854, - 77858, 77862, 77866, 77870, 77874, 77878, 0, 0, 77882, 77886, 77890, - 77894, 77898, 77902, 77906, 77910, 77914, 77918, 77922, 77926, 77930, - 77934, 77938, 77942, 77946, 77950, 77954, 77958, 77962, 77966, 77970, - 77974, 77978, 77982, 77986, 77990, 77994, 77998, 78002, 78006, 78010, - 78014, 78018, 78022, 78026, 78030, 78034, 78038, 78042, 78046, 78050, - 78054, 78058, 78062, 78066, 78070, 78074, 78078, 78082, 78086, 78090, - 78094, 78098, 78102, 78106, 78110, 78114, 78118, 78122, 78126, 78130, - 78134, 78138, 78142, 78146, 78150, 78154, 78158, 78162, 78166, 78170, - 78174, 78178, 78182, 78186, 78190, 78194, 78198, 78202, 78206, 78210, - 78214, 78218, 78222, 78226, 78230, 78234, 78238, 78242, 78246, 78250, - 78254, 78258, 78262, 78266, 78270, 78274, 78278, 78282, 78286, 78290, - 78294, 78298, 78302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78306, - 78311, 78316, 78321, 78326, 78331, 78339, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 78344, 78351, 78358, 78365, 78372, 0, 0, 0, 0, 0, 78379, 78386, - 78393, 78403, 78409, 78415, 78421, 78427, 78433, 78439, 78446, 78452, - 78458, 78464, 78473, 78482, 78494, 78506, 78512, 78518, 78524, 78531, - 78538, 78545, 78552, 78559, 0, 78566, 78573, 78580, 78588, 78595, 0, - 78602, 0, 78609, 78616, 0, 78623, 78631, 0, 78638, 78645, 78652, 78659, - 78666, 78673, 78680, 78687, 78694, 78701, 78706, 78713, 78720, 78726, - 78732, 78738, 78744, 78750, 78756, 78762, 78768, 78774, 78780, 78786, - 78792, 78798, 78804, 78810, 78816, 78822, 78828, 78834, 78840, 78846, - 78852, 78858, 78864, 78870, 78876, 78882, 78888, 78894, 78900, 78906, - 78912, 78918, 78924, 78930, 78936, 78942, 78948, 78954, 78960, 78966, - 78972, 78978, 78984, 78990, 78996, 79002, 79008, 79014, 79020, 79026, - 79032, 79038, 79044, 79050, 79056, 79062, 79068, 79074, 79080, 79086, - 79092, 79098, 79104, 79110, 79116, 79122, 79128, 79134, 79140, 79146, - 79152, 79158, 79164, 79170, 79176, 79184, 79192, 79198, 79204, 79210, - 79216, 79225, 79234, 79242, 79250, 79258, 79266, 79274, 79282, 79290, - 79298, 79305, 79312, 79322, 79332, 79336, 79340, 79345, 79350, 79355, - 79360, 79369, 79378, 79384, 79390, 79397, 79404, 79411, 79415, 79421, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79427, 79433, 79439, - 79445, 79451, 79456, 79461, 79467, 79473, 79479, 79485, 79493, 79499, - 79505, 79513, 79521, 79529, 79537, 79542, 79547, 79552, 79557, 79570, - 79583, 79593, 79603, 79614, 79625, 79636, 79647, 79657, 79667, 79678, - 79689, 79700, 79711, 79721, 79731, 79741, 79757, 79773, 79789, 79796, - 79803, 79810, 79817, 79827, 79837, 79847, 79859, 79869, 79877, 79885, - 79894, 79902, 79912, 79920, 79928, 79936, 79945, 79953, 79963, 79971, - 79979, 79987, 79997, 80005, 80012, 80019, 80026, 80033, 80041, 80049, - 80057, 80065, 80073, 80082, 80090, 80098, 80106, 80114, 80122, 80131, - 80139, 80147, 80155, 80163, 80171, 80179, 80187, 80195, 80203, 80211, - 80220, 80228, 80238, 80246, 80254, 80262, 80272, 80280, 80288, 80296, - 80304, 80313, 80322, 80330, 80340, 80348, 80356, 80364, 80373, 80381, - 80391, 80399, 80406, 80413, 80421, 80428, 80437, 80444, 80452, 80460, - 80469, 80477, 80487, 80495, 80503, 80511, 80521, 80529, 80536, 80543, - 80551, 80558, 80567, 80574, 80584, 80594, 80605, 80614, 80623, 80632, - 80641, 80650, 80660, 80671, 80682, 80692, 80703, 80715, 80725, 80734, - 80743, 80751, 80760, 80770, 80778, 80787, 80796, 80804, 80813, 80823, - 80831, 80840, 80849, 80857, 80866, 80876, 80884, 80894, 80902, 80912, - 80920, 80928, 80937, 80945, 80955, 80963, 80971, 80981, 80989, 80996, - 81003, 81012, 81021, 81029, 81038, 81048, 81056, 81067, 81075, 81083, - 81090, 81098, 81107, 81114, 81124, 81134, 81145, 81155, 81166, 81174, - 81182, 81191, 81199, 81208, 81216, 81224, 81233, 81241, 81250, 81258, - 81265, 81272, 81279, 81286, 81294, 81302, 81310, 81318, 81327, 81335, - 81343, 81352, 81360, 81368, 81376, 81385, 81393, 81401, 81409, 81417, - 81425, 81433, 81441, 81449, 81457, 81466, 81474, 81482, 81490, 81498, - 81506, 81515, 81524, 81532, 81540, 81548, 81557, 81565, 81574, 81581, - 81588, 81596, 81603, 81611, 81619, 81628, 81636, 81645, 81653, 81661, - 81671, 81678, 81685, 81693, 81700, 81708, 81718, 81729, 81737, 81746, - 81754, 81763, 81771, 81780, 81788, 81797, 81805, 81814, 81823, 81831, - 81839, 81847, 81856, 81863, 81871, 81880, 81889, 81898, 81908, 81916, - 81926, 81934, 81944, 81952, 81962, 81970, 81980, 81988, 81997, 82004, - 82013, 82020, 82030, 82038, 82048, 82056, 82066, 82074, 82082, 82090, - 82099, 82107, 82116, 82125, 82134, 82143, 82153, 82161, 82171, 82179, - 82189, 82197, 82207, 82215, 82225, 82233, 82242, 82249, 82258, 82265, - 82275, 82283, 82293, 82301, 82311, 82319, 82327, 82335, 82344, 82352, - 82361, 82370, 82379, 82388, 82396, 82404, 82413, 82421, 82430, 82439, - 82447, 82455, 82463, 82472, 82480, 82488, 82497, 82505, 82513, 82521, - 82529, 82534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82539, - 82549, 82559, 82569, 82579, 82590, 82600, 82610, 82621, 82630, 82639, - 82648, 82659, 82669, 82679, 82691, 82701, 82711, 82721, 82731, 82741, - 82751, 82761, 82771, 82781, 82791, 82801, 82812, 82823, 82833, 82843, - 82855, 82866, 82877, 82887, 82897, 82907, 82917, 82927, 82937, 82947, - 82959, 82969, 82979, 82991, 83002, 83013, 83023, 83033, 83043, 83053, - 83065, 83075, 83085, 83096, 83107, 83117, 83127, 83136, 83145, 83154, - 83163, 83172, 83182, 0, 0, 83192, 83202, 83212, 83222, 83232, 83244, - 83254, 83264, 83276, 83286, 83298, 83307, 83316, 83327, 83337, 83349, - 83360, 83373, 83383, 83395, 83404, 83415, 83426, 83439, 83449, 83459, - 83469, 83479, 83489, 83498, 83507, 83516, 83525, 83535, 83545, 83555, - 83565, 83575, 83585, 83595, 83605, 83615, 83625, 83635, 83645, 83654, - 83663, 83672, 83682, 83692, 83702, 83712, 83722, 83733, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83743, 83758, 83773, 83779, 83785, 83791, - 83797, 83803, 83809, 83815, 83821, 83829, 83833, 83836, 0, 0, 83844, - 83847, 83850, 83853, 83856, 83859, 83862, 83865, 83868, 83871, 83874, - 83877, 83880, 83883, 83886, 83889, 83892, 83900, 83909, 83920, 83928, - 83936, 83945, 83954, 83965, 83977, 0, 0, 0, 0, 0, 0, 83986, 83991, 83996, - 84003, 84010, 84016, 84022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84027, 84037, - 84047, 84057, 84066, 84077, 84086, 84095, 84105, 84115, 84127, 84139, - 84150, 84161, 84172, 84183, 84193, 84203, 84213, 84223, 84234, 84245, - 84249, 84254, 84263, 84272, 84276, 84280, 84284, 84289, 84294, 84299, - 84304, 84307, 84311, 0, 84316, 84319, 84322, 84326, 84330, 84335, 84339, - 84343, 84348, 84353, 84360, 84367, 84370, 84373, 84376, 84379, 84382, - 84386, 84390, 0, 84394, 84399, 84403, 84407, 0, 0, 0, 0, 84412, 84417, - 84424, 84429, 84434, 0, 84439, 84444, 84449, 84454, 84459, 84464, 84469, - 84474, 84479, 84484, 84489, 84494, 84503, 84512, 84520, 84528, 84537, - 84546, 84555, 84564, 84572, 84580, 84588, 84596, 84601, 84606, 84612, - 84618, 84624, 84630, 84638, 84646, 84652, 84658, 84664, 84670, 84676, - 84682, 84688, 84694, 84699, 84704, 84709, 84714, 84719, 84724, 84729, - 84734, 84740, 84746, 84752, 84758, 84764, 84770, 84776, 84782, 84788, - 84794, 84800, 84806, 84812, 84818, 84824, 84830, 84836, 84842, 84848, - 84854, 84860, 84866, 84872, 84878, 84884, 84890, 84896, 84902, 84908, - 84914, 84920, 84926, 84932, 84938, 84944, 84950, 84956, 84962, 84968, - 84974, 84980, 84986, 84992, 84998, 85004, 85010, 85016, 85022, 85028, - 85034, 85040, 85046, 85052, 85058, 85064, 85070, 85076, 85082, 85088, - 85094, 85099, 85104, 85109, 85114, 85120, 85126, 85132, 85138, 85144, - 85150, 85156, 85162, 85168, 85174, 85181, 85188, 85193, 85198, 85203, - 85208, 85220, 85232, 85243, 85254, 85266, 85278, 85286, 0, 0, 85294, 0, - 85302, 85306, 85310, 85313, 85317, 85321, 85324, 85327, 85331, 85335, - 85338, 85341, 85344, 85347, 85352, 85355, 85359, 85362, 85365, 85368, - 85371, 85374, 85377, 85380, 85383, 85386, 85389, 85392, 85396, 85400, - 85404, 85408, 85413, 85418, 85424, 85430, 85436, 85441, 85447, 85453, - 85459, 85464, 85470, 85476, 85481, 85486, 85492, 85497, 85503, 85509, - 85514, 85520, 85526, 85531, 85537, 85543, 85549, 85555, 85561, 85565, - 85570, 85574, 85579, 85583, 85588, 85593, 85599, 85605, 85611, 85616, - 85622, 85628, 85634, 85639, 85645, 85651, 85656, 85661, 85667, 85672, - 85678, 85684, 85689, 85695, 85701, 85706, 85712, 85718, 85724, 85730, - 85736, 85741, 85745, 85750, 85752, 85757, 85762, 85768, 85773, 85778, - 85782, 85788, 85793, 85798, 85803, 85808, 85813, 85818, 85823, 85829, - 85835, 85841, 85849, 85853, 85857, 85861, 85865, 85869, 85873, 85878, - 85883, 85888, 85893, 85897, 85902, 85907, 85912, 85917, 85922, 85927, - 85932, 85937, 85941, 85945, 85950, 85955, 85960, 85965, 85969, 85974, - 85979, 85984, 85989, 85993, 85998, 86003, 86008, 86013, 86017, 86022, - 86027, 86031, 86036, 86041, 86046, 86051, 86056, 86061, 86068, 86075, - 86079, 86084, 86089, 86094, 86099, 86104, 86109, 86114, 86119, 86124, - 86129, 86134, 86139, 86144, 86149, 86154, 86159, 86164, 86169, 86174, - 86179, 86184, 86189, 86194, 86199, 86204, 86209, 86214, 86219, 86224, 0, - 0, 0, 86229, 86233, 86238, 86242, 86247, 86252, 0, 0, 86256, 86261, - 86266, 86270, 86275, 86280, 0, 0, 86285, 86290, 86294, 86299, 86304, - 86309, 0, 0, 86314, 86319, 86324, 0, 0, 0, 86328, 86332, 86336, 86340, - 86343, 86347, 86351, 0, 86355, 86361, 86364, 86368, 86371, 86375, 86379, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86383, 86389, 86395, 86401, 86407, 0, 0, - 86411, 86417, 86423, 86429, 86435, 86441, 86448, 86455, 86462, 86469, - 86476, 86483, 0, 86490, 86497, 86504, 86510, 86517, 86524, 86531, 86538, - 86544, 86551, 86558, 86565, 86572, 86578, 86585, 86592, 86599, 86606, - 86612, 86619, 86626, 86633, 86640, 86647, 86654, 86661, 0, 86668, 86674, - 86681, 86688, 86695, 86702, 86708, 86715, 86722, 86729, 86736, 86743, - 86750, 86757, 86763, 86770, 86777, 86784, 86791, 0, 86798, 86805, 0, - 86812, 86819, 86826, 86833, 86840, 86847, 86854, 86861, 86868, 86875, - 86882, 86889, 86896, 86903, 86910, 0, 0, 86916, 86921, 86926, 86931, - 86936, 86941, 86946, 86951, 86956, 86961, 86966, 86971, 86976, 86981, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 86986, 86993, 87000, 87007, 87014, 87021, - 87028, 87035, 87042, 87049, 87056, 87063, 87070, 87077, 87084, 87091, - 87098, 87105, 87112, 87119, 87127, 87135, 87142, 87149, 87154, 87162, - 87170, 87177, 87184, 87189, 87196, 87201, 87206, 87213, 87218, 87223, - 87228, 87236, 87241, 87246, 87253, 87258, 87263, 87270, 87277, 87282, - 87287, 87292, 87297, 87302, 87307, 87312, 87317, 87322, 87329, 87334, - 87341, 87346, 87351, 87356, 87361, 87366, 87371, 87376, 87381, 87386, - 87391, 87396, 87403, 87410, 87417, 87424, 87430, 87435, 87442, 87447, - 87452, 87461, 87468, 87477, 87484, 87489, 87494, 87502, 87507, 87512, - 87517, 87522, 87527, 87534, 87539, 87544, 87549, 87554, 87559, 87566, - 87573, 87580, 87587, 87594, 87601, 87608, 87615, 87622, 87629, 87636, - 87643, 87650, 87657, 87664, 87671, 87678, 87685, 87692, 87699, 87706, - 87713, 87720, 87727, 87734, 87741, 87748, 87755, 0, 0, 0, 0, 0, 87762, - 87770, 87778, 0, 0, 0, 0, 87783, 87787, 87791, 87795, 87799, 87803, - 87807, 87811, 87815, 87819, 87824, 87829, 87834, 87839, 87844, 87849, - 87854, 87859, 87864, 87870, 87876, 87882, 87889, 87896, 87903, 87910, - 87917, 87924, 87930, 87936, 87942, 87949, 87956, 87963, 87970, 87977, - 87984, 87991, 87998, 88005, 88012, 88019, 88026, 88033, 88040, 0, 0, 0, - 88047, 88055, 88063, 88071, 88079, 88087, 88097, 88107, 88115, 88123, - 88131, 88139, 88147, 88153, 88160, 88169, 88178, 88187, 88196, 88205, - 88214, 88224, 88235, 88245, 88256, 88265, 88274, 88283, 88293, 88304, - 88314, 88325, 88336, 88345, 88353, 88359, 88365, 88371, 88377, 88385, - 88393, 88399, 88406, 88416, 88423, 88430, 88437, 88444, 88451, 88461, - 88468, 88475, 88483, 88491, 88500, 88509, 88518, 88527, 88536, 88544, - 88553, 88562, 88571, 88575, 88582, 88587, 88592, 88596, 88600, 88604, - 88608, 88613, 88618, 88624, 88630, 88634, 88640, 88644, 88648, 88652, - 88656, 88660, 88664, 88670, 0, 0, 0, 0, 0, 88674, 88679, 88684, 88689, - 88694, 88701, 88706, 88711, 88716, 88721, 88726, 88731, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88736, - 88743, 88752, 88761, 88768, 88775, 88782, 88789, 88796, 88803, 88809, - 88816, 88823, 88830, 88837, 88844, 88851, 88858, 88865, 88874, 88881, - 88888, 88895, 88902, 88909, 88916, 88923, 88930, 88939, 88946, 88953, - 88960, 88967, 88974, 88981, 88990, 88997, 89004, 89011, 89018, 89027, - 89034, 89041, 89048, 89056, 89065, 0, 0, 89074, 89078, 89082, 89087, - 89092, 89097, 89102, 89106, 89111, 89116, 89121, 89126, 89131, 89136, - 89140, 89144, 89149, 89154, 89159, 89163, 89168, 89173, 89177, 89182, - 89187, 89192, 89197, 89202, 89207, 0, 0, 0, 89212, 89216, 89221, 89226, - 89230, 89235, 89239, 89244, 89249, 89254, 89259, 89263, 89267, 89272, - 89277, 89282, 89287, 89292, 89297, 89301, 89306, 89311, 89316, 89321, - 89326, 89331, 89335, 89339, 89344, 89349, 89354, 89359, 89364, 89369, - 89374, 89379, 89384, 89389, 89394, 89399, 89404, 89409, 89414, 89419, - 89424, 89429, 89434, 89439, 89444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89449, 89453, 89458, 89463, 89468, 89472, - 89477, 89482, 89487, 89492, 89496, 89500, 89505, 89510, 89515, 89520, - 89524, 89529, 89534, 89539, 89544, 89549, 89554, 89558, 89563, 89568, - 89573, 89578, 89583, 89588, 89593, 0, 89598, 89603, 89608, 89614, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 89757, 89762, 89767, 89772, 89777, 89782, 89787, - 89792, 89797, 89802, 89807, 89812, 89817, 89822, 89827, 89832, 89837, - 89842, 89847, 89852, 89857, 89862, 89867, 89872, 89877, 89882, 89887, - 89891, 89895, 89899, 0, 89904, 89910, 89915, 89920, 89925, 89930, 89936, - 89942, 89948, 89954, 89960, 89966, 89972, 89978, 89984, 89990, 89996, - 90002, 90008, 90013, 90019, 90025, 90030, 90036, 90041, 90047, 90053, - 90058, 90064, 90070, 90075, 90081, 90087, 90092, 90098, 90104, 90110, 0, - 0, 0, 0, 90115, 90121, 90127, 90133, 90139, 90145, 90151, 90157, 90163, - 90170, 90175, 90180, 90186, 90192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 90198, 90203, 90208, 90213, 90219, 90224, 90230, 90236, - 90242, 90248, 90255, 90261, 90268, 90273, 90278, 90283, 90288, 90293, - 90298, 90303, 90308, 90313, 90318, 90323, 90328, 90333, 90338, 90343, - 90348, 90353, 90358, 90363, 90368, 90373, 90378, 90383, 90388, 90393, - 90398, 90403, 90408, 90413, 90418, 90423, 90429, 90434, 90440, 90446, - 90452, 90458, 90465, 90471, 90478, 90483, 90488, 90493, 90498, 90503, - 90508, 90513, 90518, 90523, 90528, 90533, 90538, 90543, 90548, 90553, - 90558, 90563, 90568, 90573, 90578, 90583, 90588, 90593, 90598, 90603, - 90608, 90613, 90618, 90623, 90628, 90633, 90638, 90643, 90648, 90653, - 90658, 90663, 90668, 90673, 90678, 90683, 90688, 90693, 90698, 90703, - 90708, 90713, 90718, 90723, 90728, 90733, 90738, 90743, 90748, 90753, - 90758, 90763, 90768, 90773, 90778, 90783, 90788, 90793, 90798, 90803, - 90808, 90813, 90818, 90823, 90828, 90833, 90838, 90843, 90848, 90853, - 90858, 90863, 90868, 90873, 90878, 90883, 90888, 90893, 90897, 90901, - 90906, 90911, 90916, 90921, 90926, 90931, 90936, 90941, 90946, 90951, - 90956, 90960, 90964, 90968, 90972, 90976, 90980, 90984, 90989, 90994, 0, - 0, 90999, 91004, 91008, 91012, 91016, 91020, 91024, 91028, 91032, 91036, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91040, 91044, 91048, 91052, - 91056, 91060, 0, 0, 91065, 0, 91070, 91074, 91079, 91084, 91089, 91094, - 91099, 91104, 91109, 91114, 91119, 91123, 91128, 91133, 91138, 91143, - 91147, 91152, 91157, 91162, 91167, 91171, 91176, 91181, 91186, 91191, - 91195, 91200, 91205, 91210, 91215, 91219, 91224, 91229, 91234, 91239, - 91244, 91249, 91254, 91258, 91263, 91268, 91273, 91278, 0, 91283, 91288, - 0, 0, 0, 91293, 0, 0, 91298, 91303, 91310, 91317, 91324, 91331, 91338, - 91345, 91352, 91359, 91366, 91373, 91380, 91387, 91394, 91401, 91408, - 91415, 91422, 91429, 91436, 91443, 91450, 0, 91457, 91464, 91470, 91476, - 91482, 91489, 91496, 91504, 91512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91521, 91526, - 91531, 91536, 91541, 91546, 91551, 91556, 91561, 91566, 91571, 91576, - 91581, 91586, 91591, 91596, 91601, 91606, 91611, 91616, 91621, 91626, - 91631, 91635, 91640, 91645, 91651, 91655, 0, 0, 0, 91659, 91665, 91669, - 91674, 91679, 91684, 91688, 91693, 91697, 91702, 91707, 91711, 91715, - 91720, 91724, 91728, 91733, 91738, 91742, 91747, 91752, 91757, 91762, - 91767, 91772, 91777, 91782, 0, 0, 0, 0, 0, 91787, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 91792, 91798, 91804, 91810, 91816, 91822, 91829, - 91836, 91843, 91849, 91855, 91861, 91868, 91875, 91882, 91888, 91895, - 91902, 91909, 91916, 91922, 91929, 91936, 91942, 91949, 91956, 91963, - 91970, 91977, 91983, 91990, 91997, 92004, 92010, 92016, 92022, 92028, - 92034, 92041, 92048, 92054, 92060, 92066, 92073, 92079, 92086, 92093, - 92100, 92106, 92114, 92121, 92127, 92134, 92141, 92148, 92154, 0, 0, 0, - 0, 0, 0, 92161, 92169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92177, 92181, 92186, 92191, 0, 92197, 92202, 0, 0, 0, 0, 0, 92207, 92213, - 92220, 92225, 92230, 92234, 92239, 92244, 0, 92249, 92254, 92259, 0, - 92264, 92269, 92274, 92279, 92284, 92289, 92294, 92299, 92304, 92309, - 92314, 92318, 92322, 92327, 92332, 92337, 92341, 92345, 92349, 92354, - 92359, 92364, 92369, 92373, 92378, 92382, 92387, 0, 0, 0, 0, 92392, - 92398, 92403, 0, 0, 0, 0, 92408, 92412, 92416, 92420, 92424, 92428, - 92433, 92438, 92444, 0, 0, 0, 0, 0, 0, 0, 0, 92450, 92456, 92463, 92469, - 92476, 92482, 92488, 92494, 92501, 0, 0, 0, 0, 0, 0, 0, 92507, 92515, - 92523, 92531, 92539, 92547, 92555, 92563, 92571, 92579, 92587, 92595, - 92603, 92611, 92619, 92627, 92635, 92643, 92651, 92659, 92667, 92675, - 92683, 92691, 92699, 92707, 92715, 92723, 92731, 92739, 92746, 92754, - 92762, 92766, 92771, 92776, 92781, 92786, 92791, 92796, 92801, 92805, - 92810, 92814, 92819, 92823, 92828, 92832, 92837, 92842, 92847, 92852, + 65512, 65521, 65530, 65541, 65548, 65553, 65558, 65565, 65572, 65578, + 65583, 65588, 65593, 65598, 65605, 65610, 65615, 65620, 65631, 65636, + 65641, 65648, 65653, 65660, 65665, 65670, 65677, 65684, 65691, 65700, + 65709, 65714, 65719, 65724, 65731, 65736, 65746, 65753, 65758, 65763, + 65768, 65773, 65778, 65783, 65792, 65799, 65806, 65811, 65818, 65823, + 65830, 65839, 65850, 65855, 65864, 65869, 65876, 65885, 65894, 65899, + 65904, 65911, 65917, 65924, 65931, 65935, 65939, 65942, 65946, 65950, + 65954, 65958, 65962, 65966, 65970, 65973, 65977, 65981, 65985, 65989, + 65993, 65997, 66000, 66004, 66008, 66011, 66015, 66019, 66023, 66027, + 66031, 66035, 66039, 66043, 66047, 66051, 66055, 66059, 66063, 66067, + 66071, 66075, 66079, 66083, 66087, 66091, 66095, 66099, 66103, 66107, + 66111, 66115, 66119, 66123, 66127, 66131, 66135, 66139, 66143, 66147, + 66151, 66155, 66159, 66163, 66167, 66171, 66175, 66179, 66183, 66187, + 66190, 66194, 66198, 66202, 66206, 66210, 66214, 66218, 66222, 66226, + 66230, 66234, 66238, 66242, 66246, 66250, 66254, 66258, 66262, 66266, + 66270, 66274, 66278, 66282, 66286, 66290, 66294, 66298, 66302, 66306, + 66310, 66314, 66318, 66322, 66326, 66330, 66334, 66338, 66342, 66346, + 66350, 66354, 66358, 66362, 66366, 66370, 66374, 66378, 66382, 66386, + 66390, 66394, 66398, 66402, 66406, 66410, 66414, 66418, 66422, 66426, + 66430, 66434, 66438, 66442, 66446, 66450, 66454, 66458, 66462, 66466, + 66470, 66474, 66478, 66482, 66486, 66490, 66494, 66498, 66502, 66506, + 66510, 66514, 66518, 66522, 66526, 66530, 66534, 66538, 66542, 66546, + 66550, 66554, 66558, 66562, 66566, 66570, 66574, 66578, 66582, 66586, + 66590, 66594, 66598, 66602, 66606, 66610, 66614, 66618, 66622, 66626, + 66630, 66634, 66638, 66642, 66646, 66650, 66654, 66658, 66661, 66665, + 66669, 66673, 66677, 66681, 66685, 66689, 66693, 66697, 66701, 66705, + 66709, 66713, 66717, 66721, 66725, 66729, 66733, 66737, 66741, 66745, + 66749, 66753, 66757, 66761, 66765, 66769, 66773, 66777, 66781, 66785, + 66789, 66793, 66797, 66801, 66805, 66809, 66813, 66817, 66821, 66825, + 66829, 66833, 66837, 66841, 66845, 66849, 66853, 66857, 66861, 66865, + 66869, 66873, 66877, 66881, 66885, 66889, 66893, 66897, 66901, 66905, + 66909, 66913, 66917, 66921, 66925, 66929, 66933, 66937, 66941, 66945, + 66949, 66953, 66957, 66961, 66965, 66969, 66973, 66977, 66981, 66985, + 66989, 66993, 66997, 67001, 67005, 67009, 67013, 67017, 67021, 67025, + 67029, 67033, 67037, 67041, 67045, 67049, 67053, 67057, 67061, 67065, + 67069, 67073, 67077, 67081, 67085, 67089, 67093, 67097, 67101, 67105, + 67109, 67113, 67117, 67121, 67124, 67128, 67132, 67136, 67140, 67144, + 67148, 67152, 67156, 67160, 67164, 67168, 67172, 67176, 67180, 67184, + 67188, 67192, 67196, 67200, 67204, 67208, 67212, 67216, 67220, 67224, + 67228, 67232, 67236, 67240, 67244, 67248, 67252, 67256, 67260, 67264, + 67268, 67272, 67276, 67280, 67284, 67288, 67292, 67296, 67300, 67304, + 67308, 67312, 67316, 67320, 67324, 67328, 67332, 67336, 67340, 67344, + 67348, 67352, 67356, 67360, 67364, 67368, 67372, 67376, 67380, 67384, + 67388, 67392, 67396, 67400, 67404, 67408, 67412, 67416, 67420, 67424, + 67428, 67432, 67436, 67440, 67444, 67448, 67452, 67456, 67460, 67464, + 67468, 67472, 67476, 67480, 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, 67939, 67943, + 67947, 67951, 67955, 67959, 67963, 67967, 67971, 67975, 67978, 67982, + 67986, 67990, 67994, 67998, 68002, 68006, 68010, 68014, 68018, 68022, + 68026, 68030, 68034, 68038, 68042, 68046, 68050, 68054, 68058, 68062, + 68066, 68070, 68074, 68078, 68082, 68086, 68090, 68094, 68098, 68102, + 68106, 68110, 68114, 68118, 68122, 68126, 68130, 68134, 68138, 68142, + 68146, 68150, 68154, 68158, 68162, 68166, 68170, 68174, 68178, 68182, + 68186, 68190, 68194, 68198, 68202, 68206, 68210, 68214, 68218, 68222, + 68226, 68230, 68234, 68238, 68242, 68246, 68250, 68254, 68258, 68262, + 68266, 68270, 68274, 68278, 68282, 68286, 68290, 68294, 68298, 68302, + 68306, 68310, 68314, 68318, 68322, 68326, 68330, 68334, 68338, 68342, + 68346, 68350, 68354, 68358, 68362, 68366, 68370, 68374, 68378, 68382, + 68386, 68390, 68394, 68398, 68402, 68406, 68410, 68414, 68418, 68422, + 68426, 68430, 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, 68557, 68561, 68565, 68569, 68573, 68577, 68581, + 68585, 68589, 68593, 68597, 68601, 68605, 68609, 68613, 68617, 68621, + 68625, 68629, 68633, 68637, 68641, 68645, 68649, 68653, 68657, 68661, + 68665, 68669, 68673, 68677, 68681, 68685, 68689, 68693, 68697, 68701, + 68705, 68709, 68713, 68717, 68721, 68725, 68729, 68733, 68737, 68741, + 68745, 68749, 68753, 68757, 68761, 68765, 68769, 68773, 68777, 68781, + 68785, 68789, 68793, 68797, 68801, 68805, 68809, 68813, 68817, 68821, + 68825, 68829, 68833, 68837, 68841, 68845, 68849, 68853, 68857, 68861, + 68865, 68869, 68873, 68877, 68881, 68885, 68889, 68893, 68897, 68901, + 68905, 68909, 68913, 68917, 68921, 68925, 68929, 68933, 68937, 68941, + 68945, 68949, 68953, 68957, 68961, 68965, 68969, 68973, 68977, 68981, + 68985, 68989, 68993, 68997, 69001, 69005, 69009, 69013, 69017, 69021, + 69025, 69029, 69033, 69036, 69040, 69044, 69048, 69052, 69056, 69060, + 69064, 69068, 69072, 69076, 69080, 69084, 69088, 69092, 69096, 69100, + 69104, 69108, 69112, 69116, 69120, 69124, 69128, 69132, 69136, 69140, + 69144, 69148, 69152, 69156, 69160, 69164, 69168, 69172, 69176, 69180, + 69184, 69188, 69192, 69196, 69200, 69204, 69208, 69212, 69216, 69220, + 69224, 69228, 69232, 69236, 69240, 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, 69420, + 69424, 69428, 69432, 69436, 69440, 69444, 69448, 69452, 69456, 69460, + 69464, 69468, 69472, 69476, 69480, 69484, 69488, 69492, 69496, 69500, + 69504, 69508, 69512, 69516, 69520, 69524, 69528, 69532, 69536, 69540, + 69544, 69548, 69552, 69556, 69560, 69564, 69568, 69572, 69576, 69580, + 69584, 69588, 69592, 69596, 69600, 69604, 69608, 69612, 69616, 69620, + 69624, 69628, 69632, 69636, 69640, 69644, 69648, 69652, 69656, 69660, + 69664, 69668, 69672, 69676, 69680, 69684, 69688, 69692, 69696, 69700, + 69704, 69708, 69712, 69716, 69720, 69724, 69728, 69732, 69736, 69740, + 69744, 69748, 69752, 69756, 69760, 69764, 69768, 69772, 69776, 69780, + 69784, 69788, 69792, 69796, 69800, 69804, 69808, 69812, 69816, 69820, + 69824, 69828, 69832, 69836, 69840, 69844, 69848, 69852, 69856, 69860, + 69864, 69868, 69872, 69876, 69880, 69884, 69888, 69892, 69896, 69900, + 69904, 69908, 69912, 69916, 69920, 69924, 69928, 69932, 69936, 69940, + 69944, 69948, 69952, 69956, 69960, 69964, 69968, 69972, 69976, 69980, + 69984, 69988, 69992, 69996, 70000, 70004, 70008, 70012, 70016, 70020, + 70024, 70028, 70032, 70036, 70040, 70044, 70048, 70052, 70056, 70060, + 70064, 70068, 70072, 70076, 70080, 70084, 70088, 70092, 70096, 70100, + 70104, 70108, 70112, 70116, 70120, 70124, 70128, 70132, 70136, 70140, + 70144, 70148, 70152, 70156, 70160, 70164, 70168, 70172, 70176, 70180, + 70184, 70188, 70192, 70196, 70200, 70204, 70208, 70212, 70216, 70220, + 70224, 70228, 70232, 70236, 70240, 70244, 70248, 70252, 70256, 70260, + 70264, 70268, 70272, 70276, 70280, 70284, 70288, 70292, 70296, 70300, + 70304, 70308, 70312, 70316, 70320, 70324, 70328, 70332, 70336, 70340, + 70344, 70348, 70352, 70356, 70360, 70364, 70368, 70372, 70376, 70380, + 70384, 70388, 70392, 70396, 70400, 70404, 70408, 70412, 70416, 70420, + 70424, 70428, 70432, 70436, 70440, 70444, 70448, 70452, 70456, 70460, + 70464, 70468, 70472, 70476, 70480, 70484, 70488, 70492, 70496, 70500, + 70504, 70508, 70512, 70516, 70520, 70524, 70528, 70532, 70536, 70540, + 70544, 70548, 70552, 70556, 70560, 70564, 70568, 70572, 70576, 0, 0, 0, + 70580, 70584, 70588, 70592, 70596, 70600, 70604, 70608, 70612, 70616, + 70620, 70624, 70628, 70632, 70636, 70640, 70644, 70648, 70652, 70656, + 70660, 70664, 70668, 70672, 70676, 70680, 70684, 70688, 70692, 70696, + 70700, 70704, 70708, 70712, 70716, 70720, 70724, 70728, 70732, 70736, + 70740, 70744, 70748, 70752, 70756, 70760, 70764, 70768, 70772, 70776, + 70780, 70784, 70788, 70792, 70796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70800, + 70805, 70809, 70814, 70819, 70824, 70829, 70834, 70838, 70843, 70848, + 70853, 70858, 70863, 70868, 70873, 70877, 70881, 70886, 70891, 70896, + 70901, 70906, 70910, 70915, 70920, 70925, 70930, 70935, 70939, 70944, + 70948, 70953, 70957, 70962, 70966, 70970, 70974, 70979, 70984, 70989, + 70997, 71005, 71013, 71021, 71028, 71036, 71042, 71050, 71054, 71058, + 71062, 71066, 71070, 71074, 71078, 71082, 71086, 71090, 71094, 71098, + 71102, 71106, 71110, 71114, 71118, 71122, 71126, 71130, 71134, 71138, + 71142, 71146, 71150, 71154, 71158, 71162, 71166, 71170, 71174, 71178, + 71182, 71186, 71190, 71194, 71197, 71201, 71205, 71209, 71213, 71217, + 71221, 71225, 71229, 71233, 71237, 71241, 71245, 71249, 71253, 71257, + 71261, 71265, 71269, 71273, 71277, 71281, 71285, 71289, 71293, 71297, + 71301, 71305, 71309, 71313, 71317, 71321, 71325, 71329, 71333, 71337, + 71341, 71344, 71348, 71352, 71355, 71359, 71363, 71367, 71370, 71374, + 71378, 71382, 71386, 71390, 71394, 71398, 71402, 71406, 71410, 71414, + 71418, 71422, 71426, 71430, 71434, 71438, 71442, 71446, 71450, 71454, + 71458, 71462, 71466, 71469, 71472, 71476, 71480, 71484, 71487, 71490, + 71494, 71498, 71502, 71506, 71510, 71514, 71518, 71522, 71526, 71530, + 71534, 71538, 71542, 71546, 71550, 71554, 71558, 71562, 71566, 71570, + 71574, 71578, 71582, 71586, 71590, 71594, 71598, 71602, 71606, 71610, + 71614, 71618, 71622, 71626, 71630, 71634, 71638, 71641, 71645, 71649, + 71653, 71657, 71661, 71665, 71669, 71673, 71677, 71681, 71685, 71689, + 71693, 71697, 71701, 71705, 71709, 71713, 71717, 71721, 71725, 71729, + 71733, 71737, 71741, 71745, 71749, 71753, 71757, 71761, 71765, 71769, + 71773, 71777, 71781, 71785, 71788, 71792, 71796, 71800, 71804, 71808, + 71812, 71816, 71820, 71824, 71828, 71832, 71836, 71840, 71844, 71848, + 71852, 71855, 71859, 71863, 71867, 71871, 71875, 71879, 71883, 71887, + 71891, 71895, 71899, 71903, 71907, 71911, 71915, 71919, 71923, 71927, + 71931, 71935, 71939, 71942, 71946, 71950, 71954, 71958, 71962, 71966, + 71970, 71974, 71978, 71982, 71986, 71990, 71994, 71998, 72002, 72006, + 72010, 72014, 72018, 72022, 72026, 72030, 72034, 72038, 72042, 72046, + 72050, 72054, 72058, 72062, 72066, 72070, 72074, 72078, 72082, 72086, + 72090, 72094, 72098, 72102, 72106, 72110, 72114, 72117, 72122, 72126, + 72132, 72137, 72143, 72147, 72151, 72155, 72159, 72163, 72167, 72171, + 72175, 72179, 72183, 72187, 72191, 72195, 72199, 72202, 72205, 72208, + 72211, 72214, 72217, 72220, 72223, 72226, 72231, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72237, 72242, 72247, 72252, 72257, + 72264, 72271, 72276, 72281, 72286, 72291, 72298, 72305, 72312, 72319, + 72326, 72333, 72343, 72353, 72360, 72367, 72374, 72381, 72387, 72393, + 72402, 72411, 72418, 72425, 72436, 72447, 72452, 72457, 72464, 72471, + 72478, 72485, 72492, 72499, 72506, 72513, 72519, 72525, 72531, 72537, + 72544, 72551, 72556, 72560, 72567, 72574, 72581, 72585, 72592, 72596, + 72601, 72605, 72611, 72616, 72622, 72627, 72631, 72635, 72638, 72641, + 72646, 72651, 72656, 72661, 72666, 72671, 72676, 72681, 72686, 72691, + 72700, 72709, 72714, 72719, 72724, 72729, 72734, 72739, 72744, 72749, + 72754, 72759, 72764, 72769, 72774, 72779, 72785, 72791, 72797, 0, 72803, + 72809, 72812, 72815, 72818, 72822, 72826, 72830, 72834, 72837, 72841, + 72844, 72848, 72851, 72855, 72859, 72863, 72867, 72871, 72875, 72879, + 72883, 72887, 72891, 72895, 72899, 72903, 72907, 72911, 72915, 72919, + 72923, 72927, 72931, 72935, 72939, 72942, 72946, 72950, 72954, 72958, + 72962, 72966, 72970, 72974, 72978, 72982, 72986, 72990, 72994, 72998, + 73002, 73006, 73010, 73014, 73018, 73022, 73026, 73030, 73034, 73038, + 73041, 73045, 73049, 73053, 73057, 73061, 73065, 73069, 73072, 73076, + 73080, 73084, 73088, 73092, 73096, 73100, 73104, 73108, 73112, 73116, + 73120, 73125, 73130, 73133, 73138, 73141, 73144, 73147, 0, 0, 0, 0, 0, 0, + 0, 0, 73151, 73160, 73169, 73178, 73187, 73196, 73205, 73214, 73223, + 73231, 73238, 73246, 73253, 73261, 73271, 73280, 73290, 73299, 73309, + 73317, 73324, 73332, 73339, 73347, 73352, 73357, 73362, 73371, 73377, + 73383, 73390, 73399, 73407, 73415, 73423, 73430, 73437, 73444, 73451, + 73456, 73461, 73466, 73471, 73476, 73481, 73486, 73491, 73499, 73507, + 73513, 73518, 73523, 73528, 73533, 73538, 73543, 73548, 73553, 73558, + 73566, 73574, 73579, 73584, 73594, 73604, 73611, 73618, 73627, 73636, + 73648, 73660, 73666, 73672, 73680, 73688, 73698, 73708, 73715, 73722, + 73727, 73732, 73744, 73756, 73764, 73772, 73782, 73792, 73804, 73816, + 73825, 73834, 73841, 73848, 73855, 73862, 73871, 73880, 73885, 73890, + 73897, 73904, 73911, 73918, 73930, 73942, 73947, 73952, 73957, 73962, + 73967, 73972, 73977, 73982, 73986, 73991, 73996, 74001, 74006, 74011, + 74017, 74022, 74027, 74034, 74041, 74048, 74055, 74062, 74070, 74078, + 74083, 74088, 74094, 74100, 74106, 74112, 74119, 74126, 74133, 74137, + 74144, 74149, 74154, 74160, 0, 74173, 74181, 74189, 74196, 74203, 74212, + 74221, 74228, 74235, 74242, 74249, 74256, 74263, 74270, 74277, 74284, + 74291, 74300, 74309, 74318, 74327, 74336, 74345, 74354, 74363, 74372, + 74381, 74388, 74396, 74402, 0, 0, 74410, 74416, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74422, 74429, 74436, 74442, 74449, + 74457, 74465, 74473, 74481, 74489, 74495, 74501, 74508, 74514, 74520, + 74526, 74533, 74540, 74547, 74554, 74561, 74568, 74575, 74582, 74589, + 74596, 74603, 74610, 74617, 74624, 74630, 74637, 74644, 74651, 74658, + 74665, 74672, 74679, 74686, 74693, 74700, 74707, 74714, 74721, 74728, + 74735, 74742, 74749, 74756, 74764, 74772, 74780, 74788, 0, 0, 0, 0, + 74796, 74804, 74812, 74820, 74828, 74836, 74844, 74850, 74856, 74862, 0, + 0, 0, 0, 0, 0, 74868, 74872, 74877, 74882, 74887, 74892, 74897, 74902, + 74907, 74912, 74917, 74922, 74926, 74930, 74935, 74940, 74944, 74949, + 74954, 74959, 74964, 74969, 74974, 74979, 74983, 74988, 74993, 74998, + 75003, 75007, 75011, 75015, 75019, 75023, 75027, 75032, 75037, 75042, + 75047, 75052, 75059, 75065, 75070, 75075, 75080, 75085, 75091, 75098, + 75104, 75111, 75118, 75125, 75130, 75137, 75143, 75148, 0, 0, 0, 0, 0, 0, + 0, 0, 75154, 75159, 75164, 75168, 75173, 75177, 75182, 75186, 75191, + 75196, 75202, 75207, 75213, 75217, 75222, 75227, 75231, 75236, 75241, + 75245, 75250, 75255, 75260, 75265, 75270, 75275, 75280, 75285, 75290, + 75295, 75300, 75305, 75310, 75315, 75320, 75325, 75330, 75335, 75339, + 75343, 75348, 75353, 75358, 75362, 75366, 75371, 75376, 75381, 75386, + 75391, 75396, 75400, 75405, 75411, 75417, 75422, 75428, 75433, 75439, + 75445, 75452, 75458, 75465, 75470, 75476, 75482, 75487, 75493, 75499, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 75504, 75508, 75513, 75518, 75522, 75526, 75530, + 75534, 75538, 75542, 75546, 75550, 0, 0, 0, 0, 0, 0, 75554, 75559, 75563, + 75567, 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, + 75607, 75611, 75615, 75620, 75625, 75630, 75636, 75642, 75649, 75654, + 75659, 75665, 75669, 75674, 75677, 0, 0, 0, 0, 75680, 75687, 75693, + 75699, 75705, 75711, 75717, 75723, 75729, 75735, 75741, 75747, 75754, + 75761, 75768, 75775, 75782, 75789, 75796, 75803, 75810, 75816, 75822, + 75829, 75835, 75842, 75849, 75856, 75862, 75869, 75876, 75883, 75889, + 75896, 75903, 75909, 75916, 75922, 75929, 75936, 75942, 75948, 75955, + 75961, 75968, 75975, 75984, 75991, 75998, 76002, 76007, 76012, 76017, + 76022, 76026, 76030, 76035, 76039, 76044, 76049, 76054, 76059, 76064, + 76069, 76073, 76078, 76082, 76087, 76092, 76097, 76102, 76106, 76111, + 76116, 76121, 76127, 76132, 76138, 76144, 76150, 76156, 76162, 76167, + 76173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76177, 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, 0, 0, 0, 76298, 76302, 76306, + 76310, 76314, 76317, 76323, 76326, 76330, 76333, 76339, 76345, 76353, + 76356, 76360, 76363, 76366, 76372, 76378, 76382, 76388, 76392, 76396, + 76402, 76406, 76412, 76418, 76422, 76426, 76432, 76436, 76442, 76448, + 76452, 76458, 76462, 76468, 76471, 76474, 76480, 76484, 76490, 76493, + 76496, 76500, 76506, 76510, 76514, 76520, 76526, 76530, 76533, 76539, + 76544, 76549, 76554, 76561, 76566, 76573, 76578, 76585, 76590, 76595, + 76600, 76605, 76608, 76612, 76616, 76621, 76626, 76631, 76636, 76641, + 76646, 76651, 76656, 76663, 76668, 0, 76674, 76677, 76681, 76684, 76687, + 76690, 76693, 76696, 76699, 76702, 76705, 0, 0, 0, 0, 76708, 76715, + 76720, 76726, 76732, 76738, 76744, 76750, 76756, 76763, 76770, 76777, + 76784, 76791, 76798, 76805, 76812, 76819, 76826, 76833, 76839, 76845, + 76851, 76857, 76863, 76869, 76875, 76881, 76887, 76894, 76901, 76908, + 76915, 0, 76922, 76925, 76928, 76931, 76934, 76938, 76941, 76944, 76948, + 76952, 76956, 76960, 76964, 76968, 76972, 76976, 76980, 76984, 76988, + 76992, 76996, 77000, 77004, 77008, 77012, 77015, 77019, 77022, 77026, + 77030, 77034, 77038, 77042, 77045, 77049, 77052, 77056, 77060, 77064, + 77068, 77072, 77075, 77080, 77084, 77089, 77094, 77098, 77103, 77107, + 77112, 77117, 77122, 77126, 77131, 77136, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 77141, 77146, 77151, 77156, 77162, 77167, 77172, 77177, 77182, 77187, + 77191, 77195, 77200, 77206, 0, 0, 77212, 77216, 77219, 77222, 77225, + 77228, 77231, 77234, 77237, 77240, 0, 0, 77243, 77248, 77253, 77259, + 77266, 77272, 77278, 77284, 77290, 77296, 77302, 77308, 77314, 77320, + 77326, 77332, 77337, 77343, 77348, 77354, 77360, 77367, 77373, 77379, + 77385, 77392, 77399, 77406, 77412, 77417, 77422, 77428, 77436, 77443, + 77450, 77458, 77466, 77473, 77480, 77487, 77494, 77501, 77508, 77515, + 77522, 77529, 77536, 77543, 77550, 77557, 77564, 77571, 77578, 77585, + 77592, 77599, 77606, 77612, 77618, 77625, 77632, 77639, 77646, 77653, + 77660, 77667, 77674, 77681, 77688, 77695, 77702, 77709, 77716, 77723, + 77730, 77737, 77744, 77751, 77758, 77765, 77772, 77779, 77786, 77792, + 77798, 77805, 77811, 77816, 77822, 77827, 77832, 77837, 77844, 77850, + 77856, 77862, 77868, 77874, 77880, 77886, 77894, 77902, 77910, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77918, + 77924, 77930, 77936, 77944, 77952, 77958, 77964, 77971, 77978, 77985, + 77992, 77999, 78006, 78013, 78020, 78027, 78035, 78043, 78051, 78059, + 78067, 78073, 78081, 78087, 78095, 78104, 78112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 78118, 78122, 78126, 78130, 78134, 78138, 0, 0, 78142, 78146, + 78150, 78154, 78158, 78162, 0, 0, 78166, 78170, 78174, 78178, 78182, + 78186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78190, 78194, 78198, 78202, 78206, + 78210, 78214, 0, 78218, 78222, 78226, 78230, 78234, 78238, 78242, 0, + 78246, 78253, 78259, 78265, 78271, 78278, 78285, 78294, 78305, 78316, + 78326, 78334, 78342, 78350, 78356, 78364, 78372, 78379, 78387, 78396, + 78403, 78412, 78418, 78428, 78437, 78442, 78450, 78459, 78464, 78473, + 78480, 78490, 78502, 78507, 78513, 78520, 78525, 78535, 78545, 78555, + 78565, 78580, 78593, 78604, 78612, 78617, 78628, 78638, 0, 0, 0, 0, + 78645, 78652, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78658, + 78665, 78672, 78679, 78686, 78692, 78698, 78705, 78712, 78719, 78726, + 78733, 78740, 78747, 78754, 78761, 78767, 78774, 78781, 78788, 78795, + 78802, 78809, 78816, 78823, 78830, 78837, 78844, 78853, 78862, 78871, + 78880, 78889, 78898, 78907, 78916, 78924, 78932, 78940, 78948, 78956, + 78964, 78972, 78980, 78986, 78994, 0, 0, 79002, 79009, 79015, 79021, + 79027, 79033, 79039, 79045, 79051, 79057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 79063, 79067, 79071, 79075, 79079, 79083, 79087, 79091, + 79095, 79099, 79103, 79107, 79111, 79115, 79119, 79123, 79127, 79131, + 79135, 79139, 79143, 79147, 79151, 0, 0, 0, 0, 79155, 79159, 79163, + 79167, 79171, 79175, 79179, 79183, 79187, 79191, 79195, 79199, 79203, + 79207, 79211, 79215, 79219, 79223, 79227, 79231, 79235, 79239, 79243, + 79247, 79251, 79255, 79259, 79263, 79267, 79271, 79275, 79279, 79283, + 79287, 79291, 79295, 79299, 79303, 79307, 79311, 79315, 79319, 79323, + 79327, 79331, 79335, 79339, 79343, 79347, 0, 0, 0, 0, 79351, 79355, + 79359, 79363, 79367, 79371, 79375, 79379, 79383, 79387, 79391, 79395, + 79399, 79403, 79407, 79411, 79415, 79419, 79423, 79427, 79431, 79435, + 79439, 79443, 79447, 79451, 79455, 79459, 79463, 79467, 79471, 79475, + 79479, 79483, 79487, 79491, 79495, 79499, 79503, 79507, 79511, 79515, + 79519, 79523, 79527, 79531, 79535, 79539, 79543, 79547, 79551, 79555, + 79559, 79563, 79567, 79571, 79575, 79579, 79583, 79587, 79591, 79595, + 79599, 79603, 79607, 79611, 79615, 79619, 79623, 79627, 79631, 79635, + 79639, 79643, 79647, 79651, 79655, 79659, 79663, 79667, 79671, 79675, + 79679, 79683, 79687, 79691, 79695, 79699, 79703, 79707, 79711, 79715, + 79719, 79723, 79727, 79731, 79735, 79739, 79743, 79747, 79751, 79755, + 79759, 79763, 79767, 79771, 79775, 79779, 79783, 79787, 79791, 79795, + 79799, 79803, 79807, 79811, 79815, 79819, 79823, 79827, 79831, 79835, + 79839, 79843, 79847, 79851, 79855, 79859, 79863, 79867, 79871, 79875, + 79879, 79883, 79887, 79891, 79895, 79899, 79903, 79907, 79911, 79915, + 79919, 79923, 79927, 79931, 79935, 79939, 79943, 79947, 79951, 79955, + 79959, 79963, 79967, 79971, 79975, 79979, 79983, 79987, 79991, 79995, + 79999, 80003, 80007, 80011, 80015, 80019, 80023, 80027, 80031, 80035, + 80039, 80043, 80047, 80051, 80055, 80059, 80063, 80067, 80071, 80075, + 80079, 80083, 80087, 80091, 80095, 80099, 80103, 80107, 80111, 80115, + 80119, 80123, 80127, 80131, 80135, 80139, 80143, 80147, 80151, 80155, + 80159, 80163, 80167, 80171, 80175, 80179, 80183, 80187, 80191, 80195, + 80199, 80203, 80207, 80211, 80215, 80219, 80223, 80227, 80231, 80235, + 80239, 80243, 80247, 80251, 80255, 80259, 80263, 80267, 80271, 80275, + 80279, 80283, 80287, 80291, 80295, 80299, 80303, 80307, 80311, 80315, + 80319, 80323, 80327, 80331, 80335, 80339, 80343, 80347, 80351, 80355, + 80359, 80363, 80367, 80371, 80375, 80379, 80383, 80387, 80391, 80395, + 80399, 80403, 80407, 80411, 80415, 80419, 80423, 80427, 80431, 80435, + 80439, 80443, 80447, 80451, 80455, 80459, 80463, 80467, 80471, 80475, + 80479, 80483, 80487, 80491, 80495, 80499, 80503, 80507, 80511, 80515, + 80519, 80523, 80527, 80531, 80535, 80539, 80543, 80547, 80551, 80555, + 80559, 80563, 80567, 80571, 80575, 80579, 80583, 80587, 80591, 80595, + 80599, 80603, 80607, 80611, 80615, 80619, 80623, 80627, 80631, 80635, + 80639, 80643, 80647, 80651, 80655, 80659, 80663, 80667, 80671, 80675, + 80679, 80683, 80687, 80691, 80695, 80699, 80703, 80707, 80711, 80715, + 80719, 80723, 80727, 80731, 80735, 80739, 80743, 80747, 80751, 80755, + 80759, 80763, 80767, 80771, 80775, 80779, 80783, 80787, 80791, 80795, + 80799, 80803, 80807, 80811, 0, 0, 80815, 80819, 80823, 80827, 80831, + 80835, 80839, 80843, 80847, 80851, 80855, 80859, 80863, 80867, 80871, + 80875, 80879, 80883, 80887, 80891, 80895, 80899, 80903, 80907, 80911, + 80915, 80919, 80923, 80927, 80931, 80935, 80939, 80943, 80947, 80951, + 80955, 80959, 80963, 80967, 80971, 80975, 80979, 80983, 80987, 80991, + 80995, 80999, 81003, 81007, 81011, 81015, 81019, 81023, 81027, 81031, + 81035, 81039, 81043, 81047, 81051, 81055, 81059, 81063, 81067, 81071, + 81075, 81079, 81083, 81087, 81091, 81095, 81099, 81103, 81107, 81111, + 81115, 81119, 81123, 81127, 81131, 81135, 81139, 81143, 81147, 81151, + 81155, 81159, 81163, 81167, 81171, 81175, 81179, 81183, 81187, 81191, + 81195, 81199, 81203, 81207, 81211, 81215, 81219, 81223, 81227, 81231, + 81235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81239, 81244, 81249, + 81254, 81259, 81264, 81272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81277, + 81284, 81291, 81298, 81305, 0, 0, 0, 0, 0, 81312, 81319, 81326, 81336, + 81342, 81348, 81354, 81360, 81366, 81372, 81379, 81385, 81391, 81397, + 81406, 81415, 81427, 81439, 81445, 81451, 81457, 81464, 81471, 81478, + 81485, 81492, 0, 81499, 81506, 81513, 81521, 81528, 0, 81535, 0, 81542, + 81549, 0, 81556, 81564, 0, 81571, 81578, 81585, 81592, 81599, 81606, + 81613, 81620, 81627, 81634, 81639, 81646, 81653, 81659, 81665, 81671, + 81677, 81683, 81689, 81695, 81701, 81707, 81713, 81719, 81725, 81731, + 81737, 81743, 81749, 81755, 81761, 81767, 81773, 81779, 81785, 81791, + 81797, 81803, 81809, 81815, 81821, 81827, 81833, 81839, 81845, 81851, + 81857, 81863, 81869, 81875, 81881, 81887, 81893, 81899, 81905, 81911, + 81917, 81923, 81929, 81935, 81941, 81947, 81953, 81959, 81965, 81971, + 81977, 81983, 81989, 81995, 82001, 82007, 82013, 82019, 82025, 82031, + 82037, 82043, 82049, 82055, 82061, 82067, 82073, 82079, 82085, 82091, + 82097, 82103, 82109, 82117, 82125, 82131, 82137, 82143, 82149, 82158, + 82167, 82175, 82183, 82191, 82199, 82207, 82215, 82223, 82231, 82238, + 82245, 82256, 82267, 82271, 82275, 82280, 82285, 82290, 82295, 82303, + 82311, 82317, 82323, 82330, 82337, 82344, 82348, 82354, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82360, 82366, 82372, 82378, 82384, + 82389, 82394, 82400, 82406, 82412, 82418, 82427, 82433, 82439, 82447, + 82455, 82463, 82471, 82476, 82481, 82486, 82491, 82504, 82517, 82528, + 82539, 82551, 82563, 82575, 82587, 82598, 82609, 82621, 82633, 82645, + 82657, 82668, 82679, 82690, 82707, 82724, 82741, 82748, 82755, 82762, + 82769, 82780, 82791, 82802, 82815, 82826, 82834, 82842, 82851, 82859, + 82869, 82877, 82885, 82893, 82902, 82910, 82920, 82928, 82936, 82944, + 82954, 82962, 82969, 82976, 82983, 82990, 82998, 83006, 83014, 83022, + 83030, 83039, 83047, 83055, 83063, 83071, 83079, 83088, 83096, 83104, + 83112, 83120, 83128, 83136, 83144, 83152, 83160, 83168, 83177, 83185, + 83195, 83203, 83211, 83219, 83229, 83237, 83245, 83253, 83261, 83270, + 83279, 83287, 83297, 83305, 83313, 83321, 83330, 83338, 83348, 83356, + 83363, 83370, 83378, 83385, 83394, 83401, 83409, 83417, 83426, 83434, + 83444, 83452, 83460, 83468, 83478, 83486, 83493, 83500, 83508, 83515, + 83524, 83531, 83541, 83551, 83562, 83571, 83580, 83589, 83598, 83607, + 83617, 83629, 83641, 83652, 83664, 83677, 83688, 83697, 83706, 83714, + 83723, 83733, 83741, 83750, 83759, 83767, 83776, 83786, 83794, 83803, + 83812, 83820, 83829, 83839, 83847, 83857, 83865, 83875, 83883, 83891, + 83900, 83908, 83918, 83926, 83934, 83944, 83952, 83959, 83966, 83975, + 83984, 83992, 84001, 84011, 84019, 84030, 84038, 84046, 84053, 84061, + 84070, 84077, 84088, 84099, 84111, 84122, 84134, 84142, 84150, 84159, + 84167, 84176, 84184, 84192, 84201, 84209, 84218, 84226, 84233, 84240, + 84247, 84254, 84262, 84270, 84278, 84286, 84295, 84303, 84311, 84320, + 84328, 84336, 84344, 84353, 84361, 84369, 84377, 84385, 84393, 84401, + 84409, 84417, 84425, 84434, 84442, 84450, 84458, 84466, 84474, 84483, + 84492, 84500, 84508, 84516, 84525, 84533, 84542, 84549, 84556, 84564, + 84571, 84579, 84587, 84596, 84604, 84613, 84621, 84629, 84639, 84646, + 84653, 84661, 84668, 84676, 84687, 84699, 84707, 84716, 84724, 84733, + 84741, 84750, 84758, 84767, 84775, 84784, 84793, 84801, 84809, 84817, + 84826, 84833, 84841, 84850, 84859, 84868, 84878, 84886, 84896, 84904, + 84914, 84922, 84932, 84940, 84950, 84958, 84967, 84974, 84983, 84990, + 85000, 85008, 85018, 85026, 85036, 85044, 85052, 85060, 85069, 85077, + 85086, 85095, 85104, 85113, 85123, 85131, 85141, 85149, 85159, 85167, + 85177, 85185, 85195, 85203, 85212, 85219, 85228, 85235, 85245, 85253, + 85263, 85271, 85281, 85289, 85297, 85305, 85314, 85322, 85331, 85340, + 85349, 85358, 85366, 85374, 85383, 85391, 85400, 85409, 85417, 85425, + 85433, 85442, 85450, 85458, 85467, 85475, 85483, 85491, 85499, 85504, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85509, 85519, 85529, 85539, + 85549, 85560, 85570, 85580, 85591, 85600, 85609, 85618, 85629, 85639, + 85649, 85661, 85671, 85681, 85691, 85701, 85711, 85721, 85731, 85741, + 85751, 85761, 85771, 85782, 85793, 85803, 85813, 85825, 85836, 85847, + 85857, 85867, 85877, 85887, 85897, 85907, 85917, 85929, 85939, 85949, + 85961, 85972, 85983, 85993, 86003, 86013, 86023, 86035, 86045, 86055, + 86066, 86077, 86087, 86097, 86106, 86115, 86124, 86133, 86142, 86152, 0, + 0, 86162, 86172, 86182, 86192, 86202, 86214, 86224, 86234, 86246, 86256, + 86268, 86277, 86286, 86297, 86307, 86319, 86330, 86343, 86353, 86365, + 86374, 86385, 86396, 86409, 86419, 86429, 86439, 86449, 86459, 86468, + 86477, 86486, 86495, 86505, 86515, 86525, 86535, 86545, 86555, 86565, + 86575, 86585, 86595, 86605, 86615, 86624, 86633, 86642, 86652, 86662, + 86672, 86682, 86692, 86703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 86713, 86728, 86743, 86749, 86755, 86761, 86767, 86773, 86779, 86785, + 86791, 86799, 86803, 86806, 0, 0, 86814, 86817, 86820, 86823, 86826, + 86829, 86832, 86835, 86838, 86841, 86844, 86847, 86850, 86853, 86856, + 86859, 86862, 86870, 86879, 86890, 86898, 86906, 86915, 86924, 86935, + 86947, 0, 0, 0, 0, 0, 0, 86956, 86961, 86966, 86973, 86980, 86986, 86992, + 86997, 87002, 87007, 87013, 87019, 87025, 87031, 0, 0, 87037, 87047, + 87057, 87067, 87076, 87087, 87096, 87105, 87115, 87125, 87137, 87149, + 87160, 87171, 87182, 87193, 87203, 87213, 87223, 87233, 87244, 87255, + 87259, 87264, 87273, 87282, 87286, 87290, 87294, 87299, 87304, 87309, + 87314, 87317, 87321, 0, 87326, 87329, 87332, 87336, 87340, 87345, 87349, + 87353, 87358, 87363, 87370, 87377, 87380, 87383, 87386, 87389, 87392, + 87396, 87400, 0, 87404, 87409, 87413, 87417, 0, 0, 0, 0, 87422, 87427, + 87434, 87439, 87444, 0, 87449, 87454, 87459, 87464, 87469, 87474, 87479, + 87484, 87489, 87494, 87499, 87505, 87514, 87523, 87532, 87541, 87551, + 87561, 87571, 87581, 87590, 87599, 87608, 87617, 87622, 87627, 87633, + 87639, 87645, 87651, 87659, 87667, 87673, 87679, 87685, 87691, 87697, + 87703, 87709, 87715, 87720, 87725, 87730, 87735, 87740, 87745, 87750, + 87755, 87761, 87767, 87773, 87779, 87785, 87791, 87797, 87803, 87809, + 87815, 87821, 87827, 87833, 87839, 87845, 87851, 87857, 87863, 87869, + 87875, 87881, 87887, 87893, 87899, 87905, 87911, 87917, 87923, 87929, + 87935, 87941, 87947, 87953, 87959, 87965, 87971, 87977, 87983, 87989, + 87995, 88001, 88007, 88013, 88019, 88025, 88031, 88037, 88043, 88049, + 88055, 88061, 88067, 88073, 88079, 88085, 88091, 88097, 88103, 88109, + 88115, 88120, 88125, 88130, 88135, 88141, 88147, 88153, 88159, 88165, + 88171, 88177, 88183, 88189, 88195, 88202, 88209, 88214, 88219, 88224, + 88229, 88241, 88253, 88265, 88277, 88290, 88303, 88311, 0, 0, 88319, 0, + 88327, 88331, 88335, 88338, 88342, 88346, 88349, 88352, 88356, 88360, + 88363, 88366, 88369, 88372, 88377, 88380, 88384, 88387, 88390, 88393, + 88396, 88399, 88402, 88405, 88408, 88411, 88414, 88417, 88421, 88425, + 88429, 88433, 88438, 88443, 88449, 88455, 88461, 88466, 88472, 88478, + 88484, 88489, 88495, 88501, 88506, 88512, 88518, 88523, 88529, 88535, + 88540, 88545, 88551, 88556, 88562, 88568, 88574, 88580, 88586, 88590, + 88595, 88599, 88604, 88608, 88613, 88618, 88624, 88630, 88636, 88641, + 88647, 88653, 88659, 88664, 88670, 88676, 88681, 88687, 88693, 88698, + 88704, 88710, 88715, 88720, 88726, 88731, 88737, 88743, 88749, 88755, + 88761, 88766, 88770, 88775, 88778, 88783, 88788, 88794, 88799, 88804, + 88808, 88814, 88819, 88824, 88829, 88834, 88839, 88844, 88849, 88855, + 88861, 88867, 88875, 88879, 88883, 88887, 88891, 88895, 88899, 88904, + 88909, 88914, 88919, 88924, 88929, 88934, 88939, 88944, 88949, 88954, + 88959, 88964, 88968, 88972, 88977, 88982, 88987, 88992, 88996, 89001, + 89006, 89011, 89016, 89020, 89025, 89030, 89035, 89040, 89044, 89049, + 89054, 89059, 89064, 89069, 89074, 89079, 89084, 89089, 89096, 89103, + 89107, 89112, 89117, 89122, 89127, 89132, 89137, 89142, 89147, 89152, + 89157, 89162, 89167, 89172, 89177, 89182, 89187, 89192, 89197, 89202, + 89207, 89212, 89217, 89222, 89227, 89232, 89237, 89242, 89247, 89252, 0, + 0, 0, 89257, 89261, 89266, 89270, 89275, 89280, 0, 0, 89284, 89289, + 89294, 89298, 89303, 89308, 0, 0, 89313, 89318, 89322, 89327, 89332, + 89337, 0, 0, 89342, 89347, 89352, 0, 0, 0, 89356, 89360, 89364, 89368, + 89371, 89375, 89379, 0, 89383, 89389, 89392, 89395, 89398, 89401, 89405, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89409, 89415, 89421, 89427, 89433, 0, 0, + 89437, 89443, 89449, 89455, 89461, 89467, 89474, 89481, 89488, 89495, + 89502, 89509, 0, 89516, 89523, 89530, 89536, 89543, 89550, 89557, 89564, + 89570, 89577, 89584, 89591, 89598, 89604, 89611, 89618, 89625, 89632, + 89638, 89645, 89652, 89659, 89666, 89673, 89680, 89687, 0, 89694, 89701, + 89708, 89715, 89722, 89729, 89736, 89743, 89750, 89757, 89764, 89771, + 89778, 89785, 89791, 89798, 89805, 89812, 89819, 0, 89826, 89833, 0, + 89840, 89847, 89854, 89861, 89868, 89875, 89882, 89889, 89896, 89903, + 89910, 89917, 89924, 89931, 89938, 0, 0, 89944, 89949, 89954, 89959, + 89964, 89969, 89974, 89979, 89984, 89989, 89994, 89999, 90004, 90009, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 90014, 90021, 90028, 90035, 90042, 90049, + 90056, 90063, 90070, 90077, 90084, 90091, 90098, 90105, 90112, 90119, + 90126, 90133, 90140, 90147, 90155, 90163, 90170, 90177, 90182, 90190, + 90198, 90205, 90212, 90217, 90224, 90229, 90234, 90241, 90246, 90251, + 90256, 90264, 90269, 90274, 90281, 90286, 90291, 90298, 90305, 90310, + 90315, 90320, 90325, 90330, 90335, 90340, 90345, 90350, 90357, 90362, + 90369, 90374, 90379, 90384, 90389, 90394, 90399, 90404, 90409, 90414, + 90419, 90424, 90431, 90438, 90445, 90452, 90458, 90463, 90470, 90475, + 90480, 90489, 90496, 90505, 90512, 90517, 90522, 90530, 90535, 90540, + 90545, 90550, 90555, 90562, 90567, 90572, 90577, 90582, 90587, 90594, + 90601, 90608, 90615, 90622, 90629, 90636, 90643, 90650, 90657, 90664, + 90671, 90678, 90685, 90692, 90699, 90706, 90713, 90720, 90727, 90734, + 90741, 90748, 90755, 90762, 90769, 90776, 90783, 0, 0, 0, 0, 0, 90790, + 90798, 90806, 0, 0, 0, 0, 90811, 90815, 90819, 90823, 90827, 90831, + 90835, 90839, 90843, 90847, 90852, 90857, 90862, 90867, 90872, 90877, + 90882, 90887, 90892, 90898, 90904, 90910, 90917, 90924, 90931, 90938, + 90945, 90952, 90958, 90964, 90970, 90977, 90984, 90991, 90998, 91005, + 91012, 91019, 91026, 91033, 91040, 91047, 91054, 91061, 91068, 0, 0, 0, + 91075, 91083, 91091, 91099, 91107, 91115, 91125, 91135, 91143, 91151, + 91159, 91167, 91175, 91181, 91188, 91197, 91206, 91215, 91224, 91233, + 91242, 91252, 91263, 91273, 91284, 91293, 91302, 91311, 91321, 91332, + 91342, 91353, 91364, 91373, 91381, 91387, 91393, 91399, 91405, 91413, + 91421, 91427, 91434, 91444, 91451, 91458, 91465, 91472, 91479, 91489, + 91496, 91503, 91511, 91519, 91528, 91537, 91546, 91555, 91564, 91572, + 91581, 91590, 91599, 91603, 91610, 91615, 91620, 91624, 91628, 91632, + 91636, 91641, 91646, 91652, 91658, 91662, 91668, 91672, 91676, 91680, + 91684, 91688, 91692, 91698, 91702, 91707, 0, 0, 0, 91711, 91716, 91721, + 91726, 91731, 91738, 91743, 91748, 91753, 91758, 91763, 91768, 0, 0, 0, + 0, 91773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 91779, 91786, 91795, 91804, 91811, 91818, 91825, 91832, 91839, + 91846, 91852, 91859, 91866, 91873, 91880, 91887, 91894, 91901, 91908, + 91917, 91924, 91931, 91938, 91945, 91952, 91959, 91966, 91973, 91982, + 91989, 91996, 92003, 92010, 92017, 92024, 92033, 92040, 92047, 92054, + 92061, 92070, 92077, 92084, 92091, 92099, 92108, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 92117, 92121, 92125, 92130, 92135, 92140, 92145, 92149, 92154, + 92159, 92164, 92169, 92174, 92179, 92183, 92188, 92193, 92198, 92203, + 92207, 92212, 92217, 92221, 92225, 92230, 92235, 92240, 92245, 92250, 0, + 0, 0, 92255, 92259, 92264, 92269, 92273, 92278, 92282, 92287, 92292, + 92297, 92302, 92307, 92311, 92316, 92321, 92326, 92331, 92335, 92340, + 92344, 92349, 92354, 92359, 92364, 92369, 92374, 92378, 92382, 92387, + 92392, 92397, 92402, 92407, 92412, 92417, 92422, 92427, 92432, 92437, + 92442, 92447, 92452, 92457, 92462, 92467, 92472, 92477, 92482, 92487, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92492, 92498, 92503, 92508, + 92513, 92518, 92523, 92528, 92533, 92538, 92543, 92549, 92555, 92561, + 92567, 92573, 92579, 92585, 92591, 92597, 92604, 92611, 92618, 92626, + 92634, 92642, 92650, 92658, 0, 0, 0, 0, 92666, 92670, 92675, 92680, + 92685, 92689, 92694, 92699, 92704, 92709, 92713, 92717, 92722, 92727, + 92732, 92737, 92741, 92746, 92751, 92756, 92761, 92766, 92771, 92775, + 92780, 92785, 92790, 92795, 92800, 92805, 92810, 92815, 92820, 92825, + 92830, 92836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92842, 92847, 92852, 92857, 92862, 92867, 92872, 92877, 92882, 92887, 92892, 92897, 92902, 92907, 92912, 92917, 92922, 92927, 92932, 92937, 92942, 92947, 92952, - 92957, 92962, 92967, 92972, 92977, 92982, 92987, 92992, 92997, 93002, - 93007, 93012, 93017, 93022, 0, 0, 0, 93027, 93032, 93041, 93049, 93058, - 93067, 93078, 93089, 93096, 93103, 93110, 93117, 93124, 93131, 93138, - 93145, 93152, 93159, 93166, 93173, 93180, 93187, 93194, 93201, 93208, - 93215, 93222, 93229, 93236, 0, 0, 93243, 93249, 93255, 93261, 93267, - 93274, 93281, 93289, 93297, 93304, 93311, 93318, 93325, 93332, 93339, - 93346, 93353, 93360, 93367, 93374, 93381, 93388, 93395, 93402, 93409, - 93416, 93423, 0, 0, 0, 0, 0, 93430, 93436, 93442, 93448, 93454, 93461, - 93468, 93476, 93484, 93490, 93496, 93503, 93509, 93515, 93521, 93527, - 93534, 93541, 93548, 93555, 93562, 93569, 93576, 93583, 93590, 93597, - 93604, 93611, 93618, 93625, 93632, 93639, 93646, 93653, 93660, 93667, - 93674, 93681, 93688, 93695, 93702, 93709, 93716, 93723, 93730, 93737, - 93744, 93751, 93758, 93765, 93772, 93779, 93786, 93793, 93800, 93807, - 93814, 93821, 93828, 93835, 93842, 93849, 93856, 93863, 93870, 93877, - 93884, 93891, 93898, 93905, 93912, 93919, 93926, 93933, 93940, 93947, - 93954, 93961, 93968, 93975, 93982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93989, 93993, - 93997, 94001, 94005, 94009, 94013, 94017, 94021, 94025, 94030, 94035, - 94040, 94045, 94050, 94055, 94060, 94065, 94070, 94076, 94082, 94088, - 94095, 94102, 94109, 94116, 94123, 94130, 94137, 94144, 94151, 0, 94158, - 94162, 94166, 94170, 94174, 94178, 94181, 94185, 94188, 94192, 94195, - 94199, 94203, 94208, 94212, 94217, 94220, 94224, 94227, 94231, 94234, - 94238, 94242, 94246, 94250, 94254, 94258, 94262, 94266, 94270, 94274, - 94278, 94282, 94286, 94290, 94294, 94298, 94302, 94306, 94309, 94312, - 94316, 94320, 94324, 94327, 94330, 94333, 94337, 94341, 94345, 94349, - 94352, 94355, 94359, 94365, 94371, 94377, 94382, 94389, 94393, 94398, - 94402, 94407, 94412, 94418, 94423, 94429, 94433, 94438, 94442, 94447, - 94450, 94453, 94457, 94462, 94468, 94473, 94479, 0, 0, 0, 0, 94484, - 94487, 94490, 94493, 94496, 94499, 94502, 94505, 94508, 94511, 94515, - 94519, 94523, 94527, 94531, 94535, 94539, 94543, 94547, 94552, 94557, - 94561, 94564, 94567, 94570, 94573, 94576, 94579, 94582, 94585, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94588, 94593, 94598, 94603, 94607, - 94612, 94616, 94621, 94625, 94630, 94634, 94639, 94643, 94648, 94652, - 94657, 94662, 94667, 94672, 94677, 94682, 94687, 94692, 94697, 94702, - 94707, 94712, 94717, 94722, 94727, 94732, 94737, 94742, 94747, 94752, - 94756, 94760, 94765, 94770, 94775, 94779, 94783, 94787, 94792, 94797, - 94802, 94807, 94811, 94815, 94821, 94826, 94832, 94837, 94843, 94848, - 94854, 94859, 94865, 94870, 94875, 94880, 94885, 94889, 94894, 94900, - 94904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94909, 94916, 94923, - 94930, 94937, 94944, 94951, 94958, 94965, 94972, 94979, 94986, 94993, - 95000, 95007, 95014, 95021, 95028, 95035, 95042, 95049, 95056, 95063, - 95070, 95077, 0, 0, 0, 0, 0, 0, 0, 95084, 95091, 95097, 95103, 95109, - 95115, 95121, 95127, 95133, 95139, 0, 0, 0, 0, 0, 0, 95145, 95150, 95155, - 95160, 95165, 95169, 95173, 95177, 95182, 95187, 95192, 95197, 95202, - 95207, 95212, 95217, 95222, 95227, 95232, 95237, 95242, 95247, 95252, - 95257, 95262, 95267, 95272, 95277, 95282, 95287, 95292, 95297, 95302, - 95307, 95312, 95317, 95322, 95327, 95332, 95337, 95342, 95347, 95353, - 95358, 95364, 95369, 95375, 95380, 95386, 95392, 95396, 95401, 95405, 0, - 95409, 95414, 95418, 95422, 95426, 95430, 95434, 95438, 95442, 95446, - 95450, 95455, 95459, 95464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95469, - 95473, 95477, 95481, 95484, 95488, 95491, 95495, 95498, 95502, 95506, - 95511, 95515, 95520, 95523, 95527, 95530, 95534, 95537, 95541, 95545, - 95549, 95553, 95557, 95561, 95565, 95569, 95573, 95577, 95581, 95585, - 95589, 95593, 95597, 95601, 95605, 95609, 95612, 95615, 95619, 95623, - 95627, 95630, 95633, 95636, 95640, 95644, 95648, 95652, 95656, 95659, - 95662, 95667, 95671, 95676, 95680, 95685, 95690, 95696, 95701, 95707, - 95711, 95716, 95720, 95725, 95729, 95733, 95737, 95741, 95744, 95747, - 95751, 95755, 0, 0, 0, 0, 0, 0, 0, 95758, 95762, 95765, 95768, 95771, - 95774, 95777, 95780, 95783, 95786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 95789, 95793, 95798, 95802, 95807, 95811, 95816, 95820, 95825, 95829, - 95834, 95838, 95843, 95848, 95853, 95858, 95863, 95868, 95873, 95878, - 95883, 95888, 95893, 95898, 95903, 95908, 95913, 95918, 95923, 95928, - 95932, 95936, 95941, 95946, 95951, 95955, 95959, 95963, 95968, 95973, - 95978, 95982, 95986, 95991, 95996, 96001, 96007, 96012, 96018, 96023, - 96029, 96034, 96040, 96045, 96051, 96056, 0, 0, 0, 0, 0, 0, 0, 0, 96061, - 96066, 96070, 96074, 96078, 96082, 96086, 96090, 96094, 96098, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 96102, 96105, 96110, 96116, 96124, 96129, 96135, 96143, 96149, - 96155, 96159, 96163, 96170, 96179, 96186, 96195, 96201, 96210, 96217, - 96224, 96231, 96241, 96247, 96251, 96258, 96267, 96277, 96284, 96291, - 96295, 96299, 96306, 96316, 96320, 96327, 96334, 96341, 96347, 96354, - 96361, 96368, 96375, 96379, 96383, 96387, 96394, 96398, 96405, 96412, - 96426, 96435, 96439, 96443, 96447, 96454, 96458, 96462, 96466, 96474, - 96482, 96501, 96511, 96531, 96535, 96539, 96543, 96547, 96551, 96555, - 96559, 96566, 96570, 96573, 96577, 96581, 96587, 96594, 96603, 96607, - 96616, 96625, 96633, 96637, 96644, 96648, 96652, 96656, 96660, 96671, - 96680, 96689, 96698, 96707, 96719, 96728, 96737, 96746, 96754, 96763, - 96775, 96784, 96793, 96802, 96814, 96823, 96832, 96844, 96853, 96862, - 96874, 96883, 96887, 96891, 96895, 96899, 96903, 96907, 96911, 96918, - 96922, 96926, 96937, 96941, 96945, 96952, 96958, 96964, 96968, 96975, - 96979, 96983, 96987, 96991, 96995, 96999, 97005, 97013, 97017, 97021, - 97024, 97030, 97040, 97044, 97056, 97063, 97070, 97077, 97084, 97090, - 97094, 97098, 97102, 97106, 97113, 97122, 97129, 97137, 97145, 97151, - 97155, 97159, 97163, 97167, 97173, 97182, 97194, 97201, 97208, 97217, - 97228, 97234, 97243, 97252, 97259, 97268, 97275, 97282, 97292, 97299, - 97306, 97313, 97320, 97324, 97330, 97334, 97345, 97353, 97362, 97374, - 97381, 97388, 97398, 97405, 97414, 97421, 97430, 97437, 97444, 97454, - 97461, 97468, 97478, 97485, 97497, 97506, 97513, 97520, 97527, 97536, - 97546, 97559, 97566, 97576, 97586, 97593, 97602, 97615, 97622, 97629, - 97636, 97646, 97656, 97663, 97673, 97680, 97687, 97697, 97703, 97710, - 97717, 97724, 97734, 97741, 97748, 97755, 97761, 97768, 97778, 97785, - 97789, 97797, 97801, 97813, 97817, 97831, 97835, 97839, 97843, 97847, - 97853, 97860, 97868, 97872, 97876, 97880, 97884, 97891, 97895, 97901, - 97907, 97915, 97919, 97926, 97934, 97938, 97942, 97948, 97952, 97961, - 97970, 97977, 97987, 97993, 97997, 98001, 98009, 98016, 98023, 98029, - 98033, 98041, 98045, 98052, 98064, 98071, 98081, 98087, 98091, 98100, - 98107, 98116, 98120, 98124, 98131, 98135, 98139, 98143, 98147, 98150, - 98156, 98162, 98166, 98170, 98177, 98184, 98191, 98198, 98205, 98212, - 98219, 98226, 98232, 98236, 98240, 98247, 98254, 98261, 98268, 98275, - 98279, 98282, 98287, 98291, 98295, 98304, 98313, 98317, 98321, 98327, - 98333, 98350, 98356, 98360, 98369, 98373, 98377, 98384, 98392, 98400, - 98406, 98410, 98414, 98418, 98422, 98425, 98431, 98438, 98448, 98455, - 98462, 98469, 98475, 98482, 98489, 98496, 98503, 98510, 98519, 98526, - 98538, 98545, 98552, 98562, 98573, 98580, 98587, 98594, 98601, 98608, - 98615, 98622, 98629, 98636, 98643, 98653, 98663, 98673, 98680, 98690, - 98697, 98704, 98711, 98718, 98724, 98731, 98738, 98745, 98752, 98759, - 98766, 98773, 98780, 98786, 98793, 98800, 98809, 98816, 98823, 98827, - 98835, 98839, 98843, 98847, 98851, 98855, 98862, 98866, 98875, 98879, - 98886, 98894, 98898, 98902, 98906, 98919, 98935, 98939, 98943, 98950, - 98956, 98963, 98967, 98971, 98975, 98979, 98983, 98990, 98994, 99012, - 99016, 99020, 99027, 99031, 99035, 99041, 99045, 99049, 99057, 99061, - 99065, 99069, 99073, 99079, 99090, 99099, 99108, 99115, 99122, 99133, - 99140, 99147, 99154, 99161, 99168, 99175, 99182, 99192, 99198, 99205, - 99215, 99224, 99231, 99240, 99250, 99257, 99264, 99271, 99278, 99290, - 99297, 99304, 99311, 99318, 99325, 99335, 99342, 99349, 99359, 99372, - 99384, 99391, 99401, 99408, 99415, 99422, 99436, 99442, 99450, 99460, - 99470, 99477, 99484, 99490, 99494, 99501, 99511, 99517, 99530, 99534, - 99538, 99545, 99549, 99556, 99566, 99570, 99574, 99578, 99582, 99586, - 99593, 99597, 99604, 99611, 99618, 99627, 99636, 99646, 99653, 99660, - 99667, 99677, 99684, 99694, 99701, 99711, 99718, 99725, 99735, 99745, - 99752, 99758, 99766, 99774, 99780, 99786, 99790, 99794, 99801, 99809, - 99815, 99819, 99823, 99827, 99834, 99846, 99849, 99856, 99862, 99866, - 99870, 99874, 99878, 99882, 99886, 99890, 99894, 99898, 99902, 99909, - 99913, 99919, 99923, 99927, 99931, 99937, 99944, 99951, 99958, 99969, - 99977, 99981, 99987, 99996, 100003, 100009, 100012, 100016, 100020, - 100026, 100035, 100043, 100047, 100053, 100057, 100061, 100065, 100071, - 100078, 100084, 100088, 100094, 100098, 100102, 100111, 100123, 100127, - 100134, 100141, 100151, 100158, 100170, 100177, 100184, 100191, 100202, - 100212, 100225, 100235, 100242, 100246, 100250, 100254, 100258, 100267, - 100276, 100285, 100302, 100311, 100317, 100324, 100332, 100345, 100349, - 100358, 100367, 100376, 100385, 100396, 100405, 100414, 100423, 100432, - 100441, 100450, 100460, 100463, 100467, 100471, 100475, 100479, 100483, - 100489, 100496, 100503, 100510, 100516, 100522, 100529, 100535, 100542, - 100550, 100554, 100561, 100568, 100575, 100583, 100586, 100590, 100594, - 100598, 100601, 100607, 100611, 100617, 100624, 100631, 100637, 100644, - 100651, 100658, 100665, 100672, 100679, 100686, 100693, 100700, 100707, - 100714, 100721, 100728, 100735, 100741, 100745, 100754, 100758, 100762, - 100766, 100770, 100776, 100783, 100790, 100797, 100804, 100811, 100817, - 100825, 100829, 100833, 100837, 100841, 100847, 100864, 100881, 100885, - 100889, 100893, 100897, 100901, 100905, 100911, 100918, 100922, 100928, - 100935, 100942, 100949, 100956, 100963, 100972, 100979, 100986, 100993, - 101000, 101004, 101008, 101014, 101026, 101030, 101034, 101043, 101047, - 101051, 101055, 101061, 101065, 101069, 101078, 101082, 101086, 101090, - 101097, 101101, 101105, 101109, 101113, 101117, 101121, 101125, 101129, - 101135, 101142, 101149, 101155, 101159, 101176, 101182, 101186, 101192, - 101198, 101204, 101210, 101216, 101222, 101226, 101230, 101234, 101240, - 101244, 101250, 101254, 101258, 101265, 101272, 101289, 101293, 101297, - 101301, 101305, 101309, 101321, 101324, 101329, 101334, 101349, 101359, - 101371, 101375, 101379, 101383, 101389, 101396, 101403, 101413, 101425, - 101431, 101437, 101446, 101450, 101454, 101461, 101471, 101478, 101484, - 101488, 101492, 101499, 101505, 101509, 101515, 101519, 101527, 101533, - 101537, 101545, 101553, 101560, 101566, 101573, 101580, 101590, 101600, - 101604, 101608, 101612, 101616, 101622, 101629, 101635, 101642, 101649, - 101656, 101665, 101672, 101679, 101685, 101692, 101699, 101706, 101713, - 101720, 101727, 101733, 101740, 101747, 101754, 101763, 101770, 101777, - 101781, 101787, 101791, 101797, 101804, 101811, 101818, 101822, 101826, - 101830, 101834, 101838, 101845, 101849, 101853, 101859, 101867, 101871, - 101875, 101879, 101883, 101890, 101894, 101898, 101906, 101910, 101914, - 101918, 101922, 101928, 101932, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 101936, 101942, 101948, 101955, 101962, 101969, 101976, 101983, - 101990, 101996, 102003, 102010, 102017, 102024, 102031, 102038, 102044, - 102050, 102056, 102062, 102068, 102074, 102080, 102086, 102092, 102099, - 102106, 102113, 102120, 102127, 102134, 102140, 102146, 102152, 102159, - 102166, 102172, 102178, 102187, 102194, 102201, 102208, 102215, 102222, - 102229, 102235, 102241, 102247, 102256, 102263, 102270, 102281, 102292, - 102298, 102304, 102310, 102319, 102326, 102333, 102343, 102353, 102364, - 102375, 102387, 102400, 102411, 102422, 102434, 102447, 102458, 102469, - 102480, 102491, 102502, 102514, 102522, 102530, 102539, 102548, 102557, - 102563, 102569, 102575, 102582, 102592, 102599, 102609, 102614, 102619, - 102625, 102631, 102639, 102647, 102656, 102667, 102678, 102686, 102694, - 102703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102712, 102723, 102730, - 102738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102746, 102750, 102754, - 102758, 102762, 102766, 102770, 102774, 102778, 102782, 102786, 102790, - 102794, 102798, 102802, 102806, 102810, 102814, 102818, 102822, 102826, - 102830, 102834, 102838, 102842, 102846, 102850, 102854, 102858, 102862, - 102866, 102870, 102874, 102878, 102882, 102886, 102890, 102894, 102898, - 102902, 102906, 102910, 102914, 102918, 102922, 102926, 102930, 102934, - 102938, 102942, 102946, 102950, 102954, 102958, 102962, 102966, 102970, - 102974, 102978, 102982, 102986, 102990, 102994, 102998, 103002, 103006, - 103010, 103014, 103018, 103022, 103026, 103030, 103034, 103038, 103042, - 103046, 103050, 103054, 103058, 103062, 103066, 103070, 103074, 103078, - 103082, 103086, 103090, 103094, 103098, 103102, 103106, 103110, 103114, - 103118, 103122, 103126, 103130, 103134, 103138, 103142, 103146, 103150, - 103154, 103158, 103162, 103166, 103170, 103174, 103178, 103182, 103186, - 103190, 103194, 103198, 103202, 103206, 103210, 103214, 103218, 103222, - 103226, 103230, 103234, 103238, 103242, 103246, 103250, 103254, 103258, - 103262, 103266, 103270, 103274, 103278, 103282, 103286, 103290, 103294, - 103298, 103302, 103306, 103310, 103314, 103318, 103322, 103326, 103330, - 103334, 103338, 103342, 103346, 103350, 103354, 103358, 103362, 103366, - 103370, 103374, 103378, 103382, 103386, 103390, 103394, 103398, 103402, - 103406, 103410, 103414, 103418, 103422, 103426, 103430, 103434, 103438, - 103442, 103446, 103450, 103454, 103458, 103462, 103466, 103470, 103474, - 103478, 103482, 103486, 103490, 103494, 103498, 103502, 103506, 103510, - 103514, 103518, 103522, 103526, 103530, 103534, 103538, 103542, 103546, - 103550, 103554, 103558, 103562, 103566, 103570, 103574, 103578, 103582, - 103586, 103590, 103594, 103598, 103602, 103606, 103610, 103614, 103618, - 103622, 103626, 103630, 103634, 103638, 103642, 103646, 103650, 103654, - 103658, 103662, 103666, 103670, 103674, 103678, 103682, 103686, 103690, - 103694, 103698, 103702, 103706, 103710, 103714, 103718, 103722, 103726, - 103730, 103734, 103738, 103742, 103746, 103750, 103754, 103758, 103762, - 103766, 103770, 103774, 103778, 103782, 103786, 103790, 103794, 103798, - 103802, 103806, 103810, 103814, 103818, 103822, 103826, 103830, 103834, - 103838, 103842, 103846, 103850, 103854, 103858, 103862, 103866, 103870, - 103874, 103878, 103882, 103886, 103890, 103894, 103898, 103902, 103906, - 103910, 103914, 103918, 103922, 103926, 103930, 103934, 103938, 103942, - 103946, 103950, 103954, 103958, 103962, 103966, 103970, 103974, 103978, - 103982, 103986, 103990, 103994, 103998, 104002, 104006, 104010, 104014, - 104018, 104022, 104026, 104030, 104034, 104038, 104042, 104046, 104050, - 104054, 104058, 104062, 104066, 104070, 104074, 104078, 104082, 104086, - 104090, 104094, 104098, 104102, 104106, 104110, 104114, 104118, 104122, - 104126, 104130, 104134, 104138, 104142, 104146, 104150, 104154, 104158, - 104162, 104166, 104170, 104174, 104178, 104182, 104186, 104190, 104194, - 104198, 104202, 104206, 104210, 104214, 104218, 104222, 104226, 104230, - 104234, 104238, 104242, 104246, 104250, 104254, 104258, 104262, 104266, - 104270, 104274, 104278, 104282, 104286, 104290, 104294, 104298, 104302, - 104306, 104310, 104314, 104318, 104322, 104326, 104330, 104334, 104338, - 104342, 104346, 104350, 104354, 104358, 104362, 104366, 104370, 104374, - 104378, 104382, 104386, 104390, 104394, 104398, 104402, 104406, 104410, - 104414, 104418, 104422, 104426, 104430, 104434, 104438, 104442, 104446, - 104450, 104454, 104458, 104462, 104466, 104470, 104474, 104478, 104482, - 104486, 104490, 104494, 104498, 104502, 104506, 104510, 104514, 104518, - 104522, 104526, 104530, 104534, 104538, 104542, 104546, 104550, 104554, - 104558, 104562, 104566, 104570, 104574, 104578, 104582, 104586, 104590, - 104594, 104598, 104602, 104606, 104610, 104614, 104618, 104622, 104626, - 104630, 104634, 104638, 104642, 104646, 104650, 104654, 104658, 104662, - 104666, 104670, 104674, 104678, 104682, 104686, 104690, 104694, 104698, - 104702, 104706, 104710, 104714, 104718, 104722, 104726, 104730, 104734, - 104738, 104742, 104746, 104750, 104754, 104758, 104762, 104766, 104770, - 104774, 104778, 104782, 104786, 104790, 104794, 104798, 104802, 104806, - 104810, 104814, 104818, 104822, 104826, 104830, 104834, 104838, 104842, - 104846, 104850, 104854, 104858, 104862, 104866, 104870, 104874, 104878, - 104882, 104886, 104890, 104894, 104898, 104902, 104906, 104910, 104914, - 104918, 104922, 104926, 104930, 104934, 104938, 104942, 104946, 104950, - 104954, 104958, 104962, 104966, 104970, 104974, 104978, 104982, 104986, - 104990, 104994, 104998, 105002, 105006, 105010, 105014, 105018, 105022, - 105026, 105030, 105034, 105038, 105042, 105046, 105050, 105054, 105058, - 105062, 105066, 105070, 105074, 105078, 105082, 105086, 105090, 105094, - 105098, 105102, 105106, 105110, 105114, 105118, 105122, 105126, 105130, - 105134, 105138, 105142, 105146, 105150, 105154, 105158, 105162, 105166, - 105170, 105174, 105178, 105182, 105186, 105190, 105194, 105198, 105202, - 105206, 105210, 105214, 105218, 105222, 105226, 105230, 105234, 105238, - 105242, 105246, 105250, 105254, 105258, 105262, 105266, 105270, 105274, - 105278, 105282, 105286, 105290, 105294, 105298, 105302, 105306, 105310, - 105314, 105318, 105322, 105326, 105330, 105334, 105338, 105342, 105346, - 105350, 105354, 105358, 105362, 105366, 105370, 105374, 105378, 105382, - 105386, 105390, 105394, 105398, 105402, 105406, 105410, 105414, 105418, - 105422, 105426, 105430, 105434, 105438, 105442, 105446, 105450, 105454, - 105458, 105462, 105466, 105470, 105474, 105478, 105482, 105486, 105490, - 105494, 105498, 105502, 105506, 105510, 105514, 105518, 105522, 105526, - 105530, 105534, 105538, 105542, 105546, 105550, 105554, 105558, 105562, - 105566, 105570, 105574, 105578, 105582, 105586, 105590, 105594, 105598, - 105602, 105606, 105610, 105614, 105618, 105622, 105626, 105630, 105634, - 105638, 105642, 105646, 105650, 105654, 105658, 105662, 105666, 105670, - 105674, 105678, 105682, 105686, 105690, 105694, 105698, 105702, 105706, - 105710, 105714, 105718, 105722, 105726, 105730, 105734, 105738, 105742, - 105746, 105750, 105754, 105758, 105762, 105766, 105770, 105774, 105778, - 105782, 105786, 105790, 105794, 105798, 105802, 105806, 105810, 105814, - 105818, 105822, 105826, 105830, 105834, 105838, 105842, 105846, 105850, - 105854, 105858, 105862, 105866, 105870, 105874, 105878, 105882, 105886, - 105890, 105894, 105898, 105902, 105906, 105910, 105914, 105918, 105922, - 105926, 105930, 105934, 105938, 105942, 105946, 105950, 105954, 105958, - 105962, 105966, 105970, 105974, 105978, 105982, 105986, 105990, 105994, - 105998, 106002, 106006, 106010, 106014, 106018, 106022, 106026, 106030, - 106034, 106038, 106042, 106046, 106050, 106054, 106058, 106062, 106066, - 106070, 106074, 106078, 106082, 106086, 106090, 106094, 106098, 106102, - 106106, 106110, 106114, 106118, 106122, 106126, 106130, 106134, 106138, - 106142, 106146, 106150, 106154, 106158, 106162, 106166, 106170, 106174, - 106178, 106182, 106186, 106190, 106194, 106198, 106202, 106206, 106210, - 106214, 106218, 106222, 106226, 106230, 106234, 106238, 106242, 106246, - 106250, 106254, 106258, 106262, 106266, 106270, 106274, 106278, 106282, - 106286, 106290, 106294, 106298, 106302, 106306, 106310, 106314, 106318, - 106322, 106326, 106330, 106334, 106338, 106342, 106346, 106350, 106354, - 106358, 106362, 106366, 106370, 106374, 106378, 106382, 106386, 106390, - 106394, 106398, 106402, 106406, 106410, 106414, 106418, 106422, 106426, - 106430, 106434, 106438, 106442, 106446, 106450, 106454, 106458, 106462, - 106466, 106470, 106474, 106478, 106482, 106486, 106490, 106494, 106498, - 106502, 106506, 106510, 106514, 106518, 106522, 106526, 106530, 106534, - 106538, 106542, 106546, 106550, 106554, 106558, 106562, 106566, 106570, - 106574, 106578, 106582, 106586, 106590, 106594, 106598, 106602, 106606, - 106610, 106614, 106618, 106622, 106626, 106630, 106634, 106638, 106642, - 106646, 106650, 106654, 106658, 106662, 106666, 106670, 106674, 106678, - 106682, 106686, 106690, 106694, 106698, 106702, 106706, 106710, 106714, - 106718, 106722, 106726, 106730, 106734, 106738, 106742, 106746, 106750, - 106754, 106758, 106762, 106766, 106770, 106774, 106778, 106782, 106786, - 106790, 106794, 106798, 106802, 106806, 106810, 106814, 106818, 106822, - 106826, 106830, 106834, 106838, 106842, 106846, 106850, 106854, 106858, - 106862, 106866, 106870, 106874, 106878, 106882, 106886, 106890, 106894, - 106898, 106902, 106906, 106910, 106914, 106918, 106922, 106926, 106930, - 106934, 106938, 106942, 106946, 106950, 106954, 106958, 106962, 106966, - 106970, 106974, 106978, 106982, 106986, 106990, 106994, 106998, 107002, - 107006, 107010, 107014, 107018, 107022, 107026, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 107030, 107037, 107044, 107053, 107062, 107069, 107074, 107081, - 107088, 107097, 107108, 107119, 107124, 107131, 107136, 107141, 107146, - 107151, 107156, 107161, 107166, 107171, 107176, 107181, 107186, 107193, - 107200, 107205, 107210, 107215, 107220, 107227, 107234, 107242, 107247, - 107254, 107259, 107264, 107269, 107274, 107279, 107286, 107293, 107298, - 107303, 107308, 107313, 107318, 107323, 107328, 107333, 107338, 107343, - 107348, 107353, 107358, 107363, 107368, 107373, 107378, 107383, 107388, - 107395, 107400, 107405, 107414, 107421, 107426, 107431, 107436, 107441, - 107446, 107451, 107456, 107461, 107466, 107471, 107476, 107481, 107486, - 107491, 107496, 107501, 107506, 107511, 107516, 107521, 107526, 107532, - 107540, 107546, 107554, 107562, 107570, 107576, 107582, 107588, 107594, - 107600, 107608, 107618, 107626, 107634, 107640, 107646, 107654, 107662, - 107668, 107676, 107684, 107692, 107698, 107704, 107710, 107716, 107722, - 107728, 107736, 107744, 107750, 107756, 107762, 107768, 107774, 107782, - 107788, 107794, 107800, 107806, 107812, 107818, 107826, 107832, 107838, - 107844, 107850, 107858, 107866, 107872, 107878, 107884, 107889, 107895, - 107901, 107908, 107913, 107918, 107923, 107928, 107933, 107938, 107943, - 107948, 107953, 107962, 107969, 107974, 107979, 107984, 107991, 107996, - 108001, 108006, 108013, 108018, 108023, 108028, 108033, 108038, 108043, - 108048, 108053, 108058, 108063, 108068, 108075, 108080, 108087, 108092, - 108097, 108104, 108109, 108114, 108119, 108124, 108129, 108134, 108139, - 108144, 108149, 108154, 108159, 108164, 108169, 108174, 108179, 108184, - 108189, 108194, 108199, 108206, 108211, 108216, 108221, 108226, 108231, - 108236, 108241, 108246, 108251, 108256, 108261, 108266, 108271, 108278, - 108283, 108288, 108295, 108300, 108305, 108310, 108315, 108320, 108325, - 108330, 108335, 108340, 108345, 108352, 108357, 108362, 108367, 108372, - 108377, 108384, 108391, 108396, 108401, 108406, 108411, 108416, 108421, - 108426, 108431, 108436, 108441, 108446, 108451, 108456, 108461, 108466, - 108471, 108476, 108481, 108486, 108491, 108496, 108501, 108506, 108511, - 108516, 108521, 108526, 108531, 108536, 108541, 108546, 108551, 108556, - 108561, 108566, 108571, 108578, 108583, 108588, 108593, 108598, 108603, - 108608, 108613, 108618, 108623, 108628, 108633, 108638, 108643, 108648, - 108653, 108658, 108663, 108668, 108673, 108678, 108683, 108688, 108693, - 108698, 108703, 108708, 108713, 108718, 108723, 108728, 108733, 108738, - 108743, 108748, 108753, 108758, 108763, 108768, 108773, 108778, 108783, - 108788, 108793, 108798, 108803, 108808, 108813, 108818, 108823, 108828, - 108833, 108838, 108843, 108848, 108853, 108858, 108863, 108868, 108875, - 108880, 108885, 108890, 108895, 108900, 108905, 108909, 108914, 108919, - 108924, 108929, 108934, 108939, 108944, 108949, 108954, 108959, 108964, - 108969, 108974, 108979, 108986, 108991, 108996, 109002, 109007, 109012, - 109017, 109022, 109027, 109032, 109037, 109042, 109047, 109052, 109057, - 109062, 109067, 109072, 109077, 109082, 109087, 109092, 109097, 109102, - 109107, 109112, 109117, 109122, 109127, 109132, 109137, 109142, 109147, - 109152, 109157, 109162, 109167, 109172, 109177, 109182, 109187, 109192, - 109197, 109202, 109207, 109212, 109217, 109224, 109229, 109234, 109241, - 109248, 109253, 109258, 109263, 109268, 109273, 109278, 109283, 109288, - 109293, 109298, 109303, 109308, 109313, 109318, 109323, 109328, 109333, - 109338, 109343, 109348, 109353, 109358, 109363, 109368, 109373, 109380, - 109385, 109390, 109395, 109400, 109405, 109410, 109415, 109420, 109425, - 109430, 109435, 109440, 109445, 109450, 109455, 109460, 109465, 109470, - 109477, 109482, 109487, 109492, 109497, 109502, 109507, 109512, 109518, - 109523, 109528, 109533, 109538, 109543, 109548, 109553, 109558, 109565, - 109572, 109577, 109582, 109586, 109591, 109595, 109599, 109604, 109611, - 109616, 109621, 109630, 109635, 109640, 109645, 109650, 109657, 109664, - 109669, 109674, 109679, 109684, 109691, 109696, 109701, 109706, 109711, - 109716, 109721, 109726, 109731, 109736, 109741, 109746, 109751, 109758, - 109762, 109767, 109772, 109777, 109782, 109786, 109791, 109796, 109801, - 109806, 109811, 109816, 109821, 109826, 109831, 109837, 109843, 109849, - 109855, 109861, 109867, 109873, 109879, 109885, 109891, 109897, 109903, - 109908, 109914, 109920, 109926, 109932, 109938, 109944, 109950, 109956, - 109962, 109968, 109974, 109979, 109985, 109991, 109997, 110003, 110009, - 110015, 110021, 110027, 110033, 110039, 110045, 110051, 110057, 110063, - 110069, 110075, 110081, 110087, 110093, 110099, 110104, 110110, 110116, - 110122, 110128, 110134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 110140, 110143, 110147, 110151, 110155, 110158, - 110162, 110167, 110171, 110175, 110179, 110183, 110187, 110192, 110197, - 110201, 110205, 110208, 110212, 110217, 110222, 110226, 110230, 110234, - 110238, 110242, 110246, 110250, 110254, 110258, 110262, 110265, 110269, - 110273, 110277, 110281, 110285, 110289, 110295, 110298, 110302, 110306, - 110310, 110314, 110318, 110322, 110326, 110330, 110334, 110339, 110344, - 110350, 110354, 110358, 110362, 110366, 110370, 110374, 110379, 110382, - 110386, 110390, 110394, 110398, 110404, 110408, 110412, 110416, 110420, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110424, 110428, 110432, 110438, 110444, - 110448, 110453, 110458, 110463, 110468, 110472, 110477, 110482, 110487, - 110491, 110496, 110501, 110506, 110510, 110515, 110520, 110525, 110530, - 110535, 110540, 110545, 110550, 110554, 110559, 110564, 110569, 110574, - 110579, 110584, 110589, 110594, 110599, 110604, 110609, 110616, 110621, - 110628, 110633, 110638, 110643, 110648, 110653, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 110658, 110662, 110668, 110671, 110674, 110678, - 110682, 110686, 110690, 110694, 110698, 110702, 110708, 110714, 110720, - 110726, 110732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 110738, 110743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110749, 110754, 110759, - 110764, 110771, 110778, 110785, 110792, 110797, 110802, 110807, 110812, - 110819, 110824, 110831, 110838, 110843, 110848, 110853, 110860, 110865, - 110870, 110877, 110884, 110889, 110894, 110899, 110906, 110913, 110920, - 110925, 110930, 110937, 110944, 110951, 110958, 110963, 110968, 110973, - 110980, 110985, 110990, 110995, 111002, 111011, 111018, 111023, 111028, - 111033, 111038, 111043, 111048, 111057, 111064, 111069, 111076, 111083, - 111088, 111093, 111098, 111105, 111110, 111117, 111124, 111129, 111134, - 111139, 111146, 111153, 111158, 111163, 111170, 111177, 111184, 111189, - 111194, 111199, 111204, 111211, 111220, 111229, 111234, 111241, 111250, - 111255, 111260, 111265, 111270, 111277, 111284, 111291, 111298, 111303, - 111308, 111313, 111320, 111327, 111334, 111339, 111344, 111351, 111356, - 111363, 111368, 111375, 111380, 111387, 111394, 111399, 111404, 111409, - 111414, 111419, 111424, 111429, 111434, 111439, 111446, 111453, 111460, - 111467, 111474, 111483, 111488, 111493, 111500, 111507, 111512, 111519, - 111526, 111533, 111540, 111547, 111554, 111559, 111564, 111569, 111574, - 111579, 111588, 111597, 111606, 111615, 111624, 111633, 111642, 111651, - 111656, 111667, 111678, 111687, 111692, 111697, 111702, 111707, 111716, - 111723, 111730, 111737, 111744, 111751, 111758, 111767, 111776, 111787, - 111796, 111807, 111816, 111823, 111832, 111843, 111852, 111861, 111870, - 111879, 111886, 111893, 111900, 111909, 111918, 111929, 111938, 111947, - 111958, 111963, 111968, 111979, 111987, 111996, 112005, 112014, 112025, - 112034, 112043, 112054, 112065, 112076, 112087, 112098, 112109, 112116, - 112123, 112130, 112137, 112148, 112157, 112164, 112171, 112178, 112189, - 112200, 112211, 112222, 112233, 112244, 112255, 112266, 112273, 112280, - 112289, 112298, 112305, 112312, 112319, 112328, 112337, 112346, 112353, - 112362, 112371, 112380, 112387, 112394, 112399, 112405, 112412, 112419, - 112426, 112433, 112440, 112447, 112456, 112465, 112474, 112483, 112490, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112499, 112505, 112510, 112515, 112522, - 112528, 112534, 112540, 112546, 112552, 112558, 112564, 112568, 112572, - 112578, 112584, 112590, 112594, 112599, 112604, 112608, 112612, 112615, - 112621, 112627, 112633, 112639, 112645, 112651, 112657, 112663, 112669, - 112679, 112689, 112695, 112701, 112711, 112721, 112727, 0, 0, 112733, - 112741, 112746, 112751, 112757, 112763, 112769, 112775, 112781, 112787, - 112794, 112801, 112807, 112813, 112819, 112825, 112831, 112837, 112843, - 112849, 112854, 112860, 112866, 112872, 112878, 112884, 112893, 112899, - 112904, 112912, 112919, 112926, 112935, 112944, 112953, 112962, 112971, - 112980, 112989, 112998, 113008, 113018, 113026, 113034, 113043, 113052, - 113058, 113064, 113070, 113076, 113084, 113092, 113096, 113102, 113107, - 113113, 113119, 113125, 113131, 113137, 113146, 113151, 113158, 113163, - 113168, 113173, 113179, 113185, 113191, 113198, 113203, 113208, 113213, - 113218, 113223, 113229, 113235, 113241, 113247, 113253, 113259, 113265, - 113271, 113276, 113281, 113286, 113291, 113296, 113301, 113306, 113311, - 113317, 113323, 113328, 113333, 113338, 113343, 113348, 113354, 113361, - 113365, 113369, 113373, 113377, 113381, 113385, 113389, 113393, 113401, - 113411, 113415, 113419, 113425, 113431, 113437, 113443, 113449, 113455, - 113461, 113467, 113473, 113479, 113485, 113491, 113497, 113503, 113507, - 113511, 113518, 113524, 113530, 113536, 113541, 113548, 113553, 113559, - 113565, 113571, 113577, 113582, 113586, 113592, 113596, 113600, 113604, - 113610, 113616, 113620, 113626, 113632, 113638, 113644, 113650, 113658, - 113666, 113672, 113678, 113684, 113690, 113702, 113714, 113728, 113740, - 113752, 113766, 113780, 113794, 113798, 113806, 113814, 113819, 113823, - 113827, 113831, 113835, 113839, 113843, 113847, 113853, 113859, 113865, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113871, 113877, 113883, 113889, 113895, - 113901, 113907, 113913, 113919, 113925, 113931, 113937, 113943, 113949, - 113955, 113961, 113967, 113973, 113979, 113985, 113991, 113997, 114003, - 114009, 114015, 114021, 114027, 114033, 114039, 114045, 114051, 114057, - 114063, 114069, 114075, 114081, 114087, 114093, 114099, 114105, 114111, - 114117, 114123, 114129, 114135, 114141, 114147, 114153, 114159, 114165, - 114171, 114177, 114183, 114189, 114195, 114201, 114207, 114213, 114219, - 114225, 114231, 114237, 114243, 114249, 114255, 114261, 114267, 114272, - 114277, 114282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114286, 114291, 114298, - 114305, 114312, 114319, 114324, 114328, 114334, 114338, 114342, 114348, - 114352, 114356, 114360, 114366, 114373, 114377, 114381, 114385, 114389, - 114393, 114397, 114403, 114407, 114411, 114415, 114419, 114423, 114427, - 114431, 114435, 114439, 114443, 114447, 114451, 114456, 114460, 114464, - 114468, 114472, 114476, 114480, 114484, 114488, 114492, 114499, 114503, - 114511, 114515, 114519, 114523, 114527, 114531, 114535, 114539, 114546, - 114550, 114554, 114558, 114562, 114566, 114572, 114576, 114582, 114586, - 114590, 114594, 114598, 114602, 114606, 114610, 114614, 114618, 114622, - 114626, 114630, 114634, 114638, 114642, 114646, 114650, 114654, 114658, - 114666, 114670, 114674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114678, 114686, - 114694, 114702, 114710, 114718, 114726, 114734, 114742, 114750, 114758, - 114766, 114774, 114782, 114790, 114798, 114806, 114814, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 114822, 114826, 114831, 114836, 114841, 114845, - 114850, 114855, 114860, 114864, 114869, 114874, 114878, 114882, 114887, - 114891, 114896, 114901, 114905, 114910, 114915, 114919, 114924, 114929, - 114934, 114939, 114944, 114948, 114953, 114958, 114963, 114967, 114972, - 114977, 114982, 114986, 114991, 114996, 115000, 115004, 115009, 115013, - 115018, 115023, 115027, 115032, 115037, 115041, 115046, 115051, 115056, - 115061, 115066, 115070, 115075, 115080, 115085, 115089, 115094, 115099, - 115104, 115108, 115113, 115118, 115122, 115126, 115131, 115135, 115140, - 115145, 115149, 115154, 115159, 115163, 115168, 115173, 115178, 115183, - 115188, 115192, 115197, 115202, 115207, 115211, 115216, 0, 115221, - 115225, 115230, 115235, 115239, 115243, 115248, 115252, 115257, 115262, - 115266, 115271, 115276, 115280, 115285, 115290, 115295, 115300, 115305, - 115310, 115316, 115322, 115328, 115333, 115339, 115345, 115351, 115356, - 115362, 115368, 115373, 115378, 115384, 115389, 115395, 115401, 115406, - 115412, 115418, 115423, 115429, 115435, 115441, 115447, 115453, 115458, - 115464, 115470, 115476, 115481, 115487, 115493, 115499, 115504, 115510, - 115516, 115521, 115526, 115532, 115537, 115543, 115549, 115554, 115560, - 115566, 115571, 115577, 115583, 115589, 115595, 115601, 0, 115605, - 115610, 0, 0, 115615, 0, 0, 115620, 115625, 0, 0, 115630, 115635, 115639, - 115644, 0, 115649, 115654, 115659, 115663, 115668, 115673, 115678, - 115683, 115688, 115692, 115697, 115702, 0, 115707, 0, 115712, 115717, - 115721, 115726, 115731, 115735, 115739, 0, 115744, 115749, 115754, - 115758, 115763, 115768, 115772, 115777, 115782, 115787, 115792, 115797, - 115802, 115808, 115814, 115820, 115825, 115831, 115837, 115843, 115848, - 115854, 115860, 115865, 115870, 115876, 115881, 115887, 115893, 115898, - 115904, 115910, 115915, 115921, 115927, 115933, 115939, 115945, 115950, - 115956, 115962, 115968, 115973, 115979, 115985, 115991, 115996, 116002, - 116008, 116013, 116018, 116024, 116029, 116035, 116041, 116046, 116052, - 116058, 116063, 116069, 116075, 116081, 116087, 116093, 116097, 0, - 116102, 116107, 116111, 116116, 0, 0, 116121, 116126, 116131, 116135, - 116139, 116144, 116148, 116153, 0, 116158, 116163, 116168, 116172, - 116177, 116182, 116187, 0, 116192, 116196, 116201, 116206, 116211, - 116215, 116220, 116225, 116230, 116234, 116239, 116244, 116248, 116252, - 116257, 116261, 116266, 116271, 116275, 116280, 116285, 116289, 116294, - 116299, 116304, 116309, 116314, 116318, 0, 116323, 116328, 116332, - 116337, 0, 116342, 116346, 116351, 116356, 116360, 0, 116364, 0, 0, 0, - 116368, 116373, 116378, 116382, 116387, 116392, 116397, 0, 116402, - 116406, 116411, 116416, 116421, 116425, 116430, 116435, 116440, 116444, - 116449, 116454, 116458, 116462, 116467, 116471, 116476, 116481, 116485, - 116490, 116495, 116499, 116504, 116509, 116514, 116519, 116524, 116529, - 116535, 116541, 116547, 116552, 116558, 116564, 116570, 116575, 116581, - 116587, 116592, 116597, 116603, 116608, 116614, 116620, 116625, 116631, - 116637, 116642, 116648, 116654, 116660, 116666, 116672, 116677, 116683, - 116689, 116695, 116700, 116706, 116712, 116718, 116723, 116729, 116735, - 116740, 116745, 116751, 116756, 116762, 116768, 116773, 116779, 116785, - 116790, 116796, 116802, 116808, 116814, 116820, 116824, 116829, 116834, - 116839, 116843, 116848, 116853, 116858, 116862, 116867, 116872, 116876, - 116880, 116885, 116889, 116894, 116899, 116903, 116908, 116913, 116917, - 116922, 116927, 116932, 116937, 116942, 116946, 116951, 116956, 116961, - 116965, 116970, 116975, 116980, 116984, 116989, 116994, 116998, 117002, - 117007, 117011, 117016, 117021, 117025, 117030, 117035, 117039, 117044, - 117049, 117054, 117059, 117064, 117069, 117075, 117081, 117087, 117092, - 117098, 117104, 117110, 117115, 117121, 117127, 117132, 117137, 117143, - 117148, 117154, 117160, 117165, 117171, 117177, 117182, 117188, 117194, - 117200, 117206, 117212, 117217, 117223, 117229, 117235, 117240, 117246, - 117252, 117258, 117263, 117269, 117275, 117280, 117285, 117291, 117296, - 117302, 117308, 117313, 117319, 117325, 117330, 117336, 117342, 117348, - 117354, 117360, 117365, 117371, 117377, 117383, 117388, 117394, 117400, - 117406, 117411, 117417, 117423, 117428, 117433, 117439, 117444, 117450, - 117456, 117461, 117467, 117473, 117478, 117484, 117490, 117496, 117502, - 117508, 117513, 117519, 117525, 117531, 117536, 117542, 117548, 117554, - 117559, 117565, 117571, 117576, 117581, 117587, 117592, 117598, 117604, - 117609, 117615, 117621, 117626, 117632, 117638, 117644, 117650, 117656, - 117662, 117669, 117676, 117683, 117689, 117696, 117703, 117710, 117716, - 117723, 117730, 117736, 117742, 117749, 117755, 117762, 117769, 117775, - 117782, 117789, 117795, 117802, 117809, 117816, 117823, 117830, 117836, - 117843, 117850, 117857, 117863, 117870, 117877, 117884, 117890, 117897, - 117904, 117910, 117916, 117923, 117929, 117936, 117943, 117949, 117956, - 117963, 117969, 117976, 117983, 117990, 117997, 118004, 118009, 118015, - 118021, 118027, 118032, 118038, 118044, 118050, 118055, 118061, 118067, - 118072, 118077, 118083, 118088, 118094, 118100, 118105, 118111, 118117, - 118122, 118128, 118134, 118140, 118146, 118152, 118157, 118163, 118169, - 118175, 118180, 118186, 118192, 118198, 118203, 118209, 118215, 118220, - 118225, 118231, 118236, 118242, 118248, 118253, 118259, 118265, 118270, - 118276, 118282, 118288, 118294, 118300, 118306, 0, 0, 118313, 118318, - 118323, 118328, 118333, 118338, 118343, 118348, 118353, 118358, 118363, - 118368, 118373, 118378, 118383, 118388, 118393, 118398, 118404, 118409, - 118414, 118419, 118424, 118429, 118434, 118439, 118443, 118448, 118453, - 118458, 118463, 118468, 118473, 118478, 118483, 118488, 118493, 118498, - 118503, 118508, 118513, 118518, 118523, 118528, 118534, 118539, 118544, - 118549, 118554, 118559, 118564, 118569, 118575, 118580, 118585, 118590, - 118595, 118600, 118605, 118610, 118615, 118620, 118625, 118630, 118635, - 118640, 118645, 118650, 118655, 118660, 118665, 118670, 118675, 118680, - 118685, 118690, 118696, 118701, 118706, 118711, 118716, 118721, 118726, - 118731, 118735, 118740, 118745, 118750, 118755, 118760, 118765, 118770, - 118775, 118780, 118785, 118790, 118795, 118800, 118805, 118810, 118815, - 118820, 118826, 118831, 118836, 118841, 118846, 118851, 118856, 118861, - 118867, 118872, 118877, 118882, 118887, 118892, 118897, 118903, 118909, - 118915, 118921, 118927, 118933, 118939, 118945, 118951, 118957, 118963, - 118969, 118975, 118981, 118987, 118993, 118999, 119006, 119012, 119018, - 119024, 119030, 119036, 119042, 119048, 119053, 119059, 119065, 119071, - 119077, 119083, 119089, 119095, 119101, 119107, 119113, 119119, 119125, - 119131, 119137, 119143, 119149, 119155, 119162, 119168, 119174, 119180, - 119186, 119192, 119198, 119204, 119211, 119217, 119223, 119229, 119235, - 119241, 119247, 119253, 119259, 119265, 119271, 119277, 119283, 119289, - 119295, 119301, 119307, 119313, 119319, 119325, 119331, 119337, 119343, - 119349, 119356, 119362, 119368, 119374, 119380, 119386, 119392, 119398, - 119403, 119409, 119415, 119421, 119427, 119433, 119439, 119445, 119451, - 119457, 119463, 119469, 119475, 119481, 119487, 119493, 119499, 119505, - 119512, 119518, 119524, 119530, 119536, 119542, 119548, 119554, 119561, - 119567, 119573, 119579, 119585, 119591, 119597, 119604, 119611, 119618, - 119625, 119632, 119639, 119646, 119653, 119660, 119667, 119674, 119681, - 119688, 119695, 119702, 119709, 119716, 119724, 119731, 119738, 119745, - 119752, 119759, 119766, 119773, 119779, 119786, 119793, 119800, 119807, - 119814, 119821, 119828, 119835, 119842, 119849, 119856, 119863, 119870, - 119877, 119884, 119891, 119898, 119906, 119913, 119920, 119927, 119934, - 119941, 119948, 119955, 119963, 119970, 119977, 119984, 119991, 119998, - 120005, 120010, 0, 0, 120015, 120020, 120024, 120028, 120032, 120036, - 120040, 120044, 120048, 120052, 120056, 120061, 120065, 120069, 120073, - 120077, 120081, 120085, 120089, 120093, 120097, 120102, 120106, 120110, - 120114, 120118, 120122, 120126, 120130, 120134, 120138, 120144, 120149, - 120154, 120159, 120164, 120169, 120174, 120179, 120184, 120189, 120195, - 120200, 120205, 120210, 120215, 120220, 120225, 120230, 120235, 120240, - 120244, 120248, 120252, 0, 120256, 120260, 120264, 120268, 120272, - 120276, 120280, 120284, 120288, 120292, 120296, 120300, 120304, 120308, - 120312, 120316, 120320, 120324, 120328, 120332, 120336, 120340, 120344, - 120348, 120354, 120360, 120366, 0, 120372, 120377, 0, 120382, 0, 0, - 120387, 0, 120392, 120397, 120402, 120407, 120412, 120417, 120422, - 120427, 120432, 120437, 0, 120442, 120447, 120452, 120457, 0, 120462, 0, - 120467, 0, 0, 0, 0, 0, 0, 120472, 0, 0, 0, 0, 120478, 0, 120484, 0, - 120490, 0, 120496, 120502, 120508, 0, 120514, 120520, 0, 120526, 0, 0, - 120532, 0, 120538, 0, 120544, 0, 120550, 0, 120558, 0, 120566, 120572, 0, - 120578, 0, 0, 120584, 120590, 120596, 120602, 0, 120608, 120614, 120620, - 120626, 120632, 120638, 120644, 0, 120650, 120656, 120662, 120668, 0, - 120674, 120680, 120686, 120692, 0, 120700, 0, 120708, 120714, 120720, - 120726, 120732, 120738, 120744, 120750, 120756, 120762, 0, 120768, - 120774, 120780, 120786, 120792, 120798, 120804, 120810, 120816, 120822, - 120828, 120834, 120840, 120846, 120852, 120858, 120864, 0, 0, 0, 0, 0, - 120870, 120875, 120880, 0, 120885, 120890, 120895, 120900, 120905, 0, - 120910, 120915, 120920, 120925, 120930, 120935, 120940, 120945, 120950, - 120955, 120960, 120965, 120970, 120975, 120980, 120985, 120990, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 120995, 121005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121013, - 121020, 121027, 121034, 121041, 121048, 121055, 121061, 121068, 121075, - 121082, 121090, 121098, 121106, 121114, 121122, 121130, 121137, 121144, - 121151, 121159, 121167, 121175, 121183, 121191, 121199, 121206, 121213, - 121220, 121228, 121236, 121244, 121252, 121260, 121268, 121273, 121278, - 121283, 121288, 121293, 121298, 121303, 121308, 121313, 0, 0, 0, 0, - 121318, 121323, 121327, 121331, 121335, 121339, 121343, 121347, 121351, - 121355, 121359, 121363, 121367, 121371, 121375, 121379, 121383, 121387, - 121391, 121395, 121399, 121403, 121407, 121411, 121415, 121419, 121423, - 121427, 121431, 121435, 121439, 121443, 121447, 121451, 121455, 121459, - 121463, 121467, 121471, 121475, 121479, 121483, 121487, 121491, 121495, - 121499, 121503, 121507, 121511, 121515, 121519, 121524, 121528, 121532, - 121536, 121540, 121544, 121548, 121552, 121556, 121560, 121564, 121568, - 121572, 121576, 121580, 121584, 121588, 121592, 121596, 121600, 121604, - 121608, 121612, 121616, 121620, 121624, 121628, 121632, 121636, 121640, - 121644, 121648, 121652, 121656, 121660, 121664, 121668, 121672, 121676, - 121680, 121684, 121688, 121692, 121696, 121700, 121704, 121708, 121712, - 121716, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121720, 121726, 121735, - 121743, 121751, 121760, 121769, 121778, 121787, 121796, 121805, 121814, - 121823, 121832, 121841, 0, 0, 121850, 121859, 121867, 121875, 121884, - 121893, 121902, 121911, 121920, 121929, 121938, 121947, 121956, 121965, - 0, 0, 121974, 121983, 121991, 121999, 122008, 122017, 122026, 122035, - 122044, 122053, 122062, 122071, 122080, 122089, 122098, 0, 122105, - 122114, 122122, 122130, 122139, 122148, 122157, 122166, 122175, 122184, - 122193, 122202, 122211, 122220, 122229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122236, - 122243, 122248, 122252, 122256, 122260, 122265, 122270, 122275, 122280, - 122285, 0, 0, 0, 0, 0, 122290, 122295, 122301, 122307, 122313, 122318, - 122324, 122330, 122336, 122341, 122347, 122353, 122358, 122363, 122369, - 122374, 122380, 122386, 122391, 122397, 122403, 122408, 122414, 122420, - 122426, 122432, 122438, 122449, 122456, 122462, 122465, 0, 122468, - 122473, 122479, 122485, 122491, 122496, 122502, 122508, 122514, 122519, - 122525, 122531, 122536, 122541, 122547, 122552, 122558, 122564, 122569, - 122575, 122581, 122586, 122592, 122598, 122604, 122610, 122616, 122619, - 122622, 122625, 122628, 122631, 122634, 122640, 122647, 122654, 122661, - 122667, 122674, 122681, 122688, 122694, 122701, 122708, 122714, 122720, - 122727, 122733, 122740, 122747, 122753, 122760, 122767, 122773, 122780, - 122787, 122794, 122801, 122808, 122813, 0, 0, 0, 0, 122818, 122824, - 122831, 122838, 122845, 122851, 122858, 122865, 122872, 122878, 122885, - 122892, 122898, 122904, 122911, 122917, 122924, 122931, 122937, 122944, - 122951, 122957, 122964, 122971, 122978, 122985, 122992, 123001, 123005, - 123008, 123011, 123015, 123019, 123022, 123025, 123028, 123031, 123034, - 123037, 123040, 123043, 123046, 123052, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123055, 123062, 123070, - 123078, 123086, 123093, 123101, 123109, 123117, 123124, 123132, 123140, - 123147, 123154, 123162, 123169, 123177, 123185, 123192, 123200, 123208, - 123215, 123223, 123231, 123239, 123247, 123255, 123259, 123263, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123266, 123272, 123278, 123284, 123288, - 123294, 123300, 123306, 123312, 123318, 123324, 123330, 123336, 123342, - 123348, 123354, 123360, 123366, 123372, 123378, 123384, 123390, 123396, - 123402, 123408, 123414, 123420, 123426, 123432, 123438, 123444, 123450, - 123456, 123462, 123468, 123474, 123480, 123486, 123492, 123498, 123504, - 123510, 123516, 0, 0, 0, 0, 0, 123522, 123533, 123544, 123555, 123566, - 123577, 123588, 123599, 123610, 0, 0, 0, 0, 0, 0, 0, 123621, 123625, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123629, - 123631, 123633, 123637, 123642, 123647, 123649, 123655, 123660, 123662, - 123668, 123672, 123674, 123678, 123684, 123690, 123696, 123701, 123705, - 123712, 123719, 123726, 123731, 123738, 123745, 123752, 123756, 123762, - 123771, 123780, 123787, 123792, 123796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 123800, 123802, 123804, 123808, 123812, 123816, 0, 123818, - 123820, 123824, 123826, 123828, 123830, 123832, 123837, 123842, 123844, - 123850, 123854, 123858, 123866, 123868, 123870, 123872, 123874, 123876, - 123878, 123880, 123882, 123884, 123886, 123890, 123894, 123896, 123898, - 123900, 123902, 123904, 123909, 123915, 123919, 123923, 123927, 123931, - 123936, 123940, 123942, 123944, 123948, 123954, 123956, 123958, 123960, - 123964, 123973, 123979, 123983, 123987, 123989, 123991, 123994, 123996, - 123998, 124000, 124004, 124006, 124010, 124015, 124017, 124022, 124028, - 124035, 124039, 124043, 124047, 124051, 124057, 0, 0, 0, 124061, 124063, - 124067, 124071, 124073, 124077, 124081, 124083, 124087, 124089, 124093, - 124097, 124101, 124105, 124109, 124113, 124117, 124121, 124127, 124131, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124135, 124139, 124143, 124147, - 124154, 124156, 124160, 124162, 124164, 124168, 124172, 124176, 124178, - 124182, 124186, 124190, 124194, 124198, 124200, 124204, 124206, 124212, - 124215, 124220, 124222, 124224, 124227, 124229, 124231, 124234, 124241, - 124248, 124255, 124260, 124264, 124266, 124268, 0, 124270, 124272, - 124276, 124280, 124284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 124286, 124290, 124295, 124299, 124305, 124311, 124313, - 124315, 124321, 124323, 124327, 124331, 124333, 124337, 124339, 124343, - 124347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 124351, 124353, - 124355, 124357, 124361, 124363, 124365, 124367, 124369, 124371, 124373, - 124375, 124377, 124379, 124381, 124383, 124385, 124387, 124389, 124391, - 124393, 124395, 124397, 124399, 124401, 124403, 124405, 124409, 124411, - 124413, 124415, 124419, 124421, 124425, 124427, 124429, 124433, 124437, - 124443, 124445, 124447, 124449, 124451, 124455, 124459, 124461, 124465, - 124469, 124473, 124477, 124481, 124485, 124489, 124493, 124497, 124501, - 124505, 124509, 124513, 124517, 124521, 124525, 124529, 0, 124533, 0, - 124535, 124537, 124539, 124541, 124543, 124551, 124559, 124567, 124575, - 124580, 124585, 124590, 124594, 124598, 124603, 124607, 124609, 124613, - 124615, 124617, 124619, 124621, 124623, 124625, 124627, 124631, 124633, - 124635, 124637, 124641, 124645, 124649, 124653, 124657, 124659, 124665, - 124671, 124673, 124675, 124677, 124679, 124681, 124690, 124697, 124704, - 124708, 124715, 124720, 124727, 124736, 124741, 124745, 124749, 124751, - 124755, 124757, 124761, 124765, 124767, 124771, 124775, 124779, 124781, - 124783, 124789, 124791, 124793, 124795, 124799, 124803, 124805, 124809, - 124811, 124813, 124816, 124820, 124822, 124826, 124828, 124830, 124835, - 124837, 124841, 124845, 124848, 124852, 124856, 124860, 124864, 124868, - 124872, 124876, 124881, 124885, 124889, 124898, 124903, 124906, 124908, - 124911, 124914, 124919, 124921, 124924, 124929, 124933, 124936, 124940, - 124944, 124947, 124952, 124956, 124960, 124964, 124968, 124974, 124980, - 124986, 124992, 124997, 125008, 125010, 125014, 125016, 125018, 125022, - 125026, 125028, 125032, 125037, 125042, 125048, 125050, 125054, 125058, - 125065, 125072, 125076, 125078, 125080, 125084, 125086, 125090, 125094, - 125098, 125100, 125102, 125109, 125113, 125116, 125120, 125124, 125128, - 125130, 125134, 125136, 125138, 125142, 125144, 125148, 125152, 125158, - 125162, 125166, 125170, 125172, 125175, 125179, 125186, 125195, 125204, - 125212, 125220, 125222, 125226, 125228, 125232, 125243, 125247, 125253, - 125259, 125264, 0, 125266, 125270, 125272, 125274, 0, 0, 0, 125276, - 125281, 125291, 125306, 125318, 125330, 125334, 125338, 125344, 125346, - 125354, 125362, 125364, 125368, 125374, 125380, 125387, 125394, 125396, - 125398, 125401, 125403, 125409, 125411, 125414, 125418, 125424, 125430, - 125441, 125447, 125454, 125462, 125466, 125474, 125482, 125488, 125494, - 125501, 125503, 125507, 125509, 125511, 125516, 125518, 125520, 125522, - 125524, 125528, 125539, 125545, 125549, 125553, 125557, 125563, 125569, - 125575, 125581, 125586, 125591, 125597, 125603, 125610, 0, 0, 125617, - 125622, 125630, 125634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125643, - 125650, 125657, 125664, 125672, 125680, 125688, 125696, 125704, 125712, - 125720, 125728, 125736, 125742, 125748, 125754, 125760, 125766, 125772, - 125778, 125784, 125790, 125796, 125802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125808, 125812, 125816, - 125821, 125826, 125828, 125832, 125841, 125849, 125857, 125870, 125883, - 125896, 125903, 125910, 125914, 125923, 125931, 125935, 125944, 125951, - 125955, 125959, 125963, 125967, 125974, 125978, 125982, 125986, 125990, - 125997, 126006, 126015, 126022, 126034, 126046, 126050, 126054, 126058, - 126062, 126066, 126070, 126078, 126086, 126094, 126098, 126102, 126106, - 126110, 126114, 126118, 126124, 126130, 126134, 126145, 126153, 126157, - 126161, 126165, 126169, 126175, 126182, 126193, 126203, 126213, 126224, - 126233, 126244, 126250, 126256, 0, 0, 0, 0, 126262, 126271, 126278, - 126284, 126288, 126292, 126296, 126305, 126317, 126321, 126328, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126335, - 126337, 126339, 126343, 126347, 126351, 126360, 126362, 126364, 126367, - 126369, 126371, 126375, 126377, 126381, 126383, 126387, 126389, 126391, - 126395, 126399, 126405, 126407, 126411, 126413, 126417, 126421, 126425, - 126429, 126431, 126433, 126437, 126441, 126445, 126449, 126451, 126453, - 126455, 126460, 126465, 126468, 126476, 126484, 126486, 126491, 126494, - 126499, 126510, 126517, 126522, 126527, 126529, 126533, 126535, 126539, - 126541, 126545, 126549, 126552, 126555, 126557, 126560, 126562, 126566, - 126568, 126570, 126572, 126576, 126578, 126582, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 126585, 126590, 126595, 126600, 126605, 126610, 126615, 126622, - 126629, 126636, 126643, 126648, 126653, 126658, 126663, 126670, 126676, - 126683, 126690, 126697, 126702, 126707, 126712, 126717, 126722, 126729, - 126736, 126741, 126746, 126753, 126760, 126768, 126776, 126783, 126790, - 126798, 126806, 126814, 126821, 126831, 126842, 126847, 126854, 126861, - 126868, 126876, 126884, 126895, 126903, 126911, 126919, 126924, 126929, - 126934, 126939, 126944, 126949, 126954, 126959, 126964, 126969, 126974, - 126979, 126986, 126991, 126996, 127003, 127008, 127013, 127018, 127023, - 127028, 127033, 127038, 127043, 127048, 127053, 127058, 127063, 127070, - 127078, 127083, 127088, 127095, 127100, 127105, 127110, 127117, 127122, - 127129, 127134, 127141, 127146, 127155, 127164, 127169, 127174, 127179, - 127184, 127189, 127194, 127199, 127204, 127209, 127214, 127219, 127224, - 127229, 127237, 127245, 127250, 127255, 127260, 127265, 127270, 127276, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127282, 127286, 127290, 127294, - 127298, 127302, 127306, 127310, 127314, 127318, 127322, 127326, 127330, - 127334, 127338, 127342, 127346, 127350, 127354, 127358, 127362, 127366, - 127370, 127374, 127378, 127382, 127386, 127390, 127394, 127398, 127402, - 127406, 127410, 127414, 127418, 127422, 127426, 127430, 127434, 127438, - 127442, 127446, 127450, 127454, 127458, 127462, 127466, 127470, 127474, - 127478, 127482, 127486, 127490, 127494, 127498, 127502, 127506, 127510, - 127514, 127518, 127522, 127526, 127530, 127534, 127538, 127542, 127546, - 127550, 127554, 127558, 127562, 127566, 127570, 127574, 127578, 127582, - 127586, 127590, 127594, 127598, 127602, 127606, 127610, 127614, 127618, - 127622, 127626, 127630, 127634, 127638, 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, - 128414, 128418, 128422, 128426, 128430, 128434, 128438, 128442, 128446, - 128450, 128454, 128458, 128462, 128466, 128470, 128474, 128478, 128482, - 128486, 128490, 128494, 128498, 128502, 128506, 128510, 128514, 128518, - 128522, 128526, 128530, 128534, 128538, 128542, 128546, 128550, 128554, - 128558, 128562, 128566, 128570, 128574, 128578, 128582, 128586, 128590, - 128594, 128598, 128602, 128606, 128610, 128614, 128618, 128622, 128626, - 128630, 128634, 128638, 128642, 128646, 128650, 128654, 128658, 128662, - 128666, 128670, 128674, 128678, 128682, 128686, 128690, 128694, 128698, - 128702, 128706, 128710, 128714, 128718, 128722, 128726, 128730, 128734, - 128738, 128742, 128746, 128750, 128754, 128758, 128762, 128766, 128770, - 128774, 128778, 128782, 128786, 128790, 128794, 128798, 128802, 128806, - 128810, 128814, 128818, 128822, 128826, 128830, 128834, 128838, 128842, - 128846, 128850, 128854, 128858, 128862, 128866, 128870, 128874, 128878, - 128882, 128886, 128890, 128894, 128898, 128902, 128906, 128910, 128914, - 128918, 128922, 128926, 128930, 128934, 128938, 128942, 128946, 128950, - 128954, 128958, 128962, 128966, 128970, 128974, 128978, 128982, 128986, - 128990, 128994, 128998, 129002, 129006, 129010, 129014, 129018, 129022, - 129026, 129030, 129034, 129038, 129042, 129046, 129050, 129054, 129058, - 129062, 129066, 129070, 129074, 129078, 129082, 129086, 129090, 129094, - 129098, 129102, 129106, 129110, 129114, 129118, 129122, 129126, 129130, - 129134, 129138, 129142, 129146, 129150, 129154, 129158, 129162, 129166, - 129170, 129174, 129178, 129182, 129186, 129190, 129194, 129198, 129202, - 129206, 129210, 129214, 129218, 129222, 129226, 129230, 129234, 129238, - 129242, 129246, 129250, 129254, 129258, 129262, 129266, 129270, 129274, - 129278, 129282, 129286, 129290, 129294, 129298, 129302, 129306, 129310, - 129314, 129318, 129322, 129326, 129330, 129334, 129338, 129342, 129346, - 129350, 129354, 129358, 129362, 129366, 129370, 129374, 129378, 129382, - 129386, 129390, 129394, 129398, 129402, 129406, 129410, 129414, 129418, - 129422, 129426, 129430, 129434, 129438, 129442, 129446, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129450, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 129454, 129457, 129461, 129465, 129468, 129472, 129476, - 129479, 129482, 129486, 129490, 129493, 129496, 129499, 129502, 129507, - 129510, 129514, 129517, 129520, 129523, 129526, 129529, 129532, 129535, - 129538, 129541, 129544, 129547, 129551, 129555, 129559, 129563, 129568, - 129573, 129579, 129585, 129591, 129596, 129602, 129608, 129614, 129619, - 129625, 129631, 129636, 129641, 129647, 129652, 129658, 129664, 129669, - 129675, 129681, 129686, 129692, 129698, 129704, 129710, 129716, 129720, - 129725, 129729, 129734, 129738, 129743, 129748, 129754, 129760, 129766, - 129771, 129777, 129783, 129789, 129794, 129800, 129806, 129811, 129816, - 129822, 129827, 129833, 129839, 129844, 129850, 129856, 129861, 129867, - 129873, 129879, 129885, 129891, 129896, 129900, 129905, 129907, 129911, - 129914, 129917, 129920, 129923, 129926, 129929, 129932, 129935, 129938, - 129941, 129944, 129947, 129950, 129953, 129956, 129959, 129962, 129965, - 129968, 129971, 129974, 129977, 129980, 129983, 129986, 129989, 129992, - 129995, 129998, 130001, 130004, 130007, 130010, 130013, 130016, 130019, - 130022, 130025, 130028, 130031, 130034, 130037, 130040, 130043, 130046, - 130049, 130052, 130055, 130058, 130061, 130064, 130067, 130070, 130073, - 130076, 130079, 130082, 130085, 130088, 130091, 130094, 130097, 130100, - 130103, 130106, 130109, 130112, 130115, 130118, 130121, 130124, 130127, - 130130, 130133, 130136, 130139, 130142, 130145, 130148, 130151, 130154, - 130157, 130160, 130163, 130166, 130169, 130172, 130175, 130178, 130181, - 130184, 130187, 130190, 130193, 130196, 130199, 130202, 130205, 130208, - 130211, 130214, 130217, 130220, 130223, 130226, 130229, 130232, 130235, - 130238, 130241, 130244, 130247, 130250, 130253, 130256, 130259, 130262, - 130265, 130268, 130271, 130274, 130277, 130280, 130283, 130286, 130289, - 130292, 130295, 130298, 130301, 130304, 130307, 130310, 130313, 130316, - 130319, 130322, 130325, 130328, 130331, 130334, 130337, 130340, 130343, - 130346, 130349, 130352, 130355, 130358, 130361, 130364, 130367, 130370, - 130373, 130376, 130379, 130382, 130385, 130388, 130391, 130394, 130397, - 130400, 130403, 130406, 130409, 130412, 130415, 130418, 130421, 130424, - 130427, 130430, 130433, 130436, 130439, 130442, 130445, 130448, 130451, - 130454, 130457, 130460, 130463, 130466, 130469, 130472, 130475, 130478, - 130481, 130484, 130487, 130490, 130493, 130496, 130499, 130502, 130505, - 130508, 130511, 130514, 130517, 130520, 130523, 130526, 130529, 130532, - 130535, 130538, 130541, 130544, 130547, 130550, 130553, 130556, 130559, - 130562, 130565, 130568, 130571, 130574, 130577, 130580, 130583, 130586, - 130589, 130592, 130595, 130598, 130601, 130604, 130607, 130610, 130613, - 130616, 130619, 130622, 130625, 130628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 130631, 130633, 130635, 130640, 130642, 130647, 130649, - 130654, 130656, 130661, 130663, 130665, 130667, 130669, 130671, 130673, - 130675, 130677, 130679, 130682, 130685, 130687, 130689, 130693, 130696, - 130701, 130703, 130705, 130707, 130711, 130714, 130716, 130720, 130722, - 130726, 130728, 130732, 130735, 130737, 130741, 130745, 130747, 130753, - 130755, 130760, 130762, 130767, 130769, 130774, 130776, 130781, 130783, - 130786, 130788, 130792, 130794, 130801, 130803, 130805, 130807, 130812, - 130814, 130816, 130818, 130820, 130822, 130827, 130831, 130833, 130838, - 130842, 130844, 130849, 130853, 130855, 130860, 130864, 130866, 130868, - 130870, 130872, 130876, 130878, 130883, 130885, 130891, 130893, 130899, - 130901, 130903, 130905, 130909, 130911, 130918, 130920, 130927, 130929, - 130934, 130939, 130941, 130947, 130953, 130955, 130961, 130966, 130968, - 130974, 130980, 130982, 130988, 130994, 130996, 131002, 131006, 131008, - 131013, 131015, 131017, 131022, 131024, 131026, 131032, 131034, 131039, - 131043, 131045, 131050, 131054, 131056, 131062, 131064, 131068, 131070, - 131074, 131076, 131083, 131090, 131092, 131099, 131106, 131108, 131113, - 131115, 131122, 131124, 131129, 131131, 131137, 131139, 131143, 131145, - 131151, 131153, 131157, 131159, 131165, 131167, 131169, 131171, 131176, - 131181, 131183, 131185, 131194, 131198, 131205, 131212, 131217, 131222, - 131234, 131236, 131238, 131240, 131242, 131244, 131246, 131248, 131250, - 131252, 131254, 131256, 131258, 131260, 131262, 131264, 131266, 131268, - 131270, 131272, 131274, 131276, 131282, 131289, 131294, 131299, 131310, - 131312, 131314, 131316, 131318, 131320, 131322, 131324, 131326, 131328, - 131330, 131332, 131334, 131336, 131338, 131340, 131342, 131347, 131349, - 131351, 131357, 131369, 131380, 131382, 131384, 131386, 131388, 131390, - 131392, 131394, 131396, 131398, 131400, 131402, 131404, 131406, 131408, - 131410, 131412, 131414, 131416, 131418, 131420, 131422, 131424, 131426, - 131428, 131430, 131432, 131434, 131436, 131438, 131440, 131442, 131444, - 131446, 131448, 131450, 131452, 131454, 131456, 131458, 131460, 131462, - 131464, 131466, 131468, 131470, 131472, 131474, 131476, 131478, 131480, - 131482, 131484, 131486, 131488, 131490, 131492, 131494, 131496, 131498, - 131500, 131502, 131504, 131506, 131508, 131510, 131512, 131514, 131516, - 131518, 131520, 131522, 131524, 131526, 131528, 131530, 131532, 131534, - 131536, 131538, 131540, 131542, 131544, 131546, 131548, 131550, 131552, - 131554, 131556, 131558, 131560, 131562, 131564, 131566, 131568, 131570, - 131572, 131574, 131576, 131578, 131580, 131582, 131584, 131586, 131588, - 131590, 131592, 131594, 131596, 131598, 131600, 131602, 131604, 131606, - 131608, 131610, 131612, 131614, 131616, 131618, 131620, 131622, 131624, - 131626, 131628, 131630, 131632, 131634, 131636, 131638, 131640, 131642, - 131644, 131646, 131648, 131650, 131652, 131654, 131656, 131658, 131660, - 131662, 131664, 131666, 131668, 131670, 131672, 131674, 131676, 131678, - 131680, 131682, 131684, 131686, 131688, 131690, 131692, 131694, 131696, - 131698, 131700, 131702, 131704, 131706, 131708, 131710, 131712, 131714, - 131716, 131718, 131720, 131722, 131724, 131726, 131728, 131730, 131732, - 131734, 131736, 131738, 131740, 131742, 131744, 131746, 131748, 131750, - 131752, 131754, 131756, 131758, 131760, 131762, 131764, 131766, 131768, - 131770, 131772, 131774, 131776, 131778, 131780, 131782, 131784, 131786, - 131788, 131790, 131792, 131794, 131796, 131798, 131800, 131802, 131804, - 131806, 131808, 131810, 131812, 131814, 131816, 131818, 131820, 131822, - 131824, 131826, 131828, 131830, 131832, 131834, 131836, 131838, 131840, - 131842, 131844, 131846, 131848, 131850, 131852, 131854, 131856, 131858, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 131860, 131870, 131880, 131889, 131898, 131911, - 131924, 131936, 131948, 131958, 131968, 131978, 131988, 131999, 132010, - 132020, 132029, 132038, 132047, 132060, 132073, 132085, 132097, 132107, - 132117, 132127, 132137, 132146, 132155, 132164, 132173, 132182, 132191, - 132200, 132209, 132218, 132227, 132236, 132245, 132256, 132266, 132276, - 132289, 132299, 132312, 132319, 132329, 132336, 132343, 132350, 132357, - 132364, 132371, 132380, 132389, 132398, 132407, 132416, 132425, 132434, - 132443, 132451, 132459, 132466, 132476, 132485, 132493, 132500, 132510, - 132519, 132529, 132539, 132550, 132560, 132569, 132579, 132588, 132598, - 132606, 132610, 132614, 132618, 132622, 132626, 132630, 132634, 132638, - 132642, 132646, 132649, 132653, 132656, 132659, 132663, 132667, 132671, - 132675, 132679, 132683, 132687, 132691, 132695, 132699, 132703, 132707, - 132711, 132715, 132719, 132723, 132727, 132731, 132735, 132739, 132743, - 132747, 132751, 132755, 132759, 132763, 132767, 132771, 132775, 132779, - 132783, 132787, 132791, 132795, 132799, 132803, 132807, 132811, 132815, - 132819, 132823, 132827, 132831, 132835, 132839, 132843, 132847, 132851, - 132855, 132859, 132863, 132867, 132871, 132875, 132879, 132883, 132887, - 132891, 132895, 132899, 132903, 132907, 132911, 132915, 132919, 132923, - 132927, 132931, 132935, 132939, 132943, 132947, 132951, 132955, 132959, - 132963, 132967, 132971, 132975, 132979, 132983, 132987, 132991, 132995, - 132999, 133002, 133006, 133010, 133014, 133018, 133022, 133026, 133030, - 133034, 133038, 133042, 133046, 133050, 133054, 133058, 133062, 133066, - 133070, 133074, 133078, 133082, 133086, 133090, 133094, 133098, 133102, - 133106, 133110, 133114, 133118, 133122, 133126, 133130, 133134, 133138, - 133142, 133146, 133150, 133154, 133158, 133162, 133166, 133170, 133174, - 133178, 133182, 133186, 133190, 133194, 133198, 133202, 133206, 133210, - 133214, 133218, 133222, 133226, 133230, 133234, 133238, 133242, 133246, - 133250, 133254, 133258, 133262, 133266, 133270, 133274, 133278, 133282, - 133286, 133290, 133294, 133298, 133302, 133306, 133310, 133314, 133318, - 133322, 133326, 133330, 133334, 133338, 133342, 133346, 133350, 133354, - 133358, 133362, 133366, 133370, 133374, 133378, 133382, 133386, 133390, - 133394, 133398, 133402, 133406, 133410, 133414, 133418, 133422, 133426, - 133430, 133434, 133438, 133442, 133446, 133450, 133454, 133458, 133462, - 133466, 133470, 133474, 133478, 133482, 133486, 133490, 133494, 133498, - 133502, 133506, 133510, 133514, 133518, 133522, 133526, 133530, 133534, - 133538, 133542, 133546, 133550, 133554, 133558, 133562, 133566, 133570, - 133574, 133578, 133582, 133586, 133590, 133594, 133598, 133602, 133606, - 133610, 133614, 133618, 133622, 133626, 133630, 133634, 133638, 133642, - 133646, 133650, 133654, 133658, 133662, 133666, 133670, 133674, 133678, - 133682, 133686, 133690, 133694, 133698, 133702, 133706, 133710, 133714, - 133718, 133722, 133726, 133730, 133734, 133738, 133742, 133746, 133750, - 133754, 133758, 133762, 133766, 133771, 133776, 133781, 133785, 133791, - 133798, 133805, 133812, 133819, 133826, 133833, 133840, 133847, 133854, - 133861, 133868, 133875, 133882, 133888, 133895, 133902, 133908, 133915, - 133922, 133929, 133936, 133943, 133950, 133957, 133964, 133971, 133978, - 133985, 133992, 133999, 134005, 134011, 134018, 134025, 134034, 134043, - 134052, 134061, 134066, 134071, 134077, 134083, 134089, 134095, 134101, - 134107, 134113, 134119, 134125, 134131, 134137, 134143, 134148, 134154, - 134164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92957, 92962, 92967, 92972, 0, 0, 0, 0, 0, 92979, 92985, 92991, 92997, + 93003, 93008, 93014, 93020, 93026, 93032, 93037, 93043, 93049, 93055, + 93061, 93067, 93073, 93079, 93085, 93091, 93096, 93102, 93108, 93114, + 93120, 93126, 93131, 93137, 93143, 93148, 93154, 93160, 93166, 93172, + 93178, 93184, 93190, 93195, 93201, 93208, 93215, 93222, 93229, 0, 0, 0, + 0, 0, 93236, 93241, 93246, 93251, 93256, 93261, 93266, 93271, 93276, + 93281, 93286, 93291, 93296, 93301, 93306, 93311, 93316, 93321, 93326, + 93331, 93336, 93341, 93346, 93351, 93356, 93361, 93366, 93370, 93374, + 93378, 0, 93383, 93389, 93394, 93399, 93404, 93409, 93415, 93421, 93427, + 93433, 93439, 93445, 93451, 93457, 93463, 93469, 93475, 93481, 93487, + 93492, 93498, 93504, 93509, 93515, 93520, 93526, 93532, 93537, 93543, + 93549, 93555, 93561, 93567, 93573, 93579, 93585, 93591, 0, 0, 0, 0, + 93596, 93602, 93608, 93614, 93620, 93626, 93632, 93638, 93644, 93651, + 93656, 93661, 93667, 93673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 93679, 93685, 93691, 93697, 93704, 93710, 93717, 93724, 93731, + 93738, 93746, 93753, 93761, 93767, 93773, 93779, 93785, 93791, 93797, + 93803, 93809, 93815, 93821, 93827, 93833, 93839, 93845, 93851, 93857, + 93863, 93869, 93875, 93881, 93887, 93893, 93899, 93905, 93911, 93917, + 93923, 93929, 93935, 93941, 93947, 93954, 93960, 93967, 93974, 93981, + 93988, 93996, 94003, 94011, 94017, 94023, 94029, 94035, 94041, 94047, + 94053, 94059, 94065, 94071, 94077, 94083, 94089, 94095, 94101, 94107, + 94113, 94119, 94125, 94131, 94137, 94143, 94149, 94155, 94161, 94167, + 94173, 94179, 94184, 94189, 94194, 94199, 94204, 94209, 94214, 94219, + 94224, 94229, 94234, 94239, 94244, 94249, 94254, 94259, 94264, 94269, + 94274, 94279, 94284, 94289, 94294, 94299, 94304, 94309, 94314, 94319, + 94324, 94329, 94334, 94339, 94344, 94349, 94354, 94359, 94364, 94369, + 94374, 94379, 94384, 94389, 94394, 94399, 94404, 94409, 94414, 94419, + 94424, 94429, 94434, 94439, 94444, 94449, 94454, 94459, 94464, 94469, + 94474, 94479, 94484, 94489, 94494, 94499, 94504, 94509, 94514, 94519, + 94523, 94527, 94531, 94535, 94539, 94543, 94547, 94552, 94557, 0, 0, + 94562, 94567, 94571, 94575, 94579, 94583, 94587, 94591, 94595, 94599, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94603, 94607, 94612, 94617, 94622, + 94627, 94632, 94637, 94642, 94646, 94651, 94656, 94661, 94666, 94670, + 94675, 94680, 94685, 94690, 94695, 94700, 94704, 94709, 94713, 94718, + 94723, 94728, 94733, 94738, 94743, 94748, 94753, 94757, 94762, 94767, + 94772, 94777, 94782, 94787, 94792, 0, 0, 0, 0, 0, 0, 0, 0, 94797, 94804, + 94811, 94818, 94825, 94832, 94839, 94846, 94853, 94860, 94867, 94874, + 94881, 94888, 94895, 94902, 94909, 94916, 94923, 94930, 94937, 94944, + 94951, 94958, 94965, 94972, 94979, 94986, 94993, 95000, 95007, 95014, + 95021, 95028, 95035, 95042, 95049, 95056, 95063, 95070, 95077, 95084, + 95091, 95098, 95105, 95112, 95119, 95126, 95133, 95140, 95147, 95154, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95168, 95173, 95178, 95183, 95188, + 95193, 95198, 95203, 95208, 95213, 95218, 95223, 95228, 95233, 95238, + 95243, 95248, 95253, 95258, 95263, 95268, 95273, 95278, 95283, 95288, + 95293, 95298, 95303, 95308, 95313, 95318, 95323, 95328, 95333, 95338, + 95343, 95348, 95353, 95358, 95363, 95368, 95373, 95378, 95383, 95388, + 95393, 95398, 95403, 95408, 95413, 95418, 95423, 95428, 95433, 95438, + 95443, 95448, 95453, 95458, 95463, 95468, 95473, 95478, 95483, 95488, + 95493, 95498, 95503, 95508, 95513, 95518, 95523, 95528, 95533, 95538, + 95543, 95548, 95553, 95558, 95563, 95568, 95573, 95578, 95583, 95588, + 95593, 95598, 95603, 95608, 95613, 95618, 95623, 95628, 95633, 95638, + 95643, 95648, 95653, 95658, 95663, 95668, 95673, 95678, 95683, 95688, + 95693, 95698, 95703, 95708, 95713, 95718, 95723, 95728, 95733, 95738, + 95743, 95748, 95753, 95758, 95763, 95768, 95773, 95778, 95783, 95788, + 95793, 95798, 95803, 95808, 95813, 95818, 95823, 95828, 95833, 95838, + 95843, 95848, 95853, 95858, 95863, 95868, 95873, 95878, 95883, 95888, + 95893, 95898, 95903, 95908, 95913, 95918, 95923, 95928, 95933, 95938, + 95943, 95948, 95953, 95958, 95963, 95968, 95973, 95978, 95983, 95988, + 95993, 95998, 96003, 96008, 96013, 96018, 96023, 96028, 96033, 96038, + 96043, 96048, 96053, 96058, 96063, 96068, 96073, 96078, 96083, 96088, + 96093, 96098, 96103, 96108, 96113, 96118, 96123, 96128, 96133, 96138, + 96143, 96148, 96153, 96158, 96163, 96168, 96173, 96178, 96183, 96188, + 96193, 96198, 96203, 96208, 96213, 96218, 96223, 96228, 96233, 96238, + 96243, 96248, 96253, 96258, 96263, 96268, 96273, 96278, 96283, 96288, + 96293, 96298, 96303, 96308, 96313, 96318, 96323, 96328, 96333, 96338, + 96343, 96348, 96353, 96358, 96363, 96368, 96373, 96378, 96383, 96388, + 96393, 96398, 96403, 96408, 96413, 96418, 96423, 96428, 96433, 96438, + 96443, 96448, 96453, 96458, 96463, 96468, 96473, 96478, 96483, 96488, + 96493, 96498, 96503, 96508, 96513, 96518, 96523, 96528, 96533, 96538, + 96543, 96548, 96553, 96558, 96563, 96568, 96573, 96578, 96583, 96588, + 96593, 96598, 96603, 96608, 96613, 96618, 96623, 96628, 96633, 96638, + 96643, 96648, 96653, 96658, 96663, 96668, 96673, 96678, 96683, 96688, + 96693, 96698, 96703, 96708, 96713, 96718, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 96723, 96729, 96736, 96743, 96749, 96756, 96763, 96770, 96777, 96783, + 96790, 96797, 96804, 96811, 96818, 96825, 96832, 96839, 96846, 96853, + 96860, 96867, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96874, 96879, 96884, 96889, + 96894, 96899, 96904, 96909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96914, 96918, 96922, + 96926, 96930, 96934, 0, 0, 96939, 0, 96944, 96948, 96953, 96958, 96963, + 96968, 96973, 96978, 96983, 96988, 96993, 96997, 97002, 97007, 97012, + 97017, 97021, 97026, 97031, 97036, 97041, 97045, 97050, 97055, 97060, + 97065, 97070, 97075, 97080, 97085, 97090, 97095, 97100, 97105, 97110, + 97115, 97120, 97125, 97130, 97134, 97139, 97144, 97149, 97154, 0, 97159, + 97164, 0, 0, 0, 97169, 0, 0, 97174, 97179, 97186, 97193, 97200, 97207, + 97214, 97221, 97228, 97235, 97242, 97249, 97256, 97263, 97270, 97277, + 97284, 97291, 97298, 97305, 97312, 97319, 97326, 0, 97333, 97340, 97346, + 97352, 97358, 97365, 97372, 97380, 97388, 97397, 97402, 97407, 97412, + 97417, 97422, 97427, 97432, 97437, 97442, 97447, 97452, 97457, 97462, + 97468, 97473, 97478, 97483, 97488, 97493, 97498, 97503, 97508, 97513, + 97519, 97525, 97529, 97533, 97537, 97541, 97545, 97550, 97555, 97561, + 97566, 97572, 97577, 97582, 97587, 97593, 97598, 97603, 97608, 97613, + 97618, 97624, 97629, 97635, 97640, 97646, 97651, 97657, 97662, 97668, + 97673, 97678, 97683, 97688, 97693, 97698, 97703, 97709, 97714, 0, 0, 0, + 0, 0, 0, 0, 0, 97719, 97723, 97727, 97731, 97735, 97741, 97745, 97750, + 97755, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97761, 97766, 97771, 97776, 97781, 97786, + 97791, 97796, 97801, 97806, 97811, 97816, 97821, 97826, 97831, 97836, + 97841, 97846, 97851, 97856, 97861, 97866, 97871, 97875, 97880, 97885, + 97891, 97895, 0, 0, 0, 97899, 97905, 97909, 97914, 97919, 97924, 97928, + 97933, 97937, 97942, 97947, 97951, 97956, 97961, 97965, 97969, 97974, + 97979, 97983, 97988, 97993, 97997, 98002, 98007, 98012, 98017, 98022, 0, + 0, 0, 0, 0, 98027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98032, + 98038, 98044, 98050, 98056, 98062, 98069, 98076, 98083, 98089, 98095, + 98101, 98108, 98115, 98122, 98129, 98136, 98143, 98150, 98157, 98164, + 98171, 98178, 98184, 98191, 98198, 98205, 98212, 98219, 98225, 98232, + 98239, 98246, 98252, 98258, 98264, 98270, 98276, 98283, 98290, 98296, + 98302, 98308, 98315, 98322, 98329, 98336, 98343, 98350, 98359, 98366, + 98372, 98379, 98386, 98393, 98399, 0, 0, 0, 0, 0, 0, 98406, 98414, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98422, 98426, 98431, 98436, 0, + 98442, 98447, 0, 0, 0, 0, 0, 98452, 98458, 98465, 98470, 98475, 98479, + 98484, 98489, 0, 98494, 98499, 98504, 0, 98509, 98514, 98519, 98524, + 98529, 98534, 98539, 98544, 98549, 98554, 98559, 98563, 98567, 98572, + 98577, 98582, 98586, 98590, 98595, 98600, 98605, 98610, 98615, 98620, + 98625, 98629, 98634, 0, 0, 0, 0, 98639, 98645, 98650, 0, 0, 0, 0, 98655, + 98659, 98663, 98667, 98671, 98675, 98680, 98685, 98691, 0, 0, 0, 0, 0, 0, + 0, 0, 98697, 98703, 98710, 98716, 98723, 98729, 98735, 98741, 98748, 0, + 0, 0, 0, 0, 0, 0, 98754, 98761, 98768, 98775, 98782, 98789, 98796, 98803, + 98810, 98817, 98824, 98831, 98838, 98845, 98852, 98859, 98866, 98873, + 98880, 98887, 98894, 98901, 98908, 98915, 98922, 98929, 98936, 98943, + 98950, 98957, 98963, 98970, 98977, 98984, 98991, 98998, 99005, 99012, + 99019, 99026, 99033, 99040, 99047, 99054, 99061, 99068, 99075, 99082, + 99089, 99096, 99103, 99110, 99117, 99124, 99131, 99138, 99145, 99152, + 99159, 99166, 99173, 99180, 99186, 99193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99200, + 99205, 99210, 99215, 99220, 99225, 99230, 99235, 99240, 99245, 99250, + 99255, 99260, 99265, 99270, 99275, 99280, 99285, 99290, 99295, 99300, + 99305, 99310, 99315, 99320, 99325, 99330, 99335, 99340, 99345, 99350, + 99355, 99360, 99365, 99370, 99375, 99380, 99385, 99391, 0, 0, 0, 0, + 99397, 99401, 99405, 99410, 99415, 99421, 99427, 99433, 99443, 99452, + 99458, 99465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99473, 99477, 99482, 99487, + 99492, 99497, 99502, 99507, 99512, 99516, 99521, 99525, 99530, 99534, + 99539, 99543, 99548, 99553, 99558, 99563, 99568, 99573, 99578, 99583, + 99588, 99593, 99598, 99603, 99608, 99613, 99618, 99623, 99628, 99633, + 99638, 99643, 99648, 99653, 99658, 99663, 99668, 99673, 99678, 99683, + 99688, 99693, 99698, 99703, 99708, 99713, 99718, 99723, 99728, 99733, 0, + 0, 0, 99738, 99743, 99752, 99760, 99769, 99778, 99789, 99800, 99807, + 99814, 99821, 99828, 99835, 99842, 99849, 99856, 99863, 99870, 99877, + 99884, 99891, 99898, 99905, 99912, 99919, 99926, 99933, 99940, 99947, 0, + 0, 99954, 99960, 99966, 99972, 99978, 99985, 99992, 100000, 100008, + 100015, 100022, 100029, 100036, 100043, 100050, 100057, 100064, 100071, + 100078, 100085, 100092, 100099, 100106, 100113, 100120, 100127, 100134, + 0, 0, 0, 0, 0, 100141, 100147, 100153, 100159, 100165, 100172, 100179, + 100187, 100195, 100202, 100209, 100216, 100223, 100230, 100237, 100244, + 100251, 100258, 100265, 100272, 100279, 100286, 100293, 100300, 100307, + 100314, 0, 0, 0, 0, 0, 0, 0, 100321, 100328, 100336, 100346, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 100356, 100362, 100368, 100374, 100380, 100387, + 100394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100402, 100409, 100416, 100424, 100431, + 100438, 100445, 100452, 100460, 100468, 100476, 100484, 100492, 100500, + 100508, 100516, 100524, 100532, 100540, 100548, 100556, 100564, 100572, + 100580, 100588, 100596, 100604, 100612, 100620, 100628, 100636, 100644, + 100652, 100660, 100668, 100676, 100684, 100692, 100700, 100708, 100716, + 100724, 100732, 100740, 100748, 100756, 100764, 100772, 100780, 100788, + 100796, 100804, 100812, 100820, 100828, 100836, 100844, 100852, 100860, + 100868, 100876, 100884, 100892, 100900, 100908, 100916, 100924, 100932, + 100940, 100948, 100956, 100964, 100972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 100980, 100984, 100988, 100992, 100996, 101000, 101004, + 101008, 101012, 101016, 101021, 101026, 101031, 101036, 101041, 101046, + 101051, 101056, 101061, 101067, 101073, 101079, 101086, 101093, 101100, + 101107, 101114, 101121, 101128, 101135, 101142, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 101149, 101153, 101157, 101161, 101165, 101169, 101172, 101176, + 101179, 101183, 101186, 101190, 101194, 101199, 101203, 101208, 101211, + 101215, 101218, 101222, 101225, 101229, 101233, 101237, 101241, 101245, + 101249, 101253, 101257, 101261, 101265, 101269, 101273, 101277, 101281, + 101285, 101289, 101293, 101297, 101300, 101303, 101307, 101311, 101315, + 101318, 101321, 101325, 101329, 101333, 101337, 101341, 101345, 101348, + 101352, 101358, 101364, 101370, 101375, 101382, 101386, 101391, 101395, + 101400, 101405, 101411, 101416, 101422, 101426, 101431, 101435, 101440, + 101443, 101446, 101450, 101455, 101461, 101466, 101472, 0, 0, 0, 0, + 101477, 101480, 101483, 101486, 101489, 101492, 101495, 101498, 101501, + 101504, 101508, 101512, 101516, 101520, 101524, 101528, 101532, 101536, + 101540, 101545, 101550, 101554, 101557, 101560, 101563, 101566, 101569, + 101572, 101575, 101578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 101581, 101585, 101590, 101595, 101600, 101604, 101609, 101613, 101618, + 101622, 101627, 101631, 101636, 101640, 101645, 101649, 101654, 101659, + 101664, 101669, 101674, 101679, 101684, 101689, 101694, 101699, 101704, + 101709, 101714, 101719, 101724, 101729, 101734, 101739, 101744, 101749, + 101753, 101757, 101762, 101767, 101772, 101776, 101780, 101785, 101790, + 101795, 101800, 101805, 101810, 101814, 101820, 101825, 101831, 101836, + 101842, 101847, 101853, 101858, 101864, 101869, 101874, 101879, 101884, + 101888, 101893, 101899, 101903, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 101908, 101915, 101922, 101929, 101936, 101943, 101950, 101957, 101964, + 101971, 101978, 101985, 101992, 101999, 102006, 102013, 102020, 102027, + 102034, 102041, 102048, 102055, 102062, 102069, 102076, 0, 0, 0, 0, 0, 0, + 0, 102083, 102090, 102096, 102102, 102108, 102114, 102120, 102126, + 102132, 102138, 0, 0, 0, 0, 0, 0, 102144, 102149, 102154, 102159, 102164, + 102168, 102172, 102176, 102181, 102186, 102191, 102196, 102201, 102206, + 102211, 102216, 102221, 102226, 102231, 102236, 102241, 102246, 102251, + 102256, 102261, 102266, 102271, 102276, 102281, 102286, 102291, 102296, + 102301, 102306, 102311, 102316, 102321, 102326, 102331, 102336, 102341, + 102346, 102352, 102357, 102363, 102368, 102374, 102379, 102385, 102391, + 102395, 102400, 102404, 0, 102408, 102413, 102417, 102421, 102425, + 102429, 102433, 102437, 102441, 102445, 102449, 102454, 102458, 102463, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102468, 102472, 102476, 102480, + 102484, 102488, 102492, 102497, 102502, 102507, 102512, 102517, 102522, + 102527, 102532, 102537, 102542, 102547, 102552, 102557, 102562, 102567, + 102572, 102577, 102581, 102585, 102590, 102595, 102600, 102604, 102609, + 102614, 102619, 102624, 102628, 102633, 102638, 102643, 102648, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 102653, 102657, 102661, 102665, 102668, 102672, 102675, + 102679, 102682, 102686, 102690, 102695, 102699, 102704, 102707, 102711, + 102714, 102718, 102721, 102725, 102729, 102733, 102737, 102741, 102745, + 102749, 102753, 102757, 102761, 102765, 102769, 102773, 102777, 102781, + 102785, 102789, 102793, 102796, 102799, 102803, 102807, 102811, 102814, + 102817, 102821, 102825, 102829, 102833, 102837, 102841, 102845, 102848, + 102853, 102857, 102862, 102866, 102871, 102876, 102882, 102887, 102893, + 102897, 102902, 102906, 102911, 102915, 102919, 102923, 102927, 102930, + 102933, 102937, 102941, 0, 0, 0, 0, 102944, 0, 0, 102948, 102952, 102955, + 102958, 102961, 102964, 102967, 102970, 102973, 102976, 102979, 0, 0, 0, + 0, 0, 0, 102982, 102987, 102992, 102997, 103002, 103007, 103012, 103017, + 103022, 103027, 103033, 103039, 103045, 103051, 103057, 103063, 103069, + 103075, 103081, 103088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103095, 103099, + 103104, 103108, 103112, 103116, 103121, 103125, 103130, 103134, 103139, + 103144, 103149, 103154, 103159, 103164, 103169, 103174, 0, 103179, + 103184, 103189, 103194, 103199, 103204, 103209, 103214, 103219, 103224, + 103229, 103234, 103238, 103242, 103247, 103252, 103257, 103262, 103266, + 103270, 103275, 103280, 103285, 103290, 103294, 103299, 103305, 103310, + 103316, 103321, 103326, 103332, 103337, 103343, 103348, 103353, 103358, + 103363, 103367, 103372, 103378, 103383, 103389, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103394, 103398, 103403, 103407, 103412, + 103416, 103421, 103425, 103430, 103434, 103439, 103443, 103448, 103453, + 103458, 103463, 103468, 103473, 103478, 103483, 103488, 103493, 103498, + 103503, 103508, 103513, 103518, 103523, 103528, 103533, 103538, 103543, + 103548, 103553, 103557, 103561, 103566, 103571, 103576, 103581, 103585, + 103589, 103594, 103599, 103604, 103609, 103614, 103618, 103623, 103629, + 103634, 103640, 103645, 103651, 103656, 103662, 103667, 103673, 103678, + 0, 0, 0, 0, 0, 103683, 103688, 103692, 103696, 103700, 103704, 103708, + 103712, 103716, 103720, 0, 0, 0, 0, 0, 0, 0, 103724, 103729, 103734, 0, + 103739, 103743, 103748, 103752, 103757, 103761, 103766, 103771, 0, 0, + 103776, 103781, 0, 0, 103786, 103791, 103796, 103800, 103805, 103810, + 103815, 103820, 103825, 103830, 103835, 103840, 103845, 103850, 103855, + 103860, 103865, 103870, 103875, 103880, 103885, 103890, 0, 103894, + 103898, 103903, 103908, 103913, 103917, 103921, 0, 103926, 103931, 0, + 103936, 103941, 103946, 103951, 103956, 0, 0, 103960, 103965, 103970, + 103976, 103981, 103987, 103992, 103998, 104004, 0, 0, 104011, 104017, 0, + 0, 104023, 104029, 104035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104040, 0, 0, 0, 0, + 0, 104047, 104052, 104059, 104067, 104073, 104079, 104085, 0, 0, 104092, + 104098, 104103, 104108, 104113, 104118, 104123, 0, 0, 0, 104128, 104133, + 104138, 104143, 104149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104154, 104158, 104162, 104167, 104171, + 104176, 104180, 104185, 104190, 104196, 104201, 104207, 104211, 104216, + 104220, 104225, 104229, 104234, 104239, 104244, 104249, 104254, 104259, + 104264, 104269, 104274, 104279, 104284, 104289, 104294, 104299, 104304, + 104309, 104314, 104319, 104323, 104327, 104332, 104337, 104342, 104346, + 104350, 104355, 104360, 104365, 104370, 104375, 104380, 104384, 104390, + 104395, 104401, 104406, 104412, 104418, 104425, 104431, 104438, 104443, + 104450, 104456, 104461, 104468, 104474, 104479, 104484, 104489, 104494, + 104499, 104504, 104508, 104513, 0, 0, 0, 0, 0, 0, 0, 0, 104517, 104522, + 104526, 104530, 104534, 104538, 104542, 104546, 104550, 104554, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104558, 104562, + 104567, 104571, 104576, 104580, 104585, 104590, 104596, 104601, 104607, + 104611, 104616, 104620, 104625, 104629, 104634, 104639, 104644, 104649, + 104654, 104659, 104664, 104669, 104674, 104679, 104684, 104689, 104694, + 104699, 104704, 104709, 104714, 104719, 104723, 104727, 104732, 104737, + 104742, 104746, 104750, 104755, 104760, 104765, 104770, 104775, 104780, + 104784, 104790, 104795, 104801, 104806, 104812, 104818, 0, 0, 104825, + 104830, 104836, 104841, 104847, 104852, 104857, 104862, 104867, 104872, + 104877, 104881, 104886, 104892, 104897, 104903, 104909, 104915, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 104923, 104927, 104932, 104936, 104941, 104945, 104950, 104955, + 104961, 104966, 104972, 104976, 104981, 104985, 104990, 104994, 104999, + 105004, 105009, 105014, 105019, 105024, 105029, 105034, 105039, 105044, + 105049, 105054, 105059, 105064, 105069, 105074, 105079, 105084, 105088, + 105092, 105097, 105102, 105107, 105111, 105115, 105120, 105125, 105130, + 105135, 105140, 105145, 105149, 105154, 105160, 105165, 105171, 105176, + 105182, 105188, 105195, 105201, 105208, 105213, 105219, 105224, 105230, + 105235, 105240, 105245, 105250, 105254, 105259, 105264, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 105269, 105274, 105278, 105282, 105286, 105290, 105294, + 105298, 105302, 105306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105310, + 105314, 105319, 105323, 105328, 105332, 105337, 105341, 105346, 105350, + 105355, 105359, 105364, 105369, 105374, 105379, 105384, 105389, 105394, + 105399, 105404, 105409, 105414, 105419, 105424, 105429, 105434, 105439, + 105444, 105449, 105453, 105457, 105462, 105467, 105472, 105476, 105480, + 105485, 105490, 105495, 105500, 105505, 105509, 105514, 105519, 105524, + 105530, 105535, 105541, 105546, 105552, 105557, 105563, 105568, 105574, + 105579, 0, 0, 0, 0, 0, 0, 0, 0, 105584, 105589, 105593, 105597, 105601, + 105605, 105609, 105613, 105617, 105621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105625, 105631, 105636, 105642, 105648, + 105653, 105659, 105665, 105671, 105676, 105681, 105687, 105693, 105699, + 105705, 105711, 105717, 105723, 105729, 105735, 105741, 105747, 105753, + 105759, 105765, 105771, 105777, 105783, 105789, 105795, 105801, 105807, + 105813, 105819, 105824, 105830, 105836, 105841, 105847, 105853, 105859, + 105864, 105869, 105875, 105881, 105887, 105893, 105899, 105905, 105911, + 105917, 105923, 105929, 105935, 105941, 105947, 105953, 105959, 105965, + 105971, 105977, 105983, 105989, 105995, 106001, 106006, 106010, 106014, + 106018, 106022, 106026, 106030, 106034, 106038, 106042, 106047, 106052, + 106057, 106062, 106067, 106072, 106077, 106082, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 106087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 106091, 106099, 106107, 106116, 106124, 106133, 106142, + 106151, 106160, 106168, 106177, 106186, 106195, 106204, 106213, 106222, + 106231, 106239, 106248, 106257, 106266, 106275, 106283, 106291, 106299, + 106307, 106315, 106324, 106333, 106343, 106353, 106363, 106373, 106383, + 106392, 106402, 106412, 106422, 106433, 106443, 106455, 106467, 106478, + 106492, 106503, 106513, 106525, 106536, 106546, 106558, 106570, 106581, + 106592, 106602, 106612, 106624, 106635, 0, 0, 0, 0, 0, 0, 0, 106647, + 106650, 106655, 106661, 106669, 106674, 106680, 106688, 106694, 106700, + 106704, 106708, 106715, 106724, 106731, 106740, 106746, 106755, 106762, + 106769, 106776, 106786, 106792, 106796, 106803, 106812, 106822, 106829, + 106836, 106840, 106844, 106851, 106861, 106865, 106872, 106879, 106886, + 106892, 106899, 106906, 106913, 106920, 106924, 106928, 106932, 106939, + 106943, 106950, 106957, 106971, 106980, 106984, 106988, 106992, 106999, + 107003, 107007, 107011, 107019, 107027, 107046, 107056, 107076, 107080, + 107084, 107088, 107092, 107096, 107100, 107104, 107111, 107115, 107118, + 107122, 107126, 107132, 107139, 107148, 107152, 107161, 107170, 107178, + 107182, 107189, 107193, 107197, 107201, 107205, 107216, 107225, 107234, + 107243, 107252, 107264, 107273, 107282, 107291, 107299, 107308, 107320, + 107329, 107338, 107347, 107359, 107368, 107377, 107389, 107398, 107407, + 107419, 107428, 107432, 107436, 107440, 107444, 107448, 107452, 107456, + 107463, 107467, 107471, 107482, 107486, 107490, 107497, 107503, 107509, + 107513, 107520, 107524, 107528, 107532, 107536, 107540, 107544, 107550, + 107558, 107562, 107566, 107569, 107575, 107585, 107589, 107601, 107608, + 107615, 107622, 107629, 107635, 107639, 107643, 107647, 107651, 107658, + 107667, 107674, 107682, 107690, 107696, 107700, 107704, 107708, 107712, + 107718, 107727, 107739, 107746, 107753, 107762, 107773, 107779, 107788, + 107797, 107804, 107813, 107820, 107827, 107837, 107844, 107851, 107858, + 107865, 107869, 107875, 107879, 107890, 107898, 107907, 107919, 107926, + 107933, 107943, 107950, 107960, 107967, 107977, 107984, 107991, 108001, + 108008, 108015, 108025, 108032, 108044, 108053, 108060, 108067, 108074, + 108083, 108093, 108106, 108113, 108123, 108133, 108140, 108149, 108162, + 108169, 108176, 108183, 108193, 108203, 108210, 108220, 108227, 108234, + 108244, 108250, 108257, 108264, 108271, 108281, 108288, 108295, 108302, + 108308, 108315, 108325, 108332, 108336, 108344, 108348, 108360, 108364, + 108378, 108382, 108386, 108390, 108394, 108400, 108407, 108415, 108419, + 108423, 108427, 108431, 108438, 108442, 108448, 108454, 108462, 108466, + 108473, 108481, 108485, 108489, 108495, 108499, 108508, 108517, 108524, + 108534, 108540, 108544, 108548, 108556, 108563, 108570, 108576, 108580, + 108588, 108592, 108599, 108611, 108618, 108628, 108634, 108638, 108647, + 108654, 108663, 108667, 108671, 108678, 108682, 108686, 108690, 108694, + 108697, 108703, 108709, 108713, 108717, 108724, 108731, 108738, 108745, + 108752, 108759, 108766, 108773, 108779, 108783, 108787, 108794, 108801, + 108808, 108815, 108822, 108826, 108829, 108834, 108838, 108842, 108851, + 108860, 108864, 108868, 108874, 108880, 108897, 108903, 108907, 108916, + 108920, 108924, 108931, 108939, 108947, 108953, 108957, 108961, 108965, + 108969, 108972, 108978, 108985, 108995, 109002, 109009, 109016, 109022, + 109029, 109036, 109043, 109050, 109057, 109066, 109073, 109085, 109092, + 109099, 109109, 109120, 109127, 109134, 109141, 109148, 109155, 109162, + 109169, 109176, 109183, 109190, 109200, 109210, 109220, 109227, 109237, + 109244, 109251, 109258, 109265, 109272, 109279, 109286, 109293, 109300, + 109307, 109314, 109321, 109328, 109334, 109341, 109348, 109357, 109364, + 109371, 109375, 109383, 109387, 109391, 109395, 109399, 109403, 109410, + 109414, 109423, 109427, 109434, 109442, 109446, 109450, 109454, 109467, + 109483, 109487, 109491, 109498, 109504, 109511, 109515, 109519, 109523, + 109527, 109531, 109538, 109542, 109560, 109564, 109568, 109575, 109579, + 109583, 109589, 109593, 109597, 109605, 109609, 109613, 109617, 109621, + 109627, 109638, 109647, 109656, 109663, 109670, 109681, 109688, 109695, + 109702, 109709, 109716, 109723, 109730, 109740, 109746, 109753, 109763, + 109772, 109779, 109788, 109798, 109805, 109812, 109819, 109826, 109838, + 109845, 109852, 109859, 109866, 109873, 109883, 109890, 109897, 109907, + 109920, 109932, 109939, 109949, 109956, 109963, 109970, 109984, 109990, + 109998, 110008, 110018, 110025, 110032, 110038, 110042, 110049, 110059, + 110065, 110078, 110082, 110086, 110093, 110097, 110104, 110114, 110118, + 110122, 110126, 110130, 110134, 110141, 110145, 110152, 110159, 110166, + 110175, 110184, 110194, 110201, 110208, 110215, 110225, 110232, 110242, + 110249, 110259, 110266, 110273, 110283, 110293, 110300, 110306, 110314, + 110322, 110328, 110334, 110338, 110342, 110349, 110357, 110363, 110367, + 110371, 110375, 110382, 110394, 110397, 110404, 110410, 110414, 110418, + 110422, 110426, 110430, 110434, 110438, 110442, 110446, 110450, 110457, + 110461, 110467, 110471, 110475, 110479, 110485, 110492, 110499, 110506, + 110517, 110525, 110529, 110535, 110544, 110551, 110557, 110560, 110564, + 110568, 110574, 110583, 110591, 110595, 110601, 110605, 110609, 110613, + 110619, 110626, 110632, 110636, 110642, 110646, 110650, 110659, 110671, + 110675, 110682, 110689, 110699, 110706, 110718, 110725, 110732, 110739, + 110750, 110760, 110773, 110783, 110790, 110794, 110798, 110802, 110806, + 110815, 110824, 110833, 110850, 110859, 110865, 110872, 110880, 110893, + 110897, 110906, 110915, 110924, 110933, 110944, 110953, 110962, 110971, + 110980, 110989, 110998, 111008, 111011, 111015, 111019, 111023, 111027, + 111031, 111037, 111044, 111051, 111058, 111064, 111070, 111077, 111083, + 111090, 111098, 111102, 111109, 111116, 111123, 111131, 111135, 111139, + 111143, 111147, 111151, 111157, 111161, 111167, 111174, 111181, 111187, + 111194, 111201, 111208, 111215, 111222, 111229, 111236, 111243, 111250, + 111257, 111264, 111271, 111278, 111285, 111291, 111295, 111304, 111308, + 111312, 111316, 111320, 111326, 111333, 111340, 111347, 111354, 111361, + 111367, 111375, 111379, 111383, 111387, 111391, 111397, 111414, 111431, + 111435, 111439, 111443, 111447, 111451, 111455, 111461, 111468, 111472, + 111478, 111485, 111492, 111499, 111506, 111513, 111522, 111529, 111536, + 111543, 111550, 111554, 111558, 111564, 111576, 111580, 111584, 111593, + 111597, 111601, 111605, 111611, 111615, 111619, 111628, 111632, 111636, + 111640, 111647, 111651, 111655, 111659, 111663, 111667, 111671, 111675, + 111679, 111685, 111692, 111699, 111705, 111709, 111726, 111732, 111736, + 111742, 111748, 111754, 111760, 111766, 111772, 111776, 111780, 111784, + 111790, 111794, 111800, 111804, 111808, 111815, 111822, 111839, 111843, + 111847, 111851, 111855, 111859, 111871, 111874, 111879, 111884, 111899, + 111909, 111921, 111925, 111929, 111933, 111939, 111946, 111953, 111963, + 111975, 111981, 111987, 111996, 112000, 112004, 112011, 112021, 112028, + 112034, 112038, 112042, 112049, 112055, 112059, 112065, 112069, 112077, + 112083, 112087, 112095, 112103, 112110, 112116, 112123, 112130, 112140, + 112150, 112154, 112158, 112162, 112166, 112172, 112179, 112185, 112192, + 112199, 112206, 112215, 112222, 112229, 112235, 112242, 112249, 112256, + 112263, 112270, 112277, 112283, 112290, 112297, 112304, 112313, 112320, + 112327, 112331, 112337, 112341, 112347, 112354, 112361, 112368, 112372, + 112376, 112380, 112384, 112388, 112395, 112399, 112403, 112409, 112417, + 112421, 112425, 112429, 112433, 112440, 112444, 112448, 112456, 112460, + 112464, 112468, 112472, 112478, 112482, 112486, 112492, 112499, 112505, + 112512, 112524, 112528, 112535, 112542, 112549, 112556, 112568, 112575, + 112579, 112583, 112587, 112594, 112601, 112608, 112615, 112625, 112632, + 112638, 112645, 112652, 112659, 112666, 112675, 112685, 112692, 112696, + 112703, 112707, 112711, 112715, 112722, 112729, 112739, 112745, 112749, + 112758, 112762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112769, 112775, 112781, 112788, + 112795, 112802, 112809, 112816, 112823, 112829, 112836, 112843, 112850, + 112857, 112864, 112871, 112877, 112883, 112889, 112895, 112901, 112907, + 112913, 112919, 112925, 112932, 112939, 112946, 112953, 112960, 112967, + 112973, 112979, 112985, 112992, 112999, 113005, 113011, 113020, 113027, + 113034, 113041, 113048, 113055, 113062, 113068, 113074, 113080, 113089, + 113096, 113103, 113114, 113125, 113131, 113137, 113143, 113152, 113159, + 113166, 113176, 113186, 113197, 113208, 113220, 113233, 113244, 113255, + 113267, 113280, 113291, 113302, 113313, 113324, 113335, 113347, 113355, + 113363, 113372, 113381, 113390, 113396, 113402, 113408, 113415, 113425, + 113432, 113442, 113447, 113452, 113458, 113464, 113472, 113480, 113489, + 113500, 113511, 113519, 113527, 113536, 113545, 113553, 113560, 113568, + 113576, 113583, 113590, 113599, 113608, 113617, 113626, 113635, 0, + 113644, 113655, 113662, 113670, 113678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 113686, 113690, 113694, 113698, 113702, 113706, + 113710, 113714, 113718, 113722, 113726, 113730, 113734, 113738, 113742, + 113746, 113750, 113754, 113758, 113762, 113766, 113770, 113774, 113778, + 113782, 113786, 113790, 113794, 113798, 113802, 113806, 113810, 113814, + 113818, 113822, 113826, 113830, 113834, 113838, 113842, 113846, 113850, + 113854, 113858, 113862, 113866, 113870, 113874, 113878, 113882, 113886, + 113890, 113894, 113898, 113902, 113906, 113910, 113914, 113918, 113922, + 113926, 113930, 113934, 113938, 113942, 113946, 113950, 113954, 113958, + 113962, 113966, 113970, 113974, 113978, 113982, 113986, 113990, 113994, + 113998, 114002, 114006, 114010, 114014, 114018, 114022, 114026, 114030, + 114034, 114038, 114042, 114046, 114050, 114054, 114058, 114062, 114066, + 114070, 114074, 114078, 114082, 114086, 114090, 114094, 114098, 114102, + 114106, 114110, 114114, 114118, 114122, 114126, 114130, 114134, 114138, + 114142, 114146, 114150, 114154, 114158, 114162, 114166, 114170, 114174, + 114178, 114182, 114186, 114190, 114194, 114198, 114202, 114206, 114210, + 114214, 114218, 114222, 114226, 114230, 114234, 114238, 114242, 114246, + 114250, 114254, 114258, 114262, 114266, 114270, 114274, 114278, 114282, + 114286, 114290, 114294, 114298, 114302, 114306, 114310, 114314, 114318, + 114322, 114326, 114330, 114334, 114338, 114342, 114346, 114350, 114354, + 114358, 114362, 114366, 114370, 114374, 114378, 114382, 114386, 114390, + 114394, 114398, 114402, 114406, 114410, 114414, 114418, 114422, 114426, + 114430, 114434, 114438, 114442, 114446, 114450, 114454, 114458, 114462, + 114466, 114470, 114474, 114478, 114482, 114486, 114490, 114494, 114498, + 114502, 114506, 114510, 114514, 114518, 114522, 114526, 114530, 114534, + 114538, 114542, 114546, 114550, 114554, 114558, 114562, 114566, 114570, + 114574, 114578, 114582, 114586, 114590, 114594, 114598, 114602, 114606, + 114610, 114614, 114618, 114622, 114626, 114630, 114634, 114638, 114642, + 114646, 114650, 114654, 114658, 114662, 114666, 114670, 114674, 114678, + 114682, 114686, 114690, 114694, 114698, 114702, 114706, 114710, 114714, + 114718, 114722, 114726, 114730, 114734, 114738, 114742, 114746, 114750, + 114754, 114758, 114762, 114766, 114770, 114774, 114778, 114782, 114786, + 114790, 114794, 114798, 114802, 114806, 114810, 114814, 114818, 114822, + 114826, 114830, 114834, 114838, 114842, 114846, 114850, 114854, 114858, + 114862, 114866, 114870, 114874, 114878, 114882, 114886, 114890, 114894, + 114898, 114902, 114906, 114910, 114914, 114918, 114922, 114926, 114930, + 114934, 114938, 114942, 114946, 114950, 114954, 114958, 114962, 114966, + 114970, 114974, 114978, 114982, 114986, 114990, 114994, 114998, 115002, + 115006, 115010, 115014, 115018, 115022, 115026, 115030, 115034, 115038, + 115042, 115046, 115050, 115054, 115058, 115062, 115066, 115070, 115074, + 115078, 115082, 115086, 115090, 115094, 115098, 115102, 115106, 115110, + 115114, 115118, 115122, 115126, 115130, 115134, 115138, 115142, 115146, + 115150, 115154, 115158, 115162, 115166, 115170, 115174, 115178, 115182, + 115186, 115190, 115194, 115198, 115202, 115206, 115210, 115214, 115218, + 115222, 115226, 115230, 115234, 115238, 115242, 115246, 115250, 115254, + 115258, 115262, 115266, 115270, 115274, 115278, 115282, 115286, 115290, + 115294, 115298, 115302, 115306, 115310, 115314, 115318, 115322, 115326, + 115330, 115334, 115338, 115342, 115346, 115350, 115354, 115358, 115362, + 115366, 115370, 115374, 115378, 115382, 115386, 115390, 115394, 115398, + 115402, 115406, 115410, 115414, 115418, 115422, 115426, 115430, 115434, + 115438, 115442, 115446, 115450, 115454, 115458, 115462, 115466, 115470, + 115474, 115478, 115482, 115486, 115490, 115494, 115498, 115502, 115506, + 115510, 115514, 115518, 115522, 115526, 115530, 115534, 115538, 115542, + 115546, 115550, 115554, 115558, 115562, 115566, 115570, 115574, 115578, + 115582, 115586, 115590, 115594, 115598, 115602, 115606, 115610, 115614, + 115618, 115622, 115626, 115630, 115634, 115638, 115642, 115646, 115650, + 115654, 115658, 115662, 115666, 115670, 115674, 115678, 115682, 115686, + 115690, 115694, 115698, 115702, 115706, 115710, 115714, 115718, 115722, + 115726, 115730, 115734, 115738, 115742, 115746, 115750, 115754, 115758, + 115762, 115766, 115770, 115774, 115778, 115782, 115786, 115790, 115794, + 115798, 115802, 115806, 115810, 115814, 115818, 115822, 115826, 115830, + 115834, 115838, 115842, 115846, 115850, 115854, 115858, 115862, 115866, + 115870, 115874, 115878, 115882, 115886, 115890, 115894, 115898, 115902, + 115906, 115910, 115914, 115918, 115922, 115926, 115930, 115934, 115938, + 115942, 115946, 115950, 115954, 115958, 115962, 115966, 115970, 115974, + 115978, 115982, 115986, 115990, 115994, 115998, 116002, 116006, 116010, + 116014, 116018, 116022, 116026, 116030, 116034, 116038, 116042, 116046, + 116050, 116054, 116058, 116062, 116066, 116070, 116074, 116078, 116082, + 116086, 116090, 116094, 116098, 116102, 116106, 116110, 116114, 116118, + 116122, 116126, 116130, 116134, 116138, 116142, 116146, 116150, 116154, + 116158, 116162, 116166, 116170, 116174, 116178, 116182, 116186, 116190, + 116194, 116198, 116202, 116206, 116210, 116214, 116218, 116222, 116226, + 116230, 116234, 116238, 116242, 116246, 116250, 116254, 116258, 116262, + 116266, 116270, 116274, 116278, 116282, 116286, 116290, 116294, 116298, + 116302, 116306, 116310, 116314, 116318, 116322, 116326, 116330, 116334, + 116338, 116342, 116346, 116350, 116354, 116358, 116362, 116366, 116370, + 116374, 116378, 116382, 116386, 116390, 116394, 116398, 116402, 116406, + 116410, 116414, 116418, 116422, 116426, 116430, 116434, 116438, 116442, + 116446, 116450, 116454, 116458, 116462, 116466, 116470, 116474, 116478, + 116482, 116486, 116490, 116494, 116498, 116502, 116506, 116510, 116514, + 116518, 116522, 116526, 116530, 116534, 116538, 116542, 116546, 116550, + 116554, 116558, 116562, 116566, 116570, 116574, 116578, 116582, 116586, + 116590, 116594, 116598, 116602, 116606, 116610, 116614, 116618, 116622, + 116626, 116630, 116634, 116638, 116642, 116646, 116650, 116654, 116658, + 116662, 116666, 116670, 116674, 116678, 116682, 116686, 116690, 116694, + 116698, 116702, 116706, 116710, 116714, 116718, 116722, 116726, 116730, + 116734, 116738, 116742, 116746, 116750, 116754, 116758, 116762, 116766, + 116770, 116774, 116778, 116782, 116786, 116790, 116794, 116798, 116802, + 116806, 116810, 116814, 116818, 116822, 116826, 116830, 116834, 116838, + 116842, 116846, 116850, 116854, 116858, 116862, 116866, 116870, 116874, + 116878, 116882, 116886, 116890, 116894, 116898, 116902, 116906, 116910, + 116914, 116918, 116922, 116926, 116930, 116934, 116938, 116942, 116946, + 116950, 116954, 116958, 116962, 116966, 116970, 116974, 116978, 116982, + 116986, 116990, 116994, 116998, 117002, 117006, 117010, 117014, 117018, + 117022, 117026, 117030, 117034, 117038, 117042, 117046, 117050, 117054, + 117058, 117062, 117066, 117070, 117074, 117078, 117082, 117086, 117090, + 117094, 117098, 117102, 117106, 117110, 117114, 117118, 117122, 117126, + 117130, 117134, 117138, 117142, 117146, 117150, 117154, 117158, 117162, + 117166, 117170, 117174, 117178, 117182, 117186, 117190, 117194, 117198, + 117202, 117206, 117210, 117214, 117218, 117222, 117226, 117230, 117234, + 117238, 117242, 117246, 117250, 117254, 117258, 117262, 117266, 117270, + 117274, 117278, 117282, 117286, 117290, 117294, 117298, 117302, 117306, + 117310, 117314, 117318, 117322, 117326, 117330, 117334, 117338, 117342, + 117346, 117350, 117354, 117358, 117362, 117366, 117370, 117374, 117378, + 117382, 117386, 117390, 117394, 117398, 117402, 117406, 117410, 117414, + 117418, 117422, 117426, 117430, 117434, 117438, 117442, 117446, 117450, + 117454, 117458, 117462, 117466, 117470, 117474, 117478, 117482, 117486, + 117490, 117494, 117498, 117502, 117506, 117510, 117514, 117518, 117522, + 117526, 117530, 117534, 117538, 117542, 117546, 117550, 117554, 117558, + 117562, 117566, 117570, 117574, 117578, 117582, 117586, 117590, 117594, + 117598, 117602, 117606, 117610, 117614, 117618, 117622, 117626, 117630, + 117634, 117638, 117642, 117646, 117650, 117654, 117658, 117662, 117666, + 117670, 117674, 117678, 117682, 117686, 117690, 117694, 117698, 117702, + 117706, 117710, 117714, 117718, 117722, 117726, 117730, 117734, 117738, + 117742, 117746, 117750, 117754, 117758, 117762, 117766, 117770, 117774, + 117778, 117782, 117786, 117790, 117794, 117798, 117802, 117806, 117810, + 117814, 117818, 117822, 117826, 117830, 117834, 117838, 117842, 117846, + 117850, 117854, 117858, 117862, 117866, 117870, 117874, 117878, 117882, + 117886, 117890, 117894, 117898, 117902, 117906, 117910, 117914, 117918, + 117922, 117926, 117930, 117934, 117938, 117942, 117946, 117950, 117954, + 117958, 117962, 117966, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 117970, 117977, 117984, 117993, 118002, 118009, 118014, 118021, + 118028, 118037, 118048, 118059, 118064, 118071, 118076, 118081, 118086, + 118091, 118096, 118101, 118106, 118111, 118116, 118121, 118126, 118133, + 118140, 118145, 118150, 118155, 118160, 118167, 118174, 118182, 118187, + 118194, 118199, 118204, 118209, 118214, 118219, 118226, 118233, 118238, + 118243, 118248, 118253, 118258, 118263, 118268, 118273, 118278, 118283, + 118288, 118293, 118298, 118303, 118308, 118313, 118318, 118323, 118328, + 118335, 118340, 118345, 118354, 118361, 118366, 118371, 118376, 118381, + 118386, 118391, 118396, 118401, 118406, 118411, 118416, 118421, 118426, + 118431, 118436, 118441, 118446, 118451, 118456, 118461, 118466, 118472, + 118480, 118486, 118494, 118502, 118510, 118516, 118522, 118528, 118534, + 118540, 118548, 118558, 118566, 118574, 118580, 118586, 118594, 118602, + 118608, 118616, 118624, 118632, 118638, 118644, 118650, 118656, 118662, + 118668, 118676, 118684, 118690, 118696, 118702, 118708, 118714, 118722, + 118728, 118734, 118740, 118746, 118752, 118758, 118766, 118772, 118778, + 118784, 118790, 118798, 118806, 118812, 118818, 118824, 118829, 118835, + 118841, 118848, 118853, 118858, 118863, 118868, 118873, 118878, 118883, + 118888, 118893, 118902, 118909, 118914, 118919, 118924, 118931, 118936, + 118941, 118946, 118953, 118958, 118963, 118968, 118973, 118978, 118983, + 118988, 118993, 118998, 119003, 119008, 119015, 119020, 119027, 119032, + 119037, 119044, 119049, 119054, 119059, 119064, 119069, 119074, 119079, + 119084, 119089, 119094, 119099, 119104, 119109, 119114, 119119, 119124, + 119129, 119134, 119139, 119146, 119151, 119156, 119161, 119166, 119171, + 119176, 119181, 119186, 119191, 119196, 119201, 119206, 119211, 119218, + 119223, 119228, 119235, 119240, 119245, 119250, 119255, 119260, 119265, + 119270, 119275, 119280, 119285, 119292, 119297, 119302, 119307, 119312, + 119317, 119324, 119331, 119336, 119341, 119346, 119351, 119356, 119361, + 119366, 119371, 119376, 119381, 119386, 119391, 119396, 119401, 119406, + 119411, 119416, 119421, 119426, 119431, 119436, 119441, 119446, 119451, + 119456, 119461, 119466, 119471, 119476, 119481, 119486, 119491, 119496, + 119501, 119506, 119511, 119518, 119523, 119528, 119533, 119538, 119543, + 119548, 119553, 119558, 119563, 119568, 119573, 119578, 119583, 119588, + 119593, 119598, 119603, 119608, 119613, 119618, 119623, 119628, 119633, + 119638, 119643, 119648, 119653, 119658, 119663, 119668, 119673, 119678, + 119683, 119688, 119693, 119698, 119703, 119708, 119713, 119718, 119723, + 119728, 119733, 119738, 119743, 119748, 119753, 119758, 119763, 119768, + 119773, 119778, 119783, 119788, 119793, 119798, 119803, 119808, 119815, + 119820, 119825, 119830, 119835, 119840, 119845, 119850, 119855, 119860, + 119865, 119870, 119875, 119880, 119885, 119890, 119895, 119900, 119905, + 119910, 119915, 119920, 119927, 119932, 119937, 119943, 119948, 119953, + 119958, 119963, 119968, 119973, 119978, 119983, 119988, 119993, 119998, + 120003, 120008, 120013, 120018, 120023, 120028, 120033, 120038, 120043, + 120048, 120053, 120058, 120063, 120068, 120073, 120078, 120083, 120088, + 120093, 120098, 120103, 120108, 120113, 120118, 120123, 120128, 120133, + 120138, 120143, 120148, 120153, 120158, 120165, 120170, 120175, 120182, + 120189, 120194, 120199, 120204, 120209, 120214, 120219, 120224, 120229, + 120234, 120239, 120244, 120249, 120254, 120259, 120264, 120269, 120274, + 120279, 120284, 120289, 120294, 120299, 120304, 120309, 120314, 120321, + 120326, 120331, 120336, 120341, 120346, 120351, 120356, 120361, 120366, + 120371, 120376, 120381, 120386, 120391, 120396, 120401, 120406, 120411, + 120418, 120423, 120428, 120433, 120438, 120443, 120448, 120453, 120459, + 120464, 120469, 120474, 120479, 120484, 120489, 120494, 120499, 120506, + 120513, 120518, 120523, 120527, 120532, 120536, 120540, 120545, 120552, + 120557, 120562, 120571, 120576, 120581, 120586, 120591, 120598, 120605, + 120610, 120615, 120620, 120625, 120632, 120637, 120642, 120647, 120652, + 120657, 120662, 120667, 120672, 120677, 120682, 120687, 120692, 120699, + 120703, 120708, 120713, 120718, 120723, 120727, 120732, 120737, 120742, + 120747, 120752, 120757, 120762, 120767, 120772, 120778, 120784, 120790, + 120796, 120802, 120808, 120814, 120820, 120826, 120832, 120838, 120844, + 120850, 120856, 120862, 120868, 120874, 120880, 120886, 120892, 120898, + 120904, 120910, 120916, 120921, 120927, 120933, 120939, 120945, 120951, + 120957, 120963, 120969, 120975, 120981, 120987, 120993, 120999, 121005, + 121011, 121017, 121023, 121029, 121035, 121041, 121046, 121052, 121058, + 121064, 121070, 121076, 0, 0, 0, 0, 0, 0, 0, 121082, 121087, 121092, + 121097, 121102, 121107, 121112, 121116, 121121, 121126, 121131, 121136, + 121141, 121146, 121151, 121156, 121161, 121165, 121170, 121174, 121179, + 121184, 121189, 121194, 121199, 121203, 121208, 121213, 121218, 121223, + 121228, 0, 121233, 121238, 121242, 121246, 121250, 121254, 121258, + 121262, 121266, 121270, 0, 0, 0, 0, 121274, 121278, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121283, 121290, + 121296, 121303, 121310, 121317, 121324, 121331, 121338, 121345, 121352, + 121359, 121366, 121373, 121380, 121387, 121394, 121401, 121407, 121414, + 121421, 121428, 121434, 121441, 121447, 121453, 121460, 121466, 121473, + 121479, 0, 0, 121485, 121493, 121501, 121510, 121519, 121528, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121536, 121541, 121546, 121551, 121556, 121561, 121566, + 121571, 121576, 121581, 121586, 121591, 121596, 121601, 121606, 121611, + 121616, 121621, 121626, 121631, 121636, 121641, 121646, 121651, 121656, + 121661, 121666, 121671, 121676, 121681, 121686, 121691, 121696, 121701, + 121706, 121711, 121716, 121721, 121726, 121731, 121736, 121741, 121746, + 121751, 121756, 121761, 121766, 121771, 121776, 121783, 121790, 121797, + 121804, 121811, 121818, 121825, 121832, 121841, 121848, 121855, 121862, + 121869, 121876, 121883, 121890, 121897, 121904, 121911, 121918, 121923, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121932, 121937, 121941, 121945, 121949, + 121953, 121957, 121961, 121965, 121969, 0, 121973, 121978, 121983, + 121990, 121995, 122002, 122009, 0, 122014, 122021, 122026, 122031, + 122038, 122045, 122050, 122055, 122060, 122065, 122070, 122077, 122084, + 122089, 122094, 122099, 122112, 122121, 122128, 122137, 122146, 0, 0, 0, + 0, 0, 122155, 122162, 122169, 122176, 122183, 122190, 122197, 122204, + 122211, 122218, 122225, 122232, 122239, 122246, 122253, 122260, 122267, + 122274, 122281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122288, + 122291, 122295, 122299, 122303, 122306, 122310, 122315, 122319, 122323, + 122327, 122331, 122335, 122340, 122345, 122349, 122353, 122356, 122360, + 122365, 122370, 122374, 122378, 122382, 122386, 122390, 122394, 122398, + 122402, 122406, 122410, 122413, 122417, 122421, 122425, 122429, 122433, + 122437, 122443, 122446, 122450, 122454, 122458, 122462, 122466, 122470, + 122474, 122478, 122482, 122487, 122492, 122498, 122502, 122506, 122510, + 122514, 122518, 122522, 122527, 122531, 122535, 122539, 122543, 122547, + 122553, 122557, 122561, 122565, 122569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 122573, 122577, 122581, 122587, 122593, 122597, 122602, 122607, 122612, + 122617, 122621, 122626, 122631, 122636, 122640, 122645, 122650, 122655, + 122659, 122664, 122669, 122674, 122679, 122684, 122689, 122694, 122699, + 122703, 122708, 122713, 122718, 122723, 122728, 122733, 122738, 122743, + 122748, 122753, 122758, 122765, 122770, 122777, 122782, 122787, 122792, + 122797, 122802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122807, + 122811, 122817, 122820, 122823, 122827, 122831, 122835, 122839, 122843, + 122847, 122851, 122857, 122863, 122869, 122875, 122881, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122887, 122892, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122898, 122902, 122906, 122910, + 122914, 122918, 122922, 122925, 122929, 122933, 122937, 122941, 122944, + 122950, 122955, 122961, 122967, 122972, 122976, 122982, 122986, 122990, + 122996, 123000, 123004, 123008, 123012, 123016, 123020, 123023, 123029, + 123035, 123041, 123047, 123054, 123061, 123068, 123078, 123085, 123092, + 123097, 123102, 123107, 123112, 123119, 123126, 123133, 123140, 123149, + 123155, 123162, 123168, 123175, 123181, 123188, 123193, 123200, 123204, + 123208, 123213, 123219, 123225, 123232, 123239, 123245, 123252, 123255, + 123261, 123265, 123268, 123272, 123275, 123278, 123282, 123287, 123291, + 123295, 123301, 123306, 123312, 123316, 123320, 123323, 123327, 123331, + 123336, 123340, 123345, 123349, 123354, 123358, 123362, 123366, 123370, + 123374, 123378, 123382, 123386, 123391, 123396, 123401, 123406, 123412, + 123418, 123424, 123430, 123436, 0, 0, 0, 0, 0, 123441, 123448, 123456, + 123463, 123470, 123478, 123485, 123492, 123501, 123508, 123515, 123522, + 123530, 0, 0, 0, 123538, 123543, 123550, 123556, 123563, 123569, 123575, + 123581, 123587, 0, 0, 0, 0, 0, 0, 0, 123593, 123598, 123605, 123611, + 123618, 123624, 123630, 123636, 123642, 123648, 0, 0, 123653, 123659, + 123665, 123668, 123677, 123684, 123692, 123699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123706, 123711, 123716, 123721, + 123728, 123735, 123742, 123749, 123754, 123759, 123764, 123769, 123776, + 123781, 123788, 123795, 123800, 123805, 123810, 123817, 123822, 123827, + 123834, 123841, 123846, 123851, 123856, 123863, 123870, 123877, 123882, + 123887, 123894, 123901, 123908, 123915, 123920, 123925, 123930, 123937, + 123942, 123947, 123952, 123959, 123968, 123975, 123980, 123985, 123990, + 123995, 124000, 124005, 124014, 124021, 124026, 124033, 124040, 124045, + 124050, 124055, 124062, 124067, 124074, 124081, 124086, 124091, 124096, + 124103, 124110, 124115, 124120, 124127, 124134, 124141, 124146, 124151, + 124156, 124161, 124168, 124177, 124186, 124191, 124198, 124207, 124212, + 124217, 124222, 124227, 124234, 124241, 124248, 124255, 124260, 124265, + 124270, 124277, 124284, 124291, 124296, 124301, 124308, 124313, 124320, + 124325, 124332, 124337, 124344, 124351, 124356, 124361, 124366, 124371, + 124376, 124381, 124386, 124391, 124396, 124403, 124410, 124417, 124424, + 124431, 124440, 124445, 124450, 124457, 124464, 124469, 124476, 124483, + 124490, 124497, 124504, 124511, 124516, 124521, 124526, 124531, 124536, + 124545, 124554, 124563, 124572, 124581, 124590, 124599, 124608, 124613, + 124624, 124635, 124644, 124649, 124654, 124659, 124664, 124673, 124680, + 124687, 124694, 124701, 124708, 124715, 124724, 124733, 124744, 124753, + 124764, 124773, 124780, 124789, 124800, 124809, 124818, 124827, 124836, + 124843, 124850, 124857, 124866, 124875, 124886, 124895, 124904, 124915, + 124920, 124925, 124936, 124944, 124953, 124962, 124971, 124982, 124991, + 125000, 125011, 125022, 125033, 125044, 125055, 125066, 125073, 125080, + 125087, 125094, 125105, 125114, 125121, 125128, 125135, 125146, 125157, + 125168, 125179, 125190, 125201, 125212, 125223, 125230, 125237, 125246, + 125255, 125262, 125269, 125276, 125285, 125294, 125303, 125310, 125319, + 125328, 125337, 125344, 125351, 125356, 125362, 125369, 125376, 125383, + 125390, 125397, 125404, 125413, 125422, 125431, 125440, 125447, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 125456, 125462, 125467, 125472, 125479, 125485, + 125491, 125497, 125503, 125509, 125515, 125521, 125525, 125529, 125535, + 125541, 125547, 125551, 125556, 125561, 125565, 125569, 125572, 125578, + 125584, 125590, 125596, 125602, 125608, 125614, 125620, 125626, 125636, + 125646, 125652, 125658, 125668, 125678, 125684, 0, 0, 125690, 125698, + 125703, 125708, 125714, 125720, 125726, 125732, 125738, 125744, 125751, + 125758, 125764, 125770, 125776, 125782, 125788, 125794, 125800, 125806, + 125811, 125817, 125823, 125829, 125835, 125841, 125850, 125856, 125861, + 125869, 125876, 125883, 125892, 125901, 125910, 125919, 125928, 125937, + 125946, 125955, 125965, 125975, 125983, 125991, 126000, 126009, 126015, + 126021, 126027, 126033, 126041, 126049, 126053, 126059, 126064, 126070, + 126076, 126082, 126088, 126094, 126103, 126108, 126115, 126120, 126125, + 126130, 126136, 126142, 126148, 126155, 126160, 126165, 126170, 126175, + 126180, 126186, 126192, 126198, 126204, 126210, 126216, 126222, 126228, + 126233, 126238, 126243, 126248, 126253, 126258, 126263, 126268, 126274, + 126280, 126285, 126290, 126295, 126300, 126305, 126311, 126318, 126322, + 126326, 126330, 126334, 126338, 126342, 126346, 126350, 126358, 126368, + 126372, 126376, 126382, 126388, 126394, 126400, 126406, 126412, 126418, + 126424, 126430, 126436, 126442, 126448, 126454, 126460, 126464, 126468, + 126475, 126481, 126487, 126493, 126498, 126505, 126510, 126516, 126522, + 126528, 126534, 126539, 126543, 126549, 126553, 126557, 126561, 126567, + 126573, 126577, 126583, 126589, 126595, 126601, 126607, 126615, 126623, + 126629, 126635, 126641, 126647, 126659, 126671, 126685, 126697, 126709, + 126723, 126737, 126751, 126755, 126763, 126771, 126776, 126780, 126784, + 126788, 126792, 126796, 126800, 126804, 126810, 126816, 126822, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 126828, 126835, 126842, 126849, 126856, 126863, + 126870, 126877, 126884, 126891, 126898, 126905, 126912, 126919, 126926, + 126933, 126940, 126947, 126954, 126961, 126968, 126975, 126982, 126989, + 126996, 127003, 127010, 127017, 127024, 127031, 127038, 127045, 127052, + 127059, 127066, 127073, 127080, 127087, 127094, 127101, 127108, 127115, + 127122, 127129, 127136, 127143, 127150, 127157, 127164, 127171, 127178, + 127185, 127192, 127199, 127206, 127213, 127220, 127227, 127234, 127241, + 127248, 127255, 127262, 127269, 127276, 127283, 127290, 127295, 127300, + 127305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127309, + 127314, 127321, 127328, 127335, 127342, 127347, 127352, 127359, 127364, + 127369, 127376, 127381, 127386, 127391, 127398, 127407, 127412, 127417, + 127422, 127427, 127432, 127437, 127444, 127449, 127454, 127459, 127464, + 127469, 127474, 127479, 127484, 127489, 127494, 127499, 127504, 127510, + 127515, 127520, 127525, 127530, 127535, 127540, 127545, 127550, 127555, + 127564, 127569, 127578, 127583, 127588, 127593, 127598, 127603, 127608, + 127613, 127622, 127627, 127632, 127637, 127642, 127647, 127654, 127659, + 127666, 127671, 127676, 127681, 127686, 127691, 127696, 127701, 127706, + 127711, 127716, 127721, 127726, 127731, 127736, 127741, 127746, 127751, + 127756, 127761, 127770, 127775, 127780, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 127785, 127793, 127801, 127809, 127817, 127825, 127833, 127841, 127849, + 127857, 127865, 127873, 127881, 127889, 127897, 127905, 127913, 127921, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127929, + 127933, 127938, 127943, 127948, 127952, 127957, 127962, 127967, 127971, + 127976, 127981, 127985, 127990, 127995, 127999, 128004, 128009, 128013, + 128017, 128022, 128026, 128031, 128036, 128041, 128046, 128051, 128055, + 128060, 128065, 128070, 128074, 128079, 128084, 128089, 128093, 128098, + 128103, 128107, 128112, 128117, 128121, 128126, 128131, 128135, 128139, + 128144, 128148, 128153, 128158, 128163, 128168, 128173, 128177, 128182, + 128187, 128192, 128196, 128201, 128206, 128211, 128215, 128220, 128225, + 128229, 128234, 128239, 128243, 128248, 128253, 128257, 128261, 128266, + 128270, 128275, 128280, 128285, 128290, 128295, 128299, 128304, 128309, + 128314, 128318, 128323, 0, 128328, 128332, 128337, 128342, 128346, + 128351, 128356, 128360, 128365, 128370, 128374, 128378, 128383, 128387, + 128392, 128397, 128402, 128407, 128412, 128417, 128423, 128429, 128435, + 128440, 128446, 128452, 128458, 128463, 128469, 128475, 128480, 128486, + 128492, 128497, 128503, 128509, 128514, 128519, 128525, 128530, 128536, + 128542, 128548, 128554, 128560, 128565, 128571, 128577, 128583, 128588, + 128594, 128600, 128606, 128611, 128617, 128623, 128628, 128634, 128640, + 128645, 128651, 128657, 128662, 128667, 128673, 128678, 128684, 128690, + 128696, 128702, 128708, 0, 128712, 128717, 0, 0, 128722, 0, 0, 128727, + 128732, 0, 0, 128737, 128742, 128746, 128751, 0, 128756, 128760, 128765, + 128769, 128774, 128779, 128784, 128789, 128794, 128798, 128803, 128808, + 0, 128813, 0, 128818, 128823, 128827, 128832, 128837, 128841, 128846, 0, + 128851, 128856, 128861, 128865, 128869, 128874, 128878, 128883, 128888, + 128893, 128898, 128903, 128908, 128914, 128920, 128926, 128931, 128937, + 128943, 128949, 128954, 128960, 128966, 128971, 128977, 128983, 128988, + 128994, 129000, 129005, 129010, 129016, 129021, 129027, 129033, 129039, + 129045, 129051, 129056, 129062, 129068, 129074, 129079, 129085, 129091, + 129097, 129102, 129108, 129114, 129119, 129125, 129131, 129136, 129142, + 129148, 129153, 129158, 129164, 129169, 129175, 129181, 129187, 129193, + 129199, 129203, 0, 129208, 129213, 129217, 129222, 0, 0, 129227, 129232, + 129237, 129241, 129246, 129251, 129255, 129260, 0, 129265, 129269, + 129274, 129278, 129283, 129288, 129293, 0, 129298, 129302, 129307, + 129312, 129317, 129321, 129326, 129331, 129336, 129340, 129345, 129350, + 129354, 129359, 129364, 129368, 129373, 129378, 129382, 129386, 129391, + 129395, 129400, 129405, 129410, 129415, 129420, 129424, 0, 129429, + 129434, 129438, 129443, 0, 129448, 129452, 129457, 129462, 129466, 0, + 129471, 0, 0, 0, 129475, 129479, 129484, 129488, 129493, 129498, 129503, + 0, 129508, 129512, 129517, 129522, 129527, 129531, 129536, 129541, + 129546, 129550, 129555, 129560, 129564, 129569, 129574, 129578, 129583, + 129588, 129592, 129596, 129601, 129605, 129610, 129615, 129620, 129625, + 129630, 129635, 129641, 129647, 129653, 129658, 129664, 129670, 129676, + 129681, 129687, 129693, 129698, 129704, 129710, 129715, 129721, 129727, + 129732, 129737, 129743, 129748, 129754, 129760, 129766, 129772, 129778, + 129783, 129789, 129795, 129801, 129806, 129812, 129818, 129824, 129829, + 129835, 129841, 129846, 129852, 129858, 129863, 129869, 129875, 129880, + 129885, 129891, 129896, 129902, 129908, 129914, 129920, 129926, 129930, + 129935, 129940, 129945, 129949, 129954, 129959, 129964, 129968, 129973, + 129978, 129982, 129987, 129992, 129996, 130001, 130006, 130010, 130014, + 130019, 130023, 130028, 130033, 130038, 130043, 130048, 130052, 130057, + 130062, 130067, 130071, 130076, 130081, 130086, 130090, 130095, 130100, + 130104, 130109, 130114, 130118, 130123, 130128, 130132, 130136, 130141, + 130145, 130150, 130155, 130160, 130165, 130170, 130175, 130181, 130187, + 130193, 130198, 130204, 130210, 130216, 130221, 130227, 130233, 130238, + 130244, 130250, 130255, 130261, 130267, 130272, 130277, 130283, 130288, + 130294, 130300, 130306, 130312, 130318, 130323, 130329, 130335, 130341, + 130346, 130352, 130358, 130364, 130369, 130375, 130381, 130386, 130392, + 130398, 130403, 130409, 130415, 130420, 130425, 130431, 130436, 130442, + 130448, 130454, 130460, 130466, 130471, 130477, 130483, 130489, 130494, + 130500, 130506, 130512, 130517, 130523, 130529, 130534, 130540, 130546, + 130551, 130557, 130563, 130568, 130573, 130579, 130584, 130590, 130596, + 130602, 130608, 130614, 130619, 130625, 130631, 130637, 130642, 130648, + 130654, 130660, 130665, 130671, 130677, 130682, 130688, 130694, 130699, + 130705, 130711, 130716, 130721, 130727, 130732, 130738, 130744, 130750, + 130756, 130762, 130768, 130775, 130782, 130789, 130795, 130802, 130809, + 130816, 130822, 130829, 130836, 130842, 130849, 130856, 130862, 130869, + 130876, 130882, 130888, 130895, 130901, 130908, 130915, 130922, 130929, + 130936, 130942, 130949, 130956, 130963, 130969, 130976, 130983, 130990, + 130996, 131003, 131010, 131016, 131023, 131030, 131036, 131043, 131050, + 131056, 131062, 131069, 131075, 131082, 131089, 131096, 131103, 131110, + 131115, 131121, 131127, 131133, 131138, 131144, 131150, 131156, 131161, + 131167, 131173, 131178, 131184, 131190, 131195, 131201, 131207, 131212, + 131217, 131223, 131228, 131234, 131240, 131246, 131252, 131258, 131263, + 131269, 131275, 131281, 131286, 131292, 131298, 131304, 131309, 131315, + 131321, 131326, 131332, 131338, 131343, 131349, 131355, 131360, 131365, + 131371, 131376, 131382, 131388, 131394, 131400, 131406, 131412, 0, 0, + 131419, 131424, 131429, 131434, 131439, 131444, 131449, 131454, 131459, + 131464, 131469, 131474, 131479, 131484, 131489, 131494, 131499, 131504, + 131510, 131515, 131520, 131525, 131530, 131535, 131540, 131545, 131549, + 131554, 131559, 131564, 131569, 131574, 131579, 131584, 131589, 131594, + 131599, 131604, 131609, 131614, 131619, 131624, 131629, 131634, 131640, + 131645, 131650, 131655, 131660, 131665, 131670, 131675, 131681, 131686, + 131691, 131696, 131701, 131706, 131711, 131716, 131721, 131726, 131731, + 131736, 131741, 131746, 131751, 131756, 131761, 131766, 131771, 131776, + 131781, 131786, 131791, 131796, 131802, 131807, 131812, 131817, 131822, + 131827, 131832, 131837, 131841, 131846, 131851, 131856, 131861, 131866, + 131871, 131876, 131881, 131886, 131891, 131896, 131901, 131906, 131911, + 131916, 131921, 131926, 131932, 131937, 131942, 131947, 131952, 131957, + 131962, 131967, 131973, 131978, 131983, 131988, 131993, 131998, 132003, + 132009, 132015, 132021, 132027, 132033, 132039, 132045, 132051, 132057, + 132063, 132069, 132075, 132081, 132087, 132093, 132099, 132105, 132112, + 132118, 132124, 132130, 132136, 132142, 132148, 132154, 132159, 132165, + 132171, 132177, 132183, 132189, 132195, 132201, 132207, 132213, 132219, + 132225, 132231, 132237, 132243, 132249, 132255, 132261, 132268, 132274, + 132280, 132286, 132292, 132298, 132304, 132310, 132317, 132323, 132329, + 132335, 132341, 132347, 132353, 132359, 132365, 132371, 132377, 132383, + 132389, 132395, 132401, 132407, 132413, 132419, 132425, 132431, 132437, + 132443, 132449, 132455, 132462, 132468, 132474, 132480, 132486, 132492, + 132498, 132504, 132509, 132515, 132521, 132527, 132533, 132539, 132545, + 132551, 132557, 132563, 132569, 132575, 132581, 132587, 132593, 132599, + 132605, 132611, 132618, 132624, 132630, 132636, 132642, 132648, 132654, + 132660, 132667, 132673, 132679, 132685, 132691, 132697, 132703, 132710, + 132717, 132724, 132731, 132738, 132745, 132752, 132759, 132766, 132773, + 132780, 132787, 132794, 132801, 132808, 132815, 132822, 132830, 132837, + 132844, 132851, 132858, 132865, 132872, 132879, 132885, 132892, 132899, + 132906, 132913, 132920, 132927, 132934, 132941, 132948, 132955, 132962, + 132969, 132976, 132983, 132990, 132997, 133004, 133012, 133019, 133026, + 133033, 133040, 133047, 133054, 133061, 133069, 133076, 133083, 133090, + 133097, 133104, 133111, 133116, 0, 0, 133121, 133126, 133130, 133134, + 133138, 133142, 133146, 133150, 133154, 133158, 133162, 133167, 133171, + 133175, 133179, 133183, 133187, 133191, 133195, 133199, 133203, 133208, + 133212, 133216, 133220, 133224, 133228, 133232, 133236, 133240, 133244, + 133250, 133255, 133260, 133265, 133270, 133275, 133280, 133285, 133290, + 133295, 133301, 133306, 133311, 133316, 133321, 133326, 133331, 133336, + 133341, 133346, 133353, 133359, 133366, 133373, 133380, 133387, 133394, + 133401, 133408, 133415, 133422, 133429, 133436, 133443, 133450, 133457, + 133464, 133471, 133478, 133485, 133492, 133499, 133506, 133513, 133520, + 133527, 133534, 133541, 133548, 133555, 133562, 133569, 133576, 133583, + 133589, 133595, 133601, 133608, 133614, 133621, 133627, 133634, 133641, + 133648, 133655, 133662, 133669, 133676, 133683, 133690, 133697, 133704, + 133711, 133718, 133725, 133732, 133739, 133746, 133753, 133760, 133767, + 133775, 133782, 133789, 133796, 133803, 133810, 133817, 133824, 133831, + 133838, 133845, 133852, 133859, 133865, 133872, 133879, 133886, 133893, + 133900, 133907, 133914, 133922, 133929, 133935, 133942, 133949, 133956, + 133963, 133970, 133977, 133984, 133991, 133998, 134005, 134012, 134019, + 134026, 134033, 134040, 134047, 134054, 134061, 134068, 134075, 134081, + 134088, 134095, 134102, 134109, 134116, 134123, 134130, 134137, 134144, + 134151, 134158, 134165, 134172, 134179, 134186, 134193, 134200, 134207, + 134214, 134221, 134228, 134235, 134243, 134251, 134259, 134266, 134273, + 134280, 134287, 134294, 134301, 134308, 134315, 134322, 134329, 134335, + 134342, 134349, 134356, 134363, 134370, 134377, 134384, 134391, 134398, + 134405, 134412, 134419, 134426, 134433, 134441, 134449, 134457, 134464, + 134471, 134478, 134485, 134492, 134499, 134506, 134513, 134520, 134527, + 134534, 134541, 134548, 134555, 134562, 134569, 134576, 134583, 134590, + 134597, 134604, 134611, 134618, 134625, 134632, 134639, 134646, 134653, + 134660, 134667, 134674, 134681, 134688, 134695, 134702, 134709, 134716, + 0, 0, 134723, 134727, 134731, 134735, 134739, 134743, 134747, 134751, + 134755, 134759, 134765, 134771, 134777, 134783, 134791, 134799, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134805, 134809, 134813, 134817, + 0, 134821, 134825, 134829, 134833, 134837, 134841, 134845, 134849, + 134853, 134857, 134861, 134865, 134869, 134873, 134877, 134881, 134885, + 134889, 134893, 134897, 134901, 134905, 134909, 134913, 134919, 134925, + 134931, 0, 134937, 134942, 0, 134947, 0, 0, 134952, 0, 134957, 134962, + 134967, 134972, 134977, 134982, 134987, 134992, 134997, 135002, 0, + 135007, 135012, 135017, 135022, 0, 135027, 0, 135032, 0, 0, 0, 0, 0, 0, + 135037, 0, 0, 0, 0, 135043, 0, 135049, 0, 135055, 0, 135061, 135067, + 135073, 0, 135079, 135085, 0, 135091, 0, 0, 135097, 0, 135103, 0, 135109, + 0, 135115, 0, 135123, 0, 135131, 135137, 0, 135143, 0, 0, 135149, 135155, + 135161, 135167, 0, 135173, 135179, 135185, 135191, 135197, 135203, + 135209, 0, 135215, 135221, 135227, 135233, 0, 135239, 135245, 135251, + 135257, 0, 135265, 0, 135273, 135279, 135285, 135291, 135297, 135303, + 135309, 135315, 135321, 135327, 0, 135333, 135339, 135345, 135351, + 135357, 135363, 135369, 135375, 135381, 135387, 135393, 135399, 135405, + 135411, 135417, 135423, 135429, 0, 0, 0, 0, 0, 135435, 135440, 135445, 0, + 135450, 135455, 135460, 135465, 135470, 0, 135475, 135480, 135485, + 135490, 135495, 135500, 135505, 135510, 135515, 135520, 135525, 135530, + 135535, 135540, 135545, 135550, 135555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135560, 135570, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 135578, 135585, 135591, 135598, + 135604, 135611, 135618, 135624, 135631, 135638, 135645, 135653, 135661, + 135669, 135677, 135685, 135693, 135700, 135707, 135714, 135722, 135730, + 135738, 135746, 135754, 135762, 135769, 135776, 135783, 135791, 135799, + 135807, 135815, 135823, 135831, 135836, 135841, 135846, 135851, 135856, + 135861, 135866, 135871, 135876, 0, 0, 0, 0, 135881, 135886, 135890, + 135894, 135898, 135902, 135906, 135910, 135914, 135918, 135922, 135926, + 135930, 135934, 135938, 135942, 135946, 135950, 135954, 135958, 135962, + 135966, 135970, 135974, 135978, 135982, 135986, 135990, 135994, 135998, + 136002, 136006, 136010, 136014, 136018, 136022, 136026, 136030, 136034, + 136038, 136042, 136046, 136050, 136054, 136058, 136062, 136066, 136070, + 136074, 136078, 136082, 136087, 136091, 136095, 136099, 136103, 136107, + 136111, 136115, 136119, 136123, 136127, 136131, 136135, 136139, 136143, + 136147, 136151, 136155, 136159, 136163, 136167, 136171, 136175, 136179, + 136183, 136187, 136191, 136195, 136199, 136203, 136207, 136211, 136215, + 136219, 136223, 136227, 136231, 136235, 136239, 136243, 136247, 136251, + 136255, 136259, 136263, 136267, 136271, 136275, 136279, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 136283, 136288, 136296, 136303, 136310, 136318, 136326, + 136334, 136342, 136350, 136358, 136366, 136374, 136382, 136390, 0, 0, + 136398, 136406, 136413, 136420, 136428, 136436, 136444, 136452, 136460, + 136468, 136476, 136484, 136492, 136500, 136508, 0, 136515, 136523, + 136530, 136537, 136545, 136553, 136561, 136569, 136577, 136585, 136593, + 136601, 136609, 136617, 136625, 0, 136631, 136639, 136646, 136653, + 136661, 136669, 136677, 136685, 136693, 136701, 136709, 136717, 136725, + 136733, 136741, 136747, 136752, 136757, 136762, 136767, 136772, 136777, + 136782, 136787, 136792, 136797, 136802, 136807, 136812, 136817, 136822, + 136827, 136832, 136837, 136842, 136847, 136852, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 136857, 136864, 136869, 136873, 136877, 136881, 136886, 136891, + 136896, 136901, 136906, 136911, 136918, 0, 0, 0, 136926, 136931, 136937, + 136943, 136949, 136954, 136960, 136966, 136972, 136977, 136983, 136989, + 136994, 137000, 137006, 137011, 137017, 137023, 137028, 137033, 137039, + 137044, 137050, 137056, 137062, 137068, 137074, 137084, 137091, 137097, + 137100, 0, 137103, 137108, 137114, 137120, 137126, 137131, 137137, + 137143, 137149, 137154, 137160, 137166, 137171, 137177, 137183, 137188, + 137194, 137200, 137205, 137210, 137216, 137221, 137227, 137233, 137239, + 137245, 137251, 137254, 137257, 137260, 137263, 137266, 137269, 137275, + 137282, 137289, 137296, 137302, 137309, 137316, 137323, 137329, 137336, + 137343, 137349, 137356, 137363, 137369, 137376, 137383, 137389, 137395, + 137402, 137408, 137415, 137422, 137429, 137436, 137443, 137448, 0, 0, 0, + 0, 137453, 137459, 137466, 137473, 137480, 137486, 137493, 137500, + 137507, 137513, 137520, 137527, 137533, 137540, 137547, 137553, 137560, + 137567, 137573, 137579, 137586, 137592, 137599, 137606, 137613, 137620, + 137627, 137636, 137640, 137643, 137647, 137651, 137655, 137658, 137661, + 137664, 137667, 137670, 137673, 137676, 137679, 137682, 137688, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137691, 137698, 137706, 137714, 137722, 137729, 137737, 137745, 137753, + 137760, 137768, 137776, 137783, 137791, 137799, 137806, 137814, 137822, + 137829, 137836, 137844, 137851, 137859, 137867, 137875, 137883, 137891, + 137895, 137899, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137903, 137909, + 137915, 137921, 137925, 137931, 137937, 137943, 137949, 137955, 137961, + 137967, 137973, 137979, 137985, 137991, 137997, 138003, 138009, 138015, + 138021, 138027, 138033, 138039, 138045, 138051, 138057, 138063, 138069, + 138075, 138081, 138087, 138093, 138099, 138105, 138111, 138117, 138123, + 138129, 138135, 138141, 138147, 138153, 0, 0, 0, 0, 0, 138159, 138170, + 138181, 138192, 138203, 138214, 138225, 138236, 138247, 0, 0, 0, 0, 0, 0, + 0, 138258, 138262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138266, 138268, 138270, 138274, + 138279, 138284, 138286, 138292, 138297, 138299, 138305, 138309, 138311, + 138315, 138321, 138327, 138333, 138338, 138342, 138349, 138356, 138363, + 138368, 138375, 138382, 138389, 138393, 138399, 138408, 138417, 138424, + 138429, 138433, 138437, 138439, 138442, 138445, 138452, 138459, 138469, + 138474, 138479, 138484, 138489, 138491, 0, 0, 0, 138497, 138499, 138501, + 138505, 138509, 138513, 138515, 138519, 138521, 138525, 138527, 138529, + 138531, 138533, 138538, 138543, 138545, 138551, 138555, 138559, 138567, + 138569, 138571, 138573, 138575, 138577, 138579, 138581, 138583, 138585, + 138587, 138591, 138595, 138597, 138599, 138601, 138603, 138605, 138610, + 138616, 138620, 138624, 138628, 138632, 138637, 138641, 138643, 138645, + 138649, 138655, 138657, 138659, 138661, 138665, 138674, 138680, 138684, + 138688, 138690, 138692, 138695, 138697, 138699, 138701, 138705, 138707, + 138711, 138716, 138718, 138723, 138729, 138736, 138740, 138744, 138748, + 138752, 138758, 138762, 0, 0, 138770, 138772, 138776, 138780, 138782, + 138786, 138790, 138792, 138796, 138798, 138802, 138806, 138810, 138814, + 138818, 138822, 138826, 138830, 138836, 138840, 138844, 138855, 138860, + 138864, 138868, 138874, 138878, 138882, 138886, 138893, 138900, 138904, + 138908, 138912, 138916, 138920, 138927, 138929, 138933, 138935, 138937, + 138941, 138945, 138949, 138951, 138955, 138959, 138963, 138967, 138971, + 138973, 138977, 138979, 138985, 138988, 138993, 138995, 138997, 139000, + 139002, 139004, 139007, 139014, 139021, 139028, 139033, 139037, 139039, + 139041, 139043, 139047, 139049, 139053, 139057, 139061, 139063, 139067, + 139069, 139073, 0, 0, 0, 0, 0, 139077, 139083, 139085, 139090, 139094, + 139098, 139100, 139106, 139110, 139112, 139116, 139120, 139122, 139126, + 139131, 139135, 139141, 139147, 139149, 139151, 139157, 139159, 139163, + 139167, 139169, 139173, 139175, 139179, 139183, 139187, 139190, 139193, + 139198, 139203, 139205, 139208, 0, 0, 0, 0, 0, 0, 0, 0, 139210, 139212, + 139214, 139216, 139220, 139222, 139224, 139226, 139228, 139230, 139232, + 139234, 139236, 139238, 139240, 139242, 139244, 139246, 139248, 139250, + 139252, 139254, 139256, 139258, 139260, 139262, 139264, 139268, 139270, + 139272, 139274, 139278, 139280, 139284, 139286, 139288, 139292, 139296, + 139302, 139304, 139306, 139308, 139310, 139314, 139318, 139320, 139324, + 139328, 139332, 139336, 139340, 139344, 139348, 139352, 139356, 139360, + 139364, 139368, 139372, 139376, 139380, 139384, 139388, 139392, 139394, + 139396, 139398, 139400, 139402, 139404, 139406, 139414, 139422, 139430, + 139438, 139443, 139448, 139453, 139457, 139461, 139466, 139471, 139473, + 139477, 139479, 139481, 139483, 139485, 139487, 139489, 139491, 139495, + 139497, 139499, 139501, 139505, 139509, 139513, 139517, 139521, 139523, + 139529, 139535, 139537, 139539, 139541, 139543, 139545, 139554, 139561, + 139568, 139572, 139579, 139584, 139591, 139600, 139605, 139609, 139613, + 139615, 139619, 139621, 139625, 139629, 139631, 139635, 139639, 139643, + 139645, 139647, 139653, 139655, 139657, 139659, 139663, 139667, 139669, + 139673, 139675, 139677, 139680, 139684, 139686, 139690, 139692, 139694, + 139699, 139701, 139705, 139709, 139712, 139716, 139720, 139724, 139728, + 139732, 139736, 139740, 139745, 139749, 139753, 139762, 139767, 139770, + 139772, 139775, 139778, 139783, 139785, 139788, 139793, 139797, 139800, + 139804, 139808, 139811, 139816, 139820, 139824, 139828, 139832, 139838, + 139844, 139850, 139856, 139861, 139871, 139873, 139877, 139879, 139881, + 139885, 139889, 139891, 139895, 139901, 139906, 139912, 139914, 139918, + 139921, 139927, 139933, 139937, 139939, 139941, 139945, 139947, 139951, + 139955, 139959, 139961, 139963, 139970, 139974, 139978, 139982, 139986, + 139990, 139992, 139996, 139998, 140000, 140004, 140006, 140010, 140014, + 140020, 140024, 140028, 140032, 140034, 140037, 140041, 140047, 140056, + 140065, 140074, 140083, 140085, 140089, 140091, 140095, 140106, 140110, + 140116, 140122, 140127, 140129, 140134, 140138, 140140, 140142, 140144, + 140148, 0, 140152, 140157, 140168, 140184, 140195, 140206, 140210, + 140214, 140220, 140222, 140230, 140238, 140240, 140244, 140250, 140256, + 140263, 140270, 140272, 140274, 140278, 140280, 140286, 140288, 140291, + 140295, 140301, 140307, 140318, 140324, 140330, 140338, 140342, 140350, + 140358, 140364, 140370, 140377, 140379, 140383, 140385, 140387, 140392, + 140394, 140396, 140398, 140400, 140404, 140415, 140421, 140425, 140429, + 140433, 140439, 140445, 140451, 140457, 140462, 140467, 140473, 140479, + 140486, 140493, 140501, 140509, 140514, 140522, 140526, 140535, 140544, + 140550, 140554, 140558, 140562, 140565, 0, 0, 0, 0, 0, 140570, 140577, + 140584, 140591, 140599, 140607, 140615, 140623, 140631, 140639, 140647, + 140655, 140663, 140669, 140675, 140681, 140687, 140693, 140699, 140705, + 140711, 140717, 140723, 140729, 140735, 140738, 140747, 140756, 140758, + 140765, 140769, 140771, 140773, 140777, 140783, 140787, 140789, 140799, + 140805, 140809, 140811, 140815, 0, 140817, 140824, 140831, 140838, + 140843, 140848, 140857, 140863, 140868, 140872, 140877, 140881, 140888, + 140892, 140895, 140900, 140907, 140914, 140919, 140924, 140929, 140935, + 140944, 140955, 140961, 140967, 140973, 140984, 141000, 141009, 141017, + 141025, 141033, 141041, 141049, 141057, 141065, 141073, 141081, 141089, + 141097, 0, 141105, 141109, 141114, 141119, 141121, 141125, 141134, + 141143, 141151, 141155, 141159, 141164, 141169, 141174, 141176, 141181, + 141185, 141187, 141191, 141195, 141201, 141206, 141214, 141219, 141224, + 141229, 141236, 141239, 141241, 141245, 141250, 141255, 141259, 141263, + 141269, 141275, 141277, 141281, 141285, 141289, 141293, 141297, 141299, + 141301, 141303, 141305, 141311, 141317, 141321, 141323, 141325, 141327, + 141336, 141340, 141347, 141354, 141356, 141359, 141363, 141369, 141373, + 141377, 141379, 141387, 141391, 141395, 141400, 141405, 141410, 141415, + 141420, 141425, 141430, 141435, 141440, 141445, 141449, 141455, 141459, + 141465, 141470, 141477, 141483, 141491, 141495, 141502, 141506, 141510, + 141514, 141519, 141524, 141526, 141530, 141539, 141547, 141556, 141570, + 141584, 141598, 141605, 141612, 141616, 141625, 141633, 141637, 141646, + 141653, 141657, 141661, 141665, 141669, 141676, 141680, 141684, 141688, + 141692, 141699, 141708, 141717, 141724, 141736, 141748, 141752, 141756, + 141760, 141764, 141768, 141772, 141780, 141788, 141797, 141801, 141805, + 141809, 141813, 141817, 141821, 141827, 141834, 141838, 141850, 141858, + 141862, 141866, 141870, 141874, 141880, 141887, 141898, 141908, 141919, + 141930, 141939, 141950, 141956, 141962, 141968, 141974, 0, 0, 141980, + 141989, 141996, 142002, 142006, 142010, 142014, 142023, 142035, 142039, + 142046, 142053, 142060, 142067, 142074, 142081, 142089, 142097, 142105, + 142113, 142122, 142131, 142140, 142149, 142159, 142169, 142179, 142189, + 142196, 142203, 142210, 142217, 142225, 142233, 142241, 142249, 142256, + 142268, 142275, 142287, 142290, 142293, 142296, 142299, 142305, 142312, + 142319, 142327, 142332, 142338, 142349, 142359, 142370, 142375, 142380, + 142386, 142391, 142398, 142402, 142408, 142410, 142412, 142416, 142420, + 142424, 142433, 142435, 142437, 142440, 142442, 142444, 142448, 142450, + 142454, 142456, 142460, 142462, 142464, 142468, 142472, 142478, 142480, + 142484, 142486, 142490, 142494, 142498, 142502, 142504, 142506, 142510, + 142514, 142518, 142522, 142524, 142526, 142528, 142533, 142538, 142541, + 142549, 142557, 142559, 142564, 142567, 142572, 142583, 142590, 142595, + 142600, 142602, 142606, 142608, 142612, 142614, 142618, 142622, 142625, + 142628, 142630, 142633, 142635, 142639, 142641, 142643, 142645, 142649, + 142651, 142655, 142658, 142665, 142668, 142673, 142676, 142679, 142684, + 142688, 142692, 142696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 142698, 142703, 142705, 142709, 142711, 142715, 142719, 142725, 142729, + 142734, 142737, 142741, 142745, 0, 0, 0, 142749, 142751, 142757, 142761, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142765, 142770, 142775, 142780, + 142785, 142790, 142795, 142802, 142809, 142816, 142823, 142828, 142833, + 142838, 142843, 142850, 142856, 142863, 142870, 142877, 142882, 142887, + 142892, 142897, 142902, 142909, 142916, 142921, 142926, 142933, 142940, + 142948, 142956, 142963, 142970, 142978, 142986, 142994, 143001, 143011, + 143022, 143027, 143034, 143041, 143048, 143056, 143064, 143075, 143083, + 143091, 143099, 143104, 143109, 143114, 143119, 143124, 143129, 143134, + 143139, 143144, 143149, 143154, 143159, 143166, 143171, 143176, 143183, + 143188, 143193, 143198, 143203, 143208, 143213, 143218, 143223, 143228, + 143233, 143238, 143243, 143250, 143258, 143263, 143268, 143275, 143280, + 143285, 143290, 143297, 143302, 143309, 143314, 143321, 143326, 143335, + 143344, 143349, 143354, 143359, 143364, 143369, 143374, 143379, 143384, + 143389, 143394, 143399, 143404, 143409, 143417, 143425, 143430, 143435, + 143440, 143445, 143450, 143456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 143462, 143470, 143478, 143486, 143494, 143500, 143506, 143510, 143514, + 143520, 143526, 143535, 143539, 143544, 143550, 143554, 143559, 143563, + 143567, 143573, 143579, 143589, 143598, 143601, 143606, 143612, 143618, + 143629, 143639, 143643, 143648, 143654, 143660, 143669, 143674, 143678, + 143683, 143687, 143693, 143699, 143705, 143709, 143712, 143716, 143719, + 143722, 143727, 143732, 143739, 143747, 143754, 143761, 143770, 143779, + 143786, 143794, 143801, 143808, 143817, 143826, 143833, 143841, 143848, + 143855, 143864, 143871, 143879, 143885, 143894, 143902, 143911, 143918, + 143928, 143939, 143947, 143955, 143964, 143972, 143980, 143989, 143997, + 144007, 144016, 144024, 144032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 144041, 144049, 144057, 144065, 144073, 144082, 144091, + 144100, 144109, 144118, 144127, 144136, 0, 0, 0, 0, 144145, 144153, + 144161, 144169, 144177, 144184, 144191, 144198, 144205, 144213, 144221, + 144229, 144237, 144247, 144257, 144267, 144277, 144286, 144295, 144304, + 144313, 144322, 144331, 144340, 144349, 144357, 144365, 144373, 144381, + 144389, 144397, 144405, 144413, 144423, 144433, 144443, 144453, 144457, + 144461, 144465, 144469, 144472, 144475, 144478, 144481, 144485, 144489, + 144493, 144497, 144502, 144507, 144512, 144517, 144520, 144523, 144526, + 0, 0, 0, 0, 0, 0, 0, 0, 144529, 144532, 144535, 144538, 144541, 144546, + 144551, 144556, 144561, 144565, 0, 0, 0, 0, 0, 0, 144569, 144575, 144581, + 144587, 144593, 144601, 144609, 144617, 144625, 144630, 144635, 144640, + 144645, 144652, 144659, 144666, 144673, 144680, 144687, 144694, 144701, + 144710, 144719, 144728, 144737, 144743, 144749, 144755, 144761, 144769, + 144777, 144785, 144793, 144801, 144809, 144817, 144825, 144835, 144845, + 144855, 0, 0, 0, 0, 0, 0, 0, 0, 144865, 144870, 144875, 144880, 144885, + 144894, 144903, 144912, 144921, 144928, 144935, 144942, 144949, 144956, + 144965, 144974, 144983, 144988, 144995, 145002, 145009, 145014, 145019, + 145024, 145029, 145036, 145043, 145050, 145057, 145064, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 145073, 145077, 145081, 145085, 145089, 145093, 145097, + 145101, 145105, 145109, 145113, 145117, 145121, 145125, 145129, 145133, + 145137, 145141, 145145, 145149, 145153, 145157, 145161, 145165, 145169, + 145173, 145177, 145181, 145185, 145189, 145193, 145197, 145201, 145205, + 145209, 145213, 145217, 145221, 145225, 145229, 145233, 145237, 145241, + 145245, 145249, 145253, 145257, 145261, 145265, 145269, 145273, 145277, + 145281, 145285, 145289, 145293, 145297, 145301, 145305, 145309, 145313, + 145317, 145321, 145325, 145329, 145333, 145337, 145341, 145345, 145349, + 145353, 145357, 145361, 145365, 145369, 145373, 145377, 145381, 145385, + 145389, 145393, 145397, 145401, 145405, 145409, 145413, 145417, 145421, + 145425, 145429, 145433, 145437, 145441, 145445, 145449, 145453, 145457, + 145461, 145465, 145469, 145473, 145477, 145481, 145485, 145489, 145493, + 145497, 145501, 145505, 145509, 145513, 145517, 145521, 145525, 145529, + 145533, 145537, 145541, 145545, 145549, 145553, 145557, 145561, 145565, + 145569, 145573, 145577, 145581, 145585, 145589, 145593, 145597, 145601, + 145605, 145609, 145613, 145617, 145621, 145625, 145629, 145633, 145637, + 145641, 145645, 145649, 145653, 145657, 145661, 145665, 145669, 145673, + 145677, 145681, 145685, 145689, 145693, 145697, 145701, 145705, 145709, + 145713, 145717, 145721, 145725, 145729, 145733, 145737, 145741, 145745, + 145749, 145753, 145757, 145761, 145765, 145769, 145773, 145777, 145781, + 145785, 145789, 145793, 145797, 145801, 145805, 145809, 145813, 145817, + 145821, 145825, 145829, 145833, 145837, 145841, 145845, 145849, 145853, + 145857, 145861, 145865, 145869, 145873, 145877, 145881, 145885, 145889, + 145893, 145897, 145901, 145905, 145909, 145913, 145917, 145921, 145925, + 145929, 145933, 145937, 145941, 145945, 145949, 145953, 145957, 145961, + 145965, 145969, 145973, 145977, 145981, 145985, 145989, 145993, 145997, + 146001, 146005, 146009, 146013, 146017, 146021, 146025, 146029, 146033, + 146037, 146041, 146045, 146049, 146053, 146057, 146061, 146065, 146069, + 146073, 146077, 146081, 146085, 146089, 146093, 146097, 146101, 146105, + 146109, 146113, 146117, 146121, 146125, 146129, 146133, 146137, 146141, + 146145, 146149, 146153, 146157, 146161, 146165, 146169, 146173, 146177, + 146181, 146185, 146189, 146193, 146197, 146201, 146205, 146209, 146213, + 146217, 146221, 146225, 146229, 146233, 146237, 146241, 146245, 146249, + 146253, 146257, 146261, 146265, 146269, 146273, 146277, 146281, 146285, + 146289, 146293, 146297, 146301, 146305, 146309, 146313, 146317, 146321, + 146325, 146329, 146333, 146337, 146341, 146345, 146349, 146353, 146357, + 146361, 146365, 146369, 146373, 146377, 146381, 146385, 146389, 146393, + 146397, 146401, 146405, 146409, 146413, 146417, 146421, 146425, 146429, + 146433, 146437, 146441, 146445, 146449, 146453, 146457, 146461, 146465, + 146469, 146473, 146477, 146481, 146485, 146489, 146493, 146497, 146501, + 146505, 146509, 146513, 146517, 146521, 146525, 146529, 146533, 146537, + 146541, 146545, 146549, 146553, 146557, 146561, 146565, 146569, 146573, + 146577, 146581, 146585, 146589, 146593, 146597, 146601, 146605, 146609, + 146613, 146617, 146621, 146625, 146629, 146633, 146637, 146641, 146645, + 146649, 146653, 146657, 146661, 146665, 146669, 146673, 146677, 146681, + 146685, 146689, 146693, 146697, 146701, 146705, 146709, 146713, 146717, + 146721, 146725, 146729, 146733, 146737, 146741, 146745, 146749, 146753, + 146757, 146761, 146765, 146769, 146773, 146777, 146781, 146785, 146789, + 146793, 146797, 146801, 146805, 146809, 146813, 146817, 146821, 146825, + 146829, 146833, 146837, 146841, 146845, 146849, 146853, 146857, 146861, + 146865, 146869, 146873, 146877, 146881, 146885, 146889, 146893, 146897, + 146901, 146905, 146909, 146913, 146917, 146921, 146925, 146929, 146933, + 146937, 146941, 146945, 146949, 146953, 146957, 146961, 146965, 146969, + 146973, 146977, 146981, 146985, 146989, 146993, 146997, 147001, 147005, + 147009, 147013, 147017, 147021, 147025, 147029, 147033, 147037, 147041, + 147045, 147049, 147053, 147057, 147061, 147065, 147069, 147073, 147077, + 147081, 147085, 147089, 147093, 147097, 147101, 147105, 147109, 147113, + 147117, 147121, 147125, 147129, 147133, 147137, 147141, 147145, 147149, + 147153, 147157, 147161, 147165, 147169, 147173, 147177, 147181, 147185, + 147189, 147193, 147197, 147201, 147205, 147209, 147213, 147217, 147221, + 147225, 147229, 147233, 147237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 147241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147245, 147248, 147252, 147256, 147259, 147263, 147267, + 147270, 147273, 147277, 147281, 147284, 147287, 147290, 147293, 147298, + 147301, 147305, 147308, 147311, 147314, 147317, 147320, 147323, 147326, + 147329, 147332, 147335, 147338, 147342, 147346, 147350, 147354, 147359, + 147364, 147370, 147376, 147382, 147387, 147393, 147399, 147405, 147410, + 147416, 147422, 147427, 147433, 147439, 147444, 147450, 147456, 147461, + 147466, 147472, 147477, 147483, 147489, 147495, 147501, 147507, 147511, + 147516, 147520, 147525, 147529, 147534, 147539, 147545, 147551, 147557, + 147562, 147568, 147574, 147580, 147585, 147591, 147597, 147602, 147608, + 147614, 147619, 147625, 147631, 147636, 147641, 147647, 147652, 147658, + 147664, 147670, 147676, 147682, 147687, 147691, 147696, 147699, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 147703, 147706, 147709, 147712, 147715, 147718, 147721, + 147724, 147727, 147730, 147733, 147736, 147739, 147742, 147745, 147748, + 147751, 147754, 147757, 147760, 147763, 147766, 147769, 147772, 147775, + 147778, 147781, 147784, 147787, 147790, 147793, 147796, 147799, 147802, + 147805, 147808, 147811, 147814, 147817, 147820, 147823, 147826, 147829, + 147832, 147835, 147838, 147841, 147844, 147847, 147850, 147853, 147856, + 147859, 147862, 147865, 147868, 147871, 147874, 147877, 147880, 147883, + 147886, 147889, 147892, 147895, 147898, 147901, 147904, 147907, 147910, + 147913, 147916, 147919, 147922, 147925, 147928, 147931, 147934, 147937, + 147940, 147943, 147946, 147949, 147952, 147955, 147958, 147961, 147964, + 147967, 147970, 147973, 147976, 147979, 147982, 147985, 147988, 147991, + 147994, 147997, 148000, 148003, 148006, 148009, 148012, 148015, 148018, + 148021, 148024, 148027, 148030, 148033, 148036, 148039, 148042, 148045, + 148048, 148051, 148054, 148057, 148060, 148063, 148066, 148069, 148072, + 148075, 148078, 148081, 148084, 148087, 148090, 148093, 148096, 148099, + 148102, 148105, 148108, 148111, 148114, 148117, 148120, 148123, 148126, + 148129, 148132, 148135, 148138, 148141, 148144, 148147, 148150, 148153, + 148156, 148159, 148162, 148165, 148168, 148171, 148174, 148177, 148180, + 148183, 148186, 148189, 148192, 148195, 148198, 148201, 148204, 148207, + 148210, 148213, 148216, 148219, 148222, 148225, 148228, 148231, 148234, + 148237, 148240, 148243, 148246, 148249, 148252, 148255, 148258, 148261, + 148264, 148267, 148270, 148273, 148276, 148279, 148282, 148285, 148288, + 148291, 148294, 148297, 148300, 148303, 148306, 148309, 148312, 148315, + 148318, 148321, 148324, 148327, 148330, 148333, 148336, 148339, 148342, + 148345, 148348, 148351, 148354, 148357, 148360, 148363, 148366, 148369, + 148372, 148375, 148378, 148381, 148384, 148387, 148390, 148393, 148396, + 148399, 148402, 148405, 148408, 148411, 148414, 148417, 148420, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148423, 148425, 148427, 148432, + 148434, 148439, 148441, 148446, 148448, 148453, 148455, 148457, 148459, + 148461, 148463, 148465, 148467, 148469, 148471, 148474, 148477, 148479, + 148481, 148485, 148488, 148493, 148495, 148497, 148499, 148503, 148506, + 148508, 148512, 148514, 148518, 148520, 148524, 148527, 148529, 148533, + 148537, 148539, 148545, 148547, 148552, 148554, 148559, 148561, 148566, + 148568, 148573, 148575, 148578, 148580, 148584, 148586, 148593, 148595, + 148597, 148599, 148604, 148606, 148608, 148610, 148612, 148614, 148619, + 148623, 148625, 148630, 148634, 148636, 148641, 148645, 148647, 148652, + 148656, 148658, 148660, 148662, 148664, 148668, 148670, 148675, 148677, + 148683, 148685, 148691, 148693, 148695, 148697, 148701, 148703, 148710, + 148712, 148719, 148721, 148726, 148731, 148733, 148739, 148745, 148747, + 148753, 148758, 148760, 148766, 148772, 148774, 148780, 148786, 148788, + 148794, 148798, 148800, 148805, 148807, 148809, 148814, 148816, 148818, + 148824, 148826, 148831, 148835, 148837, 148842, 148846, 148848, 148854, + 148856, 148860, 148862, 148866, 148868, 148875, 148882, 148884, 148891, + 148898, 148900, 148905, 148907, 148914, 148916, 148921, 148923, 148929, + 148931, 148935, 148937, 148943, 148945, 148949, 148951, 148957, 148959, + 148961, 148963, 148968, 148973, 148975, 148977, 148987, 148991, 148998, + 149005, 149010, 149015, 149027, 149029, 149031, 149033, 149035, 149037, + 149039, 149041, 149043, 149045, 149047, 149049, 149051, 149053, 149055, + 149057, 149059, 149061, 149063, 149065, 149067, 149069, 149075, 149082, + 149087, 149092, 149103, 149105, 149107, 149109, 149111, 149113, 149115, + 149117, 149119, 149121, 149123, 149125, 149127, 149129, 149131, 149133, + 149135, 149140, 149142, 149144, 149150, 149162, 149173, 149175, 149177, + 149179, 149181, 149183, 149185, 149187, 149189, 149191, 149193, 149195, + 149197, 149199, 149201, 149203, 149205, 149207, 149209, 149211, 149213, + 149215, 149217, 149219, 149221, 149223, 149225, 149227, 149229, 149231, + 149233, 149235, 149237, 149239, 149241, 149243, 149245, 149247, 149249, + 149251, 149253, 149255, 149257, 149259, 149261, 149263, 149265, 149267, + 149269, 149271, 149273, 149275, 149277, 149279, 149281, 149283, 149285, + 149287, 149289, 149291, 149293, 149295, 149297, 149299, 149301, 149303, + 149305, 149307, 149309, 149311, 149313, 149315, 149317, 149319, 149321, + 149323, 149325, 149327, 149329, 149331, 149333, 149335, 149337, 149339, + 149341, 149343, 149345, 149347, 149349, 149351, 149353, 149355, 149357, + 149359, 149361, 149363, 149365, 149367, 149369, 149371, 149373, 149375, + 149377, 149379, 149381, 149383, 149385, 149387, 149389, 149391, 149393, + 149395, 149397, 149399, 149401, 149403, 149405, 149407, 149409, 149411, + 149413, 149415, 149417, 149419, 149421, 149423, 149425, 149427, 149429, + 149431, 149433, 149435, 149437, 149439, 149441, 149443, 149445, 149447, + 149449, 149451, 149453, 149455, 149457, 149459, 149461, 149463, 149465, + 149467, 149469, 149471, 149473, 149475, 149477, 149479, 149481, 149483, + 149485, 149487, 149489, 149491, 149493, 149495, 149497, 149499, 149501, + 149503, 149505, 149507, 149509, 149511, 149513, 149515, 149517, 149519, + 149521, 149523, 149525, 149527, 149529, 149531, 149533, 149535, 149537, + 149539, 149541, 149543, 149545, 149547, 149549, 149551, 149553, 149555, + 149557, 149559, 149561, 149563, 149565, 149567, 149569, 149571, 149573, + 149575, 149577, 149579, 149581, 149583, 149585, 149587, 149589, 149591, + 149593, 149595, 149597, 149599, 149601, 149603, 149605, 149607, 149609, + 149611, 149613, 149615, 149617, 149619, 149621, 149623, 149625, 149627, + 149629, 149631, 149633, 149635, 149637, 149639, 149641, 149643, 149645, + 149647, 149649, 149651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 149653, 149663, 149673, + 149682, 149691, 149704, 149717, 149729, 149741, 149751, 149761, 149771, + 149781, 149792, 149803, 149813, 149822, 149831, 149840, 149853, 149866, + 149878, 149890, 149900, 149910, 149920, 149930, 149939, 149948, 149958, + 149968, 149977, 149986, 149996, 150006, 150015, 150024, 150034, 150044, + 150055, 150066, 150076, 150089, 150100, 150114, 150122, 150133, 150141, + 150149, 150157, 150165, 150173, 150181, 150190, 150199, 150209, 150219, + 150228, 150237, 150247, 150257, 150265, 150274, 150282, 150291, 150299, + 150307, 150314, 150324, 150333, 150344, 150355, 150367, 150378, 150388, + 150399, 150409, 150420, 150428, 150432, 150436, 150440, 150444, 150448, + 150452, 150456, 150460, 150464, 150468, 150472, 150476, 150479, 150482, + 150486, 150490, 150494, 150498, 150502, 150506, 150510, 150514, 150517, + 150521, 150525, 150529, 150533, 150537, 150541, 150545, 150549, 150553, + 150557, 150561, 150565, 150569, 150573, 150577, 150581, 150585, 150589, + 150593, 150597, 150601, 150605, 150609, 150613, 150617, 150621, 150625, + 150629, 150633, 150637, 150641, 150645, 150649, 150653, 150657, 150661, + 150665, 150669, 150673, 150677, 150681, 150685, 150689, 150693, 150697, + 150701, 150705, 150709, 150713, 150717, 150721, 150725, 150729, 150733, + 150737, 150741, 150745, 150749, 150753, 150757, 150761, 150765, 150769, + 150773, 150777, 150781, 150785, 150789, 150793, 150797, 150801, 150805, + 150809, 150813, 150817, 150821, 150824, 150828, 150832, 150836, 150840, + 150844, 150848, 150852, 150856, 150860, 150864, 150868, 150872, 150876, + 150880, 150884, 150888, 150892, 150896, 150900, 150904, 150908, 150912, + 150916, 150920, 150924, 150928, 150932, 150936, 150940, 150944, 150948, + 150952, 150956, 150960, 150964, 150968, 150972, 150976, 150980, 150984, + 150988, 150992, 150996, 151000, 151004, 151008, 151012, 151016, 151020, + 151024, 151028, 151032, 151036, 151040, 151044, 151048, 151052, 151056, + 151060, 151064, 151068, 151072, 151076, 151080, 151084, 151088, 151092, + 151096, 151100, 151104, 151108, 151112, 151116, 151120, 151124, 151128, + 151132, 151136, 151140, 151144, 151148, 151152, 151156, 151160, 151164, + 151168, 151172, 151176, 151180, 151184, 151188, 151192, 151196, 151200, + 151204, 151208, 151212, 151216, 151220, 151224, 151228, 151232, 151236, + 151240, 151244, 151248, 151252, 151256, 151260, 151264, 151268, 151272, + 151276, 151280, 151284, 151288, 151292, 151296, 151300, 151304, 151308, + 151312, 151316, 151320, 151324, 151328, 151332, 151336, 151340, 151344, + 151348, 151352, 151356, 151360, 151364, 151368, 151372, 151376, 151380, + 151384, 151388, 151392, 151396, 151400, 151404, 151408, 151412, 151416, + 151420, 151424, 151428, 151432, 151436, 151440, 151444, 151448, 151452, + 151456, 151460, 151464, 151468, 151472, 151476, 151480, 151484, 151488, + 151492, 151496, 151500, 151504, 151508, 151512, 151516, 151520, 151524, + 151528, 151532, 151536, 151540, 151544, 151548, 151552, 151556, 151560, + 151564, 151568, 151572, 151576, 151580, 151584, 151588, 151593, 151598, + 151603, 151607, 151613, 151620, 151627, 151634, 151641, 151648, 151655, + 151662, 151669, 151676, 151683, 151690, 151697, 151704, 151710, 151717, + 151724, 151730, 151737, 151744, 151751, 151758, 151765, 151772, 151779, + 151786, 151793, 151800, 151807, 151814, 151821, 151828, 151834, 151841, + 151848, 151857, 151866, 151875, 151884, 151889, 151894, 151900, 151906, + 151912, 151918, 151924, 151930, 151936, 151942, 151948, 151954, 151960, + 151966, 151971, 151977, 151987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 */ static unsigned int code_hash[] = { - 74224, 4851, 0, 78156, 78499, 128685, 7929, 0, 194682, 127766, 78500, - 66480, 0, 42833, 74529, 12064, 0, 596, 983821, 69850, 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, 983783, 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, 94014, - 127764, 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 983860, - 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, + 74224, 4851, 125138, 78156, 78499, 72391, 7929, 66910, 194682, 127766, + 78500, 66480, 64038, 42833, 74529, 12064, 72385, 596, 983821, 69850, + 13192, 8651, 120217, 126542, 120218, 12995, 64865, 1373, 0, 113752, 5816, + 119067, 64810, 4231, 6825, 42897, 4233, 4234, 4232, 917836, 74415, + 120210, 6384, 70351, 78108, 8851, 67698, 128553, 0, 41601, 8874, 72392, + 7748, 0, 0, 127026, 127939, 41603, 9784, 0, 9188, 41600, 0, 120618, + 128343, 1457, 3535, 128635, 6381, 0, 0, 65240, 11951, 0, 3404, 0, 70487, + 72411, 1759, 0, 41076, 68383, 69972, 119205, 66577, 94014, 127764, 65859, + 0, 7404, 0, 0, 69970, 128387, 65908, 9834, 3055, 9852, 983860, 65288, 0, + 11398, 0, 92417, 93016, 128380, 0, 603, 74398, 43548, 0, 71865, 917824, + 3350, 120817, 64318, 917828, 78121, 3390, 74483, 43265, 120599, 917830, + 78573, 0, 1919, 3400, 120651, 119949, 11647, 917540, 66446, 64141, 8562, 2121, 64138, 4043, 8712, 64134, 64133, 11297, 983688, 983152, 11966, - 64128, 128587, 0, 0, 64132, 10867, 64130, 64129, 983844, 43374, 9779, - 2764, 66002, 10167, 9471, 0, 66021, 0, 0, 5457, 5440, 8857, 93981, 65282, - 2843, 5355, 127928, 983965, 0, 5194, 11657, 43984, 128292, 0, 983620, 0, - 0, 127027, 10717, 64570, 5630, 5396, 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, 983949, 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, 983161, - 8705, 64097, 64096, 9571, 528, 128671, 44017, 11429, 71347, 0, 983077, - 917990, 73841, 0, 0, 9056, 64313, 6188, 120019, 6155, 64068, 1823, 64066, - 64065, 64072, 64071, 63, 7233, 92212, 0, 41904, 6639, 64064, 983775, - 128344, 0, 1176, 118959, 127930, 8162, 128667, 983831, 0, 120519, 66376, - 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, 66222, - 69902, 7768, 0, 4199, 64708, 983421, 0, 0, 8708, 9560, 64077, 64076, - 8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 126570, 0, 64615, 41915, - 0, 12075, 70062, 0, 5174, 983217, 0, 127557, 3123, 0, 12685, 127904, - 8408, 64704, 0, 0, 9223, 0, 41616, 67999, 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, 983600, 42871, 0, - 19923, 74335, 0, 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0, - 983466, 65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 69809, 6181, - 65014, 0, 0, 983196, 3639, 119588, 0, 0, 118904, 10073, 120206, 128862, - 127186, 68409, 42844, 7498, 1098, 92565, 120205, 0, 983118, 10207, 8789, - 983225, 0, 0, 983472, 9234, 0, 6182, 983474, 65058, 0, 983478, 983475, 0, - 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 94072, 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, 127878, 0, 128529, - 12113, 4236, 4727, 0, 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0, - 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 983956, 127524, 0, 0, 0, - 0, 195083, 0, 983843, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, - 67854, 8125, 120545, 6743, 119175, 917940, 2369, 0, 983972, 983973, - 119235, 74092, 73936, 7008, 43660, 0, 0, 0, 2367, 127827, 983857, 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, 983040, 12892, 0, 0, 0, 0, 0, 0, 127261, 120707, - 983128, 0, 5074, 5073, 128790, 8983, 118981, 74493, 983561, 5072, 93977, - 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, 983042, 74418, 12819, 0, 5071, 0, 3642, 0, 5070, - 10042, 118835, 3987, 5068, 0, 8909, 78650, 78649, 69917, 10636, 73981, - 11806, 43167, 4531, 1245, 9105, 66463, 4921, 120219, 4926, 65544, 73884, - 194619, 0, 0, 64709, 0, 194620, 78880, 4922, 325, 992, 119568, 4925, 0, - 0, 9526, 4920, 0, 948, 0, 120208, 4930, 0, 92175, 120275, 4933, 120211, - 0, 118985, 4928, 0, 0, 74770, 120194, 126548, 722, 194934, 19908, 12637, - 127485, 119855, 8753, 1509, 0, 5468, 9511, 127474, 127477, 1672, 6205, - 10864, 74586, 127480, 70103, 127466, 78555, 127468, 73863, 126577, - 126503, 41607, 120115, 1679, 120116, 120180, 120113, 127462, 7005, 41609, - 9580, 0, 401, 69949, 43779, 6968, 5761, 342, 8553, 0, 8143, 127115, - 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478, 0, 5076, 0, - 194609, 0, 8295, 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, 983656, 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, 983177, 5030, 0, 0, 0, - 73869, 9622, 0, 69944, 6787, 0, 0, 0, 983583, 10544, 12919, 0, 92218, 0, - 0, 69906, 120789, 0, 947, 119835, 194586, 194585, 10969, 119935, 7613, - 92562, 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, - 43567, 74056, 917910, 11833, 119919, 7216, 65232, 7217, 251, 7218, 7895, - 4395, 43538, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 983836, - 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, 983443, 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, 70073, 2440, 65780, 77913, 8449, 0, - 5008, 983572, 2118, 0, 12121, 8255, 5512, 73875, 2128, 2130, 2131, 2126, - 2133, 1119, 127068, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 127486, - 8714, 983820, 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, 983181, 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, - 983563, 68179, 64442, 0, 92348, 4599, 41402, 6674, 43397, 43294, 1476, - 648, 0, 65819, 3233, 0, 41782, 6951, 94017, 983976, 3530, 9750, 128317, - 0, 6656, 42618, 0, 5046, 8512, 65856, 74261, 8967, 0, 5045, 42026, 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, 67983, 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, - 983178, 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, 0, 0, 120448, - 7623, 118925, 118889, 9235, 12760, 74176, 69662, 66445, 43540, 10062, - 3743, 11514, 11078, 0, 12136, 0, 126597, 120435, 0, 7726, 0, 19922, 267, - 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, 10652, - 41612, 41077, 3402, 9050, 3398, 0, 983348, 0, 3391, 41075, 2476, 0, - 128017, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, - 13013, 0, 6673, 0, 0, 0, 12438, 0, 983342, 0, 983880, 126638, 9053, - 13015, 74523, 0, 704, 66215, 6195, 983828, 6660, 78758, 917760, 917793, - 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 983341, 74547, 126585, - 65448, 78100, 12948, 119001, 195002, 119238, 195004, 78099, 127085, 0, - 128320, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, 0, 42533, 168, - 42845, 4898, 64298, 983141, 0, 4901, 1821, 0, 578, 3653, 0, 791, 9162, - 6977, 0, 78889, 74561, 0, 73731, 8354, 43590, 119303, 983449, 7557, - 119339, 119301, 8234, 7241, 0, 120671, 119167, 194996, 12811, 65925, - 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276, 74599, 78449, - 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 128824, - 8729, 78456, 0, 7845, 917917, 71302, 4408, 4122, 6772, 11039, 8723, - 194990, 71310, 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, 120340, 118873, 1271, 983640, 0, - 66024, 41482, 3864, 74539, 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, - 983160, 41390, 5384, 41882, 67647, 92548, 5759, 983912, 0, 41388, 64446, - 41392, 64288, 41387, 0, 8706, 5552, 983187, 700, 0, 5553, 0, 7088, 5356, - 7499, 68007, 66596, 74066, 0, 10263, 5554, 0, 12344, 10311, 78113, 6665, - 92626, 0, 7618, 8517, 11455, 78440, 64632, 64447, 5555, 78088, 78093, - 78091, 0, 42803, 65033, 9143, 6668, 195067, 67995, 195069, 656, 195071, - 65037, 4577, 64624, 0, 0, 0, 983649, 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, 983701, 3651, 0, - 120730, 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, 126543, 0, 2676, 2277, 0, 73812, 6190, 8599, - 195053, 69918, 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, 78786, 5103, 127861, 64348, 41368, 43974, - 488, 69811, 0, 71339, 10157, 0, 43034, 11438, 64674, 0, 92694, 68431, - 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, 127509, 69720, 6476, - 5104, 983749, 304, 3176, 119010, 0, 932, 120633, 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, 78706, 67636, 0, 12568, 0, 12553, 10814, 43275, 6950, - 9712, 68680, 43970, 983198, 65165, 92725, 0, 66466, 0, 0, 0, 66725, 6191, - 11351, 10437, 11316, 67634, 43763, 0, 41754, 67635, 9370, 2720, 194975, - 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 0, 0, 10834, 0, 0, 65732, - 94095, 917547, 92682, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, - 12077, 0, 64586, 917620, 42396, 55255, 3475, 128035, 2479, 0, 3632, - 120728, 10698, 8376, 3648, 194960, 74844, 67639, 3636, 67894, 3650, 8837, - 65229, 1843, 42283, 43250, 41562, 9100, 74548, 917630, 3640, 127190, - 42321, 7284, 194974, 194973, 194950, 194949, 194952, 194951, 126649, - 194953, 42080, 2529, 0, 0, 0, 42083, 120678, 68398, 194957, 67619, 66367, - 194958, 9634, 92380, 9988, 0, 41068, 0, 4295, 65264, 68006, 0, 92545, 0, - 785, 8236, 128647, 9027, 68160, 67623, 64383, 120265, 925, 127156, 0, - 41985, 41071, 9586, 0, 41984, 9217, 0, 0, 0, 9186, 2067, 4016, 983803, 0, - 381, 12936, 0, 42077, 0, 69880, 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, 42616, - 120670, 2442, 10703, 78789, 67632, 917924, 12771, 12736, 12753, 66708, - 73933, 67626, 42401, 0, 69872, 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, 126578, 0, 0, 66325, 3465, 2405, 9240, 0, 12756, 65259, 0, 983781, - 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, 68005, 10622, 983779, 0, 78654, 6566, 78659, 0, 73780, 119196, 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, - 983377, 7528, 10550, 0, 92706, 0, 10961, 0, 1374, 64878, 119014, 0, - 42389, 41374, 2286, 0, 78492, 41377, 127909, 0, 400, 12597, 120586, 0, 0, - 6661, 983145, 64827, 0, 73817, 390, 0, 71301, 983862, 3473, 7718, 0, 0, - 0, 55285, 0, 0, 0, 11969, 983390, 127841, 6365, 1887, 6763, 983370, 8080, - 7006, 0, 983371, 6757, 64351, 1544, 0, 6766, 64677, 120716, 983372, 6146, - 0, 771, 983373, 0, 12812, 13168, 42272, 12200, 917927, 7904, 0, 953, - 12917, 119560, 12300, 0, 11491, 9724, 10341, 983773, 9524, 7490, 11389, - 7489, 3379, 0, 7487, 0, 471, 7484, 7482, 6753, 7480, 5764, 7478, 7477, - 6501, 7475, 6918, 7473, 7472, 2474, 7470, 7468, 10232, 10615, 10213, - 127288, 92357, 10049, 11834, 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, 7083, 120008, 8066, 7678, 74865, 0, 0, 0, - 0, 7186, 0, 120555, 0, 445, 120566, 128308, 0, 0, 8330, 0, 0, 42797, - 983150, 120215, 0, 3902, 0, 1770, 0, 128866, 1560, 120209, 194972, 4584, - 73843, 0, 11712, 10866, 118928, 1118, 71334, 0, 0, 1081, 7436, 68420, - 7252, 0, 5996, 69921, 4903, 0, 41386, 5162, 119189, 1330, 0, 7139, 0, - 12047, 41384, 0, 0, 1848, 4334, 6324, 41975, 64777, 10674, 12308, 12186, - 0, 0, 983741, 12715, 68002, 983479, 126630, 2018, 66672, 41979, 66685, - 119157, 68000, 92464, 0, 126984, 68001, 9334, 92705, 92315, 70101, 7975, - 0, 77957, 0, 66621, 4884, 66597, 69732, 0, 0, 6313, 65513, 69857, 0, 0, - 0, 2345, 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 983387, 0, 42279, - 194577, 0, 78415, 0, 195008, 983384, 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, - 983694, 2460, 0, 11944, 12376, 127868, 64679, 0, 12380, 10557, 64473, - 5870, 0, 2024, 127180, 0, 0, 539, 0, 127765, 94052, 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, 983579, 0, 69672, 8213, 74017, 7771, 6161, 68018, - 6709, 0, 78885, 983708, 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, - 0, 73791, 0, 0, 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, 8275, - 3893, 983264, 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, 94060, 687, 0, 0, 0, 1840, 0, 68671, - 119809, 4883, 285, 4723, 70099, 92692, 4459, 74577, 42921, 41720, 11089, - 240, 19906, 0, 42323, 0, 9743, 120232, 13134, 126535, 0, 0, 0, 0, 42634, - 983343, 43437, 3081, 11463, 120154, 0, 0, 10445, 0, 0, 66717, 2614, 9125, - 119023, 1729, 0, 120236, 65221, 63883, 43334, 64852, 0, 65194, 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, 983623, 4530, 42409, 7126, 194575, 2721, 120074, - 119096, 19929, 0, 194574, 0, 4242, 4264, 120077, 120530, 66179, 42412, - 65941, 13114, 64522, 10740, 3094, 0, 9754, 119102, 4437, 73948, 127074, - 983238, 55280, 42174, 194925, 42430, 0, 0, 42355, 66026, 4306, 41380, - 68432, 92586, 0, 66667, 127309, 0, 126521, 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, 983832, 983834, 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, 69855, 13000, 1351, - 2935, 8698, 12665, 0, 1930, 0, 78229, 12427, 66514, 69859, 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, 12422, 41832, 439, 43077, 0, 42207, - 74549, 11796, 40970, 41830, 0, 917799, 8308, 917797, 917796, 0, 67864, - 917801, 917800, 12336, 4135, 69805, 341, 2727, 4129, 3539, 0, 63861, 0, - 7913, 0, 63859, 4131, 63868, 0, 63867, 4133, 11371, 210, 4600, 0, 74560, - 4137, 8082, 78506, 119062, 78504, 6704, 4591, 128029, 0, 0, 9680, 0, - 120623, 561, 12159, 195, 78508, 41501, 0, 42031, 5719, 7172, 42687, 8368, - 0, 41499, 0, 0, 42242, 41498, 917794, 42025, 78565, 65805, 42463, 0, - 2924, 0, 120510, 0, 0, 119213, 73941, 0, 42330, 917784, 3969, 0, 0, 7169, - 1992, 9652, 73977, 7246, 42086, 126615, 2219, 0, 0, 128801, 194837, 0, - 327, 0, 9042, 917777, 917776, 65148, 12433, 917781, 127276, 917779, - 12431, 8668, 12434, 983835, 917782, 5999, 0, 7712, 12432, 128243, 43653, - 1726, 1015, 0, 8212, 0, 128014, 42423, 119066, 0, 128108, 66709, 0, 8811, - 927, 0, 0, 12436, 983245, 42021, 0, 0, 1299, 12240, 42350, 65143, 0, - 195016, 0, 78197, 11348, 0, 78037, 9194, 983184, 0, 19914, 12179, 983812, - 2296, 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, 126491, 12414, 8287, 68219, 195017, 68108, 1143, 119169, 119846, - 12415, 6626, 42763, 0, 118884, 9021, 120783, 0, 11724, 0, 0, 127104, - 126619, 0, 0, 8027, 10997, 9171, 12741, 11400, 71305, 194799, 0, 128239, - 0, 128881, 119604, 127523, 120190, 194773, 67608, 128214, 42368, 0, 7715, - 3881, 41487, 12118, 42514, 68651, 0, 983895, 3009, 41476, 41489, 69825, - 3007, 1448, 3018, 194809, 3889, 8521, 5083, 5082, 119859, 120184, 8519, - 983241, 3014, 5081, 65853, 120715, 0, 68014, 69951, 5079, 64802, 42210, - 4597, 65532, 11828, 120185, 12371, 0, 8407, 0, 10805, 8518, 10779, - 120188, 71303, 983933, 12367, 42170, 0, 92557, 629, 1924, 0, 12037, - 74366, 5987, 8462, 8005, 12365, 63933, 69735, 120815, 12369, 10649, - 67981, 5077, 120174, 10880, 63927, 5075, 917881, 0, 65075, 0, 11007, - 983705, 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, 71311, 0, 119185, 42229, 194912, 0, - 5998, 0, 42353, 74825, 0, 12587, 94104, 78571, 0, 71328, 194562, 41576, - 42215, 78570, 119207, 0, 8578, 5995, 7573, 41575, 74789, 74752, 63944, - 63949, 64767, 2670, 4167, 194796, 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, 983553, 0, 4940, 12410, 7683, 1167, 73729, - 4983, 120507, 861, 0, 0, 0, 0, 43757, 43370, 0, 0, 11956, 0, 0, 0, 9616, - 6631, 0, 12816, 43759, 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, - 7616, 195044, 0, 12577, 0, 983884, 853, 42693, 195014, 0, 983647, 5016, - 43535, 63893, 42835, 9491, 917913, 0, 917914, 0, 12712, 7105, 127807, - 65060, 120797, 9900, 7750, 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, 69929, - 12589, 41479, 128313, 0, 43339, 73776, 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, 983190, 0, 12649, 0, 0, 8247, 507, 91, 2042, 120775, 43643, - 194689, 66028, 10036, 41844, 119813, 774, 119829, 0, 119815, 5994, 12539, - 0, 78375, 120597, 119833, 983105, 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, - 983661, 0, 43119, 0, 120753, 12403, 2500, 195013, 0, 4899, 12729, 0, 0, - 74113, 2343, 4103, 19946, 74112, 77851, 13112, 0, 195012, 12859, 70087, - 120148, 66369, 5861, 127758, 11999, 12400, 0, 983839, 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, 120234, 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, 983136, 42392, 1305, 12408, 0, 44007, 0, 0, 41464, 12411, - 12969, 120824, 41465, 983565, 8528, 1575, 0, 63955, 165, 3024, 41467, - 119163, 0, 9093, 0, 9147, 128787, 63958, 0, 9148, 9692, 4096, 53, 8296, - 6750, 195018, 0, 9594, 0, 0, 43527, 0, 727, 194703, 195023, 5805, 0, - 6726, 0, 42176, 12370, 11655, 119095, 10591, 2280, 0, 12372, 120642, - 120307, 0, 92343, 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, - 194701, 10803, 4132, 120306, 68474, 92473, 0, 983313, 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, 70081, 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, 126518, 7101, 6967, 0, 194898, 9796, 0, 333, - 69891, 0, 8144, 2117, 0, 983595, 12406, 0, 19931, 119089, 6678, 7769, 0, - 12621, 0, 127366, 10227, 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, - 42202, 12754, 195022, 0, 0, 94097, 67594, 2048, 12944, 4050, 67595, - 917967, 43102, 10581, 12985, 4533, 195021, 74003, 6490, 0, 12038, 0, 0, - 120704, 65461, 9798, 69704, 0, 1948, 69841, 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, 42615, 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, 983747, 63841, 9613, 9001, 4526, 11274, 67601, 64520, - 64210, 6664, 78704, 42056, 10228, 64957, 11281, 0, 3807, 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, 71332, 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, - 5260, 43143, 94038, 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, 126490, 194885, 43144, 4123, - 8494, 43146, 9977, 0, 0, 65759, 10765, 64061, 4465, 9808, 64056, 65582, - 4126, 0, 9521, 9589, 64755, 0, 64020, 126604, 10464, 0, 0, 194869, 64514, - 11528, 64024, 128072, 679, 64013, 0, 5850, 758, 7536, 0, 92234, 41441, - 10693, 64006, 983567, 64005, 4058, 119019, 126487, 64660, 0, 119050, 0, - 983069, 1139, 43298, 64027, 64029, 8970, 0, 9934, 983094, 10774, 128020, - 42201, 12421, 128216, 0, 1852, 3057, 64046, 73744, 64034, 64039, 0, 0, 0, - 194899, 92322, 7645, 12854, 74338, 3496, 0, 0, 0, 9102, 627, 127795, - 6158, 8327, 74553, 66632, 12419, 13309, 11570, 127811, 19960, 11696, 0, - 1018, 118970, 194909, 194897, 1682, 194896, 194911, 42756, 6765, 194906, - 0, 0, 73814, 11412, 6768, 10728, 194830, 71316, 118863, 43311, 64966, - 11577, 0, 43040, 1833, 11576, 0, 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, 126651, 42864, - 126498, 64667, 41868, 1184, 0, 815, 11484, 127535, 67840, 983651, 0, - 66197, 0, 10986, 64683, 983785, 0, 3455, 0, 0, 9879, 0, 0, 4158, 128050, + 64128, 66286, 93042, 128830, 64132, 10867, 64130, 64129, 983844, 43374, + 9779, 2764, 66002, 10167, 9471, 0, 66021, 74509, 0, 5457, 5440, 8857, + 93981, 65282, 2843, 5355, 127928, 983965, 69971, 5194, 11657, 43984, + 128292, 113724, 128872, 0, 0, 72393, 10717, 64570, 5630, 5396, 64143, + 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631, 64146, 64145, + 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353, 6960, 0, 128779, + 5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109, 64108, 8090, + 70455, 72388, 74606, 587, 0, 128131, 0, 0, 0, 78214, 2750, 74218, 556, + 64158, 64157, 78707, 12213, 194678, 2760, 0, 0, 78708, 194794, 64156, + 64155, 42496, 0, 64151, 64150, 12679, 10053, 10421, 11093, 64153, 64152, + 125016, 0, 4839, 68527, 0, 1874, 119016, 120091, 6577, 64125, 64124, + 64123, 0, 127531, 92534, 7007, 7590, 65443, 9036, 78847, 64122, 66389, + 66609, 0, 64117, 64116, 6287, 64114, 2725, 64120, 64119, 43981, 42128, + 127842, 1177, 65601, 12322, 64106, 69640, 92895, 64102, 7859, 1945, + 64099, 0, 10453, 64104, 7188, 7997, 0, 7389, 983161, 8705, 64097, 64096, + 9571, 528, 128671, 44017, 11429, 71347, 0, 983077, 917990, 73841, 0, 0, + 9056, 64313, 6188, 120019, 6155, 64068, 1823, 64066, 64065, 64072, 64071, + 63, 7233, 92212, 72414, 41904, 6639, 64064, 983775, 128344, 0, 1176, + 118959, 127930, 8162, 127019, 983831, 92747, 120519, 66376, 66242, 11415, + 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, 66222, 69902, 7768, + 72403, 4199, 64708, 65064, 70117, 0, 8708, 9560, 64077, 64076, 8996, + 4992, 4471, 42622, 64079, 64078, 92179, 71878, 126570, 129120, 64615, + 41915, 0, 12075, 42041, 194825, 5174, 983217, 0, 127557, 3123, 0, 12685, + 119216, 8408, 64704, 0, 0, 9223, 0, 41616, 67999, 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, 67249, 66398, 11434, 64083, 64082, 11329, 7737, 64087, 64086, + 64085, 64084, 194703, 9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, + 127881, 298, 0, 128114, 0, 42627, 125011, 32, 6187, 119052, 11495, 11459, + 3665, 983600, 42871, 0, 19923, 74335, 0, 127192, 66239, 42264, 64403, + 4412, 7240, 92495, 917900, 983466, 65758, 12750, 4181, 8544, 119849, + 120199, 917897, 120198, 69809, 6181, 65014, 983420, 0, 983196, 3639, + 119588, 118851, 0, 118904, 10073, 120206, 128862, 127186, 68409, 42844, + 7498, 1098, 92565, 120205, 0, 128915, 10207, 8789, 93070, 0, 92973, + 128325, 9234, 0, 6182, 983473, 65058, 0, 983478, 194973, 0, 5471, 9461, + 5573, 118936, 5473, 44, 0, 66244, 94072, 0, 66238, 12844, 66894, 1622, + 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 983495, 43855, 41337, 0, + 41631, 8947, 68390, 69683, 41694, 0, 72396, 7908, 0, 10408, 6579, 0, + 64618, 0, 120147, 2138, 6583, 7761, 70005, 120504, 194828, 0, 5058, + 41010, 9992, 128299, 5057, 917941, 0, 74538, 5054, 118951, 194971, 78606, + 0, 1437, 41617, 658, 3497, 128509, 7486, 5061, 5060, 4235, 127878, 0, + 128529, 12113, 4236, 4727, 128487, 0, 7693, 10749, 120332, 7488, 5773, + 978, 128134, 0, 41619, 10239, 68611, 71864, 66209, 983423, 74135, 9748, + 983956, 127524, 0, 0, 0, 0, 195083, 0, 983843, 983300, 0, 0, 0, 92776, + 9341, 78821, 2379, 11325, 983951, 64668, 67854, 8125, 120545, 6743, + 119175, 917940, 2369, 0, 983972, 127966, 119235, 71868, 73936, 7008, + 43660, 0, 0, 43841, 2367, 127827, 983857, 264, 2375, 8060, 6194, 119858, + 1844, 119084, 129049, 6019, 0, 0, 6961, 0, 70435, 67171, 8800, 0, 42862, + 4463, 65581, 6192, 127900, 42771, 0, 92333, 725, 65042, 93014, 120800, + 983040, 12892, 0, 67149, 0, 0, 0, 0, 127261, 12224, 983128, 129061, 5074, + 5073, 128790, 8983, 118981, 74493, 71231, 5072, 74547, 6198, 11614, 0, + 196, 0, 0, 0, 4929, 120342, 0, 0, 127987, 0, 42847, 119856, 0, 67754, + 4934, 0, 41323, 9758, 0, 92289, 70181, 42584, 0, 4329, 41321, 4979, 3048, + 7752, 41320, 983042, 64667, 12819, 983870, 5071, 127915, 3642, 67334, + 5070, 10042, 113813, 3987, 5068, 0, 8909, 78650, 78649, 69917, 10636, + 73981, 11806, 43167, 4531, 1245, 9105, 66463, 4921, 120219, 4926, 65544, + 73884, 194619, 0, 0, 64709, 0, 194620, 78880, 4922, 325, 992, 119568, + 4925, 127218, 0, 9526, 4920, 128617, 948, 0, 120208, 4930, 983225, 92175, + 120275, 4933, 113779, 0, 118985, 4928, 0, 0, 74770, 120194, 126548, 722, + 194934, 19908, 12637, 127485, 119855, 8753, 1509, 0, 5468, 9511, 43493, + 127477, 1672, 6205, 10864, 74586, 127480, 70103, 92694, 78555, 127468, + 73863, 126577, 68336, 41607, 120115, 1679, 120116, 120180, 92761, 127462, + 7005, 41609, 9580, 70431, 401, 69949, 43779, 6968, 5761, 342, 8553, 0, + 8143, 127115, 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478, + 0, 5076, 0, 194609, 0, 8295, 685, 9025, 1524, 12618, 0, 5539, 129182, + 92523, 120101, 7138, 120552, 43504, 194611, 66914, 65794, 12520, 8058, + 9732, 92480, 5080, 64775, 5036, 5035, 120590, 42604, 983656, 0, 8074, + 275, 13291, 1907, 78838, 4432, 127271, 5033, 127273, 120818, 4836, 3888, + 73792, 10729, 64546, 127262, 43704, 127264, 92957, 67588, 119000, 124983, + 70360, 8858, 6409, 7663, 120252, 128100, 119007, 0, 66321, 94052, 12814, + 127248, 3432, 10218, 0, 6094, 7641, 42445, 128792, 92487, 42406, 1676, + 67362, 74862, 67365, 5030, 67364, 118810, 195008, 73869, 9622, 113763, + 69944, 6787, 67361, 0, 0, 68319, 10544, 12919, 73812, 72397, 0, 0, 69906, + 120789, 983041, 947, 67695, 67367, 194585, 10969, 67228, 7613, 92562, + 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, 43567, + 74056, 917910, 11833, 119919, 7216, 65232, 7217, 251, 7218, 7895, 4395, + 43538, 119926, 119929, 119928, 7213, 68476, 7214, 7215, 5879, 74141, + 8880, 7685, 66459, 120173, 65540, 67359, 625, 8187, 42861, 1113, 7236, + 7915, 3630, 120176, 8179, 70163, 67886, 9316, 10980, 2489, 65624, 8150, + 1359, 67652, 70464, 127330, 73756, 5042, 5041, 42769, 12084, 127324, + 127321, 74410, 127319, 127320, 127317, 127318, 127315, 12283, 1616, 3795, + 67732, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 67724, 3239, 66893, + 0, 0, 8431, 0, 42164, 71229, 11778, 12620, 6826, 73773, 70169, 5040, 0, + 0, 67094, 78420, 0, 5039, 983678, 78418, 0, 5038, 0, 0, 13184, 74293, 0, + 64648, 0, 9359, 78416, 917623, 128770, 65157, 6662, 0, 70182, 3863, + 73909, 4835, 55266, 43432, 127822, 4309, 7127, 194569, 0, 194568, 1301, + 0, 42589, 569, 128804, 73813, 711, 4389, 7133, 120643, 73880, 11610, + 11368, 0, 194570, 41331, 1006, 74240, 67224, 1550, 8201, 70453, 7627, + 5499, 5031, 77908, 42738, 65784, 77907, 65267, 3758, 0, 65781, 64734, + 67222, 2440, 65780, 70787, 8449, 0, 5008, 983572, 2118, 126508, 12121, + 8255, 5512, 73875, 2128, 2130, 2131, 2126, 2133, 1119, 127067, 2114, + 2116, 2455, 113798, 2122, 2123, 2124, 2125, 127486, 8714, 983820, 2113, + 917985, 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, 983181, 12003, 5513, 6666, 5053, 74230, + 5510, 78451, 0, 78447, 2470, 78437, 0, 1925, 71251, 92237, 74807, 0, + 5048, 5047, 0, 0, 74201, 92313, 0, 74497, 92395, 8089, 6929, 639, 983563, + 68179, 64442, 70180, 92348, 4599, 41402, 6674, 43397, 43294, 1476, 648, + 0, 65819, 3233, 0, 41782, 6951, 94017, 983976, 3530, 9750, 128317, + 128122, 6656, 42618, 70175, 5046, 8512, 65856, 74261, 8967, 0, 5045, + 42026, 1916, 7986, 5044, 120556, 9006, 13128, 5043, 0, 7853, 74068, + 74004, 9669, 12341, 12703, 8402, 0, 119070, 70174, 41750, 3586, 64508, + 43148, 0, 127971, 119606, 67983, 13296, 517, 0, 128534, 194946, 41528, + 123, 65454, 0, 194856, 74478, 10531, 7784, 41526, 10829, 73991, 8057, + 1126, 73895, 194857, 194591, 0, 3925, 4251, 8069, 10517, 71112, 489, + 71110, 4250, 120441, 120452, 43151, 983178, 92738, 66200, 0, 0, 125026, + 74298, 128879, 983474, 8711, 6183, 0, 983952, 72402, 120448, 7623, + 118925, 118889, 9235, 12760, 74176, 69662, 66445, 43540, 10062, 3743, + 11514, 11078, 0, 12136, 0, 126597, 120435, 194850, 7726, 195095, 19922, + 267, 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, + 10652, 41612, 41077, 3402, 9050, 3398, 917796, 983348, 0, 3391, 41075, + 2476, 0, 128017, 0, 10625, 129106, 12767, 13017, 78743, 64261, 64934, + 70152, 13014, 13013, 0, 6673, 0, 0, 0, 12438, 0, 983342, 0, 983880, + 126638, 9053, 13015, 74523, 0, 704, 66215, 6195, 983828, 6660, 78758, + 917760, 74861, 42212, 12629, 11435, 0, 55256, 65538, 67343, 127940, + 129086, 43876, 126585, 65448, 78100, 12948, 119001, 195002, 119238, + 195004, 78099, 127085, 0, 128320, 4287, 8276, 4902, 1131, 983606, 78458, + 66728, 1816, 0, 42533, 168, 42845, 4898, 64298, 195012, 78105, 4901, + 1821, 0, 578, 3653, 128946, 791, 9162, 6977, 74196, 78889, 70160, 0, + 73731, 8354, 43590, 119303, 983449, 7557, 119108, 67378, 8234, 7241, + 983448, 113735, 119167, 194996, 12811, 65925, 3946, 78078, 10998, 78080, + 673, 194867, 64397, 128276, 74599, 78449, 8890, 194977, 194976, 2448, + 78085, 10267, 8424, 2452, 78083, 67217, 8729, 78456, 0, 7845, 126564, + 71302, 4408, 4122, 6772, 11039, 8723, 65896, 71310, 119302, 731, 119304, + 71904, 2438, 64855, 119300, 119299, 1175, 0, 42135, 373, 119172, 2119, + 11457, 11521, 7723, 128639, 0, 0, 41952, 93023, 5273, 2127, 5269, 6337, + 5202, 2404, 5267, 42823, 11291, 19915, 5277, 12963, 70320, 6189, 4125, + 1314, 12133, 120340, 118873, 1271, 983640, 0, 66024, 41482, 3864, 9204, + 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 78128, 41390, 5384, 41882, + 67647, 70154, 5759, 983912, 0, 41388, 64446, 41392, 64288, 41387, 67201, + 8706, 5552, 983187, 700, 0, 5553, 0, 7088, 5356, 7499, 68007, 66596, + 74066, 67251, 10263, 5554, 0, 12344, 10311, 78113, 6665, 11115, 0, 7618, + 8517, 11455, 78440, 64632, 64447, 5555, 78088, 78093, 78091, 0, 42803, + 65033, 9143, 6668, 67288, 67995, 195069, 656, 195071, 65037, 4577, 64624, + 0, 0, 71912, 983649, 4269, 73885, 917775, 42846, 69644, 950, 0, 92273, + 66580, 118895, 66683, 10554, 119008, 119121, 6832, 5098, 917768, 194668, + 70403, 5097, 4935, 9848, 10381, 0, 67296, 92896, 3651, 0, 67294, 70848, + 5102, 5101, 10269, 12983, 8138, 4517, 1932, 5100, 1439, 12093, 1247, + 10034, 195064, 5099, 78373, 1441, 42087, 3063, 650, 119953, 7838, 0, + 128655, 195040, 119142, 9031, 70829, 78427, 9078, 8545, 66356, 128799, + 194923, 9154, 9118, 126543, 0, 2676, 2277, 128422, 68237, 6190, 8599, + 125118, 69918, 10795, 9857, 7014, 9856, 195033, 71903, 12129, 0, 8481, 0, + 6202, 67711, 10920, 113726, 5203, 195039, 195038, 5108, 5107, 65818, + 66019, 9762, 11205, 5541, 74772, 0, 12613, 5284, 6657, 207, 128806, 4275, + 74819, 854, 68147, 74381, 66816, 78786, 5103, 127861, 64348, 41368, + 43974, 488, 69811, 0, 71339, 10157, 194737, 43034, 11438, 64674, 0, + 70158, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, 127509, + 69720, 6476, 5104, 983749, 304, 3176, 78871, 70149, 932, 113683, 6567, + 238, 69656, 78432, 194595, 19905, 43850, 195015, 78870, 41044, 67640, + 67302, 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 93039, 8803, + 309, 6622, 8151, 10858, 78706, 67636, 70171, 12568, 0, 12553, 10814, + 43275, 6950, 9712, 68680, 43970, 126535, 65165, 92725, 0, 66466, 124986, + 0, 0, 66725, 6191, 11351, 10437, 11316, 67634, 43763, 0, 41754, 67635, + 9370, 2720, 194600, 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 983047, + 93067, 10834, 983127, 0, 65732, 94095, 917547, 92682, 67679, 129150, + 67309, 7781, 41383, 64568, 67311, 120738, 12077, 74433, 64586, 917620, + 42396, 55255, 3475, 67260, 2479, 67306, 3632, 120728, 10698, 8376, 3648, + 67263, 74844, 67639, 3636, 67894, 3650, 8837, 65229, 1843, 42283, 43250, + 41562, 9100, 74548, 917630, 3640, 127190, 42321, 7284, 92880, 118987, + 194950, 194949, 74115, 194951, 126649, 194953, 42080, 2529, 0, 983784, 0, + 42083, 120678, 68398, 194957, 67619, 66367, 194958, 9634, 92380, 9988, 0, + 41068, 0, 4295, 65264, 68006, 0, 92545, 0, 785, 8236, 128647, 9027, + 68160, 67623, 64383, 120265, 925, 127156, 0, 41985, 41071, 9586, 194908, + 41984, 9217, 128372, 92510, 92218, 9186, 2067, 4016, 983803, 0, 381, + 12936, 0, 42077, 92985, 69880, 5184, 42078, 194607, 10810, 128531, 4585, + 19943, 5860, 67633, 0, 983279, 812, 3615, 72401, 5178, 44000, 120548, + 78807, 5188, 74287, 67629, 3605, 10692, 1166, 64429, 42639, 924, 0, + 67631, 42616, 120670, 2442, 10703, 67317, 67632, 67316, 12771, 12736, + 12753, 66708, 73933, 67626, 42401, 0, 69872, 127373, 42288, 12751, + 983064, 8542, 13145, 194963, 2468, 66706, 41294, 3626, 3883, 64388, + 42479, 71220, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585, 2715, 806, + 65208, 41884, 917883, 1318, 64731, 126578, 0, 0, 66325, 3465, 2405, 9240, + 983858, 12756, 65259, 0, 983781, 12752, 5833, 1432, 66396, 41883, 73912, + 9799, 0, 41886, 2480, 0, 2062, 67326, 6494, 5537, 78656, 0, 194587, + 124969, 1211, 0, 0, 67269, 118832, 12318, 129024, 113796, 68005, 10622, + 983779, 0, 78654, 6566, 71195, 0, 73780, 119196, 64864, 0, 78660, 0, + 8284, 13081, 119206, 3589, 42051, 4035, 6492, 92236, 4265, 6642, 3977, + 74186, 41778, 836, 92947, 2488, 129176, 4582, 0, 0, 41777, 12926, 983377, + 7528, 10550, 113761, 92706, 0, 10961, 93977, 1374, 64878, 119014, 67720, + 42389, 41374, 2286, 917604, 78492, 41377, 127909, 0, 400, 12597, 120586, + 0, 0, 6661, 983145, 64827, 0, 73817, 390, 0, 71301, 983862, 3473, 7718, + 113755, 127011, 0, 55285, 73784, 66394, 0, 11969, 120461, 127841, 6365, + 1887, 6763, 92551, 8080, 7006, 0, 118902, 6757, 64351, 1544, 67156, 6766, + 64677, 120716, 67088, 6146, 74031, 771, 120682, 0, 12812, 13168, 42272, + 12200, 66423, 7904, 0, 953, 12917, 119560, 12300, 67089, 11491, 9724, + 10341, 983773, 9524, 7490, 11389, 7489, 3379, 0, 7487, 194624, 471, 7484, + 7482, 6753, 7480, 5764, 7478, 7477, 6501, 7475, 6918, 7473, 7472, 2474, + 7470, 7468, 10232, 10615, 10213, 127288, 92357, 10049, 11834, 3544, 0, + 6017, 65311, 127481, 120216, 13306, 10533, 7870, 73949, 7625, 194882, + 120544, 0, 127950, 92660, 0, 77889, 0, 19961, 2472, 42665, 92341, 0, + 2139, 4256, 120776, 74380, 43836, 42675, 42658, 12845, 70345, 70508, + 65138, 119355, 67862, 0, 65671, 7083, 120008, 8066, 7678, 74865, 125134, + 120321, 0, 983394, 7186, 0, 120555, 0, 445, 120566, 66849, 983477, 0, + 8330, 0, 0, 42797, 113736, 120215, 93036, 3902, 0, 1770, 67091, 125067, + 1560, 120209, 194972, 4584, 73843, 0, 11712, 10866, 67092, 1118, 71334, + 0, 0, 1081, 7436, 11147, 7252, 70093, 5996, 69921, 4903, 68142, 41386, + 5162, 119189, 1330, 128613, 7139, 0, 12047, 41384, 0, 0, 1848, 4334, + 6324, 41975, 64777, 10674, 12308, 12186, 0, 0, 983741, 12715, 68002, + 983479, 126630, 2018, 66672, 41979, 66685, 119157, 68000, 78490, 0, + 126984, 68001, 9334, 92705, 70800, 70101, 7975, 0, 77957, 0, 43494, 4884, + 66597, 69732, 0, 0, 6313, 65513, 69857, 0, 0, 0, 2345, 43697, 463, 0, 0, + 68178, 3117, 5460, 0, 128717, 983387, 0, 42279, 194577, 0, 78415, 983228, + 68524, 983384, 13248, 125027, 0, 128471, 128415, 983153, 0, 5663, 127942, + 128472, 0, 0, 2482, 1471, 194583, 113747, 42247, 12378, 73925, 69664, 0, + 12374, 0, 195023, 0, 118828, 2460, 71882, 11944, 12376, 127868, 64679, + 92893, 12380, 10557, 64473, 5870, 11122, 2024, 127180, 0, 71879, 539, 0, + 127765, 70120, 3853, 65180, 127923, 120796, 120245, 92324, 0, 8659, 0, + 12474, 67241, 9503, 194969, 2478, 120248, 4162, 0, 4260, 12953, 69633, + 120089, 12470, 92640, 74189, 2742, 12476, 11798, 10946, 127310, 5000, + 113687, 983579, 128777, 69672, 8213, 43824, 7771, 6161, 68018, 6709, + 194967, 78885, 119243, 68235, 120582, 78547, 113709, 10301, 10333, 10397, + 124934, 0, 73791, 0, 0, 0, 0, 119123, 4014, 12842, 73952, 12015, 127290, + 8275, 3893, 983264, 0, 12210, 7221, 42147, 74868, 74550, 71215, 64747, + 118841, 0, 12516, 4444, 0, 92271, 74537, 10892, 8231, 0, 6473, 41968, + 78388, 41973, 3591, 41969, 0, 2453, 128549, 92666, 64705, 71068, 0, + 10349, 10413, 43591, 41962, 3202, 74353, 129175, 8316, 129174, 0, 94060, + 687, 125089, 129074, 0, 1840, 0, 68671, 11121, 4883, 285, 4723, 11175, + 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0, 42323, 74640, + 9743, 120232, 13134, 93065, 128956, 65931, 92579, 128329, 42634, 983343, + 43437, 3081, 11463, 120154, 0, 195013, 10445, 0, 92969, 66717, 2614, + 9125, 119023, 1729, 0, 72420, 65221, 63883, 43334, 64852, 124929, 65194, + 66201, 0, 66578, 5001, 41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, + 5150, 73889, 73764, 4039, 643, 3086, 92961, 42448, 42299, 58, 0, 917952, + 120083, 63873, 8491, 0, 0, 983623, 4530, 42409, 7126, 194575, 2721, + 120073, 119096, 19929, 0, 194574, 92975, 4242, 4264, 120077, 120530, + 66179, 42412, 65941, 13114, 64522, 10740, 3094, 983199, 9754, 119102, + 4437, 73948, 127074, 983238, 55280, 42174, 194925, 42430, 0, 983450, + 42355, 66026, 4306, 41380, 68432, 92586, 68314, 66667, 119351, 0, 126521, + 42200, 42566, 70000, 128928, 5088, 6948, 0, 8524, 125040, 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, 127897, 63896, 12061, 42096, 43621, 3362, + 12377, 119934, 983834, 68449, 7461, 73901, 1244, 331, 73786, 12683, + 10662, 0, 8112, 0, 65852, 74629, 12379, 194877, 92930, 41964, 42208, + 63843, 2084, 41965, 125099, 65866, 4327, 0, 63840, 66413, 41220, 13032, + 92980, 584, 12933, 43177, 12373, 69855, 13000, 1351, 2935, 8698, 12665, + 0, 1930, 0, 78229, 12427, 66514, 69859, 13031, 0, 63901, 0, 3657, 119611, + 65202, 6000, 113786, 12426, 127181, 119935, 41740, 12428, 41283, 41916, + 119210, 128318, 0, 12429, 6727, 0, 7562, 983248, 5170, 983915, 41755, + 676, 0, 66704, 66664, 9978, 66491, 3536, 0, 9752, 92397, 6162, 92928, + 69228, 10113, 41829, 65886, 5159, 12422, 41832, 439, 3072, 983464, 42207, + 74549, 11796, 40970, 41830, 125021, 70151, 8308, 917797, 70807, 119258, + 67864, 113696, 917800, 12336, 4135, 67231, 341, 2727, 4129, 3539, 0, + 63861, 0, 7913, 0, 63859, 4131, 63868, 129085, 63867, 4133, 11371, 210, + 4600, 0, 74560, 4137, 8082, 78506, 119062, 78504, 6704, 4591, 128029, + 125018, 120753, 9680, 12937, 120623, 561, 12159, 195, 68321, 41501, + 983371, 42031, 5719, 7172, 42687, 8368, 128306, 41499, 93068, 71047, + 42242, 41498, 917794, 42025, 78565, 65805, 42463, 67182, 2924, 67183, + 120510, 0, 0, 92766, 73941, 67186, 42330, 67187, 3969, 128484, 0, 7169, + 1992, 9652, 73977, 7246, 42086, 126615, 2219, 127177, 0, 128801, 67180, + 0, 327, 128300, 9042, 917777, 917776, 65148, 12433, 917781, 120222, + 917779, 12431, 8668, 12434, 67194, 917782, 5999, 0, 7712, 12432, 128243, + 43653, 1726, 1015, 0, 8212, 0, 113754, 42423, 119066, 194613, 72398, + 66709, 0, 8811, 927, 128461, 0, 12436, 120087, 42021, 0, 67644, 1299, + 12240, 42350, 65143, 0, 195016, 127972, 78197, 11348, 0, 78037, 9194, + 983184, 0, 19914, 12179, 128740, 2296, 128932, 63836, 63832, 917773, + 10967, 63816, 2594, 3444, 63817, 11178, 0, 41503, 127478, 11265, 68295, + 120756, 194922, 67285, 5664, 3972, 0, 128583, 0, 67284, 12416, 917764, + 119608, 10816, 917769, 11210, 12418, 74111, 3882, 8532, 917771, 1573, + 128018, 119847, 4596, 66339, 12417, 66001, 65343, 126491, 12414, 8287, + 68219, 195017, 68108, 1143, 119169, 119846, 12415, 6626, 42763, 0, + 118884, 9021, 120783, 119931, 11724, 0, 0, 127104, 126619, 0, 0, 8027, + 10997, 9171, 12741, 11400, 71305, 194799, 66833, 128239, 0, 92557, + 119604, 127523, 120190, 1324, 67608, 128214, 42368, 0, 7715, 3881, 41487, + 12118, 42514, 68651, 0, 128594, 3009, 41476, 41489, 69825, 3007, 1448, + 3018, 194809, 3889, 8521, 5083, 5082, 119859, 78255, 8519, 983241, 3014, + 5081, 65853, 120715, 0, 68014, 69951, 5079, 64802, 42210, 4597, 65532, + 11828, 120185, 12371, 11105, 8407, 67163, 10805, 8518, 10779, 120188, + 71303, 983933, 12367, 42170, 0, 67290, 629, 1924, 128435, 12037, 67158, + 5987, 8462, 8005, 12365, 63933, 69735, 120815, 12369, 10649, 67981, 5077, + 120174, 10880, 63927, 5075, 917881, 127300, 65075, 0, 11007, 70851, + 66659, 92607, 917933, 66684, 128063, 3434, 4954, 1904, 92679, 5266, + 126980, 5272, 10499, 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, + 461, 9803, 42282, 4504, 1505, 0, 6325, 5276, 43021, 120488, 0, 55236, + 92659, 66461, 5177, 41324, 12055, 8722, 120805, 41327, 983732, 66695, + 4114, 409, 4383, 8900, 8948, 41325, 0, 721, 10182, 9108, 71311, 0, + 119185, 42229, 194912, 0, 5998, 0, 42353, 74825, 0, 12587, 94104, 78571, + 0, 71328, 128955, 41576, 42215, 78570, 74037, 0, 8578, 5995, 7573, 41575, + 74789, 74752, 63944, 63949, 64767, 2670, 4167, 194796, 11723, 0, 74120, + 0, 65076, 938, 43414, 73854, 11737, 9721, 0, 67179, 67168, 11742, 2419, + 67177, 11493, 12334, 194913, 4153, 12302, 10793, 5250, 12407, 11978, + 4404, 9189, 12401, 42007, 5775, 6759, 65806, 43997, 0, 42002, 12404, + 70388, 129093, 4940, 12410, 7683, 1167, 73729, 4983, 120507, 861, 67699, + 0, 68297, 0, 43757, 43370, 0, 0, 11956, 124967, 0, 70815, 9616, 6631, + 92338, 12816, 43759, 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, + 7616, 195044, 0, 12577, 93017, 983884, 853, 42693, 194647, 119027, + 983647, 5016, 43535, 63893, 42835, 9491, 917913, 0, 917914, 0, 12712, + 7105, 127807, 65060, 66875, 9900, 7750, 917946, 127896, 74619, 127830, + 983587, 64778, 12585, 10565, 128151, 12177, 119843, 983258, 0, 77824, 0, + 4900, 127874, 12878, 92630, 8984, 4119, 74768, 8971, 78593, 43113, 9702, + 66852, 11025, 9245, 13048, 4927, 4138, 74185, 92481, 92710, 12397, 77827, + 119040, 13054, 12394, 0, 0, 194954, 13053, 118974, 3948, 10781, 1546, 0, + 5010, 1680, 10507, 78590, 78583, 92431, 0, 0, 194915, 7267, 0, 74833, + 128181, 5993, 2819, 128788, 12706, 71063, 1893, 7266, 63915, 7264, 7265, + 0, 1363, 0, 42923, 63910, 63996, 3077, 120018, 0, 1512, 69929, 12589, + 41479, 128313, 71048, 43339, 73776, 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, 128398, 92366, + 41996, 11526, 63985, 5864, 1147, 43849, 42887, 1987, 92718, 5480, 7858, + 11653, 4116, 12391, 66193, 129197, 4939, 12384, 0, 0, 41686, 63905, + 119601, 194688, 67398, 128820, 12649, 129056, 0, 8247, 507, 91, 2042, + 120775, 43643, 194689, 66028, 10036, 41844, 119813, 774, 119829, 77840, + 119815, 5994, 12539, 0, 78375, 120597, 119833, 983105, 78377, 0, 917628, + 7719, 6026, 2486, 128312, 119808, 162, 0, 65219, 41073, 9687, 41681, + 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681, 42379, 0, 7534, + 12219, 2226, 70499, 42810, 10492, 127015, 983661, 126704, 43119, 0, + 78537, 12403, 2500, 70145, 0, 4899, 12729, 983397, 0, 74113, 2343, 4103, + 19946, 74112, 77851, 13112, 129046, 74834, 12859, 70087, 120148, 66369, + 5861, 127758, 11999, 12400, 43641, 983839, 12645, 5146, 11320, 68410, + 6748, 65040, 983491, 64184, 12974, 64183, 67613, 120645, 5147, 125019, 0, + 74524, 128356, 1928, 0, 67649, 5991, 3445, 67609, 4976, 64176, 0, 67610, + 8241, 0, 77868, 4206, 0, 78662, 0, 128298, 67277, 10138, 67238, 128785, + 8897, 120234, 1422, 8357, 4124, 77862, 65836, 120641, 127926, 77859, 0, + 194696, 1123, 963, 41553, 10120, 12405, 120150, 92664, 398, 13278, 9723, + 6366, 120311, 7945, 983163, 4402, 9970, 12402, 93062, 42392, 1305, 12408, + 92384, 44007, 128563, 127216, 41464, 12411, 12969, 67268, 41465, 983565, + 8528, 1575, 0, 63955, 165, 3024, 41467, 119163, 70119, 9093, 0, 6833, + 92574, 63958, 0, 9148, 9692, 4096, 53, 8296, 6750, 66855, 0, 9594, + 120308, 129186, 43527, 194622, 727, 74192, 93060, 5805, 0, 6726, 0, + 42176, 12370, 11655, 119095, 10591, 2280, 0, 12372, 120642, 120307, + 71209, 92343, 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, + 194701, 10803, 4132, 120306, 68474, 92473, 0, 120712, 74837, 120155, + 1499, 0, 8055, 42740, 63965, 120305, 63962, 74042, 8924, 43123, 5988, + 3660, 63969, 11781, 42718, 8788, 1357, 64851, 65743, 92894, 8774, 70337, + 127086, 9941, 120172, 92748, 1933, 69655, 9564, 0, 92435, 73866, 0, + 983583, 2487, 67614, 3121, 1804, 3311, 67615, 70081, 78302, 12220, 67616, + 92769, 127475, 0, 68200, 6675, 128144, 0, 67592, 120685, 0, 64771, 1198, + 9132, 0, 64619, 510, 64663, 0, 0, 4561, 2101, 1398, 917972, 92554, 74034, + 41569, 92684, 11406, 8167, 12127, 0, 840, 983281, 69992, 7101, 6967, 0, + 194898, 9796, 0, 333, 69891, 0, 8144, 2117, 0, 983595, 12406, 0, 19931, + 66388, 6678, 7769, 0, 12621, 0, 127366, 10227, 4764, 43101, 9981, 0, + 40986, 4127, 66487, 983576, 42202, 12754, 195022, 0, 0, 94097, 67594, + 2048, 12944, 4050, 67595, 917967, 43102, 10581, 11184, 4533, 195021, + 74003, 6490, 0, 12038, 0, 0, 68225, 65461, 9798, 69704, 0, 1948, 69841, + 0, 952, 128235, 125107, 0, 120802, 6449, 9494, 120313, 0, 43098, 4843, + 8142, 64160, 4098, 64170, 983339, 0, 3436, 119973, 0, 12817, 67597, 6676, + 3930, 42615, 0, 69991, 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, + 127859, 8500, 42222, 120142, 73743, 120400, 4317, 11543, 67676, 64676, 0, + 127833, 67606, 119083, 127892, 42217, 13102, 0, 66003, 6672, 0, 0, 66880, + 983747, 63841, 9613, 9001, 4526, 11274, 67601, 64520, 64210, 6664, 78704, + 42056, 10228, 64957, 11281, 0, 3807, 1469, 66640, 65381, 42197, 4988, + 42372, 0, 9598, 904, 352, 42225, 1451, 8061, 8453, 4134, 127052, 67223, + 66576, 127916, 127831, 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, 70334, 11606, 64784, 11702, 66498, 9821, + 64304, 0, 5152, 11048, 7533, 68366, 64410, 92305, 0, 4323, 120062, 92669, + 71332, 120158, 42587, 42214, 41394, 11188, 4763, 4112, 118935, 0, 5260, + 43143, 94038, 326, 120131, 68423, 194904, 10771, 2876, 74074, 92530, + 128460, 41398, 7382, 9802, 127077, 127076, 453, 41396, 120524, 13159, + 12140, 9572, 0, 7003, 194883, 42334, 7704, 125069, 125020, 43144, 4123, + 8494, 43146, 9977, 0, 126473, 65759, 10765, 64061, 4465, 9808, 64056, + 65582, 4126, 0, 9521, 9589, 64755, 0, 64020, 126604, 10464, 0, 92968, + 194869, 64514, 11528, 64024, 128072, 679, 64013, 983555, 5850, 758, 7536, + 128663, 92234, 41441, 10693, 64006, 983567, 64005, 4058, 119019, 126487, + 64660, 128176, 119050, 0, 983069, 1139, 43298, 64027, 64029, 8970, 0, + 9934, 128685, 10774, 67104, 42201, 12421, 128216, 0, 1852, 3057, 64046, + 73744, 64034, 64039, 129127, 0, 0, 194899, 92322, 7645, 12854, 74338, + 3496, 0, 0, 113710, 9102, 627, 127795, 6158, 8327, 74553, 66632, 12419, + 13309, 11570, 127811, 19960, 11696, 0, 1018, 118970, 129075, 194897, + 1682, 43863, 194911, 42756, 6765, 194906, 67717, 74358, 73814, 11412, + 6768, 10728, 119982, 71316, 71099, 43311, 64966, 11577, 0, 43040, 1833, + 11576, 0, 74779, 0, 185, 65085, 74533, 64754, 119334, 7535, 8085, 42525, + 120387, 9749, 41701, 6131, 1949, 4117, 7847, 120489, 124992, 64483, + 65693, 983711, 0, 0, 69695, 42240, 128587, 126651, 42864, 126498, 43168, + 41868, 1184, 0, 815, 11484, 127535, 67840, 983651, 0, 66197, 983472, + 10986, 64683, 983785, 128454, 3455, 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, + 92404, 74373, 0, 55217, 92436, 63870, 43163, 0, 0, 12985, 42867, 1834, 0, + 92461, 69817, 10940, 65249, 70385, 8662, 120324, 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, 983562, 609, 11555, 983099, 12496, 127839, 74181, 4343, - 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0, 0, 43565, - 71306, 126493, 12696, 128256, 0, 94062, 12929, 0, 712, 0, 4197, 983206, - 42818, 126632, 0, 120490, 0, 119137, 1506, 43562, 0, 92491, 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, 71313, 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, 983602, 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, 69897, 66510, 3590, 194864, 1130, 0, 0, 42016, 11823, - 43023, 0, 118896, 7742, 0, 13280, 71323, 9326, 73826, 5310, 74812, 78584, - 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, 120803, - 983848, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 127182, 0, - 73917, 7843, 69783, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 128247, - 0, 118990, 10491, 69842, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, - 65086, 8981, 12382, 42133, 120755, 9706, 69738, 0, 66610, 10461, 12103, - 0, 8642, 0, 42766, 983866, 2210, 9983, 0, 94009, 0, 0, 0, 7398, 41515, 0, - 11802, 8041, 1461, 910, 119133, 0, 6749, 3658, 93964, 120525, 0, 7617, - 194841, 12888, 127983, 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, 126472, 12480, 43243, - 0, 39, 12487, 0, 120529, 74199, 12482, 0, 12489, 0, 3195, 5550, 983554, - 7897, 0, 1203, 74396, 1813, 64544, 41311, 12090, 0, 2877, 0, 0, 1675, - 69840, 0, 0, 0, 10070, 10595, 0, 119077, 194777, 983611, 0, 0, 0, 43244, - 0, 0, 983916, 119561, 983078, 0, 194921, 128160, 9939, 0, 983151, 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, - 12890, 2909, 68619, 44008, 68627, 983718, 11544, 10203, 9608, 0, 0, - 11962, 194694, 12507, 1196, 128687, 128311, 777, 120187, 4375, 65271, - 67678, 0, 12198, 0, 64824, 119343, 983236, 9454, 63778, 8658, 42528, - 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 74520, 2701, - 0, 127002, 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 983814, 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, 92535, 0, 0, 0, 74575, 0, 65719, 13083, - 64574, 65012, 0, 1640, 12495, 66691, 7624, 3138, 10996, 92247, 1922, 0, - 12498, 10987, 69936, 69939, 3894, 65543, 0, 194842, 983588, 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, 78219, 983081, 8378, 11632, 127041, 66213, 63864, - 66221, 66226, 66229, 13218, 66231, 66216, 8507, 66236, 66211, 66218, - 92672, 66240, 78041, 66233, 8928, 983552, 7909, 66234, 11605, 63759, - 983654, 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, + 74474, 120327, 78620, 8531, 12499, 6280, 12324, 72434, 65238, 68374, + 4832, 65573, 43851, 6279, 12508, 12904, 12502, 9161, 0, 1620, 64436, + 3601, 124944, 128073, 67246, 609, 11555, 92409, 12496, 67250, 74181, + 4343, 12505, 0, 127863, 0, 11377, 239, 129190, 637, 0, 128678, 42671, 0, + 93032, 0, 43565, 71306, 126493, 12696, 128256, 917600, 94062, 12929, 0, + 712, 0, 4197, 983206, 42818, 126632, 0, 120490, 70333, 119137, 1506, + 43562, 0, 92491, 0, 12651, 0, 64628, 74517, 12058, 74084, 917838, 7494, + 0, 4924, 65592, 118844, 194823, 127088, 355, 9719, 127087, 13066, 64796, + 0, 0, 12033, 42178, 0, 69760, 42571, 92635, 11430, 0, 0, 0, 124951, + 68324, 3178, 917835, 128633, 92704, 0, 9080, 127000, 67697, 195101, + 68209, 72418, 11082, 0, 5699, 195100, 66000, 9488, 65166, 119112, 70477, + 11170, 68662, 128120, 71313, 0, 5265, 69235, 0, 11487, 67858, 12464, 0, + 43045, 0, 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 69997, 74348, 0, + 43346, 8116, 795, 120352, 72412, 12462, 10930, 10831, 0, 118952, 64362, + 74334, 93056, 120811, 0, 12468, 8607, 1008, 0, 10092, 125122, 917842, + 67855, 55257, 73771, 1766, 11282, 11996, 1820, 4547, 0, 11202, 983222, + 983872, 13223, 128665, 64595, 127294, 0, 68489, 4345, 12616, 917784, + 128947, 983155, 74467, 0, 0, 0, 5382, 0, 0, 67233, 119060, 64953, 5406, + 19920, 69897, 66510, 3590, 194864, 1130, 917766, 194692, 42016, 11823, + 43023, 125129, 118896, 7742, 0, 13280, 71323, 9326, 73826, 5310, 43509, + 78584, 92229, 8959, 43589, 6747, 66723, 64757, 8568, 194684, 120496, + 73816, 120803, 983848, 42670, 0, 11621, 12460, 1326, 120631, 983334, + 43063, 43239, 127182, 194840, 73917, 7843, 69783, 11689, 5410, 5783, + 10468, 8403, 5400, 11594, 120405, 68333, 118990, 10491, 69842, 64412, 0, + 0, 5587, 42865, 64404, 8268, 4923, 65086, 8981, 12382, 42133, 120755, + 9706, 69738, 0, 66610, 10461, 12103, 0, 8642, 194707, 42766, 128247, + 2210, 9983, 0, 94009, 0, 0, 0, 7398, 41515, 0, 11802, 8041, 1461, 910, + 119133, 0, 6749, 3658, 93964, 120525, 0, 7617, 194841, 12888, 127983, + 67668, 13143, 0, 9193, 11097, 5703, 983475, 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, 126472, 12480, 43243, 0, 39, 12487, 0, + 120529, 74199, 12482, 0, 12489, 119607, 3195, 5550, 129121, 7897, 127089, + 1203, 74396, 1813, 64544, 41311, 12090, 983634, 2877, 128394, 70496, + 1675, 69840, 0, 0, 119078, 10070, 10595, 0, 119077, 194777, 983611, + 67170, 120790, 118787, 43244, 0, 0, 983916, 119561, 983078, 194914, + 194921, 128160, 9939, 0, 983151, 77860, 128948, 0, 270, 0, 10714, 118983, + 72437, 0, 0, 119338, 65372, 73803, 74038, 68251, 6273, 66679, 364, 9595, + 127137, 0, 0, 707, 0, 128409, 9282, 11163, 224, 128588, 68670, 9332, + 4966, 68677, 0, 68644, 983131, 3841, 67357, 67341, 10732, 68640, 850, + 4972, 0, 12890, 2909, 68619, 44008, 68627, 120699, 11544, 10203, 9608, 0, + 917943, 11962, 194694, 12507, 1196, 67684, 67100, 777, 120187, 4375, + 65271, 67678, 0, 12198, 917887, 64824, 119343, 127243, 9454, 63778, 8658, + 42528, 70073, 2705, 128680, 41520, 195098, 128447, 11986, 7765, 42502, + 8280, 74520, 2701, 0, 120240, 5767, 0, 0, 9809, 8353, 63747, 66701, + 63772, 983814, 63745, 1748, 63770, 0, 129137, 0, 65542, 63766, 55244, + 3061, 78609, 63764, 63787, 9067, 6096, 0, 7694, 0, 7257, 63768, 3485, + 12987, 127781, 127522, 120628, 63807, 1591, 0, 6386, 63783, 0, 125041, + 92535, 0, 0, 68249, 74575, 0, 65719, 13083, 64574, 65012, 983958, 1640, + 12495, 66691, 7624, 3138, 10996, 11171, 1922, 0, 12498, 10987, 69936, + 69939, 3894, 65543, 129183, 194842, 983588, 493, 0, 43197, 1717, 4228, + 479, 10303, 74020, 0, 917935, 10335, 3520, 917932, 12490, 64315, 92170, + 127039, 12493, 6233, 42681, 1002, 12491, 113695, 64911, 92615, 2096, + 65120, 0, 78219, 128912, 8378, 11632, 127041, 66213, 63864, 66221, 66226, + 66229, 13218, 66231, 66216, 8507, 66236, 66211, 66218, 92672, 66240, + 78041, 66233, 8928, 983552, 7909, 66234, 11605, 63759, 983654, 66208, + 67339, 13002, 63803, 244, 11542, 12898, 12494, 73761, 12492, 12669, 0, 0, + 74153, 120310, 128278, 120680, 4882, 13040, 0, 8612, 4885, 74053, 0, + 13042, 4880, 64662, 2429, 1360, 248, 129066, 63797, 92394, 42358, 0, 7292, 0, 63756, 42786, 66693, 0, 1870, 78040, 470, 78038, 78035, 78036, - 70028, 78034, 4579, 128090, 0, 12511, 74453, 12514, 0, 74579, 7239, 7001, - 8623, 94011, 128052, 128048, 7378, 12512, 11615, 6104, 0, 0, 659, 6098, - 0, 12234, 127307, 127067, 8311, 12510, 41803, 13039, 127072, 12513, - 10202, 12471, 0, 8747, 983920, 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, - 92571, 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, 983778, 9372, 12444, 0, 0, 13016, 8210, - 983958, 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 983837, 4155, 0, - 0, 42030, 5007, 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, - 983841, 12525, 983471, 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, 126514, 8546, 11553, 63995, 13177, 9043, 6303, - 983947, 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, 983228, 119634, 6503, - 41110, 0, 1491, 0, 0, 127304, 41061, 0, 194838, 127187, 65026, 41993, - 41509, 11045, 65028, 78602, 66476, 41108, 9738, 41995, 1075, 1958, 12535, - 41992, 41506, 0, 41687, 0, 120717, 127776, 9940, 127299, 7692, 983833, - 8008, 41131, 330, 8566, 65083, 41133, 9816, 126517, 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, 983103, - 13030, 6702, 4527, 0, 12538, 128810, 983645, 65599, 65717, 9966, 0, 4948, - 12484, 4032, 128149, 12623, 0, 6207, 0, 6117, 65930, 8412, 0, 7438, 1296, - 2325, 41511, 126625, 10149, 74118, 0, 127286, 12481, 0, 12488, 66713, 0, - 41556, 64414, 118802, 2354, 42619, 73766, 0, 6295, 901, 41510, 7953, 0, - 65032, 41513, 983166, 11927, 66584, 78559, 78560, 78557, 78558, 0, 78556, - 848, 9868, 0, 6424, 78568, 119338, 69922, 74031, 78563, 78564, 2352, - 78572, 893, 64576, 11289, 1407, 67973, 0, 13026, 6762, 78579, 78580, - 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 983823, 0, 9325, 6818, - 6283, 11738, 0, 983934, 0, 11741, 0, 0, 9216, 8263, 11279, 194752, - 983825, 194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737, - 9956, 0, 0, 74552, 10014, 0, 41260, 119340, 13020, 10024, 194764, 74583, - 74340, 69681, 0, 43001, 8029, 0, 0, 983780, 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, + 70028, 78034, 4579, 69232, 0, 12511, 74453, 12514, 0, 74579, 7239, 7001, + 8623, 94011, 125137, 128048, 7378, 12512, 11615, 6104, 0, 0, 659, 6098, + 0, 12234, 127307, 67358, 8311, 12510, 7669, 13039, 127072, 12513, 10202, + 12471, 0, 8747, 125049, 70193, 128354, 2323, 0, 2319, 77917, 12477, + 77916, 2311, 7666, 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, 128931, 917832, 43024, 43336, 67659, 2313, + 128167, 7948, 9236, 77942, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, + 12082, 10924, 3147, 0, 66406, 12524, 119081, 2310, 11818, 9381, 9382, + 9379, 9380, 9377, 9378, 9375, 9376, 1683, 9374, 983778, 9372, 12444, 0, + 0, 13016, 8210, 129178, 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, + 917922, 4155, 0, 120704, 42030, 5007, 12522, 43088, 0, 4951, 113826, + 127240, 0, 9922, 43309, 11211, 12525, 983471, 12016, 65770, 9548, 67665, + 403, 78230, 12503, 0, 0, 11030, 0, 92567, 65691, 63998, 1819, 10496, 0, + 0, 119920, 0, 129143, 0, 12506, 983838, 11146, 127751, 12500, 44023, + 12509, 64393, 78830, 3389, 10589, 6608, 11208, 120236, 78395, 78394, + 74069, 77995, 78391, 3608, 8281, 113732, 1107, 113745, 9076, 8862, 69743, + 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, 43499, 8546, + 11553, 63995, 13177, 9043, 6303, 113664, 498, 64471, 77987, 92974, 12529, + 8042, 0, 2344, 12528, 8031, 2414, 74506, 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, 127876, 4931, 1951, 12497, 119363, + 9607, 70368, 9663, 66838, 119634, 6503, 41110, 983465, 1491, 66847, + 129169, 127304, 41061, 70454, 194838, 127187, 65026, 41993, 41509, 11045, + 65028, 71181, 66476, 41108, 9738, 41995, 1075, 1958, 12535, 41992, 41506, + 0, 41687, 0, 120717, 127776, 9940, 127299, 7692, 983833, 8008, 41131, + 330, 8566, 65083, 6839, 9816, 126517, 12532, 78550, 78546, 3508, 127058, + 43235, 120351, 127298, 64139, 78231, 6411, 12910, 67710, 66644, 13028, + 6737, 12537, 0, 43506, 64136, 12536, 2350, 13029, 78233, 127763, 983103, + 13030, 6702, 4527, 71250, 12538, 128810, 983645, 65599, 65717, 9966, + 128499, 4948, 12484, 4032, 128149, 12623, 0, 6207, 0, 6117, 65930, 8412, + 127183, 7438, 1296, 2325, 41511, 126625, 10149, 74118, 0, 120233, 12481, + 0, 12488, 66713, 0, 41556, 64414, 118802, 2354, 42619, 73766, 0, 6295, + 901, 41510, 7953, 0, 65032, 41513, 983166, 11927, 66584, 78559, 78560, + 78557, 78558, 0, 67603, 848, 9868, 67220, 6424, 78568, 67226, 69922, + 70190, 78563, 78564, 2352, 67219, 893, 64576, 11289, 1407, 67973, 0, + 13026, 6762, 78579, 70192, 13023, 8903, 9777, 66715, 1871, 8099, 127984, + 0, 1343, 983823, 120784, 9325, 6818, 6283, 11738, 0, 72436, 113713, + 11741, 0, 93038, 9216, 8263, 11279, 194752, 983453, 194754, 13021, 64494, + 3136, 194758, 194757, 194760, 13022, 42737, 9956, 0, 127787, 74552, + 10014, 0, 41260, 119340, 13020, 10024, 194764, 74583, 74340, 69681, 0, + 43001, 8029, 0, 0, 983780, 3335, 119341, 9209, 9776, 120526, 194748, + 5215, 42644, 3333, 1632, 194751, 64849, 3342, 78582, 5363, 12957, 78581, + 4156, 0, 127329, 6421, 78039, 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, + 8838, 425, 4025, 10709, 78595, 2108, 2392, 13047, 92745, 0, 6819, 13049, + 6499, 92243, 12424, 68614, 65827, 13050, 9924, 194745, 6507, 127919, 94073, 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, 983791, - 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, 126596, 0, 119933, 0, 3115, 9918, 0, 8294, - 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468, 983274, 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, 1564, 73924, 1121, - 78319, 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, 93957, 118830, 63978, 11044, 3229, - 6423, 42774, 0, 0, 0, 12823, 2331, 917810, 7085, 6137, 0, 7524, 0, - 917809, 8346, 0, 8338, 128315, 65043, 0, 822, 127984, 9903, 64721, 42722, - 69877, 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, 983960, 748, - 41067, 2330, 535, 3148, 12375, 78799, 194629, 10556, 2475, 12388, 4889, - 8968, 67863, 3593, 0, 0, 2342, 0, 194634, 65206, 4894, 194635, 4890, - 194637, 917804, 581, 4893, 983616, 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, 983608, 40980, 983964, 13202, 0, 12582, 78282, 983048, - 69856, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658, - 74045, 70039, 0, 0, 4913, 0, 983959, 71333, 42326, 128194, 12728, 92685, - 42478, 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821, 6153, 2867, - 194708, 66312, 698, 128007, 194606, 10356, 70017, 194713, 651, 12641, 0, - 0, 0, 0, 41552, 65115, 78465, 78467, 78463, 78464, 128851, 78461, 194697, - 74356, 64945, 4716, 43277, 0, 78474, 12340, 120568, 0, 194700, 55264, - 41211, 120676, 8703, 5462, 917629, 983495, 10101, 0, 70049, 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, 126475, 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, 67975, 4272, 0, 40967, 40964, 917825, 12704, 78487, 43306, - 0, 64497, 12138, 7930, 0, 2292, 68216, 0, 917826, 5244, 4189, 94108, - 67596, 127504, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 2279, 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, 127335, 0, 0, 0, 310, 0, 41281, 10976, 0, 71325, 0, - 74266, 10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215, 12730, - 65163, 74044, 374, 43195, 816, 120161, 0, 0, 41934, 7465, 0, 128168, - 983268, 4715, 6101, 94106, 41936, 0, 4879, 0, 65446, 0, 307, 127147, - 9585, 5374, 983267, 128059, 0, 0, 126618, 120390, 0, 65567, 120614, 1929, - 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623, 5378, 78791, - 128679, 41421, 0, 4462, 0, 126599, 128092, 821, 0, 2498, 5800, 120157, - 983115, 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, 983763, 1584, 66645, - 6045, 6729, 120640, 65218, 11559, 0, 78062, 7537, 0, 11370, 0, 10330, 0, - 10394, 0, 74194, 0, 127929, 9780, 0, 13092, 194576, 77950, 194578, 7074, - 92648, 194579, 194582, 11414, 128868, 2531, 13034, 0, 0, 4211, 1259, - 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219, 94034, 194566, 11064, - 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153, 0, 64098, 65793, 4535, - 194573, 4271, 78417, 128357, 6769, 41410, 983452, 64262, 6767, 41407, 0, - 0, 6755, 118864, 9046, 127934, 126608, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, - 2563, 13033, 247, 118915, 0, 12338, 4651, 69895, 11270, 0, 0, 11933, 0, - 0, 41903, 43447, 11001, 0, 42255, 0, 92661, 69821, 41905, 0, 0, 10775, - 9793, 5009, 0, 42269, 64587, 983063, 42535, 69812, 64529, 41408, 42853, - 3877, 120795, 42674, 8147, 43566, 119021, 983776, 10236, 65918, 43782, 0, - 0, 64506, 69652, 118921, 4747, 128058, 69844, 43200, 5832, 0, 0, 5141, - 42600, 0, 43203, 0, 983799, 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, 120481, 120786, 42233, 64140, 9946, - 63885, 194792, 11822, 0, 43189, 983898, 0, 1788, 1579, 120482, 71298, 0, - 0, 0, 9028, 119571, 69234, 94055, 0, 1285, 64882, 41242, 70086, 0, 12640, - 0, 7401, 0, 12625, 68198, 0, 70082, 3940, 41597, 43754, 3396, 12642, - 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166, 120516, 118989, 0, 8815, - 66673, 65046, 9285, 913, 42259, 119317, 119318, 2142, 68454, 42485, - 94012, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673, 12032, 0, 9725, 0, + 12420, 4024, 194730, 41054, 1078, 9757, 69736, 41057, 68307, 0, 0, 0, + 983791, 92210, 92411, 0, 41496, 0, 9165, 1572, 11911, 124990, 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, 126596, 128434, 119933, 0, + 3115, 9918, 127823, 8294, 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468, + 983274, 41558, 41471, 73950, 8158, 9944, 41472, 120298, 13051, 78689, + 3143, 194674, 6701, 41559, 1896, 66256, 13052, 194680, 5665, 78594, + 119071, 7025, 63974, 0, 74352, 74161, 4154, 9863, 43550, 12310, 5662, + 42382, 1564, 73924, 1121, 78319, 63959, 0, 9942, 13231, 983578, 64752, + 4732, 194666, 11596, 78142, 65187, 1626, 63983, 10110, 64772, 42024, + 6420, 42028, 92294, 10509, 2795, 4910, 129193, 69231, 64753, 6275, 93957, + 118830, 63978, 11044, 3229, 6423, 42774, 0, 0, 68526, 12823, 2331, + 127788, 7085, 6137, 0, 7524, 0, 917809, 8346, 128438, 8338, 128315, + 65043, 983237, 822, 70412, 9903, 64721, 42722, 69877, 194659, 78655, + 66882, 194660, 78484, 41265, 5311, 1795, 965, 118791, 10587, 73931, + 11278, 78632, 194640, 0, 12946, 194641, 71921, 120349, 6294, 3144, + 194648, 127967, 65019, 194649, 73990, 65111, 983960, 748, 41067, 2330, + 535, 3148, 12375, 78799, 194629, 10556, 2475, 12388, 4889, 8968, 67863, + 3593, 74076, 0, 2342, 0, 126541, 65206, 4894, 194635, 4890, 194637, + 129147, 581, 4893, 42929, 6571, 65545, 4888, 4157, 78048, 78049, 64651, + 78047, 0, 10119, 6415, 42893, 0, 69702, 983937, 0, 11375, 64746, 2332, + 78063, 412, 78061, 42928, 42880, 43587, 0, 0, 0, 70461, 65197, 78066, + 12203, 78064, 78065, 8913, 65854, 4875, 65811, 120381, 120389, 71854, + 9344, 8826, 92916, 120395, 13104, 74781, 11997, 120393, 78075, 0, 3134, + 0, 65696, 72432, 0, 66217, 0, 8334, 92755, 0, 3449, 0, 0, 78414, 78413, + 118950, 66405, 70430, 0, 0, 0, 1908, 120167, 4328, 10734, 127014, 0, + 127914, 7804, 78272, 10811, 6250, 11339, 4914, 11367, 125001, 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, 983608, 40980, 983964, 13202, 127816, 12582, 78282, + 983048, 69856, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, + 7698, 5658, 70401, 70039, 0, 70460, 4913, 71060, 128562, 71333, 42326, + 128194, 12728, 92685, 42478, 2327, 0, 12563, 42287, 12705, 0, 120824, + 12588, 8821, 6153, 2867, 194708, 66312, 698, 127059, 194606, 10356, + 70017, 194713, 651, 12641, 0, 125098, 120710, 129064, 41552, 65115, + 78465, 78467, 78463, 78464, 128851, 78461, 92960, 66927, 64945, 4716, + 43277, 0, 78474, 12340, 120568, 0, 194700, 55264, 41211, 120676, 8703, + 5462, 120793, 128944, 10101, 0, 70049, 8479, 4151, 41933, 0, 0, 66254, + 120821, 68497, 0, 128654, 113799, 119194, 74050, 42651, 0, 0, 0, 129151, + 0, 12278, 127167, 128405, 0, 2700, 12576, 7842, 12899, 0, 0, 2699, 0, + 73845, 2985, 92568, 68648, 917845, 12192, 119314, 0, 66489, 9827, 119310, + 8609, 119308, 67426, 119306, 11481, 41210, 119305, 0, 35, 70838, 67431, + 66694, 68479, 78477, 67428, 43596, 6090, 64257, 7812, 10534, 0, 78485, + 73848, 67975, 4272, 78321, 40967, 40964, 917825, 12704, 78487, 43306, 0, + 64497, 12138, 7930, 0, 2292, 68216, 194871, 917826, 5244, 4189, 94108, + 67596, 127504, 4188, 1879, 70463, 968, 0, 43743, 0, 8873, 2279, 0, + 917827, 65555, 12574, 0, 92749, 92753, 74490, 127099, 11838, 983920, 0, + 0, 42682, 12578, 12720, 0, 41227, 0, 12346, 127101, 64848, 69950, 917950, + 7251, 0, 120382, 118850, 119141, 128546, 66015, 67332, 959, 8885, 12564, + 66457, 78808, 9469, 9632, 92323, 74761, 64323, 127335, 0, 0, 11132, 310, + 0, 41281, 10976, 0, 71325, 128364, 74266, 10054, 6497, 8574, 0, 9012, + 19958, 74420, 65089, 13215, 12730, 65163, 74044, 374, 43195, 816, 120161, + 0, 0, 41934, 7465, 74615, 92752, 983268, 4715, 6101, 71089, 41936, 0, + 4879, 0, 65446, 0, 307, 127147, 9585, 5374, 983267, 128059, 0, 129189, + 126618, 120390, 129146, 65567, 120614, 1929, 0, 12142, 0, 12236, 41419, + 194618, 120610, 12982, 128228, 5378, 78791, 128679, 41421, 195075, 4462, + 0, 126599, 128092, 821, 0, 2498, 5800, 120157, 67758, 1760, 2421, 4469, + 2324, 828, 3611, 78400, 757, 1185, 0, 78770, 43597, 10628, 74808, 194572, + 7999, 43971, 11217, 0, 10634, 10942, 7713, 2348, 0, 64374, 4380, 194608, + 119044, 9982, 64324, 41240, 862, 65626, 78462, 1810, 3673, 5137, 194617, + 0, 7277, 65622, 65069, 7566, 64688, 67143, 194592, 78092, 70422, 128385, + 4748, 92228, 129185, 194601, 42260, 5871, 119075, 0, 74576, 44019, 0, + 128189, 3967, 71098, 13137, 8775, 127945, 0, 2963, 0, 8410, 4454, 723, + 127882, 966, 4449, 92330, 92238, 128428, 7819, 2320, 194589, 339, 4968, + 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634, 41542, 78780, + 7466, 6705, 12174, 42610, 0, 74452, 983763, 1584, 66645, 6045, 6729, + 120640, 65218, 11559, 0, 78062, 7537, 124991, 11370, 0, 10330, 0, 10394, + 0, 74194, 0, 127929, 9780, 0, 11117, 194576, 77950, 194578, 7074, 92648, + 194579, 194582, 11414, 124960, 2531, 13034, 0, 0, 4211, 1259, 7517, + 70866, 70198, 194561, 40996, 13037, 7092, 641, 5219, 94034, 194566, + 11064, 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153, 0, 64098, + 65793, 4535, 194573, 4271, 78417, 128357, 6769, 41410, 194675, 64262, + 6767, 41407, 66273, 917816, 6755, 118864, 9046, 127934, 126608, 70830, 0, + 0, 0, 67675, 983694, 0, 0, 64338, 2563, 13033, 247, 118915, 0, 12338, + 4651, 67355, 11270, 0, 74630, 11933, 0, 0, 41903, 43447, 11001, 73827, + 42255, 113760, 92661, 69821, 41905, 67350, 0, 10775, 9793, 5009, 128774, + 42269, 64587, 983063, 42535, 69812, 64529, 41408, 42853, 3877, 120795, + 42674, 8147, 43566, 119021, 67342, 10236, 65918, 43782, 0, 127556, 64506, + 69652, 118921, 4747, 128058, 69844, 43200, 5832, 71253, 0, 5141, 42600, + 71866, 43203, 127208, 120129, 43286, 0, 128211, 43778, 7657, 41305, + 78776, 43781, 11303, 65547, 128609, 7031, 859, 128488, 0, 0, 6059, + 126985, 55235, 194817, 8535, 128638, 65196, 125084, 66032, 11488, 120481, + 120786, 42233, 64140, 9946, 7667, 194792, 11822, 0, 11135, 983898, 0, + 1788, 1579, 120482, 71298, 0, 983459, 0, 9028, 119571, 69234, 71061, + 194738, 1285, 64882, 41242, 70086, 129041, 12640, 0, 7401, 0, 12625, + 68198, 0, 70082, 3940, 41597, 43754, 3396, 12642, 8665, 983610, 983609, + 12630, 1653, 917815, 10153, 0, 6166, 70825, 118989, 0, 8815, 66673, + 65046, 9285, 913, 42259, 11180, 119318, 2142, 68454, 42485, 94012, 7878, + 8211, 42293, 64377, 120478, 92643, 0, 194673, 12032, 0, 9725, 983489, 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, 42777, 10139, 980, - 43698, 65386, 2208, 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, 2217, - 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, 120664, 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, 983146, 126613, 0, 11693, 126513, 10494, 92655, 65872, - 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, 0, 120462, 74106, - 12413, 94069, 917994, 917993, 917995, 5570, 1881, 7210, 0, 1012, 43752, - 0, 120709, 7208, 66442, 5569, 983242, 42339, 0, 6063, 0, 78383, 119594, - 6053, 65602, 0, 92201, 64727, 9160, 194827, 0, 0, 92180, 10503, 118810, - 6055, 3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326, 92204, - 983116, 0, 120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571, - 3674, 9740, 9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870, - 120101, 589, 7050, 983800, 43281, 10233, 41263, 66251, 65729, 66253, - 126497, 74099, 42645, 0, 194815, 8583, 0, 5847, 6928, 128074, 0, 0, 0, 0, - 66592, 12204, 917962, 19966, 77856, 42561, 120626, 983251, 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, 983671, - 6355, 12519, 41004, 0, 195025, 74094, 0, 0, 77970, 983560, 0, 128175, - 12111, 3927, 0, 12515, 1474, 67893, 5492, 6923, 92281, 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, 128817, 0, 41918, 983168, - 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, 94001, 4257, - 12104, 77942, 6220, 9004, 65561, 0, 77949, 0, 68135, 917576, 77946, 0, - 69679, 69684, 9890, 78561, 12971, 78453, 92556, 73898, 11979, 70051, - 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, 983189, 65898, 983244, 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, 983674, 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, 2212, 983080, 0, 0, 2496, 11516, 944, 118851, 3890, - 12168, 1438, 0, 983117, 0, 41947, 1220, 120828, 128555, 0, 0, 1571, - 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980, 983944, 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, - 127338, 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, 11428, 1730, 2457, - 917808, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 92230, 0, 6129, 0, - 128528, 128268, 0, 7874, 8681, 119092, 0, 13136, 0, 0, 70102, 63886, - 118881, 9605, 71308, 13220, 128776, 120274, 5514, 0, 9228, 0, 0, 0, 5240, - 9811, 10012, 3096, 0, 0, 983351, 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, 983353, 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, 983911, 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, 917904, 8541, 78298, 70034, 41866, 0, - 0, 0, 0, 69924, 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, 6274, 4494, 0, 4012, 10395, 983591, 43633, - 65447, 126511, 0, 11004, 695, 739, 696, 7611, 0, 42755, 74802, 9227, - 7506, 7510, 69937, 691, 738, 7511, 7512, 7515, 3868, 688, 41847, 690, - 2548, 737, 974, 8003, 7406, 917911, 0, 128688, 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, 983175, 11717, 7650, - 10594, 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 0, 3891, 0, 0, - 2337, 1735, 74324, 67860, 2363, 983135, 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, 983879, 6418, 4543, 78086, 6969, 0, 74800, 0, 67974, 11980, - 128650, 983801, 63894, 120760, 12282, 66192, 0, 74592, 8850, 74275, 9238, - 10617, 917545, 0, 92625, 0, 12791, 0, 0, 127843, 4447, 73732, 12793, - 12900, 92377, 10950, 0, 78087, 12790, 41400, 119128, 66607, 12792, 42232, - 194938, 1744, 12789, 10366, 12317, 41310, 983869, 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, 983186, 77829, 71360, 0, 6413, - 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, 10044, 128322, 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, 43758, 4182, 78171, - 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361, 11540, 43546, 6692, 0, - 41060, 0, 4668, 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, - 983051, 65339, 43221, 2211, 0, 5517, 0, 0, 74841, 67884, 0, 67890, 67885, - 67880, 67881, 67882, 67883, 0, 0, 67879, 127188, 1902, 67887, 9638, - 12976, 126546, 12483, 12368, 41769, 42726, 41765, 7361, 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, 983729, 128675, 41834, 5279, - 0, 10336, 8312, 0, 42701, 128825, 0, 78165, 66036, 0, 0, 6428, 42270, 0, - 983596, 43059, 42666, 5256, 1067, 255, 12131, 983722, 9493, 983968, - 41014, 11793, 194920, 0, 74394, 43460, 10653, 42723, 983854, 119632, 0, - 6560, 7016, 74274, 983615, 43556, 3929, 67977, 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, 983607, 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, 119328, 0, - 10432, 12097, 5450, 64691, 1233, 0, 44009, 78284, 66338, 0, 0, 1839, - 118799, 983219, 10927, 1701, 983664, 2388, 41749, 41761, 5453, 8361, - 119865, 41758, 5444, 41763, 64889, 7143, 92493, 78677, 0, 92429, 78174, - 66432, 8801, 3053, 4340, 983044, 0, 65812, 917831, 0, 41824, 67985, - 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, 71331, 0, 194793, 1912, 42385, 10306, 10370, - 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410, 92671, 983250, 118878, - 0, 0, 9919, 120528, 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, 126573, 3668, 65754, 43560, 12226, - 67991, 65149, 2340, 41959, 194786, 194785, 194788, 43618, 65747, 10937, - 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0, 42714, 9951, 43409, + 43698, 65386, 2208, 983454, 43701, 43198, 7184, 92542, 128423, 128875, + 10085, 113812, 0, 67394, 6634, 92373, 125085, 119323, 8072, 119321, + 43700, 0, 8872, 7783, 917991, 12398, 8237, 0, 0, 12395, 0, 126977, + 120565, 9914, 2217, 194586, 73975, 6367, 6351, 66688, 92740, 78107, 0, + 64735, 41243, 92199, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, 0, + 120422, 93045, 1710, 120140, 0, 65607, 67234, 49, 6627, 0, 6258, 10683, + 78672, 9741, 78329, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, + 67244, 13213, 42452, 78331, 120664, 78445, 125124, 1072, 78457, 78452, + 78454, 6576, 41988, 41132, 65675, 1080, 70824, 9886, 55225, 1101, 68404, + 12309, 55227, 71082, 12632, 1086, 1869, 78685, 7680, 0, 65458, 120714, + 12639, 3380, 8123, 1091, 12638, 7977, 4501, 41099, 0, 66309, 120141, + 92758, 1494, 113716, 126613, 0, 11693, 71255, 10494, 92655, 65872, 12363, + 11386, 113727, 0, 0, 0, 64582, 0, 73794, 67395, 8022, 0, 120462, 74106, + 12413, 66883, 917994, 93035, 917995, 5570, 1881, 7210, 120425, 1012, + 43752, 0, 120709, 7208, 66442, 5569, 983242, 42339, 92997, 6063, 67888, + 69981, 119594, 6053, 65602, 0, 92201, 64727, 9160, 128397, 0, 92905, + 92180, 10503, 70387, 6055, 3870, 4279, 8490, 120114, 4319, 64786, 8602, + 120110, 11326, 92204, 983116, 0, 120119, 78333, 120117, 120118, 120099, + 92385, 65087, 5571, 3674, 9740, 9121, 5568, 120107, 120108, 42085, 10107, + 42159, 42870, 113700, 589, 7050, 983800, 43281, 10233, 41263, 66251, + 65729, 66253, 126497, 74099, 42645, 0, 128424, 8583, 0, 5847, 6928, + 128074, 0, 0, 0, 0, 66592, 12204, 917962, 19966, 77856, 42561, 120626, + 129170, 66854, 8120, 120701, 0, 0, 128012, 41063, 0, 10664, 0, 8369, 0, + 4551, 194964, 3369, 983739, 129026, 9673, 66334, 65580, 10478, 118960, + 12517, 557, 9457, 12034, 68496, 6355, 12519, 41004, 0, 195025, 74094, 0, + 0, 77970, 92171, 127219, 128175, 12111, 3927, 0, 12515, 1474, 67893, + 5492, 6923, 92281, 10441, 73836, 0, 43990, 5493, 0, 74319, 0, 66635, + 12019, 0, 1618, 0, 120474, 9645, 10430, 126636, 5853, 13063, 10363, 0, + 12956, 113666, 120729, 11314, 917582, 12060, 0, 78392, 12826, 6329, 0, + 10514, 65517, 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697, 43420, + 78396, 127057, 2695, 42171, 70809, 68334, 0, 67617, 118971, 0, 2693, + 12125, 12766, 0, 1164, 113729, 0, 41918, 77849, 67150, 8687, 66009, + 12178, 7053, 128001, 7469, 0, 5248, 12218, 69988, 6427, 42884, 41123, + 11176, 0, 42873, 41126, 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, + 7994, 64762, 2053, 42843, 6591, 9340, 0, 1589, 128691, 296, 67712, 78852, + 0, 67841, 74370, 128504, 8922, 128068, 43829, 12700, 74836, 0, 12579, 0, + 12575, 6416, 5656, 2891, 13262, 65590, 5299, 0, 11473, 5449, 1252, 0, + 78404, 41431, 74369, 65373, 5295, 917569, 68320, 1223, 1642, 174, 78399, + 883, 4161, 12691, 42603, 41413, 3212, 41459, 3211, 74810, 41425, 74598, + 78412, 74450, 9728, 3846, 8070, 6150, 6636, 4370, 0, 0, 74178, 74587, + 74117, 195094, 0, 0, 4986, 12189, 127512, 67648, 120499, 94001, 4257, + 12104, 71176, 6220, 9004, 65561, 983881, 77949, 0, 68135, 917576, 77946, + 0, 69679, 69684, 9890, 78561, 12971, 78453, 92556, 73898, 11979, 70051, + 71897, 119552, 0, 9635, 12600, 8871, 67366, 68491, 0, 6469, 74227, + 118900, 65304, 4679, 10230, 64300, 64867, 3427, 4240, 67376, 67375, + 67374, 67373, 42916, 129155, 128279, 67377, 7282, 78728, 65733, 4445, + 67372, 67371, 3494, 67369, 6555, 129148, 77976, 0, 0, 78566, 0, 983189, + 65898, 983244, 65312, 5447, 0, 12895, 65593, 4010, 0, 41106, 74357, + 64448, 93994, 41105, 74114, 65820, 6232, 68233, 128280, 0, 43608, 119091, + 124962, 6538, 4335, 78364, 3941, 41122, 11061, 78363, 64892, 9113, 1954, + 12155, 983674, 42878, 11500, 67405, 0, 74578, 0, 65832, 128667, 0, 70789, + 67333, 119230, 4586, 0, 350, 10951, 0, 509, 67336, 0, 92307, 0, 0, 5133, + 67382, 0, 9500, 0, 4957, 64741, 2422, 2212, 983080, 67381, 67380, 2496, + 11516, 944, 78891, 3890, 12168, 1438, 0, 68335, 70003, 41947, 1220, + 120828, 128555, 70854, 74058, 1571, 42630, 41949, 42805, 8270, 943, 564, + 0, 312, 41980, 983944, 0, 70797, 8877, 269, 4429, 6272, 9617, 1460, 6954, + 78657, 41120, 65121, 10862, 6060, 41119, 41416, 74355, 4173, 0, 0, 0, + 1906, 917898, 11532, 74073, 127338, 0, 1985, 6296, 9582, 917895, 64287, + 128406, 78115, 11428, 1730, 2457, 917808, 19918, 10469, 0, 983079, 7703, + 8840, 8035, 0, 0, 92230, 0, 6129, 128437, 78586, 128268, 0, 7874, 8681, + 119092, 11206, 13136, 0, 0, 70102, 63886, 70450, 9605, 71308, 13220, + 67348, 67354, 5514, 0, 9228, 67349, 67356, 67346, 5240, 9811, 10012, + 3096, 0, 0, 74526, 66676, 65873, 0, 0, 0, 9501, 917959, 1272, 64536, + 65465, 64654, 7467, 0, 1467, 10158, 10040, 0, 9519, 120270, 917812, 0, + 118899, 12193, 0, 0, 0, 0, 983353, 19935, 120733, 92162, 69676, 0, + 917811, 93057, 5275, 194596, 128632, 8637, 129082, 0, 3789, 63880, 11471, + 43554, 65862, 11474, 66332, 66603, 128138, 2426, 12042, 92194, 983911, + 9537, 3961, 12115, 77953, 2605, 4500, 64561, 55224, 4981, 74644, 0, + 41646, 11667, 42686, 77973, 42362, 64686, 4499, 41649, 7589, 128776, 0, + 3237, 0, 66895, 68296, 8541, 78298, 70034, 41866, 0, 0, 94056, 11174, + 69924, 43555, 2823, 9559, 10060, 41940, 8299, 41945, 7132, 41941, 3308, + 7190, 64880, 8614, 65220, 41493, 0, 41699, 10762, 43780, 12999, 0, + 128494, 8106, 4128, 0, 6274, 4494, 0, 4012, 10395, 983591, 43633, 65447, + 126511, 0, 11004, 695, 739, 696, 7611, 0, 42755, 74802, 9227, 7506, 7510, + 69937, 691, 738, 7511, 7512, 7515, 3868, 688, 41847, 690, 2548, 737, 974, + 8003, 7406, 127353, 0, 128688, 3985, 66425, 65860, 41851, 7051, 69777, + 4682, 71873, 12809, 6406, 4685, 92505, 10879, 10347, 4680, 6341, 0, 3851, + 8132, 74325, 0, 917907, 127948, 41958, 119176, 917908, 194855, 0, 42657, + 71075, 7643, 42373, 11714, 67587, 43568, 983175, 11717, 7650, 10594, + 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 126475, 3891, 127205, 0, + 2337, 1735, 74324, 11134, 2363, 125061, 92443, 43561, 67706, 128032, + 74146, 1860, 7495, 7580, 5812, 7497, 7584, 119140, 127853, 78753, 120347, + 7727, 0, 8498, 69818, 8949, 3065, 42719, 7135, 1569, 92375, 12534, 12124, + 7690, 0, 12533, 983879, 6418, 4543, 78086, 6969, 0, 74800, 71051, 67974, + 11980, 128650, 983801, 63894, 120760, 12282, 66192, 0, 74592, 8850, + 74275, 9238, 10617, 917545, 917909, 92625, 917801, 12791, 0, 94069, + 127843, 4447, 71065, 12793, 12900, 92377, 10950, 983447, 74639, 12790, + 41400, 119128, 66607, 12792, 42232, 194938, 1744, 12789, 10366, 12317, + 41310, 120730, 41399, 0, 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, + 2974, 9010, 11315, 0, 278, 0, 41405, 43871, 0, 10077, 63853, 74557, + 42586, 0, 0, 6002, 67335, 43553, 11189, 67338, 67337, 12787, 41308, 7934, + 65306, 0, 128421, 0, 8646, 983186, 77829, 71360, 0, 6413, 6550, 113759, + 1940, 0, 43637, 220, 65193, 43551, 10678, 10044, 128322, 128121, 983816, + 68290, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, 10297, 0, 3742, + 67331, 3959, 0, 120466, 0, 2467, 69739, 6003, 63844, 6663, 8040, 0, + 43758, 4182, 78171, 4676, 120501, 9210, 0, 2510, 0, 10208, 78168, 92361, + 11540, 43546, 6692, 6837, 41060, 0, 4668, 9083, 0, 0, 78144, 1559, 63831, + 9677, 67340, 67347, 65256, 67345, 67344, 0, 0, 365, 12056, 43027, 120423, + 41716, 128236, 67352, 67351, 5516, 2845, 7717, 8036, 41717, 67353, 544, + 12045, 6278, 74632, 5515, 0, 0, 983051, 65339, 43221, 2211, 0, 5517, + 70116, 74225, 74841, 67884, 128414, 67890, 67885, 67880, 67881, 67882, + 67883, 0, 118883, 67879, 127188, 1902, 67887, 9638, 12976, 126546, 12483, + 12368, 41769, 42726, 41765, 7361, 6667, 67874, 7556, 67878, 74351, 11264, + 989, 42677, 67889, 93040, 1311, 128949, 4326, 11000, 63824, 13068, 10932, + 128880, 6917, 78155, 983615, 949, 77882, 0, 6148, 8605, 42253, 78177, + 66906, 0, 42715, 0, 0, 0, 63871, 0, 41796, 1269, 6530, 0, 65057, 70493, + 5144, 12221, 42716, 68299, 4431, 4331, 983729, 128675, 41834, 5279, 0, + 10336, 8312, 0, 42701, 92959, 0, 78165, 66036, 70166, 124935, 6428, + 42270, 0, 983596, 43059, 42666, 5256, 1067, 255, 12131, 128742, 9493, + 983968, 41014, 11793, 194920, 0, 74394, 43460, 10653, 42723, 983854, + 119632, 70427, 6560, 7016, 74274, 69986, 43556, 3929, 67977, 6614, 2768, + 92504, 9746, 5135, 11811, 12796, 11953, 0, 69761, 5139, 346, 74303, 6305, + 12795, 4675, 5168, 78552, 43845, 74315, 74361, 8253, 8817, 1136, 0, + 43563, 92232, 128914, 66410, 7392, 8230, 9365, 71194, 0, 983607, 66915, + 128402, 4041, 0, 2357, 43240, 12786, 229, 43834, 119884, 44004, 7142, + 119881, 12350, 65554, 119882, 119877, 119876, 12785, 63863, 43795, 7770, + 10712, 64853, 12686, 43831, 42375, 0, 127238, 66352, 10470, 0, 11059, + 10791, 917944, 450, 119328, 0, 10432, 12097, 5450, 64691, 1233, 0, 44009, + 78284, 66338, 66395, 0, 1839, 118799, 983219, 10927, 1701, 983664, 2388, + 41749, 41761, 5453, 8361, 119865, 895, 5444, 41763, 64889, 7143, 92493, + 78677, 983137, 92429, 69983, 66432, 8801, 3053, 4340, 983044, 0, 65812, + 120675, 70001, 41824, 67985, 120203, 92600, 127053, 42700, 194805, + 127980, 194807, 78676, 92356, 194808, 127844, 0, 4493, 4336, 129171, + 2314, 43602, 78826, 119325, 194811, 42439, 64638, 42327, 43528, 4489, + 71331, 128006, 194793, 1912, 42385, 10306, 10370, 0, 0, 8867, 10250, + 10258, 2712, 1635, 71064, 1410, 78763, 983250, 118878, 0, 128715, 9919, + 120528, 559, 128157, 41825, 127975, 74641, 4892, 74016, 194781, 6542, + 41957, 128865, 5777, 0, 759, 65749, 2079, 65248, 12788, 64487, 64552, + 93063, 10223, 42062, 0, 0, 74246, 3668, 65754, 43560, 12226, 67991, + 65149, 2340, 41959, 194786, 194785, 194788, 43618, 65747, 10937, 2962, 0, + 2321, 3587, 65745, 67236, 8921, 9952, 128941, 0, 42714, 9951, 43409, 194770, 2949, 66012, 194775, 194774, 2958, 68359, 41820, 2300, 2395, - 128563, 9976, 120043, 120050, 120058, 68220, 128143, 42809, 42807, 0, - 120046, 10198, 4150, 64371, 8318, 41790, 67976, 41898, 2360, 41794, - 917942, 71314, 127818, 0, 0, 2418, 983098, 2411, 11336, 799, 63823, + 120061, 9976, 120043, 120050, 71896, 68220, 128143, 42809, 42807, 70798, + 66290, 10198, 4150, 64371, 8318, 41790, 67976, 41898, 2360, 41794, + 917942, 70796, 92163, 93033, 0, 2418, 983098, 2411, 11336, 799, 63823, 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980, 55284, - 92203, 0, 10384, 983220, 0, 0, 7753, 2351, 6655, 64489, 69931, 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, 93976, 9065, 12961, 0, 0, 92253, - 0, 289, 0, 4694, 11420, 4690, 0, 120514, 917978, 4693, 73893, 42724, 0, - 4688, 120454, 0, 0, 67994, 8238, 3110, 120162, 983908, 120163, 6528, - 127553, 43035, 69898, 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, 128039, 119902, 4689, 8932, 0, 65560, 119209, 74441, - 78810, 0, 0, 67987, 0, 0, 0, 67989, 0, 10065, 8207, 0, 92613, 128011, 0, - 662, 0, 9244, 194863, 0, 119261, 983428, 0, 0, 0, 41929, 0, 0, 66674, - 41926, 120408, 120443, 10513, 64637, 194862, 68013, 52, 13118, 6475, 0, - 120341, 12095, 10225, 4812, 92578, 0, 67992, 74085, 0, 3978, 0, 917945, - 127823, 11582, 120761, 12281, 0, 6544, 13241, 93961, 69782, 128557, + 78686, 0, 10384, 983220, 0, 129111, 7753, 2351, 6655, 64489, 69931, + 70199, 77872, 4443, 42779, 230, 0, 128969, 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, 78684, 0, + 0, 41887, 0, 4862, 9735, 6537, 120591, 74286, 3914, 92178, 93976, 9065, + 12961, 0, 0, 92253, 0, 289, 128714, 4694, 11420, 4690, 0, 120514, 917978, + 4693, 73893, 42724, 69977, 4688, 120454, 0, 0, 67994, 8238, 3110, 120162, + 3565, 120163, 6528, 127553, 43035, 69898, 218, 983850, 1520, 0, 4786, + 983168, 43225, 4602, 917982, 78167, 10088, 6548, 0, 120156, 43978, 8988, + 8888, 92724, 74812, 69709, 0, 10666, 0, 73902, 69740, 127793, 0, 9975, + 113704, 119902, 4689, 8932, 0, 65560, 119209, 74441, 78810, 0, 0, 67987, + 0, 128828, 0, 67989, 119029, 10065, 8207, 71900, 92613, 128011, 0, 662, + 0, 9244, 194863, 0, 119261, 983428, 0, 0, 0, 41929, 0, 71084, 66674, + 41926, 69994, 120443, 10513, 64637, 194862, 68013, 52, 13118, 6475, 0, + 120341, 12095, 10225, 4812, 92578, 128486, 67992, 74085, 0, 3978, 128425, + 917945, 74015, 11582, 92768, 12281, 0, 6544, 13241, 93961, 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, 74191, 120410, + 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 71907, 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, 983910, 6943, 917934, 5859, 0, 2858, - 983361, 74294, 983914, 69239, 0, 119027, 12992, 2753, 1936, 70078, 92574, - 2751, 12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, - 63920, 74128, 2856, 119910, 47, 69908, 126986, 65858, 0, 0, 0, 7899, 0, + 128913, 63940, 127118, 64533, 71883, 120446, 67842, 11990, 92405, 63939, + 43375, 65440, 2504, 0, 78671, 64829, 93020, 6943, 917934, 5859, 0, 2858, + 983361, 74294, 983914, 69239, 0, 67871, 12992, 2753, 1936, 70078, 67701, + 2751, 12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 66424, 63992, + 0, 63920, 74128, 2856, 119910, 47, 69908, 71053, 65858, 0, 0, 0, 7899, 0, 8417, 43798, 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903, - 12320, 0, 0, 194563, 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, 67650, 0, 0, 0, 0, - 74826, 64733, 0, 0, 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605, - 92483, 7514, 983367, 0, 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610, - 219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, 7147, 9535, 0, 93991, - 0, 64530, 0, 64610, 11804, 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895, - 5253, 70025, 5458, 0, 2866, 0, 127860, 65111, 68433, 6700, 120484, 0, - 120583, 0, 8962, 77960, 9641, 43694, 7059, 983677, 0, 9604, 78700, 7441, - 63826, 67970, 118941, 64392, 194735, 983687, 2844, 983941, 41974, 0, - 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983233, - 5308, 0, 290, 0, 0, 2862, 2792, 195088, 983070, 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, - 77932, 0, 9112, 74431, 863, 9490, 119898, 128349, 43323, 120513, 119897, - 9071, 127333, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, 119899, - 66587, 195098, 0, 92401, 983894, 11006, 12927, 7807, 8073, 0, 10629, 0, - 74088, 3056, 10823, 128797, 127327, 8762, 10508, 69689, 73770, 43969, - 43193, 10737, 3463, 983065, 0, 66633, 8695, 4815, 11322, 5811, 12345, - 7049, 119911, 5195, 195081, 0, 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0, - 6561, 19939, 0, 0, 128535, 119906, 0, 0, 983097, 0, 983667, 119907, - 64612, 11991, 0, 0, 0, 1502, 917568, 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, - 126555, 0, 42503, 0, 11652, 0, 0, 119241, 64699, 126569, 5096, 5095, - 2863, 3424, 92244, 10454, 42530, 5094, 119638, 0, 13156, 0, 10832, 5093, - 0, 69852, 0, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104, 78599, + 12320, 0, 125002, 194563, 0, 8915, 2759, 945, 6689, 93064, 0, 0, 118798, + 1291, 74828, 0, 0, 9531, 13155, 8505, 68379, 12062, 128198, 0, 65487, + 92189, 41837, 120611, 8246, 0, 93066, 0, 120433, 0, 63935, 73962, 120806, + 64787, 43524, 0, 64426, 0, 194948, 0, 0, 65664, 6693, 9843, 0, 8674, + 119887, 128812, 92715, 70788, 1320, 0, 1673, 4811, 92383, 5986, 9338, + 3046, 74480, 5985, 917928, 119598, 9820, 119892, 12187, 983841, 71041, + 5984, 0, 43308, 4393, 67650, 983227, 0, 125112, 0, 74826, 64733, 0, + 127898, 3491, 67146, 983710, 128219, 3514, 65485, 72428, 7492, 0, 74605, + 92483, 7514, 983367, 0, 194731, 7502, 7587, 68353, 63921, 0, 63925, 0, + 7610, 219, 0, 78722, 692, 43588, 68485, 41635, 43241, 9688, 7147, 9535, + 0, 93991, 0, 64530, 0, 64610, 11804, 0, 7149, 7453, 0, 8013, 0, 92301, 0, + 8895, 5253, 70025, 5458, 0, 2866, 129045, 127860, 11098, 68433, 6700, + 120484, 0, 120583, 0, 8962, 77960, 9641, 43694, 7059, 983677, 63997, + 9604, 78700, 7441, 63826, 67970, 118941, 64392, 92626, 983687, 2844, + 74610, 41974, 67397, 12139, 67971, 0, 0, 3358, 65295, 0, 3104, 194734, 0, + 194765, 983233, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 92963, 0, 3268, + 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 128572, 10240, 66285, + 74305, 128382, 74528, 65903, 0, 42646, 7606, 2591, 2837, 4341, 43513, + 64482, 127337, 8163, 65270, 0, 77932, 0, 9112, 74431, 863, 9490, 119898, + 128349, 43323, 120513, 119897, 9071, 127333, 0, 3654, 7789, 9637, 0, + 2535, 65504, 7653, 40993, 119899, 66587, 124987, 0, 92401, 983894, 11006, + 12927, 7807, 8073, 0, 10629, 127869, 74088, 3056, 10823, 128797, 113762, + 8762, 10508, 69689, 73770, 43969, 43193, 10737, 3463, 983065, 0, 66633, + 8695, 4815, 11322, 5811, 12345, 7049, 118811, 5195, 195081, 0, 66639, + 92939, 0, 0, 128041, 67903, 67739, 1262, 120165, 6561, 19939, 0, 0, + 128535, 119906, 0, 0, 983097, 0, 983667, 119907, 64612, 11991, 0, 0, + 92943, 1502, 917568, 127988, 9107, 127316, 5702, 3655, 67661, 8430, 0, + 71223, 120758, 0, 74057, 9603, 128079, 5254, 120742, 7724, 74388, 68375, + 10796, 5129, 0, 70816, 590, 7579, 5614, 5893, 92280, 11720, 92496, 11721, + 70804, 4798, 0, 119316, 66038, 4793, 67851, 11726, 127541, 74204, 68610, + 0, 68626, 894, 300, 917813, 12306, 66235, 8004, 0, 195056, 2562, 70156, + 0, 42503, 128864, 11652, 0, 0, 119241, 64699, 126569, 5096, 5095, 2863, + 3424, 92244, 10454, 42530, 5094, 70873, 0, 13156, 129057, 10832, 5093, 0, + 69852, 72430, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104, 78599, 78601, 1215, 42712, 5744, 12272, 9832, 11777, 71299, 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, 71345, 586, - 74414, 64359, 1267, 128269, 65468, 0, 65731, 0, 127179, 3621, 120473, - 66666, 64211, 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714, - 74406, 127831, 0, 983921, 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, 983969, 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, 126483, 0, 0, 0, 78757, 0, 0, 0, 0, 9994, 12467, - 2864, 64719, 1148, 10435, 11462, 41675, 7084, 2765, 0, 43382, 0, 120719, - 128188, 92516, 66662, 0, 78133, 9364, 194685, 74416, 0, 0, 77988, 263, - 10449, 41288, 0, 41839, 78387, 983742, 77986, 0, 6931, 69722, 64355, - 7177, 70105, 0, 0, 0, 4262, 10285, 10722, 42020, 126575, 6806, 6992, - 42019, 0, 41290, 983716, 750, 0, 71304, 10163, 63913, 71300, 7032, 5954, - 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, 78891, 13165, - 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938, 70026, - 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, 6712, 66045, - 41470, 64805, 0, 0, 128215, 64801, 0, 497, 12100, 5953, 92667, 7796, - 69669, 43254, 73831, 0, 10293, 5952, 1281, 43747, 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, 983723, 73752, 0, 64872, 92340, - 1331, 0, 0, 0, 12708, 0, 5090, 5089, 127977, 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, - 126587, 0, 127165, 127241, 6677, 7601, 0, 591, 64419, 118953, 92262, 0, - 118923, 70084, 0, 10939, 6106, 6933, 41271, 6760, 71343, 4534, 41270, - 128876, 0, 65574, 0, 9224, 69853, 3671, 8976, 126474, 0, 41275, 6372, - 128084, 55261, 7963, 6371, 0, 568, 0, 41273, 983730, 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, 983597, 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, 70048, 74243, 0, 3805, - 0, 194565, 44001, 41008, 0, 6307, 19949, 983790, 7544, 983045, 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, - 93998, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0, - 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 983805, 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, 983293, + 8980, 118988, 67861, 8844, 7209, 0, 0, 4278, 128809, 0, 127947, 70821, + 9074, 4348, 0, 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, + 71345, 586, 74414, 64359, 1267, 128269, 65468, 0, 65731, 0, 72405, 3621, + 92932, 66666, 64211, 0, 6562, 12928, 983891, 1228, 65490, 11383, 0, 0, + 70343, 1714, 74406, 120751, 0, 983921, 0, 66225, 128608, 70867, 42660, + 11436, 2070, 64, 120694, 0, 10291, 10323, 2826, 113809, 917629, 0, 42008, + 9708, 42710, 0, 42011, 41999, 92164, 12206, 5839, 1702, 1240, 74065, + 6286, 9689, 983969, 65833, 77848, 0, 1765, 0, 0, 65588, 0, 0, 0, 8401, + 983924, 42014, 0, 7030, 194704, 10479, 64959, 2852, 0, 0, 0, 70819, + 128586, 917951, 6963, 0, 12667, 64540, 74786, 10147, 12935, 127568, + 126483, 127782, 0, 0, 78757, 0, 113815, 128968, 0, 9994, 12467, 2864, + 64719, 1148, 10435, 11462, 41675, 7084, 2765, 78466, 43382, 0, 120719, + 128188, 92516, 66662, 0, 78133, 9364, 194685, 74416, 127797, 0, 77988, + 263, 10449, 41288, 0, 41839, 78387, 983742, 77986, 129140, 6931, 69722, + 64355, 7177, 70105, 0, 0, 0, 4262, 10285, 10722, 42020, 126575, 6806, + 6992, 42019, 0, 41290, 983716, 750, 0, 71304, 10163, 63913, 71300, 7032, + 5954, 64931, 4314, 128600, 198, 68453, 730, 120094, 63907, 77993, 70818, + 13165, 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938, + 70026, 92637, 2097, 66246, 120560, 70823, 194990, 983604, 3892, 68632, + 69642, 6712, 66045, 41470, 64805, 0, 983213, 128215, 64801, 0, 497, + 12100, 5953, 92667, 7796, 69669, 43254, 73831, 0, 10293, 5952, 1281, + 43747, 0, 0, 10677, 604, 41097, 9182, 1859, 0, 92603, 3425, 127488, 0, + 2836, 0, 0, 9707, 113718, 43202, 0, 0, 65199, 1738, 128311, 67707, 2832, + 92702, 9670, 11101, 0, 66374, 917956, 0, 2822, 68122, 4436, 92519, + 983081, 73752, 0, 64872, 92340, 1331, 0, 0, 0, 12708, 917954, 5090, 5089, + 127977, 983561, 119109, 0, 70826, 319, 118847, 43479, 9477, 0, 0, 5087, + 92325, 7640, 96, 5086, 0, 92379, 0, 5085, 64286, 92665, 113717, 41422, + 119617, 119901, 42356, 3772, 119042, 0, 5011, 0, 0, 126587, 0, 127165, + 127241, 6677, 7601, 0, 591, 64419, 118953, 92262, 0, 70799, 70084, 0, + 10939, 6106, 6933, 41271, 6760, 71343, 4534, 41270, 128876, 67138, 65574, + 194947, 9224, 67140, 3671, 8976, 67139, 0, 41275, 6372, 128084, 55261, + 7963, 6371, 0, 568, 92368, 41273, 983730, 74531, 6728, 0, 9715, 0, 8258, + 11753, 74820, 0, 9602, 118919, 42, 11191, 43688, 68243, 0, 7458, 0, 0, + 65385, 67135, 67134, 11958, 11165, 917822, 125087, 6254, 42721, 66336, + 8045, 11550, 0, 67132, 67131, 42858, 11789, 65868, 5557, 10133, 9737, + 13109, 0, 9467, 5558, 8878, 43844, 195036, 7451, 6706, 10146, 0, 9086, + 64566, 0, 64584, 7437, 7454, 12594, 73749, 68362, 4546, 7731, 0, 70048, + 74243, 125092, 3805, 0, 67128, 44001, 41008, 128052, 6307, 19949, 67129, + 7544, 983045, 43469, 0, 0, 10152, 64422, 65091, 67124, 7602, 64729, 0, + 43521, 0, 42302, 43711, 43523, 41447, 5559, 68483, 8704, 2397, 5556, 0, + 0, 0, 9011, 9630, 11166, 0, 93998, 5506, 92498, 1911, 66652, 67686, 9961, + 8845, 66698, 68325, 10792, 8889, 0, 2098, 0, 64751, 128360, 66622, + 983122, 0, 74364, 113708, 129152, 983805, 42909, 7552, 128622, 0, 65384, + 7223, 4559, 93015, 1956, 43138, 7024, 65728, 43490, 1210, 195077, 65175, + 10184, 43140, 43654, 0, 0, 125045, 38, 8533, 66669, 119124, 983293, 983792, 0, 4357, 0, 119837, 917863, 74233, 9967, 78884, 42860, 119838, - 10941, 65721, 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224, - 92267, 128536, 11974, 92213, 42772, 127518, 11650, 5013, 92663, 126583, - 66210, 118914, 6613, 92476, 0, 43819, 983770, 0, 64714, 0, 0, 12162, - 12120, 43476, 983766, 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, 983043, 74439, 2039, 0, 7446, 1684, 63979, 10974, - 458, 120620, 0, 69791, 127161, 11916, 65016, 0, 69671, 42115, 983133, - 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, 13080, 0, 65808, 6610, - 6030, 8059, 7508, 13131, 0, 983431, 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, 983592, 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, 93987, 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, - 78249, 0, 128551, 128809, 9881, 43115, 65757, 3415, 119131, 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, 983556, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, - 11437, 43741, 92163, 120700, 63967, 983483, 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, 74013, - 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, 983715, 5508, 0, 0, 0, 10801, 69876, 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, 74409, 41611, 4642, 66574, 11556, 917982, 0, 78857, 42089, - 78855, 9008, 0, 126592, 195096, 42079, 917981, 77924, 42513, 77927, - 42842, 73985, 65285, 118974, 127003, 983702, 0, 0, 0, 11335, 64069, - 42093, 3920, 0, 0, 0, 0, 4580, 41967, 983732, 64384, 92167, 93984, 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, 983176, 0, 0, 0, 9597, 42099, 43172, 983376, 10117, 983169, - 92297, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0, - 127517, 0, 8964, 65676, 7775, 0, 41948, 0, 0, 0, 41942, 65449, 3160, - 10081, 13226, 42121, 42475, 42663, 128210, 41766, 119114, 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, 983134, 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, 69930, - 2691, 0, 65553, 7933, 5562, 69800, 128265, 41262, 128146, 64421, 74846, - 41251, 0, 0, 3979, 0, 0, 74813, 983739, 0, 0, 0, 92524, 41266, 0, 66566, - 128836, 10585, 65741, 41737, 9574, 2666, 0, 41738, 831, 419, 13126, - 10716, 0, 42822, 0, 6434, 0, 6939, 7766, 6432, 128106, 69932, 916, 769, - 41742, 11968, 74805, 6433, 5563, 547, 1943, 6439, 5560, 4994, 487, - 126537, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, 8716, 1595, 41615, - 0, 0, 74260, 0, 42854, 43219, 128709, 983460, 12185, 128879, 70072, - 68355, 68357, 0, 42856, 8634, 0, 983397, 4209, 120702, 0, 65879, 41538, - 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 983464, 5678, 11821, 0, - 6711, 460, 0, 0, 983461, 0, 120747, 0, 0, 78050, 119022, 0, 983462, 0, - 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, 128079, - 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 983392, 0, 78119, 1549, 0, 0, - 120398, 5682, 6206, 8670, 10256, 5680, 69935, 10001, 128512, 69768, 1449, - 10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 68030, 5567, + 10941, 65721, 6962, 0, 0, 113808, 0, 11014, 120126, 8942, 12000, 69224, + 92267, 128536, 11974, 67363, 42772, 42650, 11650, 5013, 92663, 126583, + 66210, 118914, 6613, 92476, 0, 11193, 983770, 0, 64714, 0, 70802, 12162, + 12120, 43476, 983766, 11024, 74811, 66228, 10563, 92954, 127196, 43522, + 2462, 92955, 1837, 125086, 63972, 6957, 0, 113820, 4952, 65718, 64405, + 5504, 65720, 65714, 65715, 65716, 0, 127005, 127119, 3109, 63975, 74028, + 127213, 8107, 67154, 1127, 455, 0, 63968, 127835, 3483, 119593, 1989, 0, + 69678, 9104, 3503, 65375, 68300, 6694, 42633, 1864, 0, 74306, 41446, + 2540, 7736, 917916, 74064, 128601, 10521, 70786, 42173, 9705, 74124, + 8604, 6955, 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106, + 127862, 1403, 125053, 1347, 9631, 74444, 983753, 0, 92951, 0, 8640, 0, + 258, 1654, 0, 0, 0, 43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, + 8549, 10861, 128430, 63976, 70377, 68623, 67082, 67081, 41391, 67084, + 917903, 376, 6987, 9221, 0, 0, 8823, 128697, 12943, 65185, 41869, 12619, + 0, 10154, 983043, 74439, 2039, 0, 7446, 1684, 63979, 10974, 458, 120620, + 0, 69791, 127161, 11916, 65016, 0, 69671, 42115, 983133, 12288, 78057, + 67080, 1493, 42111, 7553, 4097, 128199, 13080, 0, 65808, 6610, 6030, + 8059, 7508, 13131, 67074, 67073, 0, 8794, 41278, 41629, 12154, 128192, + 41277, 64658, 0, 64380, 6625, 42911, 19904, 0, 0, 71193, 65371, 7078, 0, + 833, 0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0, 19916, 6913, 933, + 1341, 9842, 6720, 65744, 71200, 983592, 128295, 0, 7405, 10105, 65810, 0, + 41632, 7493, 55290, 92890, 41622, 0, 0, 119556, 74584, 7632, 9716, 19954, + 9805, 5990, 900, 0, 63957, 119638, 0, 3612, 0, 64376, 93987, 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, + 43077, 63952, 8425, 3602, 8328, 11764, 118894, 983750, 65065, 41183, + 12907, 10271, 10287, 684, 43525, 0, 2854, 119586, 4592, 65755, 983276, + 67120, 11963, 43620, 67117, 78249, 67123, 67122, 67121, 9881, 43115, + 65757, 3415, 69677, 67116, 8648, 128377, 6741, 43047, 917970, 13180, + 78077, 418, 120653, 64495, 10295, 10327, 10391, 41752, 66846, 8641, + 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849, 41751, 69776, 8941, + 983556, 4554, 66892, 9023, 11685, 0, 9928, 67109, 66865, 11437, 43741, + 67113, 67112, 63967, 983483, 41206, 12624, 9049, 41185, 43166, 0, 8159, + 92619, 11686, 78544, 65224, 4565, 4655, 119553, 129090, 92183, 64523, + 10343, 10407, 92764, 66671, 11466, 0, 128003, 42890, 74013, 12050, 68201, + 2860, 0, 0, 70828, 42792, 5743, 10424, 12065, 42872, 0, 92342, 67103, + 8875, 0, 67102, 67105, 7531, 12847, 2413, 118917, 67404, 962, 0, 12855, + 41196, 42564, 0, 1582, 983715, 5508, 0, 0, 0, 10801, 69876, 92354, + 119207, 7173, 496, 10439, 4313, 64607, 69638, 7860, 0, 906, 42793, 2842, + 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153, 92173, 64788, 127007, + 8054, 9174, 67087, 67086, 9964, 67096, 41611, 4642, 66574, 11556, 42512, + 0, 78857, 42089, 74613, 9008, 0, 126592, 195096, 42079, 917981, 77924, + 42513, 77927, 42842, 73985, 65285, 68338, 127003, 983702, 0, 194761, + 983590, 11335, 64069, 42093, 3920, 0, 0, 11110, 0, 4580, 41967, 129043, + 64384, 92167, 93984, 3021, 42004, 0, 983372, 42317, 41998, 0, 6946, + 194755, 92967, 0, 128193, 65204, 0, 68113, 42690, 9880, 42010, 74824, + 64589, 10111, 64875, 127880, 68399, 43998, 11360, 0, 74182, 128648, + 92633, 42149, 0, 68508, 917993, 64941, 77919, 120421, 128077, 0, 55247, + 4110, 66005, 6959, 10929, 42907, 0, 66703, 77921, 8617, 41982, 6025, + 69242, 983176, 194854, 125139, 0, 9597, 42099, 43172, 983376, 10117, + 983169, 92297, 41636, 194889, 73738, 120681, 8301, 0, 0, 187, 128237, + 65669, 128339, 4963, 0, 127517, 0, 8964, 65676, 7775, 0, 41948, 125003, + 0, 0, 41942, 65449, 3160, 10081, 13226, 42121, 42475, 42663, 128210, + 41766, 119114, 65882, 78849, 41760, 1189, 905, 480, 10985, 41733, 67859, + 9629, 6742, 1745, 43625, 73835, 7888, 0, 3980, 70373, 42656, 41507, 8806, + 7023, 0, 74279, 9447, 78651, 7867, 69218, 6236, 983134, 0, 10505, 129135, + 12851, 118948, 348, 5474, 128843, 3103, 0, 41753, 71109, 128604, 0, + 78844, 78845, 41739, 78843, 42515, 10931, 41756, 43347, 42560, 5391, + 41746, 119147, 92591, 41259, 5561, 69930, 2691, 92941, 65553, 7933, 5562, + 69800, 128265, 41262, 128146, 64421, 74846, 41251, 0, 0, 3979, 71248, 0, + 68331, 917912, 0, 0, 0, 74633, 41266, 0, 66566, 128836, 10585, 65741, + 41737, 9574, 2666, 0, 41738, 831, 419, 13126, 10716, 0, 42822, 0, 6434, + 74857, 6939, 7766, 6432, 128106, 69932, 916, 769, 41742, 11968, 74805, + 6433, 5563, 547, 1943, 6439, 5560, 4994, 487, 126537, 4497, 3754, 127056, + 120424, 9039, 0, 41776, 0, 8716, 1595, 41615, 0, 0, 74260, 74860, 42854, + 43219, 128709, 129083, 12185, 113810, 70072, 68355, 68357, 68421, 42856, + 8634, 0, 119988, 4209, 120702, 78046, 65879, 41538, 65612, 127543, 669, + 5679, 0, 69786, 92540, 0, 70445, 5678, 11821, 0, 6711, 460, 0, 0, 983461, + 70114, 120747, 0, 128412, 78050, 119022, 0, 983462, 983174, 7782, 9044, + 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, 127017, 5792, 0, 128319, + 78501, 0, 2933, 12244, 0, 5683, 917896, 0, 78119, 1549, 0, 0, 120398, + 5682, 6206, 8670, 10256, 5680, 69935, 10001, 67237, 69768, 1449, 10241, + 78290, 119587, 194891, 10552, 64342, 41922, 70330, 8584, 68030, 5567, 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983256, 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, 119903, 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, 71309, 0, 9889, 68184, 42806, 0, 7256, 0, 0, - 1667, 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, - 3610, 983199, 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, - 10875, 128662, 5477, 65692, 0, 128532, 120397, 12896, 10456, 917954, 0, - 3874, 0, 0, 983619, 120331, 0, 0, 65603, 0, 65687, 0, 41038, 74009, - 119570, 42239, 8536, 78740, 78324, 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, 983213, 92261, 6370, 0, 7827, - 68441, 6965, 0, 0, 13201, 128205, 69896, 0, 74382, 73781, 7918, 73988, 0, - 0, 917884, 1728, 0, 43764, 178, 12972, 92679, 0, 917887, 92563, 983381, - 0, 78327, 120405, 65690, 0, 0, 119054, 0, 9252, 917889, 4652, 68371, 0, - 0, 0, 13065, 9923, 10806, 0, 11763, 70016, 120688, 6723, 78187, 0, 6993, - 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983315, 69911, 11910, + 120561, 10361, 10425, 65697, 65698, 65699, 0, 66598, 110592, 64664, + 10647, 78702, 78703, 78690, 457, 78502, 65701, 1934, 43006, 119903, 8802, + 78710, 65130, 11747, 78709, 6087, 78705, 78716, 41757, 78711, 8043, 8950, + 65694, 64485, 43534, 10457, 0, 11961, 78725, 66850, 78723, 78720, 78721, + 0, 65515, 9499, 10035, 13069, 71309, 0, 9889, 68184, 42806, 0, 7256, 0, + 983179, 1667, 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, + 8101, 3610, 68420, 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, + 64549, 10875, 125052, 5477, 65692, 0, 128532, 120397, 12896, 10456, + 68298, 0, 3874, 0, 0, 983619, 120331, 0, 113665, 65603, 0, 65687, 0, + 41038, 74009, 9207, 42239, 8536, 78740, 78324, 78726, 74432, 724, 0, + 1455, 78749, 7183, 64583, 78747, 68443, 4175, 78741, 43614, 69801, 939, + 0, 43520, 68613, 74569, 917958, 0, 70168, 78764, 78760, 10788, 6088, + 78759, 78755, 190, 0, 12593, 0, 8188, 64408, 0, 4417, 128615, 92261, + 6370, 125128, 7827, 68441, 6965, 128581, 128868, 13201, 128205, 69896, + 78868, 74382, 11841, 7918, 73988, 0, 113668, 917884, 1728, 0, 43764, 178, + 12972, 74620, 113671, 71103, 11168, 983381, 113672, 78327, 119904, 65690, + 0, 71107, 119054, 0, 9252, 917889, 4652, 68371, 0, 917891, 74070, 13065, + 9923, 10806, 0, 11763, 70016, 120688, 6723, 78187, 0, 6993, 71044, 0, + 8333, 0, 0, 11390, 0, 74464, 0, 92320, 74080, 983315, 69911, 11910, 92559, 8278, 8963, 4034, 128560, 0, 65344, 120517, 41747, 0, 0, 8677, 0, - 12707, 9350, 66037, 128180, 8836, 12315, 12747, 8300, 983750, 0, 7491, + 12707, 9350, 66037, 128180, 8836, 12315, 12747, 8300, 194562, 0, 7491, 8856, 71361, 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, 983072, 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, 983100, 41257, 41900, 8675, - 10700, 8805, 1742, 0, 9333, 8202, 127750, 0, 983197, 0, 0, 73882, 499, - 983049, 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 983104, 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, 65029, 65024, 0, 12473, 6534, 0, 99, 98, 97, 120571, 67584, - 4049, 74163, 127065, 7090, 0, 7892, 917969, 10777, 917803, 65310, 65562, - 66599, 66722, 0, 8039, 3363, 66594, 43434, 0, 0, 12596, 66595, 42258, - 42570, 5593, 119148, 120711, 92425, 10100, 6061, 64854, 119, 118, 117, - 116, 12998, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103, - 102, 101, 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, 77931, 1536, + 2592, 12853, 43269, 7263, 120244, 6536, 120238, 71891, 65516, 12321, + 120391, 120388, 55287, 10007, 120246, 9588, 68494, 1596, 120383, 41994, + 65801, 128808, 6838, 3561, 0, 0, 10613, 6697, 12805, 41928, 40981, 10804, + 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, 65940, 43259, 126586, 6107, + 0, 119177, 77941, 78401, 128641, 11783, 335, 120227, 64689, 438, 4510, + 5765, 8721, 119570, 119227, 6092, 12840, 43112, 8876, 120231, 8096, + 10284, 128515, 0, 0, 10380, 8733, 10316, 70121, 41602, 0, 92308, 74831, + 917901, 0, 68482, 65399, 0, 64591, 42405, 0, 120820, 843, 11541, 128326, + 70321, 2065, 41935, 74496, 41902, 0, 983304, 215, 41258, 77875, 43159, + 1953, 9579, 41938, 1256, 3910, 9407, 6242, 0, 983100, 41257, 41900, 8675, + 10700, 8805, 1742, 113722, 9333, 8202, 72399, 0, 983197, 127252, 0, + 73882, 499, 983049, 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 983104, + 0, 11967, 1775, 125006, 0, 11118, 0, 128009, 9458, 0, 6470, 9180, 120380, + 43176, 0, 0, 42782, 0, 124999, 983135, 128309, 73849, 120669, 9414, + 74647, 73782, 73969, 565, 42484, 5794, 201, 2662, 42292, 0, 8254, 0, + 10975, 43518, 120625, 74763, 1022, 4108, 3880, 74247, 0, 0, 92263, + 917980, 7507, 983118, 43149, 71059, 65031, 7961, 1636, 0, 65029, 65024, + 119099, 12473, 6534, 120633, 99, 98, 97, 68226, 67584, 4049, 74163, + 127065, 7090, 0, 7892, 917969, 10777, 917803, 65310, 65562, 66599, 66722, + 194955, 8039, 3363, 66594, 43434, 0, 71191, 12596, 66595, 42258, 42570, + 5593, 119148, 120711, 92425, 10100, 6061, 64854, 119, 118, 117, 116, + 12998, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, 112, 103, 102, + 101, 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, 67713, 1536, 64093, 73970, 77930, 127157, 0, 6020, 12716, 127112, 12744, 475, 120394, - 13266, 127813, 127111, 0, 73926, 0, 10645, 1212, 6543, 983307, 8134, - 128028, 2913, 73870, 127113, 1866, 983229, 195095, 0, 8923, 1645, 12059, - 66585, 71297, 3196, 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859, - 7916, 9861, 9860, 5258, 1882, 1892, 6731, 10882, 405, 11454, 73911, 0, - 128781, 41169, 8939, 41245, 0, 41170, 1454, 11369, 6477, 12157, 0, 0, 0, - 41172, 7855, 0, 0, 10480, 0, 0, 77936, 8264, 12610, 983308, 645, 126616, - 7609, 40973, 69943, 73833, 69948, 5824, 984, 77918, 10688, 5851, 0, 7729, - 73982, 120518, 0, 195086, 43369, 0, 128140, 68415, 983093, 4538, 120406, - 43141, 0, 983210, 74214, 73886, 0, 0, 118902, 43005, 78448, 9552, 0, 0, - 983159, 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, 983490, 119566, 0, 12808, - 12183, 6145, 118955, 64929, 92433, 0, 983193, 43186, 42509, 0, 3922, - 9187, 983614, 0, 10191, 119057, 11752, 3353, 9358, 0, 71366, 66680, - 120090, 8248, 7931, 8558, 9795, 68380, 983297, 0, 120082, 120081, 120084, - 41027, 120086, 0, 120088, 7366, 7019, 120073, 0, 11751, 120078, 78294, - 64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0, - 43154, 41029, 0, 11332, 65380, 7728, 94077, 11294, 0, 66665, 7851, 0, - 8375, 8699, 0, 42524, 0, 9085, 94041, 7504, 9327, 6160, 128095, 983864, - 0, 8088, 0, 74012, 92500, 0, 4439, 6926, 983047, 12924, 128227, 42369, + 13266, 127813, 127111, 78842, 73926, 66291, 10645, 1212, 6543, 983307, + 8134, 128028, 2913, 73870, 127113, 1866, 983229, 71892, 0, 8923, 1645, + 12059, 66585, 71297, 3196, 72404, 194827, 5935, 1250, 127066, 8174, 9787, + 6733, 9859, 7916, 9861, 9860, 5258, 1882, 1892, 6731, 10882, 405, 11454, + 73911, 113787, 92529, 41169, 8939, 41245, 0, 41170, 1454, 11369, 6477, + 12157, 0, 0, 0, 41172, 7855, 0, 0, 10480, 43258, 917819, 77936, 8264, + 12610, 983308, 645, 126616, 7609, 40973, 69943, 73833, 69948, 5824, 984, + 77918, 10688, 5851, 0, 7729, 73982, 120518, 0, 195086, 43369, 0, 128140, + 68415, 92644, 4538, 93978, 43141, 0, 983210, 74214, 73886, 67709, 917599, + 71918, 43005, 78448, 9552, 0, 70129, 129173, 12997, 0, 0, 0, 0, 2381, + 12883, 10994, 10529, 41906, 0, 74618, 0, 12425, 10661, 10856, 9614, 2428, + 41478, 8582, 10064, 73930, 0, 70437, 0, 64896, 119162, 1952, 92181, 8455, + 10082, 11575, 129062, 119566, 128093, 12808, 12183, 6145, 118955, 64929, + 92433, 71916, 983193, 43186, 42509, 0, 3922, 9187, 126513, 0, 10191, + 119057, 11752, 3353, 9358, 983460, 71366, 66680, 120090, 8248, 7931, + 8558, 9795, 68380, 983297, 0, 120082, 120081, 120084, 41027, 120086, 0, + 120088, 7366, 7019, 70378, 0, 11751, 120078, 78294, 64657, 8657, 120048, + 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 113711, 43154, 41029, 0, + 11332, 65380, 7728, 94077, 11294, 0, 66665, 7851, 0, 8375, 8699, 127949, + 42524, 68419, 9085, 94041, 7504, 9327, 6160, 128095, 983864, 194929, + 8088, 128937, 74012, 66562, 0, 4439, 6926, 72423, 12924, 128227, 42369, 4350, 65491, 65145, 9041, 43559, 64577, 10826, 0, 11296, 983283, 0, 0, - 65825, 9577, 68199, 0, 64670, 983121, 78056, 6793, 11295, 0, 78053, - 73872, 0, 0, 10902, 0, 0, 78070, 78068, 10472, 2995, 0, 0, 64682, 2371, - 78069, 120808, 259, 1009, 92171, 2402, 2333, 6440, 194741, 0, 65125, - 41244, 0, 13271, 9103, 2278, 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178, - 127070, 41261, 119362, 43640, 8613, 0, 94049, 6736, 195092, 41492, 12005, - 69927, 0, 1890, 120056, 0, 0, 0, 7293, 7991, 0, 10578, 0, 78076, 194738, - 78077, 69928, 0, 78800, 92653, 64445, 42668, 6635, 0, 6164, 65170, 0, 0, - 7676, 11664, 0, 983658, 69707, 0, 118812, 0, 0, 128045, 9175, 11925, - 78045, 9088, 0, 64545, 1396, 0, 7546, 3847, 127177, 127835, 4985, 13288, - 672, 8098, 43196, 194746, 983096, 128126, 42655, 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, 67972, - 0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250, 43991, 69687, 66649, - 9510, 66237, 983302, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707, - 917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882, 6686, - 119584, 11613, 120772, 42754, 0, 983306, 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, 983300, 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, 2284, 64481, - 78614, 66013, 41956, 43455, 126995, 0, 0, 0, 42273, 5819, 0, 917556, 0, + 65825, 9577, 68199, 983391, 64670, 983121, 78056, 6793, 11295, 70409, + 78053, 73872, 78055, 119993, 10902, 0, 0, 78070, 11200, 10472, 2995, 0, + 120138, 64682, 2371, 78069, 120808, 259, 1009, 70405, 2402, 2333, 6440, + 194741, 113757, 65125, 41244, 70407, 13271, 9103, 2278, 0, 194728, 0, 0, + 10219, 0, 194740, 0, 67718, 43178, 127070, 41261, 119362, 43640, 8613, 0, + 94049, 6736, 195092, 41492, 12005, 69927, 127068, 1890, 120056, 0, + 128450, 0, 7293, 7991, 74052, 10578, 917998, 78076, 128620, 67368, 69928, + 71850, 78800, 92653, 64445, 42668, 6635, 128308, 6164, 65170, 0, 0, 7676, + 11664, 0, 93025, 69707, 93022, 118812, 0, 71096, 128045, 9175, 11925, + 78045, 9088, 119145, 64545, 1396, 0, 7546, 3847, 71088, 93037, 4985, + 13288, 672, 8098, 43196, 194746, 120723, 128126, 42655, 74043, 65072, + 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0, 128371, + 12622, 0, 124948, 0, 128858, 127139, 13310, 773, 19933, 1539, 0, 126983, + 42731, 67972, 0, 71066, 983200, 3051, 5862, 7823, 92478, 92746, 120411, + 3250, 43991, 69687, 66649, 9510, 66237, 983302, 0, 41066, 64673, 917963, + 917964, 128636, 3505, 8707, 917968, 6725, 128013, 917971, 92314, 3471, + 66391, 5479, 882, 6686, 119584, 11613, 120772, 42754, 74608, 983306, + 92696, 0, 0, 0, 128523, 3225, 917996, 4433, 41156, 43973, 43173, 1443, + 4381, 0, 0, 10926, 11756, 11757, 64879, 917949, 195053, 127848, 13227, + 120320, 10021, 5160, 1387, 0, 917953, 41418, 128933, 65914, 6721, 217, + 917955, 917960, 917961, 10443, 10789, 41158, 119257, 4274, 11143, 41483, + 0, 41250, 128904, 42179, 128375, 5931, 11744, 11215, 74446, 41252, 66682, + 0, 119637, 41249, 1366, 64635, 65047, 12466, 983456, 0, 4397, 128037, + 128336, 41296, 9545, 41291, 128049, 0, 41485, 3511, 41282, 5923, 10400, + 0, 128818, 760, 0, 12088, 5786, 68252, 42256, 119869, 67145, 417, 41474, + 119562, 41565, 0, 5934, 74572, 66583, 119231, 64877, 2284, 64481, 78614, + 66013, 41956, 43455, 67240, 194656, 0, 0, 42273, 5819, 0, 917556, 0, 126643, 0, 65910, 127747, 10246, 120816, 65785, 1237, 10274, 4552, - 119576, 0, 0, 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 69845, - 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, 983447, 127794, 0, 43811, 9330, 120596, 7222, - 10283, 10315, 10379, 4996, 983782, 13281, 66517, 7865, 10087, 78343, 0, - 78347, 0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 7414, 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, 73900, 0, 4315, 12644, 127516, - 77937, 43639, 43343, 78777, 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, 119967, + 119576, 983863, 0, 1375, 66705, 43573, 65260, 3329, 0, 42811, 10312, + 69845, 120794, 7840, 0, 43630, 10252, 119242, 128104, 43185, 0, 4396, + 195051, 119880, 10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, + 120472, 6072, 43025, 10299, 128436, 0, 120608, 66326, 67412, 92952, 0, + 43811, 9330, 120596, 7222, 10283, 10315, 10379, 4996, 127902, 13281, + 66517, 7865, 10087, 78343, 0, 43324, 0, 0, 7565, 66363, 12952, 64806, + 43180, 77928, 7414, 77929, 43982, 74288, 622, 74023, 885, 43405, 1602, 0, + 983731, 852, 0, 12160, 120212, 10212, 65435, 129092, 12071, 9609, 12156, + 917983, 917984, 43586, 11035, 10411, 917988, 10255, 6710, 10279, 4194, + 10375, 43853, 128599, 4315, 12644, 127516, 77937, 43639, 43343, 67408, + 128945, 11501, 41177, 128689, 128866, 43431, 127097, 92413, 8715, 0, + 41179, 983356, 43313, 120230, 41176, 0, 994, 0, 8452, 120505, 73966, + 66890, 70812, 5921, 0, 2597, 0, 5922, 118903, 66873, 4186, 92531, 119967, 127105, 6718, 0, 4406, 74601, 8480, 9192, 9747, 126530, 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, 4301, 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, 94013, 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, 78460, 11982, 0, 0, 0, 128016, 64484, 0, 41167, 0, 41735, - 94019, 717, 10754, 0, 0, 127979, 0, 63767, 0, 1780, 6936, 0, 92254, 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, 7411, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 983221, 7638, - 41642, 42764, 0, 43109, 7637, 5752, 74037, 0, 73832, 128827, 120635, - 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 120798, 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, 128217, 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, 983172, 64728, 0, 78673, 78674, 1659, 919, 42784, 1671, - 195089, 6069, 9219, 128558, 1661, 13120, 63784, 69819, 10140, 9713, + 6756, 125104, 128646, 8363, 0, 2993, 7772, 3916, 4301, 120494, 1141, + 42407, 7417, 718, 7572, 973, 119599, 120718, 3235, 2415, 43164, 0, 8018, + 42333, 74756, 10675, 6937, 42486, 43381, 65390, 10067, 0, 1202, 0, + 983910, 65863, 0, 68484, 94013, 78182, 64542, 3260, 73829, 65388, 9945, + 8419, 78042, 6738, 0, 43681, 69728, 2059, 92422, 0, 55237, 1431, 983226, + 66565, 10821, 0, 12804, 128076, 8229, 1235, 3307, 11472, 78089, 78184, + 4544, 71228, 0, 917975, 1740, 78097, 8758, 985, 12872, 64511, 78094, + 12068, 78102, 71226, 10141, 0, 63761, 8785, 4476, 78109, 63763, 12655, + 8907, 9147, 78106, 78103, 78104, 0, 119572, 10665, 64616, 41572, 127979, + 127160, 0, 41573, 0, 3931, 120295, 74143, 0, 0, 983743, 78460, 11982, 0, + 0, 128381, 92712, 64484, 0, 41167, 0, 41735, 94019, 717, 10754, 0, 0, + 72413, 92935, 63767, 0, 1780, 6936, 0, 92254, 819, 10611, 9694, 126978, + 0, 0, 0, 129069, 8343, 8342, 8345, 8344, 6578, 7009, 7523, 6922, 8348, + 8347, 7525, 3346, 8339, 128165, 128208, 575, 268, 78111, 8563, 5754, + 120343, 41541, 65565, 8336, 5936, 7290, 78117, 8337, 8341, 308, 11388, + 7522, 120721, 78123, 65466, 11090, 6953, 0, 120346, 128939, 78132, 5926, + 68250, 78130, 78126, 78127, 78124, 78125, 9038, 7887, 43456, 7830, 11651, + 13093, 64002, 983559, 65742, 12874, 119597, 11590, 0, 74048, 67379, 8595, + 9835, 917947, 43703, 13097, 0, 64643, 13283, 12697, 0, 12381, 3488, 5933, + 10033, 71101, 66241, 65570, 0, 12297, 71212, 1955, 127970, 5349, 42538, + 0, 0, 7411, 9462, 917554, 0, 128465, 0, 42736, 0, 5756, 128324, 7638, + 41642, 42764, 0, 43109, 7637, 5752, 11213, 0, 73832, 128827, 120635, + 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 120798, 291, 0, 983221, + 2027, 66230, 10080, 78136, 10403, 70869, 4640, 64713, 10224, 120429, + 11183, 120431, 120430, 0, 128351, 127489, 127138, 0, 92499, 0, 119094, + 74213, 7824, 0, 0, 41274, 5778, 6302, 0, 0, 12680, 119130, 1417, 67242, + 93041, 9452, 0, 74393, 11552, 0, 127855, 128217, 65391, 128614, 10172, + 65453, 63789, 41264, 78658, 6426, 4641, 9179, 64819, 55278, 41255, 42036, + 41469, 41269, 120412, 41267, 4646, 67759, 865, 42034, 78274, 78273, 4645, + 42033, 78270, 127982, 983172, 64728, 0, 78673, 78674, 1659, 919, 42784, + 1671, 195089, 6069, 9219, 128558, 1661, 13120, 63784, 69819, 10140, 9713, 119143, 0, 0, 94050, 2306, 10485, 118943, 6068, 10612, 195099, 119567, - 195101, 92561, 41462, 120470, 195079, 5422, 128234, 983629, 0, 0, 10229, - 10635, 826, 128081, 195082, 195085, 195084, 195087, 6483, 92211, 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, 983703, - 43258, 119116, 127873, 13157, 0, 917544, 3570, 0, 7443, 0, 44006, 6997, - 68004, 126631, 7879, 8739, 11075, 0, 65216, 0, 69795, 2593, 8463, 7810, - 917862, 7839, 119913, 78806, 119912, 9691, 4411, 78802, 0, 0, 43442, - 69851, 65254, 10066, 983889, 0, 0, 0, 13061, 8016, 78687, 19932, 64831, - 0, 119923, 12390, 119171, 1634, 68115, 0, 11056, 983574, 119925, 0, - 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, 171, 5941, 12452, - 194709, 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969, - 120767, 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, 68031, - 118838, 0, 12654, 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, - 8892, 0, 92339, 0, 983073, 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, 128543, - 1172, 69799, 6786, 43601, 120476, 74126, 5603, 0, 4473, 0, 194823, 0, - 65347, 65346, 65345, 0, 127384, 5347, 69802, 983632, 73868, 118944, - 10588, 0, 0, 63755, 0, 5343, 78422, 120661, 4555, 5341, 0, 70071, 128670, - 5351, 78675, 43104, 65244, 917892, 64541, 42519, 74472, 0, 0, 74765, - 917888, 127510, 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, - 126635, 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, 68011, 8847, 0, - 65876, 5535, 8329, 74590, 983208, 92609, 0, 0, 3127, 2595, 65713, 42013, - 983858, 5607, 41089, 0, 0, 74256, 2665, 11304, 43751, 74200, 4970, 8764, - 120459, 8934, 92726, 41566, 4492, 0, 65011, 41090, 0, 0, 1188, 7254, - 1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 68019, 3572, 10023, 4959, - 13079, 0, 983276, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, - 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 983309, 972, - 41453, 983442, 0, 73883, 68022, 73945, 983735, 2288, 19955, 9538, 0, - 69807, 0, 0, 0, 0, 11396, 983440, 11019, 0, 0, 0, 68020, 41078, 71365, - 261, 5927, 7791, 0, 7362, 0, 10696, 0, 6073, 9838, 118920, 0, 6075, - 93995, 282, 126510, 6437, 74078, 128000, 9801, 0, 74177, 0, 0, 3474, - 118787, 0, 120655, 6081, 0, 78874, 74076, 78879, 0, 0, 0, 0, 0, 8751, - 11499, 120273, 7816, 12636, 4665, 12628, 4670, 92608, 120272, 68017, - 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, 64428, 120262, 120263, 120264, 1017, - 66600, 523, 505, 1447, 74436, 0, 0, 0, 8608, 42789, 120613, 128704, 0, - 73855, 11307, 66707, 917871, 127751, 11745, 7919, 0, 1641, 0, 0, 8966, 0, - 0, 5908, 0, 0, 6744, 128355, 1699, 69861, 74843, 917933, 0, 6306, 10169, - 71324, 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, - 983610, 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, 983156, 0, 6829, 5225, 128807, 127385, 0, - 0, 119615, 0, 74793, 5626, 73807, 11771, 74075, 127236, 128019, 42614, - 5353, 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 69942, 6952, - 983272, 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, 8786, 0, 203, 0, 0, 0, 0, - 78350, 0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, - 126464, 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, 126574, 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, 71318, 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, 983970, 119589, 1969, 2384, 8097, 917864, 7413, 68012, 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, 983967, - 94005, 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, 68009, 0, 65507, 2447, 0, 0, 128042, 126545, 983137, 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, 68008, 11785, 7412, - 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7103, 128293, 7102, - 74588, 120748, 3140, 128854, 7960, 43271, 0, 12518, 10909, 127508, 1428, - 12472, 0, 69864, 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, 68021, 65919, 0, 6695, 720, 324, 0, - 0, 43406, 983736, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0, 64041, - 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 0, 78861, 119134, 0, 0, - 5204, 74774, 43404, 11835, 0, 3995, 68360, 65608, 3714, 92190, 0, 0, - 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, 8130, 8672, 10845, - 11964, 0, 983185, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 126629, 0, 468, - 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 983163, 12280, 0, 540, - 74564, 119017, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, - 0, 64684, 126992, 3359, 7800, 69934, 65177, 6226, 353, 12396, 0, 119612, - 64742, 128682, 120282, 0, 983450, 12412, 19941, 0, 120277, 78847, 1884, - 9481, 42418, 70059, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, - 41328, 42344, 0, 12409, 0, 4360, 127009, 9739, 128550, 69933, 73921, 0, - 42521, 8539, 983725, 0, 118986, 0, 4788, 0, 68023, 65734, 983455, 43790, - 0, 13075, 74429, 94063, 64569, 43532, 10837, 2492, 127197, 118901, 68637, - 41136, 43785, 11813, 9649, 41154, 119617, 5128, 4038, 41143, 65604, - 64859, 41592, 6771, 1648, 5435, 917837, 6734, 41343, 119848, 65439, - 12709, 6986, 92364, 68015, 0, 41349, 70021, 12581, 10374, 5175, 0, 73806, - 10254, 0, 10278, 10262, 69858, 41346, 0, 607, 0, 119852, 128846, 12923, - 10314, 10282, 65477, 10378, 120297, 40976, 8265, 0, 119834, 40975, 5840, - 42838, 0, 40978, 983897, 119840, 0, 983071, 0, 66444, 10538, 0, 2550, - 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, 5619, 65822, 126567, - 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, 983158, 12739, - 4603, 3084, 983155, 92484, 9858, 6037, 0, 3974, 78213, 10290, 983704, - 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, 0, 41032, 42388, 0, - 64700, 10011, 1445, 40961, 0, 119105, 0, 40960, 0, 194891, 0, 40963, - 64952, 10402, 0, 0, 92304, 10603, 0, 0, 983113, 0, 6714, 10083, 127069, - 194895, 78367, 127377, 0, 93963, 9073, 42585, 64302, 10704, 65030, 4787, - 0, 74829, 0, 65423, 0, 128118, 9570, 55260, 9525, 2689, 917626, 65426, 0, - 917624, 43740, 0, 40966, 917622, 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, 194596, 5836, 12358, 0, 4355, 9048, + 67705, 92561, 41462, 120470, 195079, 5422, 128234, 983629, 128611, + 126516, 10229, 10635, 826, 128081, 195082, 195085, 195084, 195087, 6483, + 92211, 1808, 7848, 113788, 8100, 78227, 71198, 78670, 13301, 78667, 9667, + 78665, 67704, 0, 11003, 9904, 0, 983919, 120690, 9144, 10921, 92992, + 78680, 9840, 65131, 78678, 71092, 10313, 0, 0, 64320, 10265, 67252, + 10962, 66904, 43008, 8945, 78683, 0, 41, 195072, 1792, 120515, 195073, + 8655, 68254, 92544, 77951, 12066, 67258, 385, 4152, 2585, 127804, 119068, + 3126, 0, 73983, 10957, 127037, 11160, 119116, 127873, 13157, 0, 917544, + 3570, 129187, 7443, 118804, 44006, 6997, 68004, 126631, 7879, 8739, + 11075, 0, 65216, 70196, 69795, 2593, 8463, 7810, 128543, 7839, 119913, + 78806, 119912, 9691, 4411, 78802, 129032, 124970, 43442, 69851, 65254, + 10066, 983889, 72419, 0, 0, 13061, 8016, 78687, 19932, 64831, 0, 113684, + 12390, 119171, 1634, 68115, 983962, 11056, 983574, 119925, 983099, 41165, + 11328, 12450, 983811, 41166, 0, 12456, 119914, 171, 5941, 12452, 194709, + 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969, 120767, + 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 125029, 5209, 297, + 5810, 8522, 8415, 119937, 78429, 78428, 7077, 2497, 128651, 960, 74156, + 6981, 92374, 12938, 4292, 78893, 74815, 10512, 0, 74814, 78875, 127505, + 78876, 2503, 73778, 1762, 69794, 2495, 78873, 5844, 68031, 118838, + 194658, 12654, 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, + 8892, 78872, 92339, 71232, 983073, 5782, 420, 129034, 917871, 43796, + 10797, 63794, 0, 0, 64814, 63796, 43861, 0, 66581, 119204, 41608, 128479, + 0, 63792, 4659, 120788, 77971, 43676, 92956, 69673, 0, 11129, 92929, 329, + 77968, 92707, 917548, 7399, 0, 41188, 13244, 67692, 42167, 7435, 78193, + 5380, 119086, 69225, 1155, 11365, 43126, 77972, 0, 65684, 0, 5601, 65192, + 42765, 63752, 0, 7987, 93055, 1172, 69799, 6786, 43601, 120476, 74126, + 5603, 0, 4473, 0, 72426, 124947, 65347, 65346, 65345, 128548, 119213, + 5347, 69802, 983632, 73868, 70852, 10588, 0, 0, 63755, 0, 5343, 78422, + 120661, 4555, 5341, 0, 70071, 128670, 5351, 78675, 43104, 65244, 917892, + 64541, 42519, 68134, 128916, 126986, 74765, 917888, 127510, 6638, 0, + 65113, 271, 74180, 65370, 8835, 65368, 12653, 65366, 42172, 41086, 65363, + 65362, 65361, 11912, 43410, 11323, 65357, 11800, 65355, 5345, 11103, + 65352, 65351, 761, 65349, 19959, 69718, 63856, 126635, 2423, 74518, + 64647, 77959, 11957, 4699, 126573, 0, 0, 0, 64605, 0, 0, 0, 4916, 0, 380, + 10958, 66563, 77955, 69773, 9773, 13167, 12918, 41096, 73980, 69245, + 78254, 917893, 10684, 0, 125063, 92906, 7946, 12541, 8182, 67586, 69780, + 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 118854, 68011, 8847, 92371, 65876, + 5535, 8329, 74590, 125036, 92609, 0, 66874, 3127, 2595, 65713, 42013, + 129188, 5607, 41089, 128626, 0, 74256, 2665, 11304, 43751, 74200, 4970, + 8764, 120459, 8934, 92726, 41566, 4492, 67271, 65011, 41090, 0, 92909, + 1188, 7254, 1100, 0, 67270, 41081, 2912, 11749, 67282, 67281, 67280, + 3572, 10023, 4959, 13079, 0, 67275, 9729, 125110, 0, 67278, 43361, + 983733, 67276, 11803, 7996, 9907, 41450, 13304, 128290, 127260, 41451, 0, + 11095, 8273, 74322, 3451, 983309, 972, 41453, 68164, 119327, 73883, + 68022, 73945, 983735, 2288, 19955, 9538, 92953, 69807, 0, 129095, 0, + 128897, 11396, 983440, 11019, 0, 128416, 0, 68020, 41078, 71365, 261, + 5927, 7791, 983087, 7362, 0, 10696, 70124, 6073, 9838, 118920, 0, 6075, + 93995, 282, 126510, 6437, 74078, 128000, 9801, 66399, 74177, 0, 0, 3474, + 67287, 0, 67286, 6081, 127217, 78874, 67289, 67283, 0, 70002, 128908, 0, + 93013, 8751, 11499, 67297, 7816, 12636, 4665, 12628, 4670, 67298, 120272, + 68017, 9642, 10912, 958, 67293, 11387, 67291, 4666, 70792, 4915, 67715, + 4669, 0, 68099, 13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0, + 917875, 8664, 9697, 3606, 917873, 983978, 0, 64815, 1063, 120250, 67312, + 9772, 7255, 8886, 1389, 127932, 120257, 120258, 120259, 12941, 42661, + 92381, 120255, 120256, 12301, 120266, 69820, 41102, 64428, 120262, + 120263, 120264, 1017, 66600, 523, 505, 1447, 74436, 0, 70340, 0, 8608, + 42789, 120613, 128704, 0, 73855, 11307, 66707, 67301, 67300, 11745, 7919, + 67304, 1641, 0, 0, 8966, 0, 127212, 5908, 71870, 67853, 6744, 67310, + 1699, 67308, 67307, 67314, 67313, 6306, 10169, 71324, 119251, 10068, + 3766, 2389, 67305, 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, 917837, 41435, 4352, 67324, 2435, + 71211, 5621, 120385, 4201, 3778, 4203, 4202, 4205, 4204, 120447, 3768, + 41774, 765, 41440, 3764, 8473, 6373, 8469, 120438, 12947, 4564, 0, 74623, + 74271, 73753, 8374, 127201, 0, 6829, 5225, 66901, 127385, 0, 0, 119615, + 67319, 67318, 5626, 43507, 11771, 67322, 67321, 67320, 42614, 5353, 5625, + 74179, 67315, 0, 1010, 64572, 41780, 42623, 64277, 69942, 6952, 67329, + 67328, 67327, 2590, 5629, 65552, 7551, 10325, 5632, 10471, 120038, + 120027, 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400, 5627, + 120017, 67330, 120023, 64275, 120021, 8786, 113693, 203, 74365, 0, 0, + 69985, 78350, 113703, 64378, 42054, 983150, 0, 554, 119649, 11358, 71172, + 12182, 42048, 11065, 126464, 73891, 0, 0, 5694, 7689, 69798, 9323, 4325, + 3047, 10317, 175, 0, 93029, 69764, 0, 0, 1243, 42154, 5431, 6652, 917561, + 67753, 43651, 129129, 68118, 128024, 1129, 126574, 0, 65900, 1986, 7846, + 78804, 8661, 917772, 65255, 0, 3845, 4490, 118969, 6649, 74136, 1456, + 7530, 11977, 7249, 8366, 0, 7756, 12342, 128568, 51, 41516, 0, 8570, + 9568, 71318, 456, 7026, 8145, 1168, 9251, 9082, 119964, 64055, 42781, + 3866, 12323, 41512, 73805, 68121, 0, 41494, 92316, 4660, 67114, 10405, + 127195, 78803, 0, 0, 42040, 73918, 119627, 7944, 41454, 12605, 0, 42205, + 41455, 236, 64051, 78867, 8214, 0, 113784, 120037, 41457, 983970, 119589, + 1969, 2384, 8097, 917864, 7413, 68012, 78029, 8766, 43864, 78079, 5854, + 125000, 10583, 0, 119989, 0, 10416, 917869, 3872, 917868, 0, 8429, 0, + 118806, 2838, 6429, 0, 917866, 0, 128478, 0, 983967, 94005, 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, 125015, 78185, 128959, 0, 92713, + 78886, 0, 0, 74229, 66593, 6438, 917979, 9109, 78882, 1289, 64599, 0, + 68009, 128302, 65507, 2447, 119911, 0, 128042, 126545, 66589, 0, 6334, 0, + 0, 19937, 917793, 1322, 92359, 5675, 254, 0, 0, 69686, 42425, 8918, + 64003, 5716, 42312, 0, 0, 6972, 42826, 74409, 42464, 120567, 66899, + 67155, 74796, 64400, 64693, 0, 67687, 65429, 9515, 4435, 0, 42522, 0, + 68008, 11785, 7412, 43867, 41978, 1412, 4594, 1391, 10536, 8067, 9901, + 7103, 128293, 7102, 74588, 120748, 3140, 127276, 7960, 43271, 0, 12518, + 10909, 127508, 1428, 12472, 67254, 67253, 7699, 12393, 67257, 0, 67256, + 67255, 8223, 0, 4261, 0, 0, 74308, 0, 113712, 67153, 0, 128046, 43419, 0, + 64554, 10574, 3878, 67691, 42352, 1752, 73785, 0, 42506, 128541, 10199, + 917865, 125142, 68021, 65919, 0, 6695, 720, 324, 0, 129035, 43406, + 983736, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 128977, 0, 64041, + 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 66288, 78861, 119134, + 0, 67152, 5204, 74774, 43404, 11835, 0, 3995, 68360, 65608, 3714, 92190, + 120026, 67262, 10999, 11750, 67259, 43251, 67264, 43301, 0, 120557, 8130, + 8672, 10845, 11964, 0, 128014, 0, 0, 68455, 42863, 73839, 0, 0, 67700, 0, + 113701, 43645, 468, 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, + 129126, 12280, 70367, 540, 74564, 119017, 66422, 8432, 0, 11073, 0, + 64316, 0, 0, 820, 41741, 0, 120667, 124981, 64684, 126992, 3359, 7800, + 69934, 65177, 6226, 353, 12396, 0, 119612, 64742, 128682, 78879, 0, + 127938, 12412, 19941, 0, 120277, 70352, 1884, 9481, 42418, 70059, 41157, + 0, 1195, 64898, 7924, 0, 41151, 2010, 128883, 41328, 42344, 0, 12409, 0, + 4360, 127009, 9739, 128550, 69933, 73921, 917631, 42521, 8539, 128606, 0, + 118986, 127148, 4788, 0, 68023, 65734, 983455, 43790, 120274, 13075, + 74429, 94063, 64569, 43532, 10837, 2492, 127197, 118901, 68637, 41136, + 43785, 11813, 9649, 41154, 113731, 5128, 4038, 41143, 65604, 64859, + 41592, 6771, 1648, 5435, 67295, 6734, 41343, 119848, 65439, 12709, 6986, + 92364, 68015, 120533, 41349, 70021, 12581, 10374, 5175, 0, 73806, 10254, + 113681, 10278, 10262, 69858, 41346, 0, 607, 0, 119852, 128846, 12923, + 10314, 10282, 65477, 10378, 120297, 40976, 8265, 129149, 78639, 40975, + 5840, 42838, 0, 40978, 983897, 92945, 128020, 119809, 0, 66444, 10538, + 120810, 2550, 119836, 6779, 129130, 0, 3525, 6824, 118886, 983582, 0, + 5619, 65822, 113751, 113738, 7455, 917966, 5616, 11486, 9656, 0, 0, + 10727, 5615, 129071, 120551, 42380, 64895, 43693, 66451, 808, 5455, + 11347, 0, 1026, 5620, 194887, 0, 11350, 5617, 0, 9225, 64639, 127073, + 9145, 128060, 1338, 120581, 983158, 12739, 4603, 3084, 70408, 92484, + 9858, 6037, 0, 3974, 78213, 10290, 983704, 3083, 10322, 129048, 129030, + 0, 41036, 66897, 0, 43321, 65606, 127071, 41032, 42388, 0, 64700, 10011, + 1445, 40961, 0, 119105, 0, 40960, 0, 67727, 125106, 2223, 64952, 10402, + 0, 127179, 92304, 10603, 0, 0, 983113, 0, 6714, 10083, 127069, 194895, + 78367, 69976, 0, 93963, 9073, 42585, 64302, 10704, 65030, 4787, 0, 74829, + 0, 65423, 0, 128118, 9570, 55260, 9525, 2689, 917626, 65426, 194872, + 917624, 43740, 983177, 40966, 917622, 13286, 3998, 42598, 42596, 503, + 74237, 8735, 2690, 66488, 42836, 127150, 41954, 917617, 1652, 772, 6688, + 8310, 65428, 3487, 43416, 3585, 10194, 43320, 119159, 73955, 92315, 6468, + 41976, 9720, 917606, 11179, 41970, 66255, 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, 983745, 119182, 69244, 0, - 0, 11759, 194903, 6368, 74823, 0, 41423, 8078, 10504, 127558, 41698, - 42237, 0, 7002, 983678, 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, 983140, 10598, 7410, 2669, 903, 0, 2920, 0, - 127232, 74603, 64504, 19928, 0, 0, 3917, 0, 11732, 0, 983180, 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, 983269, 2911, 0, 41178, 5427, 64823, 0, 0, - 3787, 41174, 0, 41458, 0, 41463, 42413, 11292, 2406, 775, 0, 65584, - 69923, 6074, 9618, 128668, 983952, 43440, 0, 194901, 41436, 3656, 0, - 120600, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456, 12598, - 983191, 120734, 78745, 74500, 41460, 10145, 10542, 9937, 78746, 70029, - 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, 983095, 41595, 73730, 0, 42118, 73830, 66042, 10355, - 983110, 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, 917817, - 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, 983066, 11755, 66305, 0, 0, 10917, 93979, 0, 11272, 2040, 41247, - 41326, 195060, 1741, 42370, 1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0, - 1984, 11830, 0, 92293, 40984, 128306, 9373, 0, 12916, 6284, 0, 41663, 0, - 0, 0, 9237, 9385, 41648, 0, 194580, 2299, 41666, 1830, 73783, 2056, - 41287, 92610, 0, 0, 42219, 128257, 0, 41987, 41676, 983059, 120823, - 983144, 41670, 0, 92590, 2796, 55291, 11683, 9902, 74521, 67988, 11451, - 983111, 128822, 42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133, - 64368, 983239, 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, 983676, 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, 119158, - 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042, 8709, 128283, - 126477, 120637, 42419, 64799, 42047, 0, 0, 8470, 11807, 65897, 577, 0, - 983760, 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, 69945, - 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, - 983584, 11449, 128187, 42868, 41285, 3547, 0, 0, 128793, 983398, 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, 983162, - 65136, 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, - 78648, 11972, 78646, 78647, 78644, 78645, 177, 78643, 6176, 120580, 0, 0, + 12435, 12360, 41053, 3266, 0, 12356, 8616, 41466, 42924, 92588, 11450, 0, + 3638, 12354, 67299, 3216, 0, 2358, 92606, 8633, 71201, 983745, 119182, + 69244, 128418, 70375, 11759, 194903, 6368, 74823, 67303, 41423, 8078, + 10504, 127558, 41698, 42237, 983452, 7002, 125135, 41430, 42267, 41051, + 41484, 0, 128056, 41050, 41473, 10466, 13099, 983327, 70371, 983777, + 6435, 0, 11362, 128973, 0, 65382, 92770, 41420, 983655, 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, 124943, 42290, 3275, 92472, 42329, 74759, 125141, 0, + 128257, 92388, 69649, 10989, 74234, 113781, 10598, 7410, 2669, 903, 0, + 2920, 0, 127232, 74603, 64504, 19928, 0, 128411, 3917, 0, 11732, 0, + 983180, 41448, 41461, 128823, 0, 113721, 113758, 8819, 12663, 0, 41184, + 74014, 232, 74835, 120646, 9168, 65786, 0, 0, 0, 9094, 0, 11758, 68425, + 71886, 1064, 42467, 128044, 10115, 19924, 92711, 0, 7862, 64551, 13224, + 8516, 41862, 66650, 7561, 78618, 69793, 1878, 0, 983269, 2911, 128218, + 41178, 5427, 64823, 0, 0, 3787, 41174, 0, 41458, 67147, 41463, 42413, + 11292, 2406, 775, 0, 65584, 69923, 6074, 9618, 128668, 983727, 43440, + 74539, 194901, 41436, 3656, 917805, 120600, 41456, 67694, 1599, 11333, + 194896, 6703, 8513, 0, 1613, 0, 68456, 12598, 983191, 120734, 78745, + 74500, 41460, 10145, 10542, 9937, 78746, 67144, 9905, 0, 65730, 0, + 120374, 8427, 120375, 55246, 120376, 194940, 11497, 64687, 74008, 42592, + 3871, 983584, 128305, 9111, 5741, 0, 194846, 120366, 119111, 11150, 0, + 120368, 983570, 11648, 0, 194873, 120364, 41587, 70391, 127061, 71108, + 42113, 0, 127155, 12172, 92988, 74530, 65298, 65723, 68289, 73871, 65724, + 7928, 120354, 983095, 41595, 73730, 64671, 42118, 73830, 66042, 10355, + 983110, 7875, 0, 41598, 3993, 194909, 1545, 40971, 536, 128521, 43029, 0, + 0, 65173, 65286, 0, 70331, 917799, 0, 94065, 0, 41375, 5402, 128748, 0, + 1687, 120503, 917817, 0, 78194, 64326, 40969, 10526, 73747, 8323, 40968, + 1339, 11731, 78756, 127108, 65460, 12242, 128513, 8020, 10843, 11554, 0, + 0, 8266, 41006, 65722, 0, 10710, 74045, 118942, 67667, 64567, 119155, + 92900, 0, 71889, 67857, 120687, 0, 92958, 11755, 66305, 68332, 0, 10917, + 93979, 0, 11272, 2040, 41247, 41326, 195060, 1741, 42370, 1227, 0, + 128958, 11413, 127250, 0, 5283, 1586, 4978, 0, 1984, 11830, 43819, 92293, + 40984, 42904, 9373, 0, 12916, 6284, 194888, 41663, 983093, 0, 68313, + 9237, 9385, 41648, 0, 128953, 2299, 41666, 1830, 73783, 2056, 41287, + 92610, 0, 71917, 42219, 70118, 0, 41987, 41676, 983059, 120823, 983144, + 41670, 0, 92590, 2796, 55291, 11683, 9902, 74521, 67988, 11451, 983111, + 78855, 42631, 2359, 71890, 67844, 74164, 41238, 548, 11405, 13133, 64368, + 127270, 128795, 66272, 397, 43622, 42139, 9547, 9590, 128238, 1614, + 43661, 64356, 66307, 6651, 1358, 127962, 428, 9620, 1466, 78112, 10982, + 113785, 1333, 7104, 407, 6425, 128834, 74253, 0, 0, 0, 5804, 11976, 8554, + 92721, 0, 70167, 9057, 42294, 41218, 125097, 0, 78137, 1883, 10952, 8048, + 70443, 41225, 92621, 42915, 128616, 128512, 0, 4407, 74648, 65809, 11837, + 194821, 8448, 7141, 74183, 120334, 12675, 12659, 74634, 42363, 120624, + 194824, 55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, + 10296, 119158, 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042, + 8709, 128283, 126477, 120637, 42419, 64799, 42047, 0, 194820, 8470, + 11807, 65897, 577, 0, 983760, 74300, 0, 127308, 74840, 126474, 0, 128791, + 92224, 8736, 1414, 42643, 9683, 43486, 74344, 0, 2536, 0, 66330, 0, 0, 0, + 0, 0, 0, 194830, 66317, 69945, 66315, 2106, 92762, 11273, 125068, 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, 3566, 2322, 120371, 70831, 11449, 128187, 42868, 41285, + 3547, 0, 0, 113746, 983398, 43216, 6089, 78682, 68490, 120578, 4170, + 1029, 127761, 127036, 119224, 42374, 0, 744, 92883, 113739, 0, 65823, + 127826, 11182, 3551, 92938, 0, 4623, 55268, 128738, 4598, 983162, 65136, + 127136, 0, 128169, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, 78648, + 11972, 78646, 78647, 78644, 78645, 177, 78643, 6176, 120580, 983696, 0, 6177, 9020, 78652, 78653, 6178, 120249, 120242, 128027, 67673, 2214, - 8754, 0, 120237, 2137, 43081, 0, 0, 9136, 120240, 4401, 41280, 0, 8974, - 2308, 0, 74149, 0, 2318, 983183, 66361, 8198, 0, 64360, 12601, 42536, - 65266, 120827, 74307, 92462, 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, 983666, 13181, 0, 0, 0, 70088, - 74148, 0, 0, 120225, 120229, 120224, 74172, 41145, 0, 94096, 983946, - 41148, 8683, 7594, 127519, 0, 119090, 10869, 43458, 41146, 92407, 11441, - 0, 3512, 119633, 983709, 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, 94064, 0, 0, 3804, 13070, 11557, 42044, 0, 1095, - 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, 66697, 0, 11684, 0, - 92486, 917603, 0, 42043, 43232, 66677, 0, 42046, 78241, 4036, 126481, 0, - 128213, 194861, 0, 11954, 93978, 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, 128556, 7755, - 0, 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 983668, - 1617, 8050, 0, 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, - 6352, 41892, 0, 7555, 13103, 5408, 2817, 1214, 69919, 92335, 983125, 0, - 0, 0, 127195, 7957, 8689, 64723, 1056, 42896, 74147, 194813, 0, 55286, - 7073, 65850, 12327, 983948, 119028, 0, 0, 0, 2341, 8450, 8484, 8474, - 983260, 0, 70079, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451, - 7571, 13073, 0, 0, 681, 983252, 703, 0, 3272, 8781, 12894, 70077, 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, 983122, 0, 0, 0, 10039, 0, - 983945, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0, 0, 0, - 67848, 0, 0, 0, 8887, 127521, 7295, 11031, 0, 43157, 0, 8946, 10348, - 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 983711, 8810, 74499, 686, - 0, 71362, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, - 65118, 0, 119151, 74205, 92651, 0, 2401, 68144, 8792, 983648, 0, 65455, - 0, 92246, 0, 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161, - 10396, 74135, 983453, 118945, 78118, 73851, 3010, 6441, 78122, 1458, - 41475, 128672, 93975, 0, 11479, 0, 120356, 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, - 983195, 126561, 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, 983075, 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, 983171, 0, 2307, 0, 64333, - 127312, 128547, 73873, 0, 94035, 0, 127973, 128708, 0, 10360, 6746, 0, - 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 128285, 66447, 8046, - 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 93965, 10487, - 69878, 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771, - 983235, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 2283, - 983237, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0, - 92717, 70074, 4770, 0, 917567, 8731, 65378, 127362, 120619, 9122, 128033, - 126600, 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, 983153, 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, 983930, 3945, 92589, 0, 0, 0, 0, - 78212, 127746, 1020, 73763, 0, 78731, 5648, 64748, 194910, 78733, 10205, - 3545, 983585, 6984, 0, 74051, 983655, 43242, 120458, 2667, 0, 0, 0, 9911, - 0, 65020, 10097, 119166, 127145, 983662, 118836, 983748, 78427, 1140, - 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, 3267, + 8754, 128652, 120237, 2137, 43081, 194663, 120239, 9136, 66889, 4401, + 41280, 70801, 8974, 2308, 194750, 74149, 128327, 2318, 983183, 66361, + 8198, 0, 64360, 12601, 42536, 65266, 120827, 67279, 92462, 6970, 5404, + 43332, 3667, 7936, 12925, 126989, 6385, 128482, 128403, 118949, 10874, + 65505, 120002, 0, 42053, 2075, 42057, 11083, 42052, 0, 67266, 67651, 0, + 9665, 92300, 983666, 13181, 0, 0, 0, 70088, 74148, 0, 70419, 120225, + 120229, 120224, 74172, 41145, 66404, 94096, 74422, 41148, 8683, 7594, + 113686, 0, 119090, 10869, 43458, 41146, 92407, 11441, 0, 3512, 119633, + 92965, 8103, 0, 0, 65184, 11780, 41563, 42796, 129055, 69742, 41544, + 65146, 71314, 0, 0, 129177, 19942, 0, 118908, 7988, 10436, 74273, 3271, + 73804, 64711, 0, 94064, 983071, 0, 3804, 13070, 11557, 42044, 0, 1095, 0, + 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, 66697, 0, 11684, 0, 92486, + 917603, 0, 42043, 43232, 66677, 0, 42046, 74157, 4036, 126481, 0, 128213, + 194861, 0, 11954, 70348, 1450, 12986, 1340, 0, 65441, 92722, 0, 0, + 125117, 0, 917542, 0, 0, 6539, 92948, 126607, 124961, 125060, 0, 120492, + 41190, 3973, 119365, 4575, 41193, 7982, 429, 0, 119129, 0, 194848, 65792, + 128408, 118968, 6417, 118918, 78178, 0, 128970, 0, 0, 4919, 10590, + 128556, 7755, 0, 92942, 64548, 120506, 1621, 10214, 65126, 68253, 127004, + 983616, 12188, 983668, 1617, 8050, 0, 5015, 0, 119174, 42590, 70354, + 1756, 78181, 0, 65768, 6352, 41892, 0, 7555, 13103, 5408, 2817, 1214, + 69919, 92335, 983125, 0, 68224, 125055, 41764, 7957, 8689, 64723, 1056, + 42896, 74147, 3559, 983918, 55286, 7073, 65850, 12327, 70853, 119028, 0, + 0, 128442, 2341, 8450, 8484, 8474, 194884, 68322, 70079, 8461, 67721, + 12153, 12799, 0, 43709, 43708, 9451, 7571, 13073, 43847, 0, 681, 983252, + 703, 0, 3272, 8781, 12894, 70077, 11709, 92288, 70514, 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, 70131, + 74591, 78815, 78816, 66888, 0, 0, 70513, 10039, 0, 983945, 5623, 5717, + 5776, 43488, 0, 66885, 41591, 11036, 65252, 92382, 0, 0, 0, 67848, + 128128, 0, 0, 8887, 127521, 7295, 11031, 0, 43157, 0, 8946, 10348, 10412, + 8755, 0, 0, 5718, 13221, 0, 0, 78135, 70515, 917616, 8810, 74499, 686, 0, + 71362, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, 65118, + 0, 119151, 74205, 92651, 128902, 2401, 68144, 8792, 983648, 0, 65455, 0, + 74328, 0, 74561, 983718, 12886, 127920, 66624, 128350, 43557, 10300, + 10161, 10396, 71210, 78602, 118945, 9984, 73851, 3010, 6441, 70349, 1458, + 41475, 72429, 93975, 127910, 11479, 0, 120356, 6350, 12864, 69674, 78114, + 1061, 64780, 2001, 43111, 55230, 124946, 4052, 113673, 7626, 0, 0, 1045, + 0, 5631, 41113, 127544, 0, 43707, 74127, 0, 0, 8486, 0, 73758, 2335, + 4362, 983195, 126561, 69221, 1025, 127277, 42625, 70325, 78084, 41443, 0, + 128206, 0, 1774, 1523, 0, 0, 41445, 78236, 11207, 8567, 41442, 3988, + 74843, 78237, 118910, 0, 65274, 8564, 78199, 78238, 127515, 0, 0, 43446, + 0, 66513, 6256, 917807, 579, 55218, 10206, 78878, 6375, 2673, 0, 11814, + 0, 4488, 128716, 120554, 68451, 10444, 118846, 127334, 11799, 74407, + 68466, 4487, 127849, 42832, 1032, 120267, 43450, 78257, 7203, 124998, + 614, 70361, 127215, 120615, 119622, 78262, 128669, 127323, 0, 43121, + 127211, 128366, 92513, 1050, 7549, 0, 0, 9314, 70365, 92898, 120616, 0, + 10057, 70434, 127313, 128577, 66504, 983171, 0, 2307, 128456, 64333, + 127312, 128547, 73873, 0, 94035, 0, 127973, 128708, 70446, 10360, 6746, + 120473, 92245, 440, 0, 13085, 9233, 74216, 0, 127785, 9957, 128285, + 66447, 8046, 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, + 93965, 10487, 69878, 12527, 0, 7970, 125073, 128660, 0, 65769, 5243, + 9849, 5239, 65771, 983235, 0, 5237, 69714, 0, 10103, 5247, 4769, 983139, + 118977, 12873, 2283, 92931, 0, 3008, 4896, 128102, 12087, 0, 55231, + 41103, 92256, 64565, 4773, 0, 78549, 70074, 4770, 66891, 917567, 8731, + 65378, 66911, 120619, 9122, 128033, 126600, 4774, 3019, 9997, 12834, 0, + 9456, 10215, 120547, 0, 78556, 0, 0, 74776, 4281, 4768, 120572, 41535, + 4099, 9017, 69993, 0, 78095, 2225, 78096, 118946, 0, 0, 78098, 0, 42814, + 880, 0, 113764, 66870, 2134, 0, 10116, 9877, 92329, 0, 0, 7095, 8379, + 74116, 6778, 0, 78090, 8243, 2427, 128141, 7093, 0, 11585, 195003, 9962, + 0, 12223, 128485, 92430, 1434, 120254, 5637, 11573, 0, 0, 0, 19951, + 113730, 74419, 0, 0, 55283, 0, 70363, 74437, 1156, 8740, 92415, 3782, + 64331, 0, 41370, 1014, 8261, 128595, 0, 10835, 0, 65536, 0, 120463, + 125051, 7702, 118824, 128976, 43010, 65779, 65783, 1150, 10547, 5700, 0, + 120603, 65383, 2339, 42594, 5697, 118788, 120479, 128576, 0, 42257, 5696, + 92677, 120465, 3862, 9643, 0, 70183, 7634, 65167, 9845, 0, 0, 5701, 9722, + 41490, 128719, 1426, 68217, 983614, 68447, 42204, 55270, 8571, 67403, + 78067, 43859, 78818, 92719, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, + 43194, 64712, 10744, 0, 990, 5647, 0, 7387, 78734, 41114, 11477, 5646, + 12879, 11018, 128362, 3945, 92589, 0, 194989, 194718, 0, 78212, 127746, + 1020, 73763, 983835, 78731, 5648, 64748, 194910, 78733, 10205, 3545, + 983585, 6984, 0, 74051, 128901, 43242, 120458, 2667, 0, 125037, 0, 9911, + 0, 65020, 10097, 119166, 127145, 983662, 118836, 983748, 78208, 1140, + 78426, 0, 10159, 0, 0, 8128, 0, 68326, 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, 69899, 0, 0, 0, 41382, 0, 128653, 5173, 65348, - 527, 0, 0, 92612, 128250, 78797, 11915, 0, 0, 10072, 0, 42695, 2329, - 42250, 0, 128864, 69667, 12245, 1568, 94033, 0, 0, 128120, 0, 74328, - 92708, 74769, 0, 119087, 9069, 6144, 0, 0, 73822, 0, 128010, 64917, - 41521, 118934, 494, 13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740, - 73734, 0, 0, 0, 66449, 13263, 74281, 69217, 13171, 127796, 0, 0, 92294, - 0, 1044, 41276, 0, 0, 0, 42068, 11795, 0, 0, 0, 0, 42450, 3907, 0, 64526, - 11829, 68197, 12295, 0, 11475, 0, 3020, 11537, 0, 66441, 983454, 7098, 0, - 0, 1057, 566, 42696, 0, 3016, 42274, 43464, 66490, 12921, 66571, 78472, - 92510, 3006, 4620, 127237, 983578, 0, 0, 64659, 0, 127749, 55253, 6357, - 6362, 8626, 71337, 2216, 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0, - 43813, 1053, 0, 78269, 0, 126586, 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, 983768, 0, - 0, 127274, 0, 6358, 6361, 1926, 6356, 92627, 7898, 8110, 10935, 0, 10069, - 5830, 0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 983808, 120413, 0, - 127257, 65894, 0, 0, 0, 983923, 0, 0, 119187, 2135, 78868, 0, 0, 78869, - 42313, 5579, 92412, 0, 983082, 94002, 0, 5578, 41774, 128115, 42023, - 6234, 5669, 92275, 0, 0, 0, 127506, 68202, 5583, 0, 0, 42426, 5580, - 42276, 2923, 892, 2220, 42465, 41330, 194987, 5795, 65512, 119006, 65702, - 0, 120801, 65251, 0, 65710, 0, 0, 67672, 0, 5370, 0, 2931, 1638, 10966, - 10188, 65878, 118848, 0, 69694, 69879, 128830, 8172, 42017, 0, 10844, 0, - 128195, 92424, 6374, 0, 0, 286, 78023, 1062, 0, 119999, 0, 7395, 0, 1070, - 64900, 7153, 6095, 41865, 0, 3015, 128023, 126465, 5211, 983083, 6400, 0, - 194983, 70054, 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, 983980, - 2328, 92409, 1071, 42899, 0, 74848, 0, 983580, 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, 194994, 12123, 4495, 43569, 0, 0, 0, 64946, - 10992, 0, 120009, 0, 0, 9318, 93986, 13249, 65679, 73808, 0, 65457, - 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, 983966, - 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, 9218, - 1731, 0, 983746, 0, 67990, 0, 0, 0, 120001, 127018, 92492, 5155, 120000, - 5358, 983744, 0, 917767, 64424, 983231, 3840, 64314, 41432, 0, 78315, - 68430, 67980, 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, - 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 67978, 74842, 983284, - 983721, 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, 983924, 0, 9013, 4054, 0, 983570, 983628, 0, 73960, 5585, 65881, - 2549, 74469, 0, 0, 5584, 8358, 0, 64215, 92219, 10919, 0, 7980, 126601, - 983784, 2218, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, - 43452, 78609, 0, 42573, 67856, 0, 78129, 0, 0, 74392, 8135, 6450, 10055, - 77996, 0, 0, 119225, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 92573, - 120799, 0, 0, 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, 74509, - 983852, 5659, 0, 78692, 66729, 5655, 983626, 42168, 0, 1055, 917628, - 127792, 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, - 10304, 10368, 42518, 594, 10244, 10248, 7407, 983887, 64870, 0, 3467, - 983891, 0, 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, - 70036, 69696, 69769, 64656, 983726, 0, 94020, 70056, 5666, 65227, 5318, - 63994, 0, 9091, 10798, 0, 128166, 10186, 0, 7732, 983724, 64556, 0, 0, - 5668, 74445, 0, 128663, 5670, 126610, 127297, 11820, 2992, 7826, 5667, - 19952, 120807, 0, 12749, 74551, 0, 0, 66496, 4361, 119260, 1306, 9286, - 1497, 128286, 94004, 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, 94101, 94102, 94099, 64905, - 94105, 9512, 94103, 12742, 6443, 983806, 0, 9135, 0, 41564, 0, 55219, - 128832, 983851, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, - 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, - 983809, 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 43760, - 5635, 3373, 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, - 0, 0, 1657, 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 983685, - 78300, 42227, 0, 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, - 11705, 5642, 0, 5486, 0, 4356, 11710, 0, 12051, 69938, 0, 5641, 8259, 0, - 1058, 0, 67630, 0, 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 2800, - 0, 5645, 64964, 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, - 67621, 119934, 9000, 0, 0, 92673, 1865, 0, 5613, 69950, 0, 0, 5610, 0, 0, - 65826, 2069, 0, 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, - 65376, 2412, 0, 8186, 9807, 74269, 92547, 13130, 65874, 0, 5807, 0, - 10030, 5306, 12364, 128064, 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, 983899, - 1308, 0, 2534, 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, 2364, 92443, - 74470, 66618, 65680, 120779, 10027, 0, 128154, 12337, 120722, 127368, - 983167, 2980, 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, - 92276, 44011, 8730, 983067, 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, 69909, 43547, 0, 0, 7677, 2991, 4946, 42454, 11565, 7949, 0, - 983918, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, 6478, - 9898, 43673, 65237, 6241, 7106, 4877, 983795, 6238, 0, 10548, 127049, - 4409, 0, 0, 64798, 0, 5346, 0, 94047, 6237, 4874, 0, 9176, 0, 126553, - 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, 126470, 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, 983938, - 11376, 74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, - 78305, 120183, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, - 41871, 41338, 3734, 7734, 43683, 8750, 66605, 66011, 92514, 40965, - 127937, 0, 5161, 10572, 0, 0, 0, 64349, 7287, 42162, 127552, 0, 126605, - 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, 983936, 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, 983813, 6024, 92309, 9979, 10037, 41529, 10648, 8538, - 43687, 0, 0, 4285, 66195, 0, 4230, 0, 7367, 43256, 92353, 7563, 42376, 0, - 68442, 120512, 0, 0, 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, - 65589, 128277, 2603, 0, 0, 0, 70047, 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, 983826, 74241, 126568, 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, 983147, - 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, - 983682, 0, 0, 0, 69230, 0, 0, 65688, 983246, 5063, 3517, 2964, 43663, - 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, 66016, 78253, 0, - 71317, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, 0, 65883, 0, - 917774, 120602, 3761, 0, 0, 70068, 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, - 983259, 128786, 663, 0, 10780, 0, 0, 78767, 983257, 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, 983695, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, - 6609, 10434, 0, 11319, 1097, 0, 917850, 41730, 983214, 0, 73847, 78761, - 65172, 41728, 41721, 0, 0, 0, 41203, 917612, 13110, 41726, 983855, 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, 983727, 78796, 78798, 78794, 78795, 68434, - 78793, 66670, 0, 0, 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131, - 0, 9627, 78536, 78542, 78535, 983212, 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, 983280, 13012, 4571, 0, 0, 120164, - 12078, 2970, 0, 10933, 0, 77870, 0, 127015, 0, 41599, 0, 128831, 0, - 12950, 92160, 3486, 0, 78311, 4239, 0, 127799, 66511, 0, 2637, 64629, - 8460, 127053, 8476, 983975, 0, 0, 0, 65673, 1019, 78495, 4148, 0, 12289, - 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 0, 73864, 983203, 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, 983699, 78511, 3161, 295, 120207, 0, 92223, - 127856, 78742, 9016, 43454, 63903, 63902, 43641, 0, 3971, 0, 70063, 2952, - 78765, 11038, 10901, 63900, 63899, 63898, 94043, 667, 12332, 63887, 6086, - 41722, 0, 5172, 0, 983278, 4159, 0, 0, 9815, 63884, 19934, 63882, 41198, - 8555, 63878, 63877, 42460, 6050, 42708, 63881, 63872, 0, 42421, 0, 41723, - 63875, 63874, 11460, 7432, 1913, 41913, 63852, 126636, 0, 42348, 73892, - 6752, 446, 41911, 127906, 63851, 63850, 41910, 0, 63846, 2972, 12932, - 7262, 0, 63849, 63848, 63847, 128070, 6570, 8302, 7259, 63842, 4178, - 10746, 7250, 13214, 10041, 8105, 63892, 0, 118983, 1105, 4180, 0, 12094, - 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, 983577, 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, 43746, 73748, 63866, 78626, 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, 983853, 983804, 63833, 6042, 66360, 8083, 0, 0, - 63821, 63820, 63819, 63818, 983904, 5227, 9047, 63822, 127162, 6091, 0, - 10691, 560, 5643, 8226, 119578, 63812, 63811, 63810, 63809, 2289, 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, 917618, 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, 2276, 7776, 94076, - 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, - 118907, 0, 10474, 43426, 13257, 42354, 128099, 983698, 70044, 195065, 0, - 8413, 983816, 0, 5693, 7272, 0, 13209, 64470, 65831, 74350, 195063, 0, 0, - 0, 126639, 120097, 0, 94078, 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, 983633, - 4518, 10990, 65073, 5167, 4481, 3771, 120158, 2710, 0, 69243, 41724, 0, - 43073, 41690, 12479, 983635, 0, 0, 983818, 70046, 1628, 127149, 983487, - 983731, 65262, 6333, 10783, 42315, 0, 63855, 94056, 0, 0, 5339, 74323, 0, - 13004, 0, 4457, 0, 0, 194818, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, + 0, 6134, 41246, 64402, 983147, 69899, 0, 0, 0, 41382, 0, 128653, 5173, + 65348, 527, 0, 113782, 92612, 128250, 78797, 11915, 0, 0, 10072, 0, + 42695, 2329, 42250, 0, 11187, 69667, 12245, 1568, 94033, 0, 0, 113705, 0, + 11201, 92708, 74769, 126470, 67680, 9069, 6144, 0, 0, 73822, 0, 128010, + 64917, 41521, 118934, 494, 13250, 92250, 65098, 6364, 956, 113792, 12830, + 10462, 73740, 73734, 0, 0, 0, 66449, 13263, 74281, 69217, 13171, 127796, + 0, 0, 63885, 128528, 1044, 41276, 128363, 0, 0, 42068, 11795, 124985, 0, + 0, 0, 42450, 3907, 0, 64526, 11829, 68197, 12295, 0, 11475, 70329, 3020, + 11537, 0, 66441, 120761, 7098, 125071, 0, 1057, 566, 42696, 0, 3016, + 42274, 43464, 66490, 12921, 66571, 78472, 71207, 3006, 4620, 127237, + 983328, 0, 0, 64659, 0, 127749, 55253, 6357, 6362, 8626, 71337, 2216, + 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0, 43813, 1053, 0, 78269, + 0, 92977, 1052, 1051, 459, 1060, 74349, 66479, 67689, 66871, 0, 70327, + 42490, 689, 6508, 4163, 42298, 8639, 66641, 4246, 0, 43514, 12130, + 983620, 42337, 64596, 64375, 66481, 127850, 0, 0, 6359, 0, 43471, 983768, + 0, 120379, 127274, 0, 6358, 6361, 1926, 6356, 92627, 7898, 8110, 10935, + 0, 10069, 5830, 127773, 43685, 74307, 0, 42910, 0, 8693, 78611, 119565, + 128621, 120413, 92192, 127257, 65894, 983566, 0, 64296, 983923, 0, 0, + 119187, 2135, 11836, 0, 0, 78869, 42313, 5579, 92412, 70384, 129113, + 43854, 71913, 5578, 11840, 128115, 42023, 6234, 5669, 92275, 0, 128439, + 0, 127506, 68202, 5583, 0, 0, 42426, 5580, 42276, 2923, 892, 2220, 42465, + 41330, 194987, 5795, 65512, 119006, 65702, 0, 120801, 65251, 68228, + 65710, 128399, 128429, 67672, 0, 5370, 70465, 2931, 1638, 10966, 10188, + 65878, 118848, 0, 69694, 69879, 74585, 8172, 42017, 92756, 10844, 0, + 128195, 92424, 6374, 119998, 128690, 286, 78023, 1062, 0, 119999, 0, + 7395, 127783, 1070, 64900, 7153, 6095, 41865, 0, 3015, 128023, 126465, + 5211, 983083, 6400, 0, 194983, 70054, 8189, 11276, 0, 0, 372, 128829, 0, + 113783, 42102, 41585, 128202, 0, 42101, 276, 78402, 67427, 33, 67425, + 67424, 9007, 67430, 41588, 66033, 427, 10763, 118819, 70872, 127884, + 983943, 1031, 6257, 0, 42104, 0, 983980, 2328, 66837, 1071, 42899, + 125088, 74848, 0, 113793, 194981, 1047, 0, 194943, 42908, 128480, 69723, + 10651, 70356, 0, 125113, 72433, 66829, 70817, 5711, 41633, 12098, 65571, + 9166, 0, 5710, 128551, 6790, 65168, 13216, 0, 69716, 69726, 0, 64611, + 41623, 195001, 5715, 69654, 71915, 0, 5712, 2761, 41620, 68124, 3074, + 5722, 0, 8643, 68525, 0, 118906, 2757, 11067, 9718, 66419, 8910, 10689, + 6479, 0, 0, 71173, 78607, 9196, 69670, 125070, 0, 128338, 0, 118911, 0, + 113682, 129194, 0, 0, 120010, 73795, 8701, 68130, 119616, 120522, 0, + 42477, 194994, 12123, 4495, 43569, 0, 0, 0, 64946, 10992, 0, 120009, + 70336, 113688, 9318, 93986, 13249, 42902, 73808, 0, 65457, 42249, 7639, + 43995, 67845, 42641, 5454, 0, 0, 70366, 120005, 119585, 983966, 5084, 0, + 0, 118861, 0, 733, 74646, 78014, 78436, 78435, 11204, 0, 9218, 1731, 0, + 92937, 71070, 67990, 0, 0, 0, 70323, 127018, 92492, 5155, 120000, 5358, + 983744, 0, 917767, 64424, 71236, 3840, 64314, 41432, 0, 78315, 68430, + 67980, 43253, 65943, 0, 3371, 10988, 127960, 8771, 1479, 0, 0, 1109, + 11580, 43657, 64601, 12205, 92782, 0, 64507, 8868, 399, 67978, 74842, + 983284, 983721, 12149, 13088, 551, 0, 10156, 12119, 92572, 118916, 2544, + 65074, 119211, 983296, 0, 78011, 351, 78013, 0, 128713, 55229, 0, 74268, + 78008, 128094, 0, 42377, 0, 0, 0, 113767, 74320, 9013, 4054, 0, 194580, + 113740, 0, 73960, 5585, 65881, 2549, 74469, 74457, 11104, 5584, 8358, + 128975, 64215, 66864, 10919, 71208, 7980, 126601, 113698, 2218, 41800, + 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, 43452, 67245, 92993, + 42573, 66879, 0, 78129, 69767, 78752, 74392, 8135, 6450, 10055, 77996, 0, + 0, 119225, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 92573, 120799, + 71860, 0, 5652, 10945, 917927, 66486, 0, 3661, 7863, 0, 0, 0, 70332, + 127194, 5659, 0, 78692, 66729, 5655, 983626, 42168, 194581, 1055, 71171, + 71888, 66310, 74030, 70516, 12146, 70362, 73956, 11618, 0, 42720, 92949, + 10272, 10304, 10368, 42518, 594, 10244, 10248, 7407, 983887, 64870, + 74191, 3467, 71073, 7881, 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, + 69222, 65927, 0, 70036, 69696, 69769, 64656, 983726, 0, 94020, 70056, + 5666, 65227, 5318, 63994, 119596, 9091, 10798, 78664, 78508, 10186, 0, + 7732, 983724, 64556, 0, 983979, 5668, 74445, 0, 74645, 5670, 113795, + 127297, 11820, 2992, 7826, 5667, 19952, 120807, 113766, 12749, 74551, + 67757, 0, 66496, 4361, 119260, 1306, 9286, 1497, 128286, 94004, 70359, 0, + 3571, 13247, 5874, 7973, 66353, 68435, 78278, 67896, 43192, 74621, 78265, + 553, 113768, 127012, 93053, 5829, 0, 4587, 78285, 65912, 194919, 12746, + 0, 70338, 119924, 5633, 119927, 74259, 94102, 94099, 64905, 94105, 9512, + 94103, 12742, 6443, 983806, 0, 9135, 128863, 41564, 0, 55219, 128832, + 983851, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, 124936, + 128390, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, 983809, + 69815, 5636, 119917, 5329, 0, 5638, 119918, 7940, 64938, 43223, 43760, + 5635, 3373, 2986, 78292, 74223, 3437, 78291, 6203, 4247, 71169, 11920, + 8274, 68240, 983658, 1657, 41561, 78299, 78295, 5639, 2954, 5660, 5640, + 78303, 983685, 71179, 42227, 68301, 0, 41637, 67872, 194813, 78310, + 41625, 43362, 78309, 120713, 11705, 5642, 0, 5486, 0, 4356, 11710, 0, + 12051, 69938, 0, 5641, 8259, 0, 1058, 0, 67630, 0, 0, 1144, 78750, + 127293, 42228, 983714, 73890, 118972, 127352, 2800, 0, 5645, 64964, 8652, + 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, 67621, 64932, 9000, 71204, + 67235, 92673, 1865, 128706, 5613, 66401, 0, 0, 5610, 0, 71199, 65826, + 2069, 0, 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, 5875, + 2412, 0, 8186, 9807, 74269, 66294, 13130, 65874, 0, 5807, 113678, 10030, + 5306, 12364, 118863, 92970, 11704, 0, 92583, 10211, 0, 120579, 0, 983202, + 11706, 9710, 125022, 0, 120655, 413, 65623, 7118, 983949, 9133, 74262, 0, + 1042, 0, 64779, 12171, 119240, 6185, 64776, 4984, 0, 708, 11391, 0, + 12241, 92720, 983899, 1308, 194992, 2534, 810, 0, 0, 128016, 71849, + 71869, 1917, 3000, 125140, 120184, 120739, 2364, 66387, 74470, 66618, + 65680, 66411, 10027, 71841, 128154, 12337, 74283, 127368, 983167, 2980, + 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, 92276, 44011, + 8730, 194997, 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, 78300, 194998, 0, 10673, 119217, + 7248, 0, 43515, 1781, 5496, 3627, 62, 1649, 67876, 964, 0, 66403, 78226, + 66393, 92897, 70355, 66409, 0, 127534, 43689, 127911, 13142, 78812, + 42415, 66575, 4542, 69909, 43547, 0, 0, 7677, 2991, 4946, 42454, 11565, + 7949, 0, 69759, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 70810, + 6478, 9898, 43673, 65237, 6241, 7106, 4877, 129108, 6238, 0, 10548, + 127049, 4409, 0, 0, 64798, 70805, 5346, 128240, 94047, 6237, 4874, 66851, + 9176, 92882, 126553, 65231, 65884, 12678, 78748, 118912, 11378, 44018, + 42785, 2408, 3251, 11203, 983159, 5685, 0, 2461, 11052, 7091, 5342, 8317, + 0, 68163, 5340, 120559, 127820, 43635, 73928, 127529, 71069, 128395, 0, + 128510, 65482, 983580, 9142, 0, 68506, 0, 10938, 0, 118790, 1182, 2542, + 4826, 0, 0, 72438, 529, 8580, 0, 0, 10586, 10790, 10839, 66023, 41593, + 41207, 0, 983825, 41594, 225, 42828, 0, 0, 983938, 11376, 74379, 10721, + 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, 120183, + 41873, 120575, 11324, 120531, 0, 8420, 64918, 128839, 41871, 41338, 3734, + 7734, 43683, 8750, 66605, 66011, 92514, 40965, 127937, 0, 5161, 10572, 0, + 42906, 0, 64349, 7287, 42162, 120406, 983643, 126605, 11167, 69220, + 12359, 43429, 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, 10031, + 125058, 9870, 67726, 8620, 65824, 0, 11938, 0, 7285, 983557, 119577, + 42678, 66842, 43677, 41583, 0, 65799, 92623, 0, 129168, 983936, 78169, + 66199, 0, 3609, 68624, 0, 832, 120693, 120770, 78473, 66007, 78471, + 65703, 71256, 128517, 42732, 5180, 92699, 41395, 41530, 11691, 64773, + 92214, 74002, 0, 0, 128645, 6348, 243, 13200, 983813, 6024, 92309, 9979, + 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, 66195, 0, 4230, 92886, + 7367, 43256, 92353, 7563, 42376, 0, 68442, 120512, 0, 0, 214, 128578, 0, + 74856, 65893, 12208, 9973, 128386, 66311, 65589, 128277, 2603, 0, 70155, + 0, 70047, 0, 6022, 0, 2884, 0, 11620, 0, 43, 195020, 12682, 1016, 41107, + 0, 41121, 3885, 92, 65456, 64608, 0, 74801, 70855, 2074, 113742, 78283, + 0, 12453, 70847, 983826, 74241, 126568, 6791, 12457, 78268, 0, 66278, 0, + 78279, 0, 0, 92358, 66637, 7995, 8759, 43421, 78277, 12449, 128552, + 71224, 43868, 8752, 3197, 4720, 10165, 0, 119249, 113715, 11595, 64893, + 118905, 43435, 124964, 125030, 4993, 0, 6168, 10934, 1946, 741, 0, 5494, + 4639, 127559, 1990, 11107, 4498, 74169, 67736, 0, 127272, 69734, 2960, + 73779, 0, 8969, 128117, 43424, 73959, 0, 2950, 119579, 6210, 65753, 370, + 0, 0, 0, 4953, 983682, 983701, 0, 0, 69230, 0, 0, 65688, 983246, 5063, + 3517, 2964, 43663, 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, + 66016, 78253, 0, 71317, 64923, 120571, 43669, 9032, 78263, 78264, 0, + 41215, 0, 65883, 0, 917774, 120602, 3761, 0, 0, 70068, 120408, 12912, + 119012, 3850, 128191, 0, 128389, 0, 0, 908, 0, 8611, 0, 0, 74642, 43691, + 41197, 0, 8978, 120540, 119135, 41586, 10527, 71079, 917848, 3848, 78739, + 113800, 127536, 65241, 5336, 983259, 128786, 663, 0, 10780, 0, 0, 78767, + 983257, 127163, 68193, 347, 0, 983086, 78775, 64675, 41582, 78774, 78744, + 65579, 12980, 78769, 12143, 69657, 78512, 128493, 11153, 41804, 78523, 0, + 78525, 0, 128859, 41584, 10681, 0, 983695, 73938, 73781, 128022, 4800, + 66661, 0, 66306, 64715, 66384, 9518, 6609, 10434, 70845, 11319, 1097, + 128964, 917850, 41730, 129181, 0, 73847, 78761, 65172, 41728, 41721, + 917911, 194769, 983795, 41203, 917612, 13110, 41726, 983855, 67077, 1000, + 69651, 0, 41140, 1209, 73978, 125059, 73750, 1073, 6321, 77878, 41138, 0, + 68213, 78000, 12167, 1115, 41605, 9794, 127062, 67671, 55248, 12237, + 78787, 66314, 6587, 9290, 78782, 78783, 9231, 78781, 2959, 7926, 0, + 983948, 128833, 64398, 0, 119970, 12311, 119181, 78796, 78798, 78794, + 78795, 68434, 78793, 66670, 113797, 0, 12290, 120169, 0, 119873, 42142, + 9968, 8205, 0, 5131, 113694, 9627, 43646, 78542, 78535, 983212, 1944, + 1248, 10148, 127755, 119990, 119991, 12701, 78376, 11308, 119995, 0, + 113702, 66836, 65305, 65100, 4031, 42794, 120003, 7075, 8154, 119985, + 120007, 41817, 73934, 42275, 120011, 120012, 78526, 120014, 120015, 6041, + 0, 41899, 983286, 8002, 128367, 4364, 73732, 0, 64332, 0, 7813, 9064, + 119986, 10124, 7526, 8601, 7281, 68246, 7279, 12041, 1418, 10885, 12673, + 0, 129123, 9660, 983280, 13012, 4571, 917588, 0, 120164, 12078, 2970, + 129122, 10933, 0, 77870, 0, 77841, 0, 41599, 70159, 128831, 0, 12950, + 92160, 3486, 983973, 78311, 4239, 0, 127799, 66511, 92739, 2637, 64629, + 8460, 66834, 8476, 983975, 0, 68312, 78489, 65673, 1019, 78495, 4148, 0, + 12289, 0, 4316, 0, 13119, 8488, 5412, 66243, 9935, 92777, 73864, 983203, + 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, 7120, 41736, + 92546, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, 127284, + 66853, 73963, 41855, 41867, 65564, 11277, 65892, 11536, 10620, 92272, + 7115, 66030, 73932, 5498, 63876, 41536, 0, 68204, 92587, 3459, 8997, 0, + 92714, 0, 129027, 92512, 0, 66377, 69781, 0, 124972, 78511, 3161, 295, + 71257, 0, 92223, 127856, 78742, 9016, 43454, 63903, 63902, 43501, 0, + 3971, 983959, 70063, 2952, 78765, 11038, 10901, 63900, 63899, 63898, + 94043, 667, 12332, 63887, 6086, 41722, 0, 5172, 0, 983278, 4159, 983562, + 0, 9815, 63884, 19934, 63882, 41198, 8555, 63878, 63877, 42460, 6050, + 42708, 63881, 63872, 0, 42421, 0, 41723, 63875, 63874, 11460, 7432, 1913, + 41913, 63852, 66869, 128971, 42348, 73892, 6752, 446, 41911, 127906, + 63851, 63850, 41910, 128637, 63846, 2972, 12932, 7262, 69968, 63849, + 63848, 63847, 113749, 6570, 8302, 7259, 63842, 4178, 10746, 7250, 13214, + 10041, 8105, 63892, 127780, 69969, 1105, 4180, 127786, 12094, 9497, 0, + 63891, 63890, 63889, 63888, 5538, 9987, 0, 118932, 1678, 13274, 552, + 120654, 44010, 10785, 0, 11192, 4557, 74459, 9159, 10171, 13125, 63860, + 5540, 63858, 63865, 281, 13242, 63862, 74154, 0, 5536, 65568, 63857, + 1388, 71902, 0, 1077, 195000, 65099, 11531, 5834, 0, 0, 0, 0, 42773, + 127899, 0, 0, 119220, 0, 3663, 127027, 1112, 70335, 8686, 126611, 5334, + 65081, 43249, 74778, 127968, 11077, 125017, 6509, 0, 5327, 127965, 19907, + 63869, 3478, 7583, 7679, 2903, 0, 3001, 1158, 8745, 43746, 73748, 63866, + 78626, 1915, 4846, 67755, 66371, 118984, 42105, 2990, 120128, 805, 69238, + 64438, 12070, 8760, 1117, 113750, 12212, 120123, 65174, 42357, 63835, + 63834, 0, 78240, 12225, 63838, 63837, 983853, 70173, 63833, 6042, 66360, + 8083, 128166, 0, 63821, 63820, 63819, 63818, 983904, 5227, 9047, 63822, + 127162, 6091, 0, 10691, 560, 5643, 8226, 119578, 63812, 63811, 63810, + 63809, 2289, 63815, 63814, 63813, 6047, 1597, 120143, 780, 206, 70126, + 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, 11137, 13169, 5290, 2089, 1695, + 10743, 1088, 63825, 7268, 1084, 1085, 63829, 1083, 10131, 7283, 0, 63970, + 128358, 1092, 4754, 7273, 5252, 44016, 43627, 127921, 128920, 7408, + 11809, 917618, 127917, 0, 2965, 7258, 8808, 66572, 1089, 4187, 63937, + 42119, 42120, 11106, 940, 5787, 10099, 63938, 0, 74494, 12463, 2994, 0, + 118827, 68522, 9664, 70834, 77940, 67892, 77938, 74343, 67370, 0, 660, + 10127, 666, 9022, 5532, 43667, 5533, 12580, 78507, 6118, 222, 979, 3884, + 983392, 74151, 92652, 6502, 0, 11085, 128695, 63951, 12465, 917862, 0, + 128782, 63946, 1707, 63924, 12461, 63950, 63897, 63948, 63947, 63945, + 6038, 63943, 63942, 64685, 63895, 65838, 2276, 7776, 94076, 0, 92464, + 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, 120102, 43980, 5485, 0, 42697, 9061, 5534, + 10672, 4502, 124932, 253, 0, 68208, 120439, 9203, 74231, 0, 11530, 68634, + 68668, 0, 11127, 0, 10474, 43426, 13257, 42354, 128099, 983698, 70044, + 195065, 0, 8413, 66841, 0, 5693, 7272, 0, 13209, 64470, 65831, 74350, + 195063, 0, 0, 0, 126639, 120097, 0, 94078, 66840, 127767, 66608, 3111, + 41863, 8804, 42913, 78347, 7270, 0, 66606, 6628, 1076, 7433, 1436, 73844, + 55226, 128353, 63982, 7393, 12807, 43413, 63906, 1598, 63904, 71187, + 70393, 41729, 4423, 1307, 113692, 10515, 41589, 128698, 128918, 6218, + 113675, 1430, 0, 127778, 120606, 78754, 5413, 7619, 3255, 3493, 74032, + 11549, 10735, 41743, 73937, 6801, 983633, 4518, 10990, 65073, 5167, 4481, + 3771, 67093, 2710, 0, 66277, 41724, 67716, 43073, 41690, 12479, 983635, + 8380, 0, 71852, 70046, 1628, 127149, 128817, 129067, 65262, 6333, 10783, + 11172, 0, 63855, 70840, 113679, 0, 5339, 74323, 0, 13004, 66843, 4457, 0, + 127756, 194818, 127116, 5684, 8678, 10914, 43632, 5689, 65807, 70814, 68464, 12633, 12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, - 74251, 0, 120647, 0, 50, 10558, 9871, 42612, 43655, 0, 0, 0, 66468, 0, - 13259, 4448, 0, 983845, 0, 70043, 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, 983650, 1873, 1087, 0, 0, 0, - 78527, 66439, 43218, 983123, 194716, 7237, 12504, 74282, 0, 983571, 0, - 9489, 0, 0, 4384, 74220, 63845, 2058, 128863, 13295, 43191, 128030, 0, - 1154, 3857, 1205, 0, 0, 13100, 12958, 120706, 74168, 0, 0, 4421, 10592, - 0, 495, 119007, 41712, 7983, 0, 93997, 0, 6347, 120165, 7654, 41710, - 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, 64306, 0, 0, - 4999, 194642, 0, 126582, 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, 69849, - 6783, 0, 12993, 8049, 41548, 44021, 6458, 983807, 128882, 4761, 63828, - 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, - 983603, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, 8503, - 5122, 41527, 0, 66320, 983811, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, - 73857, 10003, 73859, 65904, 7363, 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, - 0, 4762, 1103, 0, 0, 4765, 983492, 13078, 0, 4760, 63827, 2050, 10871, - 43199, 1102, 0, 42236, 128867, 194667, 11546, 74794, 337, 0, 42591, 8627, - 12279, 1111, 0, 92161, 4707, 68206, 10143, 7883, 127081, 7880, 4522, - 8645, 5704, 13010, 0, 8304, 917561, 0, 119575, 2293, 0, 66654, 0, 92676, - 0, 13008, 0, 4385, 0, 13011, 0, 92569, 119161, 13009, 160, 2677, 0, 0, - 41793, 65763, 74221, 120141, 41792, 42770, 94054, 65762, 118829, 43821, - 5709, 0, 94053, 43816, 0, 0, 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, - 5705, 8791, 4005, 0, 10237, 10991, 128816, 43459, 9173, 917581, 917580, - 13170, 12540, 917577, 42605, 120765, 126617, 68647, 917572, 10058, 0, - 74867, 194654, 127078, 3339, 11448, 1106, 917591, 917590, 917593, 3340, - 917587, 917586, 917589, 917588, 120541, 10605, 1309, 63966, 120743, 1754, - 92226, 13246, 864, 0, 118926, 8972, 0, 7849, 120092, 92533, 13240, - 195068, 5192, 4338, 67982, 10948, 917601, 13199, 92575, 1236, 13208, - 13261, 13189, 13188, 93993, 0, 7440, 0, 120153, 9553, 1590, 63777, 63776, - 13178, 63782, 63781, 63780, 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, - 41522, 983915, 92168, 983772, 917858, 11354, 94071, 0, 42795, 0, 119195, - 11394, 194646, 13236, 13272, 13194, 1334, 69926, 4479, 1178, 65586, - 120663, 66681, 119193, 4601, 0, 0, 983765, 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, 983131, 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, 94074, 63793, 11988, 3898, 128241, 10201, 12238, - 63795, 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945, - 983329, 42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, - 0, 0, 63769, 9530, 983119, 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, 94039, - 0, 92455, 7386, 0, 64444, 0, 119863, 43603, 94075, 65397, 288, 0, 0, 0, - 10025, 69915, 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, 983604, 65242, 0, - 3330, 0, 0, 983974, 0, 0, 74259, 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, - 5371, 13116, 0, 1826, 118794, 0, 43094, 70023, 43650, 94037, 0, 9035, 0, - 0, 128005, 0, 92207, 68125, 0, 164, 0, 94067, 94000, 6958, 0, 43116, 0, - 70019, 13245, 0, 0, 127376, 0, 70031, 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, 69847, - 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, 4796, 12292, 126595, 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, - 983568, 0, 0, 92402, 128062, 12965, 384, 64512, 10404, 10340, 119352, - 1556, 5274, 13210, 120125, 10017, 9733, 41787, 983243, 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, 126646, - 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, - 94107, 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, 71369, - 6770, 43331, 0, 65620, 983728, 43544, 126466, 0, 41444, 65621, 69955, - 9197, 5246, 119106, 13185, 9709, 120323, 120322, 12314, 65616, 5238, - 119333, 0, 119337, 5236, 40979, 0, 74201, 8286, 128537, 3936, 119331, - 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379, 13239, 12692, 7969, - 127266, 7219, 127250, 128251, 120509, 0, 66224, 734, 2979, 120303, 65619, - 9872, 957, 64921, 1846, 66631, 41477, 119256, 120310, 74511, 41770, 1670, - 6442, 120317, 42446, 5379, 120318, 41163, 74832, 120315, 120314, 11506, - 0, 42841, 13267, 0, 0, 41775, 0, 7130, 41773, 0, 10663, 0, 0, 0, 6151, - 12110, 42673, 65572, 65293, 65250, 13265, 13264, 64518, 0, 6100, 0, - 92647, 5808, 65922, 0, 12967, 66041, 5612, 4583, 0, 0, 68097, 64575, - 126637, 11965, 0, 68358, 0, 69789, 0, 92260, 68102, 9698, 7814, 74476, - 119651, 128514, 0, 41921, 118858, 9756, 6985, 119258, 78490, 74219, 0, 0, - 118997, 8012, 5674, 12353, 0, 12361, 5677, 5588, 0, 41925, 128124, 41920, - 5673, 120534, 5676, 41923, 12694, 118978, 5672, 1294, 0, 78059, 0, 42511, - 1727, 120725, 42436, 0, 0, 0, 74222, 8718, 3550, 736, 10268, 4505, 10316, - 74090, 5826, 55232, 5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 12829, - 5838, 5796, 0, 119592, 5793, 0, 5866, 5797, 41011, 5865, 120091, 7956, - 598, 0, 64649, 5806, 42398, 0, 9037, 5671, 120041, 983255, 0, 0, 128855, - 0, 847, 128242, 9529, 0, 66657, 6980, 78483, 120035, 78484, 983491, 0, - 120033, 78486, 0, 0, 120039, 42683, 0, 983055, 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, 94100, 41013, 10568, 0, 983618, 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, 2213, 0, 0, 807, - 43079, 0, 78475, 976, 5511, 64553, 0, 42155, 0, 41356, 74110, 118801, - 126614, 0, 8676, 983291, 0, 5582, 451, 63941, 5798, 9349, 42018, 127858, - 0, 0, 43609, 5906, 120553, 1440, 0, 128853, 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, 94040, 0, 5187, 71296, 127277, 11286, 68620, - 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, 983827, 8292, 195074, 4980, - 8860, 73947, 10028, 65291, 7076, 13182, 194705, 0, 0, 10631, 66031, 7972, - 0, 78785, 0, 7900, 0, 11309, 3806, 4198, 42725, 0, 67656, 9995, 0, 92552, - 0, 12931, 0, 42684, 74285, 2088, 64213, 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, 983900, 65162, 41234, 12089, - 78281, 9771, 983905, 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, 983659, 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, 127471, 0, 11792, 43064, 41025, 911, 7539, - 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0, - 12326, 983856, 0, 42808, 128337, 9348, 64901, 983861, 0, 0, 0, 0, 0, - 917584, 43702, 983576, 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, 983660, 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, 983064, 194720, 65056, 3620, 41180, - 68378, 4556, 0, 0, 194933, 74250, 0, 67657, 10510, 4382, 66482, 0, 0, - 127527, 9177, 8902, 93958, 9839, 0, 12891, 983755, 983636, 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, 983929, 64289, 65289, 78151, 66658, 194929, 64509, 78152, 0, - 126505, 11051, 983296, 0, 11355, 65885, 0, 128310, 41214, 0, 12299, 0, - 7500, 4506, 7773, 0, 0, 9963, 68649, 126609, 4040, 120570, 6167, 0, - 63922, 6594, 983740, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988, - 41955, 0, 63993, 10440, 9611, 65605, 6803, 0, 7738, 63986, 11446, 63984, - 92641, 3435, 78164, 43814, 43810, 7029, 64258, 41292, 118898, 12748, - 42742, 9517, 11518, 0, 78790, 0, 67993, 63956, 42458, 63954, 63953, - 63960, 9591, 4516, 10217, 68370, 11469, 69697, 42306, 2723, 118947, 0, 0, - 0, 0, 0, 11397, 2880, 0, 0, 2872, 0, 0, 3498, 4378, 917539, 4270, 0, - 65551, 68205, 6633, 43387, 0, 5230, 0, 0, 0, 0, 0, 8161, 393, 12013, 0, - 0, 126479, 415, 63964, 63963, 42345, 92310, 5183, 1877, 42498, 0, 2927, - 0, 63961, 4472, 0, 0, 78159, 69699, 917936, 42340, 4756, 128078, 7081, - 10730, 7691, 10331, 63830, 119625, 42922, 42103, 8628, 9813, 0, 42453, - 1604, 9565, 10539, 69701, 65764, 41415, 65767, 0, 8457, 42301, 11372, - 64873, 11992, 0, 0, 63980, 11801, 3622, 983124, 64336, 12017, 10463, - 63981, 4967, 64189, 1966, 43628, 0, 983292, 0, 0, 63971, 4347, 4416, - 42098, 11009, 10694, 63973, 402, 0, 13147, 128692, 42100, 64646, 13228, - 0, 41875, 3515, 74252, 11805, 0, 11302, 6259, 43395, 0, 0, 194670, 0, - 92351, 0, 74425, 11299, 1561, 0, 92359, 64942, 983559, 194733, 983686, - 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, 983919, 0, 5405, 127875, 64866, 0, 119583, 128345, - 78784, 74248, 11330, 194723, 64690, 3254, 0, 0, 128207, 42390, 43678, - 194725, 983909, 65077, 0, 6388, 3355, 9508, 9867, 5723, 11520, 5611, 0, - 3377, 0, 0, 0, 0, 78228, 0, 983762, 42691, 917886, 127198, 74767, 0, - 127075, 1379, 246, 0, 983761, 3788, 983106, 11041, 92549, 66304, 0, 0, - 8917, 42403, 301, 0, 0, 0, 0, 0, 983697, 10656, 0, 65214, 119242, 42567, - 92217, 13163, 983204, 120831, 74597, 3182, 0, 0, 0, 65034, 65889, 42169, - 4755, 74244, 194621, 11443, 0, 66319, 74598, 608, 600, 0, 1219, 3934, - 64206, 11483, 74510, 0, 74485, 42442, 65470, 983907, 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, - 70045, 43539, 5411, 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, - 9337, 12052, 10643, 55271, 983179, 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, 983205, - 12955, 10596, 2888, 194645, 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, 126542, 10632, 11934, 11452, 1332, 0, 0, - 126647, 0, 118887, 1791, 5191, 9288, 64822, 2892, 0, 43394, 555, 0, 0, - 66646, 0, 119002, 13151, 74512, 7289, 74055, 64161, 8854, 64162, 5858, - 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868, 128813, 13158, - 92166, 7211, 0, 9371, 73973, 917553, 6828, 1625, 92302, 0, 1342, 68440, - 64171, 126704, 10903, 983494, 0, 0, 0, 0, 4482, 41606, 0, 128569, 983112, - 0, 64381, 0, 0, 195090, 42245, 126467, 41972, 0, 444, 0, 9127, 66687, - 66619, 126489, 78025, 0, 11349, 40991, 917570, 0, 119599, 120830, 0, - 1197, 128282, 1149, 194970, 0, 0, 40990, 43765, 0, 3492, 0, 127942, 0, 0, - 0, 12838, 983978, 19948, 0, 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, - 41309, 0, 0, 8152, 0, 41550, 12227, 983613, 0, 12828, 127511, 0, 0, - 120708, 0, 0, 10386, 119574, 0, 0, 92680, 983789, 68154, 0, 1743, 0, 0, - 92239, 65186, 917571, 0, 9606, 0, 0, 64439, 0, 0, 92686, 0, 0, 194967, 0, - 0, 3395, 9362, 10878, 0, 0, 78362, 64830, 0, 126557, 41091, 3426, 1344, - 8870, 0, 0, 4735, 127017, 6119, 12822, 42699, 0, 983824, 74818, 1423, 0, - 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, 11929, 0, 7170, - 9596, 6130, 128826, 43629, 11579, 78713, 0, 194740, 128691, 92185, 66699, - 64440, 1004, 92584, 194737, 43234, 66008, 12627, 0, 68414, 0, 43619, - 43303, 11300, 43304, 9686, 5890, 11776, 7558, 127158, 65627, 0, 10718, - 13154, 3461, 9139, 0, 0, 0, 0, 65365, 73877, 65628, 78019, 120319, 0, - 41708, 12860, 2641, 12069, 10838, 5403, 10352, 70085, 10061, 43237, 0, - 5140, 209, 128847, 41704, 41056, 43078, 128125, 118809, 0, 10899, 65469, - 92362, 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, 194806, 70027, 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, 93960, 983322, 126581, - 10695, 0, 7540, 0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, - 64321, 8359, 0, 12689, 0, 194594, 0, 983312, 983881, 68183, 0, 983314, - 1287, 5436, 0, 983317, 74142, 92328, 74152, 119078, 6051, 10497, 69668, - 8985, 12109, 983323, 0, 127242, 0, 0, 3652, 10537, 0, 1276, 120440, 6549, - 279, 73745, 0, 0, 0, 1489, 0, 0, 0, 3899, 1007, 42124, 983557, 42122, - 92337, 92367, 0, 11985, 1345, 78600, 0, 0, 8956, 43083, 94057, 42138, - 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 65942, - 492, 8685, 0, 983759, 0, 78622, 43712, 2582, 11470, 64538, 7444, 78615, + 74251, 0, 120647, 128930, 50, 10558, 9871, 42612, 43655, 0, 983818, + 74284, 66468, 66905, 13259, 4448, 917804, 983845, 113734, 70043, 1321, 0, + 10640, 11539, 1151, 0, 917607, 124958, 127079, 71106, 127852, 0, 0, + 983075, 12501, 64604, 128657, 11527, 118870, 8812, 0, 11538, 8673, 12650, + 11020, 0, 66467, 2105, 8087, 78163, 69632, 9894, 0, 128943, 69995, 4636, + 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 128284, 12277, 194627, + 11995, 92553, 0, 12158, 70170, 8741, 10197, 0, 92426, 0, 6531, 0, 127846, + 473, 43415, 92936, 983650, 1873, 1087, 124966, 0, 74280, 78527, 66439, + 43218, 983123, 194716, 7237, 12504, 71113, 0, 983571, 983886, 9489, 0, + 70843, 4384, 74220, 63845, 2058, 69741, 13295, 43191, 128030, 195054, + 1154, 3857, 1205, 0, 0, 13100, 12958, 120706, 74168, 0, 70846, 4421, + 10592, 0, 495, 66400, 41712, 7983, 70833, 93997, 983330, 6347, 78715, + 7654, 41710, 4196, 0, 437, 41709, 73772, 70832, 0, 9465, 13290, 119180, + 4997, 64306, 0, 0, 4999, 194642, 67401, 126582, 4711, 120769, 0, 2739, 0, + 8044, 74313, 194643, 41789, 128142, 10809, 66279, 0, 0, 1779, 6600, 6601, + 41543, 5325, 642, 64187, 13058, 120449, 12875, 983804, 92186, 13229, + 71845, 10575, 43399, 0, 0, 41791, 1104, 0, 983725, 10655, 0, 0, 0, 0, + 1082, 195049, 8428, 6569, 0, 0, 78534, 69849, 6783, 0, 12993, 8049, + 41548, 44021, 6458, 983807, 128882, 4761, 63828, 4766, 64623, 1273, + 43407, 120677, 118876, 195045, 6912, 1313, 6322, 10483, 128627, 41545, 0, + 92449, 0, 11216, 0, 0, 78624, 3484, 74337, 0, 0, 8503, 5122, 41527, + 71910, 66320, 70161, 92972, 0, 0, 41537, 66453, 8303, 8282, 11817, 73857, + 10003, 73859, 65904, 7363, 1686, 0, 70115, 11467, 3664, 65921, 64299, + 124939, 128462, 0, 4324, 126, 42246, 119152, 69984, 67725, 65926, 7744, + 194636, 74277, 66283, 78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0, + 126614, 4762, 1103, 70827, 70157, 4765, 983492, 13078, 0, 4760, 63827, + 2050, 10871, 43199, 1102, 0, 42236, 128867, 194667, 11546, 74794, 337, 0, + 42591, 8627, 12279, 1111, 0, 92161, 4707, 68206, 10143, 7883, 127081, + 7880, 4522, 8645, 5704, 13010, 69796, 8304, 92982, 0, 119575, 2293, + 70195, 66654, 129077, 92676, 0, 13008, 127121, 4385, 128736, 13011, 0, + 92569, 119161, 13009, 160, 2677, 0, 0, 41793, 65763, 74221, 70790, 41792, + 42770, 94054, 65762, 118829, 43821, 5709, 128296, 71076, 43816, 0, + 983896, 1079, 3867, 5708, 0, 0, 43797, 5706, 64768, 5705, 8791, 4005, 0, + 10237, 10991, 128816, 43459, 9173, 917581, 917580, 13170, 12540, 917577, + 42605, 120765, 126617, 68647, 917572, 10058, 0, 74867, 67730, 127078, + 3339, 11448, 1106, 917591, 917590, 917593, 3340, 74017, 917586, 917589, + 129141, 120541, 10605, 1309, 63966, 120743, 1754, 92226, 13246, 864, 0, + 118926, 8972, 128410, 7849, 120092, 92533, 13240, 195068, 5192, 4338, + 67982, 10948, 66825, 13199, 92575, 1236, 13208, 13261, 13189, 13188, + 93993, 71847, 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, + 63781, 63780, 63779, 1583, 119923, 13260, 4550, 120598, 64205, 983245, + 71071, 41522, 41523, 68523, 983772, 118923, 11354, 94071, 0, 42795, 0, + 119195, 11394, 194646, 13236, 13272, 13194, 1334, 69926, 4479, 1178, + 65586, 68311, 66681, 119193, 4601, 0, 0, 983765, 66828, 0, 127839, 0, + 6809, 63786, 6031, 67402, 63791, 63790, 1145, 63788, 7910, 63785, 43153, + 754, 10192, 13105, 8183, 120741, 2037, 0, 64710, 10747, 125, 0, 64890, 0, + 127376, 0, 41719, 63758, 3523, 1074, 13258, 9536, 71056, 0, 4427, 74242, + 63757, 43145, 12217, 63754, 41532, 1349, 63750, 63749, 129025, 0, 0, + 63753, 63802, 41084, 120622, 68133, 41930, 63805, 63804, 11140, 63801, + 41082, 8140, 63798, 6260, 0, 128391, 94074, 63793, 11988, 3898, 92246, + 10201, 12238, 63795, 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, + 12523, 12945, 983329, 42203, 7950, 3124, 63771, 42787, 4386, 11148, 6973, + 2793, 12475, 129180, 128501, 63769, 9530, 983119, 12232, 13135, 8596, + 5681, 63762, 4595, 63760, 792, 113674, 64803, 0, 8742, 195029, 11053, + 128796, 63744, 128107, 128942, 7588, 63748, 1693, 63746, 43204, 5055, + 68426, 42063, 1090, 120679, 125008, 11665, 74133, 4558, 65685, 9523, + 983451, 0, 71216, 11513, 0, 6157, 63775, 63774, 63773, 13191, 12170, + 3500, 3139, 120538, 3170, 12485, 0, 10872, 78271, 13006, 64433, 120074, + 0, 941, 0, 129079, 917853, 65541, 11063, 0, 8228, 0, 42065, 128368, 0, + 94039, 0, 92455, 7386, 0, 64444, 0, 119863, 43603, 94075, 65397, 288, 0, + 0, 0, 10025, 69915, 2918, 66820, 65300, 119871, 9883, 64726, 2790, 65395, + 3793, 0, 127829, 65393, 120592, 74138, 0, 92751, 77958, 74139, 78777, + 65394, 11548, 5270, 983236, 65396, 0, 65813, 13256, 1282, 120771, 0, 0, + 10888, 127490, 65242, 0, 3330, 0, 0, 68340, 0, 0, 71202, 3304, 42753, + 93046, 0, 74643, 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, 0, 43094, + 70023, 43650, 94037, 68317, 9035, 11141, 0, 128005, 0, 92207, 68125, + 128467, 164, 68309, 94067, 94000, 6958, 0, 43116, 67719, 70019, 13245, 0, + 0, 66818, 0, 70031, 11099, 12666, 13175, 13207, 120414, 66014, 120428, + 7447, 5929, 0, 65509, 129192, 7449, 11306, 0, 73920, 3180, 125102, 63808, + 9054, 971, 13062, 71090, 0, 65195, 10164, 92252, 74428, 0, 78146, 92611, + 0, 70204, 0, 10045, 12882, 13275, 2303, 11057, 0, 13276, 125133, 41525, + 78150, 7271, 11444, 126479, 129158, 128112, 12229, 11680, 0, 43411, + 73751, 0, 64813, 0, 0, 10476, 3858, 64175, 3932, 64958, 120432, 0, 73989, + 68192, 0, 69847, 369, 0, 41784, 0, 64163, 77997, 0, 92645, 65474, 4796, + 12292, 126595, 65479, 128631, 41781, 10486, 41480, 43002, 9899, 92608, 0, + 404, 12821, 3741, 0, 5788, 8092, 68212, 41222, 1831, 66020, 3982, 0, + 4388, 0, 746, 118826, 74783, 0, 12018, 65294, 127545, 0, 0, 0, 4422, + 4708, 3799, 74292, 119357, 0, 74430, 0, 11700, 4374, 0, 128179, 1364, 0, + 8038, 0, 917597, 12868, 69814, 70425, 6735, 73979, 13174, 73968, 13225, + 194902, 69808, 65835, 0, 2365, 7841, 0, 42855, 118856, 42866, 0, 0, + 127986, 66438, 41785, 12617, 64172, 13173, 4372, 119354, 0, 983568, 0, + 127821, 67685, 128062, 12965, 384, 64512, 10404, 10340, 119352, 1556, + 5274, 13210, 120125, 10017, 9733, 41787, 983243, 126994, 41373, 68486, + 12303, 128476, 13232, 13233, 349, 4863, 41371, 11656, 0, 120703, 119883, + 12861, 4398, 8543, 65618, 92737, 1096, 43852, 0, 42688, 12441, 12355, + 119348, 119347, 4318, 10452, 92902, 8032, 13243, 13237, 12719, 126646, + 119101, 0, 64884, 119872, 119345, 8597, 71100, 0, 9864, 0, 120785, + 119874, 94107, 13195, 41452, 64961, 7722, 0, 10459, 119878, 124949, + 119879, 66590, 128123, 41533, 66337, 0, 92184, 0, 4965, 43445, 917536, + 67856, 0, 43638, 78536, 128287, 6261, 119342, 43147, 66570, 1957, 10420, + 982, 2756, 13292, 13206, 125064, 0, 2925, 73809, 13056, 92914, 13212, + 43238, 983142, 13190, 13187, 92541, 13198, 118793, 0, 5242, 119179, + 64476, 1694, 8216, 71369, 6770, 43331, 0, 65620, 983728, 43544, 126466, + 0, 41444, 65621, 69955, 9197, 5246, 119106, 13185, 9709, 120323, 120322, + 12314, 65616, 5238, 43825, 71085, 119337, 5236, 40979, 983140, 71874, + 8286, 128537, 3936, 119331, 11699, 41347, 127249, 13235, 8842, 41248, 0, + 4379, 13239, 12692, 7969, 127266, 7219, 71875, 128251, 120509, 92907, + 66224, 734, 2979, 120303, 65619, 9872, 957, 64921, 1846, 66631, 41477, + 119256, 71192, 74511, 41770, 1670, 6442, 120317, 42446, 5379, 120318, + 41163, 74832, 11136, 71876, 11506, 0, 42841, 13267, 0, 0, 41775, 0, 7130, + 41773, 0, 10663, 70130, 0, 983974, 6151, 12110, 42673, 65572, 65293, + 65250, 13265, 13264, 64518, 0, 6100, 127964, 92647, 5808, 65922, 0, + 12967, 66041, 5612, 4583, 70004, 43386, 68097, 64575, 126637, 11965, 0, + 68358, 0, 69789, 42653, 92260, 68102, 9698, 7814, 71045, 119651, 128514, + 0, 41921, 118858, 9756, 6985, 66418, 66621, 74219, 66412, 128822, 118997, + 8012, 5674, 12353, 66421, 12361, 5677, 5588, 125005, 41925, 128124, + 41920, 5673, 120534, 5676, 41923, 12694, 118978, 5672, 1294, 0, 78059, 0, + 42511, 1727, 120725, 42436, 124928, 0, 0, 74222, 8718, 3550, 736, 10268, + 4505, 5873, 74090, 5826, 55232, 5813, 0, 92889, 5841, 5837, 55234, 0, + 3105, 12829, 5838, 5796, 0, 119592, 5793, 0, 5866, 5797, 41011, 5865, + 93009, 7956, 598, 0, 64649, 5806, 42398, 0, 9037, 5671, 120041, 983255, + 0, 0, 128855, 0, 847, 128242, 9529, 128019, 66657, 6980, 78483, 43510, + 78122, 92219, 0, 67411, 78486, 0, 0, 120039, 42683, 71848, 983055, 7114, + 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929, 6792, 43201, 0, + 19963, 5698, 194768, 983941, 92933, 71887, 5644, 10292, 65546, 69727, + 68141, 8372, 0, 65116, 0, 120022, 10175, 10388, 42799, 94100, 41013, + 10568, 0, 983618, 2869, 917843, 41015, 74473, 2785, 4366, 0, 10954, + 41802, 0, 42608, 78469, 9884, 4759, 73768, 120296, 10266, 41359, 1170, + 43365, 69810, 73908, 1609, 902, 92773, 63936, 127239, 11661, 8122, 5818, + 0, 0, 3861, 9540, 11028, 2554, 5158, 5714, 2213, 0, 0, 807, 43079, 0, + 78475, 976, 5511, 64553, 0, 42155, 983317, 41356, 74110, 118801, 71043, + 120080, 8676, 983291, 94002, 5582, 451, 63941, 5798, 9349, 42018, 127858, + 0, 78681, 43609, 5906, 120553, 1440, 0, 128853, 120016, 70342, 11005, + 983697, 66656, 66044, 0, 128592, 128793, 0, 43393, 10094, 70164, 11529, + 10857, 92944, 66436, 6546, 93, 8102, 67323, 68405, 0, 194714, 8171, + 118888, 119097, 127064, 917543, 383, 7154, 41656, 43495, 94040, 67162, + 5187, 71296, 71086, 11286, 68620, 64217, 0, 5232, 0, 41009, 127377, + 41005, 0, 0, 983827, 8292, 125108, 4980, 8860, 71054, 10028, 65291, 7076, + 13182, 194705, 128224, 127974, 10631, 66031, 7972, 0, 78785, 0, 7900, + 128590, 11309, 3806, 4198, 42725, 0, 67656, 9995, 0, 92552, 0, 12931, + 983690, 42684, 74285, 2088, 64213, 64366, 65156, 8814, 42238, 74771, 0, + 917831, 12836, 0, 0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0, + 65865, 0, 194650, 127144, 0, 9342, 120464, 70376, 64516, 0, 78792, 10129, + 41007, 74375, 0, 40995, 12209, 41012, 119136, 0, 0, 69724, 40992, 92264, + 127153, 68653, 43558, 5522, 0, 61, 194780, 74105, 3633, 983900, 65162, + 41234, 12089, 78281, 9771, 983905, 13251, 128701, 0, 6262, 2784, 42743, + 71078, 8126, 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, 119623, 43266, + 7108, 194779, 10890, 74481, 65834, 8324, 118944, 64417, 74817, 127465, + 64737, 74853, 983659, 8930, 66678, 67216, 1193, 10056, 1800, 13253, + 13252, 7829, 0, 0, 7743, 0, 124996, 77904, 77913, 77905, 9034, 6039, + 129139, 10075, 0, 41018, 65683, 10338, 66469, 0, 0, 0, 42815, 92984, + 41966, 0, 127471, 0, 11792, 43064, 41025, 911, 7539, 0, 40963, 120339, + 65159, 64390, 0, 983160, 5520, 11662, 128468, 65330, 42812, 0, 0, 12326, + 71081, 194638, 42808, 128337, 9348, 64901, 983861, 0, 128328, 66839, 0, + 0, 917584, 43702, 983148, 5857, 65342, 92727, 119120, 120079, 8644, 0, 0, + 11186, 74296, 41909, 0, 66900, 2791, 69663, 1891, 69824, 66397, 41907, + 66647, 118939, 8761, 12942, 5748, 0, 10773, 70868, 983295, 8796, 78149, + 6412, 2061, 8520, 13146, 127185, 63931, 0, 65902, 2882, 0, 0, 12843, + 4520, 120345, 92459, 0, 983660, 0, 73860, 0, 0, 64345, 0, 9201, 128314, + 70871, 0, 0, 43679, 917585, 65117, 92270, 0, 10427, 0, 3844, 6842, 9755, + 1110, 6612, 12222, 93030, 128789, 0, 983096, 783, 194935, 0, 127221, + 92549, 194720, 65056, 3620, 41180, 68378, 4556, 0, 68480, 194933, 74250, + 0, 67657, 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, 93958, 9839, + 120700, 12891, 983755, 983636, 63999, 2016, 41917, 9788, 63928, 67696, + 1862, 65800, 9155, 66623, 9786, 65082, 41919, 8579, 41914, 7981, 0, + 66017, 4508, 64883, 92456, 92522, 127814, 0, 64592, 74276, 67688, 6784, + 78788, 68181, 0, 71218, 113821, 66366, 12147, 9024, 66378, 66472, 983929, + 64289, 65289, 78151, 66658, 71935, 64509, 78152, 113697, 126505, 11051, + 194928, 0, 11355, 65885, 128773, 127941, 41214, 0, 12299, 0, 7500, 4506, + 7773, 0, 0, 9963, 68649, 126609, 4040, 120570, 6167, 74519, 63922, 6594, + 983740, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988, 41955, 126990, + 63993, 10440, 9611, 65605, 6803, 0, 7738, 63986, 11446, 63984, 92641, + 3435, 78164, 43814, 43810, 7029, 64258, 41292, 118898, 12748, 42742, + 9517, 11518, 128168, 78790, 0, 67993, 63956, 42458, 63954, 63953, 63960, + 9591, 4516, 10217, 68370, 11469, 69697, 42306, 2723, 118947, 0, 0, 0, 0, + 0, 11397, 2880, 70806, 0, 2872, 0, 128506, 3498, 4378, 917539, 4270, 0, + 65551, 68205, 6633, 43387, 0, 5230, 194991, 0, 0, 0, 0, 8161, 393, 12013, + 0, 983198, 119103, 415, 63964, 63963, 42345, 92310, 5183, 1877, 42498, 0, + 2927, 71058, 63961, 4472, 0, 0, 78159, 69699, 917936, 42340, 4756, + 128078, 7081, 10730, 7691, 10331, 63830, 119625, 42922, 42103, 8628, + 9813, 0, 42453, 1604, 9565, 10539, 69701, 65764, 41415, 65767, 129196, + 8457, 42301, 11372, 64873, 11992, 0, 0, 63980, 11801, 3622, 983124, + 64336, 12017, 10463, 63981, 4967, 64189, 1966, 43628, 983908, 983292, + 194766, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973, 402, 92213, + 13147, 128692, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805, 0, + 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 74813, 74425, 11299, 1561, + 118881, 92318, 64942, 93021, 194733, 70411, 194732, 0, 74301, 127893, + 11280, 128489, 69784, 74060, 0, 0, 119664, 5145, 12486, 65018, 66516, + 5409, 127379, 194669, 7402, 5399, 9685, 74089, 7952, 5401, 0, 66616, + 66832, 92966, 129105, 5405, 127875, 64866, 127864, 119583, 119122, 78784, + 74248, 11330, 194723, 64690, 3254, 0, 0, 128207, 42390, 43678, 194725, + 983909, 65077, 129059, 6388, 3355, 9508, 9867, 5723, 11520, 5611, 0, + 3377, 0, 0, 74354, 0, 78228, 983722, 983762, 42691, 127886, 127198, + 74767, 0, 127075, 1379, 246, 0, 983761, 3788, 983106, 11041, 67202, + 66304, 0, 0, 8917, 42403, 301, 0, 128500, 127046, 0, 0, 113822, 10656, + 125042, 65214, 92987, 42567, 92217, 13163, 983204, 120831, 74597, 3182, + 0, 0, 0, 65034, 65889, 42169, 4755, 74244, 194621, 11443, 983603, 66319, + 6841, 608, 600, 0, 1219, 3934, 64206, 11483, 74510, 119117, 74485, 42442, + 65470, 983907, 64202, 13160, 7759, 42482, 485, 69982, 70505, 9828, 0, + 43505, 42280, 0, 9351, 7778, 64379, 7496, 42431, 6916, 1208, 0, 119631, + 11002, 42470, 0, 68315, 0, 0, 74041, 0, 70045, 43539, 5411, 42196, 0, 0, + 0, 9150, 66831, 42393, 13086, 1310, 66848, 9337, 12052, 10643, 55271, + 128951, 12166, 2546, 194683, 213, 118852, 65611, 0, 194822, 194756, + 74310, 6554, 0, 11914, 5452, 0, 0, 92772, 0, 0, 194681, 92560, 2713, + 129029, 9650, 43330, 0, 128505, 1406, 125007, 42925, 74638, 194593, + 68223, 4143, 128136, 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, 194783, 65736, 41951, 64816, + 65756, 983205, 12955, 10596, 2888, 194645, 0, 0, 9657, 9019, 125077, 0, + 2878, 5390, 0, 194961, 67325, 68679, 43552, 7501, 6328, 194960, 10429, + 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986, 43838, 10632, + 11934, 11452, 1332, 0, 194970, 126647, 0, 118887, 1791, 5191, 9288, + 64822, 2892, 127242, 43394, 555, 0, 0, 66646, 128980, 119002, 13151, + 74512, 7289, 74055, 64161, 8854, 64162, 5858, 41927, 10582, 120457, 1784, + 1361, 195047, 0, 7905, 0, 64868, 128813, 13158, 92166, 7211, 71884, 9371, + 73973, 128441, 6828, 1625, 7664, 0, 1342, 68440, 64171, 92642, 10903, + 983494, 0, 92527, 0, 70438, 4482, 41606, 0, 128569, 983112, 0, 64381, 0, + 194974, 195090, 42245, 126467, 41972, 0, 444, 0, 9127, 66687, 66619, + 126489, 78025, 0, 11349, 40991, 917570, 0, 70177, 120830, 0, 1197, + 128282, 1149, 68316, 0, 0, 40990, 43765, 0, 3492, 917906, 118784, 0, 0, + 0, 12838, 67208, 19948, 41677, 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, + 41309, 128161, 0, 8152, 0, 41550, 12227, 983613, 0, 12828, 127511, 0, + 983971, 120708, 0, 0, 10386, 119574, 129159, 0, 92680, 983789, 68154, 0, + 1743, 0, 0, 92239, 65186, 917571, 0, 9606, 0, 0, 64439, 0, 0, 92686, + 983875, 0, 43866, 128881, 0, 3395, 9362, 10878, 128376, 0, 78362, 64830, + 0, 125046, 41091, 3426, 1344, 8870, 0, 71344, 4735, 11111, 6119, 12822, + 42699, 0, 983824, 74818, 1423, 128923, 42637, 41080, 0, 12039, 10559, + 128634, 118892, 0, 9472, 67734, 11929, 128905, 7170, 9596, 6130, 128826, + 43629, 11579, 78713, 0, 92501, 125081, 92185, 66699, 64440, 1004, 92584, + 194736, 43234, 66008, 12627, 0, 68414, 74614, 43619, 43303, 11300, 43304, + 9686, 5890, 11776, 7558, 127158, 65627, 0, 10718, 13154, 3461, 9139, 0, + 983094, 0, 0, 65365, 73877, 65628, 78019, 120319, 0, 41708, 12860, 2641, + 12069, 10838, 5403, 10352, 70085, 10061, 43237, 125057, 5140, 209, + 128847, 41704, 41056, 43078, 128125, 118809, 67232, 10899, 65469, 70125, + 0, 0, 2410, 993, 0, 120589, 120689, 78693, 0, 0, 7232, 0, 119253, 124963, + 7110, 74462, 2066, 10489, 42166, 43463, 10659, 3600, 78118, 4224, 1336, + 41518, 983932, 0, 0, 0, 41139, 64820, 92538, 12966, 41134, 0, 0, 119153, + 0, 272, 4263, 8793, 983856, 0, 41502, 128133, 983, 12549, 124940, 0, + 1190, 4109, 1335, 841, 5888, 41358, 64863, 9544, 43481, 0, 194806, 70027, + 2099, 5120, 2409, 7799, 0, 74424, 0, 0, 4731, 92279, 66629, 0, 0, 1255, + 4149, 9247, 0, 9913, 0, 0, 64914, 917787, 65101, 113714, 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, + 92465, 0, 93960, 983322, 126581, 10695, 0, 7540, 0, 881, 7857, 6067, + 65164, 0, 0, 129134, 13311, 68403, 41857, 64321, 8359, 983311, 12689, + 983310, 194594, 0, 983312, 71859, 68183, 0, 983314, 1287, 5436, 0, 71097, + 74142, 92328, 74152, 70205, 6051, 10497, 69668, 8985, 12109, 983323, 0, + 93043, 0, 0, 3652, 10537, 120282, 1276, 120440, 6549, 279, 73745, 0, + 128664, 0, 1489, 0, 0, 0, 3899, 1007, 42124, 43828, 42122, 92337, 92367, + 0, 11985, 1345, 78600, 119832, 917601, 8956, 43083, 94057, 42138, 78610, + 129131, 6430, 78608, 78604, 78605, 6285, 78603, 78612, 78613, 65942, 492, + 8685, 128481, 983759, 0, 78622, 43712, 2582, 11470, 64538, 7444, 78615, 78616, 2297, 0, 73837, 119823, 2527, 119824, 197, 2799, 92594, 41944, - 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, 119827, 119817, 119828, + 120276, 9933, 74011, 66515, 767, 5524, 7028, 0, 0, 119827, 119817, 92950, 78633, 10896, 0, 1799, 120497, 6971, 74336, 128342, 0, 65340, 118979, - 41551, 2434, 94018, 0, 120579, 0, 4631, 0, 0, 6407, 0, 6338, 43214, 0, - 7570, 0, 3192, 0, 8414, 0, 93983, 0, 0, 0, 9164, 66612, 93959, 3171, - 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, 74390, 64603, 70066, - 69241, 9599, 78629, 43084, 78627, 78628, 78625, 2399, 69693, 8994, 10944, - 41208, 983713, 41168, 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, - 78634, 1947, 0, 0, 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, - 65359, 0, 8017, 119831, 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, - 120696, 4904, 983333, 69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, - 119587, 64415, 0, 0, 5398, 0, 127386, 93953, 0, 0, 119015, 0, 0, 9476, 0, - 983777, 12763, 126603, 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, 983230, 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, 983041, 126627, 1337, 64967, 1629, 0, - 796, 66506, 0, 74123, 12877, 120649, 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, 69907, 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, 70057, 127254, 8114, - 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051, 10460, 43364, - 118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703, 43152, 42489, - 42112, 127978, 1875, 10808, 42109, 120284, 41860, 64862, 13305, 64907, - 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 983277, - 119830, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, - 73759, 43100, 69888, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753, - 65178, 4684, 78701, 119653, 0, 126551, 0, 6048, 74460, 42110, 73965, - 10870, 8557, 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731, - 6035, 0, 7651, 10296, 64443, 0, 983295, 917987, 0, 118966, 74144, 40997, - 0, 10392, 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 13307, 41000, 0, - 119239, 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, - 41200, 128583, 4425, 0, 0, 0, 43074, 73799, 983200, 78147, 0, 12173, - 78545, 0, 127011, 65338, 0, 0, 119582, 4474, 0, 43093, 128644, 1587, 0, - 127372, 64475, 128098, 1369, 983672, 9959, 7927, 0, 4560, 0, 0, 92277, - 983621, 64948, 4430, 74347, 42601, 4514, 66434, 93955, 8194, 65462, - 10626, 10965, 0, 8893, 983301, 12542, 0, 65341, 0, 65829, 7925, 119822, - 10475, 0, 0, 1352, 11069, 7707, 127560, 126486, 65279, 127102, 68207, - 127100, 7099, 6040, 127097, 10071, 0, 9336, 43750, 0, 8899, 7798, 64474, - 64259, 69873, 65188, 7820, 43018, 127082, 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, 983076, 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, 71312, - 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, 983606, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, - 12717, 0, 7607, 10639, 43396, 0, 0, 41643, 74134, 983054, 8713, 41640, - 10221, 41645, 66712, 6645, 646, 66726, 66711, 42129, 93994, 77901, 3472, - 8697, 0, 0, 983815, 0, 0, 0, 5809, 1950, 119356, 92432, 74572, 0, 42136, - 0, 0, 0, 0, 3247, 119854, 65017, 983953, 68428, 66668, 0, 0, 10983, 0, 0, - 0, 41567, 0, 0, 0, 194624, 119853, 0, 0, 8285, 0, 4509, 0, 66471, 12216, - 0, 40988, 92592, 74809, 41727, 0, 42848, 2396, 917766, 0, 74018, 917538, - 64940, 7027, 3886, 0, 42457, 119008, 0, 996, 68123, 94058, 4249, 0, - 917594, 11707, 8222, 0, 7939, 92454, 92460, 127801, 917592, 128359, 8534, - 127154, 40983, 0, 983240, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549, - 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, 0, 1563, 128034, 9619, - 983940, 0, 0, 127872, 71363, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0, - 65009, 983942, 12567, 128703, 0, 41412, 0, 0, 3607, 9200, 10046, 9612, - 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, 0, 43085, 6057, 508, - 93968, 128015, 67968, 0, 92405, 0, 0, 638, 6083, 119072, 0, 0, 2305, - 78348, 68096, 0, 6056, 6659, 67969, 0, 6085, 0, 0, 3915, 41634, 0, 41639, - 63912, 11941, 0, 4028, 1787, 42180, 43096, 43753, 3249, 1768, 93982, - 12328, 501, 93985, 10601, 0, 583, 0, 41977, 0, 66004, 119350, 6505, - 74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, 73764, 0, 92376, - 12745, 9678, 0, 120587, 9869, 128815, 1771, 0, 8936, 0, 0, 4208, 78341, - 78567, 78342, 0, 983456, 74101, 0, 11762, 0, 92422, 77997, 68010, 66475, - 0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026, + 41551, 2434, 94018, 126642, 65353, 0, 4631, 118996, 0, 6407, 113737, + 6338, 43214, 0, 7570, 0, 3192, 0, 8414, 983390, 93983, 0, 0, 0, 9164, + 66612, 93959, 3171, 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, + 74390, 64603, 70066, 69241, 9599, 78629, 43084, 78627, 78628, 78625, + 2399, 69693, 8994, 10944, 41208, 983713, 41168, 8178, 74859, 3367, 92334, + 42510, 78641, 78636, 6804, 70475, 1947, 917579, 0, 92681, 42759, 11068, + 1705, 9331, 0, 74798, 9181, 65359, 125065, 8017, 119831, 65096, 66720, + 71906, 43475, 0, 4909, 12126, 128673, 120696, 4904, 983333, 43503, 1365, + 9253, 42757, 43436, 7462, 127772, 0, 0, 0, 66845, 64415, 120500, 128869, + 5398, 125035, 127386, 93953, 127362, 983782, 119015, 0, 128083, 9476, 0, + 120695, 12763, 126603, 3629, 126626, 13005, 11181, 3628, 0, 0, 92502, + 3469, 42107, 42116, 917578, 64809, 2928, 4905, 9853, 851, 9040, 0, 64665, + 43086, 9114, 43870, 42583, 9315, 4822, 4906, 3852, 2847, 119821, 3236, + 11317, 1251, 7777, 41852, 11410, 10964, 0, 43222, 12646, 120269, 10259, + 9865, 65821, 0, 6018, 68293, 917917, 12276, 119110, 68372, 0, 92259, + 71893, 0, 119828, 10467, 0, 2443, 10918, 78217, 77947, 1001, 9241, 1927, + 0, 124942, 73987, 127885, 71895, 93012, 7992, 77943, 65678, 12867, + 128787, 8260, 77945, 7519, 11505, 12274, 8904, 518, 65857, 128361, + 128674, 13204, 4387, 857, 983866, 65369, 0, 92336, 43125, 11842, 0, + 71072, 0, 0, 5136, 1968, 128906, 126627, 1337, 64967, 1629, 0, 796, + 66506, 0, 74123, 12877, 120649, 42314, 43388, 43826, 74403, 6120, 478, + 65151, 68128, 128147, 43082, 6016, 0, 42284, 71894, 4276, 1206, 3619, + 41638, 69691, 3843, 12011, 8853, 3361, 0, 490, 10715, 7578, 68384, 92754, + 65350, 10530, 12348, 8653, 68245, 42435, 6154, 9551, 65354, 78522, 784, + 42397, 334, 194676, 42416, 65356, 65273, 67243, 69666, 4442, 10364, 0, + 778, 41626, 42455, 7989, 74063, 3227, 69907, 125116, 11102, 2915, 11502, + 41022, 41702, 10309, 127035, 78320, 120273, 6975, 0, 5415, 12176, 0, + 74193, 3462, 65215, 42629, 78691, 71175, 0, 127256, 9759, 127255, 70057, + 127254, 8114, 78698, 78697, 78696, 78695, 8710, 42495, 118956, 70189, + 4051, 10460, 43364, 71206, 1356, 12161, 42713, 128857, 127268, 1619, + 9703, 43152, 42489, 42112, 66896, 1875, 10808, 42109, 120284, 41860, + 64862, 13305, 64907, 5289, 13144, 128658, 983224, 5575, 9675, 195018, + 5940, 226, 2649, 6336, 983277, 92979, 43236, 3382, 42449, 6498, 1658, + 11936, 78232, 113814, 11269, 10151, 73759, 43100, 69888, 65508, 0, 0, 0, + 8935, 78234, 0, 983757, 0, 616, 74753, 65178, 4684, 78701, 119653, 74631, + 126551, 0, 6048, 74460, 42110, 73965, 10870, 8557, 11054, 68664, 119049, + 9681, 4475, 67429, 41142, 2100, 125024, 120731, 6035, 73796, 7651, 6846, + 64443, 983957, 983294, 917987, 0, 118966, 74144, 40997, 68488, 10392, + 10328, 40998, 43462, 74488, 71182, 9800, 8979, 0, 13307, 41000, 0, + 119239, 6487, 3386, 129094, 10344, 0, 65299, 5394, 43246, 78243, 10220, + 66505, 41200, 128582, 4425, 0, 0, 0, 43074, 73799, 129076, 78147, 0, + 12173, 78545, 0, 66824, 65338, 983676, 0, 119582, 4474, 128936, 43093, + 128644, 1587, 0, 127372, 64475, 128098, 1369, 983672, 9959, 7927, 0, + 4560, 0, 0, 92277, 983621, 64948, 4430, 74347, 42601, 4514, 66434, 93955, + 8194, 65462, 10626, 10965, 0, 8893, 983301, 12542, 0, 65341, 67703, + 65829, 7925, 119822, 10475, 113825, 0, 1352, 11069, 7707, 127560, 126486, + 65279, 127102, 68207, 127100, 7099, 6040, 67681, 10071, 78554, 9336, + 43750, 128507, 8899, 7798, 64474, 64259, 69873, 65188, 7820, 43018, + 127082, 128898, 7746, 1492, 78551, 10884, 77982, 66866, 5127, 11285, + 42501, 5495, 4273, 43095, 41426, 10849, 5730, 2999, 6342, 68636, 74304, + 371, 64373, 6023, 169, 5497, 11708, 0, 128603, 6323, 129065, 8224, + 128417, 8938, 6043, 12738, 120671, 983076, 5321, 68645, 194798, 120251, + 2589, 74332, 1689, 7802, 4683, 74318, 42704, 92940, 11905, 0, 0, 128516, + 128163, 74513, 6049, 0, 4027, 834, 118962, 1803, 983822, 1503, 0, 0, + 71312, 5731, 1381, 2387, 126610, 70808, 8289, 64525, 65817, 2881, 43142, + 0, 9601, 2879, 9668, 9766, 0, 5729, 129110, 71230, 6036, 64881, 4026, + 9361, 127091, 2887, 70389, 3526, 6298, 119851, 77897, 120095, 78519, + 118964, 8572, 6021, 77896, 128288, 71174, 43155, 0, 71197, 3146, 10959, + 9483, 0, 77893, 10981, 166, 917841, 8635, 917840, 10623, 408, 119058, + 127507, 13298, 0, 7426, 41641, 12717, 0, 7607, 10639, 43396, 0, 119089, + 41643, 74134, 983054, 8713, 41640, 10221, 41645, 66293, 6645, 646, 66726, + 66711, 42129, 68255, 77901, 3472, 8697, 0, 0, 983815, 0, 194599, 0, 5809, + 1950, 119356, 92432, 68339, 0, 42136, 0, 0, 0, 0, 3247, 92402, 65017, + 128794, 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, 0, 0, 78446, + 119853, 127922, 0, 8285, 0, 4509, 917802, 66471, 12216, 0, 40988, 92592, + 74809, 41727, 0, 42848, 2396, 129078, 0, 74018, 917538, 64940, 7027, + 3886, 0, 42457, 92888, 119834, 996, 68123, 94058, 4249, 92410, 69650, + 11707, 8222, 73825, 7939, 71213, 92460, 127801, 917592, 128359, 8534, + 69853, 40983, 0, 983240, 0, 7201, 12561, 0, 42371, 12558, 1540, 917549, + 10052, 40982, 0, 0, 1488, 71177, 0, 194831, 917559, 128401, 0, 1563, + 128034, 9619, 983940, 0, 983082, 127872, 71363, 3560, 7797, 6070, 10006, + 128922, 2922, 6082, 70147, 65009, 983942, 12567, 66712, 0, 41412, 0, 0, + 3607, 9200, 10046, 9612, 42153, 8218, 9485, 0, 2032, 78354, 917904, + 119131, 0, 0, 0, 43085, 6057, 508, 93968, 92989, 67968, 0, 92198, 0, 0, + 638, 6083, 119072, 124950, 0, 2305, 78348, 68096, 0, 6056, 6659, 67969, + 983288, 6085, 0, 0, 3915, 41634, 0, 41639, 63912, 11941, 983783, 4028, + 1787, 42180, 43096, 43753, 3249, 1768, 93982, 12328, 501, 93985, 10601, + 0, 583, 0, 41977, 0, 66004, 66416, 6505, 74010, 0, 13064, 55267, 119113, + 6500, 5526, 65049, 0, 12990, 0, 92376, 12745, 9678, 983143, 120587, 9869, + 128815, 1771, 128965, 8936, 92964, 0, 4208, 78341, 78567, 78342, 67742, + 983208, 74101, 128605, 11762, 0, 70096, 6835, 68010, 66475, 120260, 5027, + 78172, 128878, 119830, 5069, 73736, 5028, 9897, 92774, 73739, 5026, 983253, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138, - 119361, 983564, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, - 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983679, 10600, 917867, - 620, 41001, 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025, - 69892, 983209, 0, 118885, 0, 65557, 0, 74541, 983587, 11599, 128209, - 11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569, - 65275, 8906, 127096, 5755, 2636, 983227, 10815, 11619, 2301, 41540, 7815, - 11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048, - 917763, 829, 0, 92406, 19950, 0, 126482, 6616, 0, 118875, 10953, 391, 0, - 69785, 482, 42296, 11588, 0, 43606, 0, 68397, 66370, 74506, 42335, - 983188, 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, 2215, 41662, 94010, 0, - 0, 0, 93952, 4578, 64513, 41664, 983734, 42578, 128794, 41661, 78715, - 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 983127, 42476, 7730, - 983859, 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, 74360, 0, 13193, 64350, 11666, - 8679, 41924, 1576, 7735, 92398, 0, 73840, 983092, 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, 71329, 10302, 128112, 10104, 1027, 5181, 0, 0, 10523, 1446, - 42320, 41646, 991, 5189, 42472, 41647, 120105, 1722, 5581, 42898, 3405, - 0, 194644, 5523, 0, 42620, 92447, 983819, 9549, 0, 10549, 55282, 9661, - 43682, 0, 77910, 120026, 78708, 0, 77911, 0, 41991, 983893, 0, 7630, - 9846, 7684, 10350, 0, 1174, 77981, 42733, 77978, 77980, 66485, 77977, - 42277, 77974, 42456, 65667, 127037, 12330, 128272, 0, 42417, 42383, - 66630, 41344, 6293, 0, 66252, 77984, 74443, 0, 10209, 8313, 4195, 74435, - 1316, 66690, 120032, 6332, 64894, 0, 65871, 78060, 1736, 983684, 3901, - 12228, 120151, 65200, 3383, 10446, 78841, 693, 9130, 314, 64149, 42420, - 11949, 983669, 120152, 11026, 128788, 5332, 6940, 64154, 12635, 127007, - 42706, 1751, 273, 8165, 13166, 120763, 78840, 71368, 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, 983868, - 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 983871, - 1023, 474, 0, 119818, 0, 0, 42487, 65556, 0, 127866, 42295, 0, 0, 71322, - 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, 93970, 64597, 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937, - 983751, 0, 41835, 4047, 41842, 0, 64107, 0, 0, 11017, 120601, 0, 293, - 77966, 92169, 64791, 41827, 42466, 43422, 10579, 8560, 71350, 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, 983046, 7082, 73775, 338, 5059, - 194719, 0, 42328, 10767, 0, 8115, 0, 74758, 0, 8227, 2073, 1218, 917790, - 0, 65848, 0, 0, 69863, 0, 126987, 4486, 0, 0, 0, 10925, 0, 0, 0, 983586, - 42309, 10257, 65191, 10273, 0, 10305, 42461, 0, 42349, 8832, 78051, - 64127, 10644, 42662, 78828, 42278, 74451, 126988, 69874, 7794, 0, 42429, - 6377, 42316, 119026, 3669, 3968, 42468, 71319, 69658, 0, 65402, 119581, - 0, 0, 64933, 0, 41960, 6699, 0, 0, 128354, 6823, 42391, 1588, 65400, - 8409, 78223, 19967, 65398, 787, 71315, 917939, 127744, 6115, 2078, 41654, - 42480, 0, 92650, 41655, 65401, 43975, 0, 0, 0, 644, 65500, 41657, 10778, - 3659, 9533, 184, 1553, 13107, 65484, 69648, 10502, 74457, 0, 0, 41554, 0, - 8220, 917943, 41557, 0, 0, 11070, 119221, 5157, 4020, 73858, 41555, 9514, - 64818, 65103, 64641, 64303, 78131, 7520, 0, 74377, 11029, 66651, 983068, - 0, 118930, 64527, 0, 7877, 73803, 983798, 127348, 120096, 74602, 9955, + 119361, 983564, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, + 7658, 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983679, 10600, + 917867, 620, 41001, 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 68137, + 5025, 69892, 983209, 0, 118885, 127956, 65557, 0, 74541, 128924, 11599, + 128209, 11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, + 74195, 11569, 65275, 8906, 127096, 5755, 2636, 71203, 10815, 11619, 2301, + 41540, 7815, 11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, + 78498, 41048, 917763, 829, 0, 92406, 19950, 66886, 126482, 6616, 0, + 118875, 10953, 391, 0, 69785, 482, 42296, 11588, 0, 43606, 71185, 68397, + 66370, 74282, 42335, 983188, 72421, 983799, 7538, 5315, 120644, 42491, + 92901, 42061, 128002, 4576, 0, 68417, 43809, 4277, 0, 3563, 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, + 194924, 43300, 5156, 92629, 70350, 929, 6827, 42035, 42437, 1555, 0, + 8691, 66435, 2215, 41662, 94010, 0, 0, 128824, 93952, 4578, 64513, 41664, + 983734, 42578, 71049, 41661, 78351, 43267, 9356, 0, 0, 0, 1286, 10166, + 983117, 0, 64707, 128925, 42476, 7730, 11156, 128522, 42483, 0, 128404, + 42324, 42291, 10020, 43359, 0, 6641, 525, 41627, 917923, 8763, 128304, + 41628, 533, 11931, 65225, 8321, 42504, 42581, 0, 6915, 42310, 4377, 8559, + 128321, 74360, 125100, 13193, 64350, 11666, 8679, 41924, 1576, 7735, + 92398, 0, 73840, 983092, 11374, 78043, 10889, 43461, 7757, 42462, 120226, + 10029, 66493, 2718, 4168, 73842, 13308, 120112, 0, 1179, 4440, 0, 77948, + 363, 11015, 66817, 77944, 43857, 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, 70165, 1043, + 43652, 66223, 10090, 0, 124945, 313, 129033, 41881, 0, 42311, 7445, + 119244, 5750, 10759, 9419, 55222, 9405, 11268, 42919, 9398, 8526, 9399, + 9422, 0, 66495, 69990, 0, 92990, 41718, 10707, 1603, 983703, 119003, 0, + 631, 77952, 69703, 13161, 65272, 71067, 10546, 74210, 78101, 11600, + 77961, 2797, 73821, 42427, 306, 714, 3058, 42381, 77962, 127080, 12351, + 42395, 0, 11607, 127528, 11198, 66821, 77967, 9157, 73765, 66364, 42433, + 77964, 7603, 12803, 180, 42141, 0, 120612, 66494, 12674, 8244, 362, + 92439, 125096, 8037, 43777, 11535, 0, 74845, 5185, 7165, 5521, 10334, + 2093, 71329, 10302, 125131, 10104, 1027, 5181, 983146, 0, 10523, 1446, + 42320, 6845, 991, 5189, 42472, 41647, 120105, 1722, 5581, 42898, 3405, 0, + 194644, 5523, 0, 42620, 92447, 124988, 9549, 0, 10549, 55282, 9661, + 43682, 0, 77910, 78068, 68247, 0, 71184, 983070, 41991, 983893, 0, 7630, + 9846, 7684, 10350, 128453, 1174, 77981, 42733, 77978, 77980, 66485, + 77977, 42277, 77974, 42456, 65667, 74438, 12330, 128272, 0, 42417, 42383, + 66630, 41344, 6293, 0, 66252, 77984, 74443, 127894, 10209, 8313, 4195, + 74435, 1316, 66690, 120032, 6332, 64894, 983156, 65871, 78060, 1736, + 983684, 3901, 12228, 120151, 65200, 3383, 10446, 78241, 693, 9130, 314, + 64149, 42420, 11949, 983669, 120152, 11026, 120516, 5332, 6940, 64154, + 12635, 124980, 42706, 1751, 273, 8165, 13166, 120763, 78840, 71368, + 12824, 0, 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, + 3757, 0, 0, 74302, 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, + 7921, 983868, 73862, 127981, 41848, 2567, 66006, 92622, 4044, 92646, 0, + 12233, 983871, 1023, 474, 0, 119818, 0, 0, 42487, 65556, 0, 127866, + 42295, 0, 125114, 71322, 92518, 2222, 66499, 0, 5417, 12275, 10895, 0, + 274, 0, 1858, 0, 0, 55251, 10118, 3133, 128008, 71857, 0, 9610, 8068, + 8197, 0, 699, 0, 41665, 5868, 128710, 92695, 42182, 7581, 19940, 43668, + 41667, 128057, 0, 1923, 65583, 65802, 93970, 64597, 43444, 119184, 71855, + 0, 6464, 7036, 2996, 1937, 983751, 68481, 41835, 4047, 41842, 0, 64107, + 77965, 983746, 11017, 120601, 0, 293, 77966, 92169, 64791, 41827, 42466, + 43422, 10579, 8560, 71350, 65413, 77963, 4803, 12964, 1739, 1941, 3900, + 128967, 1713, 77969, 0, 73957, 11407, 42441, 41971, 6297, 120098, 64105, + 128080, 42481, 11716, 66473, 7179, 42289, 125095, 64103, 969, 0, 9352, + 983149, 6165, 64100, 0, 6632, 73861, 42402, 74327, 7806, 0, 8914, 66908, + 124954, 3183, 1435, 64876, 2969, 6046, 64441, 6208, 67849, 5746, 66408, + 0, 64416, 42422, 0, 983046, 7082, 73775, 338, 5059, 194719, 129145, + 42328, 10767, 0, 8115, 0, 74758, 0, 8227, 2073, 1218, 917790, 983230, + 65848, 92884, 0, 69863, 0, 126987, 4486, 128082, 0, 0, 10925, 0, 119868, + 0, 124952, 42309, 10257, 65191, 10273, 7668, 10305, 42461, 0, 42349, + 8832, 78051, 64127, 10644, 42662, 78828, 42278, 74451, 126988, 69874, + 7794, 119867, 42429, 6377, 42316, 119026, 3669, 3968, 42468, 71319, + 69658, 0, 65402, 119581, 0, 128747, 64933, 194815, 41960, 6699, 42903, + 128755, 125013, 6823, 42391, 1588, 43502, 8409, 78223, 19967, 65398, 787, + 71315, 917939, 127744, 6115, 2078, 41654, 42480, 0, 92650, 41655, 65401, + 43975, 72427, 0, 113816, 644, 65500, 41657, 10778, 3659, 9533, 184, 1553, + 13107, 65484, 69648, 10502, 66296, 0, 0, 41554, 0, 8220, 129031, 41557, + 0, 128938, 11070, 119221, 5157, 4020, 73858, 41555, 9514, 64818, 65103, + 64641, 64303, 78131, 7520, 73888, 74377, 11029, 66651, 983068, 128492, + 118930, 64527, 0, 7877, 12723, 983798, 127348, 120096, 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, 983927, 8315, 65444, 983793, 0, 74595, 6152, 0, 0, 6629, 127108, - 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, 127106, 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, 127369, 64387, 4115, 0, 5005, - 64070, 64073, 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, - 65436, 0, 2120, 43302, 1224, 0, 65576, 74192, 10701, 1764, 3101, 127815, - 12858, 120159, 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, - 2129, 0, 9222, 983738, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, - 42331, 64935, 0, 0, 1293, 7947, 2132, 983767, 74593, 120308, 2454, 42717, - 3613, 128837, 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, - 120304, 983114, 8822, 0, 1157, 64903, 8638, 0, 0, 0, 0, 69848, 8235, - 120316, 4405, 10086, 120247, 0, 69216, 0, 65430, 71321, 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, - 120325, 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, 2281, 69904, 0, 1988, 5407, 67865, - 2430, 41678, 0, 120243, 2336, 983903, 0, 78871, 120442, 983769, 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, - 983089, 1854, 10794, 0, 67660, 69846, 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, 194652, 127473, 8421, 127472, - 69682, 43705, 502, 0, 65431, 119056, 69954, 12043, 1303, 316, 7364, 2029, - 2136, 119246, 11533, 64365, 43480, 92639, 4860, 126648, 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, 69854, 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, 983581, 74054, 127754, 195029, 0, 839, 983319, 7695, 8769, 65246, - 4829, 194663, 4859, 64467, 0, 983963, 118998, 7206, 0, 6647, 43986, 0, - 69766, 0, 64764, 4210, 983863, 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, 983149, 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, - 92378, 120549, 119082, 64295, 120418, 0, 64765, 73923, 120417, 120662, - 69920, 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, 9354, 983164, 128833, 41199, 10121, 2028, - 0, 983194, 69715, 0, 3062, 0, 74447, 12608, 0, 66440, 7545, 9700, 12580, - 92205, 120777, 120502, 41155, 0, 74071, 0, 983457, 12713, 0, 0, 0, 78772, - 0, 1734, 0, 0, 127040, 64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, - 983979, 1230, 0, 0, 3597, 4446, 10584, 74235, 92215, 4037, 127938, 8352, - 0, 5687, 0, 64515, 0, 194801, 55265, 67846, 78434, 9704, 0, 0, 70080, - 71338, 0, 8660, 126495, 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, 67979, 983690, 6360, 10897, 41230, 605, 0, - 74785, 69875, 0, 0, 41500, 0, 311, 11453, 6221, 10608, 64943, 74280, - 10877, 118868, 64885, 74272, 0, 0, 128559, 120736, 74312, 345, 0, 74456, - 64606, 9917, 0, 92231, 5037, 0, 1776, 8422, 0, 118814, 41508, 41201, 323, - 43328, 0, 42698, 1295, 194853, 4625, 0, 4630, 13117, 0, 128772, 65123, + 9502, 65427, 125048, 65424, 12607, 0, 9734, 65425, 0, 983808, 127357, + 78835, 78836, 10112, 10827, 0, 9866, 74527, 66675, 118867, 8625, 64346, + 11290, 10477, 67738, 8636, 983927, 8315, 65444, 983793, 195011, 74595, + 6152, 0, 73947, 6629, 125056, 120171, 0, 74589, 43993, 128346, 69790, + 64435, 64955, 43690, 11046, 11490, 42730, 4485, 127107, 0, 64926, 0, 0, + 43830, 5869, 12437, 42728, 0, 7040, 3588, 0, 12825, 0, 0, 12725, 74092, + 127106, 78634, 223, 78635, 69675, 120166, 42444, 128449, 64499, 65245, + 129104, 1171, 128802, 69717, 120113, 1805, 8772, 43820, 0, 9930, 65247, + 78619, 120111, 2338, 0, 118853, 0, 42676, 0, 64800, 13092, 11185, 68126, + 1213, 128419, 64075, 797, 64074, 8734, 4212, 127369, 64387, 4115, 0, + 5005, 64070, 64073, 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, + 65436, 0, 2120, 43302, 1224, 0, 65576, 70795, 10701, 1764, 3101, 127815, + 12858, 120159, 0, 11373, 6378, 71093, 120103, 8663, 9312, 41644, 4539, + 2129, 70785, 9222, 983738, 118907, 4259, 9092, 74567, 41961, 0, 12724, + 66357, 42331, 64935, 0, 0, 1293, 7947, 2132, 983767, 71858, 72440, 2454, + 42717, 3613, 128837, 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 113723, + 43087, 12595, 120304, 983114, 8822, 0, 1157, 64903, 8638, 127265, 917886, + 0, 0, 69848, 8235, 120316, 4405, 10086, 120247, 11128, 69216, 0, 65430, + 71321, 6079, 6817, 10764, 120314, 64291, 120315, 998, 120312, 11062, + 1317, 64327, 1558, 983934, 1991, 7882, 42254, 128954, 41700, 530, 0, + 10428, 119335, 12002, 119336, 5742, 43076, 4692, 64630, 41823, 4007, + 5004, 74033, 7896, 751, 6595, 6596, 120325, 66373, 983247, 0, 64908, + 92691, 6311, 93019, 12004, 119192, 12049, 43108, 120326, 71083, 41705, + 92188, 6598, 0, 6599, 66822, 93031, 42148, 118825, 66027, 0, 6597, 9412, + 8340, 11824, 64745, 2281, 69904, 128495, 1988, 5407, 67865, 2430, 41678, + 93059, 120243, 2336, 983903, 0, 67169, 120442, 127092, 1921, 10947, + 19927, 70390, 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, 9229, 10956, + 42285, 41674, 19964, 41679, 65084, 3521, 124957, 5774, 8325, 69864, + 65403, 983089, 1854, 10794, 93054, 67660, 69846, 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, 194652, 127473, 8421, + 127472, 69682, 43705, 502, 0, 65431, 119056, 69954, 12043, 1303, 316, + 7364, 2029, 2136, 119246, 11533, 64365, 43480, 92639, 4860, 126648, + 127877, 42488, 70339, 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, 11214, 65952, 78010, 9874, + 78007, 983115, 1319, 3050, 65410, 67399, 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, 71042, 7923, 3716, 92363, 9996, 8508, 127794, 7012, 8195, + 127834, 9566, 0, 3722, 0, 41707, 8493, 545, 9575, 41379, 10050, 12718, + 69854, 8859, 6820, 74345, 65110, 120740, 128978, 0, 9119, 2787, 7920, + 118823, 4021, 2012, 7985, 0, 119663, 917792, 0, 78021, 78022, 410, 78020, + 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, 10126, 12116, 41673, + 120370, 11422, 71846, 120373, 3860, 120367, 68412, 41345, 120362, 120363, + 11748, 42158, 7941, 11076, 8749, 120361, 2104, 64858, 361, 120357, 845, + 0, 41560, 11970, 4562, 917920, 2926, 68495, 4569, 74130, 128659, 43487, + 194630, 611, 74129, 64871, 118891, 65629, 0, 194858, 74854, 0, 70466, + 67392, 66385, 0, 6291, 0, 68487, 41669, 7094, 917921, 0, 983581, 74054, + 127754, 128917, 0, 839, 983319, 7695, 8769, 65246, 4829, 67756, 4859, + 64467, 0, 983963, 118998, 7206, 119636, 6647, 43986, 983796, 69766, + 194664, 64764, 4210, 983254, 127936, 804, 194651, 0, 12298, 70344, 66653, + 0, 64924, 10091, 67200, 9468, 67206, 67205, 67204, 67203, 92503, 12839, + 64669, 92202, 71851, 1279, 1425, 6224, 119229, 11049, 127123, 92697, + 42649, 8482, 92440, 0, 5032, 67209, 11940, 67207, 664, 120437, 5034, 0, + 70200, 127525, 42702, 70194, 93061, 13294, 67873, 64869, 6032, 67218, + 9115, 7430, 120377, 70191, 120819, 68387, 120168, 73913, 120170, 41161, + 5518, 4174, 10993, 41162, 120160, 64528, 1169, 434, 41437, 1905, 6034, + 41164, 64744, 9528, 67741, 128800, 524, 0, 74029, 788, 74027, 0, 71881, + 0, 1663, 10419, 42901, 42636, 67211, 67210, 0, 120656, 67215, 67214, + 67213, 67212, 0, 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, + 0, 10855, 5445, 9355, 67221, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, + 7191, 4962, 69772, 8855, 74612, 70820, 64469, 120426, 10555, 67227, + 43333, 67225, 128483, 120427, 10451, 67229, 67653, 7245, 12443, 74405, + 9947, 120149, 78317, 3873, 8367, 77842, 120146, 43433, 43649, 11987, 0, + 0, 11010, 11164, 74059, 74062, 6217, 5896, 43846, 7682, 74049, 1462, + 10235, 0, 0, 0, 43441, 127924, 127777, 42595, 0, 74402, 118860, 78661, + 120419, 92497, 66287, 120420, 92378, 120549, 119082, 64295, 120418, 0, + 64765, 73923, 120417, 120662, 69920, 194702, 6216, 67230, 10755, 9455, + 11155, 8124, 127042, 9470, 6944, 127540, 0, 69680, 2828, 0, 531, 42638, + 0, 0, 0, 43428, 8204, 3614, 2827, 9696, 120365, 0, 8728, 4354, 10904, + 78562, 19936, 7833, 120691, 0, 42599, 42597, 42709, 120409, 125012, 0, + 8537, 127306, 0, 9354, 983164, 127959, 41199, 10121, 2028, 0, 120253, + 69715, 0, 3062, 0, 74447, 12608, 0, 66440, 7545, 9700, 11948, 92205, + 120777, 120502, 41155, 68306, 74071, 0, 983457, 12713, 127519, 70402, 0, + 78772, 113770, 1734, 0, 78141, 127040, 64594, 2456, 231, 68227, 74167, + 542, 0, 118786, 983859, 194797, 1230, 983953, 126555, 3597, 4446, 10584, + 74235, 92215, 4037, 67737, 8352, 0, 5687, 0, 64515, 0, 194801, 55265, + 67846, 78434, 9704, 0, 0, 70080, 71338, 0, 8660, 126478, 0, 0, 78773, + 74482, 4483, 1709, 69721, 9909, 6080, 194851, 120358, 1746, 1315, 8667, + 983101, 0, 13140, 65899, 10604, 0, 4480, 11266, 128152, 1226, 6930, + 67979, 195019, 6360, 10897, 41230, 605, 68302, 74785, 69875, 0, 917986, + 41500, 0, 311, 11453, 6221, 10608, 64943, 67682, 10877, 118868, 64885, + 74272, 0, 194672, 128559, 120736, 74312, 345, 124933, 74456, 64606, 9917, + 0, 74855, 5037, 0, 1776, 8422, 128935, 118814, 41508, 41201, 323, 43328, + 0, 42698, 1295, 194853, 4625, 77855, 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, 126519, - 7017, 42852, 0, 8157, 9736, 64503, 65418, 0, 983878, 74035, 0, 11913, - 73874, 6696, 0, 8920, 119298, 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, - 0, 0, 10177, 73777, 1857, 194657, 4626, 8464, 8472, 0, 4629, 8499, 78321, - 78322, 4624, 7818, 119173, 0, 0, 7805, 0, 94007, 6935, 92292, 78325, - 78326, 78323, 43327, 43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, - 0, 78336, 78339, 9543, 78335, 78332, 77832, 65849, 77831, 983961, 0, - 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 983459, 195062, 9949, - 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108, 120617, 11439, - 41468, 983757, 0, 5292, 55272, 983883, 1939, 5302, 3970, 917879, 12455, - 1793, 0, 0, 0, 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923, 0, - 13219, 9569, 0, 74383, 0, 74197, 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, + 5049, 42659, 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 128496, 649, + 65421, 0, 66702, 0, 12670, 1013, 0, 64919, 705, 0, 65422, 127803, 1183, + 126519, 7017, 42852, 0, 8157, 9736, 64503, 65418, 0, 983878, 74035, 0, + 11913, 73874, 6696, 128775, 8920, 119298, 128426, 7962, 12211, 9837, + 2051, 66227, 0, 4184, 119825, 128598, 10177, 73777, 1857, 194657, 4626, + 8464, 8472, 0, 4629, 8499, 74627, 78322, 4624, 7818, 119173, 128108, 0, + 7805, 128754, 94007, 6935, 92292, 78325, 78326, 78323, 43327, 43989, + 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, 74582, 78336, 78339, 9543, + 67860, 78332, 77832, 65849, 77831, 983961, 0, 12451, 0, 8684, 128301, + 6102, 0, 5298, 0, 5294, 0, 0, 128746, 195062, 9949, 119826, 43617, + 119215, 0, 12073, 0, 0, 77863, 13108, 120617, 11439, 41468, 119076, 0, + 5292, 55272, 983883, 1939, 5302, 3970, 917879, 12455, 1793, 124982, 0, 0, + 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923, 0, 13219, 9569, 0, + 74383, 0, 74197, 129089, 5500, 8813, 0, 128612, 74566, 5322, 0, 78340, + 43631, 5324, 66443, 3784, 41614, 65269, 6230, 78349, 78345, 13282, 3360, + 78344, 11523, 0, 92488, 9926, 7197, 128248, 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, 93966, 6670, 77882, 0, 0, 43092, - 43325, 0, 10168, 0, 9781, 128655, 9190, 0, 9666, 8269, 65944, 74005, - 13019, 11670, 69860, 315, 12813, 983458, 78432, 78256, 78351, 78352, 0, - 983657, 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, 43756, 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, + 41815, 41150, 128911, 10571, 10096, 67161, 67160, 67159, 6947, 41152, + 887, 9249, 6565, 78510, 41990, 78509, 41811, 67157, 93966, 6670, 67175, + 67174, 0, 43092, 43325, 67178, 10168, 67176, 9781, 68248, 9190, 128497, + 9666, 8269, 65944, 74005, 13019, 11670, 69860, 315, 12813, 983458, 72409, + 78256, 72408, 78352, 0, 983657, 0, 0, 1378, 9509, 0, 92996, 72407, 3066, + 92220, 67847, 72406, 92355, 0, 78365, 8787, 67189, 194616, 41618, 194615, + 78261, 127384, 0, 64652, 0, 194612, 0, 78366, 42088, 71040, 195061, 7176, + 43756, 10137, 6121, 10995, 78259, 71050, 8119, 64874, 71052, 78174, + 194939, 128630, 74525, 0, 0, 12930, 1394, 74514, 128413, 74515, 0, 67184, + 2998, 9527, 67181, 65190, 12977, 42090, 67185, 0, 119100, 41236, 92235, + 42005, 42003, 41237, 5848, 67193, 67192, 3670, 67190, 67197, 67196, + 67195, 7890, 128070, 11298, 43315, 983313, 6229, 1593, 0, 125120, 619, + 4635, 65080, 127779, 12194, 4120, 65337, 65336, 0, 11808, 67199, 67198, 9366, 42790, 42006, 119115, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335, 65334, 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, 94045, 42073, 6785, 64590, 983830, 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, 983787, 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, - 7365, 983753, 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, 983385, 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, 983922, 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, 983575, 9320, 8001, 1232, 8139, 11617, 0, 0, - 11409, 68373, 6382, 0, 64634, 128279, 0, 11612, 0, 67600, 2374, 94066, - 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, - 119247, 9938, 6084, 917546, 41064, 41062, 0, 0, 3256, 10189, 42076, - 43252, 78823, 917906, 8727, 0, 65875, 0, 0, 127762, 10562, 74215, 43065, - 0, 0, 3248, 74297, 3261, 9015, 71351, 0, 3635, 64337, 983281, 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, 70050, 2034, 92551, 120805, - 65891, 127038, 0, 318, 2038, 128860, 78596, 0, 3649, 13149, 42145, 42798, - 3634, 120291, 118927, 67677, 120124, 7866, 0, 11402, 42146, 94032, 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, 194567, 12989, 66474, 9368, 12848, - 1624, 43270, 0, 74278, 10818, 126644, 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, 983224, 4891, 0, 10641, - 0, 73746, 0, 68352, 0, 73787, 194829, 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, 983331, 73789, 0, 6658, 4426, 0, 92628, 983842, - 92319, 7276, 42163, 5220, 0, 0, 983330, 2416, 3310, 42703, 0, 379, 0, - 43755, 0, 0, 3223, 65492, 1284, 194771, 4549, 0, 0, 983154, 127763, - 10807, 9558, 194613, 0, 8515, 8688, 12866, 65308, 3294, 983332, 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, 77979, 0, 126507, 10414, 13001, 8141, 0, - 42537, 1557, 43594, 128642, 6330, 6805, 8631, 2545, 70052, 127166, 0, - 74190, 0, 0, 983786, 42762, 0, 42914, 1650, 262, 1637, 0, 7901, 3238, - 128173, 41861, 0, 128585, 65158, 10860, 94059, 43658, 7527, 0, 43319, - 6419, 0, 45, 0, 64588, 93989, 0, 119810, 7194, 5291, 0, 43666, 13129, 0, - 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, 2620, 0, 0, 0, 983875, - 179, 65896, 0, 64756, 2853, 78443, 118813, 983890, 118996, 119009, 2850, - 8084, 983085, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072, - 119843, 119842, 10398, 983056, 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, 983675, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585, - 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, 11283, 9089, 0, 73996, - 983173, 64500, 43674, 0, 64947, 1856, 0, 0, 6379, 0, 0, 0, 3208, 12975, - 74775, 127380, 983931, 92389, 74072, 55269, 0, 0, 983683, 2033, 78577, - 78576, 195026, 55254, 7740, 0, 0, 0, 73964, 0, 93988, 67612, 65674, - 128244, 94110, 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, 983951, 126469, 11946, 0, - 3257, 0, 12307, 1845, 983157, 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, 126607, 868, 873, 7642, 0, 869, 874, 7644, - 120674, 875, 790, 128303, 0, 0, 0, 66182, 983258, 5429, 195055, 66180, - 126480, 66181, 68452, 983289, 983248, 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, 983202, 42776, - 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809, 69881, 0, - 983142, 120604, 983052, 983882, 0, 983270, 0, 0, 7427, 9958, 4588, 43680, - 0, 74484, 194968, 2433, 0, 119622, 3352, 74363, 983885, 0, 793, 74404, 0, - 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647, 118877, 0, 7837, - 917625, 818, 5337, 194628, 917621, 41376, 119978, 126576, 120594, 74086, - 917615, 917614, 917613, 10973, 66359, 1372, 127172, 917608, 4969, 1254, - 917605, 917604, 93967, 917602, 65228, 78221, 126612, 0, 2840, 0, 119982, - 983939, 0, 3245, 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 68016, 983265, - 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, 983192, 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, 983892, 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, 128858, 120573, - 68672, 3220, 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, 4590, - 127258, 5852, 0, 0, 127259, 1708, 0, 983165, 2623, 11943, 0, 69226, 0, - 4698, 66509, 1066, 119921, 4701, 983876, 120285, 74225, 94111, 8267, 0, - 127265, 0, 7516, 0, 2625, 983977, 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, 983262, 66368, 5017, - 64956, 7071, 0, 119144, 1030, 118800, 983120, 9513, 41059, 9357, 0, 1773, - 0, 120350, 0, 6339, 7745, 9844, 0, 64650, 94, 1880, 74766, 983838, 8908, - 0, 128707, 65913, 78470, 10752, 13003, 0, 126572, 41307, 8732, 120338, 0, - 1757, 6964, 4696, 0, 120335, 64785, 7394, 3641, 5419, 128055, 0, 127883, - 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, 936, 13289, 69894, - 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 70064, 0, 12913, 74206, - 7529, 0, 128699, 983957, 120782, 4113, 0, 2372, 336, 0, 7509, 12152, 0, - 682, 66458, 41505, 0, 64743, 10593, 1703, 0, 983955, 8033, 69953, 0, - 9810, 127269, 0, 12970, 0, 42351, 10109, 917623, 0, 194693, 0, 92690, 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, 983719, 0, 128135, 41037, 42692, 7786, 12959, - 41039, 127483, 0, 680, 2302, 128200, 1181, 7056, 3174, 126516, 0, 92668, - 65665, 127375, 126506, 6920, 0, 92295, 0, 118965, 0, 64644, 126981, - 74119, 0, 41028, 0, 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, - 983566, 0, 40987, 4667, 0, 983932, 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, 983867, 7604, 983290, 4009, - 127816, 983710, 120562, 0, 983720, 64860, 119138, 119069, 0, 127370, - 4048, 983598, 0, 70024, 1646, 77890, 64534, 73995, 120705, 0, 119890, + 65316, 4106, 65314, 65313, 42074, 127847, 41228, 128960, 65609, 41241, + 7903, 41239, 43533, 78459, 7189, 0, 0, 128753, 12357, 42802, 78450, 8487, + 9131, 66292, 4615, 12695, 127752, 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, + 12169, 6590, 69762, 66455, 64738, 3219, 68654, 983787, 128281, 1037, + 128677, 2025, 128263, 13098, 78442, 10637, 4568, 549, 1570, 43839, 2835, + 0, 10624, 43623, 11072, 127191, 0, 0, 12606, 78433, 2825, 0, 10825, 8079, + 2821, 41046, 92327, 7365, 92634, 120593, 13071, 129052, 452, 41049, + 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0, 64703, 119191, 42308, + 7181, 0, 41332, 0, 12333, 41047, 1668, 0, 0, 0, 1187, 983385, 42628, + 78575, 0, 71863, 0, 3240, 128518, 12151, 0, 11591, 41065, 5323, 8166, 0, + 0, 0, 66827, 1623, 65297, 128856, 571, 0, 4918, 0, 5288, 127295, 1541, + 65048, 1909, 8864, 0, 66402, 10736, 92508, 11571, 7615, 70476, 92296, + 4237, 92576, 1035, 65815, 119301, 3567, 701, 65936, 3489, 0, 70462, + 70172, 11403, 0, 0, 127146, 3796, 6800, 70472, 3994, 11421, 74611, + 195076, 195078, 983922, 0, 0, 64857, 128105, 2855, 74418, 66308, 41621, + 68214, 127283, 127817, 10654, 127818, 119226, 12164, 3246, 7906, 43972, + 65847, 7182, 0, 13024, 66276, 74270, 128289, 125090, 0, 0, 1496, 747, 0, + 942, 2378, 43136, 127905, 8466, 983575, 9320, 8001, 1232, 8139, 11617, + 74637, 0, 11409, 68373, 6382, 126500, 64634, 92362, 70202, 11612, 93008, + 67600, 2374, 94066, 8475, 11609, 66313, 983769, 0, 5286, 119297, 0, + 983251, 64925, 120283, 127204, 118982, 71905, 7705, 11942, 11305, 127203, + 3309, 128619, 9206, 119165, 113824, 6802, 70353, 41653, 1280, 1241, 7168, + 12096, 0, 66615, 42565, 41651, 0, 917627, 0, 41650, 66507, 66470, 74472, + 12914, 41491, 66010, 94106, 6078, 9954, 78822, 1475, 119247, 9938, 6084, + 917546, 41064, 41062, 0, 0, 3256, 10189, 42076, 43252, 78823, 71861, + 8727, 0, 65875, 0, 0, 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, + 3261, 9015, 71351, 0, 3635, 64337, 92759, 125054, 0, 7195, 0, 2007, + 64431, 0, 0, 92197, 0, 635, 0, 0, 65613, 77909, 92420, 73997, 0, 0, + 119218, 7984, 8600, 74434, 127770, 4176, 70050, 2034, 78423, 11154, + 65891, 127038, 0, 318, 2038, 128860, 78596, 194602, 3649, 13149, 42145, + 42798, 3634, 120291, 71885, 67677, 120124, 7866, 0, 11402, 42146, 94032, + 74238, 42664, 2849, 127034, 0, 7938, 12960, 1761, 11812, 65379, 68386, + 128185, 1159, 71183, 69729, 0, 120797, 7178, 194632, 983836, 41680, 0, + 128203, 11534, 1514, 11668, 67891, 9313, 7015, 128490, 67877, 194567, + 12989, 66474, 9368, 12848, 1624, 43270, 0, 74278, 10818, 126644, 9953, 0, + 78421, 1194, 3242, 9761, 9555, 8598, 120299, 6169, 12871, 1551, 2798, + 65176, 4958, 42752, 119025, 0, 67875, 120301, 3495, 66648, 125079, + 113780, 68364, 120779, 4891, 0, 10641, 0, 73746, 983837, 68352, 0, 73787, + 194829, 194633, 7199, 11131, 0, 0, 0, 983852, 0, 42685, 42679, 193, + 78789, 0, 0, 42667, 0, 5271, 68323, 92517, 118882, 1362, 13297, 0, 71880, + 0, 983331, 73789, 0, 6658, 4426, 0, 66830, 983842, 92319, 7276, 42163, + 5220, 0, 0, 125080, 2416, 3310, 42703, 127828, 379, 0, 43755, 70504, + 43647, 3223, 65492, 1284, 194771, 4549, 0, 0, 983154, 70784, 10807, 9558, + 93027, 0, 8515, 8688, 12866, 65308, 3294, 983332, 8529, 128101, 43385, + 7564, 0, 43329, 0, 92458, 73757, 66456, 42359, 0, 2031, 983890, 7202, + 128618, 12676, 42729, 74777, 3215, 0, 7710, 1610, 73801, 0, 0, 65682, 0, + 120537, 65924, 9974, 228, 66354, 1501, 0, 64395, 5179, 7200, 6225, + 118927, 42999, 1725, 65533, 8196, 7476, 74399, 0, 66868, 7152, 8502, + 5762, 1967, 7483, 125083, 0, 8104, 70128, 7474, 77979, 127200, 126507, + 10414, 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, 6805, 8631, + 2545, 70052, 127166, 0, 74190, 0, 70410, 983786, 42762, 0, 42914, 1650, + 262, 1637, 128502, 7901, 3238, 128173, 41861, 0, 120211, 65158, 10860, + 94059, 43658, 7527, 0, 43319, 6419, 0, 45, 0, 64588, 93989, 127753, + 119810, 7194, 5291, 0, 43666, 13129, 128684, 9084, 0, 8737, 983165, + 12881, 0, 12906, 9639, 7912, 2620, 983882, 3564, 0, 69978, 179, 43644, + 126503, 64756, 2853, 78443, 118813, 129042, 70347, 119009, 2850, 8084, + 983085, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072, 92736, + 119842, 10398, 983056, 0, 8377, 119312, 8245, 68401, 3158, 92396, 3983, + 43656, 923, 119857, 92470, 292, 11119, 119845, 119844, 3221, 1763, 92463, + 4612, 67729, 119850, 7253, 70456, 68391, 0, 10782, 3637, 12996, 43542, + 113676, 64578, 983675, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585, + 4102, 7696, 73878, 0, 129128, 70813, 43316, 4177, 11283, 9089, 0, 73996, + 983173, 64500, 43674, 0, 64947, 1856, 0, 0, 6379, 0, 11142, 127176, 3208, + 12975, 74775, 127380, 983931, 92389, 74072, 55269, 0, 0, 983683, 2033, + 78577, 78576, 195026, 55254, 7740, 0, 70448, 127895, 73964, 68505, 93988, + 67612, 65674, 128244, 94110, 41689, 0, 74006, 64909, 6646, 11790, 74019, + 0, 128066, 128031, 8561, 4573, 0, 5326, 92571, 120605, 7230, 8257, + 194937, 8778, 41688, 0, 65776, 2071, 8314, 6459, 43511, 7628, 65092, + 73903, 66721, 11342, 128561, 0, 983432, 128226, 127001, 0, 11810, 13164, + 10723, 967, 983717, 126469, 11946, 983602, 3257, 127209, 12307, 1845, + 983157, 43526, 0, 0, 1886, 42342, 10089, 870, 7648, 3499, 7662, 7652, + 876, 871, 877, 7665, 878, 42015, 879, 43692, 4563, 0, 0, 7591, 65887, + 867, 9520, 872, 7656, 868, 873, 7642, 7659, 869, 874, 7644, 120674, 875, + 790, 128303, 118938, 0, 983641, 66182, 194623, 5429, 195055, 66180, + 126480, 66181, 68452, 983289, 917929, 42067, 0, 5433, 10657, 7911, + 125119, 1547, 66176, 42012, 120576, 5425, 4977, 9999, 5317, 5423, 4611, + 125094, 67637, 127286, 9679, 74122, 92978, 0, 0, 66194, 4418, 66184, + 4628, 4245, 119648, 0, 0, 1851, 124995, 127189, 11908, 0, 9360, 118897, + 194880, 42776, 66187, 12837, 8829, 7711, 11112, 0, 92321, 43318, 92302, + 8809, 69881, 0, 126518, 120604, 983052, 983275, 983431, 983270, 0, + 120577, 7427, 9958, 4588, 43680, 0, 74484, 194968, 2433, 128602, 69973, + 3352, 74363, 983885, 0, 793, 74404, 11197, 305, 567, 67662, 842, 69979, + 8208, 68308, 41695, 1647, 118877, 70841, 7837, 917625, 818, 5337, 194628, + 917621, 41376, 119978, 126576, 120594, 74086, 917615, 70179, 917613, + 10973, 66359, 1372, 127172, 917608, 4969, 1254, 917605, 194654, 93967, + 917602, 65228, 78221, 126612, 67723, 2840, 0, 78829, 983939, 66887, 3245, + 9068, 68194, 64725, 0, 128051, 12991, 124971, 2651, 68016, 983265, + 917611, 125038, 70835, 0, 70844, 43648, 120812, 917833, 43322, 92662, 0, + 0, 64372, 92698, 3226, 655, 752, 7457, 7456, 7452, 3285, 128475, 11152, + 92903, 65610, 2391, 92908, 92248, 671, 250, 7434, 618, 668, 610, 42800, + 7431, 1152, 42801, 640, 120666, 7448, 7439, 628, 3905, 73810, 128340, + 128266, 64749, 67850, 2107, 128345, 74249, 4605, 128174, 983192, 43372, + 65945, 128838, 11113, 119590, 0, 0, 70495, 987, 6927, 11572, 42261, + 11464, 3365, 9971, 0, 0, 128297, 0, 78762, 0, 0, 11334, 43326, 12609, + 11519, 11503, 5530, 5210, 0, 4627, 127784, 5208, 0, 128842, 10332, 2424, + 7976, 9156, 0, 3244, 5529, 69647, 73894, 128852, 5432, 64965, 5527, + 42315, 10516, 7790, 5528, 983699, 42140, 120281, 0, 0, 43545, 9887, + 129044, 4000, 7429, 7428, 665, 7424, 3206, 120278, 7884, 0, 128566, + 917989, 128666, 211, 2509, 92904, 70822, 68672, 3220, 42235, 78480, + 10690, 8951, 5214, 42474, 8118, 0, 7048, 4590, 127258, 5852, 0, 78482, + 127259, 1708, 0, 78481, 2623, 11943, 128700, 69226, 69974, 4698, 66509, + 1066, 119921, 4701, 983876, 120285, 70447, 94111, 8267, 0, 1421, 66426, + 7516, 127552, 2625, 983977, 8034, 74309, 0, 3631, 10955, 7850, 120293, + 8416, 0, 0, 0, 43384, 12660, 128693, 0, 0, 74850, 41069, 70185, 128156, + 12099, 4310, 10032, 6252, 713, 7990, 983487, 3990, 125050, 983262, 66368, + 5017, 64956, 7071, 0, 70457, 1030, 118800, 92563, 9513, 41059, 9357, 0, + 1773, 77939, 120350, 0, 6339, 7745, 9844, 127220, 64650, 94, 1880, 74766, + 113719, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0, 126572, 41307, + 8732, 120338, 0, 1757, 6964, 4696, 0, 120335, 64785, 7394, 3641, 5419, + 128055, 0, 127883, 0, 120344, 43988, 70423, 8610, 43062, 7592, 856, + 74299, 936, 13289, 69894, 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, + 70064, 0, 12913, 74206, 7529, 128745, 128699, 70203, 120782, 4113, 0, + 2372, 336, 0, 7509, 12152, 194885, 682, 7655, 41505, 0, 64743, 10593, + 1703, 92467, 77911, 8033, 69953, 0, 9810, 127269, 120013, 12970, 0, + 42351, 10109, 74535, 0, 194693, 0, 92690, 0, 65068, 74291, 1965, 7069, + 43312, 0, 73887, 11130, 2087, 64370, 6314, 41714, 8501, 11145, 0, 74239, + 41317, 92614, 2091, 74545, 2090, 69912, 9353, 7117, 2077, 77886, 11161, + 10498, 2083, 77888, 71196, 0, 119236, 634, 0, 92290, 0, 69779, 4165, + 8746, 195048, 9654, 12856, 6924, 7660, 7066, 983719, 70415, 128135, + 41037, 42692, 7786, 12959, 41039, 127483, 124965, 680, 2302, 128200, + 1181, 7056, 3174, 67248, 0, 92668, 65665, 127375, 113776, 6920, 0, 92295, + 0, 118965, 68318, 64644, 126981, 74119, 68238, 41028, 74025, 6231, 2613, + 65302, 40989, 68239, 68230, 68234, 42760, 0, 124989, 0, 40987, 4667, 0, + 71843, 8828, 0, 70506, 1246, 4746, 0, 128508, 11021, 4749, 92675, 917882, + 921, 4744, 0, 12702, 242, 0, 1566, 8217, 127210, 64653, 78386, 74617, + 74036, 74505, 43274, 5313, 951, 74568, 92983, 983867, 7604, 983290, 4009, + 70426, 71844, 120562, 0, 983720, 64860, 119138, 119069, 0, 127370, 4048, + 983598, 0, 70024, 1646, 77890, 64534, 73995, 120705, 129047, 119890, 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894, 2975, 74442, 9822, 983935, 55220, 10084, 73943, 118840, 0, 917562, 194610, 3399, 9851, - 983717, 11909, 9059, 0, 7687, 0, 6789, 0, 0, 0, 71367, 0, 0, 1777, 9151, - 1137, 69767, 749, 42366, 0, 5385, 128574, 128218, 0, 0, 5989, 0, 0, - 128091, 0, 41685, 69223, 0, 9769, 41684, 983216, 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, - 983223, 11730, 0, 9593, 5757, 2403, 64808, 55275, 0, 11728, 43572, 0, 0, - 7764, 983714, 11094, 120825, 0, 983226, 4282, 8298, 0, 0, 0, 0, 0, 64449, - 0, 126650, 63854, 8456, 0, 74783, 65670, 0, 78250, 0, 7774, 10607, 9792, - 0, 0, 0, 0, 120764, 0, 10019, 74762, 0, 3458, 4365, 70053, 983712, 3647, - 0, 2602, 128341, 0, 194707, 41135, 0, 0, 0, 64631, 172, 4971, 41219, - 41137, 1889, 7238, 6545, 126476, 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, 917957, 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, - 983201, 6340, 118855, 0, 78134, 8680, 7204, 70065, 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, 94016, 0, 12711, 3181, 66212, 74289, 68472, 42857, 8262, - 983379, 0, 983222, 0, 42347, 12092, 9615, 7234, 74047, 983088, 0, 43744, - 0, 0, 73846, 2934, 12722, 120762, 922, 43983, 74507, 983126, 74461, 3218, + 917609, 11909, 9059, 0, 7687, 0, 6789, 128392, 0, 71842, 70178, 0, 0, + 1777, 9151, 1137, 66867, 749, 42366, 70444, 5385, 70791, 72435, 70127, + 128972, 5989, 0, 74636, 128091, 0, 41685, 69223, 0, 9769, 41684, 983216, + 519, 0, 11740, 5766, 0, 0, 2600, 8848, 70416, 41297, 0, 3666, 70420, + 41300, 74468, 65160, 0, 69688, 69771, 74479, 0, 6558, 0, 128064, 69765, + 92775, 252, 0, 41302, 119350, 127002, 118839, 69763, 0, 11729, 8719, + 9060, 129091, 120139, 10761, 0, 0, 0, 118792, 11734, 93011, 11730, + 113741, 9593, 5757, 2403, 64808, 55275, 0, 11728, 43572, 0, 0, 7764, + 129132, 11094, 120825, 0, 43489, 4282, 8298, 0, 0, 70328, 0, 70324, + 64449, 0, 126650, 63854, 8456, 65587, 70442, 65670, 0, 78250, 0, 7774, + 10607, 9792, 0, 70326, 0, 0, 120764, 70322, 10019, 74762, 0, 3458, 4365, + 70053, 983712, 3647, 120207, 2602, 128341, 0, 125043, 41135, 0, 0, + 128455, 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545, 126476, 77926, + 7597, 10528, 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363, 9062, + 119252, 0, 92528, 0, 64479, 9232, 92596, 0, 113707, 194712, 10900, 41531, + 1263, 3720, 12048, 74075, 64292, 41524, 7227, 119635, 6099, 41534, 0, + 127354, 127345, 299, 917957, 8525, 127347, 3524, 917565, 8831, 127349, + 92564, 3075, 67867, 94053, 0, 66362, 0, 64353, 70440, 0, 5845, 0, 0, 0, + 2581, 8200, 65114, 68460, 983693, 43283, 5551, 0, 120735, 983201, 6340, + 118855, 128934, 78134, 8680, 7204, 70065, 2588, 2914, 7011, 55281, 0, + 2471, 194631, 2883, 2749, 119563, 73774, 10913, 0, 0, 8666, 675, 42493, + 0, 43571, 0, 6219, 128584, 9980, 41232, 10928, 0, 41153, 41229, 118967, + 0, 3738, 94016, 0, 12711, 3181, 66212, 74289, 68472, 42857, 8262, 983379, + 0, 74476, 0, 42347, 12092, 9615, 7234, 74047, 983088, 983819, 43744, 0, + 0, 73846, 2934, 12722, 120762, 922, 43983, 74507, 983126, 74461, 3218, 120471, 74290, 120469, 64562, 120475, 8569, 11404, 11932, 73728, 3214, - 120461, 120468, 12128, 3207, 65486, 78729, 1901, 78727, 127326, 120460, + 11212, 120468, 12128, 3207, 65486, 78729, 1901, 78727, 127326, 120460, 7425, 3205, 68003, 78737, 78736, 78735, 43383, 69940, 65459, 2606, 78730, - 73897, 0, 11496, 1173, 0, 41272, 119661, 0, 0, 983321, 120737, 0, 983971, - 983320, 378, 2610, 0, 65079, 983325, 65695, 126559, 37, 7068, 0, 120480, - 120479, 3209, 120477, 0, 10638, 9768, 69952, 119909, 983399, 0, 0, 0, 0, - 65510, 0, 0, 5233, 983335, 64792, 983334, 0, 126633, 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, 128132, 8203, 78488, 983090, 8458, 65211, 8495, 119904, 0, 917552, - 779, 78314, 64367, 2465, 69901, 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, 92507, 1832, 5604, 5735, 41141, 119020, - 4376, 0, 11787, 3745, 0, 0, 42888, 65712, 983304, 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, 71344, 43465, 0, 128267, 6559, 64557, 71348, 92649, - 120648, 43019, 43477, 10238, 74491, 0, 43377, 92282, 71346, 1478, 9783, - 11825, 2607, 64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 70058, - 41144, 0, 92438, 43537, 6761, 10093, 4369, 917791, 0, 983148, 8820, 3947, - 0, 0, 11515, 526, 128103, 41295, 194603, 917785, 194932, 0, 7688, 917786, - 7686, 8288, 11815, 0, 0, 983382, 1543, 3713, 41221, 12423, 42281, 917788, - 74024, 12293, 0, 64357, 11794, 42082, 0, 1737, 8987, 42081, 0, 7205, 0, - 9335, 12850, 119870, 6553, 7055, 0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, - 12990, 1160, 42084, 119650, 41217, 119660, 10018, 360, 0, 0, 68176, 5863, - 3137, 0, 4147, 983170, 41216, 7844, 2616, 119190, 68461, 65234, 983294, + 73897, 0, 11496, 1173, 0, 41272, 119661, 0, 0, 983321, 120737, 126557, + 194773, 983320, 378, 2610, 983326, 65079, 983325, 65695, 126559, 37, + 7068, 0, 120480, 68236, 3209, 120477, 0, 10638, 9768, 69952, 119909, + 983399, 92225, 0, 983338, 0, 43840, 0, 0, 5233, 983335, 64792, 71233, 0, + 126633, 128919, 7060, 9847, 120144, 1685, 595, 0, 70428, 1292, 8940, + 7380, 11088, 0, 10004, 126997, 0, 6541, 43837, 0, 0, 3243, 9014, 5606, 0, + 538, 64620, 5602, 8467, 74391, 6547, 128132, 8203, 66420, 68241, 8458, + 65211, 8495, 92311, 0, 917552, 779, 78314, 64367, 2465, 69901, 8193, + 55279, 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 125115, 92414, + 8982, 0, 128711, 119170, 782, 129028, 10883, 128446, 194852, 732, 3737, + 127253, 1548, 68650, 92507, 1832, 5604, 5735, 41141, 119020, 4376, + 983370, 11787, 3745, 0, 119885, 42888, 65712, 127913, 3869, 11937, 5725, + 127539, 1783, 7416, 5728, 0, 128457, 119554, 11918, 66567, 5724, 0, 5727, + 78521, 0, 0, 764, 0, 128116, 43531, 113670, 9033, 0, 42532, 6223, 11042, + 120749, 11423, 74852, 119861, 68303, 43465, 0, 128267, 6559, 64557, + 71348, 92649, 120648, 43019, 43477, 10238, 74491, 0, 43377, 92282, 71346, + 1478, 9783, 11825, 2607, 64740, 113689, 7739, 74543, 917765, 67393, 0, + 6132, 0, 63765, 128396, 70058, 41144, 71899, 92438, 43537, 6761, 10093, + 4369, 917791, 0, 194776, 8820, 3947, 0, 0, 11515, 526, 128103, 41295, + 194603, 917785, 194932, 113691, 7688, 917786, 7686, 8288, 11815, 0, 0, + 983382, 1543, 3713, 41221, 12423, 42281, 917788, 74024, 12293, 0, 64357, + 11794, 42082, 0, 1737, 8987, 42081, 0, 7205, 0, 9335, 12850, 119870, + 6553, 7055, 0, 8277, 0, 67751, 5475, 74795, 6780, 65067, 0, 1327, 1160, + 42084, 119650, 41217, 119660, 10018, 360, 129070, 983865, 68176, 5863, + 3137, 0, 4147, 983170, 41216, 7844, 2616, 70197, 68461, 65234, 68341, 13076, 3135, 983287, 78143, 119139, 3142, 92451, 94068, 10819, 119580, - 10183, 0, 2608, 1470, 73967, 94008, 6227, 0, 127173, 69741, 983582, 6163, - 983558, 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, 983211, 5002, 0, 41286, 69946, 127019, 0, 43585, 0, 6551, - 983962, 128229, 0, 41289, 0, 194602, 0, 8977, 602, 120814, 0, 128778, - 128661, 0, 983375, 41279, 0, 0, 0, 11081, 43615, 0, 0, 0, 983612, 12727, - 0, 0, 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, 7831, 983829, - 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, 983182, 3751, 9120, 983485, 0, 1798, 709, 0, - 1354, 1876, 13152, 6557, 12430, 8137, 94098, 92642, 0, 0, 245, 128097, - 11456, 41233, 7070, 0, 94046, 6136, 917609, 65677, 8682, 41235, 92595, - 42045, 9804, 118963, 432, 3595, 194945, 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, 94109, 0, 74137, 70035, 10063, - 12652, 12199, 92480, 0, 2566, 11971, 983737, 0, 1065, 0, 0, 43400, 2576, - 66696, 93999, 0, 43604, 0, 0, 74082, 514, 74502, 70032, 2921, 43215, - 64493, 5772, 12968, 70055, 194944, 74580, 43398, 2580, 983810, 41341, - 41223, 6564, 1463, 41342, 0, 5293, 70020, 0, 3733, 11346, 0, 12054, 0, - 74098, 42827, 0, 13091, 0, 0, 0, 917915, 0, 127025, 0, 74821, 0, 983733, - 119042, 0, 127865, 13090, 66643, 0, 1270, 1132, 42360, 0, 74096, 66655, - 42569, 127824, 0, 64761, 0, 41021, 8510, 42432, 0, 0, 194782, 0, 64496, - 74109, 70030, 9915, 0, 983218, 7061, 41336, 3854, 69700, 13141, 68413, - 43401, 42319, 13082, 0, 7067, 68221, 0, 127383, 127171, 0, 0, 127797, - 9029, 43543, 119315, 2353, 6308, 0, 74792, 2611, 119186, 0, 0, 0, 43664, - 92399, 66627, 0, 4484, 8509, 118976, 11066, 65233, 0, 41224, 41017, 0, - 3747, 10522, 0, 0, 1691, 41226, 0, 12107, 7100, 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, 78110, 7123, 70038, 5785, 9198, 9764, - 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, 128258, 0, 0, 0, 13122, 0, - 191, 70060, 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, 71349, 0, 3964, 6592, 0, - 128693, 66040, 0, 42568, 69806, 128113, 1778, 3956, 0, 42070, 6563, - 43075, 9018, 94006, 983396, 12067, 41312, 0, 5547, 74531, 127969, 0, - 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703, 118822, 1750, - 0, 4394, 68368, 1807, 983888, 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, 983599, 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, 119108, 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, 983087, 41350, 9129, 0, 0, 2294, 0, 92489, 0, 10481, 0, 70022, - 7171, 0, 340, 92498, 93972, 0, 0, 92200, 0, 0, 6764, 127487, 0, 0, 0, 0, - 65203, 11392, 119098, 119359, 0, 3210, 0, 0, 118795, 0, 0, 127970, - 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 126642, 3675, 5207, - 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253, 120535, 0, 8630, - 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 71336, 0, 0, 0, 64293, - 68098, 2635, 0, 0, 983846, 0, 983641, 7835, 70040, 0, 194988, 92285, - 64558, 127122, 0, 127121, 0, 127913, 0, 5784, 983102, 0, 0, 70033, 4011, - 917616, 68101, 0, 7864, 4254, 65095, 983496, 5600, 3903, 127083, 10447, - 5598, 1207, 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, - 194778, 194772, 9321, 983484, 983481, 983482, 0, 1719, 68356, 68354, - 9671, 1125, 4399, 127479, 917610, 983488, 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, 194791, 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, 120710, 65008, 0, 194784, 194989, 194795, 983473, - 92515, 68475, 93973, 0, 0, 78637, 12647, 0, 128043, 69893, 1036, 983477, - 92419, 1723, 128056, 74217, 0, 41579, 2444, 0, 10705, 73876, 983469, - 74486, 983467, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, 68437, - 78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263, 11907, - 195000, 5690, 92255, 93992, 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, 94044, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725, - 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, 233, - 127490, 983441, 42816, 94036, 65140, 74797, 0, 8830, 6568, 42300, 10524, - 41175, 983448, 983445, 983446, 5296, 983444, 42492, 43402, 92466, 3302, - 0, 0, 6516, 6515, 6514, 6513, 6512, 0, 7856, 8690, 0, 0, 12122, 119602, - 43976, 0, 1785, 69925, 68622, 65153, 194810, 5138, 0, 0, 118869, 0, 4540, - 41181, 0, 6200, 0, 5134, 0, 322, 4643, 5132, 0, 6389, 128533, 5143, 0, - 8790, 128694, 0, 194802, 0, 8869, 69916, 0, 42060, 71326, 9648, 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, 983670, 320, 0, - 8647, 0, 3049, 0, 6471, 42071, 43156, 9925, 127356, 127355, 66478, 4960, + 10183, 74635, 2608, 1470, 73967, 94008, 6227, 0, 127173, 65236, 917878, + 6163, 983558, 113728, 127314, 0, 0, 8603, 0, 119866, 3306, 10876, 43392, + 119573, 127931, 5751, 0, 6222, 0, 127466, 12086, 7403, 1600, 64309, + 64939, 0, 64783, 92658, 11310, 0, 8882, 0, 0, 2570, 7021, 0, 0, 43110, 0, + 1234, 6540, 6974, 92750, 0, 983211, 5002, 0, 41286, 69946, 74465, 71074, + 43585, 113720, 6551, 983373, 128229, 983272, 41289, 125130, 71080, + 127958, 8977, 602, 120814, 0, 128778, 128661, 194890, 983375, 41279, 0, + 0, 917795, 11081, 43615, 0, 0, 0, 983612, 12727, 0, 0, 78397, 9475, 7112, + 65105, 0, 9633, 10886, 43592, 7831, 983829, 194571, 0, 73915, 8076, + 43048, 8290, 8291, 43051, 92570, 0, 2596, 43584, 0, 13113, 0, 127757, + 2393, 7058, 9087, 74067, 68673, 41574, 78337, 70498, 42900, 6376, 0, 0, + 0, 0, 9854, 127748, 64696, 73879, 128220, 120752, 6994, 0, 1720, 0, 0, 0, + 6529, 7063, 983182, 3751, 9120, 983485, 0, 1798, 709, 0, 1354, 1876, + 13152, 6557, 12430, 8137, 94098, 67752, 70850, 0, 245, 128097, 11456, + 41233, 7070, 0, 94046, 6136, 68304, 65677, 8682, 41235, 92595, 42045, + 9804, 118963, 432, 3595, 127901, 65437, 0, 74455, 42399, 983136, 0, + 128274, 0, 119658, 128184, 0, 0, 77894, 8797, 0, 9052, 64888, 7167, 2356, + 95, 74784, 10580, 0, 42286, 92231, 64640, 69999, 94109, 128625, 74137, + 70035, 10063, 12652, 12199, 74622, 43492, 2566, 11971, 983737, 0, 1065, + 0, 0, 43400, 2576, 66696, 66819, 128624, 43604, 127891, 0, 3201, 514, + 74502, 70032, 2921, 43215, 64493, 5772, 12968, 70055, 194944, 74580, + 43398, 2580, 983810, 41341, 41223, 6564, 1463, 41342, 0, 5293, 70020, + 983185, 3733, 11346, 0, 12054, 0, 74098, 42827, 195074, 13091, 0, 0, 0, + 917915, 127961, 127025, 0, 74821, 71104, 66295, 92765, 0, 127865, 13090, + 66643, 0, 1270, 1132, 42360, 0, 74096, 66655, 42569, 127824, 66898, + 64761, 0, 41021, 8510, 42432, 0, 119317, 194782, 0, 64496, 74109, 70030, + 9915, 0, 983218, 7061, 41336, 3854, 69700, 13141, 68413, 43401, 42319, + 13082, 124976, 7067, 68221, 0, 127383, 127171, 0, 120745, 74209, 9029, + 43543, 70836, 2353, 6308, 129154, 74792, 2611, 119186, 66881, 0, 65063, + 43664, 92399, 66627, 125093, 4484, 8509, 118976, 11066, 65233, 0, 41224, + 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 127214, 12107, 7100, 10905, + 65010, 127275, 697, 66018, 9284, 4244, 0, 93058, 77861, 13121, 120036, 0, + 12010, 128573, 128221, 125014, 0, 0, 127193, 65816, 68111, 0, 127933, + 65668, 92257, 6618, 3562, 66365, 0, 42234, 12648, 78110, 7123, 70038, + 5785, 9198, 9764, 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, 128258, + 0, 0, 0, 13122, 0, 191, 70060, 8585, 8000, 64411, 120652, 42889, 64850, + 41072, 41578, 0, 41577, 0, 10002, 195028, 6533, 73802, 41570, 917919, + 683, 396, 41580, 68146, 983067, 12901, 43058, 0, 343, 7129, 42680, 41360, + 78154, 0, 4743, 69987, 0, 74040, 74108, 8743, 1724, 1433, 119322, 0, + 3739, 6263, 71349, 0, 3964, 6592, 0, 68288, 66040, 0, 42568, 69806, + 128113, 1778, 3956, 128443, 42070, 6563, 43075, 9018, 94006, 983396, + 12067, 41312, 92763, 5547, 8916, 127969, 128950, 8175, 0, 284, 8108, 934, + 128039, 74001, 173, 66460, 7174, 92703, 118822, 1750, 128686, 4394, + 68368, 1807, 983888, 92298, 0, 5889, 0, 7180, 0, 67127, 0, 67126, 42471, + 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, 65230, 128109, + 0, 0, 3855, 194986, 11767, 0, 0, 74295, 0, 0, 92416, 3975, 67125, 74087, + 0, 12672, 3798, 2703, 983599, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, + 68242, 2932, 41101, 3954, 6457, 4513, 74536, 0, 73994, 73992, 1468, + 120033, 983057, 41803, 128230, 41846, 127244, 55238, 7633, 41849, 68385, + 4320, 3224, 0, 92741, 66281, 42531, 74593, 1510, 128384, 8256, 0, 11393, + 0, 8879, 128075, 92474, 8770, 72416, 0, 72415, 1910, 8671, 78374, 4283, + 0, 127117, 68361, 78318, 2654, 7893, 195007, 128241, 0, 72394, 65106, + 42761, 12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 74475, + 983442, 0, 1733, 4392, 2568, 10786, 69661, 0, 8184, 41486, 0, 7396, 7116, + 0, 69788, 0, 7185, 7965, 119144, 0, 92347, 195066, 41350, 9129, 0, 0, + 2294, 64501, 92489, 0, 10481, 0, 70022, 7171, 0, 340, 71105, 93972, + 67360, 0, 92200, 128249, 124979, 6764, 127487, 128393, 0, 92509, 128962, + 65203, 11392, 119098, 119359, 119073, 3210, 0, 0, 118795, 127976, 94101, + 127484, 917619, 119149, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, + 125123, 3675, 5207, 65062, 5213, 74616, 2617, 41348, 41568, 128803, 3253, + 120535, 0, 8630, 128544, 0, 5596, 5545, 7288, 2586, 64887, 983644, 5217, + 71336, 128687, 917614, 0, 64293, 68098, 2635, 92760, 0, 983846, 0, 92742, + 7835, 70040, 120707, 194988, 92285, 64558, 127122, 0, 67083, 67085, + 70099, 0, 5784, 983102, 195050, 983812, 70033, 4011, 194565, 68101, + 124978, 7864, 4254, 65095, 983496, 5600, 3903, 127083, 10447, 5598, 1207, + 120521, 66689, 3501, 42582, 43600, 129054, 127103, 1124, 5597, 194778, + 194772, 9321, 983484, 113706, 983482, 67400, 1719, 68356, 68354, 9671, + 1125, 4399, 127479, 66274, 983488, 7631, 5488, 7128, 120532, 0, 5491, + 118797, 8937, 43044, 2604, 74187, 5490, 43046, 5489, 7212, 11768, 43043, + 6300, 194837, 7122, 983090, 4390, 454, 41397, 0, 9875, 7593, 194791, + 92274, 118913, 7207, 0, 65901, 2394, 2575, 0, 3746, 11016, 65752, 92757, + 0, 43423, 128683, 11989, 0, 0, 0, 78296, 0, 8249, 128172, 11109, 78531, + 6640, 74806, 2598, 513, 0, 6586, 8656, 0, 69792, 65008, 194597, 71111, + 78383, 194795, 127474, 92515, 68475, 93973, 194584, 63799, 78637, 12647, + 0, 128043, 69893, 1036, 194982, 92419, 1723, 68215, 74217, 0, 41579, + 2444, 120722, 10705, 73876, 983469, 74486, 983467, 740, 119222, 194978, + 194984, 0, 4238, 11071, 9459, 68437, 78140, 78139, 194985, 8121, 10438, + 74487, 42574, 13285, 55263, 11907, 129107, 5690, 92255, 93992, 0, 43181, + 13095, 77925, 127857, 64498, 0, 9506, 6978, 70176, 77992, 0, 113743, + 78379, 0, 127845, 1122, 317, 0, 71055, 0, 0, 1920, 0, 10173, 827, 0, 0, + 78378, 119600, 5223, 1304, 0, 119564, 5226, 12602, 94044, 5880, 9329, + 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725, 69229, 9674, 5695, + 41711, 64627, 19909, 71077, 74604, 5691, 287, 866, 233, 68138, 983441, + 42816, 94036, 65140, 74797, 128158, 8830, 6568, 42300, 10524, 41175, + 125033, 983445, 983446, 5296, 983444, 42492, 43402, 92466, 3302, 0, + 74858, 6516, 6515, 6514, 6513, 6512, 0, 7856, 8690, 983686, 70870, 12122, + 119602, 43976, 0, 1785, 69925, 68622, 65153, 194810, 5138, 0, 71922, + 118869, 0, 4540, 41181, 0, 6200, 0, 5134, 69980, 322, 4643, 5132, 0, + 6389, 128533, 5143, 0, 8790, 128694, 120121, 194802, 71168, 8869, 69916, + 93069, 42060, 71326, 9648, 194804, 71170, 10270, 10286, 10318, 10382, + 43529, 66477, 194800, 0, 74170, 0, 3234, 43835, 0, 74376, 43139, 118815, + 127084, 120627, 8767, 68231, 74489, 9695, 72439, 5201, 0, 6215, 12714, + 6214, 13101, 0, 194999, 65268, 7661, 0, 128444, 11027, 128596, 10059, + 10511, 42075, 9767, 789, 1749, 78890, 67115, 983670, 320, 0, 8647, + 983705, 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, 94048, 127109, 6653, 128811, 0, 64510, 6213, 12885, 0, 119045, 64720, 0, 120759, 73741, - 12603, 7131, 11430, 4566, 7518, 9317, 3801, 10342, 10406, 0, 119259, - 42576, 0, 5200, 126611, 917948, 0, 9183, 127361, 74458, 73825, 395, 5482, - 5198, 4349, 10390, 74202, 5196, 43224, 6113, 42009, 5205, 0, 43307, 0, - 118973, 0, 12134, 0, 0, 118843, 9126, 435, 983624, 12014, 10377, 8093, - 9079, 3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, 128178, 5738, - 983215, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, 1260, - 3149, 5359, 120134, 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, 11832, 78382, 78381, 78380, - 78379, 9319, 7097, 119055, 77906, 3232, 73824, 74581, 120632, 0, 0, - 41889, 92453, 0, 1161, 41895, 74103, 9701, 8622, 0, 0, 73819, 120588, - 5012, 77912, 41362, 69862, 78296, 11921, 0, 11769, 0, 68609, 41364, 0, - 74228, 41352, 41361, 0, 41366, 0, 3356, 11611, 917, 68422, 119915, 7134, - 8199, 78389, 119917, 677, 119916, 0, 119932, 127169, 0, 0, 0, 3349, - 74125, 7022, 8927, 4739, 0, 5802, 0, 8615, 0, 0, 491, 128819, 10190, - 120698, 65837, 128820, 8426, 11092, 9891, 0, 42497, 7113, 7586, 42305, - 10852, 0, 0, 4606, 68448, 9095, 7741, 12684, 41885, 1046, 7124, 0, 0, - 5815, 5171, 65539, 68612, 6932, 74267, 42394, 41878, 74849, 120621, 0, - 5169, 11935, 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871, - 78287, 0, 9833, 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, 983617, 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, 43762, 4367, 0, 0, - 5478, 5904, 5594, 0, 74150, 7291, 5590, 43761, 13067, 118909, 120372, - 983108, 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, 73972, 1442, 0, 5894, 70069, 0, 41171, 92511, 74313, 0, 13162, 0, - 3334, 195010, 118803, 77881, 66022, 0, 0, 1651, 128771, 8861, 0, 0, 1142, - 0, 8271, 0, 983058, 126645, 12903, 0, 4002, 43626, 10442, 10676, 3344, 0, - 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, 194686, 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, 70083, 3354, 195037, 4192, 9289, 118999, - 41191, 3876, 0, 70067, 120660, 43696, 43380, 0, 983091, 0, 0, 11603, - 983954, 0, 6589, 128588, 194679, 0, 0, 983700, 0, 0, 42572, 128264, - 10630, 74827, 1963, 11622, 127098, 11654, 0, 7550, 10686, 5903, 0, 78009, - 41329, 9662, 917937, 64698, 3366, 10399, 0, 5542, 11013, 127927, 128300, - 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 983673, 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, 983605, - 9532, 66355, 0, 983234, 917925, 64343, 195032, 128281, 195031, 0, 195030, - 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, 78444, 66497, 2947, 392, 7894, - 4391, 68139, 983062, 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, 983906, 78301, 983653, - 74211, 41897, 68477, 0, 917583, 983634, 94065, 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, - 983774, 65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, 0, - 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, 74157, 6327, 6724, 0, - 128086, 92566, 69910, 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, 70097, 65155, 43014, 5439, 9363, - 70070, 3375, 128869, 5900, 93990, 7889, 2722, 42262, 0, 0, 128774, 0, - 2282, 0, 127810, 11401, 983822, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, - 127887, 0, 127381, 4868, 8297, 119966, 118798, 0, 0, 43161, 0, 92360, 0, - 5182, 0, 120542, 0, 0, 4226, 119243, 12135, 5732, 4464, 0, 71330, 977, - 4458, 0, 0, 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0, - 786, 0, 43174, 64340, 0, 194767, 120723, 43026, 7612, 10132, 64413, - 65025, 0, 0, 0, 93956, 0, 68444, 0, 92437, 0, 119160, 10204, 92656, 0, - 127809, 983644, 1399, 983652, 65217, 0, 8852, 128571, 241, 128780, 4907, - 0, 983639, 7932, 9727, 128873, 74255, 8748, 0, 0, 983643, 0, 42780, 0, 0, - 0, 4217, 0, 8650, 0, 0, 0, 69900, 118872, 43099, 3965, 119119, 6719, 0, - 13300, 78439, 93971, 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, 65577, - 8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237, 69787, 2030, 0, - 6027, 8370, 4322, 0, 65207, 0, 983339, 983338, 983337, 983336, 2735, - 42831, 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140, - 983928, 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, - 7709, 41112, 983132, 66560, 42041, 4572, 12876, 66561, 983758, 6758, - 983926, 1615, 5855, 809, 0, 92283, 128316, 128004, 5799, 983328, 70100, - 983326, 7260, 983324, 43031, 64425, 65128, 78819, 64386, 65257, 0, 68616, - 120607, 9347, 128067, 6532, 0, 0, 0, 127060, 65828, 0, 283, 68665, 78813, - 532, 78663, 0, 983796, 120609, 0, 3370, 0, 11361, 5443, 78778, 8153, - 73767, 0, 10741, 0, 2298, 0, 983917, 65495, 64706, 983318, 43344, 983316, - 7144, 9466, 78866, 9824, 983311, 983310, 0, 0, 915, 43425, 0, 0, 0, 0, - 127178, 43264, 70096, 0, 0, 43038, 78864, 6730, 78862, 68161, 64550, - 5186, 7360, 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107, - 77826, 0, 42562, 0, 128821, 0, 128520, 11485, 6103, 127123, 983305, - 11718, 983303, 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, 128677, 77892, 632, 12940, 77891, - 42529, 78587, 0, 5957, 110593, 8926, 983299, 983298, 128273, 10745, - 10174, 7379, 64581, 5386, 120686, 11713, 10633, 69708, 5056, 0, 0, 0, - 120773, 0, 9812, 0, 4460, 0, 0, 71307, 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, 983286, 983285, - 128570, 12106, 983282, 74207, 1755, 10482, 12863, 77898, 1163, 2951, - 9522, 74079, 78266, 66604, 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, 983279, 73940, 64352, 127513, 983275, 411, 983273, - 9199, 983271, 4056, 118992, 41890, 0, 2730, 41604, 983937, 5428, 194743, - 3364, 42265, 64437, 127935, 118816, 194742, 9684, 216, 0, 1401, 128053, - 44012, 0, 0, 92585, 9158, 77842, 69905, 5768, 0, 0, 0, 484, 194739, 0, 0, - 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 983263, 93962, 2794, - 8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, - 77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 78717, 0, 981, 0, 4330, 73929, - 120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547, - 128259, 674, 63991, 983249, 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, 983413, 0, 11739, 983426, 41981, 0, 5938, 0, 43766, - 12448, 7576, 10401, 10337, 73852, 0, 13057, 0, 126976, 0, 10009, 0, - 41703, 983638, 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, 11623, 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, 983438, 68625, 983436, 7269, 0, - 5964, 12908, 983555, 0, 74764, 74477, 119146, 194936, 4949, 983429, 443, - 983427, 4944, 5467, 119603, 983254, 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, 69947, - 119832, 4677, 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, - 78170, 78166, 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, - 127024, 1855, 983412, 68669, 983410, 92445, 127554, 0, 127339, 119652, - 2745, 11797, 983418, 128159, 9202, 4654, 983414, 983416, 68638, 73993, - 10525, 4649, 65209, 983417, 0, 4648, 43080, 983406, 983407, 983404, 6246, - 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, 43187, - 8669, 983415, 6821, 65093, 0, 78881, 2716, 0, 983060, 983419, 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, - 983411, 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, - 3054, 194956, 9744, 78860, 7605, 4622, 119656, 983395, 94070, 983393, - 983394, 983391, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, - 78883, 983386, 41732, 4616, 10518, 10423, 10359, 983380, 5958, 0, 983433, - 4215, 9789, 917941, 4321, 4621, 983389, 41313, 522, 5368, 0, 65803, 0, - 5366, 12201, 5372, 0, 983409, 0, 7720, 7390, 2696, 983400, 0, 4638, - 983405, 1790, 78242, 5965, 64363, 66569, 68646, 127833, 5376, 1835, 5335, - 194966, 128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, - 42094, 5331, 4634, 11928, 983594, 5338, 4637, 128170, 5971, 42414, 0, - 1268, 65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, - 4758, 983374, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, - 74384, 983378, 68377, 6248, 983362, 983363, 983360, 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, 42617, 10108, 1011, - 5574, 1853, 2709, 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 42177, - 5316, 0, 5314, 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 983420, - 983872, 194907, 44003, 0, 983480, 983423, 120498, 127851, 195009, 983865, - 74022, 983422, 64609, 68643, 120634, 983489, 5721, 983401, 5519, 8632, - 66465, 11267, 73961, 92278, 5720, 983352, 1692, 4219, 4610, 8696, 4305, - 0, 4609, 43478, 4614, 541, 983355, 5287, 5309, 5285, 68389, 5961, 4647, - 56, 4216, 10577, 41381, 601, 4613, 983349, 983346, 77849, 4608, 64260, - 41124, 5190, 67628, 0, 68145, 7086, 0, 67998, 67620, 0, 2734, 11074, 0, - 67627, 43593, 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114, + 12603, 7131, 11108, 4566, 7518, 9317, 3801, 10342, 10406, 124938, 119259, + 42576, 0, 5200, 92946, 129142, 983895, 9183, 127361, 74458, 66282, 395, + 5482, 5198, 4349, 10390, 74202, 5196, 43224, 6113, 42009, 5205, 128383, + 43307, 128369, 118973, 70467, 12134, 0, 0, 118843, 9126, 435, 983624, + 12014, 10377, 8093, 9079, 3203, 192, 65109, 3385, 125075, 64430, 5383, + 10294, 10326, 127309, 5738, 983215, 3336, 78355, 5361, 3623, 41159, 0, + 68112, 7872, 8581, 0, 1260, 3149, 5359, 120134, 0, 7914, 5357, 71190, + 74339, 2624, 5364, 0, 11431, 120030, 9101, 11058, 78288, 67107, 78293, + 42271, 78289, 42917, 67111, 129179, 65566, 6717, 10619, 43360, 78385, + 78384, 11832, 78382, 78381, 78380, 69861, 9319, 7097, 119055, 77906, + 3232, 73824, 74581, 78087, 0, 71205, 41889, 92453, 0, 1161, 41895, 74103, + 9701, 8622, 125025, 0, 73819, 120588, 5012, 77912, 41362, 69862, 68507, + 11921, 0, 11769, 128477, 68609, 41364, 0, 74228, 41352, 41361, 0, 41366, + 0, 3356, 11611, 917, 68422, 119915, 7134, 8199, 78389, 119618, 677, + 119916, 917876, 119932, 127169, 0, 0, 125136, 3349, 74125, 7022, 8927, + 4739, 92599, 5802, 194874, 8615, 0, 0, 491, 74401, 10190, 120698, 65837, + 119900, 8426, 11092, 9891, 0, 42497, 7113, 7586, 42305, 10852, 0, 42648, + 4606, 68448, 9095, 7741, 12684, 41885, 1046, 7124, 128610, 0, 5815, 5171, + 65539, 68612, 6932, 74267, 42394, 41878, 74849, 120621, 72424, 5169, + 11935, 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871, 78287, + 120663, 9833, 0, 983341, 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, 127963, 8955, 3374, 9400, 9401, 7119, + 9403, 9404, 3507, 9406, 7629, 983617, 19925, 42669, 68463, 183, 43985, + 2631, 70811, 10627, 41130, 78260, 3996, 0, 78771, 0, 119313, 119307, + 78768, 6580, 4332, 64825, 66329, 10726, 66686, 41125, 5899, 41365, + 127206, 12085, 66902, 574, 126705, 77825, 73828, 5448, 41058, 5446, + 65932, 41322, 42211, 5442, 4190, 77834, 77835, 5451, 77833, 3616, 77828, + 77837, 77838, 7708, 77836, 10859, 65867, 10345, 10409, 4191, 120378, + 77844, 73800, 42181, 77843, 77839, 2060, 0, 7111, 11788, 65376, 68129, + 10415, 74102, 0, 205, 0, 10351, 67151, 0, 9862, 6588, 43257, 64697, + 73998, 41355, 5505, 119154, 5503, 8021, 128035, 7125, 9819, 41357, 8011, + 42885, 5507, 12044, 92636, 0, 10026, 5472, 7109, 1191, 13106, 5470, + 10329, 5476, 8991, 66322, 69778, 11133, 42874, 8550, 42876, 5592, 2919, + 0, 2675, 5595, 78411, 43762, 4367, 127912, 0, 5478, 5904, 5594, 0, 74150, + 7291, 5590, 43761, 13067, 118909, 120372, 983108, 9731, 69731, 64633, + 77857, 77854, 71217, 77852, 71227, 77850, 10750, 43714, 77858, 7137, 0, + 66909, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, 5199, + 9936, 1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 73972, 1442, + 129080, 5894, 70069, 128672, 41171, 92511, 70358, 1323, 13162, 0, 3334, + 195010, 118803, 77881, 66022, 0, 69770, 1651, 128771, 8861, 0, 0, 1142, + 983869, 8271, 0, 983058, 126645, 12903, 0, 4002, 43626, 10442, 10676, + 3344, 128910, 194787, 12920, 194560, 70497, 194687, 66642, 1277, 66876, + 7871, 67106, 194686, 78853, 129068, 78854, 120360, 983490, 11784, 0, + 78012, 4700, 43856, 78858, 120359, 11012, 0, 78856, 92400, 77879, 4973, + 8784, 77877, 74804, 77874, 77869, 77871, 42440, 71225, 43118, 0, 42364, + 6774, 6773, 917560, 120369, 10346, 10410, 78859, 9243, 2464, 74263, 6108, + 3372, 0, 6247, 43117, 70364, 7121, 74166, 124973, 120355, 92537, 195035, + 0, 195034, 70357, 119922, 0, 67119, 3354, 195037, 4192, 9289, 118999, + 41191, 3876, 0, 70067, 120660, 43696, 43380, 0, 983091, 0, 983758, 11603, + 983954, 0, 6589, 128564, 194679, 128961, 0, 983700, 0, 129087, 42572, + 128264, 10630, 74827, 1963, 11622, 127098, 11654, 0, 7550, 10686, 5903, + 67098, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 917938, 5542, + 11013, 127927, 71062, 194677, 78621, 67090, 6925, 0, 0, 92892, 71856, + 11568, 983673, 43367, 64579, 917930, 7852, 11138, 0, 6754, 6312, 77956, + 64672, 65296, 0, 118957, 0, 416, 12296, 68457, 73834, 68177, 11050, + 10984, 92208, 0, 0, 92182, 0, 983605, 9532, 66355, 0, 983234, 917925, + 64343, 195032, 92744, 195031, 0, 195030, 195057, 11445, 68294, 2112, + 128741, 128814, 10185, 1021, 128130, 9507, 10210, 74544, 8023, 1200, + 12243, 78001, 5282, 78003, 9624, 11545, 0, 120493, 3343, 4424, 11047, + 1885, 43268, 3896, 78444, 66497, 2947, 392, 7894, 4391, 68139, 983062, + 13059, 74816, 77998, 3381, 7942, 0, 69219, 0, 3558, 0, 3913, 70429, 0, + 78235, 7044, 1265, 0, 6309, 7045, 7175, 7047, 78239, 11791, 0, 917587, + 8221, 78307, 41864, 0, 0, 67075, 71219, 167, 983906, 78301, 983653, + 74211, 41897, 67072, 0, 917583, 917594, 67076, 2493, 0, 113778, 0, 92331, + 64354, 0, 8777, 0, 406, 8884, 2385, 78210, 92450, 0, 917573, 43030, + 42027, 12114, 0, 128597, 64936, 194695, 0, 120629, 10561, 128940, 8365, + 120539, 983774, 65841, 120787, 11601, 0, 74121, 128896, 917575, 7834, + 74159, 0, 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, 70803, 6327, + 6724, 124953, 128086, 92566, 69910, 4817, 11087, 194759, 92536, 7043, + 9600, 11022, 0, 0, 0, 0, 0, 73954, 7548, 64794, 42050, 12291, 55289, + 128781, 12343, 657, 67110, 42705, 4461, 1134, 1838, 78438, 2057, 0, 4468, + 92891, 194945, 0, 4456, 5206, 10720, 0, 42523, 127520, 0, 93044, 917595, + 65550, 260, 4816, 67658, 10687, 0, 4821, 4466, 0, 195043, 4818, 129058, + 41403, 119977, 72422, 128458, 41406, 43273, 74160, 69805, 73939, 92638, + 119984, 119979, 41404, 1165, 119980, 4451, 13087, 0, 11284, 119987, + 70097, 65155, 43014, 5439, 9363, 70070, 3375, 128448, 5900, 93990, 7889, + 2722, 42262, 0, 0, 67078, 128451, 2282, 0, 127810, 11401, 67079, 0, + 68459, 125028, 983141, 0, 70150, 65438, 0, 7280, 127887, 0, 70146, 4868, + 8297, 119966, 70148, 0, 128744, 43161, 70144, 92360, 0, 5182, 0, 120542, + 0, 0, 4226, 70186, 12135, 5732, 4464, 0, 71330, 977, 4458, 43827, 92971, + 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0, 786, 126995, + 43174, 64340, 0, 194767, 73971, 43026, 7612, 10132, 64413, 65025, 0, 0, + 0, 93956, 0, 68444, 0, 92437, 0, 119160, 10204, 92656, 0, 127809, 128431, + 1399, 983652, 65217, 983637, 8852, 128571, 241, 128780, 4907, 128427, + 983639, 7932, 9727, 128463, 74255, 8748, 0, 0, 983631, 0, 42780, 0, + 113677, 0, 4217, 93034, 8650, 0, 120673, 0, 69900, 118872, 43099, 3965, + 119119, 6719, 128007, 13300, 78439, 93971, 43057, 66588, 118991, 66289, + 0, 73815, 4420, 983120, 6410, 7760, 0, 70468, 128752, 120684, 0, 7294, 0, + 43869, 125032, 9066, 0, 11993, 43188, 2626, 7762, 0, 118831, 92899, + 92601, 42825, 41854, 5304, 0, 78516, 6919, 8619, 119655, 10038, 66454, + 9592, 42851, 126993, 1542, 92303, 128819, 0, 127327, 983597, 74311, + 78497, 0, 10181, 124937, 43624, 129060, 7779, 917551, 10195, 9479, 6029, + 128374, 92268, 2224, 0, 65577, 8993, 66358, 0, 42378, 3368, 606, 127030, + 7697, 69237, 69787, 2030, 70106, 6027, 8370, 4322, 0, 65207, 0, 70386, + 127903, 983337, 983336, 2735, 42831, 77935, 70439, 74866, 8881, 119047, + 0, 70433, 73946, 0, 0, 0, 68140, 983928, 9576, 92783, 3347, 4160, 5154, + 55288, 3794, 66564, 8530, 127063, 7709, 41112, 983132, 66560, 8381, 4572, + 12876, 66561, 128921, 6758, 983926, 1615, 5855, 809, 0, 92283, 128316, + 128004, 5799, 128929, 70100, 128607, 7260, 983324, 43031, 64425, 65128, + 78819, 64386, 65257, 0, 68616, 120607, 9347, 128067, 6532, 0, 917918, 0, + 127060, 65828, 120006, 283, 68665, 78813, 532, 78663, 78817, 128021, + 120609, 0, 3370, 0, 11361, 5443, 78778, 8153, 73767, 0, 10741, 0, 2298, + 0, 125039, 65495, 64706, 983318, 43344, 983316, 7144, 9466, 78866, 9824, + 67142, 128963, 67133, 67130, 915, 43425, 67292, 43865, 68232, 0, 127178, + 43264, 67136, 67137, 0, 43038, 78864, 6730, 78862, 68161, 64550, 5186, + 7360, 127837, 70451, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107, + 77826, 0, 42562, 0, 128821, 128178, 128520, 11485, 6103, 92468, 983305, + 11718, 983303, 12889, 92657, 125034, 0, 0, 127476, 55245, 128927, 1630, + 128232, 65483, 120634, 12565, 0, 65476, 70369, 983072, 119214, 9283, + 7700, 917537, 9690, 65499, 0, 64593, 512, 3376, 68210, 0, 128253, 77892, + 632, 12940, 77891, 42529, 78587, 194604, 5957, 110593, 8926, 983299, + 983298, 128273, 10745, 10174, 7379, 64581, 5386, 120686, 11713, 10633, + 69708, 5056, 0, 0, 0, 120773, 94055, 9812, 0, 4460, 0, 124956, 71307, + 128038, 0, 0, 127174, 64278, 92370, 43466, 0, 0, 64389, 2953, 70122, + 1801, 12835, 74847, 0, 73823, 128681, 66375, 2085, 702, 42579, 77884, + 77885, 13074, 77883, 66299, 983285, 128570, 12106, 983282, 74207, 1755, + 10482, 12863, 77898, 1163, 2951, 9522, 74079, 78266, 66604, 0, 3384, + 69227, 10702, 830, 77902, 77899, 77900, 8451, 0, 0, 0, 66458, 128957, + 128870, 0, 0, 2908, 0, 11177, 64902, 4243, 92454, 12239, 917872, 124959, + 4441, 0, 113765, 73940, 64352, 127513, 125031, 411, 983273, 9199, 983271, + 4056, 118992, 41890, 194698, 2730, 41604, 128355, 5428, 194743, 3364, + 42265, 64437, 127935, 118816, 194742, 9684, 216, 71367, 1401, 128053, + 44012, 92628, 0, 92585, 9158, 66878, 11126, 5768, 0, 0, 0, 484, 194739, + 0, 0, 65895, 125076, 0, 3338, 73935, 572, 7041, 2736, 67605, 983263, + 93962, 2794, 8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, + 5456, 5509, 77846, 194747, 9534, 129109, 129040, 0, 3430, 0, 42905, + 78717, 128903, 981, 129184, 4330, 73929, 120536, 1824, 10908, 126506, + 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547, 128259, 674, 63991, + 983249, 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, 92187, 3468, 7033, 9230, 5939, 195052, + 0, 5803, 71867, 68400, 7278, 10321, 10289, 64613, 10385, 41706, 0, 0, + 983413, 0, 11739, 92524, 41981, 92743, 5938, 0, 43766, 12448, 7576, + 10401, 10337, 73852, 124994, 13057, 0, 126976, 0, 10009, 0, 41703, + 983638, 12165, 129191, 0, 9885, 0, 8077, 92620, 127908, 0, 983439, 0, + 92457, 129138, 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 125078, 0, + 983426, 128574, 10970, 11733, 0, 120792, 126490, 19944, 74356, 9009, + 8551, 92345, 11468, 64636, 7575, 0, 2724, 128899, 0, 12313, 11151, 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, 983560, 6184, 8606, 3303, 41372, 11786, 9473, 66203, 66177, 92446, + 11593, 43007, 4478, 66178, 0, 0, 2744, 0, 4477, 78267, 814, 42066, 66183, + 66204, 43786, 119961, 66198, 41880, 66188, 11623, 78148, 11955, 66190, + 66191, 41111, 66189, 73788, 7788, 4847, 0, 127759, 0, 128433, 2221, 1581, + 6535, 78161, 12954, 430, 78160, 55259, 73944, 128036, 5278, 4945, 42883, + 4950, 983438, 68625, 983436, 7269, 0, 5964, 12908, 124997, 0, 74764, + 43512, 119146, 194936, 4949, 983429, 443, 983427, 4944, 5467, 119603, + 70865, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, 194931, 119962, 41306, + 73984, 2698, 127159, 0, 12072, 3193, 0, 41304, 824, 128676, 12091, 67118, + 78894, 119816, 4673, 64804, 4678, 119820, 119819, 65059, 43860, 6739, + 66844, 5481, 3490, 1199, 119811, 8356, 69947, 67702, 4677, 12688, 3102, + 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170, 78166, 4674, 4548, + 44005, 71087, 68658, 119946, 8025, 68630, 127024, 1855, 983412, 68669, + 983410, 92445, 127554, 983417, 127339, 119652, 2745, 11797, 983418, + 128159, 9202, 4654, 6840, 983414, 68638, 73993, 10525, 4649, 65209, + 983416, 0, 4648, 43080, 983406, 983407, 983404, 6246, 64950, 7828, 4650, + 6777, 6776, 6775, 4653, 7822, 78005, 74624, 43187, 8669, 120659, 6821, + 65093, 0, 78881, 2716, 0, 983060, 70503, 194952, 68369, 120054, 11060, + 8547, 2711, 42165, 78027, 78026, 6836, 983421, 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, 983411, + 128737, 11190, 64904, 9026, 10833, 74864, 7547, 4867, 11100, 10008, + 10222, 3054, 194956, 9744, 78860, 7605, 4622, 119656, 983395, 94070, + 983393, 69905, 67188, 9045, 78888, 4225, 19926, 78887, 12880, 65307, + 4617, 78883, 983386, 41732, 4616, 10518, 10423, 10359, 983380, 5958, 0, + 983433, 4215, 9789, 119619, 4321, 4621, 983389, 41313, 522, 5368, 11139, + 65803, 0, 5366, 12201, 5372, 0, 983409, 194975, 7720, 7390, 2696, 983400, + 0, 4638, 983405, 1790, 78242, 5965, 64363, 66569, 68646, 68477, 5376, + 1835, 5335, 194966, 128089, 4633, 0, 68119, 1180, 4632, 67191, 5387, + 5333, 0, 125132, 42094, 5331, 4634, 11928, 983594, 5338, 4637, 128170, + 5971, 42414, 43500, 1268, 65097, 42361, 0, 0, 73853, 1427, 128440, 0, + 5970, 3431, 0, 10358, 10422, 4758, 983374, 1608, 2738, 125066, 10455, + 4753, 74026, 11344, 4222, 6240, 5231, 74384, 983378, 68377, 6248, 983362, + 128432, 983360, 42318, 92582, 5229, 4757, 0, 0, 2728, 4752, 64563, 65235, + 5234, 0, 128145, 128926, 10713, 7166, 0, 2622, 7460, 127302, 67101, + 126495, 8954, 74760, 65189, 2632, 42617, 10108, 1011, 5574, 1853, 2709, + 65139, 5577, 128966, 0, 118871, 68641, 8965, 7635, 42177, 5316, 0, 5314, + 6451, 5572, 66464, 5312, 0, 5525, 5330, 5319, 68292, 127311, 65066, + 44003, 120650, 983480, 43843, 120498, 127851, 195009, 74851, 74022, + 983422, 64609, 68643, 67410, 128593, 5721, 983401, 5519, 8632, 66465, + 11267, 73961, 92278, 5720, 983352, 1692, 4219, 4610, 8696, 4305, 0, 4609, + 43478, 4614, 541, 983355, 5287, 5309, 5285, 68389, 5961, 4647, 56, 4216, + 10577, 41381, 601, 4613, 983349, 983346, 9208, 4608, 64260, 41124, 5190, + 67628, 66826, 68145, 7086, 0, 67998, 67620, 93047, 2734, 11074, 0, 67627, + 43593, 0, 67625, 5960, 67722, 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, + 6239, 119956, 41256, 74132, 67740, 0, 71178, 917550, 9346, 69660, 41254, 128047, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724, - 7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 983840, 4869, 120563, 0, - 4223, 128201, 6650, 126509, 0, 983463, 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, 983486, 4778, 0, 10863, 0, 4781, 0, - 64407, 0, 128323, 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, 983870, 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, 983424, 303, 983101, 92622, - 983425, 2437, 0, 4221, 4844, 92216, 0, 0, 0, 70042, 0, 43292, 0, 2441, - 10739, 65090, 0, 119327, 126541, 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, - 983430, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, - 983601, 0, 4964, 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180, - 64179, 9482, 4873, 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500, - 0, 119024, 78028, 92408, 9830, 43642, 389, 10893, 7521, 127879, 4872, - 5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0, - 11494, 126492, 9563, 10865, 74570, 43279, 64186, 983439, 78714, 64191, - 64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, 78805, + 7193, 67097, 128844, 5739, 41024, 4866, 0, 73904, 983840, 4869, 120563, + 0, 4223, 128201, 6650, 126509, 0, 983463, 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, 129136, + 68631, 42775, 0, 128445, 0, 3097, 0, 5966, 983486, 4778, 0, 10863, 0, + 4781, 92986, 64407, 128503, 128323, 8577, 71221, 68196, 43285, 10216, + 4782, 0, 0, 120757, 68618, 12325, 43056, 8717, 0, 0, 4776, 73818, 11492, + 8700, 983955, 13176, 68363, 10426, 67247, 71091, 10362, 194706, 1715, + 4849, 8242, 9561, 73922, 43278, 42635, 0, 127207, 5963, 917926, 983481, + 0, 4850, 73900, 1607, 466, 4853, 118995, 4854, 127918, 5164, 73807, 1350, + 5124, 64420, 1993, 5362, 8471, 2708, 92471, 12445, 3785, 234, 3199, + 128768, 41268, 4848, 2530, 194711, 2068, 1964, 0, 73762, 10458, 983415, + 8576, 78543, 0, 2704, 4794, 0, 68211, 8322, 4797, 5753, 0, 2694, 4792, 0, + 2439, 65104, 69804, 983424, 303, 74625, 68229, 983425, 2437, 78659, 4221, + 4844, 92216, 0, 0, 0, 70042, 74095, 43292, 0, 2441, 10739, 65090, 0, + 70436, 118929, 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, 983430, 4942, 9539, + 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, 983601, 6844, 4964, 5264, + 64178, 64177, 12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873, + 41231, 1822, 42526, 127989, 12758, 3865, 0, 128473, 10500, 0, 119024, + 78028, 92408, 9830, 43642, 389, 10893, 7521, 127879, 4872, 5463, 128119, + 3125, 9567, 0, 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0, 11494, + 126492, 9563, 10865, 74570, 43279, 64186, 68521, 78714, 64191, 64190, + 8898, 64188, 129153, 41030, 74226, 0, 74600, 78820, 917834, 0, 78805, 41031, 78801, 11960, 6745, 3082, 983437, 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, 126471, - 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, 2295, 43299, 9453, 5348, 10943, - 120378, 0, 11352, 550, 9910, 126705, 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, 69890, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, - 0, 78200, 78201, 5062, 1264, 64817, 13254, 11697, 126598, 9785, 64716, 0, - 3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 983873, - 42130, 0, 5151, 917829, 917823, 0, 93980, 0, 7620, 3800, 65122, 0, 0, - 8355, 7854, 0, 954, 64927, 4185, 41045, 127141, 41438, 41439, 68666, - 10711, 4593, 127745, 120584, 983408, 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, 983451, 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431, - 119960, 1477, 43289, 0, 74358, 8618, 983402, 9908, 983981, 0, 0, 3937, - 12312, 0, 983403, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244, - 92209, 71341, 3935, 120665, 983476, 0, 11950, 5392, 42248, 65129, 68656, - 5397, 0, 12046, 12599, 0, 128261, 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, 983079, 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, 43745, 4911, 988, 917807, 0, 983468, 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, 983364, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741, - 42108, 983354, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, - 917916, 127331, 65549, 9496, 64598, 118866, 983366, 7876, 68132, 917872, - 3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0, - 4171, 12008, 6251, 3923, 1490, 0, 119591, 126512, 40972, 5245, 0, 10114, - 42001, 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849, - 4825, 69240, 917852, 68655, 0, 983388, 0, 0, 68628, 983347, 9850, 118937, - 367, 1472, 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261, - 11023, 119559, 4830, 9134, 78666, 64126, 43011, 0, 126626, 64101, 0, 0, - 4824, 10614, 119659, 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, 70018, 0, 0, 119053, 0, 12765, - 64118, 126998, 12962, 0, 126580, 4017, 12827, 5241, 120392, 0, 41118, - 3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844, 917564, 0, 11363, - 12057, 11917, 1567, 74000, 4721, 126641, 66202, 8957, 4139, 0, 0, 0, 0, - 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 983383, 4726, 0, - 194892, 983622, 128321, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, - 0, 128294, 64212, 41020, 1382, 64209, 64216, 44002, 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, 70104, 120053, 92350, 120051, 3938, - 120057, 65417, 64717, 120060, 120061, 65415, 120059, 6292, 65303, 7955, - 6452, 4713, 128196, 66249, 917885, 917890, 917891, 65152, 719, 120044, + 7079, 5856, 127043, 5163, 78809, 128162, 1817, 66724, 78538, 119010, + 10564, 7763, 13077, 41813, 4400, 41745, 64207, 10275, 8925, 10371, 10307, + 41814, 4248, 0, 0, 4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, + 126471, 42156, 78688, 0, 64193, 64192, 65223, 9943, 64197, 64196, 64195, + 64194, 12231, 42652, 64174, 64173, 78189, 846, 78186, 9965, 74495, 0, + 917924, 0, 2543, 12163, 3108, 9745, 64167, 64166, 64165, 64164, 2110, + 92176, 64169, 64168, 64949, 10972, 10251, 10247, 42768, 715, 2295, 43299, + 9453, 5348, 10943, 66390, 0, 11352, 550, 9910, 125127, 0, 66579, 11551, + 128464, 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, 69890, 78192, 68136, 78190, 43412, + 5064, 2431, 0, 9450, 1809, 0, 78200, 78201, 5062, 1264, 64817, 13254, + 11697, 126598, 9785, 64716, 0, 3933, 74559, 4740, 7954, 0, 125023, 42609, + 128388, 74175, 66912, 127016, 0, 983873, 42130, 983223, 5151, 917829, + 917823, 0, 93980, 0, 7620, 3800, 65122, 0, 127792, 8355, 7854, 0, 954, + 64927, 4185, 41045, 127141, 41438, 41439, 68666, 10711, 4593, 127745, + 120584, 983408, 64774, 8053, 10532, 66727, 0, 0, 78642, 64759, 1325, + 5166, 9888, 127800, 5148, 42834, 0, 78205, 78206, 43787, 78204, 64131, + 3119, 917814, 0, 3060, 64135, 9986, 0, 77876, 636, 11698, 0, 917810, + 9916, 11701, 7836, 42741, 64137, 8320, 78640, 8863, 70201, 119960, 1477, + 43289, 68492, 67164, 8618, 983402, 9908, 983981, 0, 0, 3937, 12312, 0, + 983403, 0, 64781, 912, 6349, 4536, 93954, 74532, 126594, 6244, 92209, + 71341, 3935, 120665, 983476, 0, 11950, 5392, 42248, 65129, 68656, 5397, + 128310, 12046, 12599, 67407, 128261, 5395, 0, 5393, 354, 68615, 77853, + 74366, 0, 0, 42039, 113817, 0, 64142, 626, 0, 5895, 0, 0, 5780, 0, 66407, + 128874, 0, 0, 43297, 70188, 4311, 4644, 8818, 78158, 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, 92206, 0, 119255, 74046, 43745, 4911, 988, 71180, 0, + 983468, 43061, 7054, 64147, 0, 64920, 68195, 6698, 118933, 92506, 0, + 70849, 11981, 12202, 0, 11032, 67654, 6093, 11608, 975, 66415, 65843, + 170, 0, 67239, 4169, 0, 41859, 6058, 120401, 13203, 120657, 70507, + 125091, 68657, 9818, 10178, 10324, 42106, 5898, 74540, 4738, 41856, 7062, + 127120, 4737, 11779, 4742, 120564, 92391, 68342, 983364, 9825, 6448, + 6715, 127008, 4831, 983363, 92525, 67731, 5300, 4741, 42108, 983354, + 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, 127533, + 127331, 65549, 9496, 64598, 118866, 983366, 7876, 68132, 66280, 3928, + 917870, 43378, 10706, 7198, 0, 4842, 12053, 128129, 127303, 4841, 0, + 4171, 12008, 6251, 3923, 1490, 0, 119591, 126512, 40972, 5245, 70794, + 10114, 42001, 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, + 917849, 4825, 69240, 917852, 68655, 0, 983388, 0, 0, 68628, 983347, 9850, + 118937, 367, 1472, 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, + 10907, 65261, 11023, 119559, 4830, 9134, 78666, 64126, 43011, 0, 78669, + 64101, 0, 0, 4824, 10614, 119659, 0, 1888, 1960, 7861, 917856, 78524, + 41836, 43012, 6052, 6064, 54, 43009, 12214, 0, 6211, 120386, 358, 41997, + 41833, 11442, 10758, 65774, 113823, 120384, 64115, 92221, 70018, 0, + 983708, 119053, 0, 12765, 64118, 126998, 12962, 0, 126580, 4017, 12827, + 5241, 120392, 0, 41118, 3924, 0, 11366, 129084, 0, 0, 917846, 41116, + 917844, 917564, 129081, 11363, 12057, 11917, 1567, 74000, 4721, 126641, + 66202, 8957, 4139, 70512, 0, 983074, 0, 0, 12740, 128702, 4722, 6816, + 124974, 12759, 4725, 67099, 4726, 0, 194892, 983622, 70029, 917905, + 92912, 12755, 12762, 4015, 67690, 8052, 476, 0, 0, 128294, 64212, 41020, + 1382, 64209, 64216, 44002, 64214, 1656, 41831, 0, 125121, 41843, 8720, + 3908, 1452, 13111, 983419, 64067, 127328, 8552, 64113, 41845, 3849, + 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 119085, 0, 917610, + 7935, 2420, 0, 1114, 78120, 67585, 70104, 70432, 92168, 120051, 3938, + 120057, 65417, 64717, 120060, 71920, 65415, 66884, 6292, 65303, 7955, + 6452, 4713, 128196, 66249, 917885, 917890, 129073, 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, 126606, - 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, 71335, 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, 983470, 64080, 0, 64090, 0, 69913, 10162, 10310, 0, 8454, - 127888, 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732, - 78116, 0, 983139, 0, 983074, 8896, 0, 375, 6976, 66582, 119005, 983874, - 0, 983434, 119202, 119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529, - 119200, 119201, 119198, 119199, 69692, 983432, 69698, 13150, 64492, 0, 0, - 2291, 12902, 0, 42891, 66327, 74298, 917857, 10799, 69690, 2587, 66372, - 0, 4193, 92250, 4241, 983057, 7998, 0, 0, 0, 126640, 2316, 118821, 0, 0, - 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 983886, 3762, 10015, 120672, - 119232, 0, 41590, 0, 70098, 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, 983752, 119237, 0, 128805, - 4470, 11826, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, 127143, 0, - 5377, 120585, 68143, 1688, 78245, 983356, 69685, 983756, 0, 0, 44020, - 6808, 41319, 1300, 10650, 41692, 64505, 2290, 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, 983435, 69641, 10753, - 10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, - 0, 0, 67996, 2020, 0, 4022, 128783, 0, 77923, 126593, 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, - 120280, 92192, 12347, 124, 12981, 41127, 2092, 92687, 0, 0, 0, 10820, - 43987, 0, 0, 1769, 41715, 2463, 78489, 0, 12770, 126500, 1538, 0, 43124, - 0, 195058, 7795, 120300, 0, 4828, 1258, 127802, 2006, 0, 0, 9498, 127032, - 127033, 120289, 120288, 3939, 120290, 8846, 8943, 120287, 120286, 2650, - 4491, 1961, 42602, 11525, 120292, 1959, 120294, 55228, 11774, 41016, 0, - 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, 128071, 41826, 8865, 6402, 0, 13279, 7917, 74755, 0, 7733, 0, - 4998, 983896, 92332, 41950, 0, 4268, 0, 0, 70061, 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, - 983053, 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, - 128208, 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, + 4712, 917902, 917899, 65400, 65416, 8155, 4718, 3942, 4714, 9625, 0, + 6383, 194744, 12006, 128565, 194789, 0, 113756, 0, 65414, 6454, 1229, + 126606, 66437, 66025, 78699, 0, 42500, 120508, 4809, 9623, 917874, 78694, + 917880, 917877, 917858, 65405, 68159, 12893, 78617, 5365, 4545, 8901, + 92421, 119555, 4813, 128262, 0, 5925, 4808, 64330, 128400, 65475, 118940, + 68244, 4814, 0, 4810, 0, 0, 64928, 10543, 71249, 3522, 71335, 414, 65404, + 0, 195027, 6456, 73820, 0, 6691, 42193, 66284, 128171, 0, 68337, 0, + 43858, 43832, 118820, 9751, 65407, 128085, 11770, 3919, 120724, 0, 65061, + 0, 917894, 0, 12235, 0, 92701, 127233, 64092, 983470, 64080, 0, 64090, + 983586, 69913, 10162, 10310, 0, 8454, 127888, 42038, 387, 41363, 12737, + 0, 4780, 43368, 0, 64310, 64621, 6732, 78116, 0, 194959, 195024, 92193, + 8896, 0, 375, 6976, 66582, 119005, 983874, 127325, 983434, 119202, + 119203, 12526, 43120, 2315, 0, 1938, 119197, 128452, 4529, 119200, + 119201, 119198, 119199, 69692, 129124, 69698, 13150, 64492, 128974, 0, + 2291, 12902, 0, 42891, 66327, 70502, 917857, 10799, 69690, 2587, 66372, + 128628, 4193, 66823, 4241, 129195, 7998, 119840, 0, 983554, 126640, 2316, + 118821, 0, 0, 0, 64297, 74799, 92442, 74140, 128148, 5373, 128798, 70370, + 3762, 10015, 120672, 119232, 125109, 41590, 0, 70098, 3780, 7485, 5779, + 0, 42037, 0, 3906, 12349, 74793, 8326, 0, 65498, 3763, 6983, 5618, 0, + 3779, 983194, 43613, 70132, 0, 0, 78335, 983892, 0, 280, 74558, 127332, + 67396, 13072, 1894, 0, 67735, 65478, 43310, 7231, 0, 11773, 0, 0, 11144, + 917778, 2551, 0, 6453, 10200, 6235, 983752, 119237, 71877, 128805, 4470, + 11826, 917557, 7780, 5369, 118958, 5249, 983066, 5367, 8756, 127143, + 119183, 5377, 120585, 68143, 1688, 78245, 5218, 69685, 983756, 0, 113794, + 44020, 6808, 41319, 1300, 10650, 41692, 64505, 2290, 71057, 119624, 1465, + 10850, 3943, 0, 41205, 41315, 118961, 119333, 67148, 5352, 113753, 0, + 8839, 41314, 7384, 7785, 41204, 127322, 41209, 69637, 92241, 43607, + 71254, 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, 120750, 78751, 7146, 0, 65150, 41819, 0, 73951, 10847, 41822, 9985, + 860, 0, 10506, 983435, 69641, 10753, 10830, 119339, 615, 64490, 7574, + 74082, 77922, 0, 12909, 43016, 64559, 127028, 0, 127029, 67996, 2020, + 983350, 4022, 128783, 0, 77923, 126593, 41691, 0, 917818, 74329, 0, + 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904, + 983628, 73737, 125105, 118931, 119630, 13123, 10846, 3450, 127360, 7397, + 118807, 0, 42778, 10000, 41088, 449, 0, 3777, 68458, 113725, 9636, 0, + 10738, 69634, 9367, 593, 41085, 3999, 65226, 41713, 12764, 983723, 64409, + 3596, 0, 128090, 9763, 120280, 74609, 12347, 124, 12981, 41127, 2092, + 92687, 0, 127555, 0, 10820, 43987, 0, 128907, 1769, 41715, 2463, 71214, + 983947, 12770, 71222, 1538, 92617, 43124, 194614, 195058, 7795, 120300, + 129053, 4828, 1258, 127802, 2006, 0, 0, 9498, 127032, 127033, 120289, + 120288, 3939, 120290, 8846, 8943, 120287, 120286, 2650, 4491, 1961, + 42602, 11525, 120292, 1959, 120294, 55228, 11774, 41016, 983260, 68675, + 128054, 1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 127944, + 0, 65292, 6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 70864, 118879, + 55223, 0, 128071, 41826, 8865, 6402, 113827, 13279, 7917, 74755, 917948, + 7733, 0, 4998, 68493, 92332, 41950, 0, 4268, 0, 0, 70061, 4013, 128718, + 10881, 0, 0, 0, 74788, 2014, 2432, 71901, 9765, 0, 0, 917854, 195059, + 78357, 65281, 127825, 10949, 0, 0, 119315, 2015, 0, 0, 71840, 66318, + 43233, 917992, 42517, 0, 0, 0, 12698, 8094, 10135, 65909, 6474, 794, + 43497, 12656, 66335, 119353, 128270, 1665, 71853, 4833, 983053, 71188, + 127367, 0, 189, 12611, 0, 0, 2859, 4838, 0, 4834, 65078, 0, 92991, 4837, + 67413, 770, 92671, 811, 70062, 41042, 92915, 41318, 64427, 73999, 67693, + 78848, 3895, 0, 74341, 3976, 128466, 42859, 10193, 3116, 7747, 78488, 0, + 43496, 0, 0, 43686, 78846, 41877, 0, 2871, 64614, 127010, 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, 128524, 424, 66328, 1999, - 69659, 73914, 0, 0, 0, 0, 42231, 8246, 0, 0, 0, 41840, 983609, 2377, - 1298, 64011, 12572, 11318, 12557, 12559, 12570, 7479, 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, 983288, 43280, 8219, - 68402, 1812, 119963, 983692, 0, 126488, 42410, 74448, 119132, 6054, - 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 983261, 68678, - 0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, 3921, 0, 11775, 64760, + 12566, 12569, 12554, 0, 10812, 78851, 0, 917563, 3078, 1402, 0, 128275, + 0, 125072, 119248, 394, 3088, 0, 92172, 0, 3991, 64391, 129072, 128524, + 424, 66328, 1999, 69659, 73914, 0, 0, 66903, 0, 42231, 2209, 125103, 0, + 0, 41840, 66913, 2377, 1298, 64011, 12572, 11318, 12557, 12559, 12570, + 7479, 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, 92934, 9424, 9425, 9426, 9427, 9428, 9429, 64758, 2362, + 9655, 983709, 2004, 9096, 9782, 70842, 9172, 128545, 19965, 0, 5955, + 67666, 1108, 0, 74773, 0, 128909, 64782, 3926, 92448, 65210, 8798, 0, + 92165, 1392, 0, 983214, 127364, 10606, 8065, 118805, 10353, 10417, 0, + 128739, 64524, 92418, 4019, 0, 125082, 43280, 8219, 68402, 1812, 119963, + 983692, 129144, 126488, 42410, 74448, 119132, 6054, 10697, 3169, 42297, + 42322, 10642, 3909, 9950, 128848, 128139, 983261, 68678, 92917, 983790, + 1049, 43517, 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, 983130, 2009, 0, 0, 127142, - 9640, 119951, 0, 120695, 8621, 120523, 12852, 3031, 983050, 64361, 0, - 182, 194718, 92716, 92598, 119950, 42613, 9058, 366, 0, 9892, 5969, - 11754, 10848, 4570, 65301, 44013, 4255, 127889, 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, - 69914, 42672, 4709, 10680, 119065, 43293, 119944, 0, 119164, 120328, - 92467, 10187, 1700, 119223, 0, 0, 128119, 4004, 0, 10968, 43296, 983642, - 8506, 0, 0, 126996, 1005, 937, 78216, 4734, 2870, 0, 78218, 983109, 7463, - 4729, 0, 235, 1384, 4728, 0, 120420, 92490, 74449, 8109, 43105, 983174, - 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, 67984, 73976, 120305, 43371, 6941, 119349, 13205, 13211, 5801, + 5153, 41805, 0, 73735, 763, 41808, 64910, 983130, 2009, 0, 127985, 74245, + 9640, 119951, 0, 69895, 8621, 120523, 12852, 3031, 983050, 64361, 129088, + 182, 66414, 92716, 92598, 119950, 42613, 9058, 366, 0, 9892, 5969, 11754, + 10848, 4570, 65301, 44013, 4255, 127889, 10102, 41189, 4003, 41026, + 68109, 13293, 41192, 69635, 124977, 42251, 0, 42534, 65179, 11287, 6128, + 113811, 11034, 10923, 64423, 0, 65506, 0, 65861, 74083, 66872, 9932, + 43516, 92423, 119955, 119948, 9817, 0, 71234, 0, 12117, 66586, 4183, + 10540, 66250, 9063, 127045, 0, 119954, 113685, 12897, 3792, 2011, 0, + 6065, 43160, 128379, 194715, 8692, 41186, 41816, 41023, 41818, 41187, + 11659, 7922, 12614, 2005, 8523, 78002, 120035, 7513, 1863, 4710, 0, 5956, + 7621, 78006, 92624, 4705, 716, 78004, 0, 4704, 120040, 93024, 42241, 161, + 43977, 74546, 66214, 4706, 74077, 69914, 42672, 4709, 10680, 119065, + 43293, 119944, 983190, 119164, 120328, 92350, 10187, 1700, 119223, 0, 0, + 127202, 4004, 0, 10968, 43296, 983642, 8506, 113744, 194812, 126996, + 1005, 937, 78216, 4734, 2870, 0, 78218, 983109, 7463, 4729, 0, 235, 1384, + 4728, 0, 70494, 92490, 74449, 8109, 43105, 128623, 4730, 447, 13186, + 1513, 4733, 120415, 92548, 0, 42527, 12911, 43427, 1383, 8565, 2469, + 120024, 6690, 6156, 68117, 43439, 7993, 4288, 120416, 2674, 13238, 11922, + 0, 120330, 3510, 13234, 983832, 120407, 5605, 42095, 11364, 92286, 1380, + 65617, 11162, 120261, 13196, 13197, 120309, 67708, 9495, 119346, 127154, + 5959, 67984, 73976, 66275, 43371, 6941, 119349, 13205, 13211, 5801, 12769, 65905, 41697, 1283, 120302, 4779, 0, 3719, 4006, 983569, 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, 983794, - 9742, 521, 0, 10800, 92222, 8404, 194625, 483, 7096, 7089, 66323, 928, 0, - 0, 119018, 10599, 11586, 3989, 10971, 43748, 65782, 9841, 8843, 12145, - 92470, 10074, 78548, 0, 3769, 0, 0, 0, 983107, 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, - 983913, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 11831, 2370, - 2846, 92605, 0, 0, 120132, 0, 1836, 0, 0, 92558, 3740, 69843, 6290, - 65374, 120451, 2390, 3944, 66628, 120434, 0, 6135, 3118, 74265, 119093, - 120446, 0, 0, 8127, 8975, 64739, 7943, 983743, 0, 10618, 2584, 0, 0, 0, - 9998, 128564, 0, 0, 0, 0, 6204, 0, 0, 8279, 8776, 64954, 4975, 70075, - 120130, 4267, 1631, 42206, 77983, 0, 195046, 65700, 66562, 0, 64645, 0, - 0, 126588, 12586, 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 983797, - 7793, 78275, 9328, 119104, 78393, 12604, 0, 6615, 2285, 92344, 3986, - 44025, 0, 8912, 64555, 7409, 0, 983358, 9541, 78276, 0, 11275, 8540, - 11498, 0, 983357, 41040, 2459, 0, 13060, 41041, 74413, 983138, 0, 0, - 68427, 10450, 12551, 41043, 7020, 120353, 3765, 983350, 0, 1606, 120348, - 120351, 3093, 68436, 0, 983061, 119613, 0, 0, 4312, 74091, 120337, - 120336, 11923, 4023, 120333, 5763, 94015, 4827, 10894, 12810, 64406, - 118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 118837, 11973, - 13089, 4293, 120329, 42224, 42758, 12196, 42837, 42226, 119319, 0, - 119126, 5817, 127806, 55277, 3120, 9797, 0, 0, 0, 10389, 126485, 0, 4895, - 65358, 0, 4359, 585, 2383, 3509, 70037, 486, 4290, 5758, 127546, 0, 0, - 7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 93996, 2376, 0, 119320, - 0, 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, - 0, 0, 983084, 0, 0, 0, 74188, 71342, 983086, 983573, 120047, 128575, 0, - 0, 120049, 0, 1847, 0, 10339, 983365, 42384, 0, 4227, 74158, 0, 92501, - 43032, 0, 42365, 0, 12671, 11384, 0, 983465, 0, 64797, 983345, 5820, - 983344, 120052, 120065, 0, 120064, 120650, 42137, 9893, 2754, 12664, - 120063, 0, 7377, 127867, 41799, 65530, 1711, 12984, 43039, 3114, 6255, - 983340, 118938, 0, 10853, 926, 983369, 74184, 983368, 120055, 0, 43175, - 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, 119605, 520, 4200, - 12699, 8331, 0, 3091, 41034, 127353, 983681, 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, 67997, 12682, 43287, 92317, 0, 983143, 983707, 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, 983902, - 74359, 12626, 9106, 0, 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, - 41795, 64666, 126508, 43530, 2752, 0, 0, 983493, 59, 0, 983593, 0, 92371, - 77873, 41810, 0, 7010, 0, 41809, 41495, 119364, 0, 42252, 42213, 8009, - 3305, 43033, 511, 92700, 66255, 13127, 120067, 0, 74397, 120235, 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, 983589, 0, 4373, 78058, 0, 9587, 1789, 6671, 128840, 3100, - 0, 65360, 0, 92365, 917789, 64922, 0, 8190, 12083, 0, 0, 6506, 64312, - 74374, 2368, 0, 4419, 983847, 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, 983850, 12112, 69912, 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, 71340, 69816, - 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 128127, 8283, 0, 5434, - 983590, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 128307, 3464, - 6486, 4819, 128233, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 128539, - 431, 0, 0, 128182, 128096, 68167, 983663, 13096, 128643, 0, 43408, 9516, - 128538, 5268, 42230, 42220, 0, 4450, 120511, 11547, 43417, 128542, 356, - 3477, 227, 10488, 68203, 382, 11418, 0, 195066, 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, 126494, 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, 917847, 2671, 0, 0, 92632, 92631, 118865, 4553, 73811, 0, 195005, - 0, 0, 19921, 74331, 11424, 195006, 4567, 41891, 0, 983788, 55249, 4820, - 65239, 194662, 0, 194665, 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, 120087, 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, 194893, 0, - 92689, 6196, 6945, 93969, 194890, 128184, 120491, 11816, 194943, 5733, - 2930, 0, 0, 41098, 0, 41093, 0, 66626, 588, 9760, 0, 194717, 1238, 200, - 983207, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, 983706, 3394, - 194894, 120668, 0, 0, 127358, 66219, 127183, 43284, 194656, 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, 2287, 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, 126562, 983129, 0, - 0, 983802, 42767, 10915, 0, 12007, 43695, 120520, 11975, 194878, 0, - 92604, 2555, 8629, 128640, 43168, 41872, 43706, 4496, 194879, 128148, - 120241, 0, 0, 0, 0, 64730, 70041, 66714, 68222, 0, 70076, 65596, 92306, - 11416, 4280, 67655, 8765, 12784, 7792, 1393, 126473, 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, 94003, 3406, - 1054, 71320, 1040, 65450, 0, 4434, 1069, 0, 118862, 65737, 917765, - 128705, 0, 983693, 9693, 41943, 126564, 41931, 41759, 12757, 4353, 0, - 1059, 9790, 8995, 119974, 983696, 65937, 0, 41764, 10646, 0, 118833, - 92372, 0, 74830, 78569, 12743, 983689, 6480, 917761, 41779, 42580, 66601, - 12207, 119619, 6335, 66602, 11312, 64807, 0, 0, 41767, 119629, 983764, - 43020, 128271, 3955, 74254, 0, 983754, 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, 74284, 0, 5747, - 78825, 0, 7978, 41092, 74571, 0, 11924, 43812, 42144, 65015, 0, 563, 0, - 983691, 12798, 11271, 57, 0, 0, 917860, 119043, 0, 94051, 43137, 694, 0, - 9876, 0, 119168, 0, 78822, 64537, 0, 277, 74385, 7229, 12761, 0, 0, - 13025, 64811, 8757, 78824, 126478, 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, 71327, 9644, 0, 0, 0, 194916, 120732, 66710, 118834, - 983359, 73906, 128680, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157, - 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, 10226, 65142, - 128025, 3594, 42424, 194959, 40, 12657, 983665, 0, 386, 0, 8834, 0, - 12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 65322, 4304, - 74503, 8160, 78707, 194753, 0, 0, 128526, 1348, 92349, 78597, 126539, - 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, 127470, 13138, 42266, 9484, 10724, 41202, 71364, 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, 120683, 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, 983817, 983247, - 195024, 10196, 7886, 0, 6585, 0, 6680, 195042, 0, 195051, 6679, 74412, - 92251, 194866, 74421, 11382, 983631, 983637, 127891, 127484, 194833, + 71186, 2021, 119332, 43877, 119150, 43028, 65493, 41838, 3875, 5962, + 64341, 92616, 9814, 43457, 5827, 3314, 7787, 71189, 65494, 68153, 126991, + 194697, 120636, 64531, 120692, 194626, 0, 0, 66316, 65467, 5771, 41298, + 983794, 9742, 521, 0, 10800, 92222, 8404, 194625, 483, 7096, 7089, 66323, + 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 43748, 65782, 9841, 8843, + 12145, 67261, 10074, 78548, 93999, 3769, 0, 0, 128703, 983107, 9573, 0, + 65290, 8849, 119254, 65855, 65112, 1796, 71046, 0, 69665, 8164, 41301, + 3502, 0, 7388, 10621, 73838, 78553, 5825, 13007, 68165, 92203, 120456, + 12661, 7608, 10354, 10418, 42411, 2022, 0, 1409, 12195, 4001, 3112, + 10824, 120639, 1390, 70184, 0, 421, 43536, 5846, 120120, 4130, 127775, + 7595, 42588, 7600, 74400, 66035, 195091, 0, 65851, 42607, 128190, 92403, + 3168, 67733, 42134, 11831, 2370, 2846, 92605, 128183, 0, 120132, 0, 1836, + 0, 0, 92558, 3740, 69843, 6290, 65374, 120451, 2390, 3944, 66628, 120434, + 0, 6135, 3118, 74265, 119093, 113690, 77975, 0, 8127, 8975, 64739, 7943, + 124968, 119234, 10618, 2584, 0, 0, 128225, 9998, 120573, 0, 0, 127750, + 43508, 6204, 127044, 0, 8279, 8776, 64954, 4975, 70075, 120130, 4267, + 1631, 42206, 77983, 128015, 195046, 65700, 66386, 0, 64645, 0, 92887, + 126588, 12586, 0, 9242, 120100, 0, 4523, 5842, 10495, 3122, 983797, 7793, + 78275, 9328, 119104, 78393, 12604, 92885, 6615, 2285, 92344, 3986, 44025, + 0, 8912, 64555, 7409, 92247, 983358, 9541, 78276, 113669, 11275, 8540, + 11498, 0, 983357, 41040, 2459, 128629, 13060, 41041, 74413, 983138, 0, + 77931, 68427, 10450, 12551, 41043, 7020, 120353, 3765, 92881, 0, 1606, + 120348, 92299, 3093, 68436, 128040, 983061, 119613, 0, 0, 4312, 74091, + 120337, 120336, 11923, 4023, 120333, 5763, 94015, 4827, 10894, 12810, + 64406, 118785, 4455, 74321, 433, 119620, 66660, 2499, 67167, 67166, + 118837, 11973, 13089, 4293, 120329, 42224, 42758, 12196, 42837, 42226, + 119319, 0, 119126, 5817, 127806, 55277, 3120, 9797, 0, 0, 11086, 10389, + 126485, 0, 4895, 65358, 124941, 4359, 585, 2383, 3509, 70037, 486, 4290, + 5758, 127546, 0, 0, 7004, 113667, 65880, 126514, 119048, 2380, 11380, 0, + 93996, 2376, 78841, 119320, 0, 5197, 70839, 127047, 127048, 2366, 127050, + 127051, 70837, 120045, 0, 128554, 0, 983084, 0, 0, 0, 74188, 71342, + 78455, 983573, 120047, 128575, 120046, 127542, 120049, 0, 1847, 0, 10339, + 983365, 42384, 0, 4227, 74158, 0, 74498, 43032, 125010, 42365, 0, 12671, + 11384, 120059, 74264, 120058, 64797, 983345, 5820, 983344, 120052, + 120065, 128825, 120064, 120053, 42137, 9893, 2754, 12664, 120063, 128900, + 7377, 127867, 41799, 65530, 1711, 12984, 43039, 3114, 6255, 983340, + 68660, 0, 10853, 926, 983369, 74184, 983368, 120055, 194993, 43175, 0, + 43037, 41798, 41035, 11583, 127769, 41801, 119088, 119605, 520, 4200, + 12699, 8331, 0, 3091, 41034, 66298, 983681, 8360, 983443, 78044, 321, + 4229, 64543, 128470, 65563, 0, 917974, 2861, 43793, 10095, 194735, 9195, + 92386, 1861, 0, 73733, 0, 0, 43041, 0, 43794, 128530, 3859, 12181, 41660, + 8209, 70793, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, 113699, + 743, 4414, 120766, 0, 42632, 917973, 65161, 73896, 128589, 0, 1405, + 119063, 43220, 43341, 0, 19919, 0, 64532, 65367, 43710, 11199, 194907, + 3513, 128854, 70341, 43342, 119064, 65529, 65364, 128197, 0, 6485, 1397, + 0, 41986, 92678, 0, 194784, 74097, 0, 7471, 12079, 67997, 6843, 43287, + 92317, 0, 67406, 983707, 0, 71914, 1099, 10490, 0, 10501, 65181, 74463, + 128952, 464, 41624, 65283, 67663, 78222, 1346, 0, 65679, 64573, 64897, + 423, 1818, 65144, 113748, 8272, 127812, 19911, 4218, 3087, 64960, 127234, + 43564, 0, 0, 9584, 10465, 983902, 74359, 12626, 9106, 0, 42642, 71235, + 64750, 9390, 0, 41797, 0, 0, 265, 41795, 64666, 74628, 43530, 2752, + 127365, 128459, 983493, 59, 983671, 983593, 11149, 78074, 77873, 41810, + 0, 7010, 0, 41809, 41495, 119364, 5877, 42252, 42213, 8009, 3305, 43033, + 511, 92700, 43848, 13127, 120067, 983946, 74397, 120235, 917977, 65915, + 1400, 41812, 10685, 194870, 2103, 10387, 4453, 43276, 917783, 11169, 0, + 6481, 41213, 0, 0, 129133, 129050, 41983, 74198, 6617, 9116, 119654, + 92995, 462, 68110, 10493, 917976, 8129, 92994, 128365, 74471, 6644, + 11658, 0, 128245, 3452, 11906, 9581, 1385, 3098, 0, 119013, 43340, 11123, + 41033, 6493, 42626, 0, 129051, 11426, 77887, 1681, 118789, 1204, 3755, + 64661, 7235, 10170, 3966, 8911, 0, 41841, 43338, 0, 0, 5726, 64915, + 42175, 983913, 0, 41497, 65044, 120109, 2851, 43017, 983589, 0, 4373, + 78058, 0, 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 917789, + 64922, 0, 8190, 12083, 0, 983930, 6506, 64312, 74374, 2368, 0, 4419, + 983847, 119125, 3439, 1825, 1192, 120106, 8891, 3080, 120228, 2347, 5430, + 0, 8990, 2848, 92981, 128223, 73942, 249, 0, 0, 0, 120658, 119324, + 128712, 8883, 119860, 728, 11173, 995, 0, 0, 64826, 124931, 917798, + 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 67714, 12112, 67272, + 67265, 67273, 67274, 12335, 120104, 68019, 3443, 3129, 67267, 2102, + 65445, 78258, 64891, 0, 7725, 65108, 11120, 9205, 8624, 69246, 12446, + 43295, 128519, 41894, 0, 6277, 41672, 41893, 10010, 127381, 3540, 128649, + 835, 71340, 69816, 119854, 74408, 0, 67108, 5426, 4258, 983231, 0, 5424, + 128127, 8283, 127978, 5434, 125004, 0, 19917, 11408, 0, 11947, 128330, + 1404, 3095, 11432, 128307, 3464, 6486, 4819, 128233, 0, 570, 8095, 3672, + 119864, 1498, 67866, 0, 128539, 431, 125062, 0, 128182, 128096, 68167, + 983663, 13096, 128643, 0, 43408, 9516, 128538, 5268, 42230, 42220, 0, + 4450, 120511, 11547, 43417, 128542, 356, 3477, 227, 10488, 68203, 382, + 11418, 0, 5878, 0, 0, 0, 0, 6484, 2541, 66039, 113777, 78718, 92723, + 3549, 195067, 9110, 119665, 2743, 0, 43290, 128585, 9097, 0, 43015, 8782, + 0, 776, 2524, 42707, 8573, 0, 126494, 0, 71102, 42694, 64944, 8952, 3856, + 118818, 125111, 5872, 6495, 129125, 0, 0, 92543, 67173, 67172, 12849, + 3953, 1897, 93071, 65094, 11994, 4339, 74556, 92654, 67843, 0, 0, 119087, + 68473, 74104, 5228, 119835, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, + 917553, 1162, 917847, 2671, 128567, 0, 92632, 92631, 118865, 4553, 73811, + 0, 195005, 118928, 0, 19921, 74331, 11424, 195006, 4567, 41891, 0, + 983788, 55249, 4820, 65239, 194662, 0, 194665, 43042, 119212, 1377, + 12869, 4897, 42821, 9250, 917558, 4438, 64385, 0, 1753, 11331, 6147, + 194941, 43282, 8833, 69998, 0, 6504, 78408, 126979, 10719, 128469, 1898, + 1413, 42443, 0, 802, 12141, 0, 194671, 6648, 10671, 2528, 0, 64789, 9169, + 838, 70372, 120697, 844, 5014, 66297, 256, 0, 9990, 0, 42739, 917851, + 7542, 65464, 9726, 0, 6489, 10048, 74326, 78719, 66573, 0, 78724, 78712, + 11761, 194655, 118874, 41094, 0, 129172, 194893, 78403, 92689, 6196, + 6945, 93969, 127990, 67095, 120491, 11816, 126567, 5733, 2930, 78406, 0, + 41098, 92771, 41093, 0, 66626, 588, 9760, 129112, 194717, 1238, 200, + 983207, 1660, 73916, 0, 67141, 74362, 0, 92485, 124930, 0, 983706, 3394, + 194894, 120668, 0, 69996, 127358, 66219, 72425, 43284, 127236, 7817, + 1841, 11055, 66835, 194979, 74607, 1669, 10776, 74534, 7701, 194980, 0, + 194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, 127518, 65324, + 914, 65323, 8071, 3538, 0, 2287, 65328, 92441, 74367, 7614, 0, 11819, + 71908, 12009, 12399, 0, 67852, 65537, 0, 10841, 43430, 5301, 0, 92618, + 5734, 8960, 0, 70123, 65317, 77880, 0, 5876, 70374, 12304, 0, 0, 65315, + 92670, 128511, 71862, 0, 0, 119621, 11114, 71909, 12447, 64486, 127374, + 126562, 983129, 0, 0, 983802, 42767, 10915, 0, 12007, 43695, 120520, + 11975, 194878, 0, 92604, 2555, 8629, 128640, 41133, 41872, 43706, 4496, + 194879, 128065, 120241, 0, 0, 0, 983553, 64730, 70041, 66714, 68222, 0, + 70076, 65596, 92306, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 78191, + 11157, 74386, 0, 8233, 12820, 0, 6683, 194876, 3442, 12144, 2841, 12543, + 0, 1473, 42820, 64329, 127832, 0, 68642, 6488, 357, 1048, 41100, 72417, + 41104, 94003, 3406, 1054, 71320, 1040, 65450, 983383, 4434, 1069, 0, + 118862, 65737, 194634, 128705, 0, 124955, 9693, 41943, 68305, 41931, + 41759, 12757, 4353, 983351, 1059, 9790, 8995, 119974, 917770, 65937, + 78572, 41758, 10646, 0, 118833, 92372, 70424, 74830, 78569, 12743, + 983689, 6480, 917761, 41779, 42580, 66601, 12207, 77895, 6335, 66602, + 11312, 64807, 92962, 69989, 41767, 119629, 983764, 43020, 128271, 3955, + 74254, 120632, 983754, 917861, 70187, 69975, 9770, 9246, 12230, 125047, + 0, 78580, 10448, 41783, 41786, 127093, 12797, 2755, 64571, 78578, 194927, + 4857, 983577, 4428, 12794, 73755, 128061, 78574, 0, 11116, 43842, 5747, + 78825, 70471, 7978, 41092, 74571, 0, 11924, 43812, 42144, 65015, 0, 563, + 0, 983691, 12798, 11271, 57, 92717, 983239, 917860, 119043, 0, 94051, + 43137, 694, 0, 9876, 0, 119168, 0, 70392, 64537, 0, 277, 74385, 7229, + 12761, 0, 74466, 13025, 64811, 8757, 78824, 78188, 1574, 7381, 0, 2525, + 4852, 5749, 68465, 13027, 42824, 120574, 1039, 7151, 10155, 5745, 188, + 41858, 11592, 129156, 69725, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, + 2786, 93028, 4856, 8051, 92500, 119609, 71327, 9644, 0, 125009, 128873, + 194916, 120732, 66710, 118834, 983359, 73906, 67409, 127114, 0, 10234, + 5843, 11939, 70346, 42157, 0, 3157, 194918, 68393, 0, 3504, 119178, 0, + 10822, 5149, 66029, 10226, 65142, 128025, 3594, 42424, 124993, 40, 12657, + 983665, 0, 386, 0, 8834, 0, 12815, 43574, 128407, 73907, 0, 70113, 7220, + 11839, 124984, 74316, 0, 65322, 4304, 74503, 8160, 74314, 194753, 0, 0, + 128526, 1348, 92349, 78597, 126539, 13303, 70406, 92392, 128474, 7599, + 1278, 43616, 13269, 127805, 127110, 74387, 78179, 78598, 74492, 6097, + 7568, 8780, 4982, 127464, 74501, 194763, 78592, 194762, 2672, 3735, + 127470, 13138, 42266, 9484, 10724, 41202, 71364, 128370, 43742, 128373, + 9487, 119959, 92913, 3842, 71911, 78668, 12442, 6193, 9791, 119344, 0, + 42516, 7228, 7559, 74803, 78468, 7873, 11399, 119219, 194691, 70006, + 194690, 127537, 3604, 120683, 119188, 128877, 78540, 78541, 42507, 1962, + 43305, 78476, 42505, 11660, 0, 2072, 92312, 6995, 74173, 5437, 74174, + 10669, 8702, 7964, 92352, 983776, 199, 194843, 4105, 194845, 194699, + 194847, 194710, 119875, 13148, 7560, 78479, 9226, 78478, 195070, 6472, + 65814, 71919, 0, 4724, 128491, 195041, 9191, 0, 64432, 983817, 113680, + 119190, 10196, 7886, 0, 6585, 0, 6680, 195042, 0, 71872, 6679, 74412, + 92251, 194866, 74421, 11382, 128254, 43862, 78591, 113733, 194833, 194832, 6681, 127482, 12693, 194836, 42727, 78196, 128252, 78195, 65442, - 119610, 69733, 9989, 43248, 66248, 194816, 0, 11321, 128845, 194820, - 194819, 5297, 7042, 13284, 6112, 7968, 194825, 73927, 92444, 194736, - 65746, 127476, 69889, 74389, 128696, 4342, 42839, 194831, 1677, 0, 0, + 119610, 69733, 9989, 43248, 66248, 194816, 0, 11321, 128845, 120809, + 194819, 5297, 7042, 13284, 6112, 7968, 93010, 73927, 92444, 127336, + 65746, 118796, 69889, 74389, 128696, 4342, 42839, 128979, 1677, 0, 0, 126590, 917855, 11091, 11011, 2719, 0, 0, 119595, 10160, 0, 0, 7585, - 65169, 2052, 4308, 92174, 43000, 7505, 543, 64916, 64736, 0, 0, 64655, 0, - 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 127170, 0, 983625, 0, - 0, 12994, 92728, 10828, 983943, 6228, 4307, 3482, 128527, 0, 0, 0, 506, - 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 983680, 8841, 0, 516, - 93974, 2063, 119051, 34, 128850, 120186, 11504, 1612, 74333, 120182, - 11827, 74308, 12001, 120178, 10242, 64564, 120179, 67986, 6584, 7749, - 11037, 0, 1758, 127092, 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, 983849, 0, 126484, 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, 74411, 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, 126523, 94042, 983950, 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, 983901, 74203, 64718, 11507, 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, 94061, 120212, - 120213, 120214, 1872, 66508, 120467, 41079, 10748, 5502, 119330, 4452, 0, - 983771, 92526, 4511, 0, 983877, 64678, 11425, 0, 43245, 1231, 194783, - 69903, 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, 43749, 10756, 64047, 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, 983266, 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, - 983232, 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, 983627, 68218, 55274, 2008, 64031, 64030, 294, - 41874, 0, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, 194844, - 0, 4351, 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, 983925, 0, 2552, 41546, 60, 68394, 8649, - 41549, 78496, 983327, 0, 6682, 0, 78679, 64710, 41547, 983630, 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, 983646, 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, + 65169, 2052, 4308, 92174, 43000, 7505, 543, 64916, 64736, 118835, 0, + 64655, 0, 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 127170, 0, + 983625, 92550, 0, 12994, 92728, 10828, 74378, 6228, 4307, 3482, 128527, + 0, 72389, 0, 506, 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, + 983680, 8841, 0, 516, 93974, 2063, 119051, 34, 128850, 120186, 11504, + 1612, 74333, 120182, 11827, 67165, 12001, 120178, 10242, 64564, 120179, + 67986, 6584, 7749, 11037, 128743, 1758, 119074, 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, 71871, 11080, 74554, 64000, 5591, 1239, 127199, + 11313, 194803, 3403, 0, 120271, 64364, 92269, 127904, 72431, 8998, 12988, + 119983, 9152, 983849, 0, 126484, 67589, 41850, 64290, 3433, 92393, 12615, + 1594, 42192, 6914, 66392, 0, 119569, 74565, 41353, 67602, 67611, 4337, 0, + 127296, 918, 65035, 41351, 7681, 194900, 42577, 41393, 12668, 72395, + 2477, 127285, 0, 127301, 0, 67604, 67683, 127235, 573, 127282, 120543, + 11417, 194886, 119814, 119309, 67599, 0, 72410, 67607, 11482, 0, 3981, + 3357, 0, 42223, 4207, 1288, 78503, 78839, 67728, 78837, 11589, 42195, + 74477, 119997, 127263, 64602, 67618, 92539, 0, 42788, 68416, 64480, + 194875, 8423, 3348, 448, 66907, 9717, 119311, 0, 997, 0, 0, 92577, 0, + 11440, 11379, 42000, 13139, 42221, 65013, 126999, 127760, 72390, 0, + 119228, 12035, 0, 2818, 0, 74411, 73793, 0, 4172, 71252, 119992, 8373, + 10873, 12197, 125074, 195014, 92265, 69706, 128540, 6834, 127251, 128110, + 194865, 126982, 74563, 64828, 11419, 194868, 766, 1257, 194598, 118845, + 11381, 3265, 66617, 3274, 126629, 126523, 94042, 983950, 74522, 41989, 0, + 0, 113769, 3263, 0, 65672, 69243, 3270, 64539, 11489, 0, 0, 0, 0, 9505, + 65518, 128498, 756, 194605, 0, 0, 0, 7261, 92547, 186, 0, 119156, 5770, + 13179, 65830, 12612, 12949, 64856, 12800, 983901, 74203, 64718, 11507, 0, + 92434, 74626, 0, 11578, 0, 119296, 0, 0, 125101, 0, 70083, 9254, 66877, + 1794, 68310, 64521, 5624, 120220, 120221, 119958, 120223, 3617, 66636, + 64886, 94061, 68659, 120213, 120214, 1872, 66508, 120467, 41079, 10748, + 5502, 119330, 4452, 128088, 983771, 92526, 4511, 0, 983877, 64678, 11425, + 0, 43245, 1231, 92390, 69903, 0, 9003, 8192, 0, 5305, 9653, 10616, 8694, + 9546, 0, 0, 70421, 120200, 65205, 120202, 64063, 9878, 74780, 119626, + 78202, 64058, 8799, 42131, 128662, 64062, 1028, 64060, 64059, 837, 10567, + 72384, 43103, 0, 120754, 11427, 2902, 64043, 64042, 43749, 10756, 64047, + 42606, 64045, 64044, 43979, 10076, 64040, 43060, 194942, 1034, 3392, + 127771, 43091, 64033, 64032, 42735, 43498, 64037, 64036, 64035, 4291, + 129157, 64015, 64014, 64681, 194930, 127142, 78145, 71898, 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, 983266, 0, 4767, 9343, 64049, 64048, 120034, 1133, 64053, + 64052, 43453, 64050, 41340, 118975, 194835, 10005, 12329, 41333, 0, 8489, + 1942, 0, 194834, 42520, 65510, 125044, 68291, 10760, 64023, 64022, 64021, + 6582, 43670, 127798, 64025, 9167, 42151, 78244, 983232, 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, + 983627, 68218, 55274, 2008, 64031, 64030, 294, 41874, 0, 64790, 65929, 0, + 129063, 0, 0, 64028, 8146, 64026, 41788, 194844, 0, 4351, 6343, 43247, + 119888, 70153, 119886, 119891, 72387, 119889, 11433, 119895, 119896, 0, + 7801, 65578, 194839, 12915, 43968, 3297, 9699, 127957, 1135, 0, 128807, + 128525, 1995, 6722, 983925, 0, 2552, 41546, 60, 68394, 8649, 41549, + 78496, 72386, 0, 6682, 983917, 78679, 43833, 41547, 983630, 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, 92976, 4179, 65119, 1998, 120746, 1842, 0, 92674, 9628, + 68446, 12081, 9826, 64502, 1767, 0, 0, 120001, 120201, 983646, 124975, + 127991, 3059, 44024, 120204, 43491, 92693, 0, 0, 92452, 4100, 920, 1811, + 1355, 43189, 0, 3592, 10078, 0, 78162, 119558, 8592, 65870, 66417, 74504, + 10742, 72400, 42918, 1994, 9281, 3296, 12865, 1997, 1895, }; #define code_magic 47 diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -82,25 +82,31 @@ {-205, 0, -205, 0, 0, 9993}, {-202, 0, -202, 0, 0, 9993}, {-203, 0, -203, 0, 0, 9993}, + {42319, 0, 42319, 0, 0, 9993}, + {42315, 0, 42315, 0, 0, 9993}, {-207, 0, -207, 0, 0, 9993}, {42280, 0, 42280, 0, 0, 9993}, {42308, 0, 42308, 0, 0, 9993}, {-209, 0, -209, 0, 0, 9993}, {-211, 0, -211, 0, 0, 9993}, {10743, 0, 10743, 0, 0, 9993}, + {42305, 0, 42305, 0, 0, 9993}, {10749, 0, 10749, 0, 0, 9993}, {-213, 0, -213, 0, 0, 9993}, {-214, 0, -214, 0, 0, 9993}, {10727, 0, 10727, 0, 0, 9993}, {-218, 0, -218, 0, 0, 9993}, + {42282, 0, 42282, 0, 0, 9993}, {-69, 0, -69, 0, 0, 9993}, {-217, 0, -217, 0, 0, 9993}, {-71, 0, -71, 0, 0, 9993}, {-219, 0, -219, 0, 0, 9993}, + {42258, 0, 42258, 0, 0, 9993}, {0, 0, 0, 0, 0, 14089}, {0, 0, 0, 0, 0, 5889}, {16777244, 17825818, 16777244, 0, 0, 30216}, {0, 0, 0, 0, 0, 13321}, + {0, 116, 0, 0, 0, 10113}, {0, 38, 0, 0, 0, 10113}, {0, 37, 0, 0, 0, 10113}, {0, 64, 0, 0, 0, 10113}, @@ -122,6 +128,7 @@ {16777276, 17825850, 16777276, 0, 0, 26377}, {16777279, 17825853, 16777279, 0, 0, 26377}, {7, 0, 7, 0, 0, 9993}, + {-116, 0, -116, 0, 0, 9993}, {0, -60, 0, 0, 0, 10113}, {16777282, 17825856, 16777282, 0, 0, 26377}, {0, -7, 0, 0, 0, 10113}, @@ -280,6 +287,11 @@ {0, -35332, 0, 0, 0, 10113}, {0, -42280, 0, 0, 0, 10113}, {0, -42308, 0, 0, 0, 10113}, + {0, -42319, 0, 0, 0, 10113}, + {0, -42315, 0, 0, 0, 10113}, + {0, -42305, 0, 0, 0, 10113}, + {0, -42258, 0, 0, 0, 10113}, + {0, -42282, 0, 0, 0, 10113}, {33555038, 18874971, 33555040, 0, 0, 26377}, {33555045, 18874978, 33555047, 0, 0, 26377}, {33555052, 18874985, 33555054, 0, 0, 26377}, @@ -296,6 +308,7 @@ {0, 0, 0, 0, 0, 5633}, {0, 40, 0, 0, 0, 10113}, {-40, 0, -40, 0, 0, 9993}, + {0, 0, 0, 0, 0, 9344}, }; /* extended case mappings */ @@ -1029,405 +1042,512 @@ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 129, 130, 131, 132, 133, 134, 34, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 71, 145, 146, 147, 148, 149, 71, 71, 71, 71, 71, 71, 150, 71, 151, 152, - 153, 71, 154, 71, 155, 71, 71, 71, 156, 71, 71, 71, 157, 158, 159, 160, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 161, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 34, 34, 34, 34, 34, 34, 162, 71, - 163, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 34, 34, 34, 34, 34, 34, 34, 34, 164, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 34, 34, 34, 34, 165, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 166, 167, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 168, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 64, 169, 170, 171, 172, 71, 173, 71, 174, 175, 176, 177, 178, - 179, 180, 181, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 182, 183, 71, 71, 184, - 185, 186, 187, 188, 71, 189, 190, 191, 192, 193, 194, 195, 196, 65, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 197, 198, - 199, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 87, 200, - 34, 201, 202, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 145, 146, 147, 148, 149, 150, 151, 145, 34, 34, 152, 145, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 145, 145, 145, 162, 145, 145, 145, 163, + 164, 165, 166, 167, 168, 169, 145, 145, 170, 145, 171, 172, 173, 145, + 145, 145, 174, 145, 145, 145, 175, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 34, 34, 34, 34, 34, 34, 34, 176, 177, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 34, 34, 34, 34, 34, 34, 34, 34, 178, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 34, 34, 34, 34, 179, 180, 181, 182, 145, 145, 145, 145, + 145, 145, 183, 184, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 185, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 186, 187, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 64, + 188, 189, 190, 191, 145, 192, 145, 193, 194, 195, 196, 197, 198, 199, + 200, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 34, 201, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 202, 203, 145, 145, 204, 205, 206, 207, 208, 145, 209, 210, 64, + 211, 212, 213, 214, 215, 216, 217, 218, 219, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 220, 221, 222, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 87, 223, 34, 224, 225, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 203, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 204, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 205, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 226, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 227, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 228, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 206, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 229, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 207, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 208, 34, 209, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 34, 203, 34, 34, 209, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 210, 71, 211, 212, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 127, 127, 127, 127, + 34, 34, 34, 34, 230, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 231, 34, 232, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 34, 226, 34, 34, 232, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 233, 145, 234, 235, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, @@ -1463,8 +1583,8 @@ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 236, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 213, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, @@ -1500,7 +1620,7 @@ 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 213, + 127, 127, 127, 127, 236, }; static unsigned short index2[] = { @@ -1535,106 +1655,107 @@ 31, 30, 31, 30, 31, 30, 31, 30, 31, 64, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 20, 20, 20, 20, 20, 65, 30, 31, 66, 67, 68, 68, 30, 31, 69, 70, 71, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 72, 73, 74, 75, 76, 20, 77, 77, 20, 78, 20, 79, 20, 20, 20, - 20, 77, 20, 20, 80, 20, 81, 82, 20, 83, 84, 20, 85, 20, 20, 20, 84, 20, - 86, 87, 20, 20, 88, 20, 20, 20, 20, 20, 20, 20, 89, 20, 20, 90, 20, 20, - 90, 20, 20, 20, 20, 90, 91, 92, 92, 93, 20, 20, 20, 20, 20, 94, 20, 55, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 96, 96, 96, 96, 96, 96, 96, 95, 95, 6, 6, 6, 6, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 95, 95, - 95, 95, 95, 6, 6, 6, 6, 6, 6, 6, 96, 6, 96, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 31, 30, 31, 72, 73, 74, 75, 76, 20, 77, 77, 20, 78, 20, 79, 80, 20, 20, + 20, 77, 81, 20, 82, 20, 83, 84, 20, 85, 86, 20, 87, 88, 20, 20, 86, 20, + 89, 90, 20, 20, 91, 20, 20, 20, 20, 20, 20, 20, 92, 20, 20, 93, 20, 20, + 93, 20, 20, 20, 94, 93, 95, 96, 96, 97, 20, 20, 20, 20, 20, 98, 20, 55, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 99, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 101, 101, 101, 101, 101, 101, 101, 100, 100, 6, 6, 6, 6, 101, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 100, 100, 100, 100, 100, 6, 6, 6, 6, 6, 6, 6, + 101, 6, 101, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 97, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 102, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 31, 30, 31, 96, 6, 30, 31, 0, 0, - 98, 50, 50, 50, 5, 0, 0, 0, 0, 0, 6, 6, 99, 25, 100, 100, 100, 0, 101, 0, - 102, 102, 103, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 104, 105, 105, 105, - 106, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 107, 19, 19, 19, 19, 19, 19, 19, 19, 19, 108, 109, 109, 110, 111, 112, - 113, 113, 113, 114, 115, 116, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 117, 118, 119, 20, - 120, 121, 5, 30, 31, 122, 30, 31, 20, 64, 64, 64, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, 17, 17, 17, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 30, 31, 30, 31, 101, 6, 30, 31, 0, 0, 103, 50, 50, 50, 5, 104, 0, + 0, 0, 0, 6, 6, 105, 25, 106, 106, 106, 0, 107, 0, 108, 108, 109, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 110, 111, 111, 111, 112, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 113, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 114, 115, 115, 116, 117, 118, 119, 119, 119, 120, 121, + 122, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 123, 124, 125, 126, 127, 128, 5, 30, 31, 129, + 30, 31, 20, 64, 64, 64, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 5, 25, 25, 25, 25, 25, 6, 6, 30, 31, 30, 31, + 17, 17, 17, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 5, + 25, 25, 25, 25, 25, 6, 6, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 125, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 126, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 132, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 133, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 0, 96, 5, 5, 5, 5, 5, 5, - 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 0, 5, 5, 0, 0, 0, - 0, 5, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 0, 0, 101, 5, 5, 5, 5, 5, 5, 0, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 136, 0, 5, 5, 0, 0, 5, 5, 5, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 25, 5, 25, 25, 5, 25, 25, - 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 55, 55, 55, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, - 21, 21, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 5, 21, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 55, 55, 25, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 5, 55, 25, 25, 25, 25, 25, 25, 25, 21, 5, 25, 25, 25, - 25, 25, 25, 96, 96, 25, 25, 5, 25, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 55, 55, 55, 5, 5, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 21, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 5, 25, 5, 25, 25, 5, 25, 25, 5, 25, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, + 55, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, + 21, 0, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 101, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 96, 96, 5, 5, 5, 5, 96, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 96, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 96, 25, 25, 25, 96, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 5, 5, 5, 5, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 5, 55, 25, 25, 25, 25, 25, 25, 25, 21, 5, 25, 25, 25, 25, 25, 25, + 101, 101, 25, 25, 5, 25, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 55, 55, 55, 5, 5, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 21, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, - 25, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 101, 101, 5, 5, 5, 5, 101, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 25, 25, 25, 25, 101, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 101, 25, 25, 25, 101, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 55, 18, 18, 18, - 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 18, 18, 25, 18, 18, 55, 25, 25, - 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 96, 55, 55, 55, 55, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 55, 18, 18, 18, 25, + 25, 25, 25, 25, 25, 25, 25, 18, 18, 18, 18, 25, 18, 18, 55, 25, 25, 25, + 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 5, 5, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 101, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 0, 55, 55, 55, 55, 0, 0, 25, 55, 18, 18, 18, 25, 25, 25, 25, 0, @@ -1666,20 +1787,20 @@ 18, 18, 25, 18, 18, 0, 0, 0, 18, 18, 18, 0, 18, 18, 18, 25, 0, 0, 55, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 18, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 55, 55, 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, 0, - 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 0, 0, 0, 0, 0, 0, - 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, - 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 5, 0, 0, 18, 18, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, 18, - 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, + 0, 25, 18, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 55, 25, 25, 25, 18, 18, 18, 18, 0, 25, 25, 25, + 0, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 55, 55, 0, 0, 0, 0, 0, + 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, + 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 5, 0, 25, 18, 18, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 25, + 18, 18, 18, 18, 18, 0, 25, 18, 18, 0, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 55, 0, 55, 55, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, + 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 18, 18, 18, 25, 25, 25, 25, 0, 18, 18, 18, 0, @@ -1690,79 +1811,79 @@ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, 0, 0, 0, 0, 18, 18, 18, 25, - 25, 25, 0, 25, 0, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 25, 25, 0, 25, 0, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 18, 18, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 137, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 101, + 25, 25, 25, 25, 25, 25, 25, 25, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 0, 55, 0, 0, 55, 55, + 0, 55, 0, 0, 55, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, + 55, 55, 0, 55, 55, 55, 0, 55, 0, 55, 0, 0, 55, 55, 0, 55, 55, 55, 55, 25, + 55, 137, 25, 25, 25, 25, 25, 25, 0, 25, 25, 55, 0, 0, 55, 55, 55, 55, 55, + 0, 101, 0, 25, 25, 25, 25, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 5, 5, 5, 5, 5, 5, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 5, 25, 5, 25, 5, 25, 5, 5, 5, 5, 18, 18, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 18, 25, 25, 25, 25, 25, 5, 25, 25, 55, 55, 55, 55, 55, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, + 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, 25, 25, 25, + 18, 25, 25, 25, 25, 25, 25, 18, 25, 25, 18, 18, 25, 25, 55, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 18, 18, + 25, 25, 55, 55, 55, 55, 25, 25, 25, 55, 18, 18, 18, 55, 55, 18, 18, 18, + 18, 18, 18, 18, 55, 55, 55, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 25, 18, 18, 25, 25, 18, 18, 18, 18, 18, 18, 25, + 55, 18, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 18, 18, 25, 5, 5, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 0, 138, 0, 0, 0, 0, 0, 138, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 5, 101, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 130, 25, 25, - 25, 25, 25, 25, 25, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 96, 25, 25, - 25, 25, 25, 25, 25, 25, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 0, 55, 0, 0, 55, 55, 0, 55, - 0, 0, 55, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 0, 55, 0, 55, 0, 0, 55, 55, 0, 55, 55, 55, 55, 25, 55, - 130, 25, 25, 25, 25, 25, 25, 0, 25, 25, 55, 0, 0, 55, 55, 55, 55, 55, 0, - 96, 0, 25, 25, 25, 25, 25, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 5, 5, 5, 5, 5, 5, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 5, 25, 5, 25, 5, 25, 5, 5, 5, 5, 18, 18, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 18, 25, 25, 25, 25, 25, 5, 25, 25, 55, 55, 55, 55, 55, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 0, 5, 5, 5, 5, 5, 5, 5, 5, 25, 5, 5, 5, - 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, 25, 25, 25, 18, - 25, 25, 25, 25, 25, 25, 18, 25, 25, 18, 18, 25, 25, 55, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 18, 18, 25, - 25, 55, 55, 55, 55, 25, 25, 25, 55, 18, 18, 18, 55, 55, 18, 18, 18, 18, - 18, 18, 18, 55, 55, 55, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 25, 18, 18, 25, 25, 18, 18, 18, 18, 18, 18, 25, 55, - 18, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 18, 18, 25, 5, 5, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 0, 131, 0, 0, 0, 0, 0, 131, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 5, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, - 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 25, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 132, 133, 134, 135, 136, 137, 138, 139, 140, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, @@ -1786,28 +1907,28 @@ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, - 25, 25, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, - 55, 55, 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 25, 25, 25, - 25, 25, 25, 25, 18, 18, 18, 18, 18, 18, 18, 18, 25, 18, 18, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 96, 5, 5, 5, 5, 55, 25, 0, 0, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 25, 25, 25, 21, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 96, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 148, 148, 148, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 25, 25, 25, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, + 55, 55, 55, 0, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 25, 25, + 25, 25, 25, 25, 25, 18, 18, 18, 18, 18, 18, 18, 18, 25, 18, 18, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 101, 5, 5, 5, 5, 55, 25, 0, + 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 25, 25, 25, 21, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 101, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, @@ -1815,1089 +1936,1237 @@ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, 25, 25, - 18, 18, 18, 18, 25, 25, 18, 18, 18, 0, 0, 0, 0, 18, 18, 25, 18, 18, 18, - 18, 18, 18, 25, 25, 25, 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, + 25, 18, 18, 18, 18, 25, 25, 18, 18, 18, 0, 0, 0, 0, 18, 18, 25, 18, 18, + 18, 18, 18, 18, 25, 25, 25, 0, 0, 0, 0, 5, 0, 0, 0, 5, 5, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 55, 55, 55, 55, 55, 55, 55, 18, 18, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 139, 0, 0, 0, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 25, 0, 0, 5, 5, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, + 18, 25, 25, 25, 25, 25, 25, 25, 0, 25, 18, 25, 18, 18, 25, 25, 25, 25, + 25, 25, 25, 25, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 0, 0, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 101, 5, 5, 5, 5, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, + 25, 25, 25, 25, 18, 25, 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, + 25, 25, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 25, 18, 25, 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, + 25, 25, 25, 25, 25, 18, 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 101, 101, 101, + 101, 101, 101, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 5, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, + 55, 55, 55, 55, 25, 55, 55, 55, 55, 18, 18, 25, 55, 55, 0, 25, 25, 0, 0, + 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 100, 149, 20, + 20, 20, 150, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 151, 152, 153, 154, 155, 156, 20, 20, 157, 20, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, + 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 0, 0, 159, 159, 159, + 159, 159, 159, 0, 0, 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, + 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 158, 158, + 159, 159, 159, 159, 159, 159, 159, 159, 158, 158, 158, 158, 158, 158, 0, + 0, 159, 159, 159, 159, 159, 159, 0, 0, 160, 158, 161, 158, 162, 158, 163, + 158, 0, 159, 0, 159, 0, 159, 0, 159, 158, 158, 158, 158, 158, 158, 158, + 158, 159, 159, 159, 159, 159, 159, 159, 159, 164, 164, 165, 165, 165, + 165, 166, 166, 167, 167, 168, 168, 169, 169, 0, 0, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 158, 158, 218, 219, 220, 0, 221, 222, 159, 159, 223, 223, 224, + 6, 225, 6, 6, 6, 226, 227, 228, 0, 229, 230, 231, 231, 231, 231, 232, 6, + 6, 6, 158, 158, 233, 234, 0, 0, 235, 236, 159, 159, 237, 237, 0, 6, 6, 6, + 158, 158, 238, 239, 240, 125, 241, 242, 159, 159, 243, 243, 129, 6, 6, 6, + 0, 0, 244, 245, 246, 0, 247, 248, 249, 249, 250, 250, 251, 6, 6, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, + 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 252, 100, + 0, 0, 253, 254, 255, 256, 257, 258, 5, 5, 5, 5, 5, 100, 252, 26, 22, 23, + 253, 254, 255, 256, 257, 258, 5, 5, 5, 5, 5, 0, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 119, 5, 5, 5, 5, 119, 5, 5, 20, 119, 119, 119, 20, 20, 119, 119, + 119, 20, 5, 119, 5, 5, 259, 119, 119, 119, 119, 119, 5, 5, 5, 5, 5, 5, + 119, 5, 260, 5, 119, 5, 261, 262, 119, 119, 259, 20, 119, 119, 263, 119, + 20, 55, 55, 55, 55, 20, 5, 5, 20, 20, 119, 119, 5, 5, 5, 5, 5, 119, 20, + 20, 20, 20, 5, 5, 5, 5, 264, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 148, 148, 148, 30, 31, 148, 148, + 148, 148, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 253, + 254, 255, 256, 257, 258, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, + 22, 23, 253, 254, 255, 256, 257, 258, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 26, 22, 23, 253, 254, 255, 256, 257, 258, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, + 267, 267, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, + 252, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 253, 254, 255, + 256, 257, 258, 27, 252, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 26, 22, 23, 253, 254, 255, 256, 257, 258, 27, 26, 22, + 23, 253, 254, 255, 256, 257, 258, 27, 26, 22, 23, 253, 254, 255, 256, + 257, 258, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 134, 134, 134, 0, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 0, + 30, 31, 269, 270, 271, 272, 273, 30, 31, 30, 31, 30, 31, 274, 275, 276, + 277, 20, 30, 31, 20, 30, 31, 20, 20, 20, 20, 20, 100, 100, 278, 278, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, + 25, 25, 25, 30, 31, 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, 5, 5, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 279, 0, 279, 0, 0, 0, 0, 0, 279, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 0, 0, 0, 0, 0, 101, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, + 55, 55, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 280, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 5, + 5, 5, 5, 101, 55, 148, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 148, 148, 148, 148, 148, 148, 148, 148, 148, 25, + 25, 25, 25, 18, 18, 5, 101, 101, 101, 101, 101, 5, 5, 148, 148, 148, 101, + 55, 5, 5, 5, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 25, 25, 6, 6, 101, 101, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 101, 101, 101, 55, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 5, 27, 27, 27, 27, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, + 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 281, + 55, 55, 281, 55, 55, 55, 281, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, + 55, 55, 55, 55, 281, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 281, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 281, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 281, 55, 281, 281, 281, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 281, 281, 281, 281, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 281, 281, 281, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, + 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 101, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 101, 101, + 101, 101, 101, 101, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 101, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 55, 25, 6, 6, 6, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 101, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 100, 100, 0, 25, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 101, 101, 101, 101, 101, 101, 101, 101, 101, 6, 6, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 100, 20, 20, 20, 20, 20, 20, 20, 20, 30, 31, 30, 31, 282, 30, 31, 30, + 31, 30, 31, 30, 31, 30, 31, 101, 6, 6, 30, 31, 283, 20, 0, 30, 31, 30, + 31, 20, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 31, 30, 31, 30, 31, 284, 285, 286, 287, 0, 0, 288, 289, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 100, 100, 20, 55, 55, + 55, 55, 55, 55, 55, 25, 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 18, 18, 25, 25, 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, + 27, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, + 55, 55, 55, 55, 5, 5, 5, 55, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, + 25, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 25, 18, 18, 25, 25, 25, 25, 18, 18, 25, 18, 18, 18, 18, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 101, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 0, 0, 0, 0, 5, 5, 55, 55, 55, 55, 55, 25, 101, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, 25, 18, 18, + 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 25, 55, 55, 55, 55, 55, + 55, 55, 55, 25, 18, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 5, + 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 101, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55, 18, 25, 18, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 25, 25, 25, 55, 55, 25, 25, + 55, 55, 55, 55, 55, 25, 25, 55, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 101, 5, 5, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 18, 25, 25, 18, 18, 5, 5, 55, 101, 101, 18, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, + 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 6, 100, 100, 100, 100, 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, 18, 18, 25, 18, 18, 5, + 18, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 55, 55, 55, 55, 55, 55, 55, 18, 18, 0, 0, 0, 0, 0, 0, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 132, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 281, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 281, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 281, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 290, + 291, 292, 293, 294, 295, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297, + 298, 299, 300, 301, 0, 0, 0, 0, 0, 55, 25, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 0, 55, 0, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 302, 302, 302, + 302, 302, 302, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 302, 302, 5, 5, 0, + 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, + 5, 6, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 18, 5, 5, 6, 0, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, + 0, 0, 0, 302, 55, 302, 55, 302, 0, 302, 55, 302, 55, 302, 55, 302, 55, + 302, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 0, 21, 0, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 6, 5, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 6, 5, 5, 5, 5, 5, 5, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 5, 5, 5, 6, 18, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 101, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 303, 303, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, + 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 0, 0, 0, 5, 5, 5, + 6, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, + 21, 5, 5, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 0, 0, 0, + 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 27, 27, 27, 27, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 5, 0, 0, 0, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 25, 25, 18, 18, 25, 0, 0, 5, 5, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 18, 25, - 25, 25, 25, 25, 25, 25, 0, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, - 25, 25, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 0, 0, 25, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 96, 5, - 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 18, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 25, 25, 25, 25, 18, 25, - 18, 18, 18, 18, 18, 25, 18, 18, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 18, 25, 25, 25, 25, 18, 18, 25, 25, 18, 25, 18, 18, 55, 55, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, - 25, 18, 18, 18, 25, 18, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 18, 18, 18, 18, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, - 18, 25, 25, 0, 0, 0, 5, 5, 5, 5, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 96, 96, 96, 96, 96, 96, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 25, 55, 55, 55, - 55, 18, 18, 25, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 95, 142, 20, 20, 20, 143, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 144, - 145, 146, 147, 148, 149, 20, 20, 150, 20, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 151, 151, - 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, - 151, 151, 151, 151, 151, 151, 0, 0, 152, 152, 152, 152, 152, 152, 0, 0, - 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, - 152, 152, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, - 152, 152, 152, 152, 151, 151, 151, 151, 151, 151, 0, 0, 152, 152, 152, - 152, 152, 152, 0, 0, 153, 151, 154, 151, 155, 151, 156, 151, 0, 152, 0, - 152, 0, 152, 0, 152, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, - 152, 152, 152, 152, 152, 152, 157, 157, 158, 158, 158, 158, 159, 159, - 160, 160, 161, 161, 162, 162, 0, 0, 163, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 151, - 151, 211, 212, 213, 0, 214, 215, 152, 152, 216, 216, 217, 6, 218, 6, 6, - 6, 219, 220, 221, 0, 222, 223, 224, 224, 224, 224, 225, 6, 6, 6, 151, - 151, 226, 227, 0, 0, 228, 229, 152, 152, 230, 230, 0, 6, 6, 6, 151, 151, - 231, 232, 233, 119, 234, 235, 152, 152, 236, 236, 122, 6, 6, 6, 0, 0, - 237, 238, 239, 0, 240, 241, 242, 242, 243, 243, 244, 6, 6, 0, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 21, 21, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 3, 3, 21, 21, 21, 21, 21, 2, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 21, - 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 245, 95, 0, 0, - 246, 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 95, 245, 26, 22, 23, 246, - 247, 248, 249, 250, 251, 5, 5, 5, 5, 5, 0, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 6, 6, 6, 6, 25, 6, 6, 6, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 113, 5, 5, - 5, 5, 113, 5, 5, 20, 113, 113, 113, 20, 20, 113, 113, 113, 20, 5, 113, 5, - 5, 252, 113, 113, 113, 113, 113, 5, 5, 5, 5, 5, 5, 113, 5, 253, 5, 113, - 5, 254, 255, 113, 113, 252, 20, 113, 113, 256, 113, 20, 55, 55, 55, 55, - 20, 5, 5, 20, 20, 113, 113, 5, 5, 5, 5, 5, 113, 20, 20, 20, 20, 5, 5, 5, - 5, 257, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 258, 258, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, 259, - 259, 259, 259, 259, 141, 141, 141, 30, 31, 141, 141, 141, 141, 27, 0, 0, - 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 148, 55, 55, 55, 55, 55, 55, 55, 55, 148, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 5, 148, 148, + 148, 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 55, 55, 0, 0, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 27, 27, 27, 27, + 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 27, 27, 27, 27, 27, 27, 27, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 27, 27, 27, 27, 27, 27, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 0, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 25, 25, 25, 0, 25, 25, 0, 0, 0, 0, 0, 25, 25, 25, 25, 55, 55, 55, 55, + 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 25, + 25, 0, 0, 0, 0, 25, 26, 22, 23, 253, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 27, 27, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 0, 0, 0, 0, 27, 27, + 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 253, 254, + 255, 256, 257, 258, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 18, 25, 18, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 26, + 22, 23, 253, 254, 255, 256, 257, 258, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 25, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, + 18, 18, 25, 25, 25, 25, 18, 18, 25, 25, 5, 5, 21, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, + 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, + 25, 25, 25, 25, 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 5, 5, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, + 18, 55, 55, 55, 55, 5, 5, 5, 5, 0, 0, 0, 0, 5, 0, 0, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 55, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 18, 18, 25, + 18, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, 18, + 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 25, 18, 18, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, + 55, 0, 55, 55, 0, 55, 55, 55, 55, 55, 0, 0, 25, 55, 18, 18, 25, 18, 18, + 18, 18, 0, 0, 18, 18, 0, 0, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 0, 0, 0, 0, 55, 55, 55, 55, 55, 18, 18, 0, 0, 25, 25, 25, 25, 25, 25, 25, + 0, 0, 0, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, + 18, 25, 18, 18, 18, 18, 25, 25, 18, 25, 25, 55, 55, 5, 55, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, + 25, 25, 25, 25, 0, 0, 18, 18, 18, 18, 25, 25, 18, 25, 25, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 25, 18, 25, 25, + 5, 5, 5, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, 25, 18, 25, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 0, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 25, 25, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, + 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 101, 101, 101, 101, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 27, 27, 27, 27, + 27, 27, 27, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, + 25, 25, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, 101, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, + 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 5, 25, 25, 5, 21, + 21, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, 5, 5, 5, 18, + 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, + 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, + 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 246, 247, 248, 249, 250, - 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 246, 247, - 248, 249, 250, 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, - 23, 246, 247, 248, 249, 250, 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, - 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 245, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 246, 247, 248, 249, 250, 251, 27, - 245, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 26, - 22, 23, 246, 247, 248, 249, 250, 251, 27, 26, 22, 23, 246, 247, 248, 249, - 250, 251, 27, 26, 22, 23, 246, 247, 248, 249, 250, 251, 27, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 30, 31, 262, 263, - 264, 265, 266, 30, 31, 30, 31, 30, 31, 267, 268, 269, 270, 20, 30, 31, - 20, 30, 31, 20, 20, 20, 20, 20, 95, 95, 271, 271, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 20, 5, 5, 5, 5, 5, 5, 30, 31, 30, 31, 25, 25, 25, 30, 31, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, 5, 5, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, 272, - 272, 272, 272, 0, 272, 0, 0, 0, 0, 0, 272, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, - 0, 96, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, - 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 273, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 20, 20, 20, 20, 20, 20, 20, 0, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 119, 0, 119, 119, 0, 0, 119, 0, 0, 119, 119, 0, 0, + 119, 119, 119, 119, 0, 119, 119, 119, 119, 119, 119, 119, 119, 20, 20, + 20, 20, 0, 20, 0, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, 119, 0, 119, 119, 119, 119, + 0, 0, 119, 119, 119, 119, 119, 119, 119, 119, 0, 119, 119, 119, 119, 119, + 119, 119, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, 119, 0, 119, 119, 119, + 119, 0, 119, 119, 119, 119, 119, 0, 119, 0, 0, 0, 119, 119, 119, 119, + 119, 119, 119, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 0, 0, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 5, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, + 20, 20, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 5, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, + 20, 20, 20, 20, 119, 20, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, 0, 0, 0, 0, 0, 0, 55, 0, 0, + 0, 0, 55, 0, 55, 0, 55, 0, 55, 55, 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, + 0, 55, 0, 55, 0, 55, 0, 55, 55, 0, 55, 0, 0, 55, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 0, 55, 55, + 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, 26, 22, 23, + 253, 254, 255, 256, 257, 258, 27, 27, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 5, 5, 5, 5, 5, 5, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 5, 5, 0, 0, + 0, 0, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, + 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 5, 5, 5, 5, 96, 55, 141, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 25, 25, 25, 25, 18, 18, 5, 96, - 96, 96, 96, 96, 5, 5, 141, 141, 141, 96, 55, 5, 5, 5, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 25, 25, 6, 6, 96, 96, 55, - 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 5, 96, 96, 96, 55, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 5, 5, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 5, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 55, 55, 55, - 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 274, 55, 55, 274, 55, 55, 55, 274, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 274, 55, 274, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 274, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, - 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 274, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 274, 274, 274, 55, 55, - 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 274, 274, 274, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, - 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 274, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 274, 274, 274, 55, 274, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 274, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, - 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 5, 5, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 96, 96, 96, 96, 96, 96, 5, 5, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 96, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 55, 25, 6, 6, 6, 5, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 5, 96, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 0, 0, 0, 0, 0, 0, 25, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 25, 25, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 96, 96, 96, 96, 96, 96, 96, 96, 96, 6, 6, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 20, 20, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 95, 20, 20, 20, 20, 20, 20, 20, 20, 30, 31, 30, 31, 275, 30, 31, - 30, 31, 30, 31, 30, 31, 30, 31, 96, 6, 6, 30, 31, 276, 20, 0, 30, 31, 30, - 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, - 30, 31, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 20, 55, 55, 55, 55, 55, 55, 55, 25, - 55, 55, 55, 25, 55, 55, 55, 55, 25, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, 25, - 18, 5, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 5, 5, 5, 5, 0, 0, 0, - 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 7, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55, - 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 5, 5, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 18, 18, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 25, - 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 18, 25, - 25, 25, 25, 18, 18, 25, 18, 18, 18, 18, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 96, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 18, 18, 25, - 25, 18, 18, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 25, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 18, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 0, 0, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 96, 55, 55, 55, 55, 55, 55, 5, 5, 5, 55, 18, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 55, 25, 25, 25, 55, 55, - 25, 25, 55, 55, 55, 55, 55, 25, 25, 55, 25, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 96, 5, 5, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 25, 25, 18, 18, 5, 5, 55, 96, 96, - 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, - 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 25, - 18, 18, 25, 18, 18, 5, 18, 25, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, - 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 274, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 278, 279, 280, 281, 282, 283, 284, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 285, 286, 287, 288, 289, 0, 0, 0, 0, 0, 55, 25, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, 55, 0, 55, 55, 0, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 290, 290, 290, 290, 290, 290, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 290, 290, 5, 5, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 25, 25, - 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 18, 18, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, - 18, 5, 5, 6, 0, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 0, 5, 5, 5, 5, 0, 0, 0, 0, 290, 55, 290, 55, 290, 0, 290, 55, 290, 55, - 290, 55, 290, 55, 290, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 0, 0, 21, 0, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, - 5, 6, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 6, 5, 5, 5, 5, 5, 5, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 6, 18, 6, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 96, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 291, 291, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, - 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, - 55, 0, 0, 0, 5, 5, 5, 6, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 21, 21, 5, 5, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 0, 5, 5, 5, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 27, 27, 27, 27, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 27, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 0, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 141, 55, 55, 55, - 55, 55, 55, 55, 55, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 5, 141, - 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, - 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 55, 55, 0, 0, 0, 55, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 5, 27, 27, 27, - 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 27, 27, 27, 27, - 27, 27, 0, 0, 0, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 5, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 55, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 25, 25, 25, 0, 25, - 25, 0, 0, 0, 0, 0, 25, 25, 25, 25, 55, 55, 55, 55, 0, 55, 55, 55, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 25, 25, 25, 0, 0, 0, 0, 25, - 26, 22, 23, 246, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 27, 27, 5, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 27, 27, - 27, 27, 27, 27, 27, 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, - 27, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 22, 23, 246, 247, 248, 249, 250, 251, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 0, 18, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 26, 22, 23, 246, 247, 248, - 249, 250, 251, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 25, 25, 18, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, - 25, 18, 18, 25, 25, 5, 5, 21, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 25, 25, 25, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, 25, - 18, 25, 25, 25, 25, 25, 25, 25, 25, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 18, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 18, 18, 18, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 18, 18, 55, 55, 55, 55, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 25, 18, 25, 18, 18, 25, 25, 25, 25, 25, - 25, 18, 25, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 25, 25, 25, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 18, 18, 25, 25, 25, - 5, 5, 5, 18, 18, 18, 18, 18, 18, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, - 25, 25, 25, 25, 25, 25, 5, 5, 25, 25, 25, 25, 25, 25, 25, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, - 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 0, 113, 113, 0, 0, 113, 0, 0, - 113, 113, 0, 0, 113, 113, 113, 113, 0, 113, 113, 113, 113, 113, 113, 113, - 113, 20, 20, 20, 20, 0, 20, 0, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 0, 113, - 113, 113, 113, 0, 0, 113, 113, 113, 113, 113, 113, 113, 113, 0, 113, 113, - 113, 113, 113, 113, 113, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 0, - 113, 113, 113, 113, 0, 113, 113, 113, 113, 113, 0, 113, 0, 0, 0, 113, - 113, 113, 113, 113, 113, 113, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, - 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 5, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, - 20, 20, 20, 20, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 5, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 113, 113, 113, 5, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 5, 20, 20, 20, 20, 20, 20, 113, 20, 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, - 55, 0, 55, 0, 0, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 55, - 55, 55, 55, 0, 55, 0, 55, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 55, 0, 55, 0, - 55, 0, 55, 55, 55, 0, 55, 55, 0, 55, 0, 0, 55, 0, 55, 0, 55, 0, 55, 0, - 55, 0, 55, 55, 0, 55, 0, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, - 55, 0, 55, 55, 55, 55, 0, 55, 55, 55, 55, 0, 55, 0, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 55, 55, 55, 0, 55, 55, 55, 55, 55, 0, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, 245, 26, 22, 23, 246, 247, 248, 249, - 250, 251, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 0, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, - 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, - 5, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 281, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 281, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 281, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, - 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 274, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, @@ -2910,13 +3179,14 @@ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, }; /* Returns the numeric value as double for Unicode characters @@ -2941,6 +3211,7 @@ case 0x0C78: case 0x0CE6: case 0x0D66: + case 0x0DE6: case 0x0E50: case 0x0ED0: case 0x0F20: @@ -2969,6 +3240,7 @@ case 0xA8D0: case 0xA900: case 0xA9D0: + case 0xA9F0: case 0xAA50: case 0xABF0: case 0xF9B2: @@ -2979,7 +3251,13 @@ case 0x110F0: case 0x11136: case 0x111D0: + case 0x112F0: + case 0x114D0: + case 0x11650: case 0x116C0: + case 0x118E0: + case 0x16A60: + case 0x16B50: case 0x1D7CE: case 0x1D7D8: case 0x1D7E2: @@ -2987,6 +3265,8 @@ case 0x1D7F6: case 0x1F100: case 0x1F101: + case 0x1F10B: + case 0x1F10C: return (double) 0.0; case 0x0031: case 0x00B9: @@ -3004,6 +3284,7 @@ case 0x0C7C: case 0x0CE7: case 0x0D67: + case 0x0DE7: case 0x0E51: case 0x0ED1: case 0x0F21: @@ -3047,6 +3328,7 @@ case 0xA8D1: case 0xA901: case 0xA9D1: + case 0xA9F1: case 0xAA51: case 0xABF1: case 0xFF11: @@ -3055,34 +3337,48 @@ case 0x10158: case 0x10159: case 0x1015A: + case 0x102E1: case 0x10320: case 0x103D1: case 0x104A1: case 0x10858: + case 0x10879: + case 0x108A7: case 0x10916: case 0x10A40: case 0x10A7D: + case 0x10A9D: + case 0x10AEB: case 0x10B58: case 0x10B78: + case 0x10BA9: case 0x10E60: case 0x11052: case 0x11067: case 0x110F1: case 0x11137: case 0x111D1: + case 0x111E1: + case 0x112F1: + case 0x114D1: + case 0x11651: case 0x116C1: + case 0x118E1: case 0x12415: case 0x1241E: case 0x1242C: case 0x12434: case 0x1244F: case 0x12458: + case 0x16A61: + case 0x16B51: case 0x1D360: case 0x1D7CF: case 0x1D7D9: case 0x1D7E3: case 0x1D7ED: case 0x1D7F7: + case 0x1E8C7: case 0x1F102: case 0x2092A: return (double) 1.0; @@ -3102,11 +3398,13 @@ case 0x10175: case 0x10176: case 0x10E7B: + case 0x12464: return (double) 1.0/2.0; case 0x2153: case 0x10E7D: case 0x1245A: case 0x1245D: + case 0x12465: return (double) 1.0/3.0; case 0x00BC: case 0x09F7: @@ -3114,9 +3412,11 @@ case 0x0D73: case 0xA830: case 0x10140: + case 0x1018B: case 0x10E7C: case 0x12460: case 0x12462: + case 0x12463: return (double) 1.0/4.0; case 0x2155: return (double) 1.0/5.0; @@ -3163,15 +3463,24 @@ case 0x10162: case 0x10163: case 0x10164: + case 0x102EA: case 0x10322: case 0x103D3: case 0x1085B: + case 0x1087E: + case 0x108AD: case 0x10917: case 0x10A44: + case 0x10A9E: + case 0x10AED: case 0x10B5C: case 0x10B7C: + case 0x10BAD: case 0x10E69: case 0x1105B: + case 0x111EA: + case 0x118EA: + case 0x16B5B: case 0x1D369: return (double) 10.0; case 0x0BF1: @@ -3186,14 +3495,20 @@ case 0x1014B: case 0x10152: case 0x1016A: + case 0x102F3: case 0x103D5: case 0x1085D: + case 0x108AF: case 0x10919: case 0x10A46: + case 0x10AEF: case 0x10B5E: case 0x10B7E: + case 0x10BAF: case 0x10E72: case 0x11064: + case 0x111F3: + case 0x16B5C: return (double) 100.0; case 0x0BF2: case 0x0D72: @@ -3212,6 +3527,7 @@ case 0x10B5F: case 0x10B7F: case 0x11065: + case 0x111F4: return (double) 1000.0; case 0x137C: case 0x2182: @@ -3220,13 +3536,20 @@ case 0x1012B: case 0x10155: case 0x1085F: + case 0x16B5D: return (double) 10000.0; case 0x2188: return (double) 100000.0; + case 0x16B5E: + return (double) 1000000.0; case 0x4EBF: case 0x5104: + case 0x16B5F: return (double) 100000000.0; + case 0x16B60: + return (double) 10000000000.0; case 0x5146: + case 0x16B61: return (double) 1000000000000.0; case 0x216A: case 0x217A: @@ -3305,6 +3628,7 @@ case 0x0C7D: case 0x0CE8: case 0x0D68: + case 0x0DE8: case 0x0E52: case 0x0ED2: case 0x0F22: @@ -3349,6 +3673,7 @@ case 0xA8D2: case 0xA902: case 0xA9D2: + case 0xA9F2: case 0xAA52: case 0xABF2: case 0xF978: @@ -3358,20 +3683,29 @@ case 0x1015C: case 0x1015D: case 0x1015E: + case 0x102E2: case 0x103D2: case 0x104A2: case 0x10859: + case 0x1087A: + case 0x108A8: case 0x1091A: case 0x10A41: case 0x10B59: case 0x10B79: + case 0x10BAA: case 0x10E61: case 0x11053: case 0x11068: case 0x110F2: case 0x11138: case 0x111D2: + case 0x111E2: + case 0x112F2: + case 0x114D2: + case 0x11652: case 0x116C2: + case 0x118E2: case 0x12400: case 0x12416: case 0x1241F: @@ -3382,12 +3716,15 @@ case 0x12450: case 0x12456: case 0x12459: + case 0x16A62: + case 0x16B52: case 0x1D361: case 0x1D7D0: case 0x1D7DA: case 0x1D7E4: case 0x1D7EE: case 0x1D7F8: + case 0x1E8C8: case 0x1F103: case 0x22390: return (double) 2.0; @@ -3396,6 +3733,7 @@ case 0x10E7E: case 0x1245B: case 0x1245E: + case 0x12466: return (double) 2.0/3.0; case 0x2156: return (double) 2.0/5.0; @@ -3409,17 +3747,26 @@ case 0x5344: case 0x5EFF: case 0x10111: + case 0x102EB: case 0x103D4: case 0x1085C: + case 0x1087F: + case 0x108AE: case 0x10918: case 0x10A45: + case 0x10A9F: + case 0x10AEE: case 0x10B5D: case 0x10B7D: + case 0x10BAE: case 0x10E6A: case 0x1105C: + case 0x111EB: + case 0x118EB: case 0x1D36A: return (double) 20.0; case 0x1011A: + case 0x102F4: case 0x10E73: return (double) 200.0; case 0x10123: @@ -3462,6 +3809,7 @@ case 0x0C7E: case 0x0CE9: case 0x0D69: + case 0x0DE9: case 0x0E53: case 0x0ED3: case 0x0F23: @@ -3505,24 +3853,34 @@ case 0xA8D3: case 0xA903: case 0xA9D3: + case 0xA9F3: case 0xAA53: case 0xABF3: case 0xF96B: case 0xFF13: case 0x10109: + case 0x102E3: case 0x104A3: case 0x1085A: + case 0x1087B: + case 0x108A9: case 0x1091B: case 0x10A42: case 0x10B5A: case 0x10B7A: + case 0x10BAB: case 0x10E62: case 0x11054: case 0x11069: case 0x110F3: case 0x11139: case 0x111D3: + case 0x111E3: + case 0x112F3: + case 0x114D3: + case 0x11653: case 0x116C3: + case 0x118E3: case 0x12401: case 0x12408: case 0x12417: @@ -3538,12 +3896,15 @@ case 0x1244B: case 0x12451: case 0x12457: + case 0x16A63: + case 0x16B53: case 0x1D362: case 0x1D7D1: case 0x1D7DB: case 0x1D7E5: case 0x1D7EF: case 0x1D7F9: + case 0x1E8C9: case 0x1F104: case 0x20AFD: case 0x20B19: @@ -3574,13 +3935,17 @@ case 0x5345: case 0x10112: case 0x10165: + case 0x102EC: case 0x10E6B: case 0x1105D: + case 0x111EC: + case 0x118EC: case 0x1D36B: case 0x20983: return (double) 30.0; case 0x1011B: case 0x1016B: + case 0x102F5: case 0x10E74: return (double) 300.0; case 0x10124: @@ -3618,6 +3983,7 @@ case 0x0C6A: case 0x0CEA: case 0x0D6A: + case 0x0DEA: case 0x0E54: case 0x0ED4: case 0x0F24: @@ -3658,21 +4024,32 @@ case 0xA8D4: case 0xA904: case 0xA9D4: + case 0xA9F4: case 0xAA54: case 0xABF4: case 0xFF14: case 0x1010A: + case 0x102E4: case 0x104A4: + case 0x1087C: + case 0x108AA: + case 0x108AB: case 0x10A43: case 0x10B5B: case 0x10B7B: + case 0x10BAC: case 0x10E63: case 0x11055: case 0x1106A: case 0x110F4: case 0x1113A: case 0x111D4: + case 0x111E4: + case 0x112F4: + case 0x114D4: + case 0x11654: case 0x116C4: + case 0x118E4: case 0x12402: case 0x12409: case 0x1240F: @@ -3688,12 +4065,16 @@ case 0x1244C: case 0x12452: case 0x12453: + case 0x12469: + case 0x16A64: + case 0x16B54: case 0x1D363: case 0x1D7D2: case 0x1D7DC: case 0x1D7E6: case 0x1D7F0: case 0x1D7FA: + case 0x1E8CA: case 0x1F105: case 0x20064: case 0x200E2: @@ -3706,13 +4087,18 @@ case 0x32B5: case 0x534C: case 0x10113: + case 0x102ED: case 0x10E6C: case 0x1105E: + case 0x111ED: + case 0x118ED: + case 0x12467: case 0x1D36C: case 0x2098C: case 0x2099C: return (double) 40.0; case 0x1011C: + case 0x102F6: case 0x10E75: return (double) 400.0; case 0x10125: @@ -3752,6 +4138,7 @@ case 0x0C6B: case 0x0CEB: case 0x0D6B: + case 0x0DEB: case 0x0E55: case 0x0ED5: case 0x0F25: @@ -3792,6 +4179,7 @@ case 0xA8D5: case 0xA905: case 0xA9D5: + case 0xA9F5: case 0xAA55: case 0xABF5: case 0xFF15: @@ -3801,15 +4189,24 @@ case 0x1014F: case 0x1015F: case 0x10173: + case 0x102E5: case 0x10321: case 0x104A5: + case 0x1087D: + case 0x108AC: + case 0x10AEC: case 0x10E64: case 0x11056: case 0x1106B: case 0x110F5: case 0x1113B: case 0x111D5: + case 0x111E5: + case 0x112F5: + case 0x114D5: + case 0x11655: case 0x116C5: + case 0x118E5: case 0x12403: case 0x1240A: case 0x12410: @@ -3821,12 +4218,16 @@ case 0x1244D: case 0x12454: case 0x12455: + case 0x1246A: + case 0x16A65: + case 0x16B55: case 0x1D364: case 0x1D7D3: case 0x1D7DD: case 0x1D7E7: case 0x1D7F1: case 0x1D7FB: + case 0x1E8CB: case 0x1F106: case 0x20121: return (double) 5.0; @@ -3852,10 +4253,14 @@ case 0x10168: case 0x10169: case 0x10174: + case 0x102EE: case 0x10323: case 0x10A7E: case 0x10E6D: case 0x1105F: + case 0x111EE: + case 0x118EE: + case 0x12468: case 0x1D36D: return (double) 50.0; case 0x216E: @@ -3869,6 +4274,7 @@ case 0x1016E: case 0x1016F: case 0x10170: + case 0x102F7: case 0x10E76: return (double) 500.0; case 0x2181: @@ -3895,6 +4301,7 @@ case 0x0C6C: case 0x0CEC: case 0x0D6C: + case 0x0DEC: case 0x0E56: case 0x0ED6: case 0x0F26: @@ -3935,12 +4342,14 @@ case 0xA8D6: case 0xA906: case 0xA9D6: + case 0xA9F6: case 0xAA56: case 0xABF6: case 0xF9D1: case 0xF9D3: case 0xFF16: case 0x1010C: + case 0x102E6: case 0x104A6: case 0x10E65: case 0x11057: @@ -3948,7 +4357,12 @@ case 0x110F6: case 0x1113C: case 0x111D6: + case 0x111E6: + case 0x112F6: + case 0x114D6: + case 0x11656: case 0x116C6: + case 0x118E6: case 0x12404: case 0x1240B: case 0x12411: @@ -3956,23 +4370,31 @@ case 0x12428: case 0x12440: case 0x1244E: + case 0x1246B: + case 0x16A66: + case 0x16B56: case 0x1D365: case 0x1D7D4: case 0x1D7DE: case 0x1D7E8: case 0x1D7F2: case 0x1D7FC: + case 0x1E8CC: case 0x1F107: case 0x20AEA: return (double) 6.0; case 0x1377: case 0x324D: case 0x10115: + case 0x102EF: case 0x10E6E: case 0x11060: + case 0x111EF: + case 0x118EF: case 0x1D36E: return (double) 60.0; case 0x1011E: + case 0x102F8: case 0x10E77: return (double) 600.0; case 0x10127: @@ -3992,6 +4414,7 @@ case 0x0C6D: case 0x0CED: case 0x0D6D: + case 0x0DED: case 0x0E57: case 0x0ED7: case 0x0F27: @@ -4032,10 +4455,12 @@ case 0xA8D7: case 0xA907: case 0xA9D7: + case 0xA9F7: case 0xAA57: case 0xABF7: case 0xFF17: case 0x1010D: + case 0x102E7: case 0x104A7: case 0x10E66: case 0x11058: @@ -4043,7 +4468,12 @@ case 0x110F7: case 0x1113D: case 0x111D7: + case 0x111E7: + case 0x112F7: + case 0x114D7: + case 0x11657: case 0x116C7: + case 0x118E7: case 0x12405: case 0x1240C: case 0x12412: @@ -4052,12 +4482,16 @@ case 0x12441: case 0x12442: case 0x12443: + case 0x1246C: + case 0x16A67: + case 0x16B57: case 0x1D366: case 0x1D7D5: case 0x1D7DF: case 0x1D7E9: case 0x1D7F3: case 0x1D7FD: + case 0x1E8CD: case 0x1F108: case 0x20001: return (double) 7.0; @@ -4068,11 +4502,15 @@ case 0x1378: case 0x324E: case 0x10116: + case 0x102F0: case 0x10E6F: case 0x11061: + case 0x111F0: + case 0x118F0: case 0x1D36F: return (double) 70.0; case 0x1011F: + case 0x102F9: case 0x10E78: return (double) 700.0; case 0x10128: @@ -4092,6 +4530,7 @@ case 0x0C6E: case 0x0CEE: case 0x0D6E: + case 0x0DEE: case 0x0E58: case 0x0ED8: case 0x0F28: @@ -4130,10 +4569,12 @@ case 0xA8D8: case 0xA908: case 0xA9D8: + case 0xA9F8: case 0xAA58: case 0xABF8: case 0xFF18: case 0x1010E: + case 0x102E8: case 0x104A8: case 0x10E67: case 0x11059: @@ -4141,7 +4582,12 @@ case 0x110F8: case 0x1113E: case 0x111D8: + case 0x111E8: + case 0x112F8: + case 0x114D8: + case 0x11658: case 0x116C8: + case 0x118E8: case 0x12406: case 0x1240D: case 0x12413: @@ -4149,22 +4595,30 @@ case 0x1242A: case 0x12444: case 0x12445: + case 0x1246D: + case 0x16A68: + case 0x16B58: case 0x1D367: case 0x1D7D6: case 0x1D7E0: case 0x1D7EA: case 0x1D7F4: case 0x1D7FE: + case 0x1E8CE: case 0x1F109: return (double) 8.0; case 0x1379: case 0x324F: case 0x10117: + case 0x102F1: case 0x10E70: case 0x11062: + case 0x111F1: + case 0x118F1: case 0x1D370: return (double) 80.0; case 0x10120: + case 0x102FA: case 0x10E79: return (double) 800.0; case 0x10129: @@ -4184,6 +4638,7 @@ case 0x0C6F: case 0x0CEF: case 0x0D6F: + case 0x0DEF: case 0x0E59: case 0x0ED9: case 0x0F29: @@ -4223,10 +4678,12 @@ case 0xA8D9: case 0xA909: case 0xA9D9: + case 0xA9F9: case 0xAA59: case 0xABF9: case 0xFF19: case 0x1010F: + case 0x102E9: case 0x104A9: case 0x10E68: case 0x1105A: @@ -4234,7 +4691,12 @@ case 0x110F9: case 0x1113F: case 0x111D9: + case 0x111E9: + case 0x112F9: + case 0x114D9: + case 0x11659: case 0x116C9: + case 0x118E9: case 0x12407: case 0x1240E: case 0x12414: @@ -4244,12 +4706,16 @@ case 0x12447: case 0x12448: case 0x12449: + case 0x1246E: + case 0x16A69: + case 0x16B59: case 0x1D368: case 0x1D7D7: case 0x1D7E1: case 0x1D7EB: case 0x1D7F5: case 0x1D7FF: + case 0x1E8CF: case 0x1F10A: case 0x2F890: return (double) 9.0; @@ -4257,12 +4723,16 @@ return (double) 9.0/2.0; case 0x137A: case 0x10118: + case 0x102F2: case 0x10341: case 0x10E71: case 0x11063: + case 0x111F2: + case 0x118F2: case 0x1D371: return (double) 90.0; case 0x10121: + case 0x102FB: case 0x1034A: case 0x10E7A: return (double) 900.0; diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -37,7 +37,7 @@ VERSION = "3.2" # The Unicode Database -UNIDATA_VERSION = "6.3.0" +UNIDATA_VERSION = "7.0.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 01:18:17 2014 From: python-checkins at python.org (ned.deily) Date: Mon, 7 Jul 2014 01:18:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTIz?= =?utf-8?q?=3A_Prevent_AttributeError_in_distutils=2Esysconfig=2Ecustomize?= =?utf-8?q?=5Fcompiler?= Message-ID: <3h65S91sfzz7LjT@mail.python.org> http://hg.python.org/cpython/rev/bdbfbb57e37e changeset: 91561:bdbfbb57e37e branch: 2.7 parent: 91557:3881c12fa3ae user: Ned Deily date: Sun Jul 06 16:11:44 2014 -0700 summary: Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler due to possible uninitialized _config_vars. Original patch by Alex Gaynor. files: Lib/distutils/sysconfig.py | 3 +- Lib/distutils/tests/test_sysconfig.py | 21 +++++++++++++++ Misc/NEWS | 3 ++ 3 files changed, 26 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 @@ -165,7 +165,8 @@ # version and build tools may not support the same set # of CPU architectures for universal builds. global _config_vars - if not _config_vars.get('CUSTOMIZED_OSX_COMPILER', ''): + # Use get_config_var() to ensure _config_vars is initialized. + if not get_config_var('CUSTOMIZED_OSX_COMPILER'): import _osx_support _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -3,6 +3,9 @@ import test import unittest import shutil +import subprocess +import sys +import textwrap from distutils import sysconfig from distutils.tests import support @@ -99,6 +102,24 @@ self.assertEqual(global_sysconfig.get_config_var('LDSHARED'), sysconfig.get_config_var('LDSHARED')) self.assertEqual(global_sysconfig.get_config_var('CC'), sysconfig.get_config_var('CC')) + def test_customize_compiler_before_get_config_vars(self): + # Issue #21923: test that a Distribution compiler + # instance can be called without an explicit call to + # get_config_vars(). + with open(TESTFN, 'w') as f: + f.writelines(textwrap.dedent('''\ + from distutils.core import Distribution + config = Distribution().get_command_obj('config') + # try_compile may pass or it may fail if no compiler + # is found but it should not raise an exception. + rc = config.try_compile('int x;') + ''')) + p = subprocess.Popen([str(sys.executable), TESTFN], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True) + outs, errs = p.communicate() + self.assertEqual(0, p.returncode, "Subprocess failed: " + outs) def test_suite(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -22,6 +22,9 @@ - Issue #19870: BaseCookie now parses 'secure' and 'httponly' flags. Backport of issue #16611. +- Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler + due to possible uninitialized _config_vars. + What's New in Python 2.7.8? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 01:18:18 2014 From: python-checkins at python.org (ned.deily) Date: Mon, 7 Jul 2014 01:18:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTIz?= =?utf-8?q?=3A_Prevent_AttributeError_in_distutils=2Esysconfig=2Ecustomize?= =?utf-8?q?=5Fcompiler?= Message-ID: <3h65SB3HDHz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/78fa18e95445 changeset: 91562:78fa18e95445 branch: 3.4 parent: 91558:3b7b0f5aac1e user: Ned Deily date: Sun Jul 06 16:14:33 2014 -0700 summary: Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler due to possible uninitialized _config_vars. Original patch by Alex Gaynor. files: Lib/distutils/sysconfig.py | 3 +- Lib/distutils/tests/test_sysconfig.py | 22 +++++++++++++++ Misc/NEWS | 3 ++ 3 files changed, 27 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 @@ -179,7 +179,8 @@ # version and build tools may not support the same set # of CPU architectures for universal builds. global _config_vars - if not _config_vars.get('CUSTOMIZED_OSX_COMPILER', ''): + # Use get_config_var() to ensure _config_vars is initialized. + if not get_config_var('CUSTOMIZED_OSX_COMPILER'): import _osx_support _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -1,6 +1,9 @@ """Tests for distutils.sysconfig.""" import os import shutil +import subprocess +import sys +import textwrap import unittest from distutils import sysconfig @@ -174,6 +177,25 @@ self.assertIsNotNone(vars['SO']) self.assertEqual(vars['SO'], vars['EXT_SUFFIX']) + def test_customize_compiler_before_get_config_vars(self): + # Issue #21923: test that a Distribution compiler + # instance can be called without an explicit call to + # get_config_vars(). + with open(TESTFN, 'w') as f: + f.writelines(textwrap.dedent('''\ + from distutils.core import Distribution + config = Distribution().get_command_obj('config') + # try_compile may pass or it may fail if no compiler + # is found but it should not raise an exception. + rc = config.try_compile('int x;') + ''')) + p = subprocess.Popen([str(sys.executable), TESTFN], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True) + outs, errs = p.communicate() + self.assertEqual(0, p.returncode, "Subprocess failed: " + outs) + def test_suite(): suite = unittest.TestSuite() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -136,6 +136,9 @@ - Issue #21801: Validate that __signature__ is None or an instance of Signature. +- Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler + due to possible uninitialized _config_vars. + Build ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 01:18:19 2014 From: python-checkins at python.org (ned.deily) Date: Mon, 7 Jul 2014 01:18:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321923=3A_merge_from_3=2E4?= Message-ID: <3h65SC5vKhz7Ljx@mail.python.org> http://hg.python.org/cpython/rev/12546bfa1f4f changeset: 91563:12546bfa1f4f parent: 91560:d25ae22cc992 parent: 91562:78fa18e95445 user: Ned Deily date: Sun Jul 06 16:17:45 2014 -0700 summary: Issue #21923: merge from 3.4 files: Lib/distutils/sysconfig.py | 3 +- Lib/distutils/tests/test_sysconfig.py | 22 +++++++++++++++ Misc/NEWS | 2 + 3 files changed, 26 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 @@ -179,7 +179,8 @@ # version and build tools may not support the same set # of CPU architectures for universal builds. global _config_vars - if not _config_vars.get('CUSTOMIZED_OSX_COMPILER', ''): + # Use get_config_var() to ensure _config_vars is initialized. + if not get_config_var('CUSTOMIZED_OSX_COMPILER'): import _osx_support _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -1,6 +1,9 @@ """Tests for distutils.sysconfig.""" import os import shutil +import subprocess +import sys +import textwrap import unittest from distutils import sysconfig @@ -174,6 +177,25 @@ self.assertIsNotNone(vars['SO']) self.assertEqual(vars['SO'], vars['EXT_SUFFIX']) + def test_customize_compiler_before_get_config_vars(self): + # Issue #21923: test that a Distribution compiler + # instance can be called without an explicit call to + # get_config_vars(). + with open(TESTFN, 'w') as f: + f.writelines(textwrap.dedent('''\ + from distutils.core import Distribution + config = Distribution().get_command_obj('config') + # try_compile may pass or it may fail if no compiler + # is found but it should not raise an exception. + rc = config.try_compile('int x;') + ''')) + p = subprocess.Popen([str(sys.executable), TESTFN], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True) + outs, errs = p.communicate() + self.assertEqual(0, p.returncode, "Subprocess failed: " + outs) + def test_suite(): suite = unittest.TestSuite() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -541,6 +541,8 @@ - Issue #21801: Validate that __signature__ is None or an instance of Signature. +- Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler + due to possible uninitialized _config_vars. Extension Modules ----------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 03:38:48 2014 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 7 Jul 2014 03:38:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzE0?= =?utf-8?q?=3A_Disallow_the_construction_of_invalid_paths_using?= Message-ID: <3h68ZJ4khYz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/c2636b5816a3 changeset: 91564:c2636b5816a3 branch: 3.4 parent: 91562:78fa18e95445 user: Antoine Pitrou date: Sun Jul 06 21:31:12 2014 -0400 summary: Issue #21714: Disallow the construction of invalid paths using Path.with_name(). Original patch by Antony Lee. files: Lib/pathlib.py | 4 ++++ Lib/test/test_pathlib.py | 8 ++++++++ Misc/NEWS | 3 +++ 3 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -749,6 +749,10 @@ """Return a new path with the file name changed.""" if not self.name: raise ValueError("%r has an empty name" % (self,)) + drv, root, parts = self._flavour.parse_parts((name,)) + if (not name or name[-1] in [self._flavour.sep, self._flavour.altsep] + or drv or root or len(parts) != 1): + raise ValueError("Invalid name %r" % (name)) return self._from_parsed_parts(self._drv, self._root, self._parts[:-1] + [name]) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -540,6 +540,10 @@ self.assertRaises(ValueError, P('').with_name, 'd.xml') self.assertRaises(ValueError, P('.').with_name, 'd.xml') self.assertRaises(ValueError, P('/').with_name, 'd.xml') + self.assertRaises(ValueError, P('a/b').with_name, '') + self.assertRaises(ValueError, P('a/b').with_name, '/c') + self.assertRaises(ValueError, P('a/b').with_name, 'c/') + self.assertRaises(ValueError, P('a/b').with_name, 'c/d') def test_with_suffix_common(self): P = self.cls @@ -950,6 +954,10 @@ self.assertRaises(ValueError, P('c:').with_name, 'd.xml') self.assertRaises(ValueError, P('c:/').with_name, 'd.xml') self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:e') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e') + self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share') def test_with_suffix(self): P = self.cls diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21714: Disallow the construction of invalid paths using + Path.with_name(). Original patch by Antony Lee. + - Issue #21897: Fix a crash with the f_locals attribute with closure variables when frame.clear() has been called. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 03:38:49 2014 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 7 Jul 2014 03:38:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIwNjM5?= =?utf-8?q?=3A_calling_Path=2Ewith=5Fsuffix=28=27=27=29_allows_removing_th?= =?utf-8?q?e_suffix_again=2E?= Message-ID: <3h68ZK6YZ4z7Lk6@mail.python.org> http://hg.python.org/cpython/rev/0d84855861ff changeset: 91565:0d84855861ff branch: 3.4 user: Antoine Pitrou date: Sun Jul 06 21:37:15 2014 -0400 summary: Issue #20639: calling Path.with_suffix('') allows removing the suffix again. Patch by July Tikhonov. files: Lib/pathlib.py | 7 +++---- Lib/test/test_pathlib.py | 6 ++++++ Misc/NEWS | 3 +++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -759,11 +759,10 @@ def with_suffix(self, suffix): """Return a new path with the file suffix changed (or added, if none).""" # XXX if suffix is None, should the current suffix be removed? - drv, root, parts = self._flavour.parse_parts((suffix,)) - if drv or root or len(parts) != 1: + f = self._flavour + if f.sep in suffix or f.altsep and f.altsep in suffix: raise ValueError("Invalid suffix %r" % (suffix)) - suffix = parts[0] - if not suffix.startswith('.'): + if suffix and not suffix.startswith('.') or suffix == '.': raise ValueError("Invalid suffix %r" % (suffix)) name = self.name if not name: diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -551,6 +551,9 @@ self.assertEqual(P('/a/b').with_suffix('.gz'), P('/a/b.gz')) self.assertEqual(P('a/b.py').with_suffix('.gz'), P('a/b.gz')) self.assertEqual(P('/a/b.py').with_suffix('.gz'), P('/a/b.gz')) + # Stripping suffix + self.assertEqual(P('a/b.py').with_suffix(''), P('a/b')) + self.assertEqual(P('/a/b').with_suffix(''), P('/a/b')) # Path doesn't have a "filename" component self.assertRaises(ValueError, P('').with_suffix, '.gz') self.assertRaises(ValueError, P('.').with_suffix, '.gz') @@ -558,9 +561,12 @@ # Invalid suffix self.assertRaises(ValueError, P('a/b').with_suffix, 'gz') self.assertRaises(ValueError, P('a/b').with_suffix, '/') + self.assertRaises(ValueError, P('a/b').with_suffix, '.') self.assertRaises(ValueError, P('a/b').with_suffix, '/.gz') self.assertRaises(ValueError, P('a/b').with_suffix, 'c/d') self.assertRaises(ValueError, P('a/b').with_suffix, '.c/.d') + self.assertRaises(ValueError, P('a/b').with_suffix, './.d') + self.assertRaises(ValueError, P('a/b').with_suffix, '.d/.') def test_relative_to_common(self): P = self.cls diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #20639: calling Path.with_suffix('') allows removing the suffix + again. Patch by July Tikhonov. + - Issue #21714: Disallow the construction of invalid paths using Path.with_name(). Original patch by Antony Lee. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 03:38:51 2014 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 7 Jul 2014 03:38:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_pathlib_fixes?= Message-ID: <3h68ZM2Gd5z7LkW@mail.python.org> http://hg.python.org/cpython/rev/5d892702b9bc changeset: 91566:5d892702b9bc parent: 91563:12546bfa1f4f parent: 91565:0d84855861ff user: Antoine Pitrou date: Sun Jul 06 21:38:35 2014 -0400 summary: Merge pathlib fixes files: Lib/pathlib.py | 11 +++++++---- Lib/test/test_pathlib.py | 14 ++++++++++++++ Misc/NEWS | 6 ++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Lib/pathlib.py b/Lib/pathlib.py --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -749,17 +749,20 @@ """Return a new path with the file name changed.""" if not self.name: raise ValueError("%r has an empty name" % (self,)) + drv, root, parts = self._flavour.parse_parts((name,)) + if (not name or name[-1] in [self._flavour.sep, self._flavour.altsep] + or drv or root or len(parts) != 1): + raise ValueError("Invalid name %r" % (name)) return self._from_parsed_parts(self._drv, self._root, self._parts[:-1] + [name]) def with_suffix(self, suffix): """Return a new path with the file suffix changed (or added, if none).""" # XXX if suffix is None, should the current suffix be removed? - drv, root, parts = self._flavour.parse_parts((suffix,)) - if drv or root or len(parts) != 1: + f = self._flavour + if f.sep in suffix or f.altsep and f.altsep in suffix: raise ValueError("Invalid suffix %r" % (suffix)) - suffix = parts[0] - if not suffix.startswith('.'): + if suffix and not suffix.startswith('.') or suffix == '.': raise ValueError("Invalid suffix %r" % (suffix)) name = self.name if not name: diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -540,6 +540,10 @@ self.assertRaises(ValueError, P('').with_name, 'd.xml') self.assertRaises(ValueError, P('.').with_name, 'd.xml') self.assertRaises(ValueError, P('/').with_name, 'd.xml') + self.assertRaises(ValueError, P('a/b').with_name, '') + self.assertRaises(ValueError, P('a/b').with_name, '/c') + self.assertRaises(ValueError, P('a/b').with_name, 'c/') + self.assertRaises(ValueError, P('a/b').with_name, 'c/d') def test_with_suffix_common(self): P = self.cls @@ -547,6 +551,9 @@ self.assertEqual(P('/a/b').with_suffix('.gz'), P('/a/b.gz')) self.assertEqual(P('a/b.py').with_suffix('.gz'), P('a/b.gz')) self.assertEqual(P('/a/b.py').with_suffix('.gz'), P('/a/b.gz')) + # Stripping suffix + self.assertEqual(P('a/b.py').with_suffix(''), P('a/b')) + self.assertEqual(P('/a/b').with_suffix(''), P('/a/b')) # Path doesn't have a "filename" component self.assertRaises(ValueError, P('').with_suffix, '.gz') self.assertRaises(ValueError, P('.').with_suffix, '.gz') @@ -554,9 +561,12 @@ # Invalid suffix self.assertRaises(ValueError, P('a/b').with_suffix, 'gz') self.assertRaises(ValueError, P('a/b').with_suffix, '/') + self.assertRaises(ValueError, P('a/b').with_suffix, '.') self.assertRaises(ValueError, P('a/b').with_suffix, '/.gz') self.assertRaises(ValueError, P('a/b').with_suffix, 'c/d') self.assertRaises(ValueError, P('a/b').with_suffix, '.c/.d') + self.assertRaises(ValueError, P('a/b').with_suffix, './.d') + self.assertRaises(ValueError, P('a/b').with_suffix, '.d/.') def test_relative_to_common(self): P = self.cls @@ -950,6 +960,10 @@ self.assertRaises(ValueError, P('c:').with_name, 'd.xml') self.assertRaises(ValueError, P('c:/').with_name, 'd.xml') self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:e') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e') + self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share') def test_with_suffix(self): P = self.cls diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,12 @@ Library ------- +- Issue #20639: calling Path.with_suffix('') allows removing the suffix + again. Patch by July Tikhonov. + +- Issue #21714: Disallow the construction of invalid paths using + Path.with_name(). Original patch by Antony Lee. + - Issue #15014: Added 'auth' method to smtplib to make implementing auth mechanisms simpler, and used it internally in the login method. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 07:07:17 2014 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 7 Jul 2014 07:07:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_for_some_reason=2C_you_don?= =?utf-8?q?=27t_get_the_right_checksum_from_an_incremental_build?= Message-ID: <3h6FBs33GHz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/fc7f28b11d20 changeset: 91567:fc7f28b11d20 user: Benjamin Peterson date: Sun Jul 06 22:07:08 2014 -0700 summary: for some reason, you don't get the right checksum from an incremental build files: Lib/test/test_unicodedata.py | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -79,8 +79,9 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): - # update this, if the database changes - expectedchecksum = '0f44b670846279c608f20e5b6eeb26e6a8ab1f07' + # Update this if the database changes. Make sure to do a full rebuild + # (e.g. 'make distclean && make') to get the correct checksum. + expectedchecksum = '585302895deead0c1c8478c51da9241d4efedca9' def test_function_checksum(self): data = [] h = hashlib.sha1() -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Jul 7 09:30:42 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 07 Jul 2014 09:30:42 +0200 Subject: [Python-checkins] Daily reference leaks (12546bfa1f4f): sum=-1 Message-ID: results for 12546bfa1f4f on branch "default" -------------------------------------------- test_collections leaked [2, -2, 0] references, sum=0 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [-2, 2, -2] references, sum=-2 test_site leaked [-2, 2, -2] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogJiDxFb', '-x'] From python-checkins at python.org Mon Jul 7 12:48:30 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 12:48:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxODgx?= =?utf-8?q?=3A_Be_more_tolerant_in_test=5Ftcl_to_not_parsable_by_float=28?= =?utf-8?q?=29_NaN?= Message-ID: <3h6NmZ6yHTz7Lks@mail.python.org> http://hg.python.org/cpython/rev/4514804d0e50 changeset: 91568:4514804d0e50 branch: 2.7 parent: 91561:bdbfbb57e37e user: Serhiy Storchaka date: Mon Jul 07 13:44:11 2014 +0300 summary: Issue #21881: Be more tolerant in test_tcl to not parsable by float() NaN representations (on mips and m68k platforms). files: Lib/test/test_tcl.py | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -420,8 +420,9 @@ self.assertEqual(passValue(float('inf')), float('inf')) self.assertEqual(passValue(-float('inf')), -float('inf')) else: - f = float(passValue(float('nan'))) - self.assertNotEqual(f, f) + f = passValue(float('nan')) + self.assertIsInstance(f, str) + self.assertEqual(f.lower()[:3], 'nan') self.assertEqual(float(passValue(float('inf'))), float('inf')) self.assertEqual(float(passValue(-float('inf'))), -float('inf')) self.assertEqual(passValue((1, '2', (3.4,))), @@ -448,9 +449,8 @@ expected = float(expected) self.assertAlmostEqual(float(actual), expected, delta=abs(expected) * 1e-10) - def nan_eq(actual, expected): - actual = float(actual) - self.assertNotEqual(actual, actual) + def starts_with(actual, expected): + self.assertEqual(actual.lower()[:len(expected)], expected) check(True, '1') check(False, '0') @@ -474,7 +474,7 @@ check(f, f, eq=float_eq) check(float('inf'), 'Inf', eq=float_eq) check(-float('inf'), '-Inf', eq=float_eq) - check(float('nan'), 'NaN', eq=nan_eq) + check(float('nan'), 'nan', eq=starts_with) check((), '') check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 12:48:32 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 12:48:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODgx?= =?utf-8?q?=3A_Be_more_tolerant_in_test=5Ftcl_to_not_parsable_by_float=28?= =?utf-8?q?=29_NaN?= Message-ID: <3h6Nmc1Q48z7Ll7@mail.python.org> http://hg.python.org/cpython/rev/4879f6337ef6 changeset: 91569:4879f6337ef6 branch: 3.4 parent: 91540:c76ab5f4fcc1 user: Serhiy Storchaka date: Mon Jul 07 13:44:33 2014 +0300 summary: Issue #21881: Be more tolerant in test_tcl to not parsable by float() NaN representations (on mips and m68k platforms). files: Lib/test/test_tcl.py | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -406,8 +406,9 @@ self.assertEqual(passValue(float('inf')), float('inf')) self.assertEqual(passValue(-float('inf')), -float('inf')) else: - f = float(passValue(float('nan'))) - self.assertNotEqual(f, f) + f = passValue(float('nan')) + self.assertIsInstance(f, str) + self.assertEqual(f.lower()[:3], 'nan') self.assertEqual(float(passValue(float('inf'))), float('inf')) self.assertEqual(float(passValue(-float('inf'))), -float('inf')) self.assertEqual(passValue((1, '2', (3.4,))), @@ -431,9 +432,8 @@ expected = float(expected) self.assertAlmostEqual(float(actual), expected, delta=abs(expected) * 1e-10) - def nan_eq(actual, expected): - actual = float(actual) - self.assertNotEqual(actual, actual) + def starts_with(actual, expected): + self.assertEqual(actual.lower()[:len(expected)], expected) check(True, '1') check(False, '0') @@ -456,7 +456,7 @@ check(f, f, eq=float_eq) check(float('inf'), 'Inf', eq=float_eq) check(-float('inf'), '-Inf', eq=float_eq) - check(float('nan'), 'NaN', eq=nan_eq) + check(float('nan'), 'nan', eq=starts_with) check((), '') check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 12:48:33 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 12:48:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321881=3A_Be_more_tolerant_in_test=5Ftcl_to_not_?= =?utf-8?q?parsable_by_float=28=29_NaN?= Message-ID: <3h6Nmd35z1z7LlG@mail.python.org> http://hg.python.org/cpython/rev/72289f574664 changeset: 91570:72289f574664 parent: 91567:fc7f28b11d20 parent: 91569:4879f6337ef6 user: Serhiy Storchaka date: Mon Jul 07 13:45:15 2014 +0300 summary: Issue #21881: Be more tolerant in test_tcl to not parsable by float() NaN representations (on mips and m68k platforms). files: Lib/test/test_tcl.py | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -406,8 +406,9 @@ self.assertEqual(passValue(float('inf')), float('inf')) self.assertEqual(passValue(-float('inf')), -float('inf')) else: - f = float(passValue(float('nan'))) - self.assertNotEqual(f, f) + f = passValue(float('nan')) + self.assertIsInstance(f, str) + self.assertEqual(f.lower()[:3], 'nan') self.assertEqual(float(passValue(float('inf'))), float('inf')) self.assertEqual(float(passValue(-float('inf'))), -float('inf')) self.assertEqual(passValue((1, '2', (3.4,))), @@ -433,9 +434,8 @@ expected = float(expected) self.assertAlmostEqual(float(actual), expected, delta=abs(expected) * 1e-10) - def nan_eq(actual, expected): - actual = float(actual) - self.assertNotEqual(actual, actual) + def starts_with(actual, expected): + self.assertEqual(actual.lower()[:len(expected)], expected) check(True, '1') check(False, '0') @@ -458,7 +458,7 @@ check(f, f, eq=float_eq) check(float('inf'), 'Inf', eq=float_eq) check(-float('inf'), '-Inf', eq=float_eq) - check(float('nan'), 'NaN', eq=nan_eq) + check(float('nan'), 'nan', eq=starts_with) check((), '') check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') check([1, [2,], [3, 4], '5 6', []], '1 2 {3 4} {5 6} {}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 12:48:35 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 12:48:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy40IC0+IDMuNCk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3h6Nmg0fHMz7Lm5@mail.python.org> http://hg.python.org/cpython/rev/a8db78d7b657 changeset: 91571:a8db78d7b657 branch: 3.4 parent: 91569:4879f6337ef6 parent: 91565:0d84855861ff user: Serhiy Storchaka date: Mon Jul 07 13:46:09 2014 +0300 summary: Merge heads files: Doc/faq/design.rst | 56 --------------- Doc/faq/programming.rst | 56 +++++++++++++++ Doc/library/__main__.rst | 2 +- Doc/library/asyncio-eventloop.rst | 10 ++- Doc/library/asyncio-task.rst | 5 +- Lib/asyncio/coroutines.py | 6 + Lib/asyncio/futures.py | 6 + Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/queues.py | 2 +- Lib/asyncio/selector_events.py | 5 +- Lib/asyncio/tasks.py | 3 +- Lib/asyncio/unix_events.py | 4 +- Lib/distutils/sysconfig.py | 3 +- Lib/distutils/tests/test_sysconfig.py | 22 +++++ Lib/pathlib.py | 11 +- Lib/test/test_asyncio/test_futures.py | 6 + Lib/test/test_asyncio/test_tasks.py | 4 + Lib/test/test_frame.py | 52 +++++++++++++ Lib/test/test_pathlib.py | 14 +++ Misc/NEWS | 12 +++ Modules/_io/_iomodule.c | 8 +- Objects/frameobject.c | 2 +- Objects/unicodeobject.c | 26 ++---- 23 files changed, 223 insertions(+), 94 deletions(-) diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -664,62 +664,6 @@ sloppy and not write test cases at all. -Why are default values shared between objects? ----------------------------------------------- - -This type of bug commonly bites neophyte programmers. Consider this function:: - - def foo(mydict={}): # Danger: shared reference to one dict for all calls - ... compute something ... - mydict[key] = value - return mydict - -The first time you call this function, ``mydict`` contains a single item. The -second time, ``mydict`` contains two items because when ``foo()`` begins -executing, ``mydict`` starts out with an item already in it. - -It is often expected that a function call creates new objects for default -values. This is not what happens. Default values are created exactly once, when -the function is defined. If that object is changed, like the dictionary in this -example, subsequent calls to the function will refer to this changed object. - -By definition, immutable objects such as numbers, strings, tuples, and ``None``, -are safe from change. Changes to mutable objects such as dictionaries, lists, -and class instances can lead to confusion. - -Because of this feature, it is good programming practice to not use mutable -objects as default values. Instead, use ``None`` as the default value and -inside the function, check if the parameter is ``None`` and create a new -list/dictionary/whatever if it is. For example, don't write:: - - def foo(mydict={}): - ... - -but:: - - def foo(mydict=None): - if mydict is None: - mydict = {} # create a new dict for local namespace - -This feature can be useful. When you have a function that's time-consuming to -compute, a common technique is to cache the parameters and the resulting value -of each call to the function, and return the cached value if the same value is -requested again. This is called "memoizing", and can be implemented like this:: - - # Callers will never provide a third parameter for this function. - def expensive(arg1, arg2, _cache={}): - if (arg1, arg2) in _cache: - return _cache[(arg1, arg2)] - - # Calculate the value - result = ... expensive computation ... - _cache[(arg1, arg2)] = result # Store result in the cache - return result - -You could use a global variable containing a dictionary instead of the default -value; it's a matter of taste. - - Why is there no goto? --------------------- diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -352,6 +352,62 @@ occur when the module is initialized. +Why are default values shared between objects? +---------------------------------------------- + +This type of bug commonly bites neophyte programmers. Consider this function:: + + def foo(mydict={}): # Danger: shared reference to one dict for all calls + ... compute something ... + mydict[key] = value + return mydict + +The first time you call this function, ``mydict`` contains a single item. The +second time, ``mydict`` contains two items because when ``foo()`` begins +executing, ``mydict`` starts out with an item already in it. + +It is often expected that a function call creates new objects for default +values. This is not what happens. Default values are created exactly once, when +the function is defined. If that object is changed, like the dictionary in this +example, subsequent calls to the function will refer to this changed object. + +By definition, immutable objects such as numbers, strings, tuples, and ``None``, +are safe from change. Changes to mutable objects such as dictionaries, lists, +and class instances can lead to confusion. + +Because of this feature, it is good programming practice to not use mutable +objects as default values. Instead, use ``None`` as the default value and +inside the function, check if the parameter is ``None`` and create a new +list/dictionary/whatever if it is. For example, don't write:: + + def foo(mydict={}): + ... + +but:: + + def foo(mydict=None): + if mydict is None: + mydict = {} # create a new dict for local namespace + +This feature can be useful. When you have a function that's time-consuming to +compute, a common technique is to cache the parameters and the resulting value +of each call to the function, and return the cached value if the same value is +requested again. This is called "memoizing", and can be implemented like this:: + + # Callers will never provide a third parameter for this function. + def expensive(arg1, arg2, _cache={}): + if (arg1, arg2) in _cache: + return _cache[(arg1, arg2)] + + # Calculate the value + result = ... expensive computation ... + _cache[(arg1, arg2)] = result # Store result in the cache + return result + +You could use a global variable containing a dictionary instead of the default +value; it's a matter of taste. + + How can I pass optional or keyword parameters from one function to another? --------------------------------------------------------------------------- diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst --- a/Doc/library/__main__.rst +++ b/Doc/library/__main__.rst @@ -12,7 +12,7 @@ A module can discover whether or not it is running in the main scope by checking its own ``__name__``, which allows a common idiom for conditionally executing code in a module when it is run as a script or with ``python --m`` but not when it is imported: +-m`` but not when it is imported:: if __name__ == "__main__": # execute only if run as a script diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -651,7 +651,10 @@ loop = asyncio.get_event_loop() loop.call_soon(print_and_repeat, loop) - loop.run_forever() + try: + loop.run_forever() + finally: + loop.close() .. seealso:: @@ -679,5 +682,8 @@ print("Event loop running forever, press CTRL+c to interrupt.") print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid()) - loop.run_forever() + try: + loop.run_forever() + finally: + loop.close() diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -89,7 +89,10 @@ yield from asyncio.sleep(2) loop = asyncio.get_event_loop() - loop.run_until_complete(greet_every_two_seconds()) + try: + loop.run_until_complete(greet_every_two_seconds()) + finally: + loop.close() .. seealso:: diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -64,6 +64,12 @@ self.gen = gen self.func = func self._source_traceback = traceback.extract_stack(sys._getframe(1)) + # __name__, __qualname__, __doc__ attributes are set by the coroutine() + # decorator + + def __repr__(self): + return ('<%s %s>' + % (self.__class__.__name__, _format_coroutine(self))) def __iter__(self): return self diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -316,6 +316,12 @@ # So-called internal methods (note: no set_running_or_notify_cancel()). + def _set_result_unless_cancelled(self, result): + """Helper setting the result only if the future was not cancelled.""" + if self.cancelled(): + return + self.set_result(result) + def set_result(self, result): """Mark the future done and set its result. diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -173,7 +173,7 @@ # run, we need to defer the put for a tick to ensure that # getters and putters alternate perfectly. See # ChannelTest.test_wait. - self._loop.call_soon(putter.set_result, None) + self._loop.call_soon(putter._set_result_unless_cancelled, None) return self._get() diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): if self._closing: @@ -690,7 +690,8 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if self._waiter is not None: - self._loop.call_soon(self._waiter.set_result, None) + self._loop.call_soon(self._waiter._set_result_unless_cancelled, + None) def pause_reading(self): # XXX This is a bit icky, given the comment at the top of diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -487,7 +487,8 @@ def sleep(delay, result=None, *, loop=None): """Coroutine that completes after a given time (in seconds).""" future = futures.Future(loop=loop) - h = future._loop.call_later(delay, future.set_result, result) + h = future._loop.call_later(delay, + future._set_result_unless_cancelled, result) try: return (yield from future) finally: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -269,7 +269,7 @@ self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _read_ready(self): try: @@ -353,7 +353,7 @@ self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter.set_result, None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): return sum(len(data) for data in self._buffer) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -179,7 +179,8 @@ # version and build tools may not support the same set # of CPU architectures for universal builds. global _config_vars - if not _config_vars.get('CUSTOMIZED_OSX_COMPILER', ''): + # Use get_config_var() to ensure _config_vars is initialized. + if not get_config_var('CUSTOMIZED_OSX_COMPILER'): import _osx_support _osx_support.customize_compiler(_config_vars) _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py --- a/Lib/distutils/tests/test_sysconfig.py +++ b/Lib/distutils/tests/test_sysconfig.py @@ -1,6 +1,9 @@ """Tests for distutils.sysconfig.""" import os import shutil +import subprocess +import sys +import textwrap import unittest from distutils import sysconfig @@ -174,6 +177,25 @@ self.assertIsNotNone(vars['SO']) self.assertEqual(vars['SO'], vars['EXT_SUFFIX']) + def test_customize_compiler_before_get_config_vars(self): + # Issue #21923: test that a Distribution compiler + # instance can be called without an explicit call to + # get_config_vars(). + with open(TESTFN, 'w') as f: + f.writelines(textwrap.dedent('''\ + from distutils.core import Distribution + config = Distribution().get_command_obj('config') + # try_compile may pass or it may fail if no compiler + # is found but it should not raise an exception. + rc = config.try_compile('int x;') + ''')) + p = subprocess.Popen([str(sys.executable), TESTFN], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + universal_newlines=True) + outs, errs = p.communicate() + self.assertEqual(0, p.returncode, "Subprocess failed: " + outs) + def test_suite(): suite = unittest.TestSuite() diff --git a/Lib/pathlib.py b/Lib/pathlib.py --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -749,17 +749,20 @@ """Return a new path with the file name changed.""" if not self.name: raise ValueError("%r has an empty name" % (self,)) + drv, root, parts = self._flavour.parse_parts((name,)) + if (not name or name[-1] in [self._flavour.sep, self._flavour.altsep] + or drv or root or len(parts) != 1): + raise ValueError("Invalid name %r" % (name)) return self._from_parsed_parts(self._drv, self._root, self._parts[:-1] + [name]) def with_suffix(self, suffix): """Return a new path with the file suffix changed (or added, if none).""" # XXX if suffix is None, should the current suffix be removed? - drv, root, parts = self._flavour.parse_parts((suffix,)) - if drv or root or len(parts) != 1: + f = self._flavour + if f.sep in suffix or f.altsep and f.altsep in suffix: raise ValueError("Invalid suffix %r" % (suffix)) - suffix = parts[0] - if not suffix.startswith('.'): + if suffix and not suffix.startswith('.') or suffix == '.': raise ValueError("Invalid suffix %r" % (suffix)) name = self.name if not name: diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -343,6 +343,12 @@ message = m_log.error.call_args[0][0] self.assertRegex(message, re.compile(regex, re.DOTALL)) + def test_set_result_unless_cancelled(self): + fut = asyncio.Future(loop=self.loop) + fut.cancel() + fut._set_result_unless_cancelled(2) + self.assertTrue(fut.cancelled()) + class FutureDoneCallbackTests(test_utils.TestCase): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -211,6 +211,10 @@ coro = ('%s() at %s:%s' % (coro_qualname, code.co_filename, code.co_firstlineno)) + # test repr(CoroWrapper) + if coroutines._DEBUG: + self.assertEqual(repr(gen), '' % coro) + # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) diff --git a/Lib/test/test_frame.py b/Lib/test/test_frame.py --- a/Lib/test/test_frame.py +++ b/Lib/test/test_frame.py @@ -1,5 +1,6 @@ import gc import sys +import types import unittest import weakref @@ -109,6 +110,57 @@ self.assertIs(None, wr()) +class FrameLocalsTest(unittest.TestCase): + """ + Tests for the .f_locals attribute. + """ + + def make_frames(self): + def outer(): + x = 5 + y = 6 + def inner(): + z = x + 2 + 1/0 + t = 9 + return inner() + try: + outer() + except ZeroDivisionError as e: + tb = e.__traceback__ + frames = [] + while tb: + frames.append(tb.tb_frame) + tb = tb.tb_next + return frames + + def test_locals(self): + f, outer, inner = self.make_frames() + outer_locals = outer.f_locals + self.assertIsInstance(outer_locals.pop('inner'), types.FunctionType) + self.assertEqual(outer_locals, {'x': 5, 'y': 6}) + inner_locals = inner.f_locals + self.assertEqual(inner_locals, {'x': 5, 'z': 7}) + + def test_clear_locals(self): + # Test f_locals after clear() (issue #21897) + f, outer, inner = self.make_frames() + outer.clear() + inner.clear() + self.assertEqual(outer.f_locals, {}) + self.assertEqual(inner.f_locals, {}) + + def test_locals_clear_locals(self): + # Test f_locals before and after clear() (to exercise caching) + f, outer, inner = self.make_frames() + outer.f_locals + inner.f_locals + outer.clear() + inner.clear() + self.assertEqual(outer.f_locals, {}) + self.assertEqual(inner.f_locals, {}) + + def test_main(): support.run_unittest(__name__) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -540,6 +540,10 @@ self.assertRaises(ValueError, P('').with_name, 'd.xml') self.assertRaises(ValueError, P('.').with_name, 'd.xml') self.assertRaises(ValueError, P('/').with_name, 'd.xml') + self.assertRaises(ValueError, P('a/b').with_name, '') + self.assertRaises(ValueError, P('a/b').with_name, '/c') + self.assertRaises(ValueError, P('a/b').with_name, 'c/') + self.assertRaises(ValueError, P('a/b').with_name, 'c/d') def test_with_suffix_common(self): P = self.cls @@ -547,6 +551,9 @@ self.assertEqual(P('/a/b').with_suffix('.gz'), P('/a/b.gz')) self.assertEqual(P('a/b.py').with_suffix('.gz'), P('a/b.gz')) self.assertEqual(P('/a/b.py').with_suffix('.gz'), P('/a/b.gz')) + # Stripping suffix + self.assertEqual(P('a/b.py').with_suffix(''), P('a/b')) + self.assertEqual(P('/a/b').with_suffix(''), P('/a/b')) # Path doesn't have a "filename" component self.assertRaises(ValueError, P('').with_suffix, '.gz') self.assertRaises(ValueError, P('.').with_suffix, '.gz') @@ -554,9 +561,12 @@ # Invalid suffix self.assertRaises(ValueError, P('a/b').with_suffix, 'gz') self.assertRaises(ValueError, P('a/b').with_suffix, '/') + self.assertRaises(ValueError, P('a/b').with_suffix, '.') self.assertRaises(ValueError, P('a/b').with_suffix, '/.gz') self.assertRaises(ValueError, P('a/b').with_suffix, 'c/d') self.assertRaises(ValueError, P('a/b').with_suffix, '.c/.d') + self.assertRaises(ValueError, P('a/b').with_suffix, './.d') + self.assertRaises(ValueError, P('a/b').with_suffix, '.d/.') def test_relative_to_common(self): P = self.cls @@ -950,6 +960,10 @@ self.assertRaises(ValueError, P('c:').with_name, 'd.xml') self.assertRaises(ValueError, P('c:/').with_name, 'd.xml') self.assertRaises(ValueError, P('//My/Share').with_name, 'd.xml') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:e') + self.assertRaises(ValueError, P('c:a/b').with_name, 'd:/e') + self.assertRaises(ValueError, P('c:a/b').with_name, '//My/Share') def test_with_suffix(self): P = self.cls diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,15 @@ Library ------- +- Issue #20639: calling Path.with_suffix('') allows removing the suffix + again. Patch by July Tikhonov. + +- Issue #21714: Disallow the construction of invalid paths using + Path.with_name(). Original patch by Antony Lee. + +- Issue #21897: Fix a crash with the f_locals attribute with closure + variables when frame.clear() has been called. + - Issue #21151: Fixed a segfault in the winreg module when ``None`` is passed as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. @@ -133,6 +142,9 @@ - Issue #21801: Validate that __signature__ is None or an instance of Signature. +- Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler + due to possible uninitialized _config_vars. + Build ----- diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -465,11 +465,13 @@ error: if (result != NULL) { - PyObject *exc, *val, *tb; + PyObject *exc, *val, *tb, *close_result; PyErr_Fetch(&exc, &val, &tb); - if (_PyObject_CallMethodId(result, &PyId_close, NULL) != NULL) + close_result = _PyObject_CallMethodId(result, &PyId_close, NULL); + if (close_result != NULL) { + Py_DECREF(close_result); PyErr_Restore(exc, val, tb); - else { + } else { PyObject *exc2, *val2, *tb2; PyErr_Fetch(&exc2, &val2, &tb2); PyErr_NormalizeException(&exc, &val, &tb); diff --git a/Objects/frameobject.c b/Objects/frameobject.c --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -786,7 +786,7 @@ PyObject *key = PyTuple_GET_ITEM(map, j); PyObject *value = values[j]; assert(PyUnicode_Check(key)); - if (deref) { + if (deref && value != NULL) { assert(PyCell_Check(value)); value = PyCell_GET(value); } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1372,9 +1372,8 @@ 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 %" PY_FORMAT_SIZE_T "i characters at %" - PY_FORMAT_SIZE_T "i in a string of %" - PY_FORMAT_SIZE_T "i characters", + "Cannot write %zi characters at %zi " + "in a string of %zi characters", how_many, to_start, PyUnicode_GET_LENGTH(to)); return -1; } @@ -4083,9 +4082,7 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); goto onError; } @@ -4178,9 +4175,7 @@ if (newpos<0) newpos = insize+newpos; if (newpos<0 || newpos>insize) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", newpos); goto onError; } @@ -6443,9 +6438,7 @@ if (*newpos<0) *newpos = len + *newpos; if (*newpos<0 || *newpos>len) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -8468,9 +8461,7 @@ else *newpos = i_newpos; if (*newpos<0 || *newpos>PyUnicode_GET_LENGTH(unicode)) { - PyErr_Format(PyExc_IndexError, - "position %" PY_FORMAT_SIZE_T - "d from error handler out of bounds", *newpos); + PyErr_Format(PyExc_IndexError, "position %zd from error handler out of bounds", *newpos); Py_DECREF(restuple); return NULL; } @@ -9752,8 +9743,7 @@ item = items[i]; if (!PyUnicode_Check(item)) { PyErr_Format(PyExc_TypeError, - "sequence item %" PY_FORMAT_SIZE_T - "d: expected str instance," + "sequence item %zd: expected str instance," " %.80s found", i, Py_TYPE(item)->tp_name); goto onError; @@ -14452,7 +14442,7 @@ default: PyErr_Format(PyExc_ValueError, "unsupported format character '%c' (0x%x) " - "at index %" PY_FORMAT_SIZE_T "d", + "at index %zd", (31<=arg->ch && arg->ch<=126) ? (char)arg->ch : '?', (int)arg->ch, ctx->fmtpos - 1); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 12:48:36 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 12:48:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3h6Nmh2BQ4z7Llj@mail.python.org> http://hg.python.org/cpython/rev/638450955b9a changeset: 91572:638450955b9a parent: 91570:72289f574664 parent: 91571:a8db78d7b657 user: Serhiy Storchaka date: Mon Jul 07 13:46:38 2014 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 13:09:41 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 13:09:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5NTkz?= =?utf-8?q?=3A_Use_specific_asserts_in_importlib_tests=2E?= Message-ID: <3h6PF13cz2z7LlJ@mail.python.org> http://hg.python.org/cpython/rev/f426bd85f808 changeset: 91573:f426bd85f808 branch: 3.4 parent: 91571:a8db78d7b657 user: Serhiy Storchaka date: Mon Jul 07 14:08:19 2014 +0300 summary: Issue #19593: Use specific asserts in importlib tests. files: Lib/test/test_import.py | 6 +++--- Lib/test/test_importlib/builtin/test_loader.py | 2 +- Lib/test/test_importlib/import_/test_fromlist.py | 2 +- Lib/test/test_importlib/import_/test_meta_path.py | 2 +- Lib/test/test_importlib/test_abc.py | 2 +- 5 files changed, 7 insertions(+), 7 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 @@ -190,12 +190,12 @@ # import x.y.z binds x in the current namespace import test as x import test.support - self.assertTrue(x is test, x.__name__) + self.assertIs(x, test, x.__name__) self.assertTrue(hasattr(test.support, "__file__")) # import x.y.z as w binds z as w import test.support as y - self.assertTrue(y is test.support, y.__name__) + self.assertIs(y, test.support, y.__name__) def test_failing_reload(self): # A failing reload should leave the module object in sys.modules. @@ -223,7 +223,7 @@ self.assertRaises(ZeroDivisionError, importlib.reload, mod) # But we still expect the module to be in sys.modules. mod = sys.modules.get(TESTFN) - self.assertIsNot(mod, None, "expected module to be in sys.modules") + self.assertIsNotNone(mod, "expected module to be in sys.modules") # We should have replaced a w/ 10, but the old b value should # stick. diff --git a/Lib/test/test_importlib/builtin/test_loader.py b/Lib/test/test_importlib/builtin/test_loader.py --- a/Lib/test/test_importlib/builtin/test_loader.py +++ b/Lib/test/test_importlib/builtin/test_loader.py @@ -87,7 +87,7 @@ def test_is_package(self): # Cannot be a package. result = self.machinery.BuiltinImporter.is_package(builtin_util.NAME) - self.assertTrue(not result) + self.assertFalse(result) def test_not_builtin(self): # Modules not built-in should raise ImportError. diff --git a/Lib/test/test_importlib/import_/test_fromlist.py b/Lib/test/test_importlib/import_/test_fromlist.py --- a/Lib/test/test_importlib/import_/test_fromlist.py +++ b/Lib/test/test_importlib/import_/test_fromlist.py @@ -61,7 +61,7 @@ with util.import_state(meta_path=[importer]): module = self.__import__('module', fromlist=['non_existent']) self.assertEqual(module.__name__, 'module') - self.assertTrue(not hasattr(module, 'non_existent')) + self.assertFalse(hasattr(module, 'non_existent')) def test_module_from_package(self): # [module] diff --git a/Lib/test/test_importlib/import_/test_meta_path.py b/Lib/test/test_importlib/import_/test_meta_path.py --- a/Lib/test/test_importlib/import_/test_meta_path.py +++ b/Lib/test/test_importlib/import_/test_meta_path.py @@ -96,7 +96,7 @@ args = log[1][0] kwargs = log[1][1] # Assuming all arguments are positional. - self.assertTrue(not kwargs) + self.assertFalse(kwargs) self.assertEqual(args[0], mod_name) self.assertIs(args[1], path) diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -783,7 +783,7 @@ warnings.simplefilter('ignore', DeprecationWarning) module = self.loader.load_module(self.name) self.verify_module(module) - self.assertTrue(not hasattr(module, '__path__')) + self.assertFalse(hasattr(module, '__path__')) def test_get_source_encoding(self): # Source is considered encoded in UTF-8 by default unless otherwise -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 13:09:42 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 13:09:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319593=3A_Use_specific_asserts_in_importlib_test?= =?utf-8?q?s=2E?= Message-ID: <3h6PF26RPcz7Llj@mail.python.org> http://hg.python.org/cpython/rev/cace5cc29df0 changeset: 91574:cace5cc29df0 parent: 91572:638450955b9a parent: 91573:f426bd85f808 user: Serhiy Storchaka date: Mon Jul 07 14:09:43 2014 +0300 summary: Issue #19593: Use specific asserts in importlib tests. files: Lib/test/test_import.py | 6 +++--- Lib/test/test_importlib/builtin/test_loader.py | 2 +- Lib/test/test_importlib/import_/test_fromlist.py | 2 +- Lib/test/test_importlib/import_/test_meta_path.py | 2 +- Lib/test/test_importlib/test_abc.py | 2 +- 5 files changed, 7 insertions(+), 7 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 @@ -190,12 +190,12 @@ # import x.y.z binds x in the current namespace import test as x import test.support - self.assertTrue(x is test, x.__name__) + self.assertIs(x, test, x.__name__) self.assertTrue(hasattr(test.support, "__file__")) # import x.y.z as w binds z as w import test.support as y - self.assertTrue(y is test.support, y.__name__) + self.assertIs(y, test.support, y.__name__) def test_failing_reload(self): # A failing reload should leave the module object in sys.modules. @@ -223,7 +223,7 @@ self.assertRaises(ZeroDivisionError, importlib.reload, mod) # But we still expect the module to be in sys.modules. mod = sys.modules.get(TESTFN) - self.assertIsNot(mod, None, "expected module to be in sys.modules") + self.assertIsNotNone(mod, "expected module to be in sys.modules") # We should have replaced a w/ 10, but the old b value should # stick. diff --git a/Lib/test/test_importlib/builtin/test_loader.py b/Lib/test/test_importlib/builtin/test_loader.py --- a/Lib/test/test_importlib/builtin/test_loader.py +++ b/Lib/test/test_importlib/builtin/test_loader.py @@ -88,7 +88,7 @@ def test_is_package(self): # Cannot be a package. result = self.machinery.BuiltinImporter.is_package(util.BUILTINS.good_name) - self.assertTrue(not result) + self.assertFalse(result) @unittest.skipIf(util.BUILTINS.bad_name is None, 'all modules are built in') def test_not_builtin(self): diff --git a/Lib/test/test_importlib/import_/test_fromlist.py b/Lib/test/test_importlib/import_/test_fromlist.py --- a/Lib/test/test_importlib/import_/test_fromlist.py +++ b/Lib/test/test_importlib/import_/test_fromlist.py @@ -62,7 +62,7 @@ with util.import_state(meta_path=[importer]): module = self.__import__('module', fromlist=['non_existent']) self.assertEqual(module.__name__, 'module') - self.assertTrue(not hasattr(module, 'non_existent')) + self.assertFalse(hasattr(module, 'non_existent')) def test_module_from_package(self): # [module] diff --git a/Lib/test/test_importlib/import_/test_meta_path.py b/Lib/test/test_importlib/import_/test_meta_path.py --- a/Lib/test/test_importlib/import_/test_meta_path.py +++ b/Lib/test/test_importlib/import_/test_meta_path.py @@ -97,7 +97,7 @@ args = log[1][0] kwargs = log[1][1] # Assuming all arguments are positional. - self.assertTrue(not kwargs) + self.assertFalse(kwargs) self.assertEqual(args[0], mod_name) self.assertIs(args[1], path) diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -784,7 +784,7 @@ warnings.simplefilter('ignore', DeprecationWarning) module = self.loader.load_module(self.name) self.verify_module(module) - self.assertTrue(not hasattr(module, '__path__')) + self.assertFalse(hasattr(module, '__path__')) def test_get_source_encoding(self): # Source is considered encoded in UTF-8 by default unless otherwise -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 13:59:40 2014 From: python-checkins at python.org (berker.peksag) Date: Mon, 7 Jul 2014 13:59:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzA3?= =?utf-8?q?=3A_Add_missing_kwonlyargcount_argument_to?= Message-ID: <3h6QLh3MRVz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/59921d2f023c changeset: 91575:59921d2f023c branch: 3.4 parent: 91573:f426bd85f808 user: Berker Peksag date: Mon Jul 07 14:58:12 2014 +0300 summary: Issue #21707: Add missing kwonlyargcount argument to ModuleFinder.replace_paths_in_code(). files: Lib/modulefinder.py | 11 ++++++----- Lib/test/test_modulefinder.py | 16 ++++++++++++---- Misc/NEWS | 3 +++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -568,11 +568,12 @@ if isinstance(consts[i], type(co)): consts[i] = self.replace_paths_in_code(consts[i]) - return types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize, - co.co_flags, co.co_code, tuple(consts), co.co_names, - co.co_varnames, new_filename, co.co_name, - co.co_firstlineno, co.co_lnotab, - co.co_freevars, co.co_cellvars) + return types.CodeType(co.co_argcount, co.co_kwonlyargcount, + co.co_nlocals, co.co_stacksize, co.co_flags, + co.co_code, tuple(consts), co.co_names, + co.co_varnames, new_filename, co.co_name, + co.co_firstlineno, co.co_lnotab, co.co_freevars, + co.co_cellvars) def test(): diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -245,11 +245,12 @@ class ModuleFinderTest(unittest.TestCase): - def _do_test(self, info, report=False): + def _do_test(self, info, report=False, debug=0, replace_paths=[]): import_this, modules, missing, maybe_missing, source = info create_package(source) try: - mf = modulefinder.ModuleFinder(path=TEST_PATH) + mf = modulefinder.ModuleFinder(path=TEST_PATH, debug=debug, + replace_paths=replace_paths) mf.import_hook(import_this) if report: mf.report() @@ -308,9 +309,16 @@ os.remove(source_path) self._do_test(bytecode_test) + def test_replace_paths(self): + old_path = os.path.join(TEST_DIR, 'a', 'module.py') + new_path = os.path.join(TEST_DIR, 'a', 'spam.py') + with support.captured_stdout() as output: + self._do_test(maybe_test, debug=2, + replace_paths=[(old_path, new_path)]) + output = output.getvalue() + expected = "co_filename '%s' changed to '%s'" % (old_path, new_path) + self.assertIn(expected, output) -def test_main(): - support.run_unittest(ModuleFinderTest) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21707: Add missing kwonlyargcount argument to + ModuleFinder.replace_paths_in_code(). + - Issue #20639: calling Path.with_suffix('') allows removing the suffix again. Patch by July Tikhonov. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 13:59:41 2014 From: python-checkins at python.org (berker.peksag) Date: Mon, 7 Jul 2014 13:59:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321707=3A_Merge_with_3=2E4=2E?= Message-ID: <3h6QLj5GbDz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/4b6798e74dcf changeset: 91576:4b6798e74dcf parent: 91574:cace5cc29df0 parent: 91575:59921d2f023c user: Berker Peksag date: Mon Jul 07 14:59:47 2014 +0300 summary: Issue #21707: Merge with 3.4. files: Lib/modulefinder.py | 11 ++++++----- Lib/test/test_modulefinder.py | 16 ++++++++++++---- Misc/NEWS | 3 +++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -568,11 +568,12 @@ if isinstance(consts[i], type(co)): consts[i] = self.replace_paths_in_code(consts[i]) - return types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize, - co.co_flags, co.co_code, tuple(consts), co.co_names, - co.co_varnames, new_filename, co.co_name, - co.co_firstlineno, co.co_lnotab, - co.co_freevars, co.co_cellvars) + return types.CodeType(co.co_argcount, co.co_kwonlyargcount, + co.co_nlocals, co.co_stacksize, co.co_flags, + co.co_code, tuple(consts), co.co_names, + co.co_varnames, new_filename, co.co_name, + co.co_firstlineno, co.co_lnotab, co.co_freevars, + co.co_cellvars) def test(): diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -245,11 +245,12 @@ class ModuleFinderTest(unittest.TestCase): - def _do_test(self, info, report=False): + def _do_test(self, info, report=False, debug=0, replace_paths=[]): import_this, modules, missing, maybe_missing, source = info create_package(source) try: - mf = modulefinder.ModuleFinder(path=TEST_PATH) + mf = modulefinder.ModuleFinder(path=TEST_PATH, debug=debug, + replace_paths=replace_paths) mf.import_hook(import_this) if report: mf.report() @@ -308,9 +309,16 @@ os.remove(source_path) self._do_test(bytecode_test) + def test_replace_paths(self): + old_path = os.path.join(TEST_DIR, 'a', 'module.py') + new_path = os.path.join(TEST_DIR, 'a', 'spam.py') + with support.captured_stdout() as output: + self._do_test(maybe_test, debug=2, + replace_paths=[(old_path, new_path)]) + output = output.getvalue() + expected = "co_filename '%s' changed to '%s'" % (old_path, new_path) + self.assertIn(expected, output) -def test_main(): - support.run_unittest(ModuleFinderTest) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #21707: Add missing kwonlyargcount argument to + ModuleFinder.replace_paths_in_code(). + - Issue #20639: calling Path.with_suffix('') allows removing the suffix again. Patch by July Tikhonov. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 14:20:20 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 14:20:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxODgx?= =?utf-8?q?=3A_Just_omit_tests_for_platform-specific_NaN_representation_in?= Message-ID: <3h6QpX4yfvz7LvX@mail.python.org> http://hg.python.org/cpython/rev/01ec8bb7187f changeset: 91577:01ec8bb7187f branch: 2.7 parent: 91568:4514804d0e50 user: Serhiy Storchaka date: Mon Jul 07 14:47:17 2014 +0300 summary: Issue #21881: Just omit tests for platform-specific NaN representation in test_tcl. files: Lib/test/test_tcl.py | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -420,11 +420,9 @@ self.assertEqual(passValue(float('inf')), float('inf')) self.assertEqual(passValue(-float('inf')), -float('inf')) else: - f = passValue(float('nan')) - self.assertIsInstance(f, str) - self.assertEqual(f.lower()[:3], 'nan') self.assertEqual(float(passValue(float('inf'))), float('inf')) self.assertEqual(float(passValue(-float('inf'))), -float('inf')) + # XXX NaN representation can be not parsable by float() self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') @@ -449,8 +447,6 @@ expected = float(expected) self.assertAlmostEqual(float(actual), expected, delta=abs(expected) * 1e-10) - def starts_with(actual, expected): - self.assertEqual(actual.lower()[:len(expected)], expected) check(True, '1') check(False, '0') @@ -474,7 +470,7 @@ check(f, f, eq=float_eq) check(float('inf'), 'Inf', eq=float_eq) check(-float('inf'), '-Inf', eq=float_eq) - check(float('nan'), 'nan', eq=starts_with) + # XXX NaN representation can be not parsable by float() check((), '') check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 14:20:21 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 14:20:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODgx?= =?utf-8?q?=3A_Just_omit_tests_for_platform-specific_NaN_representation_in?= Message-ID: <3h6QpY6cmvz7LxY@mail.python.org> http://hg.python.org/cpython/rev/5ac811cbec87 changeset: 91578:5ac811cbec87 branch: 3.4 parent: 91573:f426bd85f808 user: Serhiy Storchaka date: Mon Jul 07 14:57:08 2014 +0300 summary: Issue #21881: Just omit tests for platform-specific NaN representation in test_tcl. files: Lib/test/test_tcl.py | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -406,11 +406,9 @@ self.assertEqual(passValue(float('inf')), float('inf')) self.assertEqual(passValue(-float('inf')), -float('inf')) else: - f = passValue(float('nan')) - self.assertIsInstance(f, str) - self.assertEqual(f.lower()[:3], 'nan') self.assertEqual(float(passValue(float('inf'))), float('inf')) self.assertEqual(float(passValue(-float('inf'))), -float('inf')) + # XXX NaN representation can be not parsable by float() self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') @@ -432,8 +430,6 @@ expected = float(expected) self.assertAlmostEqual(float(actual), expected, delta=abs(expected) * 1e-10) - def starts_with(actual, expected): - self.assertEqual(actual.lower()[:len(expected)], expected) check(True, '1') check(False, '0') @@ -456,7 +452,7 @@ check(f, f, eq=float_eq) check(float('inf'), 'Inf', eq=float_eq) check(-float('inf'), '-Inf', eq=float_eq) - check(float('nan'), 'nan', eq=starts_with) + # XXX NaN representation can be not parsable by float() check((), '') check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 14:20:23 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 14:20:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321881=3A_Just_omit_tests_for_platform-specific_?= =?utf-8?q?NaN_representation_in?= Message-ID: <3h6Qpb1DV7z7Ly0@mail.python.org> http://hg.python.org/cpython/rev/f138a74ee611 changeset: 91579:f138a74ee611 parent: 91574:cace5cc29df0 parent: 91578:5ac811cbec87 user: Serhiy Storchaka date: Mon Jul 07 14:57:57 2014 +0300 summary: Issue #21881: Just omit tests for platform-specific NaN representation in test_tcl. files: Lib/test/test_tcl.py | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -406,11 +406,9 @@ self.assertEqual(passValue(float('inf')), float('inf')) self.assertEqual(passValue(-float('inf')), -float('inf')) else: - f = passValue(float('nan')) - self.assertIsInstance(f, str) - self.assertEqual(f.lower()[:3], 'nan') self.assertEqual(float(passValue(float('inf'))), float('inf')) self.assertEqual(float(passValue(-float('inf'))), -float('inf')) + # XXX NaN representation can be not parsable by float() self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') self.assertEqual(passValue(['a', ['b', 'c']]), @@ -434,8 +432,6 @@ expected = float(expected) self.assertAlmostEqual(float(actual), expected, delta=abs(expected) * 1e-10) - def starts_with(actual, expected): - self.assertEqual(actual.lower()[:len(expected)], expected) check(True, '1') check(False, '0') @@ -458,7 +454,7 @@ check(f, f, eq=float_eq) check(float('inf'), 'Inf', eq=float_eq) check(-float('inf'), '-Inf', eq=float_eq) - check(float('nan'), 'nan', eq=starts_with) + # XXX NaN representation can be not parsable by float() check((), '') check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') check([1, [2,], [3, 4], '5 6', []], '1 2 {3 4} {5 6} {}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 14:20:24 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 14:20:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3h6Qpc2wXXz7M1M@mail.python.org> http://hg.python.org/cpython/rev/d4b035c9fb7d changeset: 91580:d4b035c9fb7d parent: 91579:f138a74ee611 parent: 91576:4b6798e74dcf user: Serhiy Storchaka date: Mon Jul 07 15:11:42 2014 +0300 summary: Merge heads files: Lib/modulefinder.py | 11 ++++++----- Lib/test/test_modulefinder.py | 16 ++++++++++++---- Misc/NEWS | 3 +++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -568,11 +568,12 @@ if isinstance(consts[i], type(co)): consts[i] = self.replace_paths_in_code(consts[i]) - return types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize, - co.co_flags, co.co_code, tuple(consts), co.co_names, - co.co_varnames, new_filename, co.co_name, - co.co_firstlineno, co.co_lnotab, - co.co_freevars, co.co_cellvars) + return types.CodeType(co.co_argcount, co.co_kwonlyargcount, + co.co_nlocals, co.co_stacksize, co.co_flags, + co.co_code, tuple(consts), co.co_names, + co.co_varnames, new_filename, co.co_name, + co.co_firstlineno, co.co_lnotab, co.co_freevars, + co.co_cellvars) def test(): diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -245,11 +245,12 @@ class ModuleFinderTest(unittest.TestCase): - def _do_test(self, info, report=False): + def _do_test(self, info, report=False, debug=0, replace_paths=[]): import_this, modules, missing, maybe_missing, source = info create_package(source) try: - mf = modulefinder.ModuleFinder(path=TEST_PATH) + mf = modulefinder.ModuleFinder(path=TEST_PATH, debug=debug, + replace_paths=replace_paths) mf.import_hook(import_this) if report: mf.report() @@ -308,9 +309,16 @@ os.remove(source_path) self._do_test(bytecode_test) + def test_replace_paths(self): + old_path = os.path.join(TEST_DIR, 'a', 'module.py') + new_path = os.path.join(TEST_DIR, 'a', 'spam.py') + with support.captured_stdout() as output: + self._do_test(maybe_test, debug=2, + replace_paths=[(old_path, new_path)]) + output = output.getvalue() + expected = "co_filename '%s' changed to '%s'" % (old_path, new_path) + self.assertIn(expected, output) -def test_main(): - support.run_unittest(ModuleFinderTest) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #21707: Add missing kwonlyargcount argument to + ModuleFinder.replace_paths_in_code(). + - Issue #20639: calling Path.with_suffix('') allows removing the suffix again. Patch by July Tikhonov. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 14:20:25 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 14:20:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy40IC0+IDMuNCk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3h6Qpd4QjLz7M1S@mail.python.org> http://hg.python.org/cpython/rev/04a2f86539b5 changeset: 91581:04a2f86539b5 branch: 3.4 parent: 91578:5ac811cbec87 parent: 91575:59921d2f023c user: Serhiy Storchaka date: Mon Jul 07 15:18:22 2014 +0300 summary: Merge heads files: Lib/modulefinder.py | 11 ++++++----- Lib/test/test_modulefinder.py | 16 ++++++++++++---- Misc/NEWS | 3 +++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Lib/modulefinder.py b/Lib/modulefinder.py --- a/Lib/modulefinder.py +++ b/Lib/modulefinder.py @@ -568,11 +568,12 @@ if isinstance(consts[i], type(co)): consts[i] = self.replace_paths_in_code(consts[i]) - return types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize, - co.co_flags, co.co_code, tuple(consts), co.co_names, - co.co_varnames, new_filename, co.co_name, - co.co_firstlineno, co.co_lnotab, - co.co_freevars, co.co_cellvars) + return types.CodeType(co.co_argcount, co.co_kwonlyargcount, + co.co_nlocals, co.co_stacksize, co.co_flags, + co.co_code, tuple(consts), co.co_names, + co.co_varnames, new_filename, co.co_name, + co.co_firstlineno, co.co_lnotab, co.co_freevars, + co.co_cellvars) def test(): diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -245,11 +245,12 @@ class ModuleFinderTest(unittest.TestCase): - def _do_test(self, info, report=False): + def _do_test(self, info, report=False, debug=0, replace_paths=[]): import_this, modules, missing, maybe_missing, source = info create_package(source) try: - mf = modulefinder.ModuleFinder(path=TEST_PATH) + mf = modulefinder.ModuleFinder(path=TEST_PATH, debug=debug, + replace_paths=replace_paths) mf.import_hook(import_this) if report: mf.report() @@ -308,9 +309,16 @@ os.remove(source_path) self._do_test(bytecode_test) + def test_replace_paths(self): + old_path = os.path.join(TEST_DIR, 'a', 'module.py') + new_path = os.path.join(TEST_DIR, 'a', 'spam.py') + with support.captured_stdout() as output: + self._do_test(maybe_test, debug=2, + replace_paths=[(old_path, new_path)]) + output = output.getvalue() + expected = "co_filename '%s' changed to '%s'" % (old_path, new_path) + self.assertIn(expected, output) -def test_main(): - support.run_unittest(ModuleFinderTest) if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21707: Add missing kwonlyargcount argument to + ModuleFinder.replace_paths_in_code(). + - Issue #20639: calling Path.with_suffix('') allows removing the suffix again. Patch by July Tikhonov. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 14:20:26 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 7 Jul 2014 14:20:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3h6Qpf5kKSz7LyK@mail.python.org> http://hg.python.org/cpython/rev/027494c8ddaf changeset: 91582:027494c8ddaf parent: 91580:d4b035c9fb7d parent: 91581:04a2f86539b5 user: Serhiy Storchaka date: Mon Jul 07 15:18:52 2014 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 17:28:21 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 17:28:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h6VzT49T6z7Lnn@mail.python.org> http://hg.python.org/cpython/rev/1ae8f66ec068 changeset: 91583:1ae8f66ec068 branch: 3.4 parent: 91581:04a2f86539b5 user: Victor Stinner date: Mon Jul 07 17:26:54 2014 +0200 summary: asyncio: sync with Tulip - Tulip issue #181: Faster create_connection(). Call directly waiter.set_result() in the constructor of _ProactorBasePipeTransport and _SelectorSocketTransport, instead of using of delaying the call with call_soon(). - Cleanup iscoroutine() files: Lib/asyncio/coroutines.py | 4 ++-- Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/selector_events.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -166,11 +166,11 @@ return getattr(func, '_is_coroutine', False) -_COROUTINE_TYPES = (CoroWrapper, types.GeneratorType) +_COROUTINE_TYPES = (types.GeneratorType, CoroWrapper) def iscoroutine(obj): """Return True if obj is a coroutine object.""" - return isinstance(obj, _COROUTINE_TYPES) + return isinstance(obj, _COROUTINE_TYPES) def _format_coroutine(coro): diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter._set_result_unless_cancelled, None) + waiter.set_result(None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter._set_result_unless_cancelled, None) + waiter.set_result(None) def pause_reading(self): if self._closing: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 17:28:22 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 17:28:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h6VzV5Ztfz7LtW@mail.python.org> http://hg.python.org/cpython/rev/996b232cbdc4 changeset: 91584:996b232cbdc4 parent: 91582:027494c8ddaf parent: 91583:1ae8f66ec068 user: Victor Stinner date: Mon Jul 07 17:27:27 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip - Tulip issue #181: Faster create_connection(). Call directly waiter.set_result() in the constructor of _ProactorBasePipeTransport and _SelectorSocketTransport, instead of using of delaying the call with call_soon(). - Cleanup iscoroutine() files: Lib/asyncio/coroutines.py | 4 ++-- Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/selector_events.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -166,11 +166,11 @@ return getattr(func, '_is_coroutine', False) -_COROUTINE_TYPES = (CoroWrapper, types.GeneratorType) +_COROUTINE_TYPES = (types.GeneratorType, CoroWrapper) def iscoroutine(obj): """Return True if obj is a coroutine object.""" - return isinstance(obj, _COROUTINE_TYPES) + return isinstance(obj, _COROUTINE_TYPES) def _format_coroutine(coro): diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter._set_result_unless_cancelled, None) + waiter.set_result(None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - self._loop.call_soon(waiter._set_result_unless_cancelled, None) + waiter.set_result(None) def pause_reading(self): if self._closing: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 18:09:36 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 18:09:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h6Wv44JY1z7Lmm@mail.python.org> http://hg.python.org/cpython/rev/f59e0d618be2 changeset: 91585:f59e0d618be2 branch: 3.4 parent: 91583:1ae8f66ec068 user: Victor Stinner date: Mon Jul 07 18:08:22 2014 +0200 summary: asyncio: sync with Tulip Backout the "Tulip issue 181: Faster create_connection()" changeset, it was a mistake. files: Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/selector_events.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - waiter.set_result(None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - waiter.set_result(None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): if self._closing: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 18:09:37 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 18:09:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h6Wv55fHCz7LmQ@mail.python.org> http://hg.python.org/cpython/rev/4813498eda65 changeset: 91586:4813498eda65 parent: 91584:996b232cbdc4 parent: 91585:f59e0d618be2 user: Victor Stinner date: Mon Jul 07 18:08:57 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip Backout the "Tulip issue 181: Faster create_connection()" changeset, it was a mistake. files: Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/selector_events.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,7 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - waiter.set_result(None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): self._extra['pipe'] = sock diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -481,7 +481,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: - waiter.set_result(None) + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): if self._closing: -- Repository URL: http://hg.python.org/cpython From tjreedy at udel.edu Mon Jul 7 18:00:01 2014 From: tjreedy at udel.edu (Terry Reedy) Date: Mon, 07 Jul 2014 12:00:01 -0400 Subject: [Python-checkins] cpython (3.4): Issue #21881: Be more tolerant in test_tcl to not parsable by float() NaN In-Reply-To: <3h6Nmc1Q48z7Ll7@mail.python.org> References: <3h6Nmc1Q48z7Ll7@mail.python.org> Message-ID: <53BAC401.80603@udel.edu> On 7/7/2014 6:48 AM, serhiy.storchaka wrote: > http://hg.python.org/cpython/rev/4879f6337ef6 > changeset: 91569:4879f6337ef6 > branch: 3.4 > parent: 91540:c76ab5f4fcc1 > user: Serhiy Storchaka > date: Mon Jul 07 13:44:33 2014 +0300 > summary: > Issue #21881: Be more tolerant in test_tcl to not parsable by float() NaN > representations (on mips and m68k platforms). > > files: > Lib/test/test_tcl.py | 12 ++++++------ > 1 files changed, 6 insertions(+), 6 deletions(-) > > > diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py > --- a/Lib/test/test_tcl.py > +++ b/Lib/test/test_tcl.py > @@ -406,8 +406,9 @@ > self.assertEqual(passValue(float('inf')), float('inf')) > self.assertEqual(passValue(-float('inf')), -float('inf')) > else: > - f = float(passValue(float('nan'))) > - self.assertNotEqual(f, f) > + f = passValue(float('nan')) > + self.assertIsInstance(f, str) > + self.assertEqual(f.lower()[:3], 'nan') > self.assertEqual(float(passValue(float('inf'))), float('inf')) > self.assertEqual(float(passValue(-float('inf'))), -float('inf')) > self.assertEqual(passValue((1, '2', (3.4,))), > @@ -431,9 +432,8 @@ > expected = float(expected) > self.assertAlmostEqual(float(actual), expected, > delta=abs(expected) * 1e-10) > - def nan_eq(actual, expected): > - actual = float(actual) > - self.assertNotEqual(actual, actual) > + def starts_with(actual, expected): > + self.assertEqual(actual.lower()[:len(expected)], expected) > > check(True, '1') > check(False, '0') > @@ -456,7 +456,7 @@ > check(f, f, eq=float_eq) > check(float('inf'), 'Inf', eq=float_eq) > check(-float('inf'), '-Inf', eq=float_eq) > - check(float('nan'), 'NaN', eq=nan_eq) > + check(float('nan'), 'nan', eq=starts_with) > check((), '') > check((1, (2,), (3, 4), '5 6', ()), '1 2 {3 4} {5 6} {}') Some of these changes seem sufficiently non-obvious (to anyone but you now) to warrant a note, "# see issue 21881 for NaN tests" somewhere, when you next edit the file. From python-checkins at python.org Mon Jul 7 20:30:45 2014 From: python-checkins at python.org (berker.peksag) Date: Mon, 7 Jul 2014 20:30:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzA3?= =?utf-8?q?=3A_Fix_tests_on_Windows=2E?= Message-ID: <3h6b1x2VpXz7LsN@mail.python.org> http://hg.python.org/cpython/rev/f8deaac44ed4 changeset: 91587:f8deaac44ed4 branch: 3.4 parent: 91585:f59e0d618be2 user: Berker Peksag date: Mon Jul 07 21:29:50 2014 +0300 summary: Issue #21707: Fix tests on Windows. files: Lib/test/test_modulefinder.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -316,7 +316,7 @@ self._do_test(maybe_test, debug=2, replace_paths=[(old_path, new_path)]) output = output.getvalue() - expected = "co_filename '%s' changed to '%s'" % (old_path, new_path) + expected = "co_filename %r changed to %r" % (old_path, new_path) self.assertIn(expected, output) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 20:30:46 2014 From: python-checkins at python.org (berker.peksag) Date: Mon, 7 Jul 2014 20:30:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321707=3A_Merge_with_3=2E4=2E?= Message-ID: <3h6b1y41t9z7Lts@mail.python.org> http://hg.python.org/cpython/rev/e66c387da81b changeset: 91588:e66c387da81b parent: 91586:4813498eda65 parent: 91587:f8deaac44ed4 user: Berker Peksag date: Mon Jul 07 21:30:54 2014 +0300 summary: Issue #21707: Merge with 3.4. files: Lib/test/test_modulefinder.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_modulefinder.py b/Lib/test/test_modulefinder.py --- a/Lib/test/test_modulefinder.py +++ b/Lib/test/test_modulefinder.py @@ -316,7 +316,7 @@ self._do_test(maybe_test, debug=2, replace_paths=[(old_path, new_path)]) output = output.getvalue() - expected = "co_filename '%s' changed to '%s'" % (old_path, new_path) + expected = "co_filename %r changed to %r" % (old_path, new_path) self.assertIn(expected, output) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 20:41:41 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 20:41:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321907=3A_Improved?= =?utf-8?q?_the_batch_scripts_provided_for_building_Python=2E?= Message-ID: <3h6bGY4d0Rz7Llr@mail.python.org> http://hg.python.org/cpython/rev/c3022e2606df changeset: 91589:c3022e2606df user: Zachary Ware date: Mon Jul 07 13:39:59 2014 -0500 summary: Issue #21907: Improved the batch scripts provided for building Python. The user-facing scripts in PCbuild have been updated to be easier to use and the buildbot scripts in Tools\buildbot have been updated to use the user-facing scripts in PCbuild wherever possible. files: Misc/NEWS | 2 + PCbuild/build.bat | 27 +++- PCbuild/build_pgo.bat | 12 +- PCbuild/env.bat | 6 +- PCbuild/get_externals.bat | 100 +++++++++++++++++ PCbuild/readme.txt | 57 ++++++-- Tools/buildbot/build-amd64.bat | 6 +- Tools/buildbot/build.bat | 18 ++- Tools/buildbot/buildmsi.bat | 15 +- Tools/buildbot/clean-amd64.bat | 10 +- Tools/buildbot/clean.bat | 30 +++- Tools/buildbot/external-amd64.bat | 8 +- Tools/buildbot/external-common.bat | 47 ------- Tools/buildbot/external.bat | 7 +- Tools/buildbot/test-amd64.bat | 6 +- Tools/buildbot/test.bat | 6 +- Tools/scripts/run_tests.py | 6 +- 17 files changed, 230 insertions(+), 133 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -746,6 +746,8 @@ Windows ------- +- Issue #21907: Improved the batch scripts provided for building Python. + - Issue #21671, CVE-2014-0224: The bundled version of OpenSSL has been updated to 1.0.1h. diff --git a/PCbuild/build.bat b/PCbuild/build.bat --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -1,19 +1,34 @@ @echo off -rem A batch program to build or rebuild a particular configuration. +rem A batch program to build or rebuild a particular configuration, rem just for convenience. +rem Arguments: +rem -c Set the configuration (default: Release) +rem -p Set the platform (x64 or Win32, default: Win32) +rem -r Target Rebuild instead of Build +rem -d Set the configuration to Debug +rem -e Pull in external libraries using get_externals.bat + setlocal set platf=Win32 set conf=Release -set target=build +set target=Build set dir=%~dp0 :CheckOpts if "%1"=="-c" (set conf=%2) & shift & shift & goto CheckOpts if "%1"=="-p" (set platf=%2) & shift & shift & goto CheckOpts -if "%1"=="-r" (set target=rebuild) & shift & goto CheckOpts +if "%1"=="-r" (set target=Rebuild) & shift & goto CheckOpts if "%1"=="-d" (set conf=Debug) & shift & goto CheckOpts +if "%1"=="-e" call "%dir%get_externals.bat" & shift & goto CheckOpts -set cmd=msbuild /p:useenv=true %dir%pcbuild.sln /t:%target% /p:Configuration=%conf% /p:Platform=%platf% -echo %cmd% -%cmd% +if "%platf%"=="x64" (set vs_platf=x86_amd64) + +rem Setup the environment +call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" %vs_platf% + +rem Call on MSBuild to do the work, echo the command. +rem Passing %1-9 is not the preferred option, but argument parsing in +rem batch is, shall we say, "lackluster" +echo on +msbuild "%dir%pcbuild.sln" /t:%target% /p:Configuration=%conf% /p:Platform=%platf% %1 %2 %3 %4 %5 %6 %7 %8 %9 diff --git a/PCbuild/build_pgo.bat b/PCbuild/build_pgo.bat --- a/PCbuild/build_pgo.bat +++ b/PCbuild/build_pgo.bat @@ -9,12 +9,12 @@ set platf=Win32 rem use the performance testsuite. This is quick and simple -set job1=..\tools\pybench\pybench.py -n 1 -C 1 --with-gc -set path1=..\tools\pybench +set job1=%~dp0..\tools\pybench\pybench.py -n 1 -C 1 --with-gc +set path1=%~dp0..\tools\pybench rem or the whole testsuite for more thorough testing -set job2=..\lib\test\regrtest.py -set path2=..\lib +set job2=%~dp0..\lib\test\regrtest.py +set path2=%~dp0..\lib set job=%job1% set clrpath=%path1% @@ -31,9 +31,9 @@ call build -p %platf% -c PGInstrument rem remove .pyc files, .pgc files and execute the job -%PGI%\python.exe rmpyc.py %clrpath% +%PGI%\python.exe rmpyc.py "%clrpath%" del %PGI%\*.pgc -%PGI%\python.exe %job% +%PGI%\python.exe "%job%" rem finally build the optimized version if exist %PGO% del /s /q %PGO% diff --git a/PCbuild/env.bat b/PCbuild/env.bat --- a/PCbuild/env.bat +++ b/PCbuild/env.bat @@ -1,9 +1,5 @@ @echo off -set VS10=%ProgramFiles(x86)%\Microsoft Visual Studio 10.0 -IF EXIST "%VS10%" GOTO ok -set VS10=%ProgramFiles%\Microsoft Visual Studio 10.0 -:ok echo Build environments: x86, ia64, amd64, x86_amd64, x86_ia64 echo. -call "%VS10%\VC\vcvarsall.bat" %1 +call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" %1 diff --git a/PCbuild/get_externals.bat b/PCbuild/get_externals.bat new file mode 100644 --- /dev/null +++ b/PCbuild/get_externals.bat @@ -0,0 +1,100 @@ + at echo off +setlocal +rem Simple script to fetch source for external libraries + +pushd "%~dp0..\.." + +if "%SVNROOT%"=="" set SVNROOT=http://svn.python.org/projects/external/ + +rem Optionally clean up first. Be warned that this can be very destructive! +if not "%1"=="" ( + for %%c in (-c --clean --clean-only) do ( + if "%1"=="%%c" goto clean + ) + goto usage +) +goto fetch + +:clean +echo.Cleaning up external libraries. +for /D %%d in ( + bzip2-* + db-* + openssl-* + tcl-* + tcltk* + tk-* + tix-* + sqlite-* + xz-* + ) do ( + echo.Removing %%d + rmdir /s /q %%d +) +if "%1"=="--clean-only" ( + goto end +) + +:fetch +rem Fetch current versions + +svn --version > nul 2>&1 +if ERRORLEVEL 9009 ( + echo.svn.exe must be on your PATH. + echo.Try TortoiseSVN (http://tortoisesvn.net/^) and be sure to check the + echo.command line tools option. + popd + exit /b 1 +) + +echo.Fetching external libraries... + +for %%e in ( + bzip2-1.0.6 + openssl-1.0.1h + tcl-8.6.1.0 + tk-8.6.1.0 + tix-8.4.3.4 + sqlite-3.8.3.1 + xz-5.0.5 + ) do ( + if exist %%e ( + echo.%%e already exists, skipping. + ) else ( + echo.Fetching %%e... + svn export %SVNROOT%%%e + ) +) + +goto end + +:usage +echo.invalid argument: %1 +echo.usage: %~n0 [[ -c ^| --clean ] ^| --clean-only ] +echo. +echo.Pull all sources necessary for compiling optional extension modules +echo.that rely on external libraries. Requires svn.exe to be on your PATH +echo.and pulls sources from %SVNROOT%. +echo. +echo.Use the -c or --clean option to clean up all external library sources +echo.before pulling in the current versions. +echo. +echo.Use the --clean-only option to do the same cleaning, without pulling in +echo.anything new. +echo. +echo.Only the first argument is checked, all others are ignored. +echo. +echo.**WARNING**: the cleaning options unconditionally remove any directory +echo.that is a child of +echo. %CD% +echo.and matches wildcard patterns beginning with bzip2-, db-, openssl-, tcl-, +echo.tcltk, tk-, tix-, sqlite-, or xz-, and as such has the potential to be +echo.very destructive if you are not aware of what it is doing. Use with +echo.caution! +popd +exit /b -1 + + +:end +echo Finished. +popd diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -1,3 +1,13 @@ +Quick Start Guide +----------------- + +1. Install Microsoft Visual C++ 2010 SP1, any edition. +2. Install Subversion, and make sure 'svn.exe' is on your PATH. +3. Install NASM, and make sure 'nasm.exe' is on your PATH. +4. Run "build.bat -e" to build Python in 32-bit Release configuration. +5. (Optional, but recommended) Run the test suite with "rt.bat -q". + + Building Python using Microsoft Visual C++ ------------------------------------------ @@ -24,8 +34,8 @@ Studio, select the desired combination of configuration and platform, then build with "Build Solution" or the F7 keyboard shortcut. You can also build from the command line using the "build.bat" script in this -directory. The solution is configured to build the projects in the -correct order. +directory; see below for details. The solution is configured to build +the projects in the correct order. The solution currently supports two platforms. The Win32 platform is used to build standard x86-compatible 32-bit binaries, output into this @@ -56,6 +66,26 @@ settings, though without PGO. +Building Python using the build.bat script +---------------------------------------------- + +In this directory you can find build.bat, a script designed to make +building Python on Windows simpler. The only absolute requirement for +using this script is for the VS100COMNTOOLS environment variable to be +properly set, which should be done by Microsoft Visual C++ 2010 +installation. + +By default, build.bat will build Python in Release configuration for +the 32-bit Win32 platform. It accepts several arguments to change +this behavior: + + -c Set the configuration (see above) + -d Shortcut for "-c Debug" + -p Set the platform to build for ("Win32" or "x64") + -r Rebuild instead of just building + -e Use get_externals.bat to fetch external sources + + Legacy support -------------- @@ -227,25 +257,18 @@ The last category of sub-projects listed above wrap external projects Python doesn't control, and as such a little more work is required in order to download the relevant source files for each project before they -can be built. The buildbots must ensure that all libraries are present -before building, so the easiest approach is to run either external.bat -or external-amd64.bat (depending on platform) in the ..\Tools\buildbot -directory from ..\, i.e.: - - C:\python\cpython\PCbuild>cd .. - C:\python\cpython>Tools\buildbot\external.bat - -This extracts all the external sub-projects from +can be built. However, a simple script is provided to make this as +painless as possible, called "get_externals.bat" and located in this +directory. This script extracts all the external sub-projects from http://svn.python.org/projects/external -via Subversion (so you'll need an svn.exe on your PATH) and places them +via Subversion (so you'll need svn.exe on your PATH) and places them in ..\.. (relative to this directory). It is also possible to download sources from each project's homepage, -though you may have to change the names of some folders in order to make -things work. For instance, if you were to download a version 5.0.7 of -XZ Utils, you would need to extract the archive into ..\..\xz-5.0.5 -anyway, since that is where the solution is set to look for xz. The -same is true for all other external projects. +though you may have to change folder names or pass the names to MSBuild +as the values of certain properties in order for the build solution to +find them. This is an advanced topic and not necessarily fully +supported. Building for AMD64 diff --git a/Tools/buildbot/build-amd64.bat b/Tools/buildbot/build-amd64.bat --- a/Tools/buildbot/build-amd64.bat +++ b/Tools/buildbot/build-amd64.bat @@ -1,6 +1,2 @@ @rem Used by the buildbot "compile" step. -cmd /c Tools\buildbot\external-amd64.bat -call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64 -cmd /c Tools\buildbot\clean-amd64.bat - -msbuild PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=x64 +call "%~dp0build.bat" -p x64 %* diff --git a/Tools/buildbot/build.bat b/Tools/buildbot/build.bat --- a/Tools/buildbot/build.bat +++ b/Tools/buildbot/build.bat @@ -1,7 +1,17 @@ @rem Used by the buildbot "compile" step. -cmd /c Tools\buildbot\external.bat -call "%VS100COMNTOOLS%vsvars32.bat" -cmd /c Tools\buildbot\clean.bat -msbuild PCbuild\pcbuild.sln /p:Configuration=Debug /p:Platform=Win32 + at rem Clean up +call "%~dp0clean.bat" + at rem If you need the buildbots to start fresh (such as when upgrading to + at rem a new version of an external library, especially Tcl/Tk): + at rem 1) uncomment the following line: + + at rem call "%~dp0..\..\PCbuild\get_externals.bat" --clean-only + + at rem 2) commit and push + at rem 3) wait for all Windows bots to start a build with that changeset + at rem 4) re-comment, commit and push again + + at rem Do the build +call "%~dp0..\..\PCbuild\build.bat" -e -d %* diff --git a/Tools/buildbot/buildmsi.bat b/Tools/buildbot/buildmsi.bat --- a/Tools/buildbot/buildmsi.bat +++ b/Tools/buildbot/buildmsi.bat @@ -1,21 +1,20 @@ @rem Used by the buildbot "buildmsi" step. +setlocal -cmd /c Tools\buildbot\external.bat +set cwd=%CD% @rem build release versions of things -call "%VS100COMNTOOLS%vsvars32.bat" - - at rem build Python -msbuild /p:useenv=true PCbuild\pcbuild.sln /p:Configuration=Release /p:Platform=Win32 +call "%~dp0build.bat" -c Release @rem build the documentation -bash.exe -c 'cd Doc;make PYTHON=python2.5 update htmlhelp' -"%ProgramFiles%\HTML Help Workshop\hhc.exe" Doc\build\htmlhelp\python26a3.hhp +call "%~dp0..\..\Doc\make.bat" htmlhelp @rem build the MSI file -cd PC +call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x86 +cd "%~dp0..\..\PC" nmake /f icons.mak cd ..\Tools\msi del *.msi nmake /f msisupport.mak %HOST_PYTHON% msi.py +cd "%cwd%" diff --git a/Tools/buildbot/clean-amd64.bat b/Tools/buildbot/clean-amd64.bat --- a/Tools/buildbot/clean-amd64.bat +++ b/Tools/buildbot/clean-amd64.bat @@ -1,10 +1,2 @@ @rem Used by the buildbot "clean" step. -call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" x86_amd64 - at echo Deleting .pyc/.pyo files ... -del /s Lib\*.pyc Lib\*.pyo - at echo Deleting test leftovers ... -rmdir /s /q build -cd PCbuild -msbuild /target:clean pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x64 -msbuild /target:clean pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x64 -cd .. +call "%~dp0clean.bat" diff --git a/Tools/buildbot/clean.bat b/Tools/buildbot/clean.bat --- a/Tools/buildbot/clean.bat +++ b/Tools/buildbot/clean.bat @@ -1,8 +1,22 @@ - at rem Used by the buildbot "clean" step. -call "%VS100COMNTOOLS%vsvars32.bat" - at echo Deleting test leftovers ... -rmdir /s /q build -cd PCbuild -msbuild /target:clean pcbuild.sln /p:Configuration=Release /p:PlatformTarget=x86 -msbuild /target:clean pcbuild.sln /p:Configuration=Debug /p:PlatformTarget=x86 -cd .. + at echo off +rem Used by the buildbot "clean" step. + +setlocal +set root=%~dp0..\.. +set pcbuild=%root%\PCbuild + +echo.Attempting to kill Pythons... +for %%k in (kill_python.exe + kill_python_d.exe + amd64\kill_python.exe + amd64\kill_python_d.exe + ) do ( + if exist "%pcbuild%\%%k" ( + echo.Calling %pcbuild%\%%k... + "%pcbuild%\%%k" + ) +) + +echo Purging all non-tracked files with `hg purge` +echo on +hg -R "%root%" --config extensions.purge= purge --all -X "%root%\Lib\test\data" diff --git a/Tools/buildbot/external-amd64.bat b/Tools/buildbot/external-amd64.bat --- a/Tools/buildbot/external-amd64.bat +++ b/Tools/buildbot/external-amd64.bat @@ -1,6 +1,2 @@ - at rem Fetches (and builds if necessary) external dependencies - - at rem Assume we start inside the Python source directory -call "Tools\buildbot\external-common.bat" - - + at echo Please use PCbuild\get_externals.bat instead. +@"%~dp0..\..\PCbuild\get_externals.bat" %* diff --git a/Tools/buildbot/external-common.bat b/Tools/buildbot/external-common.bat deleted file mode 100644 --- a/Tools/buildbot/external-common.bat +++ /dev/null @@ -1,47 +0,0 @@ - at rem Common file shared between external.bat and external-amd64.bat. Responsible for - at rem fetching external components into the root\.. buildbot directories. - -cd .. - at rem XXX: If you need to force the buildbots to start from a fresh environment, uncomment - at rem the following, check it in, then check it out, comment it out, then check it back in. - at rem if exist bzip2-1.0.6 rd /s/q bzip2-1.0.6 - at rem if exist tcltk rd /s/q tcltk - at rem if exist tcltk64 rd /s/q tcltk64 - at rem if exist tcl-8.6.1.0 rd /s/q tcl-8.6.1.0 - at rem if exist tk-8.6.1.0 rd /s/q tk-8.6.1.0 - at rem if exist tix-8.4.3.4 rd /s/q tix-8.4.3.4 - at rem if exist db-4.4.20 rd /s/q db-4.4.20 - at rem if exist openssl-1.0.1h rd /s/q openssl-1.0.1h - at rem if exist sqlite-3.7.12 rd /s/q sqlite-3.7.12 - - at rem bzip -if not exist bzip2-1.0.6 ( - rd /s/q bzip2-1.0.5 - svn export http://svn.python.org/projects/external/bzip2-1.0.6 -) - - at rem OpenSSL -if not exist openssl-1.0.1h ( - rd /s/q openssl-1.0.1g - svn export http://svn.python.org/projects/external/openssl-1.0.1h -) - - at rem tcl/tk/tix -if not exist tcl-8.6.1.0 ( - rd /s/q tcltk tcltk64 tcl-8.5.11.0 tk-8.5.11.0 tix-8.4.3.3 - svn export http://svn.python.org/projects/external/tcl-8.6.1.0 -) -if not exist tk-8.6.1.0 svn export http://svn.python.org/projects/external/tk-8.6.1.0 -if not exist tix-8.4.3.4 svn export http://svn.python.org/projects/external/tix-8.4.3.4 - - at rem sqlite3 -if not exist sqlite-3.8.3.1 ( - rd /s/q sqlite-source-3.8.1 - svn export http://svn.python.org/projects/external/sqlite-3.8.3.1 -) - - at rem lzma -if not exist xz-5.0.5 ( - rd /s/q xz-5.0.3 - svn export http://svn.python.org/projects/external/xz-5.0.5 -) diff --git a/Tools/buildbot/external.bat b/Tools/buildbot/external.bat --- a/Tools/buildbot/external.bat +++ b/Tools/buildbot/external.bat @@ -1,5 +1,2 @@ - at rem Fetches (and builds if necessary) external dependencies - - at rem Assume we start inside the Python source directory -call "Tools\buildbot\external-common.bat" - + at echo Please use PCbuild\get_externals.bat instead. +@"%~dp0..\..\PCbuild\get_externals.bat" %* diff --git a/Tools/buildbot/test-amd64.bat b/Tools/buildbot/test-amd64.bat --- a/Tools/buildbot/test-amd64.bat +++ b/Tools/buildbot/test-amd64.bat @@ -1,6 +1,6 @@ @rem Used by the buildbot "test" step. rem The following line should be removed before #20035 is closed -set TCL_LIBRARY=%CD%\..\tcltk64\lib\tcl8.6 -cd PCbuild -call rt.bat -d -q -x64 -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9 +set TCL_LIBRARY=%~dp0..\..\..\tcltk64\lib\tcl8.6 + +"%~dp0..\..\PCbuild\amd64\python_d.exe" "%~dp0..\scripts\run_tests.py" -j 1 -u all -W --timeout=3600 %* diff --git a/Tools/buildbot/test.bat b/Tools/buildbot/test.bat --- a/Tools/buildbot/test.bat +++ b/Tools/buildbot/test.bat @@ -1,6 +1,6 @@ @rem Used by the buildbot "test" step. rem The following line should be removed before #20035 is closed -set TCL_LIBRARY=%CD%\..\tcltk\lib\tcl8.6 -cd PCbuild -call rt.bat -d -q -uall -rwW -n --timeout=3600 %1 %2 %3 %4 %5 %6 %7 %8 %9 +set TCL_LIBRARY=%~dp0..\..\..\tcltk\lib\tcl8.6 + +"%~dp0..\..\PCbuild\python_d.exe" "%~dp0..\scripts\run_tests.py" -j 1 -u all -W --timeout=3600 %* 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 @@ -48,7 +48,11 @@ args.extend(['-u', 'all,-largefile,-audio,-gui']) args.extend(regrtest_args) print(' '.join(args)) - os.execv(sys.executable, args) + if sys.platform == 'win32': + from subprocess import call + call(args) + else: + os.execv(sys.executable, args) if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 20:45:45 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 20:45:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Issue_=2321907=3A_Update_?= =?utf-8?q?the_instructions_for_building_on_Windows?= Message-ID: <3h6bMF1yGCz7LrM@mail.python.org> http://hg.python.org/devguide/rev/ed3fa77804f8 changeset: 706:ed3fa77804f8 user: Zachary Ware date: Mon Jul 07 13:45:36 2014 -0500 summary: Issue #21907: Update the instructions for building on Windows files: index.rst | 13 +++++-------- setup.rst | 15 +++++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/index.rst b/index.rst --- a/index.rst +++ b/index.rst @@ -18,17 +18,14 @@ hg clone http://hg.python.org/cpython -2. :ref:`Build Python `. On :ref:`UNIX `:: +2. :ref:`Build Python `. On all platforms, install build + dependencies (such as compilers), then on :ref:`UNIX `:: ./configure --with-pydebug && make -j2 - On :ref:`Windows `, open the solution file - :file:`PCbuild\\pcbuild.sln` in Visual Studio, select :menuselection:`Debug`, - and :menuselection:`Build --> Build Solution`. Run - :file:`Tools\\buildbot\\external.bat` or - :file:`Tools\\buildbot\\external-amd64.bat` to download and compile 3rd - party libraries. Note: Visual Studio may throw errors, but Python will - be built. + On :ref:`Windows `:: + + PCbuild\build.bat -e -d 3. :doc:`Run the tests `:: diff --git a/setup.rst b/setup.rst --- a/setup.rst +++ b/setup.rst @@ -25,7 +25,8 @@ command line program is named ``hg``; this is also used to refer to Mercurial itself. Mercurial is easily available for common Unix systems by way of the standard package manager; under Windows, you might want to use the -`TortoiseHg `_ graphical client. +`TortoiseHg `_ graphical client, but the build system +still prefers :file:`hg.exe` to be on your PATH. .. _checkout: @@ -221,8 +222,9 @@ Windows ''''''' -The readme included in the solution has more details, especially on the -software needed to resolve the below mentioned build errors. +The `readme `_ +included in the solution has more details, especially on what additional +software is required to build which parts of Python. **Python 3.3** and later use Microsoft Visual Studio 2010. You can download Microsoft Visual C++ 2010 Express `from Microsoft's site @@ -261,9 +263,8 @@ to build. If you prefer, you can exclude the offending projects from the build process by unchecking them inside the :menuselection:`Build --> Configuration Manager...` settings. You can -also use the script :file:`Tools\\buildbot\\external.bat` or -:file:`Tools\\buildbot\\external-amd64.bat` (as applicable) to download and -compile missing dependencies. +also use the script :file:`PCbuild\\get_externals.bat` to download missing +dependencies. Once built you might want to set Python as a startup project. Pressing F5 in Visual Studio, or choosing Start Debugging from the Debug menu, will launch @@ -276,6 +277,8 @@ have to invoke ``PCBuild\python_d.exe``, for a 64-bit build in debug mode, ``PCBuild\amd64\python_d.exe``. If you are compiling in release mode (which you shouldn't, in general), replace ``python_d.exe`` with ``python.exe``. +You can also invoke the most recently built interpreter using ``python.bat`` +in the root of the source tree. .. _build_troubleshooting: -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Mon Jul 7 21:32:13 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 21:32:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_MSVC_editi?= =?utf-8?q?on_mismatch=2E?= Message-ID: <3h6cNs1tLsz7LkZ@mail.python.org> http://hg.python.org/cpython/rev/0f6ab6add658 changeset: 91590:0f6ab6add658 branch: 3.4 parent: 91587:f8deaac44ed4 user: Zachary Ware date: Mon Jul 07 14:31:34 2014 -0500 summary: Fix MSVC edition mismatch. files: PCbuild/readme.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -46,7 +46,7 @@ development of CPython, you will most likely use this configuration. PGInstrument, PGUpdate Used to build Python in Release configuration using PGO, which - requires Professional Edition of Visual Studio. See the "Profile + requires Premium Edition of Visual Studio. See the "Profile Guided Optimization" section below for more information. Build output from each of these configurations lands in its own sub-directory of this directory. The official Python releases are -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 21:32:14 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 21:32:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h6cNt4L1zz7LkZ@mail.python.org> http://hg.python.org/cpython/rev/1cd04dd9ecf1 changeset: 91591:1cd04dd9ecf1 parent: 91589:c3022e2606df parent: 91590:0f6ab6add658 user: Zachary Ware date: Mon Jul 07 14:31:58 2014 -0500 summary: Merge with 3.4 files: PCbuild/readme.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -56,7 +56,7 @@ development of CPython, you will most likely use this configuration. PGInstrument, PGUpdate Used to build Python in Release configuration using PGO, which - requires Professional Edition of Visual Studio. See the "Profile + requires Premium Edition of Visual Studio. See the "Profile Guided Optimization" section below for more information. Build output from each of these configurations lands in its own sub-directory of this directory. The official Python releases are -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 21:35:50 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 21:35:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE3ODQ2?= =?utf-8?q?=3A_Clarify_note_about_Solution_Folders=2E?= Message-ID: <3h6cT24Kl1z7Llf@mail.python.org> http://hg.python.org/cpython/rev/bb3f1afcd082 changeset: 91592:bb3f1afcd082 branch: 3.4 parent: 91590:0f6ab6add658 user: Zachary Ware date: Mon Jul 07 14:33:24 2014 -0500 summary: Issue #17846: Clarify note about Solution Folders. Initial patch by Kathleen Weaver. files: PCbuild/readme.txt | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -9,8 +9,11 @@ Visual C++ 2010 Express Edition Required for building 32-bit Debug and Release configuration builds. - This edition does not support "solution folders", which pcbuild.sln - uses; this will not prevent building. + The Python build solution pcbuild.sln makes use of Solution Folders, + which this edition does not support. Any time pcbuild.sln is opened + or reloaded by Visual C++, a warning about Solution Folders will be + displayed which can be safely dismissed with no impact on your + ability to build Python. Visual Studio 2010 Professional Edition Required for building 64-bit Debug and Release configuration builds Visual Studio 2010 Premium Edition -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 21:35:51 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 21:35:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2317846=3A_Merge_with_3=2E4?= Message-ID: <3h6cT361mcz7Lqr@mail.python.org> http://hg.python.org/cpython/rev/39f9cd7ad19a changeset: 91593:39f9cd7ad19a parent: 91591:1cd04dd9ecf1 parent: 91592:bb3f1afcd082 user: Zachary Ware date: Mon Jul 07 14:35:02 2014 -0500 summary: Issue #17846: Merge with 3.4 files: PCbuild/readme.txt | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -19,8 +19,11 @@ Visual C++ 2010 Express Edition Required for building 32-bit Debug and Release configuration builds. - This edition does not support "solution folders", which pcbuild.sln - uses; this will not prevent building. + The Python build solution pcbuild.sln makes use of Solution Folders, + which this edition does not support. Any time pcbuild.sln is opened + or reloaded by Visual C++, a warning about Solution Folders will be + displayed which can be safely dismissed with no impact on your + ability to build Python. Visual Studio 2010 Professional Edition Required for building 64-bit Debug and Release configuration builds Visual Studio 2010 Premium Edition -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 21:47:50 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 21:47:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Issue_=2317846=3A_Add_a_n?= =?utf-8?q?ote_about_solution_folders_with_VS_Express=2E?= Message-ID: <3h6ckt4Lyfz7Lnf@mail.python.org> http://hg.python.org/devguide/rev/369891476cf8 changeset: 707:369891476cf8 user: Zachary Ware date: Mon Jul 07 14:47:31 2014 -0500 summary: Issue #17846: Add a note about solution folders with VS Express. Initial patch by Kathleen Weaver. files: setup.rst | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/setup.rst b/setup.rst --- a/setup.rst +++ b/setup.rst @@ -250,6 +250,10 @@ `_ and `here (2010) `_. +Because the Python solution file uses Solution Folders, VS Express will warn +you about using solution folders every time you open the ``pcbuild.sln`` file. +You can safely dismiss the warning with no impact on your ability to build +Python. To build from the Visual Studio GUI, open the ``pcbuild.sln`` solution file with Visual Studio. Choose the :menuselection:`Build Solution` option -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Mon Jul 7 21:53:27 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 21:53:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzgx?= =?utf-8?q?=2C_=5Fssl=3A_Fix_asn1obj2py=28=29_on_Windows_64-bit=2C_=22s=23?= =?utf-8?q?=22_format_requires?= Message-ID: <3h6csM0PW5z7Lnf@mail.python.org> http://hg.python.org/cpython/rev/34a0d98c51ea changeset: 91594:34a0d98c51ea branch: 3.4 parent: 91592:bb3f1afcd082 user: Victor Stinner date: Mon Jul 07 21:52:29 2014 +0200 summary: Issue #21781, _ssl: Fix asn1obj2py() on Windows 64-bit, "s#" format requires size to be a Py_ssize_t, not an int. _ssl.c is now "Py_ssize_t clean". 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 @@ -3416,7 +3416,7 @@ int nid; const char *ln, *sn; char buf[100]; - int buflen; + Py_ssize_t buflen; nid = OBJ_obj2nid(obj); if (nid == NID_undef) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 21:53:28 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 21:53:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzIxNzgxLCBfc3NsOiBGaXggYXNuMW9i?= =?utf-8?q?j2py=28=29_on_Windows_64-bit=2C_=22s=23=22_format?= Message-ID: <3h6csP2xh2z7Lnf@mail.python.org> http://hg.python.org/cpython/rev/1dca2e7ad5ad changeset: 91595:1dca2e7ad5ad parent: 91593:39f9cd7ad19a parent: 91594:34a0d98c51ea user: Victor Stinner date: Mon Jul 07 21:52:49 2014 +0200 summary: (Merge 3.4) Issue #21781, _ssl: Fix asn1obj2py() on Windows 64-bit, "s#" format requires size to be a Py_ssize_t, not an int. _ssl.c is now "Py_ssize_t clean". 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 @@ -3414,7 +3414,7 @@ int nid; const char *ln, *sn; char buf[100]; - int buflen; + Py_ssize_t buflen; nid = OBJ_obj2nid(obj); if (nid == NID_undef) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 22:11:23 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 22:11:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321907=3A_Exit_wit?= =?utf-8?q?h_the_correct_return_code?= Message-ID: <3h6dG351W1z7Lnl@mail.python.org> http://hg.python.org/cpython/rev/f0a5be139717 changeset: 91596:f0a5be139717 user: Zachary Ware date: Mon Jul 07 15:07:46 2014 -0500 summary: Issue #21907: Exit with the correct return code 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 @@ -50,7 +50,7 @@ print(' '.join(args)) if sys.platform == 'win32': from subprocess import call - call(args) + sys.exit(call(args)) else: os.execv(sys.executable, args) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 22:31:49 2014 From: python-checkins at python.org (zach.ware) Date: Mon, 7 Jul 2014 22:31:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_typo_found?= =?utf-8?q?_by_Scott_Hinton_on_docs=40?= Message-ID: <3h6djd32Jkz7LnK@mail.python.org> http://hg.python.org/cpython/rev/8ebda8114e97 changeset: 91597:8ebda8114e97 branch: 2.7 parent: 91577:01ec8bb7187f user: Zachary Ware date: Mon Jul 07 15:31:21 2014 -0500 summary: Fix typo found by Scott Hinton on docs@ files: Doc/library/time.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -248,7 +248,7 @@ .. versionchanged:: 2.5 0 is now a legal argument for any position in the time tuple; if it is normally - illegal the value is forced to a correct one.. + illegal the value is forced to a correct one. The following directives can be embedded in the *format* string. They are shown without the optional field width and precision specification, and are replaced -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 23:07:54 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 23:07:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTI1?= =?utf-8?q?=3A_PyImport=5FCleanup=28=29=3A_Remove_unused_parameter_in?= Message-ID: <3h6fWG3LWQz7Ln4@mail.python.org> http://hg.python.org/cpython/rev/047da19efdab changeset: 91598:047da19efdab branch: 3.4 parent: 91594:34a0d98c51ea user: Victor Stinner date: Mon Jul 07 23:06:15 2014 +0200 summary: Issue #21925: PyImport_Cleanup(): Remove unused parameter in PySys_FormatStderr() call 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 @@ -460,7 +460,7 @@ while (PyDict_Next(modules, &pos, &key, &value)) { if (PyModule_Check(value)) { if (Py_VerboseFlag && PyUnicode_Check(key)) - PySys_FormatStderr("# cleanup[2] removing %U\n", key, value); + PySys_FormatStderr("# cleanup[2] removing %U\n", key); STORE_MODULE_WEAKREF(key, value); PyDict_SetItem(modules, key, Py_None); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 7 23:07:55 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 7 Jul 2014 23:07:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzIxOTI1OiBQeUltcG9ydF9DbGVhbnVw?= =?utf-8?q?=28=29=3A_Remove_unused_parameter_in?= Message-ID: <3h6fWH4nfrz7Lr2@mail.python.org> http://hg.python.org/cpython/rev/b255ecb175c4 changeset: 91599:b255ecb175c4 parent: 91596:f0a5be139717 parent: 91598:047da19efdab user: Victor Stinner date: Mon Jul 07 23:07:27 2014 +0200 summary: (Merge 3.4) Issue #21925: PyImport_Cleanup(): Remove unused parameter in PySys_FormatStderr() call 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 @@ -402,7 +402,7 @@ while (PyDict_Next(modules, &pos, &key, &value)) { if (PyModule_Check(value)) { if (Py_VerboseFlag && PyUnicode_Check(key)) - PySys_FormatStderr("# cleanup[2] removing %U\n", key, value); + PySys_FormatStderr("# cleanup[2] removing %U\n", key); STORE_MODULE_WEAKREF(key, value); PyDict_SetItem(modules, key, Py_None); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:01:56 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 00:01:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzEyNTIz?= =?utf-8?q?=3A_asynchat=2Easync=5Fchat=2Epush=28=29_now_raises_a_TypeError?= =?utf-8?q?_if_it_doesn=27t?= Message-ID: <3h6gjc5Wv6z7Lp7@mail.python.org> http://hg.python.org/cpython/rev/f8c9dd2626aa changeset: 91600:f8c9dd2626aa branch: 3.4 parent: 91598:047da19efdab user: Victor Stinner date: Tue Jul 08 00:00:30 2014 +0200 summary: Issue #12523: asynchat.async_chat.push() now raises a TypeError if it doesn't get a bytes string files: Lib/asynchat.py | 3 +++ Lib/test/test_asynchat.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -181,6 +181,9 @@ self.close() def push (self, data): + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError('data argument must be byte-ish (%r)', + type(data)) sabs = self.ac_out_buffer_size if len(data) > sabs: for i in range(0, len(data), sabs): diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -249,6 +249,22 @@ # (which could still result in the client not having received anything) self.assertGreater(len(s.buffer), 0) + def test_push(self): + # Issue #12523: push() should raise a TypeError if it doesn't get + # a bytes string + s, event = start_echo_server() + c = echo_client(b'\n', s.port) + data = b'bytes\n' + c.push(data) + c.push(bytearray(data)) + c.push(memoryview(data)) + self.assertRaises(TypeError, c.push, 10) + self.assertRaises(TypeError, c.push, 'unicode') + c.push(SERVER_QUIT) + asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) + s.join(timeout=TIMEOUT) + self.assertEqual(c.contents, [b'bytes', b'bytes', b'bytes']) + class TestAsynchat_WithPoll(TestAsynchat): usepoll = True diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #12523: asynchat.async_chat.push() now raises a TypeError if it doesn't + get a bytes string + - Issue #21707: Add missing kwonlyargcount argument to ModuleFinder.replace_paths_in_code(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:01:58 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 00:01:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzEyNTIzOiBhc3luY2hhdC5hc3luY19j?= =?utf-8?q?hat=2Epush=28=29_now_raises_a_TypeError_if?= Message-ID: <3h6gjf0BjXz7Lp7@mail.python.org> http://hg.python.org/cpython/rev/4b29d338cc41 changeset: 91601:4b29d338cc41 parent: 91599:b255ecb175c4 parent: 91600:f8c9dd2626aa user: Victor Stinner date: Tue Jul 08 00:01:28 2014 +0200 summary: (Merge 3.4) Issue #12523: asynchat.async_chat.push() now raises a TypeError if it doesn't get a bytes string files: Lib/asynchat.py | 3 +++ Lib/test/test_asynchat.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -181,6 +181,9 @@ self.close() def push (self, data): + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError('data argument must be byte-ish (%r)', + type(data)) sabs = self.ac_out_buffer_size if len(data) > sabs: for i in range(0, len(data), sabs): diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -250,6 +250,22 @@ # (which could still result in the client not having received anything) self.assertGreater(len(s.buffer), 0) + def test_push(self): + # Issue #12523: push() should raise a TypeError if it doesn't get + # a bytes string + s, event = start_echo_server() + c = echo_client(b'\n', s.port) + data = b'bytes\n' + c.push(data) + c.push(bytearray(data)) + c.push(memoryview(data)) + self.assertRaises(TypeError, c.push, 10) + self.assertRaises(TypeError, c.push, 'unicode') + c.push(SERVER_QUIT) + asyncore.loop(use_poll=self.usepoll, count=300, timeout=.01) + s.join(timeout=TIMEOUT) + self.assertEqual(c.contents, [b'bytes', b'bytes', b'bytes']) + class TestAsynchat_WithPoll(TestAsynchat): usepoll = True diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #12523: asynchat.async_chat.push() now raises a TypeError if it doesn't + get a bytes string + - Issue #21707: Add missing kwonlyargcount argument to ModuleFinder.replace_paths_in_code(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:19:46 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 00:19:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNoYXQ6IFBF?= =?utf-8?q?P8-ify_the_code?= Message-ID: <3h6h6B089dz7Lnp@mail.python.org> http://hg.python.org/cpython/rev/c8207b0148dc changeset: 91602:c8207b0148dc branch: 3.4 parent: 91600:f8c9dd2626aa user: Victor Stinner date: Tue Jul 08 00:16:54 2014 +0200 summary: asynchat: PEP8-ify the code files: Lib/asynchat.py | 94 ++++++++++++++------------ Lib/test/test_asynchat.py | 31 +++++--- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -49,22 +49,22 @@ from collections import deque -class async_chat (asyncore.dispatcher): +class async_chat(asyncore.dispatcher): """This is an abstract class. You must derive from this class, and add the two methods collect_incoming_data() and found_terminator()""" # these are overridable defaults - ac_in_buffer_size = 65536 - ac_out_buffer_size = 65536 + ac_in_buffer_size = 65536 + ac_out_buffer_size = 65536 # we don't want to enable the use of encoding by default, because that is a # sign of an application bug that we don't want to pass silently - use_encoding = 0 - encoding = 'latin-1' + use_encoding = 0 + encoding = 'latin-1' - def __init__ (self, sock=None, map=None): + def __init__(self, sock=None, map=None): # for string terminator matching self.ac_in_buffer = b'' @@ -76,7 +76,7 @@ # we toss the use of the "simple producer" and replace it with # a pure deque, which the original fifo was a wrapping of self.producer_fifo = deque() - asyncore.dispatcher.__init__ (self, sock, map) + asyncore.dispatcher.__init__(self, sock, map) def collect_incoming_data(self, data): raise NotImplementedError("must be implemented in subclass") @@ -92,13 +92,16 @@ def found_terminator(self): raise NotImplementedError("must be implemented in subclass") - def set_terminator (self, term): - "Set the input delimiter. Can be a fixed string of any length, an integer, or None" + def set_terminator(self, term): + """Set the input delimiter. + + Can be a fixed string of any length, an integer, or None. + """ if isinstance(term, str) and self.use_encoding: term = bytes(term, self.encoding) self.terminator = term - def get_terminator (self): + def get_terminator(self): return self.terminator # grab some more data from the socket, @@ -106,10 +109,10 @@ # check for the terminator, # if found, transition to the next state. - def handle_read (self): + def handle_read(self): try: - data = self.recv (self.ac_in_buffer_size) + data = self.recv(self.ac_in_buffer_size) except OSError as why: self.handle_error() return @@ -128,17 +131,17 @@ terminator = self.get_terminator() if not terminator: # no terminator, collect it all - self.collect_incoming_data (self.ac_in_buffer) + self.collect_incoming_data(self.ac_in_buffer) self.ac_in_buffer = b'' elif isinstance(terminator, int): # numeric terminator n = terminator if lb < n: - self.collect_incoming_data (self.ac_in_buffer) + self.collect_incoming_data(self.ac_in_buffer) self.ac_in_buffer = b'' self.terminator = self.terminator - lb else: - self.collect_incoming_data (self.ac_in_buffer[:n]) + self.collect_incoming_data(self.ac_in_buffer[:n]) self.ac_in_buffer = self.ac_in_buffer[n:] self.terminator = 0 self.found_terminator() @@ -155,32 +158,34 @@ if index != -1: # we found the terminator if index > 0: - # don't bother reporting the empty string (source of subtle bugs) - self.collect_incoming_data (self.ac_in_buffer[:index]) + # don't bother reporting the empty string + # (source of subtle bugs) + self.collect_incoming_data(self.ac_in_buffer[:index]) self.ac_in_buffer = self.ac_in_buffer[index+terminator_len:] - # This does the Right Thing if the terminator is changed here. + # This does the Right Thing if the terminator + # is changed here. self.found_terminator() else: # check for a prefix of the terminator - index = find_prefix_at_end (self.ac_in_buffer, terminator) + index = find_prefix_at_end(self.ac_in_buffer, terminator) if index: if index != lb: # we found a prefix, collect up to the prefix - self.collect_incoming_data (self.ac_in_buffer[:-index]) + self.collect_incoming_data(self.ac_in_buffer[:-index]) self.ac_in_buffer = self.ac_in_buffer[-index:] break else: # no prefix, collect it all - self.collect_incoming_data (self.ac_in_buffer) + self.collect_incoming_data(self.ac_in_buffer) self.ac_in_buffer = b'' - def handle_write (self): + def handle_write(self): self.initiate_send() - def handle_close (self): + def handle_close(self): self.close() - def push (self, data): + def push(self, data): if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError('data argument must be byte-ish (%r)', type(data)) @@ -192,11 +197,11 @@ self.producer_fifo.append(data) self.initiate_send() - def push_with_producer (self, producer): + def push_with_producer(self, producer): self.producer_fifo.append(producer) self.initiate_send() - def readable (self): + def readable(self): "predicate for inclusion in the readable for select()" # cannot use the old predicate, it violates the claim of the # set_terminator method. @@ -204,11 +209,11 @@ # return (len(self.ac_in_buffer) <= self.ac_in_buffer_size) return 1 - def writable (self): + def writable(self): "predicate for inclusion in the writable for select()" return self.producer_fifo or (not self.connected) - def close_when_done (self): + def close_when_done(self): "automatically close this channel once the outgoing queue is empty" self.producer_fifo.append(None) @@ -219,10 +224,8 @@ if not first: del self.producer_fifo[0] if first is None: - ## print("first is None") self.handle_close() return - ## print("first is not None") # handle classic producer behavior obs = self.ac_out_buffer_size @@ -254,20 +257,21 @@ # we tried to send some actual data return - def discard_buffers (self): + def discard_buffers(self): # Emergencies only! self.ac_in_buffer = b'' del self.incoming[:] self.producer_fifo.clear() + class simple_producer: - def __init__ (self, data, buffer_size=512): + def __init__(self, data, buffer_size=512): self.data = data self.buffer_size = buffer_size - def more (self): - if len (self.data) > self.buffer_size: + def more(self): + if len(self.data) > self.buffer_size: result = self.data[:self.buffer_size] self.data = self.data[self.buffer_size:] return result @@ -276,38 +280,40 @@ self.data = b'' return result + class fifo: - def __init__ (self, list=None): + def __init__(self, list=None): if not list: self.list = deque() else: self.list = deque(list) - def __len__ (self): + def __len__(self): return len(self.list) - def is_empty (self): + def is_empty(self): return not self.list - def first (self): + def first(self): return self.list[0] - def push (self, data): + def push(self, data): self.list.append(data) - def pop (self): + def pop(self): if self.list: return (1, self.list.popleft()) else: return (0, None) + # Given 'haystack', see if any prefix of 'needle' is at its end. This # assumes an exact match has already been checked. Return the number of # characters matched. # for example: -# f_p_a_e ("qwerty\r", "\r\n") => 1 -# f_p_a_e ("qwertydkjf", "\r\n") => 0 -# f_p_a_e ("qwerty\r\n", "\r\n") => +# f_p_a_e("qwerty\r", "\r\n") => 1 +# f_p_a_e("qwertydkjf", "\r\n") => 0 +# f_p_a_e("qwerty\r\n", "\r\n") => # this could maybe be made faster with a computed regex? # [answer: no; circa Python-2.0, Jan 2001] @@ -316,7 +322,7 @@ # re: 12820/s # regex: 14035/s -def find_prefix_at_end (haystack, needle): +def find_prefix_at_end(haystack, needle): l = len(needle) - 1 while l and not haystack.endswith(needle[:l]): l -= 1 diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -5,9 +5,12 @@ # If this fails, the test will be skipped. thread = support.import_module('_thread') -import asyncore, asynchat, socket, time +import asynchat +import asyncore +import socket +import sys +import time import unittest -import sys try: import threading except ImportError: @@ -28,8 +31,8 @@ self.event = event self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.port = support.bind_port(self.sock) - # This will be set if the client wants us to wait before echoing data - # back. + # This will be set if the client wants us to wait before echoing + # data back. self.start_resend_event = None def run(self): @@ -52,8 +55,8 @@ # re-send entire set of collected data try: - # this may fail on some tests, such as test_close_when_done, since - # the client closes the channel when it's done sending + # this may fail on some tests, such as test_close_when_done, + # since the client closes the channel when it's done sending while self.buffer: n = conn.send(self.buffer[:self.chunk_size]) time.sleep(0.001) @@ -96,7 +99,7 @@ s.start() event.wait() event.clear() - time.sleep(0.01) # Give server time to start accepting. + time.sleep(0.01) # Give server time to start accepting. return s, event @@ -104,10 +107,10 @@ class TestAsynchat(unittest.TestCase): usepoll = False - def setUp (self): + def setUp(self): self._threads = support.threading_setup() - def tearDown (self): + def tearDown(self): support.threading_cleanup(*self._threads) def line_terminator_check(self, term, server_chunk): @@ -117,7 +120,7 @@ s.start() event.wait() event.clear() - time.sleep(0.01) # Give server time to start accepting. + time.sleep(0.01) # Give server time to start accepting. c = echo_client(term, s.port) c.push(b"hello ") c.push(b"world" + term) @@ -136,17 +139,17 @@ def test_line_terminator1(self): # test one-character terminator - for l in (1,2,3): + for l in (1, 2, 3): self.line_terminator_check(b'\n', l) def test_line_terminator2(self): # test two-character terminator - for l in (1,2,3): + for l in (1, 2, 3): self.line_terminator_check(b'\r\n', l) def test_line_terminator3(self): # test three-character terminator - for l in (1,2,3): + for l in (1, 2, 3): self.line_terminator_check(b'qqq', l) def numeric_terminator_check(self, termlen): @@ -269,11 +272,13 @@ class TestAsynchat_WithPoll(TestAsynchat): usepoll = True + class TestHelperFunctions(unittest.TestCase): def test_find_prefix_at_end(self): self.assertEqual(asynchat.find_prefix_at_end("qwerty\r", "\r\n"), 1) self.assertEqual(asynchat.find_prefix_at_end("qwertydkjf", "\r\n"), 0) + class TestFifo(unittest.TestCase): def test_basic(self): f = asynchat.fifo() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:19:47 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 00:19:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asynchat=3A_PEP8-ify_the_code?= Message-ID: <3h6h6C2vPNz7Lpf@mail.python.org> http://hg.python.org/cpython/rev/bf677505a951 changeset: 91603:bf677505a951 parent: 91601:4b29d338cc41 parent: 91602:c8207b0148dc user: Victor Stinner date: Tue Jul 08 00:19:33 2014 +0200 summary: (Merge 3.4) asynchat: PEP8-ify the code files: Lib/asynchat.py | 94 ++++++++++++++------------ Lib/test/test_asynchat.py | 31 +++++--- 2 files changed, 68 insertions(+), 57 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -49,22 +49,22 @@ from collections import deque -class async_chat (asyncore.dispatcher): +class async_chat(asyncore.dispatcher): """This is an abstract class. You must derive from this class, and add the two methods collect_incoming_data() and found_terminator()""" # these are overridable defaults - ac_in_buffer_size = 65536 - ac_out_buffer_size = 65536 + ac_in_buffer_size = 65536 + ac_out_buffer_size = 65536 # we don't want to enable the use of encoding by default, because that is a # sign of an application bug that we don't want to pass silently - use_encoding = 0 - encoding = 'latin-1' + use_encoding = 0 + encoding = 'latin-1' - def __init__ (self, sock=None, map=None): + def __init__(self, sock=None, map=None): # for string terminator matching self.ac_in_buffer = b'' @@ -76,7 +76,7 @@ # we toss the use of the "simple producer" and replace it with # a pure deque, which the original fifo was a wrapping of self.producer_fifo = deque() - asyncore.dispatcher.__init__ (self, sock, map) + asyncore.dispatcher.__init__(self, sock, map) def collect_incoming_data(self, data): raise NotImplementedError("must be implemented in subclass") @@ -92,13 +92,16 @@ def found_terminator(self): raise NotImplementedError("must be implemented in subclass") - def set_terminator (self, term): - "Set the input delimiter. Can be a fixed string of any length, an integer, or None" + def set_terminator(self, term): + """Set the input delimiter. + + Can be a fixed string of any length, an integer, or None. + """ if isinstance(term, str) and self.use_encoding: term = bytes(term, self.encoding) self.terminator = term - def get_terminator (self): + def get_terminator(self): return self.terminator # grab some more data from the socket, @@ -106,10 +109,10 @@ # check for the terminator, # if found, transition to the next state. - def handle_read (self): + def handle_read(self): try: - data = self.recv (self.ac_in_buffer_size) + data = self.recv(self.ac_in_buffer_size) except OSError as why: self.handle_error() return @@ -128,17 +131,17 @@ terminator = self.get_terminator() if not terminator: # no terminator, collect it all - self.collect_incoming_data (self.ac_in_buffer) + self.collect_incoming_data(self.ac_in_buffer) self.ac_in_buffer = b'' elif isinstance(terminator, int): # numeric terminator n = terminator if lb < n: - self.collect_incoming_data (self.ac_in_buffer) + self.collect_incoming_data(self.ac_in_buffer) self.ac_in_buffer = b'' self.terminator = self.terminator - lb else: - self.collect_incoming_data (self.ac_in_buffer[:n]) + self.collect_incoming_data(self.ac_in_buffer[:n]) self.ac_in_buffer = self.ac_in_buffer[n:] self.terminator = 0 self.found_terminator() @@ -155,32 +158,34 @@ if index != -1: # we found the terminator if index > 0: - # don't bother reporting the empty string (source of subtle bugs) - self.collect_incoming_data (self.ac_in_buffer[:index]) + # don't bother reporting the empty string + # (source of subtle bugs) + self.collect_incoming_data(self.ac_in_buffer[:index]) self.ac_in_buffer = self.ac_in_buffer[index+terminator_len:] - # This does the Right Thing if the terminator is changed here. + # This does the Right Thing if the terminator + # is changed here. self.found_terminator() else: # check for a prefix of the terminator - index = find_prefix_at_end (self.ac_in_buffer, terminator) + index = find_prefix_at_end(self.ac_in_buffer, terminator) if index: if index != lb: # we found a prefix, collect up to the prefix - self.collect_incoming_data (self.ac_in_buffer[:-index]) + self.collect_incoming_data(self.ac_in_buffer[:-index]) self.ac_in_buffer = self.ac_in_buffer[-index:] break else: # no prefix, collect it all - self.collect_incoming_data (self.ac_in_buffer) + self.collect_incoming_data(self.ac_in_buffer) self.ac_in_buffer = b'' - def handle_write (self): + def handle_write(self): self.initiate_send() - def handle_close (self): + def handle_close(self): self.close() - def push (self, data): + def push(self, data): if not isinstance(data, (bytes, bytearray, memoryview)): raise TypeError('data argument must be byte-ish (%r)', type(data)) @@ -192,11 +197,11 @@ self.producer_fifo.append(data) self.initiate_send() - def push_with_producer (self, producer): + def push_with_producer(self, producer): self.producer_fifo.append(producer) self.initiate_send() - def readable (self): + def readable(self): "predicate for inclusion in the readable for select()" # cannot use the old predicate, it violates the claim of the # set_terminator method. @@ -204,11 +209,11 @@ # return (len(self.ac_in_buffer) <= self.ac_in_buffer_size) return 1 - def writable (self): + def writable(self): "predicate for inclusion in the writable for select()" return self.producer_fifo or (not self.connected) - def close_when_done (self): + def close_when_done(self): "automatically close this channel once the outgoing queue is empty" self.producer_fifo.append(None) @@ -219,10 +224,8 @@ if not first: del self.producer_fifo[0] if first is None: - ## print("first is None") self.handle_close() return - ## print("first is not None") # handle classic producer behavior obs = self.ac_out_buffer_size @@ -254,20 +257,21 @@ # we tried to send some actual data return - def discard_buffers (self): + def discard_buffers(self): # Emergencies only! self.ac_in_buffer = b'' del self.incoming[:] self.producer_fifo.clear() + class simple_producer: - def __init__ (self, data, buffer_size=512): + def __init__(self, data, buffer_size=512): self.data = data self.buffer_size = buffer_size - def more (self): - if len (self.data) > self.buffer_size: + def more(self): + if len(self.data) > self.buffer_size: result = self.data[:self.buffer_size] self.data = self.data[self.buffer_size:] return result @@ -276,8 +280,9 @@ self.data = b'' return result + class fifo: - def __init__ (self, list=None): + def __init__(self, list=None): import warnings warnings.warn('fifo class will be removed in Python 3.6', DeprecationWarning, stacklevel=2) @@ -286,31 +291,32 @@ else: self.list = deque(list) - def __len__ (self): + def __len__(self): return len(self.list) - def is_empty (self): + def is_empty(self): return not self.list - def first (self): + def first(self): return self.list[0] - def push (self, data): + def push(self, data): self.list.append(data) - def pop (self): + def pop(self): if self.list: return (1, self.list.popleft()) else: return (0, None) + # Given 'haystack', see if any prefix of 'needle' is at its end. This # assumes an exact match has already been checked. Return the number of # characters matched. # for example: -# f_p_a_e ("qwerty\r", "\r\n") => 1 -# f_p_a_e ("qwertydkjf", "\r\n") => 0 -# f_p_a_e ("qwerty\r\n", "\r\n") => +# f_p_a_e("qwerty\r", "\r\n") => 1 +# f_p_a_e("qwertydkjf", "\r\n") => 0 +# f_p_a_e("qwerty\r\n", "\r\n") => # this could maybe be made faster with a computed regex? # [answer: no; circa Python-2.0, Jan 2001] @@ -319,7 +325,7 @@ # re: 12820/s # regex: 14035/s -def find_prefix_at_end (haystack, needle): +def find_prefix_at_end(haystack, needle): l = len(needle) - 1 while l and not haystack.endswith(needle[:l]): l -= 1 diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -5,9 +5,12 @@ # If this fails, the test will be skipped. thread = support.import_module('_thread') -import asyncore, asynchat, socket, time +import asynchat +import asyncore +import socket +import sys +import time import unittest -import sys import warnings try: import threading @@ -29,8 +32,8 @@ self.event = event self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.port = support.bind_port(self.sock) - # This will be set if the client wants us to wait before echoing data - # back. + # This will be set if the client wants us to wait before echoing + # data back. self.start_resend_event = None def run(self): @@ -53,8 +56,8 @@ # re-send entire set of collected data try: - # this may fail on some tests, such as test_close_when_done, since - # the client closes the channel when it's done sending + # this may fail on some tests, such as test_close_when_done, + # since the client closes the channel when it's done sending while self.buffer: n = conn.send(self.buffer[:self.chunk_size]) time.sleep(0.001) @@ -97,7 +100,7 @@ s.start() event.wait() event.clear() - time.sleep(0.01) # Give server time to start accepting. + time.sleep(0.01) # Give server time to start accepting. return s, event @@ -105,10 +108,10 @@ class TestAsynchat(unittest.TestCase): usepoll = False - def setUp (self): + def setUp(self): self._threads = support.threading_setup() - def tearDown (self): + def tearDown(self): support.threading_cleanup(*self._threads) def line_terminator_check(self, term, server_chunk): @@ -118,7 +121,7 @@ s.start() event.wait() event.clear() - time.sleep(0.01) # Give server time to start accepting. + time.sleep(0.01) # Give server time to start accepting. c = echo_client(term, s.port) c.push(b"hello ") c.push(b"world" + term) @@ -137,17 +140,17 @@ def test_line_terminator1(self): # test one-character terminator - for l in (1,2,3): + for l in (1, 2, 3): self.line_terminator_check(b'\n', l) def test_line_terminator2(self): # test two-character terminator - for l in (1,2,3): + for l in (1, 2, 3): self.line_terminator_check(b'\r\n', l) def test_line_terminator3(self): # test three-character terminator - for l in (1,2,3): + for l in (1, 2, 3): self.line_terminator_check(b'qqq', l) def numeric_terminator_check(self, termlen): @@ -270,11 +273,13 @@ class TestAsynchat_WithPoll(TestAsynchat): usepoll = True + class TestHelperFunctions(unittest.TestCase): def test_find_prefix_at_end(self): self.assertEqual(asynchat.find_prefix_at_end("qwerty\r", "\r\n"), 1) self.assertEqual(asynchat.find_prefix_at_end("qwertydkjf", "\r\n"), 0) + class TestFifo(unittest.TestCase): def test_basic(self): with warnings.catch_warnings(record=True) as w: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:35:11 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 00:35:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzExMjU5?= =?utf-8?b?OiBhc3luY2hhdC5hc3luY19jaGF0KCkuc2V0X3Rlcm1pbmF0b3IoKSBub3cg?= =?utf-8?q?raises_a_ValueError_if?= Message-ID: <3h6hRz16TSz7LlK@mail.python.org> http://hg.python.org/cpython/rev/f67df13dd512 changeset: 91604:f67df13dd512 branch: 3.4 parent: 91602:c8207b0148dc user: Victor Stinner date: Tue Jul 08 00:26:36 2014 +0200 summary: Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError if the number of received bytes is negative. files: Lib/asynchat.py | 2 ++ Lib/test/test_asynchat.py | 8 ++++++++ Misc/NEWS | 3 +++ 3 files changed, 13 insertions(+), 0 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -99,6 +99,8 @@ """ if isinstance(term, str) and self.use_encoding: term = bytes(term, self.encoding) + elif isinstance(term, int) and term < 0: + raise ValueError('the number of received bytes must be positive') self.terminator = term def get_terminator(self): diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -304,5 +304,13 @@ self.assertEqual(f.pop(), (0, None)) +class TestNotConnected(unittest.TestCase): + def test_disallow_negative_terminator(self): + # Issue #11259 + client = asynchat.async_chat() + self.assertRaises(ValueError, client.set_terminator, -1) + + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError + if the number of received bytes is negative. + - Issue #12523: asynchat.async_chat.push() now raises a TypeError if it doesn't get a bytes string -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:35:12 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 00:35:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzExMjU5OiBhc3luY2hhdC5hc3luY19j?= =?utf-8?q?hat=28=29=2Eset=5Fterminator=28=29_now_raises_a?= Message-ID: <3h6hS02s7Yz7LpF@mail.python.org> http://hg.python.org/cpython/rev/d164fda9063a changeset: 91605:d164fda9063a parent: 91603:bf677505a951 parent: 91604:f67df13dd512 user: Victor Stinner date: Tue Jul 08 00:34:48 2014 +0200 summary: (Merge 3.4) Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError if the number of received bytes is negative. files: Lib/asynchat.py | 2 ++ Lib/test/test_asynchat.py | 8 ++++++++ Misc/NEWS | 3 +++ 3 files changed, 13 insertions(+), 0 deletions(-) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -99,6 +99,8 @@ """ if isinstance(term, str) and self.use_encoding: term = bytes(term, self.encoding) + elif isinstance(term, int) and term < 0: + raise ValueError('the number of received bytes must be positive') self.terminator = term def get_terminator(self): diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -311,5 +311,13 @@ self.assertEqual(f.pop(), (0, None)) +class TestNotConnected(unittest.TestCase): + def test_disallow_negative_terminator(self): + # Issue #11259 + client = asynchat.async_chat() + self.assertRaises(ValueError, client.set_terminator, -1) + + + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError + if the number of received bytes is negative. + - Issue #12523: asynchat.async_chat.push() now raises a TypeError if it doesn't get a bytes string -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 00:50:03 2014 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 8 Jul 2014 00:50:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321803=3A_remove_m?= =?utf-8?q?acro_indirections_in_complexobject=2Eh?= Message-ID: <3h6hn768lcz7Lm6@mail.python.org> http://hg.python.org/cpython/rev/9f75a29c9577 changeset: 91606:9f75a29c9577 user: Antoine Pitrou date: Mon Jul 07 18:49:30 2014 -0400 summary: Issue #21803: remove macro indirections in complexobject.h files: Include/complexobject.h | 22 +++++------------ Objects/complexobject.c | 34 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/Include/complexobject.h b/Include/complexobject.h --- a/Include/complexobject.h +++ b/Include/complexobject.h @@ -14,21 +14,13 @@ /* Operations on complex numbers from complexmodule.c */ -#define c_sum _Py_c_sum -#define c_diff _Py_c_diff -#define c_neg _Py_c_neg -#define c_prod _Py_c_prod -#define c_quot _Py_c_quot -#define c_pow _Py_c_pow -#define c_abs _Py_c_abs - -PyAPI_FUNC(Py_complex) c_sum(Py_complex, Py_complex); -PyAPI_FUNC(Py_complex) c_diff(Py_complex, Py_complex); -PyAPI_FUNC(Py_complex) c_neg(Py_complex); -PyAPI_FUNC(Py_complex) c_prod(Py_complex, Py_complex); -PyAPI_FUNC(Py_complex) c_quot(Py_complex, Py_complex); -PyAPI_FUNC(Py_complex) c_pow(Py_complex, Py_complex); -PyAPI_FUNC(double) c_abs(Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_sum(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_diff(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_neg(Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_prod(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_quot(Py_complex, Py_complex); +PyAPI_FUNC(Py_complex) _Py_c_pow(Py_complex, Py_complex); +PyAPI_FUNC(double) _Py_c_abs(Py_complex); #endif /* Complex object interface */ diff --git a/Objects/complexobject.c b/Objects/complexobject.c --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -13,7 +13,7 @@ static Py_complex c_1 = {1., 0.}; Py_complex -c_sum(Py_complex a, Py_complex b) +_Py_c_sum(Py_complex a, Py_complex b) { Py_complex r; r.real = a.real + b.real; @@ -22,7 +22,7 @@ } Py_complex -c_diff(Py_complex a, Py_complex b) +_Py_c_diff(Py_complex a, Py_complex b) { Py_complex r; r.real = a.real - b.real; @@ -31,7 +31,7 @@ } Py_complex -c_neg(Py_complex a) +_Py_c_neg(Py_complex a) { Py_complex r; r.real = -a.real; @@ -40,7 +40,7 @@ } Py_complex -c_prod(Py_complex a, Py_complex b) +_Py_c_prod(Py_complex a, Py_complex b) { Py_complex r; r.real = a.real*b.real - a.imag*b.imag; @@ -49,7 +49,7 @@ } Py_complex -c_quot(Py_complex a, Py_complex b) +_Py_c_quot(Py_complex a, Py_complex b) { /****************************************************************** This was the original algorithm. It's grossly prone to spurious @@ -103,7 +103,7 @@ } Py_complex -c_pow(Py_complex a, Py_complex b) +_Py_c_pow(Py_complex a, Py_complex b) { Py_complex r; double vabs,len,at,phase; @@ -141,9 +141,9 @@ p = x; while (mask > 0 && n >= mask) { if (n & mask) - r = c_prod(r,p); + r = _Py_c_prod(r,p); mask <<= 1; - p = c_prod(p,p); + p = _Py_c_prod(p,p); } return r; } @@ -156,17 +156,17 @@ if (n > 100 || n < -100) { cn.real = (double) n; cn.imag = 0.; - return c_pow(x,cn); + return _Py_c_pow(x,cn); } else if (n > 0) return c_powu(x,n); else - return c_quot(c_1,c_powu(x,-n)); + return _Py_c_quot(c_1, c_powu(x,-n)); } double -c_abs(Py_complex z) +_Py_c_abs(Py_complex z) { /* sets errno = ERANGE on overflow; otherwise errno = 0 */ double result; @@ -441,7 +441,7 @@ TO_COMPLEX(v, a); TO_COMPLEX(w, b); PyFPE_START_PROTECT("complex_add", return 0) - result = c_sum(a, b); + result = _Py_c_sum(a, b); PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -454,7 +454,7 @@ TO_COMPLEX(v, a); TO_COMPLEX(w, b); PyFPE_START_PROTECT("complex_sub", return 0) - result = c_diff(a, b); + result = _Py_c_diff(a, b); PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -467,7 +467,7 @@ TO_COMPLEX(v, a); TO_COMPLEX(w, b); PyFPE_START_PROTECT("complex_mul", return 0) - result = c_prod(a, b); + result = _Py_c_prod(a, b); PyFPE_END_PROTECT(result) return PyComplex_FromCComplex(result); } @@ -481,7 +481,7 @@ TO_COMPLEX(w, b); PyFPE_START_PROTECT("complex_div", return 0) errno = 0; - quot = c_quot(a, b); + quot = _Py_c_quot(a, b); PyFPE_END_PROTECT(quot) if (errno == EDOM) { PyErr_SetString(PyExc_ZeroDivisionError, "complex division by zero"); @@ -528,7 +528,7 @@ if (exponent.imag == 0. && exponent.real == int_exponent) p = c_powi(a, int_exponent); else - p = c_pow(a, exponent); + p = _Py_c_pow(a, exponent); PyFPE_END_PROTECT(p) Py_ADJUST_ERANGE2(p.real, p.imag); @@ -579,7 +579,7 @@ double result; PyFPE_START_PROTECT("complex_abs", return 0) - result = c_abs(v->cval); + result = _Py_c_abs(v->cval); PyFPE_END_PROTECT(result) if (errno == ERANGE) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 01:08:56 2014 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 8 Jul 2014 01:08:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_compilation_failure_?= =?utf-8?q?=28followup_to_=2321803=29?= Message-ID: <3h6jBw5QQgz7Lm6@mail.python.org> http://hg.python.org/cpython/rev/4609e31092b2 changeset: 91607:4609e31092b2 user: Antoine Pitrou date: Mon Jul 07 19:08:47 2014 -0400 summary: Fix compilation failure (followup to #21803) files: Modules/cmathmodule.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -313,7 +313,7 @@ /* Reduce to case where z.real >= 0., using atanh(z) = -atanh(-z). */ if (z.real < 0.) { - return c_neg(c_atanh(c_neg(z))); + return _Py_c_neg(c_atanh(_Py_c_neg(z))); } ay = fabs(z.imag); @@ -842,7 +842,7 @@ x = c_log(x); if (PyTuple_GET_SIZE(args) == 2) { y = c_log(y); - x = c_quot(x, y); + x = _Py_c_quot(x, y); } PyFPE_END_PROTECT(x) if (errno != 0) @@ -943,7 +943,7 @@ return NULL; PyFPE_START_PROTECT("polar function", return 0) phi = c_atan2(z); /* should not cause any exception */ - r = c_abs(z); /* sets errno to ERANGE on overflow; otherwise 0 */ + r = _Py_c_abs(z); /* sets errno to ERANGE on overflow; otherwise 0 */ PyFPE_END_PROTECT(r) if (errno != 0) return math_error(); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 10:59:50 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 10:59:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_471=3A_update_by_Ben_Hoy?= Message-ID: <3h6yJk6MPwz7LjX@mail.python.org> http://hg.python.org/peps/rev/0da4736c27e8 changeset: 5495:0da4736c27e8 user: Victor Stinner date: Tue Jul 08 10:59:42 2014 +0200 summary: PEP 471: update by Ben Hoy After the significant discussion on python-dev about PEP 471, I've now made the relevant updates and improved a few things. files: pep-0471.txt | 446 +++++++++++++++++++++++++++++--------- 1 files changed, 341 insertions(+), 105 deletions(-) diff --git a/pep-0471.txt b/pep-0471.txt --- a/pep-0471.txt +++ b/pep-0471.txt @@ -8,6 +8,7 @@ Content-Type: text/x-rst Created: 30-May-2014 Python-Version: 3.5 +Post-History: 27-Jun-2014, 8-Jul-2014 Abstract @@ -25,32 +26,36 @@ Python's built-in ``os.walk()`` is significantly slower than it needs to be, because -- in addition to calling ``os.listdir()`` on each -directory -- it executes the system call ``os.stat()`` or +directory -- it executes the ``stat()`` system call or ``GetFileAttributes()`` on each file to determine whether the entry is a directory or not. But the underlying system calls -- ``FindFirstFile`` / -``FindNextFile`` on Windows and ``readdir`` on Linux and OS X -- +``FindNextFile`` on Windows and ``readdir`` on POSIX systems -- already tell you whether the files returned are directories or not, so -no further system calls are needed. In short, you can reduce the -number of system calls from approximately 2N to N, where N is the -total number of files and directories in the tree. (And because -directory trees are usually much wider than they are deep, it's often -much better than this.) +no further system calls are needed. Further, the Windows system calls +return all the information for a ``stat_result`` object, such as file +size and last modification time. + +In short, you can reduce the number of system calls required for a +tree function like ``os.walk()`` from approximately 2N to N, where N +is the total number of files and directories in the tree. (And because +directory trees are usually wider than they are deep, it's often much +better than this.) In practice, removing all those extra system calls makes ``os.walk()`` about **8-9 times as fast on Windows**, and about **2-3 times as fast -on Linux and Mac OS X**. So we're not talking about micro- -optimizations. See more `benchmarks`_. +on POSIX systems**. So we're not talking about micro- +optimizations. See more `benchmarks here`_. -.. _`benchmarks`: https://github.com/benhoyt/scandir#benchmarks +.. _`benchmarks here`: https://github.com/benhoyt/scandir#benchmarks Somewhat relatedly, many people (see Python `Issue 11406`_) are also keen on a version of ``os.listdir()`` that yields filenames as it iterates instead of returning them as one big list. This improves memory efficiency for iterating very large directories. -So as well as providing a ``scandir()`` iterator function for calling +So, as well as providing a ``scandir()`` iterator function for calling directly, Python's existing ``os.walk()`` function could be sped up a huge amount. @@ -70,7 +75,7 @@ section in this PEP), so it's more than a proof-of-concept. However, it is marked as beta software and is not extensively battle-tested. It will need some cleanup and more thorough testing before going into -the standard library, as well as integration into `posixmodule.c`. +the standard library, as well as integration into ``posixmodule.c``. @@ -87,10 +92,10 @@ iteration system calls to get the names of the files in the ``path`` directory, but it's different from ``listdir`` in two ways: -* Instead of bare filename strings, it returns lightweight +* Instead of returning bare filename strings, it returns lightweight ``DirEntry`` objects that hold the filename string and provide - simple methods that allow access to the stat-like data the operating - system returned. + simple methods that allow access to the additional data the + operating system returned. * It returns a generator instead of a list, so that ``scandir`` acts as a true iterator instead of returning the full list immediately. @@ -101,80 +106,144 @@ system-dependent order. Each ``DirEntry`` object has the following attributes and methods: -* ``name``: the entry's filename, relative to ``path`` (corresponds to - the return values of ``os.listdir``) +* ``name``: the entry's filename, relative to the ``path`` argument + (corresponds to the return values of ``os.listdir``) -* ``is_dir()``: like ``os.path.isdir()``, but requires no system calls - on most systems (Linux, Windows, OS X) +* ``full_name``: the entry's full path name -- the equivalent of + ``os.path.join(path, entry.name)`` -* ``is_file()``: like ``os.path.isfile()``, but requires no system - calls on most systems (Linux, Windows, OS X) +* ``is_dir()``: like ``os.path.isdir()``, but much cheaper -- it never + requires a system call on Windows, and usually doesn't on POSIX + systems -* ``is_symlink()``: like ``os.path.islink()``, but requires no system - calls on most systems (Linux, Windows, OS X) +* ``is_file()``: like ``os.path.isfile()``, but much cheaper -- it + never requires a system call on Windows, and usually doesn't on + POSIX systems -* ``lstat()``: like ``os.lstat()``, but requires no system calls on - Windows +* ``is_symlink()``: like ``os.path.islink()``, but much cheaper -- it + never requires a system call on Windows, and usually doesn't on + POSIX systems + +* ``lstat()``: like ``os.lstat()``, but much cheaper on some systems + -- it only requires a system call on POSIX systems + +The ``is_X`` methods may perform a ``stat()`` call under certain +conditions (for example, on certain file systems on POSIX systems), +and therefore possibly raise ``OSError``. The ``lstat()`` method will +call ``stat()`` on POSIX systems and therefore also possibly raise +``OSError``. See the "Notes on exception handling" section for more +details. The ``DirEntry`` attribute and method names were chosen to be the same as those in the new ``pathlib`` module for consistency. +Like the other functions in the ``os`` module, ``scandir()`` accepts +either a bytes or str object for the ``path`` parameter, and returns +the ``DirEntry.name`` and ``DirEntry.full_name`` attributes with the +same type as ``path``. However, it is *strongly recommended* to use +the str type, as this ensures cross-platform support for Unicode +filenames. + + +Examples +======== + +Below is a good usage pattern for ``scandir``. This is in fact almost +exactly how the scandir module's faster ``os.walk()`` implementation +uses it:: + + dirs = [] + non_dirs = [] + for entry in os.scandir(path): + if entry.is_dir(): + dirs.append(entry) + else: + non_dirs.append(entry) + +The above ``os.walk()``-like code will be significantly faster with +scandir than ``os.listdir()`` and ``os.path.isdir()`` on both Windows +and POSIX systems. + +Or, for getting the total size of files in a directory tree, showing +use of the ``DirEntry.lstat()`` method and ``DirEntry.full_name`` +attribute:: + + def get_tree_size(path): + """Return total size of files in path and subdirs.""" + total = 0 + for entry in os.scandir(path): + if entry.is_dir(): + total += get_tree_size(entry.full_name) + else: + total += entry.lstat().st_size + return total + +Note that ``get_tree_size()`` will get a huge speed boost on Windows, +because no extra stat call are needed, but on POSIX systems the size +information is not returned by the directory iteration functions, so +this function won't gain anything there. + Notes on caching ---------------- -The ``DirEntry`` objects are relatively dumb -- the ``name`` attribute -is obviously always cached, and the ``is_X`` and ``lstat`` methods -cache their values (immediately on Windows via ``FindNextFile``, and -on first use on Linux / OS X via a ``stat`` call) and never refetch -from the system. +The ``DirEntry`` objects are relatively dumb -- the ``name`` and +``full_name`` attributes are obviously always cached, and the ``is_X`` +and ``lstat`` methods cache their values (immediately on Windows via +``FindNextFile``, and on first use on POSIX systems via a ``stat`` +call) and never refetch from the system. For this reason, ``DirEntry`` objects are intended to be used and thrown away after iteration, not stored in long-lived data structured and the methods called again and again. -If a user wants to do that (for example, for watching a file's size -change), they'll need to call the regular ``os.lstat()`` or -``os.path.getsize()`` functions which force a new system call each -time. +If developers want "refresh" behaviour (for example, for watching a +file's size change), they can simply use ``pathlib.Path`` objects, +or call the regular ``os.lstat()`` or ``os.path.getsize()`` functions +which get fresh data from the operating system every call. -Examples -======== +Notes on exception handling +--------------------------- -Here's a good usage pattern for ``scandir``. This is in fact almost -exactly how the scandir module's faster ``os.walk()`` implementation -uses it:: +``DirEntry.is_X()`` and ``DirEntry.lstat()`` are explicitly methods +rather than attributes or properties, to make it clear that they may +not be cheap operations, and they may do a system call. As a result, +these methods may raise ``OSError``. - dirs = [] - non_dirs = [] - for entry in scandir(path): - if entry.is_dir(): - dirs.append(entry) - else: - non_dirs.append(entry) +For example, ``DirEntry.lstat()`` will always make a system call on +POSIX-based systems, and the ``DirEntry.is_X()`` methods will make a +``stat()`` system call on such systems if ``readdir()`` returns a +``d_type`` with a value of ``DT_UNKNOWN``, which can occur under +certain conditions or on certain file systems. -The above ``os.walk()``-like code will be significantly using scandir -on both Windows and Linux or OS X. +For this reason, when a user requires fine-grained error handling, +it's good to catch ``OSError`` around these method calls and then +handle as appropriate. -Or, for getting the total size of files in a directory tree -- showing -use of the ``DirEntry.lstat()`` method:: +For example, below is a version of the ``get_tree_size()`` example +shown above, but with basic error handling added:: def get_tree_size(path): - """Return total size of files in path and subdirs.""" - size = 0 - for entry in scandir(path): - if entry.is_dir(): - sub_path = os.path.join(path, entry.name) - size += get_tree_size(sub_path) + """Return total size of files in path and subdirs. If + is_dir() or lstat() fails, print an error message to stderr + and assume zero size (for example, file has been deleted). + """ + total = 0 + for entry in os.scandir(path): + try: + is_dir = entry.is_dir() + except OSError as error: + print('Error calling is_dir():', error, file=sys.stderr) + continue + if is_dir: + total += get_tree_size(entry.full_name) else: - size += entry.lstat().st_size - return size - -Note that ``get_tree_size()`` will get a huge speed boost on Windows, -because no extra stat call are needed, but on Linux and OS X the size -information is not returned by the directory iteration functions, so -this function won't gain anything there. + try: + total += entry.lstat().st_size + except OSError as error: + print('Error calling lstat():', error, file=sys.stderr) + return total Support @@ -185,6 +254,10 @@ direct support for a scandir-like function from core developers and others on the python-dev and python-ideas mailing lists. A sampling: +* **python-dev**: a good number of +1's and very few negatives for + scandir and PEP 471 on `this June 2014 python-dev thread + `_ + * **Nick Coghlan**, a core Python developer: "I've had the local Red Hat release engineering team express their displeasure at having to stat every file in a network mounted directory tree for info that is @@ -225,9 +298,10 @@ Use in the wild =============== -To date, ``scandir`` is definitely useful, but has been clearly marked -"beta", so it's uncertain how much use of it there is in the wild. Ben -Hoyt has had several reports from people using it. For example: +To date, the ``scandir`` implementation is definitely useful, but has +been clearly marked "beta", so it's uncertain how much use of it there +is in the wild. Ben Hoyt has had several reports from people using it. +For example: * Chris F: "I am processing some pretty large directories and was half expecting to have to modify getdents. So thanks for saving me the @@ -250,12 +324,12 @@ GitHub stats don't mean too much, but scandir does have several watchers, issues, forks, etc. Here's the run-down as of the stats as -of June 5, 2014: +of July 7, 2014: * Watchers: 17 -* Stars: 48 -* Forks: 15 -* Issues: 2 open, 19 closed +* Stars: 57 +* Forks: 20 +* Issues: 4 open, 26 closed **However, the much larger point is this:**, if this PEP is accepted, ``os.walk()`` can easily be reimplemented using ``scandir`` rather @@ -266,53 +340,205 @@ of ``os.walk`` (194,000) as there are of ``os.mkdir`` (230,000). -Open issues and optional things -=============================== +Rejected ideas +============== -There are a few open issues or optional additions: +Naming +------ -Should scandir be in its own module? +The only other real contender for this function's name was +``iterdir()``. However, ``iterX()`` functions in Python (mostly found +in Python 2) tend to be simple iterator equivalents of their +non-iterator counterparts. For example, ``dict.iterkeys()`` is just an +iterator version of ``dict.keys()``, but the objects returned are +identical. In ``scandir()``'s case, however, the return values are +quite different objects (``DirEntry`` objects vs filename strings), so +this should probably be reflected by a difference in name -- hence +``scandir()``. + +See some `relevant discussion on python-dev +`_. + + +Wildcard support +---------------- + +``FindFirstFile``/``FindNextFile`` on Windows support passing a +"wildcard" like ``*.jpg``, so at first folks (this PEP's author +included) felt it would be a good idea to include a +``windows_wildcard`` keyword argument to the ``scandir`` function so +users could pass this in. + +However, on further thought and discussion it was decided that this +would be bad idea, *unless it could be made cross-platform* (a +``pattern`` keyword argument or similar). This seems easy enough at +first -- just use the OS wildcard support on Windows, and something +like ``fnmatch`` or ``re`` afterwards on POSIX-based systems. + +Unfortunately the exact Windows wildcard matching rules aren't really +documented anywhere by Microsoft, and they're quite quirky (see this +`blog post +`_), +meaning it's very problematic to emulate using ``fnmatch`` or regexes. + +So the consensus was that Windows wildcard support was a bad idea. +It would be possible to add at a later date if there's a +cross-platform way to achieve it, but not for the initial version. + +Read more on the `this Nov 2012 python-ideas thread +`_ +and this `June 2014 python-dev thread on PEP 471 +`_. + + +DirEntry attributes being properties ------------------------------------ -Should the function be included in the standard library in a new -module, ``scandir.scandir()``, or just as ``os.scandir()`` as -discussed? The preference of this PEP's author (Ben Hoyt) would be -``os.scandir()``, as it's just a single function. +In some ways it would be nicer for the ``DirEntry`` ``is_X()`` and +``lstat()`` to be properties instead of methods, to indicate they're +very cheap or free. However, this isn't quite the case, as ``lstat()`` +will require an OS call on POSIX-based systems but not on Windows. +Even ``is_dir()`` and friends may perform an OS call on POSIX-based +systems if the ``dirent.d_type`` value is ``DT_UNKNOWN`` (on certain +file systems). +Also, people would expect the attribute access ``entry.is_dir`` to +only ever raise ``AttributeError``, not ``OSError`` in the case it +makes a system call under the covers. Calling code would have to have +a ``try``/``except`` around what looks like a simple attribute access, +and so it's much better to make them *methods*. -Should there be a way to access the full path? ----------------------------------------------- +See `this May 2013 python-dev thread +`_ +where this PEP author makes this case and there's agreement from a +core developers. -Should ``DirEntry``'s have a way to get the full path without using -``os.path.join(path, entry.name)``? This is a pretty common pattern, -and it may be useful to add pathlib-like ``str(entry)`` functionality. -This functionality has also been requested in `issue 13`_ on GitHub. -.. _`issue 13`: https://github.com/benhoyt/scandir/issues/13 +DirEntry fields being "static" attribute-only objects +----------------------------------------------------- +In `this July 2014 python-dev message +`_, +Paul Moore suggested a solution that was a "thin wrapper round the OS +feature", where the ``DirEntry`` object had only static attributes: +``name``, ``full_name``, and ``is_X``, with the ``st_X`` attributes +only present on Windows. The idea was to use this simpler, lower-level +function as a building block for higher-level functions. -Should it expose Windows wildcard functionality? ------------------------------------------------- +At first there was general agreement that simplifying in this way was +a good thing. However, there were two problems with this approach. +First, the assumption is the ``is_dir`` and similar attributes are +always present on POSIX, which isn't the case (if ``d_type`` is not +present or is ``DT_UNKNOWN``). Second, it's a much harder-to-use API +in practice, as even the ``is_dir`` attributes aren't always present +on POSIX, and would need to be tested with ``hasattr()`` and then +``os.stat()`` called if they weren't present. -Should ``scandir()`` have a way of exposing the wildcard functionality -in the Windows ``FindFirstFile`` / ``FindNextFile`` functions? The -scandir module on GitHub exposes this as a ``windows_wildcard`` -keyword argument, allowing Windows power users the option to pass a -custom wildcard to ``FindFirstFile``, which may avoid the need to use -``fnmatch`` or similar on the resulting names. It is named the -unwieldly ``windows_wildcard`` to remind you you're writing power- -user, Windows-only code if you use it. +See `this July 2014 python-dev response +`_ +from this PEP's author detailing why this option is a non-ideal +solution, and the subsequent reply from Paul Moore voicing agreement. -This boils down to whether ``scandir`` should be about exposing all of -the system's directory iteration features, or simply providing a fast, -simple, cross-platform directory iteration API. -This PEP's author votes for not including ``windows_wildcard`` in the -standard library version, because even though it could be useful in -rare cases (say the Windows Dropbox client?), it'd be too easy to use -it just because you're a Windows developer, and create code that is -not cross-platform. +DirEntry fields being static with an ensure_lstat option +-------------------------------------------------------- + +Another seemingly simpler and attractive option was suggested by +Nick Coghlan in this `June 2014 python-dev message +`_: +make ``DirEntry.is_X`` and ``DirEntry.lstat_result`` properties, and +populate ``DirEntry.lstat_result`` at iteration time, but only if +the new argument ``ensure_lstat=True`` was specified on the +``scandir()`` call. + +This does have the advantage over the above in that you can easily get +the stat result from ``scandir()`` if you need it. However, it has the +serious disadvantage that fine-grained error handling is messy, +because ``stat()`` will be called (and hence potentially raise +``OSError``) during iteration, leading to a rather ugly, hand-made +iteration loop:: + + it = os.scandir(path) + while True: + try: + entry = next(it) + except OSError as error: + handle_error(path, error) + except StopIteration: + break + +Or it means that ``scandir()`` would have to accept an ``onerror`` +argument -- a function to call when ``stat()`` errors occur during +iteration. This seems to this PEP's author neither as direct nor as +Pythonic as ``try``/``except`` around a ``DirEntry.lstat()`` call. + +See `Ben Hoyt's July 2014 reply +`_ +to the discussion summarizing this and detailing why he thinks the +original PEP 471 proposal is "the right one" after all. + + +Return values being (name, stat_result) two-tuples +-------------------------------------------------- + +Initially this PEP's author proposed this concept as a function called +``iterdir_stat()`` which yielded two-tuples of (name, stat_result). +This does have the advantage that there are no new types introduced. +However, the ``stat_result`` is only partially filled on POSIX-based +systems (most fields set to ``None`` and other quirks), so they're not +really ``stat_result`` objects at all, and this would have to be +thoroughly documented as different from ``os.stat()``. + +Also, Python has good support for proper objects with attributes and +methods, which makes for a saner and simpler API than two-tuples. It +also makes the ``DirEntry`` objects more extensible and future-proof +as operating systems add functionality and we want to include this in +``DirEntry``. + +See also some previous discussion: + +* `May 2013 python-dev thread + `_ + where Nick Coghlan makes the original case for a ``DirEntry``-style + object. + +* `June 2014 python-dev thread + `_ + where Nick Coghlan makes (another) good case against the two-tuple + approach. + + +Return values being overloaded stat_result objects +-------------------------------------------------- + +Another alternative discussed was making the return values to be +overloaded ``stat_result`` objects with ``name`` and ``full_name`` +attributes. However, apart from this being a strange (and strained!) +kind of overloading, this has the same problems mentioned above -- +most of the ``stat_result`` information is not fetched by +``readdir()`` on POSIX systems, only (part of) the ``st_mode`` value. + + +Return values being pathlib.Path objects +---------------------------------------- + +With Antoine Pitrou's new standard library ``pathlib`` module, it +at first seems like a great idea for ``scandir()`` to return instances +of ``pathlib.Path``. However, ``pathlib.Path``'s ``is_X()`` and +``lstat()`` functions are explicitly not cached, whereas ``scandir`` +has to cache them by design, because it's (often) returning values +from the original directory iteration system call. + +And if the ``pathlib.Path`` instances returned by ``scandir`` cached +lstat values, but the ordinary ``pathlib.Path`` objects explicitly +don't, that would be more than a little confusing. + +Guido van Rossum explicitly rejected ``pathlib.Path`` caching lstat in +the context of scandir `here +`_, +making ``pathlib.Path`` objects a bad choice for scandir return +values. Possible improvements @@ -328,6 +554,12 @@ was suggested by on Issue 11406 by Antoine Pitrou. [`source9 `_] +* scandir could use a free list to avoid the cost of memory allocation + for each iteration -- a short free list of 10 or maybe even 1 may help. + Suggested by Victor Stinner on a `python-dev thread on June 27`_. + +.. _`python-dev thread on June 27`: https://mail.python.org/pipermail/python-dev/2014-June/135232.html + Previous discussion =================== @@ -342,9 +574,12 @@ ``scandir()`` API, including Nick Coghlan's suggestion of scandir yielding ``DirEntry``-like objects -* `Final thread Ben Hoyt started on python-dev`_ to discuss the +* `Another thread Ben Hoyt started on python-dev`_ to discuss the interaction between scandir and the new ``pathlib`` module +* `Final thread Ben Hoyt started on python-dev`_ to discuss the first + version of this PEP, with extensive discussion about the API. + * `Question on StackOverflow`_ about why ``os.walk()`` is slow and pointers on how to fix it (this inspired the author of this PEP early on) @@ -354,7 +589,8 @@ .. _`Original thread Ben Hoyt started on python-ideas`: https://mail.python.org/pipermail/python-ideas/2012-November/017770.html .. _`Further thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2013-May/126119.html -.. _`Final thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2013-November/130572.html +.. _`Another thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2013-November/130572.html +.. _`Final thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2014-June/135215.html .. _`Question on StackOverflow`: http://stackoverflow.com/questions/2485719/very-quickly-getting-total-size-of-folder .. _`BetterWalk`: https://github.com/benhoyt/betterwalk -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Tue Jul 8 11:05:19 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 08 Jul 2014 11:05:19 +0200 Subject: [Python-checkins] Daily reference leaks (4609e31092b2): sum=7 Message-ID: results for 4609e31092b2 on branch "default" -------------------------------------------- test_asyncio leaked [0, 0, 4] memory blocks, sum=4 test_functools leaked [0, 0, 3] memory blocks, sum=3 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogchzH6s', '-x'] From python-checkins at python.org Tue Jul 8 12:44:36 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 12:44:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h70dc02kTz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/8d759d8f6ccb changeset: 91608:8d759d8f6ccb branch: 3.4 parent: 91604:f67df13dd512 user: Victor Stinner date: Tue Jul 08 11:29:25 2014 +0200 summary: asyncio: sync with Tulip - Tulip issue 185: Add a create_task() method to event loops. The create_task() method can be overriden in custom event loop to implement their own task class. For example, greenio and Pulsar projects use their own task class. The create_task() method is now preferred over creating directly task using the Task class. - tests: fix a warning - fix typo in the name of a test function - Update AbstractEventLoop: add new event loop methods; update also the unit test files: Lib/asyncio/base_events.py | 6 ++ Lib/asyncio/events.py | 9 ++++ Lib/asyncio/streams.py | 2 +- Lib/asyncio/tasks.py | 4 +- Lib/asyncio/test_utils.py | 2 +- Lib/test/test_asyncio/test_base_events.py | 24 +++++++++++ Lib/test/test_asyncio/test_events.py | 14 ++++++ Lib/test/test_asyncio/test_futures.py | 4 +- Lib/test/test_asyncio/test_tasks.py | 3 + 9 files changed, 63 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -151,6 +151,12 @@ % (self.__class__.__name__, self.is_running(), self.is_closed(), self.get_debug())) + def create_task(self, coro): + """Schedule a coroutine object. + + Return a task object.""" + return tasks.Task(coro, loop=self) + def _make_socket_transport(self, sock, protocol, waiter=None, *, extra=None, server=None): """Create socket transport.""" diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -200,6 +200,10 @@ """Return whether the event loop is currently running.""" raise NotImplementedError + def is_closed(self): + """Returns True if the event loop was closed.""" + raise NotImplementedError + def close(self): """Close the loop. @@ -225,6 +229,11 @@ def time(self): raise NotImplementedError + # Method scheduling a coroutine object: create a task. + + def create_task(self, coro): + raise NotImplementedError + # Methods for interacting with threads. def call_soon_threadsafe(self, callback, *args): diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -213,7 +213,7 @@ res = self._client_connected_cb(self._stream_reader, self._stream_writer) if coroutines.iscoroutine(res): - tasks.Task(res, loop=self._loop) + self._loop.create_task(res) def connection_lost(self, exc): if exc is None: diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -505,7 +505,9 @@ raise ValueError('loop argument must agree with Future') return coro_or_future elif coroutines.iscoroutine(coro_or_future): - task = Task(coro_or_future, loop=loop) + if loop is None: + loop = events.get_event_loop() + task = loop.create_task(coro_or_future) if task._source_traceback: del task._source_traceback[-1] return task diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -48,7 +48,7 @@ def once(): pass gen = once() - t = tasks.Task(gen, loop=loop) + t = loop.create_task(gen) # Don't log a warning if the task is not done after run_until_complete(). # It occurs if the loop is stopped or if a task raises a BaseException. t._log_destroy_pending = False diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -12,6 +12,7 @@ import asyncio from asyncio import base_events +from asyncio import events from asyncio import constants from asyncio import test_utils @@ -526,6 +527,29 @@ PYTHONASYNCIODEBUG='1') self.assertEqual(stdout.rstrip(), b'False') + def test_create_task(self): + class MyTask(asyncio.Task): + pass + + @asyncio.coroutine + def test(): + pass + + class EventLoop(base_events.BaseEventLoop): + def create_task(self, coro): + return MyTask(coro, loop=loop) + + loop = EventLoop() + self.set_event_loop(loop) + + coro = test() + task = asyncio.async(coro, loop=loop) + self.assertIsInstance(task, MyTask) + + # make warnings quiet + task._log_destroy_pending = False + coro.close() + class MyProto(asyncio.Protocol): done = None diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1969,8 +1969,12 @@ self.assertRaises( NotImplementedError, loop.is_running) self.assertRaises( + NotImplementedError, loop.is_closed) + self.assertRaises( NotImplementedError, loop.close) self.assertRaises( + NotImplementedError, loop.create_task, None) + self.assertRaises( NotImplementedError, loop.call_later, None, None) self.assertRaises( NotImplementedError, loop.call_at, f, f) @@ -2027,6 +2031,16 @@ mock.sentinel) self.assertRaises( NotImplementedError, loop.subprocess_exec, f) + self.assertRaises( + NotImplementedError, loop.set_exception_handler, f) + self.assertRaises( + NotImplementedError, loop.default_exception_handler, f) + self.assertRaises( + NotImplementedError, loop.call_exception_handler, f) + self.assertRaises( + NotImplementedError, loop.get_debug) + self.assertRaises( + NotImplementedError, loop.set_debug, f) class ProtocolsAbsTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -301,12 +301,12 @@ def test_future_exception_never_retrieved(self, m_log): self.loop.set_debug(True) - def memroy_error(): + def memory_error(): try: raise MemoryError() except BaseException as exc: return exc - exc = memroy_error() + exc = memory_error() future = asyncio.Future(loop=self.loop) source_traceback = future._source_traceback diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -233,6 +233,9 @@ self.assertRegex(repr(task), '' % re.escape(repr(fut))) + fut.set_result(None) + self.loop.run_until_complete(task) + def test_task_basics(self): @asyncio.coroutine def outer(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 12:44:37 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 12:44:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Update_asyncio?= =?utf-8?q?_documentation?= Message-ID: <3h70dd2whFz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/66f06fbf8a2f changeset: 91609:66f06fbf8a2f branch: 3.4 user: Victor Stinner date: Tue Jul 08 12:39:10 2014 +0200 summary: Update asyncio documentation - Document the new create_task() method - "Hide" the Task class: point to the create_task() method for interoperability - Rewrite the documentation of the Task class - Document the "Pending task destroyed" - Update output in debug mode of examples in the dev section - Replace Task() with create_task() in examples files: Doc/library/asyncio-dev.rst | 95 +++++++++++++----- Doc/library/asyncio-eventloop.rst | 23 ++++- Doc/library/asyncio-stream.rst | 3 +- Doc/library/asyncio-task.rst | 59 ++++++++--- 4 files changed, 131 insertions(+), 49 deletions(-) diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -103,20 +103,11 @@ Detect coroutine objects never scheduled ---------------------------------------- -When a coroutine function is called but not passed to :func:`async` or to the -:class:`Task` constructor, it is not scheduled and it is probably a bug. - -To detect such bug, :ref:`enable the debug mode of asyncio -`. When the coroutine object is destroyed by the garbage -collector, a log will be emitted with the traceback where the coroutine -function was called. See the :ref:`asyncio logger `. - -The debug flag changes the behaviour of the :func:`coroutine` decorator. The -debug flag value is only used when then coroutine function is defined, not when -it is called. Coroutine functions defined before the debug flag is set to -``True`` will not be tracked. For example, it is not possible to debug -coroutines defined in the :mod:`asyncio` module, because the module must be -imported before the flag value can be changed. +When a coroutine function is called and its result is not passed to +:func:`async` or to the :meth:`BaseEventLoop.create_task` method: the execution +of the coroutine objet will never be scheduled and it is probably a bug. +:ref:`Enable the debug mode of asyncio ` to :ref:`log a +warning ` to detect it. Example with the bug:: @@ -130,20 +121,27 @@ Output in debug mode:: - Coroutine 'test' defined at test.py:4 was never yielded from + Coroutine test() at test.py:3 was never yielded from + Coroutine object created at (most recent call last): + File "test.py", line 7, in + test() -The fix is to call the :func:`async` function or create a :class:`Task` object -with this coroutine object. +The fix is to call the :func:`async` function or the +:meth:`BaseEventLoop.create_task` method with the coroutine object. +.. seealso:: -Detect exceptions not consumed ------------------------------- + :ref:`Pending task destroyed `. + + +Detect exceptions never consumed +-------------------------------- Python usually calls :func:`sys.displayhook` on unhandled exceptions. If -:meth:`Future.set_exception` is called, but the exception is not consumed, -:func:`sys.displayhook` is not called. Instead, a log is emitted when the -future is deleted by the garbage collector, with the traceback where the -exception was raised. See the :ref:`asyncio logger `. +:meth:`Future.set_exception` is called, but the exception is never consumed, +:func:`sys.displayhook` is not called. Instead, a :ref:`a log is emitted +` when the future is deleted by the garbage collector, with the +traceback where the exception was raised. Example of unhandled exception:: @@ -159,16 +157,27 @@ Output:: - Future/Task exception was never retrieved: + Task exception was never retrieved + future: + source_traceback: Object created at (most recent call last): + File "test.py", line 10, in + asyncio.async(bug()) + File "asyncio/tasks.py", line 510, in async + task = loop.create_task(coro_or_future) Traceback (most recent call last): - File "/usr/lib/python3.4/asyncio/tasks.py", line 279, in _step + File "asyncio/tasks.py", line 244, in _step result = next(coro) - File "/usr/lib/python3.4/asyncio/tasks.py", line 80, in coro + File "coroutines.py", line 78, in __next__ + return next(self.gen) + File "asyncio/coroutines.py", line 141, in coro res = func(*args, **kw) - File "test.py", line 5, in bug + File "test.py", line 7, in bug raise Exception("not consumed") Exception: not consumed +:ref:`Enable the debug mode of asyncio ` to get the +traceback where the task was created. + There are different options to fix this issue. The first option is to chain to coroutine in another coroutine and use classic try/except:: @@ -195,7 +204,7 @@ See also the :meth:`Future.exception` method. -Chain coroutines correctly +Chain correctly coroutines -------------------------- When a coroutine function calls other coroutine functions and tasks, they @@ -246,7 +255,9 @@ (3) close file (2) write into file - Pending tasks at exit: {Task()} + Pending tasks at exit: {>} + Task was destroyed but it is pending! + task: > The loop stopped before the ``create()`` finished, ``close()`` has been called before ``write()``, whereas coroutine functions were called in this order: @@ -272,3 +283,29 @@ yield from asyncio.sleep(2.0) loop.stop() + +.. _asyncio-pending-task-destroyed: + +Pending task destroyed +---------------------- + +If a pending task is destroyed, the execution of its wrapped :ref:`coroutine +` did not complete. It is probably a bug and so a warning is logged. + +Example of log:: + + Task was destroyed but it is pending! + source_traceback: Object created at (most recent call last): + File "test.py", line 17, in + task = asyncio.async(coro, loop=loop) + File "asyncio/tasks.py", line 510, in async + task = loop.create_task(coro_or_future) + task: > + +:ref:`Enable the debug mode of asyncio ` to get the +traceback where the task was created. + +.. seealso:: + + :ref:`Detect coroutine objects never scheduled `. + diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -102,8 +102,8 @@ Run until the :class:`Future` is done. - If the argument is a :ref:`coroutine `, it is wrapped - in a :class:`Task`. + If the argument is a :ref:`coroutine object `, it is wrapped by + :func:`async`. Return the Future's result, or raise its exception. @@ -205,6 +205,25 @@ The :func:`asyncio.sleep` function. +Coroutines +---------- + +.. method:: BaseEventLoop.create_task(coro) + + Schedule the execution of a :ref:`coroutine object `: wrap it in + a future. Return a :class:`Task` object. + + Third-party event loops can use their own subclass of :class:`Task` for + interoperability. In this case, the result type is a subclass of + :class:`Task`. + + .. seealso:: + + The :meth:`async` function. + + .. versionadded:: 3.4.2 + + Creating connections -------------------- diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -41,7 +41,8 @@ :class:`StreamReader` object, while *client_writer* is a :class:`StreamWriter` object. This parameter can either be a plain callback function or a :ref:`coroutine function `; if it is a coroutine - function, it will be automatically converted into a :class:`Task`. + function, it will be automatically wrapped in a future using the + :meth:`BaseEventLoop.create_task` method. The rest of the arguments are all the usual arguments to :meth:`~BaseEventLoop.create_server()` except *protocol_factory*; most diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -51,8 +51,8 @@ generator object, which doesn't do anything until you iterate over it. In the case of a coroutine object, there are two basic ways to start it running: call ``yield from coroutine`` from another coroutine -(assuming the other coroutine is already running!), or convert it to a -:class:`Task`. +(assuming the other coroutine is already running!), or schedule its execution +using the :meth:`BaseEventLoop.create_task` method. Coroutines (and tasks) can only run when the event loop is running. @@ -256,7 +256,7 @@ loop = asyncio.get_event_loop() future = asyncio.Future() - asyncio.Task(slow_operation(future)) + loop.create_task(slow_operation(future)) loop.run_until_complete(future) print(future.result()) loop.close() @@ -292,7 +292,7 @@ loop = asyncio.get_event_loop() future = asyncio.Future() - asyncio.Task(slow_operation(future)) + loop.create_task(slow_operation(future)) future.add_done_callback(got_result) try: loop.run_forever() @@ -314,7 +314,33 @@ .. class:: Task(coro, \*, loop=None) - A coroutine object wrapped in a :class:`Future`. Subclass of :class:`Future`. + Schedule the execution of a :ref:`coroutine `: wrap it in a + future. A task is a subclass of :class:`Future`. + + A task is responsible to execute a coroutine object in an event loop. If + the wrapped coroutine yields from a future, the task suspends the execution + of the wrapped coroutine and waits for the completition of the future. When + the future is done, the execution of the wrapped coroutine restarts with the + result or the exception of the future. + + Event loops use cooperative scheduling: an event loop only runs one task at + the same time. Other tasks may run in parallel if other event loops are + running in different threads. While a task waits for the completion of a + future, the event loop executes a new task. + + The cancellation of a task is different than cancelling a future. Calling + :meth:`cancel` will throw a :exc:`~concurrent.futures.CancelledError` to the + wrapped coroutine. :meth:`~Future.cancelled` only returns ``True`` if the + wrapped coroutine did not catch the + :exc:`~concurrent.futures.CancelledError` exception, or raised a + :exc:`~concurrent.futures.CancelledError` exception. + + If a pending task is destroyed, the execution of its wrapped :ref:`coroutine + ` did not complete. It is probably a bug and a warning is + logged: see :ref:`Pending task destroyed `. + + Don't create directly :class:`Task` instances: use the + :meth:`BaseEventLoop.create_task` method. .. classmethod:: all_tasks(loop=None) @@ -396,12 +422,11 @@ f *= i print("Task %s: factorial(%s) = %s" % (name, number, f)) + loop = asyncio.get_event_loop() tasks = [ - asyncio.Task(factorial("A", 2)), - asyncio.Task(factorial("B", 3)), - asyncio.Task(factorial("C", 4))] - - loop = asyncio.get_event_loop() + loop.create_task(factorial("A", 2)), + loop.create_task(factorial("B", 3)), + loop.create_task(factorial("C", 4))] loop.run_until_complete(asyncio.wait(tasks)) loop.close() @@ -450,7 +475,8 @@ .. function:: async(coro_or_future, \*, loop=None) - Wrap a :ref:`coroutine object ` in a future. + Wrap a :ref:`coroutine object ` in a future using the + :meth:`BaseEventLoop.create_task` method. If the argument is a :class:`Future`, it is returned directly. @@ -566,18 +592,17 @@ .. function:: wait_for(fut, timeout, \*, loop=None) Wait for the single :class:`Future` or :ref:`coroutine object ` - to complete, with timeout. If *timeout* is ``None``, block until the future + to complete with timeout. If *timeout* is ``None``, block until the future completes. - Coroutine will be wrapped in :class:`Task`. + Coroutine objects are wrapped in a future using the + :meth:`BaseEventLoop.create_task` method. Returns result of the Future or coroutine. When a timeout occurs, it cancels the task and raises :exc:`asyncio.TimeoutError`. To avoid the task cancellation, wrap it in :func:`shield`. - This function is a :ref:`coroutine `. + This function is a :ref:`coroutine `, usage:: - Usage:: + result = yield from asyncio.wait_for(fut, 60.0) - result = yield from asyncio.wait_for(fut, 60.0) - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 12:44:38 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 12:44:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy40?= Message-ID: <3h70df72Hdz7Lkm@mail.python.org> http://hg.python.org/cpython/rev/c7960cc9daa5 changeset: 91610:c7960cc9daa5 parent: 91607:4609e31092b2 parent: 91609:66f06fbf8a2f user: Victor Stinner date: Tue Jul 08 12:43:24 2014 +0200 summary: Merge 3.4 asyncio: sync with Tulip - Tulip issue 185: Add a create_task() method to event loops. The create_task() method can be overriden in custom event loop to implement their own task class. For example, greenio and Pulsar projects use their own task class. The create_task() method is now preferred over creating directly task using the Task class. - tests: fix a warning - fix typo in the name of a test function - Update AbstractEventLoop: add new event loop methods; update also the unit test Update asyncio documentation - Document the new create_task() method - "Hide" the Task class: point to the create_task() method for interoperability - Rewrite the documentation of the Task class - Document the "Pending task destroyed" - Update output in debug mode of examples in the dev section - Replace Task() with create_task() in examples files: Doc/library/asyncio-dev.rst | 95 +++++++--- Doc/library/asyncio-eventloop.rst | 23 ++- Doc/library/asyncio-stream.rst | 3 +- Doc/library/asyncio-task.rst | 59 ++++- Lib/asyncio/base_events.py | 6 + Lib/asyncio/events.py | 9 + Lib/asyncio/streams.py | 2 +- Lib/asyncio/tasks.py | 4 +- Lib/asyncio/test_utils.py | 2 +- Lib/test/test_asyncio/test_base_events.py | 24 ++ Lib/test/test_asyncio/test_events.py | 14 + Lib/test/test_asyncio/test_futures.py | 4 +- Lib/test/test_asyncio/test_tasks.py | 3 + 13 files changed, 194 insertions(+), 54 deletions(-) diff --git a/Doc/library/asyncio-dev.rst b/Doc/library/asyncio-dev.rst --- a/Doc/library/asyncio-dev.rst +++ b/Doc/library/asyncio-dev.rst @@ -103,20 +103,11 @@ Detect coroutine objects never scheduled ---------------------------------------- -When a coroutine function is called but not passed to :func:`async` or to the -:class:`Task` constructor, it is not scheduled and it is probably a bug. - -To detect such bug, :ref:`enable the debug mode of asyncio -`. When the coroutine object is destroyed by the garbage -collector, a log will be emitted with the traceback where the coroutine -function was called. See the :ref:`asyncio logger `. - -The debug flag changes the behaviour of the :func:`coroutine` decorator. The -debug flag value is only used when then coroutine function is defined, not when -it is called. Coroutine functions defined before the debug flag is set to -``True`` will not be tracked. For example, it is not possible to debug -coroutines defined in the :mod:`asyncio` module, because the module must be -imported before the flag value can be changed. +When a coroutine function is called and its result is not passed to +:func:`async` or to the :meth:`BaseEventLoop.create_task` method: the execution +of the coroutine objet will never be scheduled and it is probably a bug. +:ref:`Enable the debug mode of asyncio ` to :ref:`log a +warning ` to detect it. Example with the bug:: @@ -130,20 +121,27 @@ Output in debug mode:: - Coroutine 'test' defined at test.py:4 was never yielded from + Coroutine test() at test.py:3 was never yielded from + Coroutine object created at (most recent call last): + File "test.py", line 7, in + test() -The fix is to call the :func:`async` function or create a :class:`Task` object -with this coroutine object. +The fix is to call the :func:`async` function or the +:meth:`BaseEventLoop.create_task` method with the coroutine object. +.. seealso:: -Detect exceptions not consumed ------------------------------- + :ref:`Pending task destroyed `. + + +Detect exceptions never consumed +-------------------------------- Python usually calls :func:`sys.displayhook` on unhandled exceptions. If -:meth:`Future.set_exception` is called, but the exception is not consumed, -:func:`sys.displayhook` is not called. Instead, a log is emitted when the -future is deleted by the garbage collector, with the traceback where the -exception was raised. See the :ref:`asyncio logger `. +:meth:`Future.set_exception` is called, but the exception is never consumed, +:func:`sys.displayhook` is not called. Instead, a :ref:`a log is emitted +` when the future is deleted by the garbage collector, with the +traceback where the exception was raised. Example of unhandled exception:: @@ -159,16 +157,27 @@ Output:: - Future/Task exception was never retrieved: + Task exception was never retrieved + future: + source_traceback: Object created at (most recent call last): + File "test.py", line 10, in + asyncio.async(bug()) + File "asyncio/tasks.py", line 510, in async + task = loop.create_task(coro_or_future) Traceback (most recent call last): - File "/usr/lib/python3.4/asyncio/tasks.py", line 279, in _step + File "asyncio/tasks.py", line 244, in _step result = next(coro) - File "/usr/lib/python3.4/asyncio/tasks.py", line 80, in coro + File "coroutines.py", line 78, in __next__ + return next(self.gen) + File "asyncio/coroutines.py", line 141, in coro res = func(*args, **kw) - File "test.py", line 5, in bug + File "test.py", line 7, in bug raise Exception("not consumed") Exception: not consumed +:ref:`Enable the debug mode of asyncio ` to get the +traceback where the task was created. + There are different options to fix this issue. The first option is to chain to coroutine in another coroutine and use classic try/except:: @@ -195,7 +204,7 @@ See also the :meth:`Future.exception` method. -Chain coroutines correctly +Chain correctly coroutines -------------------------- When a coroutine function calls other coroutine functions and tasks, they @@ -246,7 +255,9 @@ (3) close file (2) write into file - Pending tasks at exit: {Task()} + Pending tasks at exit: {>} + Task was destroyed but it is pending! + task: > The loop stopped before the ``create()`` finished, ``close()`` has been called before ``write()``, whereas coroutine functions were called in this order: @@ -272,3 +283,29 @@ yield from asyncio.sleep(2.0) loop.stop() + +.. _asyncio-pending-task-destroyed: + +Pending task destroyed +---------------------- + +If a pending task is destroyed, the execution of its wrapped :ref:`coroutine +` did not complete. It is probably a bug and so a warning is logged. + +Example of log:: + + Task was destroyed but it is pending! + source_traceback: Object created at (most recent call last): + File "test.py", line 17, in + task = asyncio.async(coro, loop=loop) + File "asyncio/tasks.py", line 510, in async + task = loop.create_task(coro_or_future) + task: > + +:ref:`Enable the debug mode of asyncio ` to get the +traceback where the task was created. + +.. seealso:: + + :ref:`Detect coroutine objects never scheduled `. + diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -102,8 +102,8 @@ Run until the :class:`Future` is done. - If the argument is a :ref:`coroutine `, it is wrapped - in a :class:`Task`. + If the argument is a :ref:`coroutine object `, it is wrapped by + :func:`async`. Return the Future's result, or raise its exception. @@ -205,6 +205,25 @@ The :func:`asyncio.sleep` function. +Coroutines +---------- + +.. method:: BaseEventLoop.create_task(coro) + + Schedule the execution of a :ref:`coroutine object `: wrap it in + a future. Return a :class:`Task` object. + + Third-party event loops can use their own subclass of :class:`Task` for + interoperability. In this case, the result type is a subclass of + :class:`Task`. + + .. seealso:: + + The :meth:`async` function. + + .. versionadded:: 3.4.2 + + Creating connections -------------------- diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -41,7 +41,8 @@ :class:`StreamReader` object, while *client_writer* is a :class:`StreamWriter` object. This parameter can either be a plain callback function or a :ref:`coroutine function `; if it is a coroutine - function, it will be automatically converted into a :class:`Task`. + function, it will be automatically wrapped in a future using the + :meth:`BaseEventLoop.create_task` method. The rest of the arguments are all the usual arguments to :meth:`~BaseEventLoop.create_server()` except *protocol_factory*; most diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -51,8 +51,8 @@ generator object, which doesn't do anything until you iterate over it. In the case of a coroutine object, there are two basic ways to start it running: call ``yield from coroutine`` from another coroutine -(assuming the other coroutine is already running!), or convert it to a -:class:`Task`. +(assuming the other coroutine is already running!), or schedule its execution +using the :meth:`BaseEventLoop.create_task` method. Coroutines (and tasks) can only run when the event loop is running. @@ -256,7 +256,7 @@ loop = asyncio.get_event_loop() future = asyncio.Future() - asyncio.Task(slow_operation(future)) + loop.create_task(slow_operation(future)) loop.run_until_complete(future) print(future.result()) loop.close() @@ -292,7 +292,7 @@ loop = asyncio.get_event_loop() future = asyncio.Future() - asyncio.Task(slow_operation(future)) + loop.create_task(slow_operation(future)) future.add_done_callback(got_result) try: loop.run_forever() @@ -314,7 +314,33 @@ .. class:: Task(coro, \*, loop=None) - A coroutine object wrapped in a :class:`Future`. Subclass of :class:`Future`. + Schedule the execution of a :ref:`coroutine `: wrap it in a + future. A task is a subclass of :class:`Future`. + + A task is responsible to execute a coroutine object in an event loop. If + the wrapped coroutine yields from a future, the task suspends the execution + of the wrapped coroutine and waits for the completition of the future. When + the future is done, the execution of the wrapped coroutine restarts with the + result or the exception of the future. + + Event loops use cooperative scheduling: an event loop only runs one task at + the same time. Other tasks may run in parallel if other event loops are + running in different threads. While a task waits for the completion of a + future, the event loop executes a new task. + + The cancellation of a task is different than cancelling a future. Calling + :meth:`cancel` will throw a :exc:`~concurrent.futures.CancelledError` to the + wrapped coroutine. :meth:`~Future.cancelled` only returns ``True`` if the + wrapped coroutine did not catch the + :exc:`~concurrent.futures.CancelledError` exception, or raised a + :exc:`~concurrent.futures.CancelledError` exception. + + If a pending task is destroyed, the execution of its wrapped :ref:`coroutine + ` did not complete. It is probably a bug and a warning is + logged: see :ref:`Pending task destroyed `. + + Don't create directly :class:`Task` instances: use the + :meth:`BaseEventLoop.create_task` method. .. classmethod:: all_tasks(loop=None) @@ -396,12 +422,11 @@ f *= i print("Task %s: factorial(%s) = %s" % (name, number, f)) + loop = asyncio.get_event_loop() tasks = [ - asyncio.Task(factorial("A", 2)), - asyncio.Task(factorial("B", 3)), - asyncio.Task(factorial("C", 4))] - - loop = asyncio.get_event_loop() + loop.create_task(factorial("A", 2)), + loop.create_task(factorial("B", 3)), + loop.create_task(factorial("C", 4))] loop.run_until_complete(asyncio.wait(tasks)) loop.close() @@ -450,7 +475,8 @@ .. function:: async(coro_or_future, \*, loop=None) - Wrap a :ref:`coroutine object ` in a future. + Wrap a :ref:`coroutine object ` in a future using the + :meth:`BaseEventLoop.create_task` method. If the argument is a :class:`Future`, it is returned directly. @@ -566,18 +592,17 @@ .. function:: wait_for(fut, timeout, \*, loop=None) Wait for the single :class:`Future` or :ref:`coroutine object ` - to complete, with timeout. If *timeout* is ``None``, block until the future + to complete with timeout. If *timeout* is ``None``, block until the future completes. - Coroutine will be wrapped in :class:`Task`. + Coroutine objects are wrapped in a future using the + :meth:`BaseEventLoop.create_task` method. Returns result of the Future or coroutine. When a timeout occurs, it cancels the task and raises :exc:`asyncio.TimeoutError`. To avoid the task cancellation, wrap it in :func:`shield`. - This function is a :ref:`coroutine `. + This function is a :ref:`coroutine `, usage:: - Usage:: + result = yield from asyncio.wait_for(fut, 60.0) - result = yield from asyncio.wait_for(fut, 60.0) - diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -151,6 +151,12 @@ % (self.__class__.__name__, self.is_running(), self.is_closed(), self.get_debug())) + def create_task(self, coro): + """Schedule a coroutine object. + + Return a task object.""" + return tasks.Task(coro, loop=self) + def _make_socket_transport(self, sock, protocol, waiter=None, *, extra=None, server=None): """Create socket transport.""" diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -200,6 +200,10 @@ """Return whether the event loop is currently running.""" raise NotImplementedError + def is_closed(self): + """Returns True if the event loop was closed.""" + raise NotImplementedError + def close(self): """Close the loop. @@ -225,6 +229,11 @@ def time(self): raise NotImplementedError + # Method scheduling a coroutine object: create a task. + + def create_task(self, coro): + raise NotImplementedError + # Methods for interacting with threads. def call_soon_threadsafe(self, callback, *args): diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -213,7 +213,7 @@ res = self._client_connected_cb(self._stream_reader, self._stream_writer) if coroutines.iscoroutine(res): - tasks.Task(res, loop=self._loop) + self._loop.create_task(res) def connection_lost(self, exc): if exc is None: diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -505,7 +505,9 @@ raise ValueError('loop argument must agree with Future') return coro_or_future elif coroutines.iscoroutine(coro_or_future): - task = Task(coro_or_future, loop=loop) + if loop is None: + loop = events.get_event_loop() + task = loop.create_task(coro_or_future) if task._source_traceback: del task._source_traceback[-1] return task diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -48,7 +48,7 @@ def once(): pass gen = once() - t = tasks.Task(gen, loop=loop) + t = loop.create_task(gen) # Don't log a warning if the task is not done after run_until_complete(). # It occurs if the loop is stopped or if a task raises a BaseException. t._log_destroy_pending = False diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -12,6 +12,7 @@ import asyncio from asyncio import base_events +from asyncio import events from asyncio import constants from asyncio import test_utils @@ -526,6 +527,29 @@ PYTHONASYNCIODEBUG='1') self.assertEqual(stdout.rstrip(), b'False') + def test_create_task(self): + class MyTask(asyncio.Task): + pass + + @asyncio.coroutine + def test(): + pass + + class EventLoop(base_events.BaseEventLoop): + def create_task(self, coro): + return MyTask(coro, loop=loop) + + loop = EventLoop() + self.set_event_loop(loop) + + coro = test() + task = asyncio.async(coro, loop=loop) + self.assertIsInstance(task, MyTask) + + # make warnings quiet + task._log_destroy_pending = False + coro.close() + class MyProto(asyncio.Protocol): done = None diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1969,8 +1969,12 @@ self.assertRaises( NotImplementedError, loop.is_running) self.assertRaises( + NotImplementedError, loop.is_closed) + self.assertRaises( NotImplementedError, loop.close) self.assertRaises( + NotImplementedError, loop.create_task, None) + self.assertRaises( NotImplementedError, loop.call_later, None, None) self.assertRaises( NotImplementedError, loop.call_at, f, f) @@ -2027,6 +2031,16 @@ mock.sentinel) self.assertRaises( NotImplementedError, loop.subprocess_exec, f) + self.assertRaises( + NotImplementedError, loop.set_exception_handler, f) + self.assertRaises( + NotImplementedError, loop.default_exception_handler, f) + self.assertRaises( + NotImplementedError, loop.call_exception_handler, f) + self.assertRaises( + NotImplementedError, loop.get_debug) + self.assertRaises( + NotImplementedError, loop.set_debug, f) class ProtocolsAbsTests(unittest.TestCase): diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -301,12 +301,12 @@ def test_future_exception_never_retrieved(self, m_log): self.loop.set_debug(True) - def memroy_error(): + def memory_error(): try: raise MemoryError() except BaseException as exc: return exc - exc = memroy_error() + exc = memory_error() future = asyncio.Future(loop=self.loop) source_traceback = future._source_traceback diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -233,6 +233,9 @@ self.assertRegex(repr(task), '' % re.escape(repr(fut))) + fut.set_result(None) + self.loop.run_until_complete(task) + def test_task_basics(self): @asyncio.coroutine def outer(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 16:42:29 2014 From: python-checkins at python.org (zach.ware) Date: Tue, 8 Jul 2014 16:42:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321907=3A_Make_the?= =?utf-8?q?_buildbot_clean_script_always_return_0=2E?= Message-ID: <3h75w545cQz7LjM@mail.python.org> http://hg.python.org/cpython/rev/06589e81fd56 changeset: 91611:06589e81fd56 user: Zachary Ware date: Tue Jul 08 09:41:57 2014 -0500 summary: Issue #21907: Make the buildbot clean script always return 0. The clean script is a "best effort" thing anyway, and this will hopefully revive the XP buildbot. files: Tools/buildbot/clean.bat | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Tools/buildbot/clean.bat b/Tools/buildbot/clean.bat --- a/Tools/buildbot/clean.bat +++ b/Tools/buildbot/clean.bat @@ -20,3 +20,6 @@ echo Purging all non-tracked files with `hg purge` echo on hg -R "%root%" --config extensions.purge= purge --all -X "%root%\Lib\test\data" + + at rem Clean is best effort, so we "always succeed" + at exit /b 0 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 23:43:21 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 23:43:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNjgw?= =?utf-8?q?=3A_Document_asyncio_event_loops?= Message-ID: <3h7HFj38t3z7LjX@mail.python.org> http://hg.python.org/cpython/rev/3f1381e3a68f changeset: 91612:3f1381e3a68f branch: 3.4 parent: 91609:66f06fbf8a2f user: Victor Stinner date: Tue Jul 08 23:42:38 2014 +0200 summary: Issue #21680: Document asyncio event loops files: Doc/library/asyncio-eventloop.rst | 82 +- Doc/library/asyncio-eventloop.rst | 762 ++-------------- Doc/library/asyncio-subprocess.rst | 20 +- Doc/library/asyncio.rst | 1 + 4 files changed, 132 insertions(+), 733 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -2,8 +2,8 @@ .. _asyncio-event-loop: -Event loops -=========== +Base Event Loop +=============== The event loop is the central execution device provided by :mod:`asyncio`. It provides multiple facilities, amongst which: @@ -18,78 +18,9 @@ * Delegating costly function calls to a pool of threads. -Event loop policies and the default policy ------------------------------------------- +.. class:: BaseEventLoop -Event loop management is abstracted with a *policy* pattern, to provide maximal -flexibility for custom platforms and frameworks. Throughout the execution of a -process, a single global policy object manages the event loops available to the -process based on the calling context. A policy is an object implementing the -:class:`AbstractEventLoopPolicy` interface. - -For most users of :mod:`asyncio`, policies never have to be dealt with -explicitly, since the default global policy is sufficient. - -The default policy defines context as the current thread, and manages an event -loop per thread that interacts with :mod:`asyncio`. The module-level functions -:func:`get_event_loop` and :func:`set_event_loop` provide convenient access to -event loops managed by the default policy. - -Event loop functions --------------------- - -The following functions are convenient shortcuts to accessing the methods of the -global policy. Note that this provides access to the default policy, unless an -alternative policy was set by calling :func:`set_event_loop_policy` earlier in -the execution of the process. - -.. function:: get_event_loop() - - Equivalent to calling ``get_event_loop_policy().get_event_loop()``. - -.. function:: set_event_loop(loop) - - Equivalent to calling ``get_event_loop_policy().set_event_loop(loop)``. - -.. function:: new_event_loop() - - Equivalent to calling ``get_event_loop_policy().new_event_loop()``. - -Event loop policy interface ---------------------------- - -An event loop policy must implement the following interface: - -.. class:: AbstractEventLoopPolicy - - .. method:: get_event_loop() - - Get the event loop for the current context. Returns an event loop object - implementing the :class:`BaseEventLoop` interface, or raises an exception in case - no event loop has been set for the current context and the current policy - does not specify to create one. It should never return ``None``. - - .. method:: set_event_loop(loop) - - Set the event loop for the current context to *loop*. - - .. method:: new_event_loop() - - Create and return a new event loop object according to this policy's rules. - If there's need to set this loop as the event loop for the current context, - :meth:`set_event_loop` must be called explicitly. - -Access to the global loop policy --------------------------------- - -.. function:: get_event_loop_policy() - - Get the current event loop policy. - -.. function:: set_event_loop_policy(policy) - - Set the current event loop policy. If *policy* is ``None``, the default - policy is restored. + Base class of event loops. Run an event loop ----------------- @@ -375,7 +306,6 @@ Availability: UNIX. - Watch file descriptors ---------------------- @@ -624,7 +554,6 @@ The :ref:`debug mode of asyncio `. - Server ------ @@ -652,7 +581,8 @@ .. method:: cancel() - Cancel the call. + Cancel the call. + .. _asyncio-hello-world-callback: diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloops.rst copy from Doc/library/asyncio-eventloop.rst copy to Doc/library/asyncio-eventloops.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloops.rst @@ -1,40 +1,8 @@ .. currentmodule:: asyncio -.. _asyncio-event-loop: - Event loops =========== -The event loop is the central execution device provided by :mod:`asyncio`. -It provides multiple facilities, amongst which: - -* Registering, executing and cancelling delayed calls (timeouts). - -* Creating client and server :ref:`transports ` for various - kinds of communication. - -* Launching subprocesses and the associated :ref:`transports - ` for communication with an external program. - -* Delegating costly function calls to a pool of threads. - -Event loop policies and the default policy ------------------------------------------- - -Event loop management is abstracted with a *policy* pattern, to provide maximal -flexibility for custom platforms and frameworks. Throughout the execution of a -process, a single global policy object manages the event loops available to the -process based on the calling context. A policy is an object implementing the -:class:`AbstractEventLoopPolicy` interface. - -For most users of :mod:`asyncio`, policies never have to be dealt with -explicitly, since the default global policy is sufficient. - -The default policy defines context as the current thread, and manages an event -loop per thread that interacts with :mod:`asyncio`. The module-level functions -:func:`get_event_loop` and :func:`set_event_loop` provide convenient access to -event loops managed by the default policy. - Event loop functions -------------------- @@ -55,6 +23,121 @@ Equivalent to calling ``get_event_loop_policy().new_event_loop()``. + +Available event loops +--------------------- + +asyncio currently provides two implementations of event loops: +:class:`SelectorEventLoop` and :class:`ProactorEventLoop`. + +.. class:: SelectorEventLoop + + Event loop based on the :mod:`selectors` module. Subclass of + :class:`BaseEventLoop`. + + Use the most efficient selector available on the platform. + +.. class:: ProactorEventLoop + + Proactor event loop for Windows using "I/O Completion Ports" aka IOCP. + Subclass of :class:`BaseEventLoop`. + + Availability: Windows. + + .. seealso:: + + `MSDN documentation on I/O Completion Ports + `_. + +Example to use a :class:`ProactorEventLoop` on Windows:: + + import asyncio, os + + if os.name == 'nt': + loop = asyncio.ProactorEventLoop() + asyncio.set_event_loop(loop) + + +Platform support +---------------- + +The :mod:`asyncio` module has been designed to be portable, but each platform +still has subtle differences and may not support all :mod:`asyncio` features. + +Windows +^^^^^^^ + +Common limits of Windows event loops: + +- :meth:`~BaseEventLoop.create_unix_server` and + :meth:`~BaseEventLoop.create_unix_server` are not supported: specific to UNIX +- :meth:`~BaseEventLoop.add_signal_handler` and + :meth:`~BaseEventLoop.remove_signal_handler` are not supported +- Pipes are not supported: :meth:`~BaseEventLoop.connect_read_pipe` and + :meth:`~BaseEventLoop.connect_write_pipe` +- :meth:`EventLoopPolicy.set_child_watcher` is not supported + +:class:`SelectorEventLoop` specific limits: + +- :class:`~selectors.SelectSelector` is used but it only supports sockets, + see the `MSDN documentation of select + `_. +- it is not possible to execute subprocesses +- :meth:`~BaseEventLoop.add_reader` and :meth:`~BaseEventLoop.add_writer` only + accept file descriptors of sockets + +:class:`ProactorEventLoop` specific limits: + +- SSL is not supported: :meth:`~BaseEventLoop.create_connection` and + :meth:`~BaseEventLoop.create_server` cannot be used with SSL for example +- :meth:`~BaseEventLoop.create_datagram_endpoint` (UDP) is not supported +- :meth:`~BaseEventLoop.add_reader` and :meth:`~BaseEventLoop.add_writer` are + not supported + +The resolution of the monotonic clock on Windows is usually around 15.6 msec. +The best resolution is 0.5 msec. The exact resolution depends on the hardware +(availability of HPET) and the Windows configuration. See :ref:`asyncio delayed +calls `. + + +Mac OS X +^^^^^^^^ + +Character devices like PTY are only well supported since Mavericks (Mac OS +10.9). They are not supported at all on Mac OS 10.5 and older. + +On Mac OS 10.6, 10.7 and 10.8, the default event loop is +:class:`SelectorEventLoop` which uses :class:`selectors.KqueueSelector`. +:class:`selectors.KqueueSelector` does not support character devices on these +versions. The :class:`SelectorEventLoop` can be used with +:class:`~selectors.SelectSelector` or :class:`~selectors.PollSelector` to +support character devices on these versions of Mac OS X. Example:: + + import asyncio + import selectors + + selector = selectors.SelectSelector() + loop = asyncio.SelectorEventLoop(selector) + asyncio.set_event_loop(loop) + + +Event loop policies and the default policy +------------------------------------------ + +Event loop management is abstracted with a *policy* pattern, to provide maximal +flexibility for custom platforms and frameworks. Throughout the execution of a +process, a single global policy object manages the event loops available to the +process based on the calling context. A policy is an object implementing the +:class:`AbstractEventLoopPolicy` interface. + +For most users of :mod:`asyncio`, policies never have to be dealt with +explicitly, since the default global policy is sufficient. + +The default policy defines context as the current thread, and manages an event +loop per thread that interacts with :mod:`asyncio`. The module-level functions +:func:`get_event_loop` and :func:`set_event_loop` provide convenient access to +event loops managed by the default policy. + Event loop policy interface --------------------------- @@ -91,618 +174,3 @@ Set the current event loop policy. If *policy* is ``None``, the default policy is restored. -Run an event loop ------------------ - -.. method:: BaseEventLoop.run_forever() - - Run until :meth:`stop` is called. - -.. method:: BaseEventLoop.run_until_complete(future) - - Run until the :class:`Future` is done. - - If the argument is a :ref:`coroutine object `, it is wrapped by - :func:`async`. - - Return the Future's result, or raise its exception. - -.. method:: BaseEventLoop.is_running() - - Returns running status of event loop. - -.. method:: BaseEventLoop.stop() - - Stop running the event loop. - - Every callback scheduled before :meth:`stop` is called will run. - Callback scheduled after :meth:`stop` is called won't. However, those - callbacks will run if :meth:`run_forever` is called again later. - -.. method:: BaseEventLoop.is_closed() - - Returns ``True`` if the event loop was closed. - - .. versionadded:: 3.4.2 - -.. method:: BaseEventLoop.close() - - Close the event loop. The loop should not be running. - - This clears the queues and shuts down the executor, but does not wait for - the executor to finish. - - The event loop must not be running. - - This is idempotent and irreversible. No other methods should be called after - this one. - - -Calls ------ - -.. method:: BaseEventLoop.call_soon(callback, \*args) - - Arrange for a callback to be called as soon as possible. - - This operates as a FIFO queue, callbacks are called in the order in - which they are registered. Each callback will be called exactly once. - - Any positional arguments after the callback will be passed to the - callback when it is called. - - An instance of :class:`asyncio.Handle` is returned. - -.. method:: BaseEventLoop.call_soon_threadsafe(callback, \*args) - - Like :meth:`call_soon`, but thread safe. - - -.. _asyncio-delayed-calls: - -Delayed calls -------------- - -The event loop has its own internal clock for computing timeouts. -Which clock is used depends on the (platform-specific) event loop -implementation; ideally it is a monotonic clock. This will generally be -a different clock than :func:`time.time`. - -.. note:: - - Timeouts (relative *delay* or absolute *when*) should not exceed one day. - - -.. method:: BaseEventLoop.call_later(delay, callback, *args) - - Arrange for the *callback* to be called after the given *delay* - seconds (either an int or float). - - An instance of :class:`asyncio.Handle` is returned. - - *callback* will be called exactly once per call to :meth:`call_later`. - If two callbacks are scheduled for exactly the same time, it is - undefined which will be called first. - - The optional positional *args* will be passed to the callback when it - is called. If you want the callback to be called with some named - arguments, use a closure or :func:`functools.partial`. - -.. method:: BaseEventLoop.call_at(when, callback, *args) - - Arrange for the *callback* to be called at the given absolute timestamp - *when* (an int or float), using the same time reference as :meth:`time`. - - This method's behavior is the same as :meth:`call_later`. - -.. method:: BaseEventLoop.time() - - Return the current time, as a :class:`float` value, according to the - event loop's internal clock. - -.. seealso:: - - The :func:`asyncio.sleep` function. - - -Coroutines ----------- - -.. method:: BaseEventLoop.create_task(coro) - - Schedule the execution of a :ref:`coroutine object `: wrap it in - a future. Return a :class:`Task` object. - - Third-party event loops can use their own subclass of :class:`Task` for - interoperability. In this case, the result type is a subclass of - :class:`Task`. - - .. seealso:: - - The :meth:`async` function. - - .. versionadded:: 3.4.2 - - -Creating connections --------------------- - -.. method:: BaseEventLoop.create_connection(protocol_factory, host=None, port=None, \*, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None) - - Create a streaming transport connection to a given Internet *host* and - *port*: socket family :py:data:`~socket.AF_INET` or - :py:data:`~socket.AF_INET6` depending on *host* (or *family* if specified), - socket type :py:data:`~socket.SOCK_STREAM`. *protocol_factory* must be a - callable returning a :ref:`protocol ` instance. - - This method is a :ref:`coroutine ` which will try to - establish the connection in the background. When successful, the - coroutine returns a ``(transport, protocol)`` pair. - - The chronological synopsis of the underlying operation is as follows: - - #. The connection is established, and a :ref:`transport ` - is created to represent it. - - #. *protocol_factory* is called without arguments and must return a - :ref:`protocol ` instance. - - #. The protocol instance is tied to the transport, and its - :meth:`connection_made` method is called. - - #. The coroutine returns successfully with the ``(transport, protocol)`` - pair. - - The created transport is an implementation-dependent bidirectional stream. - - .. note:: - *protocol_factory* can be any kind of callable, not necessarily - a class. For example, if you want to use a pre-created - protocol instance, you can pass ``lambda: my_protocol``. - - Options allowing to change how the connection is created: - - * *ssl*: if given and not false, a SSL/TLS transport is created - (by default a plain TCP transport is created). If *ssl* is - a :class:`ssl.SSLContext` object, this context is used to create - the transport; if *ssl* is :const:`True`, a context with some - unspecified default settings is used. - - .. seealso:: :ref:`SSL/TLS security considerations ` - - * *server_hostname*, is only for use together with *ssl*, - and sets or overrides the hostname that the target server's certificate - will be matched against. By default the value of the *host* argument - is used. If *host* is empty, there is no default and you must pass a - value for *server_hostname*. If *server_hostname* is an empty - string, hostname matching is disabled (which is a serious security - risk, allowing for man-in-the-middle-attacks). - - * *family*, *proto*, *flags* are the optional address family, protocol - and flags to be passed through to getaddrinfo() for *host* resolution. - If given, these should all be integers from the corresponding - :mod:`socket` module constants. - - * *sock*, if given, should be an existing, already connected - :class:`socket.socket` object to be used by the transport. - If *sock* is given, none of *host*, *port*, *family*, *proto*, *flags* - and *local_addr* should be specified. - - * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used - to bind the socket to locally. The *local_host* and *local_port* - are looked up using getaddrinfo(), similarly to *host* and *port*. - - .. seealso:: - - The :func:`open_connection` function can be used to get a pair of - (:class:`StreamReader`, :class:`StreamWriter`) instead of a protocol. - - -.. method:: BaseEventLoop.create_datagram_endpoint(protocol_factory, local_addr=None, remote_addr=None, \*, family=0, proto=0, flags=0) - - Create datagram connection: socket family :py:data:`~socket.AF_INET` or - :py:data:`~socket.AF_INET6` depending on *host* (or *family* if specified), - socket type :py:data:`~socket.SOCK_DGRAM`. - - This method is a :ref:`coroutine ` which will try to - establish the connection in the background. When successful, the - coroutine returns a ``(transport, protocol)`` pair. - - See the :meth:`BaseEventLoop.create_connection` method for parameters. - - -.. method:: BaseEventLoop.create_unix_connection(protocol_factory, path, \*, ssl=None, sock=None, server_hostname=None) - - Create UNIX connection: socket family :py:data:`~socket.AF_UNIX`, socket - type :py:data:`~socket.SOCK_STREAM`. The :py:data:`~socket.AF_UNIX` socket - family is used to communicate between processes on the same machine - efficiently. - - This method is a :ref:`coroutine ` which will try to - establish the connection in the background. When successful, the - coroutine returns a ``(transport, protocol)`` pair. - - See the :meth:`BaseEventLoop.create_connection` method for parameters. - - Availability: UNIX. - - -Creating listening connections ------------------------------- - -.. method:: BaseEventLoop.create_server(protocol_factory, host=None, port=None, \*, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None) - - Create a TCP server bound to host and port. Return an - :class:`AbstractServer` object which can be used to stop the service. - - This method is a :ref:`coroutine `. - - If *host* is an empty string or None all interfaces are assumed - and a list of multiple sockets will be returned (most likely - one for IPv4 and another one for IPv6). - - *family* can be set to either :data:`~socket.AF_INET` or - :data:`~socket.AF_INET6` to force the socket to use IPv4 or IPv6. If not set - it will be determined from host (defaults to :data:`~socket.AF_UNSPEC`). - - *flags* is a bitmask for :meth:`getaddrinfo`. - - *sock* can optionally be specified in order to use a preexisting - socket object. - - *backlog* is the maximum number of queued connections passed to - :meth:`~socket.socket.listen` (defaults to 100). - - ssl can be set to an :class:`~ssl.SSLContext` to enable SSL over the - accepted connections. - - *reuse_address* tells the kernel to reuse a local socket in - TIME_WAIT state, without waiting for its natural timeout to - expire. If not specified will automatically be set to True on - UNIX. - - .. seealso:: - - The function :func:`start_server` creates a (:class:`StreamReader`, - :class:`StreamWriter`) pair and calls back a function with this pair. - - -.. method:: BaseEventLoop.create_unix_server(protocol_factory, path=None, \*, sock=None, backlog=100, ssl=None) - - Similar to :meth:`BaseEventLoop.create_server`, but specific to the - socket family :py:data:`~socket.AF_UNIX`. - - Availability: UNIX. - - - -Watch file descriptors ----------------------- - -.. method:: BaseEventLoop.add_reader(fd, callback, \*args) - - Start watching the file descriptor for read availability and then call the - *callback* with specified arguments. - -.. method:: BaseEventLoop.remove_reader(fd) - - Stop watching the file descriptor for read availability. - -.. method:: BaseEventLoop.add_writer(fd, callback, \*args) - - Start watching the file descriptor for write availability and then call the - *callback* with specified arguments. - -.. method:: BaseEventLoop.remove_writer(fd) - - Stop watching the file descriptor for write availability. - - -Low-level socket operations ---------------------------- - -.. method:: BaseEventLoop.sock_recv(sock, nbytes) - - Receive data from the socket. The return value is a bytes object - representing the data received. The maximum amount of data to be received - at once is specified by *nbytes*. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`socket.socket.recv` method. - -.. method:: BaseEventLoop.sock_sendall(sock, data) - - Send data to the socket. The socket must be connected to a remote socket. - This method continues to send data from *data* until either all data has - been sent or an error occurs. ``None`` is returned on success. On error, - an exception is raised, and there is no way to determine how much data, if - any, was successfully processed by the receiving end of the connection. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`socket.socket.sendall` method. - -.. method:: BaseEventLoop.sock_connect(sock, address) - - Connect to a remote socket at *address*. - - The *address* must be already resolved to avoid the trap of hanging the - entire event loop when the address requires doing a DNS lookup. For - example, it must be an IP address, not an hostname, for - :py:data:`~socket.AF_INET` and :py:data:`~socket.AF_INET6` address families. - Use :meth:`getaddrinfo` to resolve the hostname asynchronously. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`BaseEventLoop.create_connection` method, the - :func:`open_connection` function and the :meth:`socket.socket.connect` - method. - - -.. method:: BaseEventLoop.sock_accept(sock) - - Accept a connection. The socket must be bound to an address and listening - for connections. The return value is a pair ``(conn, address)`` where *conn* - is a *new* socket object usable to send and receive data on the connection, - and *address* is the address bound to the socket on the other end of the - connection. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`BaseEventLoop.create_server` method, the :func:`start_server` - function and the :meth:`socket.socket.accept` method. - - -Resolve host name ------------------ - -.. method:: BaseEventLoop.getaddrinfo(host, port, \*, family=0, type=0, proto=0, flags=0) - - This method is a :ref:`coroutine `, similar to - :meth:`socket.getaddrinfo` function but non-blocking. - -.. method:: BaseEventLoop.getnameinfo(sockaddr, flags=0) - - This method is a :ref:`coroutine `, similar to - :meth:`socket.getnameinfo` function but non-blocking. - - -Connect pipes -------------- - -.. method:: BaseEventLoop.connect_read_pipe(protocol_factory, pipe) - - Register read pipe in eventloop. Set the *pipe* to non-blocking mode. - - *protocol_factory* should instantiate object with :class:`Protocol` - interface. *pipe* is a :term:`file-like object `. - Return pair ``(transport, protocol)``, where *transport* supports the - :class:`ReadTransport` interface. - - This method is a :ref:`coroutine `. - -.. method:: BaseEventLoop.connect_write_pipe(protocol_factory, pipe) - - Register write pipe in eventloop. - - *protocol_factory* should instantiate object with :class:`BaseProtocol` - interface. Pipe is file-like object already switched to nonblocking. - Return pair (transport, protocol), where transport support - :class:`WriteTransport` interface. - - This method is a :ref:`coroutine `. - -.. seealso:: - - The :meth:`BaseEventLoop.subprocess_exec` and - :meth:`BaseEventLoop.subprocess_shell` methods. - - -UNIX signals ------------- - -Availability: UNIX only. - -.. method:: BaseEventLoop.add_signal_handler(signum, callback, \*args) - - Add a handler for a signal. - - Raise :exc:`ValueError` if the signal number is invalid or uncatchable. - Raise :exc:`RuntimeError` if there is a problem setting up the handler. - -.. method:: BaseEventLoop.remove_signal_handler(sig) - - Remove a handler for a signal. - - Return ``True`` if a signal handler was removed, ``False`` if not. - -.. seealso:: - - The :mod:`signal` module. - - -Executor --------- - -Call a function in an :class:`~concurrent.futures.Executor` (pool of threads or -pool of processes). By default, an event loop uses a thread pool executor -(:class:`~concurrent.futures.ThreadPoolExecutor`). - -.. method:: BaseEventLoop.run_in_executor(executor, callback, \*args) - - Arrange for a callback to be called in the specified executor. - - The *executor* argument should be an :class:`~concurrent.futures.Executor` - instance. The default executor is used if *executor* is ``None``. - - This method is a :ref:`coroutine `. - -.. method:: BaseEventLoop.set_default_executor(executor) - - Set the default executor used by :meth:`run_in_executor`. - - -Error Handling API ------------------- - -Allows to customize how exceptions are handled in the event loop. - -.. method:: BaseEventLoop.set_exception_handler(handler) - - Set *handler* as the new event loop exception handler. - - If *handler* is ``None``, the default exception handler will - be set. - - If *handler* is a callable object, it should have a - matching signature to ``(loop, context)``, where ``loop`` - will be a reference to the active event loop, ``context`` - will be a ``dict`` object (see :meth:`call_exception_handler` - documentation for details about context). - -.. method:: BaseEventLoop.default_exception_handler(context) - - Default exception handler. - - This is called when an exception occurs and no exception - handler is set, and can be called by a custom exception - handler that wants to defer to the default behavior. - - *context* parameter has the same meaning as in - :meth:`call_exception_handler`. - -.. method:: BaseEventLoop.call_exception_handler(context) - - Call the current event loop exception handler. - - *context* is a ``dict`` object containing the following keys - (new keys may be introduced later): - - * 'message': Error message; - * 'exception' (optional): Exception object; - * 'future' (optional): :class:`asyncio.Future` instance; - * 'handle' (optional): :class:`asyncio.Handle` instance; - * 'protocol' (optional): :ref:`Protocol ` instance; - * 'transport' (optional): :ref:`Transport ` instance; - * 'socket' (optional): :class:`socket.socket` instance. - - .. note:: - - Note: this method should not be overloaded in subclassed - event loops. For any custom exception handling, use - :meth:`set_exception_handler()` method. - -Debug mode ----------- - -.. method:: BaseEventLoop.get_debug() - - Get the debug mode (:class:`bool`) of the event loop. - - The default value is ``True`` if the environment variable - :envvar:`PYTHONASYNCIODEBUG` is set to a non-empty string, ``False`` - otherwise. - - .. versionadded:: 3.4.2 - -.. method:: BaseEventLoop.set_debug(enabled: bool) - - Set the debug mode of the event loop. - - .. versionadded:: 3.4.2 - -.. seealso:: - - The :ref:`debug mode of asyncio `. - - -Server ------- - -.. class:: AbstractServer - - Abstract server returned by :func:`BaseEventLoop.create_server`. - - .. method:: close() - - Stop serving. This leaves existing connections open. - - .. method:: wait_closed() - - A :ref:`coroutine ` to wait until service is closed. - - -Handle ------- - -.. class:: Handle - - A callback wrapper object returned by :func:`BaseEventLoop.call_soon`, - :func:`BaseEventLoop.call_soon_threadsafe`, :func:`BaseEventLoop.call_later`, - and :func:`BaseEventLoop.call_at`. - - .. method:: cancel() - - Cancel the call. - - -.. _asyncio-hello-world-callback: - -Example: Hello World (callback) -------------------------------- - -Print ``Hello World`` every two seconds, using a callback:: - - import asyncio - - def print_and_repeat(loop): - print('Hello World') - loop.call_later(2, print_and_repeat, loop) - - loop = asyncio.get_event_loop() - loop.call_soon(print_and_repeat, loop) - try: - loop.run_forever() - finally: - loop.close() - -.. seealso:: - - :ref:`Hello World example using a coroutine `. - - -Example: Set signal handlers for SIGINT and SIGTERM ---------------------------------------------------- - -Register handlers for signals :py:data:`SIGINT` and :py:data:`SIGTERM`:: - - import asyncio - import functools - import os - import signal - - def ask_exit(signame): - print("got signal %s: exit" % signame) - loop.stop() - - loop = asyncio.get_event_loop() - for signame in ('SIGINT', 'SIGTERM'): - loop.add_signal_handler(getattr(signal, signame), - functools.partial(ask_exit, signame)) - - print("Event loop running forever, press CTRL+c to interrupt.") - print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid()) - try: - loop.run_forever() - finally: - loop.close() - diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -3,18 +3,18 @@ Subprocess ========== -Operating system support ------------------------- +Windows event loop +------------------ -On Windows, the default event loop uses :class:`selectors.SelectSelector` -which only supports sockets. The :class:`ProactorEventLoop` should be used to -support subprocesses. However, the latter does not support SSL. +On Windows, the default event loop is :class:`SelectorEventLoop` which does not +support subprocesses. :class:`ProactorEventLoop` should be used instead. +Example to use it on Windows:: -On Mac OS X older than 10.9 (Mavericks), :class:`selectors.KqueueSelector` -does not support character devices like PTY, whereas it is used by the -default event loop. The :class:`SelectorEventLoop` can be used with -:class:`SelectSelector` or :class:`PollSelector` to handle character -devices on Mac OS X 10.6 (Snow Leopard) and later. + import asyncio, os + + if os.name == 'nt': + loop = asyncio.ProactorEventLoop() + asyncio.set_event_loop(loop) Create a subprocess: high-level API using Process diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -45,6 +45,7 @@ :maxdepth: 3 asyncio-eventloop.rst + asyncio-eventloops.rst asyncio-task.rst asyncio-protocol.rst asyncio-stream.rst -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 23:43:23 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 23:43:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2321680=3A_Document_asyncio_eve?= =?utf-8?q?nt_loops?= Message-ID: <3h7HFl10SPz7LmB@mail.python.org> http://hg.python.org/cpython/rev/2c9d5f32f6c5 changeset: 91613:2c9d5f32f6c5 parent: 91611:06589e81fd56 parent: 91612:3f1381e3a68f user: Victor Stinner date: Tue Jul 08 23:43:11 2014 +0200 summary: (Merge 3.4) Issue #21680: Document asyncio event loops files: Doc/library/asyncio-eventloop.rst | 82 +- Doc/library/asyncio-eventloop.rst | 762 ++-------------- Doc/library/asyncio-subprocess.rst | 20 +- Doc/library/asyncio.rst | 1 + 4 files changed, 132 insertions(+), 733 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -2,8 +2,8 @@ .. _asyncio-event-loop: -Event loops -=========== +Base Event Loop +=============== The event loop is the central execution device provided by :mod:`asyncio`. It provides multiple facilities, amongst which: @@ -18,78 +18,9 @@ * Delegating costly function calls to a pool of threads. -Event loop policies and the default policy ------------------------------------------- +.. class:: BaseEventLoop -Event loop management is abstracted with a *policy* pattern, to provide maximal -flexibility for custom platforms and frameworks. Throughout the execution of a -process, a single global policy object manages the event loops available to the -process based on the calling context. A policy is an object implementing the -:class:`AbstractEventLoopPolicy` interface. - -For most users of :mod:`asyncio`, policies never have to be dealt with -explicitly, since the default global policy is sufficient. - -The default policy defines context as the current thread, and manages an event -loop per thread that interacts with :mod:`asyncio`. The module-level functions -:func:`get_event_loop` and :func:`set_event_loop` provide convenient access to -event loops managed by the default policy. - -Event loop functions --------------------- - -The following functions are convenient shortcuts to accessing the methods of the -global policy. Note that this provides access to the default policy, unless an -alternative policy was set by calling :func:`set_event_loop_policy` earlier in -the execution of the process. - -.. function:: get_event_loop() - - Equivalent to calling ``get_event_loop_policy().get_event_loop()``. - -.. function:: set_event_loop(loop) - - Equivalent to calling ``get_event_loop_policy().set_event_loop(loop)``. - -.. function:: new_event_loop() - - Equivalent to calling ``get_event_loop_policy().new_event_loop()``. - -Event loop policy interface ---------------------------- - -An event loop policy must implement the following interface: - -.. class:: AbstractEventLoopPolicy - - .. method:: get_event_loop() - - Get the event loop for the current context. Returns an event loop object - implementing the :class:`BaseEventLoop` interface, or raises an exception in case - no event loop has been set for the current context and the current policy - does not specify to create one. It should never return ``None``. - - .. method:: set_event_loop(loop) - - Set the event loop for the current context to *loop*. - - .. method:: new_event_loop() - - Create and return a new event loop object according to this policy's rules. - If there's need to set this loop as the event loop for the current context, - :meth:`set_event_loop` must be called explicitly. - -Access to the global loop policy --------------------------------- - -.. function:: get_event_loop_policy() - - Get the current event loop policy. - -.. function:: set_event_loop_policy(policy) - - Set the current event loop policy. If *policy* is ``None``, the default - policy is restored. + Base class of event loops. Run an event loop ----------------- @@ -375,7 +306,6 @@ Availability: UNIX. - Watch file descriptors ---------------------- @@ -624,7 +554,6 @@ The :ref:`debug mode of asyncio `. - Server ------ @@ -652,7 +581,8 @@ .. method:: cancel() - Cancel the call. + Cancel the call. + .. _asyncio-hello-world-callback: diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloops.rst copy from Doc/library/asyncio-eventloop.rst copy to Doc/library/asyncio-eventloops.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloops.rst @@ -1,40 +1,8 @@ .. currentmodule:: asyncio -.. _asyncio-event-loop: - Event loops =========== -The event loop is the central execution device provided by :mod:`asyncio`. -It provides multiple facilities, amongst which: - -* Registering, executing and cancelling delayed calls (timeouts). - -* Creating client and server :ref:`transports ` for various - kinds of communication. - -* Launching subprocesses and the associated :ref:`transports - ` for communication with an external program. - -* Delegating costly function calls to a pool of threads. - -Event loop policies and the default policy ------------------------------------------- - -Event loop management is abstracted with a *policy* pattern, to provide maximal -flexibility for custom platforms and frameworks. Throughout the execution of a -process, a single global policy object manages the event loops available to the -process based on the calling context. A policy is an object implementing the -:class:`AbstractEventLoopPolicy` interface. - -For most users of :mod:`asyncio`, policies never have to be dealt with -explicitly, since the default global policy is sufficient. - -The default policy defines context as the current thread, and manages an event -loop per thread that interacts with :mod:`asyncio`. The module-level functions -:func:`get_event_loop` and :func:`set_event_loop` provide convenient access to -event loops managed by the default policy. - Event loop functions -------------------- @@ -55,6 +23,121 @@ Equivalent to calling ``get_event_loop_policy().new_event_loop()``. + +Available event loops +--------------------- + +asyncio currently provides two implementations of event loops: +:class:`SelectorEventLoop` and :class:`ProactorEventLoop`. + +.. class:: SelectorEventLoop + + Event loop based on the :mod:`selectors` module. Subclass of + :class:`BaseEventLoop`. + + Use the most efficient selector available on the platform. + +.. class:: ProactorEventLoop + + Proactor event loop for Windows using "I/O Completion Ports" aka IOCP. + Subclass of :class:`BaseEventLoop`. + + Availability: Windows. + + .. seealso:: + + `MSDN documentation on I/O Completion Ports + `_. + +Example to use a :class:`ProactorEventLoop` on Windows:: + + import asyncio, os + + if os.name == 'nt': + loop = asyncio.ProactorEventLoop() + asyncio.set_event_loop(loop) + + +Platform support +---------------- + +The :mod:`asyncio` module has been designed to be portable, but each platform +still has subtle differences and may not support all :mod:`asyncio` features. + +Windows +^^^^^^^ + +Common limits of Windows event loops: + +- :meth:`~BaseEventLoop.create_unix_server` and + :meth:`~BaseEventLoop.create_unix_server` are not supported: specific to UNIX +- :meth:`~BaseEventLoop.add_signal_handler` and + :meth:`~BaseEventLoop.remove_signal_handler` are not supported +- Pipes are not supported: :meth:`~BaseEventLoop.connect_read_pipe` and + :meth:`~BaseEventLoop.connect_write_pipe` +- :meth:`EventLoopPolicy.set_child_watcher` is not supported + +:class:`SelectorEventLoop` specific limits: + +- :class:`~selectors.SelectSelector` is used but it only supports sockets, + see the `MSDN documentation of select + `_. +- it is not possible to execute subprocesses +- :meth:`~BaseEventLoop.add_reader` and :meth:`~BaseEventLoop.add_writer` only + accept file descriptors of sockets + +:class:`ProactorEventLoop` specific limits: + +- SSL is not supported: :meth:`~BaseEventLoop.create_connection` and + :meth:`~BaseEventLoop.create_server` cannot be used with SSL for example +- :meth:`~BaseEventLoop.create_datagram_endpoint` (UDP) is not supported +- :meth:`~BaseEventLoop.add_reader` and :meth:`~BaseEventLoop.add_writer` are + not supported + +The resolution of the monotonic clock on Windows is usually around 15.6 msec. +The best resolution is 0.5 msec. The exact resolution depends on the hardware +(availability of HPET) and the Windows configuration. See :ref:`asyncio delayed +calls `. + + +Mac OS X +^^^^^^^^ + +Character devices like PTY are only well supported since Mavericks (Mac OS +10.9). They are not supported at all on Mac OS 10.5 and older. + +On Mac OS 10.6, 10.7 and 10.8, the default event loop is +:class:`SelectorEventLoop` which uses :class:`selectors.KqueueSelector`. +:class:`selectors.KqueueSelector` does not support character devices on these +versions. The :class:`SelectorEventLoop` can be used with +:class:`~selectors.SelectSelector` or :class:`~selectors.PollSelector` to +support character devices on these versions of Mac OS X. Example:: + + import asyncio + import selectors + + selector = selectors.SelectSelector() + loop = asyncio.SelectorEventLoop(selector) + asyncio.set_event_loop(loop) + + +Event loop policies and the default policy +------------------------------------------ + +Event loop management is abstracted with a *policy* pattern, to provide maximal +flexibility for custom platforms and frameworks. Throughout the execution of a +process, a single global policy object manages the event loops available to the +process based on the calling context. A policy is an object implementing the +:class:`AbstractEventLoopPolicy` interface. + +For most users of :mod:`asyncio`, policies never have to be dealt with +explicitly, since the default global policy is sufficient. + +The default policy defines context as the current thread, and manages an event +loop per thread that interacts with :mod:`asyncio`. The module-level functions +:func:`get_event_loop` and :func:`set_event_loop` provide convenient access to +event loops managed by the default policy. + Event loop policy interface --------------------------- @@ -91,618 +174,3 @@ Set the current event loop policy. If *policy* is ``None``, the default policy is restored. -Run an event loop ------------------ - -.. method:: BaseEventLoop.run_forever() - - Run until :meth:`stop` is called. - -.. method:: BaseEventLoop.run_until_complete(future) - - Run until the :class:`Future` is done. - - If the argument is a :ref:`coroutine object `, it is wrapped by - :func:`async`. - - Return the Future's result, or raise its exception. - -.. method:: BaseEventLoop.is_running() - - Returns running status of event loop. - -.. method:: BaseEventLoop.stop() - - Stop running the event loop. - - Every callback scheduled before :meth:`stop` is called will run. - Callback scheduled after :meth:`stop` is called won't. However, those - callbacks will run if :meth:`run_forever` is called again later. - -.. method:: BaseEventLoop.is_closed() - - Returns ``True`` if the event loop was closed. - - .. versionadded:: 3.4.2 - -.. method:: BaseEventLoop.close() - - Close the event loop. The loop should not be running. - - This clears the queues and shuts down the executor, but does not wait for - the executor to finish. - - The event loop must not be running. - - This is idempotent and irreversible. No other methods should be called after - this one. - - -Calls ------ - -.. method:: BaseEventLoop.call_soon(callback, \*args) - - Arrange for a callback to be called as soon as possible. - - This operates as a FIFO queue, callbacks are called in the order in - which they are registered. Each callback will be called exactly once. - - Any positional arguments after the callback will be passed to the - callback when it is called. - - An instance of :class:`asyncio.Handle` is returned. - -.. method:: BaseEventLoop.call_soon_threadsafe(callback, \*args) - - Like :meth:`call_soon`, but thread safe. - - -.. _asyncio-delayed-calls: - -Delayed calls -------------- - -The event loop has its own internal clock for computing timeouts. -Which clock is used depends on the (platform-specific) event loop -implementation; ideally it is a monotonic clock. This will generally be -a different clock than :func:`time.time`. - -.. note:: - - Timeouts (relative *delay* or absolute *when*) should not exceed one day. - - -.. method:: BaseEventLoop.call_later(delay, callback, *args) - - Arrange for the *callback* to be called after the given *delay* - seconds (either an int or float). - - An instance of :class:`asyncio.Handle` is returned. - - *callback* will be called exactly once per call to :meth:`call_later`. - If two callbacks are scheduled for exactly the same time, it is - undefined which will be called first. - - The optional positional *args* will be passed to the callback when it - is called. If you want the callback to be called with some named - arguments, use a closure or :func:`functools.partial`. - -.. method:: BaseEventLoop.call_at(when, callback, *args) - - Arrange for the *callback* to be called at the given absolute timestamp - *when* (an int or float), using the same time reference as :meth:`time`. - - This method's behavior is the same as :meth:`call_later`. - -.. method:: BaseEventLoop.time() - - Return the current time, as a :class:`float` value, according to the - event loop's internal clock. - -.. seealso:: - - The :func:`asyncio.sleep` function. - - -Coroutines ----------- - -.. method:: BaseEventLoop.create_task(coro) - - Schedule the execution of a :ref:`coroutine object `: wrap it in - a future. Return a :class:`Task` object. - - Third-party event loops can use their own subclass of :class:`Task` for - interoperability. In this case, the result type is a subclass of - :class:`Task`. - - .. seealso:: - - The :meth:`async` function. - - .. versionadded:: 3.4.2 - - -Creating connections --------------------- - -.. method:: BaseEventLoop.create_connection(protocol_factory, host=None, port=None, \*, ssl=None, family=0, proto=0, flags=0, sock=None, local_addr=None, server_hostname=None) - - Create a streaming transport connection to a given Internet *host* and - *port*: socket family :py:data:`~socket.AF_INET` or - :py:data:`~socket.AF_INET6` depending on *host* (or *family* if specified), - socket type :py:data:`~socket.SOCK_STREAM`. *protocol_factory* must be a - callable returning a :ref:`protocol ` instance. - - This method is a :ref:`coroutine ` which will try to - establish the connection in the background. When successful, the - coroutine returns a ``(transport, protocol)`` pair. - - The chronological synopsis of the underlying operation is as follows: - - #. The connection is established, and a :ref:`transport ` - is created to represent it. - - #. *protocol_factory* is called without arguments and must return a - :ref:`protocol ` instance. - - #. The protocol instance is tied to the transport, and its - :meth:`connection_made` method is called. - - #. The coroutine returns successfully with the ``(transport, protocol)`` - pair. - - The created transport is an implementation-dependent bidirectional stream. - - .. note:: - *protocol_factory* can be any kind of callable, not necessarily - a class. For example, if you want to use a pre-created - protocol instance, you can pass ``lambda: my_protocol``. - - Options allowing to change how the connection is created: - - * *ssl*: if given and not false, a SSL/TLS transport is created - (by default a plain TCP transport is created). If *ssl* is - a :class:`ssl.SSLContext` object, this context is used to create - the transport; if *ssl* is :const:`True`, a context with some - unspecified default settings is used. - - .. seealso:: :ref:`SSL/TLS security considerations ` - - * *server_hostname*, is only for use together with *ssl*, - and sets or overrides the hostname that the target server's certificate - will be matched against. By default the value of the *host* argument - is used. If *host* is empty, there is no default and you must pass a - value for *server_hostname*. If *server_hostname* is an empty - string, hostname matching is disabled (which is a serious security - risk, allowing for man-in-the-middle-attacks). - - * *family*, *proto*, *flags* are the optional address family, protocol - and flags to be passed through to getaddrinfo() for *host* resolution. - If given, these should all be integers from the corresponding - :mod:`socket` module constants. - - * *sock*, if given, should be an existing, already connected - :class:`socket.socket` object to be used by the transport. - If *sock* is given, none of *host*, *port*, *family*, *proto*, *flags* - and *local_addr* should be specified. - - * *local_addr*, if given, is a ``(local_host, local_port)`` tuple used - to bind the socket to locally. The *local_host* and *local_port* - are looked up using getaddrinfo(), similarly to *host* and *port*. - - .. seealso:: - - The :func:`open_connection` function can be used to get a pair of - (:class:`StreamReader`, :class:`StreamWriter`) instead of a protocol. - - -.. method:: BaseEventLoop.create_datagram_endpoint(protocol_factory, local_addr=None, remote_addr=None, \*, family=0, proto=0, flags=0) - - Create datagram connection: socket family :py:data:`~socket.AF_INET` or - :py:data:`~socket.AF_INET6` depending on *host* (or *family* if specified), - socket type :py:data:`~socket.SOCK_DGRAM`. - - This method is a :ref:`coroutine ` which will try to - establish the connection in the background. When successful, the - coroutine returns a ``(transport, protocol)`` pair. - - See the :meth:`BaseEventLoop.create_connection` method for parameters. - - -.. method:: BaseEventLoop.create_unix_connection(protocol_factory, path, \*, ssl=None, sock=None, server_hostname=None) - - Create UNIX connection: socket family :py:data:`~socket.AF_UNIX`, socket - type :py:data:`~socket.SOCK_STREAM`. The :py:data:`~socket.AF_UNIX` socket - family is used to communicate between processes on the same machine - efficiently. - - This method is a :ref:`coroutine ` which will try to - establish the connection in the background. When successful, the - coroutine returns a ``(transport, protocol)`` pair. - - See the :meth:`BaseEventLoop.create_connection` method for parameters. - - Availability: UNIX. - - -Creating listening connections ------------------------------- - -.. method:: BaseEventLoop.create_server(protocol_factory, host=None, port=None, \*, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None) - - Create a TCP server bound to host and port. Return an - :class:`AbstractServer` object which can be used to stop the service. - - This method is a :ref:`coroutine `. - - If *host* is an empty string or None all interfaces are assumed - and a list of multiple sockets will be returned (most likely - one for IPv4 and another one for IPv6). - - *family* can be set to either :data:`~socket.AF_INET` or - :data:`~socket.AF_INET6` to force the socket to use IPv4 or IPv6. If not set - it will be determined from host (defaults to :data:`~socket.AF_UNSPEC`). - - *flags* is a bitmask for :meth:`getaddrinfo`. - - *sock* can optionally be specified in order to use a preexisting - socket object. - - *backlog* is the maximum number of queued connections passed to - :meth:`~socket.socket.listen` (defaults to 100). - - ssl can be set to an :class:`~ssl.SSLContext` to enable SSL over the - accepted connections. - - *reuse_address* tells the kernel to reuse a local socket in - TIME_WAIT state, without waiting for its natural timeout to - expire. If not specified will automatically be set to True on - UNIX. - - .. seealso:: - - The function :func:`start_server` creates a (:class:`StreamReader`, - :class:`StreamWriter`) pair and calls back a function with this pair. - - -.. method:: BaseEventLoop.create_unix_server(protocol_factory, path=None, \*, sock=None, backlog=100, ssl=None) - - Similar to :meth:`BaseEventLoop.create_server`, but specific to the - socket family :py:data:`~socket.AF_UNIX`. - - Availability: UNIX. - - - -Watch file descriptors ----------------------- - -.. method:: BaseEventLoop.add_reader(fd, callback, \*args) - - Start watching the file descriptor for read availability and then call the - *callback* with specified arguments. - -.. method:: BaseEventLoop.remove_reader(fd) - - Stop watching the file descriptor for read availability. - -.. method:: BaseEventLoop.add_writer(fd, callback, \*args) - - Start watching the file descriptor for write availability and then call the - *callback* with specified arguments. - -.. method:: BaseEventLoop.remove_writer(fd) - - Stop watching the file descriptor for write availability. - - -Low-level socket operations ---------------------------- - -.. method:: BaseEventLoop.sock_recv(sock, nbytes) - - Receive data from the socket. The return value is a bytes object - representing the data received. The maximum amount of data to be received - at once is specified by *nbytes*. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`socket.socket.recv` method. - -.. method:: BaseEventLoop.sock_sendall(sock, data) - - Send data to the socket. The socket must be connected to a remote socket. - This method continues to send data from *data* until either all data has - been sent or an error occurs. ``None`` is returned on success. On error, - an exception is raised, and there is no way to determine how much data, if - any, was successfully processed by the receiving end of the connection. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`socket.socket.sendall` method. - -.. method:: BaseEventLoop.sock_connect(sock, address) - - Connect to a remote socket at *address*. - - The *address* must be already resolved to avoid the trap of hanging the - entire event loop when the address requires doing a DNS lookup. For - example, it must be an IP address, not an hostname, for - :py:data:`~socket.AF_INET` and :py:data:`~socket.AF_INET6` address families. - Use :meth:`getaddrinfo` to resolve the hostname asynchronously. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`BaseEventLoop.create_connection` method, the - :func:`open_connection` function and the :meth:`socket.socket.connect` - method. - - -.. method:: BaseEventLoop.sock_accept(sock) - - Accept a connection. The socket must be bound to an address and listening - for connections. The return value is a pair ``(conn, address)`` where *conn* - is a *new* socket object usable to send and receive data on the connection, - and *address* is the address bound to the socket on the other end of the - connection. - - This method is a :ref:`coroutine `. - - .. seealso:: - - The :meth:`BaseEventLoop.create_server` method, the :func:`start_server` - function and the :meth:`socket.socket.accept` method. - - -Resolve host name ------------------ - -.. method:: BaseEventLoop.getaddrinfo(host, port, \*, family=0, type=0, proto=0, flags=0) - - This method is a :ref:`coroutine `, similar to - :meth:`socket.getaddrinfo` function but non-blocking. - -.. method:: BaseEventLoop.getnameinfo(sockaddr, flags=0) - - This method is a :ref:`coroutine `, similar to - :meth:`socket.getnameinfo` function but non-blocking. - - -Connect pipes -------------- - -.. method:: BaseEventLoop.connect_read_pipe(protocol_factory, pipe) - - Register read pipe in eventloop. Set the *pipe* to non-blocking mode. - - *protocol_factory* should instantiate object with :class:`Protocol` - interface. *pipe* is a :term:`file-like object `. - Return pair ``(transport, protocol)``, where *transport* supports the - :class:`ReadTransport` interface. - - This method is a :ref:`coroutine `. - -.. method:: BaseEventLoop.connect_write_pipe(protocol_factory, pipe) - - Register write pipe in eventloop. - - *protocol_factory* should instantiate object with :class:`BaseProtocol` - interface. Pipe is file-like object already switched to nonblocking. - Return pair (transport, protocol), where transport support - :class:`WriteTransport` interface. - - This method is a :ref:`coroutine `. - -.. seealso:: - - The :meth:`BaseEventLoop.subprocess_exec` and - :meth:`BaseEventLoop.subprocess_shell` methods. - - -UNIX signals ------------- - -Availability: UNIX only. - -.. method:: BaseEventLoop.add_signal_handler(signum, callback, \*args) - - Add a handler for a signal. - - Raise :exc:`ValueError` if the signal number is invalid or uncatchable. - Raise :exc:`RuntimeError` if there is a problem setting up the handler. - -.. method:: BaseEventLoop.remove_signal_handler(sig) - - Remove a handler for a signal. - - Return ``True`` if a signal handler was removed, ``False`` if not. - -.. seealso:: - - The :mod:`signal` module. - - -Executor --------- - -Call a function in an :class:`~concurrent.futures.Executor` (pool of threads or -pool of processes). By default, an event loop uses a thread pool executor -(:class:`~concurrent.futures.ThreadPoolExecutor`). - -.. method:: BaseEventLoop.run_in_executor(executor, callback, \*args) - - Arrange for a callback to be called in the specified executor. - - The *executor* argument should be an :class:`~concurrent.futures.Executor` - instance. The default executor is used if *executor* is ``None``. - - This method is a :ref:`coroutine `. - -.. method:: BaseEventLoop.set_default_executor(executor) - - Set the default executor used by :meth:`run_in_executor`. - - -Error Handling API ------------------- - -Allows to customize how exceptions are handled in the event loop. - -.. method:: BaseEventLoop.set_exception_handler(handler) - - Set *handler* as the new event loop exception handler. - - If *handler* is ``None``, the default exception handler will - be set. - - If *handler* is a callable object, it should have a - matching signature to ``(loop, context)``, where ``loop`` - will be a reference to the active event loop, ``context`` - will be a ``dict`` object (see :meth:`call_exception_handler` - documentation for details about context). - -.. method:: BaseEventLoop.default_exception_handler(context) - - Default exception handler. - - This is called when an exception occurs and no exception - handler is set, and can be called by a custom exception - handler that wants to defer to the default behavior. - - *context* parameter has the same meaning as in - :meth:`call_exception_handler`. - -.. method:: BaseEventLoop.call_exception_handler(context) - - Call the current event loop exception handler. - - *context* is a ``dict`` object containing the following keys - (new keys may be introduced later): - - * 'message': Error message; - * 'exception' (optional): Exception object; - * 'future' (optional): :class:`asyncio.Future` instance; - * 'handle' (optional): :class:`asyncio.Handle` instance; - * 'protocol' (optional): :ref:`Protocol ` instance; - * 'transport' (optional): :ref:`Transport ` instance; - * 'socket' (optional): :class:`socket.socket` instance. - - .. note:: - - Note: this method should not be overloaded in subclassed - event loops. For any custom exception handling, use - :meth:`set_exception_handler()` method. - -Debug mode ----------- - -.. method:: BaseEventLoop.get_debug() - - Get the debug mode (:class:`bool`) of the event loop. - - The default value is ``True`` if the environment variable - :envvar:`PYTHONASYNCIODEBUG` is set to a non-empty string, ``False`` - otherwise. - - .. versionadded:: 3.4.2 - -.. method:: BaseEventLoop.set_debug(enabled: bool) - - Set the debug mode of the event loop. - - .. versionadded:: 3.4.2 - -.. seealso:: - - The :ref:`debug mode of asyncio `. - - -Server ------- - -.. class:: AbstractServer - - Abstract server returned by :func:`BaseEventLoop.create_server`. - - .. method:: close() - - Stop serving. This leaves existing connections open. - - .. method:: wait_closed() - - A :ref:`coroutine ` to wait until service is closed. - - -Handle ------- - -.. class:: Handle - - A callback wrapper object returned by :func:`BaseEventLoop.call_soon`, - :func:`BaseEventLoop.call_soon_threadsafe`, :func:`BaseEventLoop.call_later`, - and :func:`BaseEventLoop.call_at`. - - .. method:: cancel() - - Cancel the call. - - -.. _asyncio-hello-world-callback: - -Example: Hello World (callback) -------------------------------- - -Print ``Hello World`` every two seconds, using a callback:: - - import asyncio - - def print_and_repeat(loop): - print('Hello World') - loop.call_later(2, print_and_repeat, loop) - - loop = asyncio.get_event_loop() - loop.call_soon(print_and_repeat, loop) - try: - loop.run_forever() - finally: - loop.close() - -.. seealso:: - - :ref:`Hello World example using a coroutine `. - - -Example: Set signal handlers for SIGINT and SIGTERM ---------------------------------------------------- - -Register handlers for signals :py:data:`SIGINT` and :py:data:`SIGTERM`:: - - import asyncio - import functools - import os - import signal - - def ask_exit(signame): - print("got signal %s: exit" % signame) - loop.stop() - - loop = asyncio.get_event_loop() - for signame in ('SIGINT', 'SIGTERM'): - loop.add_signal_handler(getattr(signal, signame), - functools.partial(ask_exit, signame)) - - print("Event loop running forever, press CTRL+c to interrupt.") - print("pid %s: send SIGINT or SIGTERM to exit." % os.getpid()) - try: - loop.run_forever() - finally: - loop.close() - diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -3,18 +3,18 @@ Subprocess ========== -Operating system support ------------------------- +Windows event loop +------------------ -On Windows, the default event loop uses :class:`selectors.SelectSelector` -which only supports sockets. The :class:`ProactorEventLoop` should be used to -support subprocesses. However, the latter does not support SSL. +On Windows, the default event loop is :class:`SelectorEventLoop` which does not +support subprocesses. :class:`ProactorEventLoop` should be used instead. +Example to use it on Windows:: -On Mac OS X older than 10.9 (Mavericks), :class:`selectors.KqueueSelector` -does not support character devices like PTY, whereas it is used by the -default event loop. The :class:`SelectorEventLoop` can be used with -:class:`SelectSelector` or :class:`PollSelector` to handle character -devices on Mac OS X 10.6 (Snow Leopard) and later. + import asyncio, os + + if os.name == 'nt': + loop = asyncio.ProactorEventLoop() + asyncio.set_event_loop(loop) Create a subprocess: high-level API using Process diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -45,6 +45,7 @@ :maxdepth: 3 asyncio-eventloop.rst + asyncio-eventloops.rst asyncio-task.rst asyncio-protocol.rst asyncio-stream.rst -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 23:59:46 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 23:59:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpb24sIFR1?= =?utf-8?q?lip_issue_181=3A_BaseEventLoop=2Ecreate=5Fdatagram=5Fendpoint?= =?utf-8?q?=28=29_now_waits?= Message-ID: <3h7Hcf2LtKz7LkR@mail.python.org> http://hg.python.org/cpython/rev/afdbc02e4197 changeset: 91614:afdbc02e4197 branch: 3.4 parent: 91612:3f1381e3a68f user: Victor Stinner date: Tue Jul 08 23:57:31 2014 +0200 summary: asyncion, Tulip issue 181: BaseEventLoop.create_datagram_endpoint() now waits until protocol.connection_made() has been called. Document also why transport constructors use a waiter. files: Lib/asyncio/base_events.py | 7 +++++-- Lib/asyncio/proactor_events.py | 1 + Lib/asyncio/selector_events.py | 13 ++++++++++--- Lib/asyncio/unix_events.py | 2 ++ Lib/test/test_asyncio/test_events.py | 10 ++++++++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -169,7 +169,7 @@ raise NotImplementedError def _make_datagram_transport(self, sock, protocol, - address=None, extra=None): + address=None, waiter=None, extra=None): """Create datagram transport.""" raise NotImplementedError @@ -605,7 +605,10 @@ raise exceptions[0] protocol = protocol_factory() - transport = self._make_datagram_transport(sock, protocol, r_addr) + waiter = futures.Future(loop=self) + transport = self._make_datagram_transport(sock, protocol, r_addr, + waiter) + yield from waiter return transport, protocol @coroutine diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,6 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -51,8 +51,9 @@ server_side, server_hostname, extra, server) def _make_datagram_transport(self, sock, protocol, - address=None, extra=None): - return _SelectorDatagramTransport(self, sock, protocol, address, extra) + address=None, waiter=None, extra=None): + return _SelectorDatagramTransport(self, sock, protocol, + address, waiter, extra) def close(self): if self.is_closed(): @@ -481,6 +482,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): @@ -690,6 +692,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if self._waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(self._waiter._set_result_unless_cancelled, None) @@ -806,11 +809,15 @@ _buffer_factory = collections.deque - def __init__(self, loop, sock, protocol, address=None, extra=None): + def __init__(self, loop, sock, protocol, address=None, + waiter=None, extra=None): super().__init__(loop, sock, protocol, extra) self._address = address self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + # wait until protocol.connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): return sum(len(data) for data, _ in self._buffer) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -269,6 +269,7 @@ self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _read_ready(self): @@ -353,6 +354,7 @@ self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -522,6 +522,7 @@ tr, pr = self.loop.run_until_complete(connection_fut) self.assertIsInstance(tr, asyncio.Transport) self.assertIsInstance(pr, asyncio.Protocol) + self.assertIs(pr.transport, tr) if check_sockname: self.assertIsNotNone(tr.get_extra_info('sockname')) self.loop.run_until_complete(pr.done) @@ -1045,12 +1046,21 @@ s_transport, server = self.loop.run_until_complete(coro) host, port = s_transport.get_extra_info('sockname') + self.assertIsInstance(s_transport, asyncio.Transport) + self.assertIsInstance(server, TestMyDatagramProto) + self.assertEqual('INITIALIZED', server.state) + self.assertIs(server.transport, s_transport) + coro = self.loop.create_datagram_endpoint( lambda: MyDatagramProto(loop=self.loop), remote_addr=(host, port)) transport, client = self.loop.run_until_complete(coro) + self.assertIsInstance(transport, asyncio.Transport) + self.assertIsInstance(client, MyDatagramProto) self.assertEqual('INITIALIZED', client.state) + self.assertIs(client.transport, transport) + transport.sendto(b'xxx') test_utils.run_until(self.loop, lambda: server.nbytes) self.assertEqual(3, server.nbytes) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 8 23:59:47 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 8 Jul 2014 23:59:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncion=2C_Tulip_issue_181=3A_BaseEve?= =?utf-8?q?ntLoop=2Ecreate=5Fdatagram=5Fendpoint=28=29?= Message-ID: <3h7Hcg5MbFz7Lkv@mail.python.org> http://hg.python.org/cpython/rev/50df498725f1 changeset: 91615:50df498725f1 parent: 91613:2c9d5f32f6c5 parent: 91614:afdbc02e4197 user: Victor Stinner date: Tue Jul 08 23:58:25 2014 +0200 summary: (Merge 3.4) asyncion, Tulip issue 181: BaseEventLoop.create_datagram_endpoint() now waits until protocol.connection_made() has been called. Document also why transport constructors use a waiter. files: Lib/asyncio/base_events.py | 7 +++++-- Lib/asyncio/proactor_events.py | 1 + Lib/asyncio/selector_events.py | 13 ++++++++++--- Lib/asyncio/unix_events.py | 2 ++ Lib/test/test_asyncio/test_events.py | 10 ++++++++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -169,7 +169,7 @@ raise NotImplementedError def _make_datagram_transport(self, sock, protocol, - address=None, extra=None): + address=None, waiter=None, extra=None): """Create datagram transport.""" raise NotImplementedError @@ -605,7 +605,10 @@ raise exceptions[0] protocol = protocol_factory() - transport = self._make_datagram_transport(sock, protocol, r_addr) + waiter = futures.Future(loop=self) + transport = self._make_datagram_transport(sock, protocol, r_addr, + waiter) + yield from waiter return transport, protocol @coroutine diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -38,6 +38,7 @@ self._server.attach(self) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _set_extra(self, sock): diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -51,8 +51,9 @@ server_side, server_hostname, extra, server) def _make_datagram_transport(self, sock, protocol, - address=None, extra=None): - return _SelectorDatagramTransport(self, sock, protocol, address, extra) + address=None, waiter=None, extra=None): + return _SelectorDatagramTransport(self, sock, protocol, + address, waiter, extra) def close(self): if self.is_closed(): @@ -481,6 +482,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def pause_reading(self): @@ -690,6 +692,7 @@ self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if self._waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(self._waiter._set_result_unless_cancelled, None) @@ -806,11 +809,15 @@ _buffer_factory = collections.deque - def __init__(self, loop, sock, protocol, address=None, extra=None): + def __init__(self, loop, sock, protocol, address=None, + waiter=None, extra=None): super().__init__(loop, sock, protocol, extra) self._address = address self._loop.add_reader(self._sock_fd, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) + if waiter is not None: + # wait until protocol.connection_made() has been called + self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): return sum(len(data) for data, _ in self._buffer) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -269,6 +269,7 @@ self._loop.add_reader(self._fileno, self._read_ready) self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def _read_ready(self): @@ -353,6 +354,7 @@ self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: + # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) def get_write_buffer_size(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -522,6 +522,7 @@ tr, pr = self.loop.run_until_complete(connection_fut) self.assertIsInstance(tr, asyncio.Transport) self.assertIsInstance(pr, asyncio.Protocol) + self.assertIs(pr.transport, tr) if check_sockname: self.assertIsNotNone(tr.get_extra_info('sockname')) self.loop.run_until_complete(pr.done) @@ -1045,12 +1046,21 @@ s_transport, server = self.loop.run_until_complete(coro) host, port = s_transport.get_extra_info('sockname') + self.assertIsInstance(s_transport, asyncio.Transport) + self.assertIsInstance(server, TestMyDatagramProto) + self.assertEqual('INITIALIZED', server.state) + self.assertIs(server.transport, s_transport) + coro = self.loop.create_datagram_endpoint( lambda: MyDatagramProto(loop=self.loop), remote_addr=(host, port)) transport, client = self.loop.run_until_complete(coro) + self.assertIsInstance(transport, asyncio.Transport) + self.assertIsInstance(client, MyDatagramProto) self.assertEqual('INITIALIZED', client.state) + self.assertIs(client.transport, transport) + transport.sendto(b'xxx') test_utils.run_until(self.loop, lambda: server.nbytes) self.assertEqual(3, server.nbytes) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 9 00:43:55 2014 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 9 Jul 2014 00:43:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321938=3A_simplify?= =?utf-8?b?IGdlbl9pdGVybmV4dCgp?= Message-ID: <3h7Jbb59vHz7Lks@mail.python.org> http://hg.python.org/cpython/rev/5cfa919609a0 changeset: 91616:5cfa919609a0 user: Antoine Pitrou date: Tue Jul 08 18:43:23 2014 -0400 summary: Issue #21938: simplify gen_iternext() files: Objects/genobject.c | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) diff --git a/Objects/genobject.c b/Objects/genobject.c --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -377,11 +377,7 @@ static PyObject * gen_iternext(PyGenObject *gen) { - PyObject *val = NULL; - PyObject *ret; - ret = gen_send_ex(gen, val, 0); - Py_XDECREF(val); - return ret; + return gen_send_ex(gen, NULL, 0); } /* -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 9 01:23:08 2014 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 9 Jul 2014 01:23:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_bootstrapping_asdl_--_?= =?utf-8?q?it_didn=27t_work_with_Python_2=2E7=2E?= Message-ID: <3h7KSr3lbTz7Lvq@mail.python.org> http://hg.python.org/cpython/rev/3b2af26f4638 changeset: 91617:3b2af26f4638 user: Guido van Rossum date: Tue Jul 08 16:22:48 2014 -0700 summary: Fix bootstrapping asdl -- it didn't work with Python 2.7. files: Parser/asdl.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Parser/asdl.py b/Parser/asdl.py --- a/Parser/asdl.py +++ b/Parser/asdl.py @@ -112,7 +112,7 @@ # interesting node. # We also define a Check visitor that makes sure the parsed ASDL is well-formed. -class VisitorBase: +class VisitorBase(object): """Generic tree visitor for ASTs.""" def __init__(self): self.cache = {} @@ -137,7 +137,7 @@ Errors are printed and accumulated. """ def __init__(self): - super().__init__() + super(Check, self).__init__() self.cons = {} self.errors = 0 self.types = {} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 9 02:12:41 2014 From: python-checkins at python.org (berker.peksag) Date: Wed, 9 Jul 2014 02:12:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=236916=3A_Use_asser?= =?utf-8?q?tWarns_in_test=5Fasynchat=2E?= Message-ID: <3h7LZ122d6z7LnL@mail.python.org> http://hg.python.org/cpython/rev/486c1a81ee32 changeset: 91618:486c1a81ee32 user: Berker Peksag date: Wed Jul 09 03:12:23 2014 +0300 summary: Issue #6916: Use assertWarns in test_asynchat. files: Lib/test/test_asynchat.py | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -282,10 +282,10 @@ class TestFifo(unittest.TestCase): def test_basic(self): - with warnings.catch_warnings(record=True) as w: + with self.assertWarns(DeprecationWarning) as cm: f = asynchat.fifo() - if w: - assert issubclass(w[0].category, DeprecationWarning) + self.assertEqual(str(cm.warning), + "fifo class will be removed in Python 3.6") f.push(7) f.push(b'a') self.assertEqual(len(f), 2) @@ -300,10 +300,10 @@ self.assertEqual(f.pop(), (0, None)) def test_given_list(self): - with warnings.catch_warnings(record=True) as w: + with self.assertWarns(DeprecationWarning) as cm: f = asynchat.fifo([b'x', 17, 3]) - if w: - assert issubclass(w[0].category, DeprecationWarning) + self.assertEqual(str(cm.warning), + "fifo class will be removed in Python 3.6") self.assertEqual(len(f), 3) self.assertEqual(f.pop(), (1, b'x')) self.assertEqual(f.pop(), (1, 17)) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Jul 9 09:06:20 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 09 Jul 2014 09:06:20 +0200 Subject: [Python-checkins] Daily reference leaks (486c1a81ee32): sum=1 Message-ID: results for 486c1a81ee32 on branch "default" -------------------------------------------- test_asyncio leaked [0, 4, 0] memory blocks, sum=4 test_collections leaked [0, -4, 0] references, sum=-4 test_collections leaked [0, -2, 0] memory blocks, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, 0, -2] references, sum=0 test_site leaked [2, 0, -2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogbdZDa_', '-x'] From python-checkins at python.org Wed Jul 9 14:44:18 2014 From: python-checkins at python.org (ezio.melotti) Date: Wed, 9 Jul 2014 14:44:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzIxOTQ1OiBmaXgg?= =?utf-8?q?typo_in_Cookie_module_docstring=2E?= Message-ID: <3h7gFG16N7z7LjM@mail.python.org> http://hg.python.org/cpython/rev/c3ec90a6526e changeset: 91619:c3ec90a6526e branch: 2.7 parent: 91597:8ebda8114e97 user: Ezio Melotti date: Wed Jul 09 15:45:25 2014 +0300 summary: #21945: fix typo in Cookie module docstring. files: Lib/Cookie.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/Cookie.py b/Lib/Cookie.py --- a/Lib/Cookie.py +++ b/Lib/Cookie.py @@ -56,7 +56,7 @@ >>> C = Cookie.SmartCookie() [Note: Long-time users of Cookie.py will remember using -Cookie.Cookie() to create an Cookie object. Although deprecated, it +Cookie.Cookie() to create a Cookie object. Although deprecated, it is still supported by the code. See the Backward Compatibility notes for more information.] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 9 19:16:34 2014 From: python-checkins at python.org (berker.peksag) Date: Wed, 9 Jul 2014 19:16:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWVzICMyMTk0?= =?utf-8?q?8_and_=2316040=3A_Fix_typos=2E?= Message-ID: <3h7nHQ1LBKz7LmH@mail.python.org> http://hg.python.org/cpython/rev/5be778fec115 changeset: 91620:5be778fec115 branch: 3.4 parent: 91614:afdbc02e4197 user: Berker Peksag date: Wed Jul 09 20:15:28 2014 +0300 summary: Issues #21948 and #16040: Fix typos. files: Doc/library/hmac.rst | 2 +- Lib/nntplib.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -25,7 +25,7 @@ .. versionchanged:: 3.4 Parameter *key* can be a bytes or bytearray object. Parameter *msg* can be of any type supported by :mod:`hashlib`. - Paramter *digestmod* can be the name of a hash algorithm. + Parameter *digestmod* can be the name of a hash algorithm. .. deprecated:: 3.4 MD5 as implicit default digest for *digestmod* is deprecated. diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -86,7 +86,7 @@ ] # maximal line length when calling readline(). This is to prevent -# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to +# reading arbitrary length lines. RFC 3977 limits NNTP line length to # 512 characters, including CRLF. We have selected 2048 just to be on # the safe side. _MAXLINE = 2048 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 9 19:16:35 2014 From: python-checkins at python.org (berker.peksag) Date: Wed, 9 Jul 2014 19:16:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issues_=2321948_and_=2316040=3A_Merge_with_3=2E4=2E?= Message-ID: <3h7nHR2vWJz7LpF@mail.python.org> http://hg.python.org/cpython/rev/051cc4f60384 changeset: 91621:051cc4f60384 parent: 91618:486c1a81ee32 parent: 91620:5be778fec115 user: Berker Peksag date: Wed Jul 09 20:16:23 2014 +0300 summary: Issues #21948 and #16040: Merge with 3.4. files: Doc/library/hmac.rst | 2 +- Lib/nntplib.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -25,7 +25,7 @@ .. versionchanged:: 3.4 Parameter *key* can be a bytes or bytearray object. Parameter *msg* can be of any type supported by :mod:`hashlib`. - Paramter *digestmod* can be the name of a hash algorithm. + Parameter *digestmod* can be the name of a hash algorithm. .. deprecated:: 3.4 MD5 as implicit default digest for *digestmod* is deprecated. diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -86,7 +86,7 @@ ] # maximal line length when calling readline(). This is to prevent -# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to +# reading arbitrary length lines. RFC 3977 limits NNTP line length to # 512 characters, including CRLF. We have selected 2048 just to be on # the safe side. _MAXLINE = 2048 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 10 07:17:51 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 10 Jul 2014 07:17:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTQw?= =?utf-8?q?=3A_add_docstrings_to_idlelib=2EWidgetRedirector=2E?= Message-ID: <3h85Hg3W8Pz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/5af194064f96 changeset: 91622:5af194064f96 branch: 2.7 parent: 91619:c3ec90a6526e user: Terry Jan Reedy date: Thu Jul 10 01:16:42 2014 -0400 summary: Issue #21940: add docstrings to idlelib.WidgetRedirector. files: Lib/idlelib/WidgetRedirector.py | 77 ++++++++++++++++---- 1 files changed, 59 insertions(+), 18 deletions(-) diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -1,7 +1,6 @@ -from Tkinter import * +from Tkinter import TclError class WidgetRedirector: - """Support for redirecting arbitrary widget subcommands. Some Tk operations don't normally pass through Tkinter. For example, if a @@ -18,12 +17,22 @@ this command and provide a facility ('register') to intercept the widget operation. - In IDLE, the function being registered provides access to the top of a - Percolator chain. At the bottom of the chain is a call to the original - Tk widget operation. - + In IDLE, WidgetRedirector is used in Percolator to intercept Text + commands. The function being registered provides access to the top + of a Percolator chain. At the bottom of the chain is a call to the + original Tk widget operation. """ def __init__(self, widget): + '''Initialize attributes and setup redirection. + + _operations: dict mapping operation name to new function. + widget: the widget whose tcl command is to be intercepted. + tk: widget.tk, a convenience attribute, probably not needed. + orig: new name of the original tcl command. + + Since renaming to orig fails with TclError when orig already + exists, only one WidgetDirector can exist for a given widget. + ''' self._operations = {} self.widget = widget # widget instance self.tk = tk = widget.tk # widget's root @@ -40,22 +49,34 @@ self.widget._w) def close(self): + "Unregister operations and revert redirection created by .__init__." for operation in list(self._operations): self.unregister(operation) - widget = self.widget; del self.widget - orig = self.orig; del self.orig + widget = self.widget tk = widget.tk w = widget._w + # Restore the original widget Tcl command. tk.deletecommand(w) - # restore the original widget Tcl command: - tk.call("rename", orig, w) + tk.call("rename", self.orig, w) + del self.widget, self.tk # Should not be needed + # if instance is deleted after close, as in Percolator. def register(self, operation, function): + '''Return OriginalCommand(operation) after registering function. + + Registration adds an instance function attribute that masks the + class instance method attribute. If a second function is + registered for the same operation, the first function is replaced. + ''' self._operations[operation] = function setattr(self.widget, operation, function) return OriginalCommand(self, operation) def unregister(self, operation): + '''Return the function for the operation, or None. + + Deleting the instance attribute unmasks the class attribute. + ''' if operation in self._operations: function = self._operations[operation] del self._operations[operation] @@ -88,14 +109,29 @@ class OriginalCommand: + '''Callable for original tk command that has been redirected. + + Returned by .register; can be used in the function registered. + redir = WidgetRedirector(text) + def my_insert(*args): + print("insert", args) + original_insert(*args) + original_insert = redir.register("insert", my_insert) + ''' def __init__(self, redir, operation): + '''Create .tk_call and .orig_and_operation for .__call__ method. + + .redir and .operation store the input args for __repr__. + .tk and .orig copy attributes of .redir (probably not needed). + ''' self.redir = redir self.operation = operation - self.tk = redir.tk - self.orig = redir.orig - self.tk_call = self.tk.call - self.orig_and_operation = (self.orig, self.operation) + self.tk = redir.tk # redundant with self.redir + self.orig = redir.orig # redundant with self.redir + # These two could be deleted after checking recipient code. + self.tk_call = redir.tk.call + self.orig_and_operation = (redir.orig, operation) def __repr__(self): return "OriginalCommand(%r, %r)" % (self.redir, self.operation) @@ -104,7 +140,10 @@ return self.tk_call(self.orig_and_operation + args) -def _widget_redirector(parent): +def _widget_redirector(parent): # htest # + from Tkinter import Tk, Text + import re + root = Tk() root.title("Test WidgetRedirector") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) @@ -113,13 +152,15 @@ text.pack() text.focus_set() redir = WidgetRedirector(text) - global previous_tcl_fcn def my_insert(*args): print "insert", args - previous_tcl_fcn(*args) - previous_tcl_fcn = redir.register("insert", my_insert) + original_insert(*args) + original_insert = redir.register("insert", my_insert) root.mainloop() if __name__ == "__main__": + import unittest +## unittest.main('idlelib.idle_test.test_widgetredir', +## verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_widget_redirector) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 10 07:17:53 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 10 Jul 2014 07:17:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTQw?= =?utf-8?q?=3A_add_docstrings_to_idlelib=2EWidgetRedirector=2E?= Message-ID: <3h85Hj062lz7Ll2@mail.python.org> http://hg.python.org/cpython/rev/220d5fdbe22e changeset: 91623:220d5fdbe22e branch: 3.4 parent: 91620:5be778fec115 user: Terry Jan Reedy date: Thu Jul 10 01:16:49 2014 -0400 summary: Issue #21940: add docstrings to idlelib.WidgetRedirector. files: Lib/idlelib/WidgetRedirector.py | 78 ++++++++++++++++---- 1 files changed, 60 insertions(+), 18 deletions(-) diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -1,7 +1,6 @@ -from tkinter import * +from tkinter import TclError class WidgetRedirector: - """Support for redirecting arbitrary widget subcommands. Some Tk operations don't normally pass through Tkinter. For example, if a @@ -18,12 +17,22 @@ this command and provide a facility ('register') to intercept the widget operation. - In IDLE, the function being registered provides access to the top of a - Percolator chain. At the bottom of the chain is a call to the original - Tk widget operation. - + In IDLE, WidgetRedirector is used in Percolator to intercept Text + commands. The function being registered provides access to the top + of a Percolator chain. At the bottom of the chain is a call to the + original Tk widget operation. """ def __init__(self, widget): + '''Initialize attributes and setup redirection. + + _operations: dict mapping operation name to new function. + widget: the widget whose tcl command is to be intercepted. + tk: widget.tk, a convenience attribute, probably not needed. + orig: new name of the original tcl command. + + Since renaming to orig fails with TclError when orig already + exists, only one WidgetDirector can exist for a given widget. + ''' self._operations = {} self.widget = widget # widget instance self.tk = tk = widget.tk # widget's root @@ -40,22 +49,34 @@ self.widget._w) def close(self): + "Unregister operations and revert redirection created by .__init__." for operation in list(self._operations): self.unregister(operation) - widget = self.widget; del self.widget - orig = self.orig; del self.orig + widget = self.widget tk = widget.tk w = widget._w + # Restore the original widget Tcl command. tk.deletecommand(w) - # restore the original widget Tcl command: - tk.call("rename", orig, w) + tk.call("rename", self.orig, w) + del self.widget, self.tk # Should not be needed + # if instance is deleted after close, as in Percolator. def register(self, operation, function): + '''Return OriginalCommand(operation) after registering function. + + Registration adds an instance function attribute that masks the + class instance method attribute. If a second function is + registered for the same operation, the first function is replaced. + ''' self._operations[operation] = function setattr(self.widget, operation, function) return OriginalCommand(self, operation) def unregister(self, operation): + '''Return the function for the operation, or None. + + Deleting the instance attribute unmasks the class attribute. + ''' if operation in self._operations: function = self._operations[operation] del self._operations[operation] @@ -88,14 +109,29 @@ class OriginalCommand: + '''Callable for original tk command that has been redirected. + + Returned by .register; can be used in the function registered. + redir = WidgetRedirector(text) + def my_insert(*args): + print("insert", args) + original_insert(*args) + original_insert = redir.register("insert", my_insert) + ''' def __init__(self, redir, operation): + '''Create .tk_call and .orig_and_operation for .__call__ method. + + .redir and .operation store the input args for __repr__. + .tk and .orig copy attributes of .redir (probably not needed). + ''' self.redir = redir self.operation = operation - self.tk = redir.tk - self.orig = redir.orig - self.tk_call = self.tk.call - self.orig_and_operation = (self.orig, self.operation) + self.tk = redir.tk # redundant with self.redir + self.orig = redir.orig # redundant with self.redir + # These two could be deleted after checking recipient code. + self.tk_call = redir.tk.call + self.orig_and_operation = (redir.orig, operation) def __repr__(self): return "OriginalCommand(%r, %r)" % (self.redir, self.operation) @@ -104,7 +140,10 @@ return self.tk_call(self.orig_and_operation + args) -def _widget_redirector(parent): +def _widget_redirector(parent): # htest # + from tkinter import Tk, Text + import re + root = Tk() root.title("Test WidgetRedirector") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) @@ -113,13 +152,16 @@ text.pack() text.focus_set() redir = WidgetRedirector(text) - global previous_tcl_fcn def my_insert(*args): print("insert", args) - previous_tcl_fcn(*args) - previous_tcl_fcn = redir.register("insert", my_insert) + original_insert(*args) + original_insert = redir.register("insert", my_insert) root.mainloop() if __name__ == "__main__": + import unittest +## unittest.main('idlelib.idle_test.test_widgetredir', +## verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(_widget_redirector) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 10 07:17:54 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 10 Jul 2014 07:17:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h85Hk3Bynz7LnT@mail.python.org> http://hg.python.org/cpython/rev/d1f89eb9ea1e changeset: 91624:d1f89eb9ea1e parent: 91621:051cc4f60384 parent: 91623:220d5fdbe22e user: Terry Jan Reedy date: Thu Jul 10 01:17:11 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/WidgetRedirector.py | 78 ++++++++++++++++---- 1 files changed, 60 insertions(+), 18 deletions(-) diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -1,7 +1,6 @@ -from tkinter import * +from tkinter import TclError class WidgetRedirector: - """Support for redirecting arbitrary widget subcommands. Some Tk operations don't normally pass through Tkinter. For example, if a @@ -18,12 +17,22 @@ this command and provide a facility ('register') to intercept the widget operation. - In IDLE, the function being registered provides access to the top of a - Percolator chain. At the bottom of the chain is a call to the original - Tk widget operation. - + In IDLE, WidgetRedirector is used in Percolator to intercept Text + commands. The function being registered provides access to the top + of a Percolator chain. At the bottom of the chain is a call to the + original Tk widget operation. """ def __init__(self, widget): + '''Initialize attributes and setup redirection. + + _operations: dict mapping operation name to new function. + widget: the widget whose tcl command is to be intercepted. + tk: widget.tk, a convenience attribute, probably not needed. + orig: new name of the original tcl command. + + Since renaming to orig fails with TclError when orig already + exists, only one WidgetDirector can exist for a given widget. + ''' self._operations = {} self.widget = widget # widget instance self.tk = tk = widget.tk # widget's root @@ -40,22 +49,34 @@ self.widget._w) def close(self): + "Unregister operations and revert redirection created by .__init__." for operation in list(self._operations): self.unregister(operation) - widget = self.widget; del self.widget - orig = self.orig; del self.orig + widget = self.widget tk = widget.tk w = widget._w + # Restore the original widget Tcl command. tk.deletecommand(w) - # restore the original widget Tcl command: - tk.call("rename", orig, w) + tk.call("rename", self.orig, w) + del self.widget, self.tk # Should not be needed + # if instance is deleted after close, as in Percolator. def register(self, operation, function): + '''Return OriginalCommand(operation) after registering function. + + Registration adds an instance function attribute that masks the + class instance method attribute. If a second function is + registered for the same operation, the first function is replaced. + ''' self._operations[operation] = function setattr(self.widget, operation, function) return OriginalCommand(self, operation) def unregister(self, operation): + '''Return the function for the operation, or None. + + Deleting the instance attribute unmasks the class attribute. + ''' if operation in self._operations: function = self._operations[operation] del self._operations[operation] @@ -88,14 +109,29 @@ class OriginalCommand: + '''Callable for original tk command that has been redirected. + + Returned by .register; can be used in the function registered. + redir = WidgetRedirector(text) + def my_insert(*args): + print("insert", args) + original_insert(*args) + original_insert = redir.register("insert", my_insert) + ''' def __init__(self, redir, operation): + '''Create .tk_call and .orig_and_operation for .__call__ method. + + .redir and .operation store the input args for __repr__. + .tk and .orig copy attributes of .redir (probably not needed). + ''' self.redir = redir self.operation = operation - self.tk = redir.tk - self.orig = redir.orig - self.tk_call = self.tk.call - self.orig_and_operation = (self.orig, self.operation) + self.tk = redir.tk # redundant with self.redir + self.orig = redir.orig # redundant with self.redir + # These two could be deleted after checking recipient code. + self.tk_call = redir.tk.call + self.orig_and_operation = (redir.orig, operation) def __repr__(self): return "OriginalCommand(%r, %r)" % (self.redir, self.operation) @@ -104,7 +140,10 @@ return self.tk_call(self.orig_and_operation + args) -def _widget_redirector(parent): +def _widget_redirector(parent): # htest # + from tkinter import Tk, Text + import re + root = Tk() root.title("Test WidgetRedirector") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) @@ -113,13 +152,16 @@ text.pack() text.focus_set() redir = WidgetRedirector(text) - global previous_tcl_fcn def my_insert(*args): print("insert", args) - previous_tcl_fcn(*args) - previous_tcl_fcn = redir.register("insert", my_insert) + original_insert(*args) + original_insert = redir.register("insert", my_insert) root.mainloop() if __name__ == "__main__": + import unittest +## unittest.main('idlelib.idle_test.test_widgetredir', +## verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(_widget_redirector) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Jul 10 09:46:48 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 10 Jul 2014 09:46:48 +0200 Subject: [Python-checkins] Daily reference leaks (051cc4f60384): sum=3 Message-ID: results for 051cc4f60384 on branch "default" -------------------------------------------- test_collections leaked [0, -2, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 0] references, sum=0 test_site leaked [2, -2, 0] memory blocks, sum=0 test_xmlrpc_net leaked [2, 0, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogHKrstR', '-x'] From python-checkins at python.org Thu Jul 10 18:21:56 2014 From: python-checkins at python.org (zach.ware) Date: Thu, 10 Jul 2014 18:21:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTQy?= =?utf-8?q?=3A_Fixed_source_file_viewing_in_pydoc=27s_server_mode_on_Windo?= =?utf-8?b?d3Mu?= Message-ID: <3h8N1w4hsrz7LjT@mail.python.org> http://hg.python.org/cpython/rev/74c7a186ffdd changeset: 91625:74c7a186ffdd branch: 3.4 parent: 91623:220d5fdbe22e user: Zachary Ware date: Thu Jul 10 11:18:00 2014 -0500 summary: Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. files: Lib/pydoc.py | 8 +++----- Lib/test/test_pydoc.py | 7 ++----- Misc/NEWS | 2 ++ 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -64,6 +64,7 @@ import sys import time import tokenize +import urllib.parse import warnings from collections import deque from reprlib import Repr @@ -648,10 +649,7 @@ head = '%s' % linkedname try: path = inspect.getabsfile(object) - url = path - if sys.platform == 'win32': - import nturl2path - url = nturl2path.pathname2url(path) + url = urllib.parse.quote(path) filelink = self.filelink(url, path) except TypeError: filelink = '(built-in)' @@ -2353,7 +2351,7 @@ def html_getfile(path): """Get and display a source file listing safely.""" - path = path.replace('%20', ' ') + path = urllib.parse.unquote(path) with tokenize.open(path) as fp: lines = html.escape(fp.read()) body = '
%s
' % lines 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 @@ -14,6 +14,7 @@ import time import types import unittest +import urllib.parse import xml.etree import textwrap from io import StringIO @@ -406,11 +407,7 @@ def test_html_doc(self): result, doc_loc = get_pydoc_html(pydoc_mod) mod_file = inspect.getabsfile(pydoc_mod) - if sys.platform == 'win32': - import nturl2path - mod_url = nturl2path.pathname2url(mod_file) - else: - mod_url = mod_file + mod_url = urllib.parse.quote(mod_file) expected_html = expected_html_pattern % ( (mod_url, mod_file, doc_loc) + expected_html_data_docstrings) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,8 @@ Library ------- +- Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. + - Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError if the number of received bytes is negative. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 10 18:21:57 2014 From: python-checkins at python.org (zach.ware) Date: Thu, 10 Jul 2014 18:21:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321942=3A_Fixed_source_file_viewing_in_pydoc=27s?= =?utf-8?q?_server_mode_on_Windows=2E?= Message-ID: <3h8N1x6DGmz7Lm2@mail.python.org> http://hg.python.org/cpython/rev/03b406f5aae0 changeset: 91626:03b406f5aae0 parent: 91624:d1f89eb9ea1e parent: 91625:74c7a186ffdd user: Zachary Ware date: Thu Jul 10 11:21:01 2014 -0500 summary: Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. files: Lib/pydoc.py | 8 +++----- Lib/test/test_pydoc.py | 7 ++----- Misc/NEWS | 2 ++ 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -64,6 +64,7 @@ import sys import time import tokenize +import urllib.parse import warnings from collections import deque from reprlib import Repr @@ -646,10 +647,7 @@ head = '%s' % linkedname try: path = inspect.getabsfile(object) - url = path - if sys.platform == 'win32': - import nturl2path - url = nturl2path.pathname2url(path) + url = urllib.parse.quote(path) filelink = self.filelink(url, path) except TypeError: filelink = '(built-in)' @@ -2350,7 +2348,7 @@ def html_getfile(path): """Get and display a source file listing safely.""" - path = path.replace('%20', ' ') + path = urllib.parse.unquote(path) with tokenize.open(path) as fp: lines = html.escape(fp.read()) body = '
%s
' % lines 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 @@ -13,6 +13,7 @@ import time import types import unittest +import urllib.parse import xml.etree import textwrap from io import StringIO @@ -396,11 +397,7 @@ def test_html_doc(self): result, doc_loc = get_pydoc_html(pydoc_mod) mod_file = inspect.getabsfile(pydoc_mod) - if sys.platform == 'win32': - import nturl2path - mod_url = nturl2path.pathname2url(mod_file) - else: - mod_url = mod_file + mod_url = urllib.parse.quote(mod_file) expected_html = expected_html_pattern % ( (mod_url, mod_file, doc_loc) + expected_html_data_docstrings) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,8 @@ Library ------- +- Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. + - Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError if the number of received bytes is negative. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 10 22:36:53 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 10 Jul 2014 22:36:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h8Th53pf4z7LlH@mail.python.org> http://hg.python.org/cpython/rev/f13cde63ca73 changeset: 91627:f13cde63ca73 branch: 3.4 parent: 91625:74c7a186ffdd user: Victor Stinner date: Thu Jul 10 22:32:58 2014 +0200 summary: asyncio: sync with Tulip - Issues #21936, #21163: Fix sporadic failures of test_future_exception_never_retrieved() - Handle.cancel() now clears references to callback and args - In debug mode, repr(Handle) now contains the location where the Handle was created. files: Lib/asyncio/events.py | 18 +++- Lib/test/test_asyncio/test_events.py | 66 ++++++++++++-- Lib/test/test_asyncio/test_futures.py | 6 + 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -82,14 +82,20 @@ self._source_traceback = None def __repr__(self): - info = [] + info = [self.__class__.__name__] if self._cancelled: info.append('cancelled') - info.append(_format_callback(self._callback, self._args)) - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + if self._callback is not None: + info.append(_format_callback(self._callback, self._args)) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return '<%s>' % ' '.join(info) def cancel(self): self._cancelled = True + self._callback = None + self._args = None def _run(self): try: @@ -125,7 +131,11 @@ if self._cancelled: info.append('cancelled') info.append('when=%s' % self._when) - info.append(_format_callback(self._callback, self._args)) + if self._callback is not None: + info.append(_format_callback(self._callback, self._args)) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def __hash__(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1810,27 +1810,30 @@ wd['h'] = h # Would fail without __weakref__ slot. def test_handle_repr(self): + self.loop.get_debug.return_value = False + # simple function - h = asyncio.Handle(noop, (), self.loop) - src = test_utils.get_function_source(noop) + h = asyncio.Handle(noop, (1, 2), self.loop) + filename, lineno = test_utils.get_function_source(noop) self.assertEqual(repr(h), - '' % src) + '' + % (filename, lineno)) # cancelled handle h.cancel() self.assertEqual(repr(h), - '' % src) + '') # decorated function cb = asyncio.coroutine(noop) h = asyncio.Handle(cb, (), self.loop) self.assertEqual(repr(h), - '' % src) + '' + % (filename, lineno)) # partial function cb = functools.partial(noop, 1, 2) h = asyncio.Handle(cb, (3,), self.loop) - filename, lineno = src regex = (r'^$' % (re.escape(filename), lineno)) self.assertRegex(repr(h), regex) @@ -1839,16 +1842,33 @@ if sys.version_info >= (3, 4): method = HandleTests.test_handle_repr cb = functools.partialmethod(method) - src = test_utils.get_function_source(method) + filename, lineno = test_utils.get_function_source(method) h = asyncio.Handle(cb, (), self.loop) - filename, lineno = src cb_regex = r'' cb_regex = (r'functools.partialmethod\(%s, , \)\(\)' % cb_regex) regex = (r'^$' % (cb_regex, re.escape(filename), lineno)) self.assertRegex(repr(h), regex) + def test_handle_repr_debug(self): + self.loop.get_debug.return_value = True + + # simple function + create_filename = __file__ + create_lineno = sys._getframe().f_lineno + 1 + h = asyncio.Handle(noop, (1, 2), self.loop) + filename, lineno = test_utils.get_function_source(noop) + self.assertEqual(repr(h), + '' + % (filename, lineno, create_filename, create_lineno)) + + # cancelled handle + h.cancel() + self.assertEqual(repr(h), + '' + % (create_filename, create_lineno)) + def test_handle_source_traceback(self): loop = asyncio.get_event_loop_policy().new_event_loop() loop.set_debug(True) @@ -1894,7 +1914,7 @@ def callback(*args): return args - args = () + args = (1, 2, 3) when = time.monotonic() h = asyncio.TimerHandle(when, callback, args, mock.Mock()) self.assertIs(h._callback, callback) @@ -1904,7 +1924,8 @@ # cancel h.cancel() self.assertTrue(h._cancelled) - + self.assertIsNone(h._callback) + self.assertIsNone(h._args) # when cannot be None self.assertRaises(AssertionError, @@ -1912,6 +1933,8 @@ self.loop) def test_timer_repr(self): + self.loop.get_debug.return_value = False + # simple function h = asyncio.TimerHandle(123, noop, (), self.loop) src = test_utils.get_function_source(noop) @@ -1921,8 +1944,27 @@ # cancelled handle h.cancel() self.assertEqual(repr(h), - '' - % src) + '') + + def test_timer_repr_debug(self): + self.loop.get_debug.return_value = True + + # simple function + create_filename = __file__ + create_lineno = sys._getframe().f_lineno + 1 + h = asyncio.TimerHandle(123, noop, (), self.loop) + filename, lineno = test_utils.get_function_source(noop) + self.assertEqual(repr(h), + '' + % (filename, lineno, create_filename, create_lineno)) + + # cancelled handle + h.cancel() + self.assertEqual(repr(h), + '' + % (create_filename, create_lineno)) + def test_timer_comparison(self): def callback(*args): diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -299,6 +299,12 @@ @mock.patch('asyncio.base_events.logger') def test_future_exception_never_retrieved(self, m_log): + # FIXME: Python issue #21163, other tests may "leak" pending task which + # emit a warning when they are destroyed by the GC + support.gc_collect() + m_log.error.reset_mock() + # --- + self.loop.set_debug(True) def memory_error(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 10 22:36:54 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 10 Jul 2014 22:36:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h8Th66bp4z7Lmh@mail.python.org> http://hg.python.org/cpython/rev/a67adfaf670b changeset: 91628:a67adfaf670b parent: 91626:03b406f5aae0 parent: 91627:f13cde63ca73 user: Victor Stinner date: Thu Jul 10 22:34:58 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip - Issues #21936, #21163: Fix sporadic failures of test_future_exception_never_retrieved() - Handle.cancel() now clears references to callback and args - In debug mode, repr(Handle) now contains the location where the Handle was created. files: Lib/asyncio/events.py | 18 +++- Lib/test/test_asyncio/test_events.py | 66 ++++++++++++-- Lib/test/test_asyncio/test_futures.py | 6 + 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -82,14 +82,20 @@ self._source_traceback = None def __repr__(self): - info = [] + info = [self.__class__.__name__] if self._cancelled: info.append('cancelled') - info.append(_format_callback(self._callback, self._args)) - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + if self._callback is not None: + info.append(_format_callback(self._callback, self._args)) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return '<%s>' % ' '.join(info) def cancel(self): self._cancelled = True + self._callback = None + self._args = None def _run(self): try: @@ -125,7 +131,11 @@ if self._cancelled: info.append('cancelled') info.append('when=%s' % self._when) - info.append(_format_callback(self._callback, self._args)) + if self._callback is not None: + info.append(_format_callback(self._callback, self._args)) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def __hash__(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -1810,27 +1810,30 @@ wd['h'] = h # Would fail without __weakref__ slot. def test_handle_repr(self): + self.loop.get_debug.return_value = False + # simple function - h = asyncio.Handle(noop, (), self.loop) - src = test_utils.get_function_source(noop) + h = asyncio.Handle(noop, (1, 2), self.loop) + filename, lineno = test_utils.get_function_source(noop) self.assertEqual(repr(h), - '' % src) + '' + % (filename, lineno)) # cancelled handle h.cancel() self.assertEqual(repr(h), - '' % src) + '') # decorated function cb = asyncio.coroutine(noop) h = asyncio.Handle(cb, (), self.loop) self.assertEqual(repr(h), - '' % src) + '' + % (filename, lineno)) # partial function cb = functools.partial(noop, 1, 2) h = asyncio.Handle(cb, (3,), self.loop) - filename, lineno = src regex = (r'^$' % (re.escape(filename), lineno)) self.assertRegex(repr(h), regex) @@ -1839,16 +1842,33 @@ if sys.version_info >= (3, 4): method = HandleTests.test_handle_repr cb = functools.partialmethod(method) - src = test_utils.get_function_source(method) + filename, lineno = test_utils.get_function_source(method) h = asyncio.Handle(cb, (), self.loop) - filename, lineno = src cb_regex = r'' cb_regex = (r'functools.partialmethod\(%s, , \)\(\)' % cb_regex) regex = (r'^$' % (cb_regex, re.escape(filename), lineno)) self.assertRegex(repr(h), regex) + def test_handle_repr_debug(self): + self.loop.get_debug.return_value = True + + # simple function + create_filename = __file__ + create_lineno = sys._getframe().f_lineno + 1 + h = asyncio.Handle(noop, (1, 2), self.loop) + filename, lineno = test_utils.get_function_source(noop) + self.assertEqual(repr(h), + '' + % (filename, lineno, create_filename, create_lineno)) + + # cancelled handle + h.cancel() + self.assertEqual(repr(h), + '' + % (create_filename, create_lineno)) + def test_handle_source_traceback(self): loop = asyncio.get_event_loop_policy().new_event_loop() loop.set_debug(True) @@ -1894,7 +1914,7 @@ def callback(*args): return args - args = () + args = (1, 2, 3) when = time.monotonic() h = asyncio.TimerHandle(when, callback, args, mock.Mock()) self.assertIs(h._callback, callback) @@ -1904,7 +1924,8 @@ # cancel h.cancel() self.assertTrue(h._cancelled) - + self.assertIsNone(h._callback) + self.assertIsNone(h._args) # when cannot be None self.assertRaises(AssertionError, @@ -1912,6 +1933,8 @@ self.loop) def test_timer_repr(self): + self.loop.get_debug.return_value = False + # simple function h = asyncio.TimerHandle(123, noop, (), self.loop) src = test_utils.get_function_source(noop) @@ -1921,8 +1944,27 @@ # cancelled handle h.cancel() self.assertEqual(repr(h), - '' - % src) + '') + + def test_timer_repr_debug(self): + self.loop.get_debug.return_value = True + + # simple function + create_filename = __file__ + create_lineno = sys._getframe().f_lineno + 1 + h = asyncio.TimerHandle(123, noop, (), self.loop) + filename, lineno = test_utils.get_function_source(noop) + self.assertEqual(repr(h), + '' + % (filename, lineno, create_filename, create_lineno)) + + # cancelled handle + h.cancel() + self.assertEqual(repr(h), + '' + % (create_filename, create_lineno)) + def test_timer_comparison(self): def callback(*args): diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -299,6 +299,12 @@ @mock.patch('asyncio.base_events.logger') def test_future_exception_never_retrieved(self, m_log): + # FIXME: Python issue #21163, other tests may "leak" pending task which + # emit a warning when they are destroyed by the GC + support.gc_collect() + m_log.error.reset_mock() + # --- + self.loop.set_debug(True) def memory_error(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 00:25:51 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 00:25:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h8X5q6DGnz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/2bbfefe414ab changeset: 91629:2bbfefe414ab branch: 3.4 parent: 91627:f13cde63ca73 user: Victor Stinner date: Fri Jul 11 00:21:27 2014 +0200 summary: asyncio: sync with Tulip - repr(Task) and repr(CoroWrapper) now also includes where these objects were created. If the coroutine is not a generator (don't use "yield from"), use the location of the function, not the location of the coro() wrapper. - Fix create_task(): truncate the traceback to hide the call to create_task(). files: Lib/asyncio/base_events.py | 5 +- Lib/asyncio/coroutines.py | 24 ++++++-- Lib/asyncio/tasks.py | 7 ++- Lib/test/test_asyncio/test_tasks.py | 49 ++++++++++++++-- 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -155,7 +155,10 @@ """Schedule a coroutine object. Return a task object.""" - return tasks.Task(coro, loop=self) + task = tasks.Task(coro, loop=self) + if task._source_traceback: + del task._source_traceback[-1] + return task def _make_socket_transport(self, sock, protocol, waiter=None, *, extra=None, server=None): diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -57,7 +57,7 @@ class CoroWrapper: - # Wrapper for coroutine in _DEBUG mode. + # Wrapper for coroutine object in _DEBUG mode. def __init__(self, gen, func): assert inspect.isgenerator(gen), gen @@ -68,8 +68,11 @@ # decorator def __repr__(self): - return ('<%s %s>' - % (self.__class__.__name__, _format_coroutine(self))) + coro_repr = _format_coroutine(self) + if self._source_traceback: + frame = self._source_traceback[-1] + coro_repr += ', created at %s:%s' % (frame[0], frame[1]) + return '<%s %s>' % (self.__class__.__name__, coro_repr) def __iter__(self): return self @@ -181,9 +184,18 @@ coro_name = coro.__name__ filename = coro.gi_code.co_filename - if coro.gi_frame is not None: + if (isinstance(coro, CoroWrapper) + and not inspect.isgeneratorfunction(coro.func)): + filename, lineno = events._get_function_source(coro.func) + if coro.gi_frame is None: + coro_repr = '%s() done, defined at %s:%s' % (coro_name, filename, lineno) + else: + coro_repr = '%s() running, defined at %s:%s' % (coro_name, filename, lineno) + elif coro.gi_frame is not None: lineno = coro.gi_frame.f_lineno - return '%s() at %s:%s' % (coro_name, filename, lineno) + coro_repr = '%s() running at %s:%s' % (coro_name, filename, lineno) else: lineno = coro.gi_code.co_firstlineno - return '%s() done at %s:%s' % (coro_name, filename, lineno) + coro_repr = '%s() done, defined at %s:%s' % (coro_name, filename, lineno) + + return coro_repr diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -101,7 +101,12 @@ else: info.append(self._state.lower()) - info.append(coroutines._format_coroutine(self._coro)) + coro = coroutines._format_coroutine(self._coro) + info.append('coro=<%s>' % coro) + + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) if self._state == futures._FINISHED: info.append(self._format_result()) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -24,6 +24,19 @@ pass +def format_coroutine(qualname, state, src, source_traceback, generator=False): + if generator: + state = '%s' % state + else: + state = '%s, defined' % state + if source_traceback is not None: + frame = source_traceback[-1] + return ('coro=<%s() %s at %s> created at %s:%s' + % (qualname, state, src, frame[0], frame[1])) + else: + return 'coro=<%s() %s at %s>' % (qualname, state, src) + + class Dummy: def __repr__(self): @@ -149,7 +162,9 @@ # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) - coro = '%s() at %s' % (coro_qualname, src) + + coro = format_coroutine(coro_qualname, 'running', src, + t._source_traceback, generator=True) self.assertEqual(repr(t), '()]>' % coro) @@ -161,13 +176,16 @@ # test cancelled Task self.assertRaises(asyncio.CancelledError, self.loop.run_until_complete, t) - coro = '%s() done at %s' % (coro_qualname, src) + coro = format_coroutine(coro_qualname, 'done', src, + t._source_traceback) self.assertEqual(repr(t), '' % coro) # test finished Task t = asyncio.Task(notmuch(), loop=self.loop) self.loop.run_until_complete(t) + coro = format_coroutine(coro_qualname, 'done', src, + t._source_traceback) self.assertEqual(repr(t), "" % coro) @@ -206,18 +224,35 @@ if PY35: self.assertEqual(gen.__qualname__, coro_qualname) - # format the coroutine object - code = gen.gi_code - coro = ('%s() at %s:%s' - % (coro_qualname, code.co_filename, code.co_firstlineno)) - # test repr(CoroWrapper) if coroutines._DEBUG: + # format the coroutine object + if coroutines._DEBUG: + filename, lineno = test_utils.get_function_source(notmuch) + frame = gen._source_traceback[-1] + coro = ('%s() running, defined at %s:%s, created at %s:%s' + % (coro_qualname, filename, lineno, + frame[0], frame[1])) + else: + code = gen.gi_code + coro = ('%s() running at %s:%s' + % (coro_qualname, code.co_filename, code.co_firstlineno)) + self.assertEqual(repr(gen), '' % coro) # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) + + # format the coroutine object + if coroutines._DEBUG: + src = '%s:%s' % test_utils.get_function_source(notmuch) + else: + code = gen.gi_code + src = '%s:%s' % (code.co_filename, code.co_firstlineno) + coro = format_coroutine(coro_qualname, 'running', src, + t._source_traceback, + generator=not coroutines._DEBUG) self.assertEqual(repr(t), '()]>' % coro) self.loop.run_until_complete(t) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 00:25:53 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 00:25:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h8X5s1ltpz7Lll@mail.python.org> http://hg.python.org/cpython/rev/c71a3dfc8764 changeset: 91630:c71a3dfc8764 parent: 91628:a67adfaf670b parent: 91629:2bbfefe414ab user: Victor Stinner date: Fri Jul 11 00:23:17 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip - repr(Task) and repr(CoroWrapper) now also includes where these objects were created. If the coroutine is not a generator (don't use "yield from"), use the location of the function, not the location of the coro() wrapper. - Fix create_task(): truncate the traceback to hide the call to create_task(). files: Lib/asyncio/base_events.py | 5 +- Lib/asyncio/coroutines.py | 24 ++++++-- Lib/asyncio/tasks.py | 7 ++- Lib/test/test_asyncio/test_tasks.py | 49 ++++++++++++++-- 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -155,7 +155,10 @@ """Schedule a coroutine object. Return a task object.""" - return tasks.Task(coro, loop=self) + task = tasks.Task(coro, loop=self) + if task._source_traceback: + del task._source_traceback[-1] + return task def _make_socket_transport(self, sock, protocol, waiter=None, *, extra=None, server=None): diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -57,7 +57,7 @@ class CoroWrapper: - # Wrapper for coroutine in _DEBUG mode. + # Wrapper for coroutine object in _DEBUG mode. def __init__(self, gen, func): assert inspect.isgenerator(gen), gen @@ -68,8 +68,11 @@ # decorator def __repr__(self): - return ('<%s %s>' - % (self.__class__.__name__, _format_coroutine(self))) + coro_repr = _format_coroutine(self) + if self._source_traceback: + frame = self._source_traceback[-1] + coro_repr += ', created at %s:%s' % (frame[0], frame[1]) + return '<%s %s>' % (self.__class__.__name__, coro_repr) def __iter__(self): return self @@ -181,9 +184,18 @@ coro_name = coro.__name__ filename = coro.gi_code.co_filename - if coro.gi_frame is not None: + if (isinstance(coro, CoroWrapper) + and not inspect.isgeneratorfunction(coro.func)): + filename, lineno = events._get_function_source(coro.func) + if coro.gi_frame is None: + coro_repr = '%s() done, defined at %s:%s' % (coro_name, filename, lineno) + else: + coro_repr = '%s() running, defined at %s:%s' % (coro_name, filename, lineno) + elif coro.gi_frame is not None: lineno = coro.gi_frame.f_lineno - return '%s() at %s:%s' % (coro_name, filename, lineno) + coro_repr = '%s() running at %s:%s' % (coro_name, filename, lineno) else: lineno = coro.gi_code.co_firstlineno - return '%s() done at %s:%s' % (coro_name, filename, lineno) + coro_repr = '%s() done, defined at %s:%s' % (coro_name, filename, lineno) + + return coro_repr diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -101,7 +101,12 @@ else: info.append(self._state.lower()) - info.append(coroutines._format_coroutine(self._coro)) + coro = coroutines._format_coroutine(self._coro) + info.append('coro=<%s>' % coro) + + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) if self._state == futures._FINISHED: info.append(self._format_result()) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -24,6 +24,19 @@ pass +def format_coroutine(qualname, state, src, source_traceback, generator=False): + if generator: + state = '%s' % state + else: + state = '%s, defined' % state + if source_traceback is not None: + frame = source_traceback[-1] + return ('coro=<%s() %s at %s> created at %s:%s' + % (qualname, state, src, frame[0], frame[1])) + else: + return 'coro=<%s() %s at %s>' % (qualname, state, src) + + class Dummy: def __repr__(self): @@ -149,7 +162,9 @@ # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) - coro = '%s() at %s' % (coro_qualname, src) + + coro = format_coroutine(coro_qualname, 'running', src, + t._source_traceback, generator=True) self.assertEqual(repr(t), '()]>' % coro) @@ -161,13 +176,16 @@ # test cancelled Task self.assertRaises(asyncio.CancelledError, self.loop.run_until_complete, t) - coro = '%s() done at %s' % (coro_qualname, src) + coro = format_coroutine(coro_qualname, 'done', src, + t._source_traceback) self.assertEqual(repr(t), '' % coro) # test finished Task t = asyncio.Task(notmuch(), loop=self.loop) self.loop.run_until_complete(t) + coro = format_coroutine(coro_qualname, 'done', src, + t._source_traceback) self.assertEqual(repr(t), "" % coro) @@ -206,18 +224,35 @@ if PY35: self.assertEqual(gen.__qualname__, coro_qualname) - # format the coroutine object - code = gen.gi_code - coro = ('%s() at %s:%s' - % (coro_qualname, code.co_filename, code.co_firstlineno)) - # test repr(CoroWrapper) if coroutines._DEBUG: + # format the coroutine object + if coroutines._DEBUG: + filename, lineno = test_utils.get_function_source(notmuch) + frame = gen._source_traceback[-1] + coro = ('%s() running, defined at %s:%s, created at %s:%s' + % (coro_qualname, filename, lineno, + frame[0], frame[1])) + else: + code = gen.gi_code + coro = ('%s() running at %s:%s' + % (coro_qualname, code.co_filename, code.co_firstlineno)) + self.assertEqual(repr(gen), '' % coro) # test pending Task t = asyncio.Task(gen, loop=self.loop) t.add_done_callback(Dummy()) + + # format the coroutine object + if coroutines._DEBUG: + src = '%s:%s' % test_utils.get_function_source(notmuch) + else: + code = gen.gi_code + src = '%s:%s' % (code.co_filename, code.co_firstlineno) + coro = format_coroutine(coro_qualname, 'running', src, + t._source_traceback, + generator=not coroutines._DEBUG) self.assertEqual(repr(t), '()]>' % coro) self.loop.run_until_complete(t) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 01:25:38 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 01:25:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h8YQp4b8jz7Lkv@mail.python.org> http://hg.python.org/cpython/rev/4ec238fc7036 changeset: 91631:4ec238fc7036 branch: 3.4 parent: 91629:2bbfefe414ab user: Victor Stinner date: Fri Jul 11 01:04:16 2014 +0200 summary: asyncio: sync with Tulip - CoroWrapper.__del__() now reuses repr(CoroWrapper) to log the "... was never yielded from" warning - Improve CoroWrapper: copy also the qualified name on Python 3.4, not only on Python 3.5+ files: Lib/asyncio/coroutines.py | 12 +++--------- Lib/asyncio/tasks.py | 1 - Lib/test/test_asyncio/test_tasks.py | 11 +++-------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -29,8 +29,6 @@ _DEBUG = (not sys.flags.ignore_environment and bool(os.environ.get('PYTHONASYNCIODEBUG'))) -_PY35 = (sys.version_info >= (3, 5)) - # Check for CPython issue #21209 def has_yield_from_bug(): @@ -119,8 +117,7 @@ gen = getattr(self, 'gen', None) frame = getattr(gen, 'gi_frame', None) if frame is not None and frame.f_lasti == -1: - func = events._format_callback(self.func, ()) - msg = 'Coroutine %s was never yielded from' % func + msg = '%r was never yielded from' % self tb = getattr(self, '_source_traceback', ()) if tb: tb = ''.join(traceback.format_list(tb)) @@ -155,7 +152,7 @@ if w._source_traceback: del w._source_traceback[-1] w.__name__ = func.__name__ - if _PY35: + if hasattr(func, '__qualname__'): w.__qualname__ = func.__qualname__ w.__doc__ = func.__doc__ return w @@ -178,10 +175,7 @@ def _format_coroutine(coro): assert iscoroutine(coro) - if _PY35: - coro_name = coro.__qualname__ - else: - coro_name = coro.__name__ + coro_name = getattr(coro, '__qualname__', coro.__name__) filename = coro.gi_code.co_filename if (isinstance(coro, CoroWrapper) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -21,7 +21,6 @@ from .log import logger _PY34 = (sys.version_info >= (3, 4)) -_PY35 = (sys.version_info >= (3, 5)) class Task(futures.Future): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -150,7 +150,7 @@ # test coroutine object gen = notmuch() - if PY35: + if coroutines._DEBUG or PY35: coro_qualname = 'TaskTests.test_task_repr..notmuch' else: coro_qualname = 'notmuch' @@ -205,17 +205,12 @@ # test coroutine object gen = notmuch() - if PY35: + if coroutines._DEBUG or PY35: # On Python >= 3.5, generators now inherit the name of the # function, as expected, and have a qualified name (__qualname__ # attribute). coro_name = 'notmuch' coro_qualname = 'TaskTests.test_task_repr_coro_decorator..notmuch' - elif coroutines._DEBUG: - # In debug mode, @coroutine decorator uses CoroWrapper which gets - # its name (__name__ attribute) from the wrapped coroutine - # function. - coro_name = coro_qualname = 'notmuch' else: # On Python < 3.5, generators inherit the name of the code, not of # the function. See: http://bugs.python.org/issue21205 @@ -1653,7 +1648,7 @@ self.assertTrue(m_log.error.called) message = m_log.error.call_args[0][0] func_filename, func_lineno = test_utils.get_function_source(coro_noop) - regex = (r'^Coroutine %s\(\) at %s:%s was never yielded from\n' + regex = (r'^ was never yielded from\n' r'Coroutine object created at \(most recent call last\):\n' r'.*\n' r' File "%s", line %s, in test_coroutine_never_yielded\n' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 01:25:40 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 01:25:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h8YQr0MrVz7Lkv@mail.python.org> http://hg.python.org/cpython/rev/53791c97f1ab changeset: 91632:53791c97f1ab parent: 91630:c71a3dfc8764 parent: 91631:4ec238fc7036 user: Victor Stinner date: Fri Jul 11 01:24:33 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip - CoroWrapper.__del__() now reuses repr(CoroWrapper) to log the "... was never yielded from" warning - Improve CoroWrapper: copy also the qualified name on Python 3.4, not only on Python 3.5+ files: Lib/asyncio/coroutines.py | 12 +++--------- Lib/asyncio/tasks.py | 1 - Lib/test/test_asyncio/test_tasks.py | 11 +++-------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -29,8 +29,6 @@ _DEBUG = (not sys.flags.ignore_environment and bool(os.environ.get('PYTHONASYNCIODEBUG'))) -_PY35 = (sys.version_info >= (3, 5)) - # Check for CPython issue #21209 def has_yield_from_bug(): @@ -119,8 +117,7 @@ gen = getattr(self, 'gen', None) frame = getattr(gen, 'gi_frame', None) if frame is not None and frame.f_lasti == -1: - func = events._format_callback(self.func, ()) - msg = 'Coroutine %s was never yielded from' % func + msg = '%r was never yielded from' % self tb = getattr(self, '_source_traceback', ()) if tb: tb = ''.join(traceback.format_list(tb)) @@ -155,7 +152,7 @@ if w._source_traceback: del w._source_traceback[-1] w.__name__ = func.__name__ - if _PY35: + if hasattr(func, '__qualname__'): w.__qualname__ = func.__qualname__ w.__doc__ = func.__doc__ return w @@ -178,10 +175,7 @@ def _format_coroutine(coro): assert iscoroutine(coro) - if _PY35: - coro_name = coro.__qualname__ - else: - coro_name = coro.__name__ + coro_name = getattr(coro, '__qualname__', coro.__name__) filename = coro.gi_code.co_filename if (isinstance(coro, CoroWrapper) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -21,7 +21,6 @@ from .log import logger _PY34 = (sys.version_info >= (3, 4)) -_PY35 = (sys.version_info >= (3, 5)) class Task(futures.Future): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -150,7 +150,7 @@ # test coroutine object gen = notmuch() - if PY35: + if coroutines._DEBUG or PY35: coro_qualname = 'TaskTests.test_task_repr..notmuch' else: coro_qualname = 'notmuch' @@ -205,17 +205,12 @@ # test coroutine object gen = notmuch() - if PY35: + if coroutines._DEBUG or PY35: # On Python >= 3.5, generators now inherit the name of the # function, as expected, and have a qualified name (__qualname__ # attribute). coro_name = 'notmuch' coro_qualname = 'TaskTests.test_task_repr_coro_decorator..notmuch' - elif coroutines._DEBUG: - # In debug mode, @coroutine decorator uses CoroWrapper which gets - # its name (__name__ attribute) from the wrapped coroutine - # function. - coro_name = coro_qualname = 'notmuch' else: # On Python < 3.5, generators inherit the name of the code, not of # the function. See: http://bugs.python.org/issue21205 @@ -1653,7 +1648,7 @@ self.assertTrue(m_log.error.called) message = m_log.error.call_args[0][0] func_filename, func_lineno = test_utils.get_function_source(coro_noop) - regex = (r'^Coroutine %s\(\) at %s:%s was never yielded from\n' + regex = (r'^ was never yielded from\n' r'Coroutine object created at \(most recent call last\):\n' r'.*\n' r' File "%s", line %s, in test_coroutine_never_yielded\n' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:16:57 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:16:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzIxOTQwOiBBZGQg?= =?utf-8?q?unittest_for_WidgetRedirector=2E_Initial_patch_by_Saimadhav_Heb?= =?utf-8?q?likar=2E?= Message-ID: <3h8gtx1Pwvz7LlC@mail.python.org> http://hg.python.org/cpython/rev/53d0776aab53 changeset: 91633:53d0776aab53 branch: 2.7 parent: 91622:5af194064f96 user: Terry Jan Reedy date: Fri Jul 11 00:15:54 2014 -0400 summary: #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav Heblikar. files: Lib/idlelib/WidgetRedirector.py | 30 +- Lib/idlelib/idle_test/mock_idle.py | 5 +- Lib/idlelib/idle_test/test_widgetredir.py | 122 ++++++++++ 3 files changed, 145 insertions(+), 12 deletions(-) diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -3,19 +3,21 @@ class WidgetRedirector: """Support for redirecting arbitrary widget subcommands. - Some Tk operations don't normally pass through Tkinter. For example, if a + Some Tk operations don't normally pass through tkinter. For example, if a character is inserted into a Text widget by pressing a key, a default Tk binding to the widget's 'insert' operation is activated, and the Tk library - processes the insert without calling back into Tkinter. + processes the insert without calling back into tkinter. - Although a binding to could be made via Tkinter, what we really want - to do is to hook the Tk 'insert' operation itself. + Although a binding to could be made via tkinter, what we really want + to do is to hook the Tk 'insert' operation itself. For one thing, we want + a text.insert call in idle code to have the same effect as a key press. When a widget is instantiated, a Tcl command is created whose name is the same as the pathname widget._w. This command is used to invoke the various widget operations, e.g. insert (for a Text widget). We are going to hook this command and provide a facility ('register') to intercept the widget - operation. + operation. We will also intercept method calls on the Tkinter class + instance that represents the tk widget. In IDLE, WidgetRedirector is used in Percolator to intercept Text commands. The function being registered provides access to the top @@ -64,9 +66,13 @@ def register(self, operation, function): '''Return OriginalCommand(operation) after registering function. - Registration adds an instance function attribute that masks the - class instance method attribute. If a second function is - registered for the same operation, the first function is replaced. + Registration adds an operation: function pair to ._operations. + It also adds an widget function attribute that masks the Tkinter + class instance method. Method masking operates independently + from command dispatch. + + If a second function is registered for the same operation, the + first function is replaced in both places. ''' self._operations[operation] = function setattr(self.widget, operation, function) @@ -80,8 +86,10 @@ if operation in self._operations: function = self._operations[operation] del self._operations[operation] - if hasattr(self.widget, operation): + try: delattr(self.widget, operation) + except AttributeError: + pass return function else: return None @@ -160,7 +168,7 @@ if __name__ == "__main__": import unittest -## unittest.main('idlelib.idle_test.test_widgetredir', -## verbosity=2, exit=False) + unittest.main('idlelib.idle_test.test_widgetredir', + verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_widget_redirector) diff --git a/Lib/idlelib/idle_test/mock_idle.py b/Lib/idlelib/idle_test/mock_idle.py --- a/Lib/idlelib/idle_test/mock_idle.py +++ b/Lib/idlelib/idle_test/mock_idle.py @@ -26,7 +26,10 @@ self.called = True self.args = args self.kwds = kwds - return self.result + if isinstance(self.result, BaseException): + raise self.result + else: + return self.result class Editor(object): diff --git a/Lib/idlelib/idle_test/test_widgetredir.py b/Lib/idlelib/idle_test/test_widgetredir.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_widgetredir.py @@ -0,0 +1,122 @@ +"""Unittest for idlelib.WidgetRedirector + +100% coverage +""" +from test.test_support import requires +import unittest +from idlelib.idle_test.mock_idle import Func +from Tkinter import Tk, Text, TclError +from idlelib.WidgetRedirector import WidgetRedirector + + +class InitCloseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + del cls.text, cls.tk + + def test_init(self): + redir = WidgetRedirector(self.text) + self.assertEqual(redir.widget, self.text) + self.assertEqual(redir.tk, self.text.tk) + self.assertRaises(TclError, WidgetRedirector, self.text) + redir.close() # restore self.tk, self.text + + def test_close(self): + redir = WidgetRedirector(self.text) + redir.register('insert', Func) + redir.close() + self.assertEqual(redir._operations, {}) + self.assertFalse(hasattr(self.text, 'widget')) + + +class WidgetRedirectorTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + del cls.text, cls.tk + + def setUp(self): + self.redir = WidgetRedirector(self.text) + self.func = Func() + self.orig_insert = self.redir.register('insert', self.func) + self.text.insert('insert', 'asdf') # leaves self.text empty + + def tearDown(self): + self.text.delete('1.0', 'end') + self.redir.close() + + def test_repr(self): # partly for 100% coverage + self.assertIn('Redirector', repr(self.redir)) + self.assertIn('Original', repr(self.orig_insert)) + + def test_register(self): + self.assertEqual(self.text.get('1.0', 'end'), '\n') + self.assertEqual(self.func.args, ('insert', 'asdf')) + self.assertIn('insert', self.redir._operations) + self.assertIn('insert', self.text.__dict__) + self.assertEqual(self.text.insert, self.func) + + def test_original_command(self): + self.assertEqual(self.orig_insert.operation, 'insert') + self.assertEqual(self.orig_insert.tk_call, self.text.tk.call) + self.orig_insert('insert', 'asdf') + self.assertEqual(self.text.get('1.0', 'end'), 'asdf\n') + + def test_unregister(self): + self.assertIsNone(self.redir.unregister('invalid operation name')) + self.assertEqual(self.redir.unregister('insert'), self.func) + self.assertNotIn('insert', self.redir._operations) + self.assertNotIn('insert', self.text.__dict__) + + def test_unregister_no_attribute(self): + del self.text.insert + self.assertEqual(self.redir.unregister('insert'), self.func) + + def test_dispatch_intercept(self): + self.func.__init__(True) + self.assertTrue(self.redir.dispatch('insert', False)) + self.assertFalse(self.func.args[0]) + + def test_dispatch_bypass(self): + self.orig_insert('insert', 'asdf') + # tk.call returns '' where Python would return None + self.assertEqual(self.redir.dispatch('delete', '1.0', 'end'), '') + self.assertEqual(self.text.get('1.0', 'end'), '\n') + + def test_dispatch_error(self): + self.func.__init__(TclError()) + self.assertEqual(self.redir.dispatch('insert', False), '') + self.assertEqual(self.redir.dispatch('invalid'), '') + + def test_command_dispatch(self): + # Test that .__init__ causes redirection of tk calls + # through redir.dispatch + self.tk.call(self.text._w, 'insert', 'hello') + self.assertEqual(self.func.args, ('hello',)) + self.assertEqual(self.text.get('1.0', 'end'), '\n') + # Ensure that called through redir .dispatch and not through + # self.text.insert by having mock raise TclError. + self.func.__init__(TclError()) + self.assertEqual(self.tk.call(self.text._w, 'insert', 'boo'), '') + + + +if __name__ == '__main__': + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:16:58 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:16:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogIzIxOTQwOiBBZGQg?= =?utf-8?q?unittest_for_WidgetRedirector=2E_Initial_patch_by_Saimadhav_Heb?= =?utf-8?q?likar=2E?= Message-ID: <3h8gty3yy0z7LmX@mail.python.org> http://hg.python.org/cpython/rev/edf2ae293d70 changeset: 91634:edf2ae293d70 branch: 3.4 parent: 91631:4ec238fc7036 user: Terry Jan Reedy date: Fri Jul 11 00:16:00 2014 -0400 summary: #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav Heblikar. files: Lib/idlelib/WidgetRedirector.py | 31 +- Lib/idlelib/idle_test/mock_idle.py | 5 +- Lib/idlelib/idle_test/test_widgetredir.py | 122 ++++++++++ 3 files changed, 145 insertions(+), 13 deletions(-) diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -3,19 +3,21 @@ class WidgetRedirector: """Support for redirecting arbitrary widget subcommands. - Some Tk operations don't normally pass through Tkinter. For example, if a + Some Tk operations don't normally pass through tkinter. For example, if a character is inserted into a Text widget by pressing a key, a default Tk binding to the widget's 'insert' operation is activated, and the Tk library - processes the insert without calling back into Tkinter. + processes the insert without calling back into tkinter. - Although a binding to could be made via Tkinter, what we really want - to do is to hook the Tk 'insert' operation itself. + Although a binding to could be made via tkinter, what we really want + to do is to hook the Tk 'insert' operation itself. For one thing, we want + a text.insert call in idle code to have the same effect as a key press. When a widget is instantiated, a Tcl command is created whose name is the same as the pathname widget._w. This command is used to invoke the various widget operations, e.g. insert (for a Text widget). We are going to hook this command and provide a facility ('register') to intercept the widget - operation. + operation. We will also intercept method calls on the tkinter class + instance that represents the tk widget. In IDLE, WidgetRedirector is used in Percolator to intercept Text commands. The function being registered provides access to the top @@ -64,9 +66,13 @@ def register(self, operation, function): '''Return OriginalCommand(operation) after registering function. - Registration adds an instance function attribute that masks the - class instance method attribute. If a second function is - registered for the same operation, the first function is replaced. + Registration adds an operation: function pair to ._operations. + It also adds an widget function attribute that masks the tkinter + class instance method. Method masking operates independently + from command dispatch. + + If a second function is registered for the same operation, the + first function is replaced in both places. ''' self._operations[operation] = function setattr(self.widget, operation, function) @@ -80,8 +86,10 @@ if operation in self._operations: function = self._operations[operation] del self._operations[operation] - if hasattr(self.widget, operation): + try: delattr(self.widget, operation) + except AttributeError: + pass return function else: return None @@ -160,8 +168,7 @@ if __name__ == "__main__": import unittest -## unittest.main('idlelib.idle_test.test_widgetredir', -## verbosity=2, exit=False) - + unittest.main('idlelib.idle_test.test_widgetredir', + verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_widget_redirector) diff --git a/Lib/idlelib/idle_test/mock_idle.py b/Lib/idlelib/idle_test/mock_idle.py --- a/Lib/idlelib/idle_test/mock_idle.py +++ b/Lib/idlelib/idle_test/mock_idle.py @@ -26,7 +26,10 @@ self.called = True self.args = args self.kwds = kwds - return self.result + if isinstance(self.result, BaseException): + raise self.result + else: + return self.result class Editor: diff --git a/Lib/idlelib/idle_test/test_widgetredir.py b/Lib/idlelib/idle_test/test_widgetredir.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_widgetredir.py @@ -0,0 +1,122 @@ +"""Unittest for idlelib.WidgetRedirector + +100% coverage +""" +from test.support import requires +import unittest +from idlelib.idle_test.mock_idle import Func +from tkinter import Tk, Text, TclError +from idlelib.WidgetRedirector import WidgetRedirector + + +class InitCloseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + del cls.text, cls.tk + + def test_init(self): + redir = WidgetRedirector(self.text) + self.assertEqual(redir.widget, self.text) + self.assertEqual(redir.tk, self.text.tk) + self.assertRaises(TclError, WidgetRedirector, self.text) + redir.close() # restore self.tk, self.text + + def test_close(self): + redir = WidgetRedirector(self.text) + redir.register('insert', Func) + redir.close() + self.assertEqual(redir._operations, {}) + self.assertFalse(hasattr(self.text, 'widget')) + + +class WidgetRedirectorTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + del cls.text, cls.tk + + def setUp(self): + self.redir = WidgetRedirector(self.text) + self.func = Func() + self.orig_insert = self.redir.register('insert', self.func) + self.text.insert('insert', 'asdf') # leaves self.text empty + + def tearDown(self): + self.text.delete('1.0', 'end') + self.redir.close() + + def test_repr(self): # partly for 100% coverage + self.assertIn('Redirector', repr(self.redir)) + self.assertIn('Original', repr(self.orig_insert)) + + def test_register(self): + self.assertEqual(self.text.get('1.0', 'end'), '\n') + self.assertEqual(self.func.args, ('insert', 'asdf')) + self.assertIn('insert', self.redir._operations) + self.assertIn('insert', self.text.__dict__) + self.assertEqual(self.text.insert, self.func) + + def test_original_command(self): + self.assertEqual(self.orig_insert.operation, 'insert') + self.assertEqual(self.orig_insert.tk_call, self.text.tk.call) + self.orig_insert('insert', 'asdf') + self.assertEqual(self.text.get('1.0', 'end'), 'asdf\n') + + def test_unregister(self): + self.assertIsNone(self.redir.unregister('invalid operation name')) + self.assertEqual(self.redir.unregister('insert'), self.func) + self.assertNotIn('insert', self.redir._operations) + self.assertNotIn('insert', self.text.__dict__) + + def test_unregister_no_attribute(self): + del self.text.insert + self.assertEqual(self.redir.unregister('insert'), self.func) + + def test_dispatch_intercept(self): + self.func.__init__(True) + self.assertTrue(self.redir.dispatch('insert', False)) + self.assertFalse(self.func.args[0]) + + def test_dispatch_bypass(self): + self.orig_insert('insert', 'asdf') + # tk.call returns '' where Python would return None + self.assertEqual(self.redir.dispatch('delete', '1.0', 'end'), '') + self.assertEqual(self.text.get('1.0', 'end'), '\n') + + def test_dispatch_error(self): + self.func.__init__(TclError()) + self.assertEqual(self.redir.dispatch('insert', False), '') + self.assertEqual(self.redir.dispatch('invalid'), '') + + def test_command_dispatch(self): + # Test that .__init__ causes redirection of tk calls + # through redir.dispatch + self.tk.call(self.text._w, 'insert', 'hello') + self.assertEqual(self.func.args, ('hello',)) + self.assertEqual(self.text.get('1.0', 'end'), '\n') + # Ensure that called through redir .dispatch and not through + # self.text.insert by having mock raise TclError. + self.func.__init__(TclError()) + self.assertEqual(self.tk.call(self.text._w, 'insert', 'boo'), '') + + + +if __name__ == '__main__': + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:16:59 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:16:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h8gtz6l0Zz7Lmt@mail.python.org> http://hg.python.org/cpython/rev/0a4433aaa338 changeset: 91635:0a4433aaa338 parent: 91632:53791c97f1ab parent: 91634:edf2ae293d70 user: Terry Jan Reedy date: Fri Jul 11 00:16:16 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/WidgetRedirector.py | 31 +- Lib/idlelib/idle_test/mock_idle.py | 5 +- Lib/idlelib/idle_test/test_widgetredir.py | 122 ++++++++++ 3 files changed, 145 insertions(+), 13 deletions(-) diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -3,19 +3,21 @@ class WidgetRedirector: """Support for redirecting arbitrary widget subcommands. - Some Tk operations don't normally pass through Tkinter. For example, if a + Some Tk operations don't normally pass through tkinter. For example, if a character is inserted into a Text widget by pressing a key, a default Tk binding to the widget's 'insert' operation is activated, and the Tk library - processes the insert without calling back into Tkinter. + processes the insert without calling back into tkinter. - Although a binding to could be made via Tkinter, what we really want - to do is to hook the Tk 'insert' operation itself. + Although a binding to could be made via tkinter, what we really want + to do is to hook the Tk 'insert' operation itself. For one thing, we want + a text.insert call in idle code to have the same effect as a key press. When a widget is instantiated, a Tcl command is created whose name is the same as the pathname widget._w. This command is used to invoke the various widget operations, e.g. insert (for a Text widget). We are going to hook this command and provide a facility ('register') to intercept the widget - operation. + operation. We will also intercept method calls on the tkinter class + instance that represents the tk widget. In IDLE, WidgetRedirector is used in Percolator to intercept Text commands. The function being registered provides access to the top @@ -64,9 +66,13 @@ def register(self, operation, function): '''Return OriginalCommand(operation) after registering function. - Registration adds an instance function attribute that masks the - class instance method attribute. If a second function is - registered for the same operation, the first function is replaced. + Registration adds an operation: function pair to ._operations. + It also adds an widget function attribute that masks the tkinter + class instance method. Method masking operates independently + from command dispatch. + + If a second function is registered for the same operation, the + first function is replaced in both places. ''' self._operations[operation] = function setattr(self.widget, operation, function) @@ -80,8 +86,10 @@ if operation in self._operations: function = self._operations[operation] del self._operations[operation] - if hasattr(self.widget, operation): + try: delattr(self.widget, operation) + except AttributeError: + pass return function else: return None @@ -160,8 +168,7 @@ if __name__ == "__main__": import unittest -## unittest.main('idlelib.idle_test.test_widgetredir', -## verbosity=2, exit=False) - + unittest.main('idlelib.idle_test.test_widgetredir', + verbosity=2, exit=False) from idlelib.idle_test.htest import run run(_widget_redirector) diff --git a/Lib/idlelib/idle_test/mock_idle.py b/Lib/idlelib/idle_test/mock_idle.py --- a/Lib/idlelib/idle_test/mock_idle.py +++ b/Lib/idlelib/idle_test/mock_idle.py @@ -26,7 +26,10 @@ self.called = True self.args = args self.kwds = kwds - return self.result + if isinstance(self.result, BaseException): + raise self.result + else: + return self.result class Editor: diff --git a/Lib/idlelib/idle_test/test_widgetredir.py b/Lib/idlelib/idle_test/test_widgetredir.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_widgetredir.py @@ -0,0 +1,122 @@ +"""Unittest for idlelib.WidgetRedirector + +100% coverage +""" +from test.support import requires +import unittest +from idlelib.idle_test.mock_idle import Func +from tkinter import Tk, Text, TclError +from idlelib.WidgetRedirector import WidgetRedirector + + +class InitCloseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + del cls.text, cls.tk + + def test_init(self): + redir = WidgetRedirector(self.text) + self.assertEqual(redir.widget, self.text) + self.assertEqual(redir.tk, self.text.tk) + self.assertRaises(TclError, WidgetRedirector, self.text) + redir.close() # restore self.tk, self.text + + def test_close(self): + redir = WidgetRedirector(self.text) + redir.register('insert', Func) + redir.close() + self.assertEqual(redir._operations, {}) + self.assertFalse(hasattr(self.text, 'widget')) + + +class WidgetRedirectorTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + del cls.text, cls.tk + + def setUp(self): + self.redir = WidgetRedirector(self.text) + self.func = Func() + self.orig_insert = self.redir.register('insert', self.func) + self.text.insert('insert', 'asdf') # leaves self.text empty + + def tearDown(self): + self.text.delete('1.0', 'end') + self.redir.close() + + def test_repr(self): # partly for 100% coverage + self.assertIn('Redirector', repr(self.redir)) + self.assertIn('Original', repr(self.orig_insert)) + + def test_register(self): + self.assertEqual(self.text.get('1.0', 'end'), '\n') + self.assertEqual(self.func.args, ('insert', 'asdf')) + self.assertIn('insert', self.redir._operations) + self.assertIn('insert', self.text.__dict__) + self.assertEqual(self.text.insert, self.func) + + def test_original_command(self): + self.assertEqual(self.orig_insert.operation, 'insert') + self.assertEqual(self.orig_insert.tk_call, self.text.tk.call) + self.orig_insert('insert', 'asdf') + self.assertEqual(self.text.get('1.0', 'end'), 'asdf\n') + + def test_unregister(self): + self.assertIsNone(self.redir.unregister('invalid operation name')) + self.assertEqual(self.redir.unregister('insert'), self.func) + self.assertNotIn('insert', self.redir._operations) + self.assertNotIn('insert', self.text.__dict__) + + def test_unregister_no_attribute(self): + del self.text.insert + self.assertEqual(self.redir.unregister('insert'), self.func) + + def test_dispatch_intercept(self): + self.func.__init__(True) + self.assertTrue(self.redir.dispatch('insert', False)) + self.assertFalse(self.func.args[0]) + + def test_dispatch_bypass(self): + self.orig_insert('insert', 'asdf') + # tk.call returns '' where Python would return None + self.assertEqual(self.redir.dispatch('delete', '1.0', 'end'), '') + self.assertEqual(self.text.get('1.0', 'end'), '\n') + + def test_dispatch_error(self): + self.func.__init__(TclError()) + self.assertEqual(self.redir.dispatch('insert', False), '') + self.assertEqual(self.redir.dispatch('invalid'), '') + + def test_command_dispatch(self): + # Test that .__init__ causes redirection of tk calls + # through redir.dispatch + self.tk.call(self.text._w, 'insert', 'hello') + self.assertEqual(self.func.args, ('hello',)) + self.assertEqual(self.text.get('1.0', 'end'), '\n') + # Ensure that called through redir .dispatch and not through + # self.text.insert by having mock raise TclError. + self.func.__init__(TclError()) + self.assertEqual(self.tk.call(self.text._w, 'insert', 'boo'), '') + + + +if __name__ == '__main__': + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:27:06 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:27:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Idle_News_entr?= =?utf-8?q?ies=2E?= Message-ID: <3h8h6f1v92z7LjS@mail.python.org> http://hg.python.org/cpython/rev/6067d5f90f6e changeset: 91636:6067d5f90f6e branch: 2.7 parent: 91633:53d0776aab53 user: Terry Jan Reedy date: Fri Jul 11 00:24:22 2014 -0400 summary: Idle News entries. files: Misc/NEWS | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -121,6 +121,13 @@ IDLE ---- +- Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav + Heblikar. + +- Issue #18592: Add unittest for SearchDialogBase. Patch by Phil Webster. + +- Issue #21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar. + - Issue #21686: add unittest for HyperParser. Original patch by Saimadhav Heblikar. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:27:07 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:27:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Idle_News_entr?= =?utf-8?q?ies=2E?= Message-ID: <3h8h6g3PYLz7Ljf@mail.python.org> http://hg.python.org/cpython/rev/5620f69f32d1 changeset: 91637:5620f69f32d1 branch: 3.4 parent: 91634:edf2ae293d70 user: Terry Jan Reedy date: Fri Jul 11 00:24:27 2014 -0400 summary: Idle News entries. files: Misc/NEWS | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -166,6 +166,13 @@ IDLE ---- +- Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav + Heblikar. + +- Issue #18592: Add unittest for SearchDialogBase. Patch by Phil Webster. + +- Issue #21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar. + - Issue #21686: add unittest for HyperParser. Original patch by Saimadhav Heblikar. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:27:08 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:27:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_News_entries?= Message-ID: <3h8h6h5Gq3z7Lkv@mail.python.org> http://hg.python.org/cpython/rev/e873b7b6f5c6 changeset: 91638:e873b7b6f5c6 parent: 91635:0a4433aaa338 parent: 91637:5620f69f32d1 user: Terry Jan Reedy date: Fri Jul 11 00:26:21 2014 -0400 summary: News entries files: Misc/NEWS | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -573,6 +573,13 @@ IDLE ---- +- Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav + Heblikar. + +- Issue #18592: Add unittest for SearchDialogBase. Patch by Phil Webster. + +- Issue #21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar. + - Issue #21686: add unittest for HyperParser. Original patch by Saimadhav Heblikar. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:38:13 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:38:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Make_unittest_for_SearchDialogBase_work_on_all_tk_versions?= =?utf-8?q?=2E?= Message-ID: <3h8hMT2B2Xz7Ln3@mail.python.org> http://hg.python.org/cpython/rev/30a75f75a4d4 changeset: 91639:30a75f75a4d4 branch: 2.7 parent: 91636:6067d5f90f6e user: Terry Jan Reedy date: Fri Jul 11 00:37:10 2014 -0400 summary: Issue #18592: Make unittest for SearchDialogBase work on all tk versions. files: Lib/idlelib/idle_test/test_searchdialogbase.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -80,10 +80,10 @@ self.assertIn(entry.get(), 'hello') egi = entry.grid_info() - equal(egi['row'], '0') - equal(egi['column'], '1') - equal(egi['rowspan'], '1') - equal(egi['columnspan'], '1') + equal(int(egi['row']), 0) + equal(int(egi['column']), 1) + equal(int(egi['rowspan']), 1) + equal(int(egi['columnspan']), 1) equal(self.dialog.row, 1) def test_create_entries(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:38:14 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:38:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Make_unittest_for_SearchDialogBase_work_on_all_tk_versions?= =?utf-8?q?=2E?= Message-ID: <3h8hMV42Cxz7Ln1@mail.python.org> http://hg.python.org/cpython/rev/91546aa91cee changeset: 91640:91546aa91cee branch: 3.4 parent: 91637:5620f69f32d1 user: Terry Jan Reedy date: Fri Jul 11 00:37:14 2014 -0400 summary: Issue #18592: Make unittest for SearchDialogBase work on all tk versions. files: Lib/idlelib/idle_test/test_searchdialogbase.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -80,10 +80,10 @@ self.assertIn(entry.get(), 'hello') egi = entry.grid_info() - equal(egi['row'], 0) - equal(egi['column'], 1) - equal(egi['rowspan'], 1) - equal(egi['columnspan'], 1) + equal(int(egi['row']), 0) + equal(int(egi['column']), 1) + equal(int(egi['rowspan']), 1) + equal(int(egi['columnspan']), 1) equal(self.dialog.row, 1) def test_create_entries(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 06:38:15 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 11 Jul 2014 06:38:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h8hMW6BPRz7Lmt@mail.python.org> http://hg.python.org/cpython/rev/4696f8d9bbea changeset: 91641:4696f8d9bbea parent: 91638:e873b7b6f5c6 parent: 91640:91546aa91cee user: Terry Jan Reedy date: Fri Jul 11 00:37:31 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/idle_test/test_searchdialogbase.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -80,10 +80,10 @@ self.assertIn(entry.get(), 'hello') egi = entry.grid_info() - equal(egi['row'], 0) - equal(egi['column'], 1) - equal(egi['rowspan'], 1) - equal(egi['columnspan'], 1) + equal(int(egi['row']), 0) + equal(int(egi['column']), 1) + equal(int(egi['rowspan']), 1) + equal(int(egi['columnspan']), 1) equal(self.dialog.row, 1) def test_create_entries(self): -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Jul 11 11:01:50 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 11 Jul 2014 11:01:50 +0200 Subject: [Python-checkins] Daily reference leaks (53791c97f1ab): sum=12 Message-ID: results for 53791c97f1ab on branch "default" -------------------------------------------- test_collections leaked [2, 4, 0] references, sum=6 test_collections leaked [1, 2, 0] memory blocks, sum=3 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 0] references, sum=0 test_site leaked [2, -2, 0] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogS4z__1', '-x'] From python-checkins at python.org Fri Jul 11 12:00:18 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 12:00:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h8qW66Pcnz7NWK@mail.python.org> http://hg.python.org/cpython/rev/4b0bfda44ed8 changeset: 91642:4b0bfda44ed8 branch: 3.4 parent: 91640:91546aa91cee user: Victor Stinner date: Fri Jul 11 11:58:33 2014 +0200 summary: asyncio: sync with Tulip * Tulip issue #182: Improve logs of BaseEventLoop._run_once() - Don't log non-blocking poll - Only log polling with a timeout if it gets events or if it timed out after more than 1 second. * Fix some pyflakes warnings: remove unused imports files: Lib/asyncio/base_events.py | 21 +++++++--- Lib/asyncio/streams.py | 1 - Lib/asyncio/tasks.py | 1 - Lib/test/test_asyncio/test_base_events.py | 2 +- Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncio/test_tasks.py | 9 ++-- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -882,19 +882,26 @@ when = self._scheduled[0]._when timeout = max(0, when - self.time()) - if self._debug: + if self._debug and timeout != 0: t0 = self.time() event_list = self._selector.select(timeout) dt = self.time() - t0 - if dt >= 1: + if dt >= 1.0: level = logging.INFO else: level = logging.DEBUG - if timeout is not None: - logger.log(level, 'poll %.3f took %.3f seconds', - timeout, dt) - else: - logger.log(level, 'poll took %.3f seconds', dt) + nevent = len(event_list) + if timeout is None: + logger.log(level, 'poll took %.3f ms: %s events', + dt * 1e3, nevent) + elif nevent: + logger.log(level, + 'poll %.3f ms took %.3f ms: %s events', + timeout * 1e3, dt * 1e3, nevent) + elif dt >= 1.0: + logger.log(level, + 'poll %.3f ms took %.3f ms: timeout', + timeout * 1e3, dt * 1e3) else: event_list = self._selector.select(timeout) self._process_events(event_list) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -14,7 +14,6 @@ from . import events from . import futures from . import protocols -from . import tasks from .coroutines import coroutine diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -18,7 +18,6 @@ from . import events from . import futures from .coroutines import coroutine -from .log import logger _PY34 = (sys.version_info >= (3, 4)) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -12,7 +12,6 @@ import asyncio from asyncio import base_events -from asyncio import events from asyncio import constants from asyncio import test_utils @@ -26,6 +25,7 @@ def setUp(self): self.loop = base_events.BaseEventLoop() self.loop._selector = mock.Mock() + self.loop._selector.select.return_value = () self.set_event_loop(self.loop) def test_not_implemented(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -715,7 +715,7 @@ with self.assertRaisesRegex(ValueError, 'path and sock can not be specified ' 'at the same time'): - server = self.loop.run_until_complete(f) + self.loop.run_until_complete(f) def _create_ssl_context(self, certfile, keyfile=None): sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1,6 +1,5 @@ """Tests for tasks.py.""" -import os.path import re import sys import types @@ -1640,9 +1639,9 @@ asyncio.coroutines._DEBUG = debug tb_filename = __file__ - tb_lineno = sys._getframe().f_lineno + 1 - coro = coro_noop() - coro = None + tb_lineno = sys._getframe().f_lineno + 2 + # create a coroutine object but don't use it + coro_noop() support.gc_collect() self.assertTrue(m_log.error.called) @@ -1652,7 +1651,7 @@ r'Coroutine object created at \(most recent call last\):\n' r'.*\n' r' File "%s", line %s, in test_coroutine_never_yielded\n' - r' coro = coro_noop\(\)$' + r' coro_noop\(\)$' % (re.escape(coro_noop.__qualname__), re.escape(func_filename), func_lineno, re.escape(tb_filename), tb_lineno)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 12:00:20 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 12:00:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3h8qW81r9dz7NW2@mail.python.org> http://hg.python.org/cpython/rev/827d40ae4f5b changeset: 91643:827d40ae4f5b parent: 91641:4696f8d9bbea parent: 91642:4b0bfda44ed8 user: Victor Stinner date: Fri Jul 11 11:58:52 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip * Tulip issue #182: Improve logs of BaseEventLoop._run_once() - Don't log non-blocking poll - Only log polling with a timeout if it gets events or if it timed out after more than 1 second. * Fix some pyflakes warnings: remove unused imports files: Lib/asyncio/base_events.py | 21 +++++++--- Lib/asyncio/streams.py | 1 - Lib/asyncio/tasks.py | 1 - Lib/test/test_asyncio/test_base_events.py | 2 +- Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncio/test_tasks.py | 9 ++-- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -882,19 +882,26 @@ when = self._scheduled[0]._when timeout = max(0, when - self.time()) - if self._debug: + if self._debug and timeout != 0: t0 = self.time() event_list = self._selector.select(timeout) dt = self.time() - t0 - if dt >= 1: + if dt >= 1.0: level = logging.INFO else: level = logging.DEBUG - if timeout is not None: - logger.log(level, 'poll %.3f took %.3f seconds', - timeout, dt) - else: - logger.log(level, 'poll took %.3f seconds', dt) + nevent = len(event_list) + if timeout is None: + logger.log(level, 'poll took %.3f ms: %s events', + dt * 1e3, nevent) + elif nevent: + logger.log(level, + 'poll %.3f ms took %.3f ms: %s events', + timeout * 1e3, dt * 1e3, nevent) + elif dt >= 1.0: + logger.log(level, + 'poll %.3f ms took %.3f ms: timeout', + timeout * 1e3, dt * 1e3) else: event_list = self._selector.select(timeout) self._process_events(event_list) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -14,7 +14,6 @@ from . import events from . import futures from . import protocols -from . import tasks from .coroutines import coroutine diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -18,7 +18,6 @@ from . import events from . import futures from .coroutines import coroutine -from .log import logger _PY34 = (sys.version_info >= (3, 4)) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -12,7 +12,6 @@ import asyncio from asyncio import base_events -from asyncio import events from asyncio import constants from asyncio import test_utils @@ -26,6 +25,7 @@ def setUp(self): self.loop = base_events.BaseEventLoop() self.loop._selector = mock.Mock() + self.loop._selector.select.return_value = () self.set_event_loop(self.loop) def test_not_implemented(self): diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -715,7 +715,7 @@ with self.assertRaisesRegex(ValueError, 'path and sock can not be specified ' 'at the same time'): - server = self.loop.run_until_complete(f) + self.loop.run_until_complete(f) def _create_ssl_context(self, certfile, keyfile=None): sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -1,6 +1,5 @@ """Tests for tasks.py.""" -import os.path import re import sys import types @@ -1640,9 +1639,9 @@ asyncio.coroutines._DEBUG = debug tb_filename = __file__ - tb_lineno = sys._getframe().f_lineno + 1 - coro = coro_noop() - coro = None + tb_lineno = sys._getframe().f_lineno + 2 + # create a coroutine object but don't use it + coro_noop() support.gc_collect() self.assertTrue(m_log.error.called) @@ -1652,7 +1651,7 @@ r'Coroutine object created at \(most recent call last\):\n' r'.*\n' r' File "%s", line %s, in test_coroutine_never_yielded\n' - r' coro = coro_noop\(\)$' + r' coro_noop\(\)$' % (re.escape(coro_noop.__qualname__), re.escape(func_filename), func_lineno, re.escape(tb_filename), tb_lineno)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 12:16:16 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 12:16:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogZW5o?= =?utf-8?q?ance_documentation_of_platform_support?= Message-ID: <3h8qsX0jdnz7cMk@mail.python.org> http://hg.python.org/cpython/rev/a78aa88d88d0 changeset: 91644:a78aa88d88d0 branch: 3.4 parent: 91642:4b0bfda44ed8 user: Victor Stinner date: Fri Jul 11 12:13:39 2014 +0200 summary: asyncio: enhance documentation of platform support files: Doc/library/asyncio-eventloops.rst | 28 ++++++++++++----- Doc/library/asyncio-subprocess.rst | 7 ++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Doc/library/asyncio-eventloops.rst b/Doc/library/asyncio-eventloops.rst --- a/Doc/library/asyncio-eventloops.rst +++ b/Doc/library/asyncio-eventloops.rst @@ -24,6 +24,8 @@ Equivalent to calling ``get_event_loop_policy().new_event_loop()``. +.. _asyncio-event-loops: + Available event loops --------------------- @@ -57,6 +59,7 @@ loop = asyncio.ProactorEventLoop() asyncio.set_event_loop(loop) +.. _asyncio-platform-support: Platform support ---------------- @@ -70,21 +73,27 @@ Common limits of Windows event loops: - :meth:`~BaseEventLoop.create_unix_server` and - :meth:`~BaseEventLoop.create_unix_server` are not supported: specific to UNIX + :meth:`~BaseEventLoop.create_unix_server` are not supported: the socket + family :data:`socket.AF_UNIX` is specific to UNIX - :meth:`~BaseEventLoop.add_signal_handler` and :meth:`~BaseEventLoop.remove_signal_handler` are not supported -- Pipes are not supported: :meth:`~BaseEventLoop.connect_read_pipe` and - :meth:`~BaseEventLoop.connect_write_pipe` -- :meth:`EventLoopPolicy.set_child_watcher` is not supported +- :meth:`EventLoopPolicy.set_child_watcher` is not supported. + :class:`ProactorEventLoop` supports subprocesses. It has only one + implementation to watch child processes, there is no need to configure it. :class:`SelectorEventLoop` specific limits: - :class:`~selectors.SelectSelector` is used but it only supports sockets, see the `MSDN documentation of select - `_. -- it is not possible to execute subprocesses + `_ - :meth:`~BaseEventLoop.add_reader` and :meth:`~BaseEventLoop.add_writer` only accept file descriptors of sockets +- Pipes are not supported + (ex: :meth:`~BaseEventLoop.connect_read_pipe`, + :meth:`~BaseEventLoop.connect_write_pipe`) +- :ref:`Subprocesses ` are not supported + (ex: :meth:`~BaseEventLoop.subprocess_exec`, + :meth:`~BaseEventLoop.subprocess_shell`) :class:`ProactorEventLoop` specific limits: @@ -95,9 +104,10 @@ not supported The resolution of the monotonic clock on Windows is usually around 15.6 msec. -The best resolution is 0.5 msec. The exact resolution depends on the hardware -(availability of HPET) and the Windows configuration. See :ref:`asyncio delayed -calls `. +The best resolution is 0.5 msec. The resolution depends on the hardware +(availability of `HPET +`_) and on the Windows +configuration. See :ref:`asyncio delayed calls `. Mac OS X diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -1,5 +1,7 @@ .. currentmodule:: asyncio +.. _asyncio-subprocess: + Subprocess ========== @@ -16,6 +18,11 @@ loop = asyncio.ProactorEventLoop() asyncio.set_event_loop(loop) +.. seealso:: + + :ref:`Available event loops ` and :ref:`Platform + support `. + Create a subprocess: high-level API using Process ------------------------------------------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 12:16:17 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 12:16:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_enhance_documentation_of_pl?= =?utf-8?q?atform_support?= Message-ID: <3h8qsY34mqz7cN9@mail.python.org> http://hg.python.org/cpython/rev/3ed8a92618e2 changeset: 91645:3ed8a92618e2 parent: 91643:827d40ae4f5b parent: 91644:a78aa88d88d0 user: Victor Stinner date: Fri Jul 11 12:16:05 2014 +0200 summary: (Merge 3.4) asyncio: enhance documentation of platform support files: Doc/library/asyncio-eventloops.rst | 28 ++++++++++++----- Doc/library/asyncio-subprocess.rst | 7 ++++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/Doc/library/asyncio-eventloops.rst b/Doc/library/asyncio-eventloops.rst --- a/Doc/library/asyncio-eventloops.rst +++ b/Doc/library/asyncio-eventloops.rst @@ -24,6 +24,8 @@ Equivalent to calling ``get_event_loop_policy().new_event_loop()``. +.. _asyncio-event-loops: + Available event loops --------------------- @@ -57,6 +59,7 @@ loop = asyncio.ProactorEventLoop() asyncio.set_event_loop(loop) +.. _asyncio-platform-support: Platform support ---------------- @@ -70,21 +73,27 @@ Common limits of Windows event loops: - :meth:`~BaseEventLoop.create_unix_server` and - :meth:`~BaseEventLoop.create_unix_server` are not supported: specific to UNIX + :meth:`~BaseEventLoop.create_unix_server` are not supported: the socket + family :data:`socket.AF_UNIX` is specific to UNIX - :meth:`~BaseEventLoop.add_signal_handler` and :meth:`~BaseEventLoop.remove_signal_handler` are not supported -- Pipes are not supported: :meth:`~BaseEventLoop.connect_read_pipe` and - :meth:`~BaseEventLoop.connect_write_pipe` -- :meth:`EventLoopPolicy.set_child_watcher` is not supported +- :meth:`EventLoopPolicy.set_child_watcher` is not supported. + :class:`ProactorEventLoop` supports subprocesses. It has only one + implementation to watch child processes, there is no need to configure it. :class:`SelectorEventLoop` specific limits: - :class:`~selectors.SelectSelector` is used but it only supports sockets, see the `MSDN documentation of select - `_. -- it is not possible to execute subprocesses + `_ - :meth:`~BaseEventLoop.add_reader` and :meth:`~BaseEventLoop.add_writer` only accept file descriptors of sockets +- Pipes are not supported + (ex: :meth:`~BaseEventLoop.connect_read_pipe`, + :meth:`~BaseEventLoop.connect_write_pipe`) +- :ref:`Subprocesses ` are not supported + (ex: :meth:`~BaseEventLoop.subprocess_exec`, + :meth:`~BaseEventLoop.subprocess_shell`) :class:`ProactorEventLoop` specific limits: @@ -95,9 +104,10 @@ not supported The resolution of the monotonic clock on Windows is usually around 15.6 msec. -The best resolution is 0.5 msec. The exact resolution depends on the hardware -(availability of HPET) and the Windows configuration. See :ref:`asyncio delayed -calls `. +The best resolution is 0.5 msec. The resolution depends on the hardware +(availability of `HPET +`_) and on the Windows +configuration. See :ref:`asyncio delayed calls `. Mac OS X diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -1,5 +1,7 @@ .. currentmodule:: asyncio +.. _asyncio-subprocess: + Subprocess ========== @@ -16,6 +18,11 @@ loop = asyncio.ProactorEventLoop() asyncio.set_event_loop(loop) +.. seealso:: + + :ref:`Available event loops ` and :ref:`Platform + support `. + Create a subprocess: high-level API using Process ------------------------------------------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 17:11:07 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 17:11:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321932=3A_os=2Erea?= =?utf-8?b?ZCgpIG5vdyB1c2VzIGEgOmM6ZnVuYzpgUHlfc3NpemVfdGAgdHlwZSBpbnN0?= =?utf-8?q?ead_of?= Message-ID: <3h8yPl0Dyzz7NFs@mail.python.org> http://hg.python.org/cpython/rev/e9b401d46e20 changeset: 91646:e9b401d46e20 user: Victor Stinner date: Fri Jul 11 17:04:41 2014 +0200 summary: Issue #21932: os.read() now uses a :c:func:`Py_ssize_t` type instead of :c:type:`int` for the size to support reading more than 2 GB at once. On Windows, the size is truncted to INT_MAX. As any call to os.read(), the OS may read less bytes than the number of requested bytes. files: Lib/test/test_os.py | 19 +++++++++++++++++++ Misc/NEWS | 5 +++++ Modules/posixmodule.c | 21 ++++++++++++++------- 3 files changed, 38 insertions(+), 7 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 @@ -43,6 +43,10 @@ import _winapi except ImportError: _winapi = None +try: + from _testcapi import INT_MAX +except ImportError: + INT_MAX = 2 ** 31 - 1 from test.script_helper import assert_python_ok @@ -119,6 +123,21 @@ self.assertEqual(type(s), bytes) self.assertEqual(s, b"spam") + def test_large_read(self): + with open(support.TESTFN, "wb") as fp: + fp.write(b'test') + self.addCleanup(support.unlink, support.TESTFN) + + # Issue #21932: Make sure that os.read() does not raise an + # OverflowError for size larger than INT_MAX + size = INT_MAX + 10 + with open(support.TESTFN, "rb") as fp: + data = os.read(fp.fileno(), size) + + # The test does not try to read more than 2 GB at once because the + # operating system is free to return less bytes than requested. + self.assertEqual(data, b'test') + def test_write(self): # os.write() accepts bytes- and buffer-like objects but not strings fd = os.open(support.TESTFN, os.O_CREAT | os.O_WRONLY) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,11 @@ Library ------- +- Issue #21932: os.read() now uses a :c:func:`Py_ssize_t` type instead of + :c:type:`int` for the size to support reading more than 2 GB at once. On + Windows, the size is truncted to INT_MAX. As any call to os.read(), the OS + may read less bytes than the number of requested bytes. + - Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. - Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7989,11 +7989,18 @@ static PyObject * posix_read(PyObject *self, PyObject *args) { - int fd, size; + int fd; + Py_ssize_t size; Py_ssize_t n; PyObject *buffer; - if (!PyArg_ParseTuple(args, "ii:read", &fd, &size)) - return NULL; + if (!PyArg_ParseTuple(args, "in:read", &fd, &size)) + return NULL; + if (!_PyVerify_fd(fd)) + return posix_error(); +#ifdef MS_WINDOWS + if (size > INT_MAX) + size = INT_MAX; +#endif if (size < 0) { errno = EINVAL; return posix_error(); @@ -8001,12 +8008,12 @@ buffer = PyBytes_FromStringAndSize((char *)NULL, size); if (buffer == NULL) return NULL; - if (!_PyVerify_fd(fd)) { - Py_DECREF(buffer); - return posix_error(); - } Py_BEGIN_ALLOW_THREADS +#ifdef MS_WINDOWS + n = read(fd, PyBytes_AS_STRING(buffer), (int)size); +#else n = read(fd, PyBytes_AS_STRING(buffer), size); +#endif Py_END_ALLOW_THREADS if (n < 0) { Py_DECREF(buffer); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 17:35:34 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 17:35:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321932=3A_Ooops=2C?= =?utf-8?q?_os=2Eread=28fd=2C_size=29_allocates_a_buffer_of_size_bytes=2C_?= =?utf-8?q?even?= Message-ID: <3h8yxy4bXhz7PDt@mail.python.org> http://hg.python.org/cpython/rev/4a7fcd5273ce changeset: 91647:4a7fcd5273ce user: Victor Stinner date: Fri Jul 11 17:35:06 2014 +0200 summary: Issue #21932: Ooops, os.read(fd, size) allocates a buffer of size bytes, even if the file is much smaller. Add @bigmemtest decorator to the new test_large_read(). files: Lib/test/test_os.py | 5 +++-- 1 files changed, 3 insertions(+), 2 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 @@ -123,14 +123,15 @@ self.assertEqual(type(s), bytes) self.assertEqual(s, b"spam") - def test_large_read(self): + @support.cpython_only + @support.bigmemtest(size=INT_MAX + 10, memuse=1, dry_run=False) + def test_large_read(self, size): with open(support.TESTFN, "wb") as fp: fp.write(b'test') self.addCleanup(support.unlink, support.TESTFN) # Issue #21932: Make sure that os.read() does not raise an # OverflowError for size larger than INT_MAX - size = INT_MAX + 10 with open(support.TESTFN, "rb") as fp: data = os.read(fp.fileno(), size) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 18:50:28 2014 From: python-checkins at python.org (berker.peksag) Date: Fri, 11 Jul 2014 18:50:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2316382=3A_Improve_?= =?utf-8?q?exception_message_of_warnings=2Ewarn=28=29_for_bad_category=2E?= Message-ID: <3h90cN3JTRz7QSX@mail.python.org> http://hg.python.org/cpython/rev/c4a86fe52006 changeset: 91648:c4a86fe52006 user: Berker Peksag date: Fri Jul 11 19:50:25 2014 +0300 summary: Issue #16382: Improve exception message of warnings.warn() for bad category. Initial patch by Phil Elson. files: Lib/test/test_warnings.py | 35 +++++++++++++++++++++++++++ Lib/warnings.py | 4 ++- Misc/NEWS | 3 ++ Python/_warnings.c | 13 +++++---- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py --- a/Lib/test/test_warnings.py +++ b/Lib/test/test_warnings.py @@ -370,6 +370,41 @@ with self.assertRaises(ValueError): self.module.warn(BadStrWarning()) + def test_warning_classes(self): + class MyWarningClass(Warning): + pass + + class NonWarningSubclass: + pass + + # passing a non-subclass of Warning should raise a TypeError + with self.assertRaises(TypeError) as cm: + self.module.warn('bad warning category', '') + self.assertIn('category must be a Warning subclass, not ', + str(cm.exception)) + + with self.assertRaises(TypeError) as cm: + self.module.warn('bad warning category', NonWarningSubclass) + self.assertIn('category must be a Warning subclass, not ', + str(cm.exception)) + + # check that warning instances also raise a TypeError + with self.assertRaises(TypeError) as cm: + self.module.warn('bad warning category', MyWarningClass()) + self.assertIn('category must be a Warning subclass, not ', + str(cm.exception)) + + with self.assertWarns(MyWarningClass) as cm: + self.module.warn('good warning category', MyWarningClass) + self.assertEqual('good warning category', str(cm.warning)) + + with self.assertWarns(UserWarning) as cm: + self.module.warn('good warning category', None) + self.assertEqual('good warning category', str(cm.warning)) + + with self.assertWarns(MyWarningClass) as cm: + self.module.warn('good warning category', MyWarningClass) + self.assertIsInstance(cm.warning, Warning) class CWarnTests(WarnTests, unittest.TestCase): module = c_warnings diff --git a/Lib/warnings.py b/Lib/warnings.py --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -162,7 +162,9 @@ # Check category argument if category is None: category = UserWarning - assert issubclass(category, Warning) + if not (isinstance(category, type) and issubclass(category, Warning)): + raise TypeError("category must be a Warning subclass, " + "not '{:s}'".format(type(category).__name__)) # Get context information try: caller = sys._getframe(stacklevel) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #16382: Improve exception message of warnings.warn() for bad + category. Initial patch by Phil Elson. + - Issue #21932: os.read() now uses a :c:func:`Py_ssize_t` type instead of :c:type:`int` for the size to support reading more than 2 GB at once. On Windows, the size is truncted to INT_MAX. As any call to os.read(), the OS diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -619,16 +619,17 @@ if (rc == 1) category = (PyObject*)message->ob_type; - else if (category == NULL) + else if (category == NULL || category == Py_None) category = PyExc_UserWarning; /* Validate category. */ rc = PyObject_IsSubclass(category, PyExc_Warning); - if (rc == -1) - return NULL; - if (rc == 0) { - PyErr_SetString(PyExc_ValueError, - "category is not a subclass of Warning"); + /* category is not a subclass of PyExc_Warning or + PyObject_IsSubclass raised an error */ + if (rc == -1 || rc == 0) { + PyErr_Format(PyExc_TypeError, + "category must be a Warning subclass, not '%s'", + Py_TYPE(category)->tp_name); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 19:44:53 2014 From: python-checkins at python.org (berker.peksag) Date: Fri, 11 Jul 2014 19:44:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321906=3A_Merge_from_3=2E4=2E?= Message-ID: <3h91q913n5z7LqV@mail.python.org> http://hg.python.org/cpython/rev/e1913d2780d7 changeset: 91650:e1913d2780d7 parent: 91648:c4a86fe52006 parent: 91649:eafe4007c999 user: Berker Peksag date: Fri Jul 11 20:44:39 2014 +0300 summary: Issue #21906: Merge from 3.4. files: Lib/test/test_tools.py | 76 +++++++++++++++++++++++++--- Misc/NEWS | 3 + Tools/scripts/md5sum.py | 9 ++- 3 files changed, 76 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools.py @@ -16,7 +16,7 @@ import tempfile import textwrap from test import support -from test.script_helper import assert_python_ok, temp_dir +from test.script_helper import assert_python_ok, assert_python_failure if not sysconfig.is_python_build(): # XXX some installers do contain the tools, should we detect that @@ -61,7 +61,7 @@ def test_selftest(self): self.maxDiff = None - with temp_dir() as directory: + with support.temp_dir() as directory: data_path = os.path.join(directory, '_test.py') with open(self.script) as f: closed = f.read() @@ -367,7 +367,7 @@ # added for a script it should be added to the whitelist below. # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html'] + whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] # scripts that can't be imported without running blacklist = ['make_ctype.py'] # scripts that use windows-only modules @@ -450,16 +450,74 @@ self.assertTrue(wmock.open.called) +class MD5SumTests(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.script = os.path.join(scriptsdir, 'md5sum.py') + os.mkdir(support.TESTFN) + cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') + with open(cls.fodder, 'wb') as f: + f.write(b'md5sum\r\ntest file\r\n') + cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' + cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' + + @classmethod + def tearDownClass(cls): + support.rmtree(support.TESTFN) + + def test_noargs(self): + rc, out, err = assert_python_ok(self.script) + self.assertEqual(rc, 0) + self.assertTrue( + out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) + self.assertFalse(err) + + def test_checksum_fodder(self): + rc, out, err = assert_python_ok(self.script, self.fodder) + self.assertEqual(rc, 0) + self.assertTrue(out.startswith(self.fodder_md5)) + for part in self.fodder.split(os.path.sep): + self.assertIn(part.encode(), out) + self.assertFalse(err) + + def test_dash_l(self): + rc, out, err = assert_python_ok(self.script, '-l', self.fodder) + self.assertEqual(rc, 0) + self.assertIn(self.fodder_md5, out) + parts = self.fodder.split(os.path.sep) + self.assertIn(parts[-1].encode(), out) + self.assertNotIn(parts[-2].encode(), out) + + def test_dash_t(self): + rc, out, err = assert_python_ok(self.script, '-t', self.fodder) + self.assertEqual(rc, 0) + self.assertTrue(out.startswith(self.fodder_textmode_md5)) + self.assertNotIn(self.fodder_md5, out) + + def test_dash_s(self): + rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) + self.assertEqual(rc, 0) + self.assertIn(self.fodder_md5, out) + + def test_multiple_files(self): + rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) + self.assertEqual(rc, 0) + lines = out.splitlines() + self.assertEqual(len(lines), 2) + self.assertEqual(*lines) + + def test_usage(self): + rc, out, err = assert_python_failure(self.script, '-h') + self.assertEqual(rc, 2) + self.assertEqual(out, b'') + self.assertGreater(err, b'') + + # Run the tests in Tools/parser/test_unparse.py with support.DirsOnSysPath(os.path.join(basepath, 'parser')): from test_unparse import UnparseTestCase from test_unparse import DirectoryTestCase - -def test_main(): - support.run_unittest(*[obj for obj in globals().values() - if isinstance(obj, type)]) - - if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -752,6 +752,9 @@ Tools/Demos ----------- +- Issue #21906: Make Tools/scripts/md5sum.py work in Python 3. + Patch by Zachary Ware. + - Issue #21629: Fix Argument Clinic's "--converters" feature. - Add support for ``yield from`` to 2to3. diff --git a/Tools/scripts/md5sum.py b/Tools/scripts/md5sum.py --- a/Tools/scripts/md5sum.py +++ b/Tools/scripts/md5sum.py @@ -9,7 +9,7 @@ rmode = 'rb' usage = """ -usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...] +usage: md5sum.py [-b] [-t] [-l] [-s bufsize] [file ...] -b : read files in binary mode (default) -t : read files in text mode (you almost certainly don't want this!) -l : print last pathname component only @@ -17,6 +17,7 @@ file ... : files to sum; '-' or no files means stdin """ % bufsize +import io import sys import os import getopt @@ -24,7 +25,7 @@ def sum(*files): sts = 0 - if files and isinstance(files[-1], file): + if files and isinstance(files[-1], io.IOBase): out, files = files[-1], files[:-1] else: out = sys.stdout @@ -53,12 +54,14 @@ return sts def printsumfp(fp, filename, out=sys.stdout): - m = md5.new() + m = md5() try: while 1: data = fp.read(bufsize) if not data: break + if isinstance(data, str): + data = data.encode(fp.encoding) m.update(data) except IOError as msg: sys.stderr.write('%s: I/O error: %s\n' % (filename, msg)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 19:44:51 2014 From: python-checkins at python.org (berker.peksag) Date: Fri, 11 Jul 2014 19:44:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTA2?= =?utf-8?q?=3A_Make_Tools/scripts/md5sum=2Epy_work_in_Python_3=2E?= Message-ID: <3h91q7371Cz7LqJ@mail.python.org> http://hg.python.org/cpython/rev/eafe4007c999 changeset: 91649:eafe4007c999 branch: 3.4 parent: 91644:a78aa88d88d0 user: Berker Peksag date: Fri Jul 11 20:42:18 2014 +0300 summary: Issue #21906: Make Tools/scripts/md5sum.py work in Python 3. Patch by Zachary Ware. files: Lib/test/test_tools.py | 76 +++++++++++++++++++++++++--- Misc/NEWS | 5 +- Tools/scripts/md5sum.py | 9 ++- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools.py @@ -16,7 +16,7 @@ import tempfile import textwrap from test import support -from test.script_helper import assert_python_ok, temp_dir +from test.script_helper import assert_python_ok, assert_python_failure if not sysconfig.is_python_build(): # XXX some installers do contain the tools, should we detect that @@ -61,7 +61,7 @@ def test_selftest(self): self.maxDiff = None - with temp_dir() as directory: + with support.temp_dir() as directory: data_path = os.path.join(directory, '_test.py') with open(self.script) as f: closed = f.read() @@ -367,7 +367,7 @@ # added for a script it should be added to the whitelist below. # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html'] + whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] # scripts that can't be imported without running blacklist = ['make_ctype.py'] # scripts that use windows-only modules @@ -450,16 +450,74 @@ self.assertTrue(wmock.open.called) +class MD5SumTests(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.script = os.path.join(scriptsdir, 'md5sum.py') + os.mkdir(support.TESTFN) + cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') + with open(cls.fodder, 'wb') as f: + f.write(b'md5sum\r\ntest file\r\n') + cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' + cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' + + @classmethod + def tearDownClass(cls): + support.rmtree(support.TESTFN) + + def test_noargs(self): + rc, out, err = assert_python_ok(self.script) + self.assertEqual(rc, 0) + self.assertTrue( + out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) + self.assertFalse(err) + + def test_checksum_fodder(self): + rc, out, err = assert_python_ok(self.script, self.fodder) + self.assertEqual(rc, 0) + self.assertTrue(out.startswith(self.fodder_md5)) + for part in self.fodder.split(os.path.sep): + self.assertIn(part.encode(), out) + self.assertFalse(err) + + def test_dash_l(self): + rc, out, err = assert_python_ok(self.script, '-l', self.fodder) + self.assertEqual(rc, 0) + self.assertIn(self.fodder_md5, out) + parts = self.fodder.split(os.path.sep) + self.assertIn(parts[-1].encode(), out) + self.assertNotIn(parts[-2].encode(), out) + + def test_dash_t(self): + rc, out, err = assert_python_ok(self.script, '-t', self.fodder) + self.assertEqual(rc, 0) + self.assertTrue(out.startswith(self.fodder_textmode_md5)) + self.assertNotIn(self.fodder_md5, out) + + def test_dash_s(self): + rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) + self.assertEqual(rc, 0) + self.assertIn(self.fodder_md5, out) + + def test_multiple_files(self): + rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) + self.assertEqual(rc, 0) + lines = out.splitlines() + self.assertEqual(len(lines), 2) + self.assertEqual(*lines) + + def test_usage(self): + rc, out, err = assert_python_failure(self.script, '-h') + self.assertEqual(rc, 2) + self.assertEqual(out, b'') + self.assertGreater(err, b'') + + # Run the tests in Tools/parser/test_unparse.py with support.DirsOnSysPath(os.path.join(basepath, 'parser')): from test_unparse import UnparseTestCase from test_unparse import DirectoryTestCase - -def test_main(): - support.run_unittest(*[obj for obj in globals().values() - if isinstance(obj, type)]) - - if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1,4 +1,4 @@ -+++++++++++ +?+++++++++++ Python News +++++++++++ @@ -227,6 +227,9 @@ Tools/Demos ----------- +- Issue #21906: Make Tools/scripts/md5sum.py work in Python 3. + Patch by Zachary Ware. + - Issue #21629: Fix Argument Clinic's "--converters" feature. diff --git a/Tools/scripts/md5sum.py b/Tools/scripts/md5sum.py --- a/Tools/scripts/md5sum.py +++ b/Tools/scripts/md5sum.py @@ -9,7 +9,7 @@ rmode = 'rb' usage = """ -usage: sum5 [-b] [-t] [-l] [-s bufsize] [file ...] +usage: md5sum.py [-b] [-t] [-l] [-s bufsize] [file ...] -b : read files in binary mode (default) -t : read files in text mode (you almost certainly don't want this!) -l : print last pathname component only @@ -17,6 +17,7 @@ file ... : files to sum; '-' or no files means stdin """ % bufsize +import io import sys import os import getopt @@ -24,7 +25,7 @@ def sum(*files): sts = 0 - if files and isinstance(files[-1], file): + if files and isinstance(files[-1], io.IOBase): out, files = files[-1], files[:-1] else: out = sys.stdout @@ -53,12 +54,14 @@ return sts def printsumfp(fp, filename, out=sys.stdout): - m = md5.new() + m = md5() try: while 1: data = fp.read(bufsize) if not data: break + if isinstance(data, str): + data = data.encode(fp.encoding) m.update(data) except IOError as msg: sys.stderr.write('%s: I/O error: %s\n' % (filename, msg)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 23:50:01 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 23:50:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbywgVHVs?= =?utf-8?q?ip_issue_180=3A_Make_Server_attributes_and_methods_private?= Message-ID: <3h97G11gWTz7Llh@mail.python.org> http://hg.python.org/cpython/rev/e6198242a537 changeset: 91651:e6198242a537 branch: 3.4 parent: 91649:eafe4007c999 user: Victor Stinner date: Fri Jul 11 22:52:21 2014 +0200 summary: asyncio, Tulip issue 180: Make Server attributes and methods private - loop, waiters and active_count attributes are now private - attach(), detach() and wakeup() methods are now private The sockets attribute remains public. files: Lib/asyncio/base_events.py | 41 +++++++++++---------- Lib/asyncio/proactor_events.py | 4 +- Lib/asyncio/selector_events.py | 4 +- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -89,43 +89,44 @@ class Server(events.AbstractServer): def __init__(self, loop, sockets): - self.loop = loop + self._loop = loop self.sockets = sockets - self.active_count = 0 - self.waiters = [] + self._active_count = 0 + self._waiters = [] - def attach(self, transport): + def _attach(self): assert self.sockets is not None - self.active_count += 1 + self._active_count += 1 - def detach(self, transport): - assert self.active_count > 0 - self.active_count -= 1 - if self.active_count == 0 and self.sockets is None: + def _detach(self): + assert self._active_count > 0 + self._active_count -= 1 + if self._active_count == 0 and self.sockets is None: self._wakeup() def close(self): sockets = self.sockets - if sockets is not None: - self.sockets = None - for sock in sockets: - self.loop._stop_serving(sock) - if self.active_count == 0: - self._wakeup() + if sockets is None: + return + self.sockets = None + for sock in sockets: + self._loop._stop_serving(sock) + if self._active_count == 0: + self._wakeup() def _wakeup(self): - waiters = self.waiters - self.waiters = None + waiters = self._waiters + self._waiters = None for waiter in waiters: if not waiter.done(): waiter.set_result(waiter) @coroutine def wait_closed(self): - if self.sockets is None or self.waiters is None: + if self.sockets is None or self._waiters is None: return - waiter = futures.Future(loop=self.loop) - self.waiters.append(waiter) + waiter = futures.Future(loop=self._loop) + self._waiters.append(waiter) yield from waiter diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -35,7 +35,7 @@ self._closing = False # Set when close() called. self._eof_written = False if self._server is not None: - self._server.attach(self) + self._server._attach() self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: # wait until protocol.connection_made() has been called @@ -91,7 +91,7 @@ self._sock.close() server = self._server if server is not None: - server.detach(self) + server._detach() self._server = None def get_write_buffer_size(self): diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -417,7 +417,7 @@ self._conn_lost = 0 # Set when call to connection_lost scheduled. self._closing = False # Set when close() called. if self._server is not None: - self._server.attach(self) + self._server._attach() def abort(self): self._force_close(None) @@ -464,7 +464,7 @@ self._loop = None server = self._server if server is not None: - server.detach(self) + server._detach() self._server = None def get_write_buffer_size(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 23:50:02 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 23:50:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogaW1w?= =?utf-8?q?rove_the_documentation_of_servers?= Message-ID: <3h97G249fDz7Llh@mail.python.org> http://hg.python.org/cpython/rev/cc12733f2dd8 changeset: 91652:cc12733f2dd8 branch: 3.4 user: Victor Stinner date: Fri Jul 11 23:47:40 2014 +0200 summary: asyncio: improve the documentation of servers - Fix the documentation of Server.close(): it closes sockets - Replace AbstractServer with Server - Document Server.sockets attribute files: Doc/library/asyncio-eventloop.rst | 27 ++++++++++++++---- Doc/library/asyncio-stream.rst | 21 ++++++-------- Lib/asyncio/base_events.py | 4 ++- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -263,8 +263,9 @@ .. method:: BaseEventLoop.create_server(protocol_factory, host=None, port=None, \*, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None) - Create a TCP server bound to host and port. Return an - :class:`AbstractServer` object which can be used to stop the service. + Create a TCP server bound to host and port. Return a :class:`Server` object, + its :attr:`~Server.sockets` attribute contains created sockets. Use the + :meth:`Server.close` method to stop the server: close listening sockets. This method is a :ref:`coroutine `. @@ -557,17 +558,31 @@ Server ------ -.. class:: AbstractServer +.. class:: Server - Abstract server returned by :func:`BaseEventLoop.create_server`. + Server listening on sockets. + + Object created by the :meth:`BaseEventLoop.create_server` method and the + :func:`start_server` function. Don't instanciate the class directly. .. method:: close() - Stop serving. This leaves existing connections open. + Stop serving: close all sockets and set the :attr:`sockets` attribute to + ``None``. + + The server is closed asynchonously, use the :meth:`wait_closed` coroutine + to wait until the server is closed. .. method:: wait_closed() - A :ref:`coroutine ` to wait until service is closed. + Wait until the :meth:`close` method completes. + + This method is a :ref:`coroutine `. + + .. attribute:: sockets + + List of :class:`socket.socket` objects the server is listening to, or + ``None`` if the server is closed. Handle diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -34,29 +34,26 @@ .. function:: start_server(client_connected_cb, host=None, port=None, \*, loop=None, limit=None, **kwds) - Start a socket server, with a callback for each client connected. + Start a socket server, with a callback for each client connected. The return + value is the same as :meth:`~BaseEventLoop.create_server()`. - The first parameter, *client_connected_cb*, takes two parameters: + The *client_connected_cb* parameter is called with two parameters: *client_reader*, *client_writer*. *client_reader* is a :class:`StreamReader` object, while *client_writer* is a - :class:`StreamWriter` object. This parameter can either be a plain callback - function or a :ref:`coroutine function `; if it is a coroutine - function, it will be automatically wrapped in a future using the - :meth:`BaseEventLoop.create_task` method. + :class:`StreamWriter` object. The *client_connected_cb* parameter can + either be a plain callback function or a :ref:`coroutine function + `; if it is a coroutine function, it will be automatically + wrapped in a future using the :meth:`BaseEventLoop.create_task` method. The rest of the arguments are all the usual arguments to :meth:`~BaseEventLoop.create_server()` except *protocol_factory*; most - common are positional host and port, with various optional keyword arguments - following. The return value is the same as - :meth:`~BaseEventLoop.create_server()`. + common are positional *host* and *port*, with various optional keyword + arguments following. Additional optional keyword arguments are *loop* (to set the event loop instance to use) and *limit* (to set the buffer limit passed to the :class:`StreamReader`). - The return value is the same as :meth:`~BaseEventLoop.create_server()`, i.e. - a :class:`AbstractServer` object which can be used to stop the service. - This function is a :ref:`coroutine `. .. function:: open_unix_connection(path=None, \*, loop=None, limit=None, **kwds) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -110,6 +110,8 @@ return self.sockets = None for sock in sockets: + # closing sockets will call asynchronously the _detach() method + # which calls _wakeup() for the last socket self._loop._stop_serving(sock) if self._active_count == 0: self._wakeup() @@ -626,7 +628,7 @@ reuse_address=None): """Create a TCP server bound to host and port. - Return an AbstractServer object which can be used to stop the service. + Return an Server object which can be used to stop the service. This method is a coroutine. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 11 23:50:03 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 11 Jul 2014 23:50:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy40?= Message-ID: <3h97G36sD9z7M8f@mail.python.org> http://hg.python.org/cpython/rev/5a299c3ec120 changeset: 91653:5a299c3ec120 parent: 91650:e1913d2780d7 parent: 91652:cc12733f2dd8 user: Victor Stinner date: Fri Jul 11 23:48:10 2014 +0200 summary: Merge 3.4 files: Doc/library/asyncio-eventloop.rst | 27 ++++++++-- Doc/library/asyncio-stream.rst | 21 +++----- Lib/asyncio/base_events.py | 45 ++++++++++-------- Lib/asyncio/proactor_events.py | 4 +- Lib/asyncio/selector_events.py | 4 +- 5 files changed, 58 insertions(+), 43 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -263,8 +263,9 @@ .. method:: BaseEventLoop.create_server(protocol_factory, host=None, port=None, \*, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None) - Create a TCP server bound to host and port. Return an - :class:`AbstractServer` object which can be used to stop the service. + Create a TCP server bound to host and port. Return a :class:`Server` object, + its :attr:`~Server.sockets` attribute contains created sockets. Use the + :meth:`Server.close` method to stop the server: close listening sockets. This method is a :ref:`coroutine `. @@ -557,17 +558,31 @@ Server ------ -.. class:: AbstractServer +.. class:: Server - Abstract server returned by :func:`BaseEventLoop.create_server`. + Server listening on sockets. + + Object created by the :meth:`BaseEventLoop.create_server` method and the + :func:`start_server` function. Don't instanciate the class directly. .. method:: close() - Stop serving. This leaves existing connections open. + Stop serving: close all sockets and set the :attr:`sockets` attribute to + ``None``. + + The server is closed asynchonously, use the :meth:`wait_closed` coroutine + to wait until the server is closed. .. method:: wait_closed() - A :ref:`coroutine ` to wait until service is closed. + Wait until the :meth:`close` method completes. + + This method is a :ref:`coroutine `. + + .. attribute:: sockets + + List of :class:`socket.socket` objects the server is listening to, or + ``None`` if the server is closed. Handle diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -34,29 +34,26 @@ .. function:: start_server(client_connected_cb, host=None, port=None, \*, loop=None, limit=None, **kwds) - Start a socket server, with a callback for each client connected. + Start a socket server, with a callback for each client connected. The return + value is the same as :meth:`~BaseEventLoop.create_server()`. - The first parameter, *client_connected_cb*, takes two parameters: + The *client_connected_cb* parameter is called with two parameters: *client_reader*, *client_writer*. *client_reader* is a :class:`StreamReader` object, while *client_writer* is a - :class:`StreamWriter` object. This parameter can either be a plain callback - function or a :ref:`coroutine function `; if it is a coroutine - function, it will be automatically wrapped in a future using the - :meth:`BaseEventLoop.create_task` method. + :class:`StreamWriter` object. The *client_connected_cb* parameter can + either be a plain callback function or a :ref:`coroutine function + `; if it is a coroutine function, it will be automatically + wrapped in a future using the :meth:`BaseEventLoop.create_task` method. The rest of the arguments are all the usual arguments to :meth:`~BaseEventLoop.create_server()` except *protocol_factory*; most - common are positional host and port, with various optional keyword arguments - following. The return value is the same as - :meth:`~BaseEventLoop.create_server()`. + common are positional *host* and *port*, with various optional keyword + arguments following. Additional optional keyword arguments are *loop* (to set the event loop instance to use) and *limit* (to set the buffer limit passed to the :class:`StreamReader`). - The return value is the same as :meth:`~BaseEventLoop.create_server()`, i.e. - a :class:`AbstractServer` object which can be used to stop the service. - This function is a :ref:`coroutine `. .. function:: open_unix_connection(path=None, \*, loop=None, limit=None, **kwds) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -89,43 +89,46 @@ class Server(events.AbstractServer): def __init__(self, loop, sockets): - self.loop = loop + self._loop = loop self.sockets = sockets - self.active_count = 0 - self.waiters = [] + self._active_count = 0 + self._waiters = [] - def attach(self, transport): + def _attach(self): assert self.sockets is not None - self.active_count += 1 + self._active_count += 1 - def detach(self, transport): - assert self.active_count > 0 - self.active_count -= 1 - if self.active_count == 0 and self.sockets is None: + def _detach(self): + assert self._active_count > 0 + self._active_count -= 1 + if self._active_count == 0 and self.sockets is None: self._wakeup() def close(self): sockets = self.sockets - if sockets is not None: - self.sockets = None - for sock in sockets: - self.loop._stop_serving(sock) - if self.active_count == 0: - self._wakeup() + if sockets is None: + return + self.sockets = None + for sock in sockets: + # closing sockets will call asynchronously the _detach() method + # which calls _wakeup() for the last socket + self._loop._stop_serving(sock) + if self._active_count == 0: + self._wakeup() def _wakeup(self): - waiters = self.waiters - self.waiters = None + waiters = self._waiters + self._waiters = None for waiter in waiters: if not waiter.done(): waiter.set_result(waiter) @coroutine def wait_closed(self): - if self.sockets is None or self.waiters is None: + if self.sockets is None or self._waiters is None: return - waiter = futures.Future(loop=self.loop) - self.waiters.append(waiter) + waiter = futures.Future(loop=self._loop) + self._waiters.append(waiter) yield from waiter @@ -625,7 +628,7 @@ reuse_address=None): """Create a TCP server bound to host and port. - Return an AbstractServer object which can be used to stop the service. + Return an Server object which can be used to stop the service. This method is a coroutine. """ diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -35,7 +35,7 @@ self._closing = False # Set when close() called. self._eof_written = False if self._server is not None: - self._server.attach(self) + self._server._attach() self._loop.call_soon(self._protocol.connection_made, self) if waiter is not None: # wait until protocol.connection_made() has been called @@ -91,7 +91,7 @@ self._sock.close() server = self._server if server is not None: - server.detach(self) + server._detach() self._server = None def get_write_buffer_size(self): diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -417,7 +417,7 @@ self._conn_lost = 0 # Set when call to connection_lost scheduled. self._closing = False # Set when close() called. if self._server is not None: - self._server.attach(self) + self._server._attach() def abort(self): self._force_close(None) @@ -464,7 +464,7 @@ self._loop = None server = self._server if server is not None: - server.detach(self) + server._detach() self._server = None def get_write_buffer_size(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 00:37:01 2014 From: python-checkins at python.org (steve.dower) Date: Sat, 12 Jul 2014 00:37:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogIzIxOTU5OiBBZGRz?= =?utf-8?q?_2=2E7=2E8_product_code_to_Tools/msi/uuids=2Epy?= Message-ID: <3h98JF5sK6z7LjR@mail.python.org> http://hg.python.org/cpython/rev/cc8849331528 changeset: 91654:cc8849331528 branch: 2.7 parent: 91639:30a75f75a4d4 user: Steve Dower date: Fri Jul 11 17:32:02 2014 -0500 summary: #21959: Adds 2.7.8 product code to Tools/msi/uuids.py files: Tools/msi/uuids.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Tools/msi/uuids.py b/Tools/msi/uuids.py --- a/Tools/msi/uuids.py +++ b/Tools/msi/uuids.py @@ -65,4 +65,5 @@ '2.7.6150':'{C3CC4DF5-39A5-4027-B136-2B3E1F5AB6E2}', # 2.7.6 '2.7.7121':'{5E0D187D-238B-4e96-9C75-C4CF141F5385}', # 2.7.7rc1 '2.7.7150':'{049CA433-77A0-4e48-AC76-180A282C4E10}', # 2.7.7 + '2.7.8150':'{61121B12-88BD-4261-A6EE-AB32610A56DD}', # 2.7.8 } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 03:14:57 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Jul 2014 03:14:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3h9CpT3M0cz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/1852d0e5e4ef changeset: 91655:1852d0e5e4ef branch: 3.4 parent: 91652:cc12733f2dd8 user: Victor Stinner date: Sat Jul 12 03:11:53 2014 +0200 summary: asyncio: sync with Tulip * Tulip issue #183: log socket events in debug mode - Log most important socket events: socket connected, new client, connection reset or closed by peer (EOF), etc. - Log time elapsed in DNS resolution (getaddrinfo) - Log pause/resume reading - Log time of SSL handshake - Log SSL handshake errors - Add a __repr__() method to many classes * Fix ProactorEventLoop() in debug mode. ProactorEventLoop._make_self_pipe() doesn't call call_soon() directly because it checks for the current loop which fails, because the method is called to build the event loop. * Cleanup _ProactorReadPipeTransport constructor. Not need to set again _read_fut attribute to None, it is already done in the base class. files: Lib/asyncio/base_events.py | 56 +++++- Lib/asyncio/proactor_events.py | 36 +++- Lib/asyncio/selector_events.py | 91 ++++++++- Lib/asyncio/unix_events.py | 36 +++ Lib/asyncio/windows_events.py | 12 + Lib/test/test_asyncio/test_proactor_events.py | 7 +- Lib/test/test_asyncio/test_selector_events.py | 12 +- 7 files changed, 220 insertions(+), 30 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -94,6 +94,9 @@ self._active_count = 0 self._waiters = [] + def __repr__(self): + return '<%s sockets=%r>' % (self.__class__.__name__, self.sockets) + def _attach(self): assert self.sockets is not None self._active_count += 1 @@ -110,8 +113,6 @@ return self.sockets = None for sock in sockets: - # closing sockets will call asynchronously the _detach() method - # which calls _wakeup() for the last socket self._loop._stop_serving(sock) if self._active_count == 0: self._wakeup() @@ -276,6 +277,8 @@ raise RuntimeError("cannot close a running event loop") if self._closed: return + if self._debug: + logger.debug("Close %r", self) self._closed = True self._ready.clear() self._scheduled.clear() @@ -402,10 +405,39 @@ def set_default_executor(self, executor): self._default_executor = executor + def _getaddrinfo_debug(self, host, port, family, type, proto, flags): + msg = ["%s:%r" % (host, port)] + if family: + msg.append('family=%r' % family) + if type: + msg.append('type=%r' % type) + if proto: + msg.append('proto=%r' % proto) + if flags: + msg.append('flags=%r' % flags) + msg = ', '.join(msg) + logger.debug('Get addresss info %s', msg) + + t0 = self.time() + addrinfo = socket.getaddrinfo(host, port, family, type, proto, flags) + dt = self.time() - t0 + + msg = ('Getting addresss info %s took %.3f ms: %r' + % (msg, dt * 1e3, addrinfo)) + if dt >= self.slow_callback_duration: + logger.info(msg) + else: + logger.debug(msg) + return addrinfo + def getaddrinfo(self, host, port, *, family=0, type=0, proto=0, flags=0): - return self.run_in_executor(None, socket.getaddrinfo, - host, port, family, type, proto, flags) + if self._debug: + return self.run_in_executor(None, self._getaddrinfo_debug, + host, port, family, type, proto, flags) + else: + return self.run_in_executor(None, socket.getaddrinfo, + host, port, family, type, proto, flags) def getnameinfo(self, sockaddr, flags=0): return self.run_in_executor(None, socket.getnameinfo, sockaddr, flags) @@ -492,6 +524,8 @@ sock.close() sock = None continue + if self._debug: + logger.debug("connect %r to %r", sock, address) yield from self.sock_connect(sock, address) except OSError as exc: if sock is not None: @@ -524,6 +558,9 @@ transport, protocol = yield from self._create_connection_transport( sock, protocol_factory, ssl, server_hostname) + if self._debug: + logger.debug("connected to %s:%r: (%r, %r)", + host, port, transport, protocol) return transport, protocol @coroutine @@ -614,6 +651,15 @@ waiter = futures.Future(loop=self) transport = self._make_datagram_transport(sock, protocol, r_addr, waiter) + if self._debug: + if local_addr: + logger.info("Datagram endpoint local_addr=%r remote_addr=%r " + "created: (%r, %r)", + local_addr, remote_addr, transport, protocol) + else: + logger.debug("Datagram endpoint remote_addr=%r created: " + "(%r, %r)", + remote_addr, transport, protocol) yield from waiter return transport, protocol @@ -694,6 +740,8 @@ sock.listen(backlog) sock.setblocking(False) self._start_serving(protocol_factory, sock, ssl, server) + if self._debug: + logger.info("%r is serving", server) return server @coroutine diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -41,6 +41,23 @@ # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._sock.fileno()] + if self._read_fut is not None: + ov = "pending" if self._read_fut.ov.pending else "completed" + info.append('read=%s' % ov) + if self._write_fut is not None: + if self._write_fut.ov.pending: + info.append("write=pending=%s" % self._pending_write) + else: + info.append("write=completed") + if self._buffer: + bufsize = len(self._buffer) + info.append('write_bufsize=%s' % bufsize) + if self._eof_written: + info.append('EOF written') + return '<%s>' % ' '.join(info) + def _set_extra(self, sock): self._extra['pipe'] = sock @@ -55,7 +72,10 @@ self._read_fut.cancel() def _fatal_error(self, exc, message='Fatal error on pipe transport'): - if not isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: self._loop.call_exception_handler({ 'message': message, 'exception': exc, @@ -108,7 +128,6 @@ def __init__(self, loop, sock, protocol, waiter=None, extra=None, server=None): super().__init__(loop, sock, protocol, waiter, extra, server) - self._read_fut = None self._paused = False self._loop.call_soon(self._loop_reading) @@ -118,6 +137,8 @@ if self._paused: raise RuntimeError('Already paused') self._paused = True + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) def resume_reading(self): if not self._paused: @@ -126,6 +147,8 @@ if self._closing: return self._loop.call_soon(self._loop_reading, self._read_fut) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) def _loop_reading(self, fut=None): if self._paused: @@ -166,6 +189,8 @@ if data: self._protocol.data_received(data) elif data is not None: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) keep_open = self._protocol.eof_received() if not keep_open: self.close() @@ -401,7 +426,9 @@ self._ssock.setblocking(False) self._csock.setblocking(False) self._internal_fds += 1 - self.call_soon(self._loop_self_reading) + # don't check the current loop because _make_self_pipe() is called + # from the event loop constructor + self._call_soon(self._loop_self_reading, (), check_loop=False) def _loop_self_reading(self, f=None): try: @@ -426,6 +453,9 @@ try: if f is not None: conn, addr = f.result() + if self._debug: + logger.debug("%r got a new connection from %r: %r", + server, addr, conn) protocol = protocol_factory() self._make_socket_transport( conn, protocol, diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -23,6 +23,17 @@ from .log import logger +def _test_selector_event(selector, fd, event): + # Test if the selector is monitoring 'event' events + # for the file descriptor 'fd'. + try: + key = selector.get_key(fd) + except KeyError: + return False + else: + return bool(key.events & event) + + class BaseSelectorEventLoop(base_events.BaseEventLoop): """Selector event loop. @@ -116,6 +127,9 @@ sslcontext=None, server=None): try: conn, addr = sock.accept() + if self._debug: + logger.debug("%r got a new connection from %r: %r", + server, addr, conn) conn.setblocking(False) except (BlockingIOError, InterruptedError, ConnectionAbortedError): pass # False alarm. @@ -419,6 +433,26 @@ if self._server is not None: self._server._attach() + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._sock_fd] + polling = _test_selector_event(self._loop._selector, + self._sock_fd, selectors.EVENT_READ) + if polling: + info.append('read=polling') + else: + info.append('read=idle') + + polling = _test_selector_event(self._loop._selector, + self._sock_fd, selectors.EVENT_WRITE) + if polling: + state = 'polling' + else: + state = 'idle' + + bufsize = self.get_write_buffer_size() + info.append('write=<%s, bufsize=%s>' % (state, bufsize)) + return '<%s>' % ' '.join(info) + def abort(self): self._force_close(None) @@ -433,7 +467,10 @@ def _fatal_error(self, exc, message='Fatal error on transport'): # Should be called from exception handler only. - if not isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: self._loop.call_exception_handler({ 'message': message, 'exception': exc, @@ -492,6 +529,8 @@ raise RuntimeError('Already paused') self._paused = True self._loop.remove_reader(self._sock_fd) + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) def resume_reading(self): if not self._paused: @@ -500,6 +539,8 @@ if self._closing: return self._loop.add_reader(self._sock_fd, self._read_ready) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) def _read_ready(self): try: @@ -512,6 +553,8 @@ if data: self._protocol.data_received(data) else: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) keep_open = self._protocol.eof_received() if keep_open: # We're keeping the connection open so the @@ -638,31 +681,37 @@ # SSL-specific extra info. (peercert is set later) self._extra.update(sslcontext=sslcontext) - self._on_handshake() + if self._loop.get_debug(): + logger.debug("%r starts SSL handshake", self) + start_time = self._loop.time() + else: + start_time = None + self._on_handshake(start_time) - def _on_handshake(self): + def _on_handshake(self, start_time): try: self._sock.do_handshake() except ssl.SSLWantReadError: - self._loop.add_reader(self._sock_fd, self._on_handshake) + self._loop.add_reader(self._sock_fd, + self._on_handshake, start_time) return except ssl.SSLWantWriteError: - self._loop.add_writer(self._sock_fd, self._on_handshake) + self._loop.add_writer(self._sock_fd, + self._on_handshake, start_time) return - except Exception as exc: + except BaseException as exc: + if self._loop.get_debug(): + logger.warning("%r: SSL handshake failed", + self, exc_info=True) self._loop.remove_reader(self._sock_fd) self._loop.remove_writer(self._sock_fd) self._sock.close() if self._waiter is not None: self._waiter.set_exception(exc) - return - except BaseException as exc: - self._loop.remove_reader(self._sock_fd) - self._loop.remove_writer(self._sock_fd) - self._sock.close() - if self._waiter is not None: - self._waiter.set_exception(exc) - raise + if isinstance(exc, Exception): + return + else: + raise self._loop.remove_reader(self._sock_fd) self._loop.remove_writer(self._sock_fd) @@ -676,6 +725,10 @@ try: ssl.match_hostname(peercert, self._server_hostname) except Exception as exc: + if self._loop.get_debug(): + logger.warning("%r: SSL handshake failed " + "on matching the hostname", + self, exc_info=True) self._sock.close() if self._waiter is not None: self._waiter.set_exception(exc) @@ -696,6 +749,10 @@ self._loop.call_soon(self._waiter._set_result_unless_cancelled, None) + if self._loop.get_debug(): + dt = self._loop.time() - start_time + logger.debug("%r: SSL handshake took %.1f ms", self, dt * 1e3) + def pause_reading(self): # XXX This is a bit icky, given the comment at the top of # _read_ready(). Is it possible to evoke a deadlock? I don't @@ -709,6 +766,8 @@ raise RuntimeError('Already paused') self._paused = True self._loop.remove_reader(self._sock_fd) + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) def resume_reading(self): if not self._paused: @@ -717,6 +776,8 @@ if self._closing: return self._loop.add_reader(self._sock_fd, self._read_ready) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) def _read_ready(self): if self._write_wants_read: @@ -741,6 +802,8 @@ self._protocol.data_received(data) else: try: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) keep_open = self._protocol.eof_received() if keep_open: logger.warning('returning true from eof_received() ' diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -16,6 +16,7 @@ from . import constants from . import events from . import selector_events +from . import selectors from . import transports from .coroutines import coroutine from .log import logger @@ -272,6 +273,20 @@ # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._fileno] + if self._pipe is not None: + polling = selector_events._test_selector_event( + self._loop._selector, + self._fileno, selectors.EVENT_READ) + if polling: + info.append('polling') + else: + info.append('idle') + else: + info.append('closed') + return '<%s>' % ' '.join(info) + def _read_ready(self): try: data = os.read(self._fileno, self.max_size) @@ -283,6 +298,8 @@ if data: self._protocol.data_received(data) else: + if self._loop.get_debug(): + logger.info("%r was closed by peer", self) self._closing = True self._loop.remove_reader(self._fileno) self._loop.call_soon(self._protocol.eof_received) @@ -357,11 +374,30 @@ # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._fileno] + if self._pipe is not None: + polling = selector_events._test_selector_event( + self._loop._selector, + self._fileno, selectors.EVENT_WRITE) + if polling: + info.append('polling') + else: + info.append('idle') + + bufsize = self.get_write_buffer_size() + info.append('bufsize=%s' % bufsize) + else: + info.append('closed') + return '<%s>' % ' '.join(info) + def get_write_buffer_size(self): return sum(len(data) for data in self._buffer) def _read_ready(self): # Pipe was closed by peer. + if self._loop.get_debug(): + logger.info("%r was closed by peer", self) if self._buffer: self._close(BrokenPipeError()) else: diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -40,6 +40,18 @@ super().__init__(loop=loop) self.ov = ov + def __repr__(self): + info = [self._state.lower()] + if self.ov.pending: + info.append('overlapped=pending') + else: + info.append('overlapped=completed') + if self._state == futures._FINISHED: + info.append(self._format_result()) + if self._callbacks: + info.append(self._format_callbacks()) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def cancel(self): try: self.ov.cancel() diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -358,16 +358,17 @@ self.loop = EventLoop(self.proactor) self.set_event_loop(self.loop, cleanup=False) - @mock.patch.object(BaseProactorEventLoop, 'call_soon') + @mock.patch.object(BaseProactorEventLoop, '_call_soon') @mock.patch.object(BaseProactorEventLoop, '_socketpair') - def test_ctor(self, socketpair, call_soon): + def test_ctor(self, socketpair, _call_soon): ssock, csock = socketpair.return_value = ( mock.Mock(), mock.Mock()) loop = BaseProactorEventLoop(self.proactor) self.assertIs(loop._ssock, ssock) self.assertIs(loop._csock, csock) self.assertEqual(loop._internal_fds, 1) - call_soon.assert_called_with(loop._loop_self_reading) + _call_soon.assert_called_with(loop._loop_self_reading, (), + check_loop=False) def test_close_self_pipe(self): self.loop._close_self_pipe() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1092,15 +1092,15 @@ self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake() - self.loop.assert_reader(1, transport._on_handshake) + transport._on_handshake(None) + self.loop.assert_reader(1, transport._on_handshake, None) def test_on_handshake_writer_retry(self): self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake() - self.loop.assert_writer(1, transport._on_handshake) + transport._on_handshake(None) + self.loop.assert_writer(1, transport._on_handshake, None) def test_on_handshake_exc(self): exc = ValueError() @@ -1108,7 +1108,7 @@ transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) transport._waiter = asyncio.Future(loop=self.loop) - transport._on_handshake() + transport._on_handshake(None) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) @@ -1119,7 +1119,7 @@ transport._waiter = asyncio.Future(loop=self.loop) exc = BaseException() self.sslsock.do_handshake.side_effect = exc - self.assertRaises(BaseException, transport._on_handshake) + self.assertRaises(BaseException, transport._on_handshake, None) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 03:14:59 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Jul 2014 03:14:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h9CpW0FTVz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/5af54ed3af02 changeset: 91656:5af54ed3af02 parent: 91653:5a299c3ec120 parent: 91655:1852d0e5e4ef user: Victor Stinner date: Sat Jul 12 03:12:30 2014 +0200 summary: Merge with 3.4 files: Lib/asyncio/base_events.py | 56 +++++- Lib/asyncio/proactor_events.py | 36 +++- Lib/asyncio/selector_events.py | 91 ++++++++- Lib/asyncio/unix_events.py | 36 +++ Lib/asyncio/windows_events.py | 12 + Lib/test/test_asyncio/test_proactor_events.py | 7 +- Lib/test/test_asyncio/test_selector_events.py | 12 +- 7 files changed, 220 insertions(+), 30 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -94,6 +94,9 @@ self._active_count = 0 self._waiters = [] + def __repr__(self): + return '<%s sockets=%r>' % (self.__class__.__name__, self.sockets) + def _attach(self): assert self.sockets is not None self._active_count += 1 @@ -110,8 +113,6 @@ return self.sockets = None for sock in sockets: - # closing sockets will call asynchronously the _detach() method - # which calls _wakeup() for the last socket self._loop._stop_serving(sock) if self._active_count == 0: self._wakeup() @@ -276,6 +277,8 @@ raise RuntimeError("cannot close a running event loop") if self._closed: return + if self._debug: + logger.debug("Close %r", self) self._closed = True self._ready.clear() self._scheduled.clear() @@ -402,10 +405,39 @@ def set_default_executor(self, executor): self._default_executor = executor + def _getaddrinfo_debug(self, host, port, family, type, proto, flags): + msg = ["%s:%r" % (host, port)] + if family: + msg.append('family=%r' % family) + if type: + msg.append('type=%r' % type) + if proto: + msg.append('proto=%r' % proto) + if flags: + msg.append('flags=%r' % flags) + msg = ', '.join(msg) + logger.debug('Get addresss info %s', msg) + + t0 = self.time() + addrinfo = socket.getaddrinfo(host, port, family, type, proto, flags) + dt = self.time() - t0 + + msg = ('Getting addresss info %s took %.3f ms: %r' + % (msg, dt * 1e3, addrinfo)) + if dt >= self.slow_callback_duration: + logger.info(msg) + else: + logger.debug(msg) + return addrinfo + def getaddrinfo(self, host, port, *, family=0, type=0, proto=0, flags=0): - return self.run_in_executor(None, socket.getaddrinfo, - host, port, family, type, proto, flags) + if self._debug: + return self.run_in_executor(None, self._getaddrinfo_debug, + host, port, family, type, proto, flags) + else: + return self.run_in_executor(None, socket.getaddrinfo, + host, port, family, type, proto, flags) def getnameinfo(self, sockaddr, flags=0): return self.run_in_executor(None, socket.getnameinfo, sockaddr, flags) @@ -492,6 +524,8 @@ sock.close() sock = None continue + if self._debug: + logger.debug("connect %r to %r", sock, address) yield from self.sock_connect(sock, address) except OSError as exc: if sock is not None: @@ -524,6 +558,9 @@ transport, protocol = yield from self._create_connection_transport( sock, protocol_factory, ssl, server_hostname) + if self._debug: + logger.debug("connected to %s:%r: (%r, %r)", + host, port, transport, protocol) return transport, protocol @coroutine @@ -614,6 +651,15 @@ waiter = futures.Future(loop=self) transport = self._make_datagram_transport(sock, protocol, r_addr, waiter) + if self._debug: + if local_addr: + logger.info("Datagram endpoint local_addr=%r remote_addr=%r " + "created: (%r, %r)", + local_addr, remote_addr, transport, protocol) + else: + logger.debug("Datagram endpoint remote_addr=%r created: " + "(%r, %r)", + remote_addr, transport, protocol) yield from waiter return transport, protocol @@ -694,6 +740,8 @@ sock.listen(backlog) sock.setblocking(False) self._start_serving(protocol_factory, sock, ssl, server) + if self._debug: + logger.info("%r is serving", server) return server @coroutine diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -41,6 +41,23 @@ # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._sock.fileno()] + if self._read_fut is not None: + ov = "pending" if self._read_fut.ov.pending else "completed" + info.append('read=%s' % ov) + if self._write_fut is not None: + if self._write_fut.ov.pending: + info.append("write=pending=%s" % self._pending_write) + else: + info.append("write=completed") + if self._buffer: + bufsize = len(self._buffer) + info.append('write_bufsize=%s' % bufsize) + if self._eof_written: + info.append('EOF written') + return '<%s>' % ' '.join(info) + def _set_extra(self, sock): self._extra['pipe'] = sock @@ -55,7 +72,10 @@ self._read_fut.cancel() def _fatal_error(self, exc, message='Fatal error on pipe transport'): - if not isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: self._loop.call_exception_handler({ 'message': message, 'exception': exc, @@ -108,7 +128,6 @@ def __init__(self, loop, sock, protocol, waiter=None, extra=None, server=None): super().__init__(loop, sock, protocol, waiter, extra, server) - self._read_fut = None self._paused = False self._loop.call_soon(self._loop_reading) @@ -118,6 +137,8 @@ if self._paused: raise RuntimeError('Already paused') self._paused = True + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) def resume_reading(self): if not self._paused: @@ -126,6 +147,8 @@ if self._closing: return self._loop.call_soon(self._loop_reading, self._read_fut) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) def _loop_reading(self, fut=None): if self._paused: @@ -166,6 +189,8 @@ if data: self._protocol.data_received(data) elif data is not None: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) keep_open = self._protocol.eof_received() if not keep_open: self.close() @@ -401,7 +426,9 @@ self._ssock.setblocking(False) self._csock.setblocking(False) self._internal_fds += 1 - self.call_soon(self._loop_self_reading) + # don't check the current loop because _make_self_pipe() is called + # from the event loop constructor + self._call_soon(self._loop_self_reading, (), check_loop=False) def _loop_self_reading(self, f=None): try: @@ -426,6 +453,9 @@ try: if f is not None: conn, addr = f.result() + if self._debug: + logger.debug("%r got a new connection from %r: %r", + server, addr, conn) protocol = protocol_factory() self._make_socket_transport( conn, protocol, diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -23,6 +23,17 @@ from .log import logger +def _test_selector_event(selector, fd, event): + # Test if the selector is monitoring 'event' events + # for the file descriptor 'fd'. + try: + key = selector.get_key(fd) + except KeyError: + return False + else: + return bool(key.events & event) + + class BaseSelectorEventLoop(base_events.BaseEventLoop): """Selector event loop. @@ -116,6 +127,9 @@ sslcontext=None, server=None): try: conn, addr = sock.accept() + if self._debug: + logger.debug("%r got a new connection from %r: %r", + server, addr, conn) conn.setblocking(False) except (BlockingIOError, InterruptedError, ConnectionAbortedError): pass # False alarm. @@ -419,6 +433,26 @@ if self._server is not None: self._server._attach() + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._sock_fd] + polling = _test_selector_event(self._loop._selector, + self._sock_fd, selectors.EVENT_READ) + if polling: + info.append('read=polling') + else: + info.append('read=idle') + + polling = _test_selector_event(self._loop._selector, + self._sock_fd, selectors.EVENT_WRITE) + if polling: + state = 'polling' + else: + state = 'idle' + + bufsize = self.get_write_buffer_size() + info.append('write=<%s, bufsize=%s>' % (state, bufsize)) + return '<%s>' % ' '.join(info) + def abort(self): self._force_close(None) @@ -433,7 +467,10 @@ def _fatal_error(self, exc, message='Fatal error on transport'): # Should be called from exception handler only. - if not isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if isinstance(exc, (BrokenPipeError, ConnectionResetError)): + if self._loop.get_debug(): + logger.debug("%r: %s", self, message, exc_info=True) + else: self._loop.call_exception_handler({ 'message': message, 'exception': exc, @@ -492,6 +529,8 @@ raise RuntimeError('Already paused') self._paused = True self._loop.remove_reader(self._sock_fd) + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) def resume_reading(self): if not self._paused: @@ -500,6 +539,8 @@ if self._closing: return self._loop.add_reader(self._sock_fd, self._read_ready) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) def _read_ready(self): try: @@ -512,6 +553,8 @@ if data: self._protocol.data_received(data) else: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) keep_open = self._protocol.eof_received() if keep_open: # We're keeping the connection open so the @@ -638,31 +681,37 @@ # SSL-specific extra info. (peercert is set later) self._extra.update(sslcontext=sslcontext) - self._on_handshake() + if self._loop.get_debug(): + logger.debug("%r starts SSL handshake", self) + start_time = self._loop.time() + else: + start_time = None + self._on_handshake(start_time) - def _on_handshake(self): + def _on_handshake(self, start_time): try: self._sock.do_handshake() except ssl.SSLWantReadError: - self._loop.add_reader(self._sock_fd, self._on_handshake) + self._loop.add_reader(self._sock_fd, + self._on_handshake, start_time) return except ssl.SSLWantWriteError: - self._loop.add_writer(self._sock_fd, self._on_handshake) + self._loop.add_writer(self._sock_fd, + self._on_handshake, start_time) return - except Exception as exc: + except BaseException as exc: + if self._loop.get_debug(): + logger.warning("%r: SSL handshake failed", + self, exc_info=True) self._loop.remove_reader(self._sock_fd) self._loop.remove_writer(self._sock_fd) self._sock.close() if self._waiter is not None: self._waiter.set_exception(exc) - return - except BaseException as exc: - self._loop.remove_reader(self._sock_fd) - self._loop.remove_writer(self._sock_fd) - self._sock.close() - if self._waiter is not None: - self._waiter.set_exception(exc) - raise + if isinstance(exc, Exception): + return + else: + raise self._loop.remove_reader(self._sock_fd) self._loop.remove_writer(self._sock_fd) @@ -676,6 +725,10 @@ try: ssl.match_hostname(peercert, self._server_hostname) except Exception as exc: + if self._loop.get_debug(): + logger.warning("%r: SSL handshake failed " + "on matching the hostname", + self, exc_info=True) self._sock.close() if self._waiter is not None: self._waiter.set_exception(exc) @@ -696,6 +749,10 @@ self._loop.call_soon(self._waiter._set_result_unless_cancelled, None) + if self._loop.get_debug(): + dt = self._loop.time() - start_time + logger.debug("%r: SSL handshake took %.1f ms", self, dt * 1e3) + def pause_reading(self): # XXX This is a bit icky, given the comment at the top of # _read_ready(). Is it possible to evoke a deadlock? I don't @@ -709,6 +766,8 @@ raise RuntimeError('Already paused') self._paused = True self._loop.remove_reader(self._sock_fd) + if self._loop.get_debug(): + logger.debug("%r pauses reading", self) def resume_reading(self): if not self._paused: @@ -717,6 +776,8 @@ if self._closing: return self._loop.add_reader(self._sock_fd, self._read_ready) + if self._loop.get_debug(): + logger.debug("%r resumes reading", self) def _read_ready(self): if self._write_wants_read: @@ -741,6 +802,8 @@ self._protocol.data_received(data) else: try: + if self._loop.get_debug(): + logger.debug("%r received EOF", self) keep_open = self._protocol.eof_received() if keep_open: logger.warning('returning true from eof_received() ' diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -16,6 +16,7 @@ from . import constants from . import events from . import selector_events +from . import selectors from . import transports from .coroutines import coroutine from .log import logger @@ -272,6 +273,20 @@ # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._fileno] + if self._pipe is not None: + polling = selector_events._test_selector_event( + self._loop._selector, + self._fileno, selectors.EVENT_READ) + if polling: + info.append('polling') + else: + info.append('idle') + else: + info.append('closed') + return '<%s>' % ' '.join(info) + def _read_ready(self): try: data = os.read(self._fileno, self.max_size) @@ -283,6 +298,8 @@ if data: self._protocol.data_received(data) else: + if self._loop.get_debug(): + logger.info("%r was closed by peer", self) self._closing = True self._loop.remove_reader(self._fileno) self._loop.call_soon(self._protocol.eof_received) @@ -357,11 +374,30 @@ # wait until protocol.connection_made() has been called self._loop.call_soon(waiter._set_result_unless_cancelled, None) + def __repr__(self): + info = [self.__class__.__name__, 'fd=%s' % self._fileno] + if self._pipe is not None: + polling = selector_events._test_selector_event( + self._loop._selector, + self._fileno, selectors.EVENT_WRITE) + if polling: + info.append('polling') + else: + info.append('idle') + + bufsize = self.get_write_buffer_size() + info.append('bufsize=%s' % bufsize) + else: + info.append('closed') + return '<%s>' % ' '.join(info) + def get_write_buffer_size(self): return sum(len(data) for data in self._buffer) def _read_ready(self): # Pipe was closed by peer. + if self._loop.get_debug(): + logger.info("%r was closed by peer", self) if self._buffer: self._close(BrokenPipeError()) else: diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -40,6 +40,18 @@ super().__init__(loop=loop) self.ov = ov + def __repr__(self): + info = [self._state.lower()] + if self.ov.pending: + info.append('overlapped=pending') + else: + info.append('overlapped=completed') + if self._state == futures._FINISHED: + info.append(self._format_result()) + if self._callbacks: + info.append(self._format_callbacks()) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def cancel(self): try: self.ov.cancel() diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -358,16 +358,17 @@ self.loop = EventLoop(self.proactor) self.set_event_loop(self.loop, cleanup=False) - @mock.patch.object(BaseProactorEventLoop, 'call_soon') + @mock.patch.object(BaseProactorEventLoop, '_call_soon') @mock.patch.object(BaseProactorEventLoop, '_socketpair') - def test_ctor(self, socketpair, call_soon): + def test_ctor(self, socketpair, _call_soon): ssock, csock = socketpair.return_value = ( mock.Mock(), mock.Mock()) loop = BaseProactorEventLoop(self.proactor) self.assertIs(loop._ssock, ssock) self.assertIs(loop._csock, csock) self.assertEqual(loop._internal_fds, 1) - call_soon.assert_called_with(loop._loop_self_reading) + _call_soon.assert_called_with(loop._loop_self_reading, (), + check_loop=False) def test_close_self_pipe(self): self.loop._close_self_pipe() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1092,15 +1092,15 @@ self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake() - self.loop.assert_reader(1, transport._on_handshake) + transport._on_handshake(None) + self.loop.assert_reader(1, transport._on_handshake, None) def test_on_handshake_writer_retry(self): self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake() - self.loop.assert_writer(1, transport._on_handshake) + transport._on_handshake(None) + self.loop.assert_writer(1, transport._on_handshake, None) def test_on_handshake_exc(self): exc = ValueError() @@ -1108,7 +1108,7 @@ transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) transport._waiter = asyncio.Future(loop=self.loop) - transport._on_handshake() + transport._on_handshake(None) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) @@ -1119,7 +1119,7 @@ transport._waiter = asyncio.Future(loop=self.loop) exc = BaseException() self.sslsock.do_handshake.side_effect = exc - self.assertRaises(BaseException, transport._on_handshake) + self.assertRaises(BaseException, transport._on_handshake, None) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 03:20:49 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Jul 2014 03:20:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogU2Vy?= =?utf-8?q?ver=2Eclose=28=29_leaves_client_sockets_open?= Message-ID: <3h9CxF4wg8z7LjQ@mail.python.org> http://hg.python.org/cpython/rev/23b439ac9e2d changeset: 91657:23b439ac9e2d branch: 3.4 parent: 91655:1852d0e5e4ef user: Victor Stinner date: Sat Jul 12 03:20:24 2014 +0200 summary: asyncio: Server.close() leaves client sockets open files: Doc/library/asyncio-eventloop.rst | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -567,8 +567,11 @@ .. method:: close() - Stop serving: close all sockets and set the :attr:`sockets` attribute to - ``None``. + Stop serving: close listening sockets and set the :attr:`sockets` + attribute to ``None``. + + The sockets that represent existing incoming client connections are + leaved open. The server is closed asynchonously, use the :meth:`wait_closed` coroutine to wait until the server is closed. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 03:20:50 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Jul 2014 03:20:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3h9CxG6Xqcz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/9b450b19aa11 changeset: 91658:9b450b19aa11 parent: 91656:5af54ed3af02 parent: 91657:23b439ac9e2d user: Victor Stinner date: Sat Jul 12 03:20:40 2014 +0200 summary: Merge with 3.4 files: Doc/library/asyncio-eventloop.rst | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -567,8 +567,11 @@ .. method:: close() - Stop serving: close all sockets and set the :attr:`sockets` attribute to - ``None``. + Stop serving: close listening sockets and set the :attr:`sockets` + attribute to ``None``. + + The sockets that represent existing incoming client connections are + leaved open. The server is closed asynchonously, use the :meth:`wait_closed` coroutine to wait until the server is closed. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Jul 12 08:51:37 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 12 Jul 2014 08:51:37 +0200 Subject: [Python-checkins] Daily reference leaks (9b450b19aa11): sum=9 Message-ID: results for 9b450b19aa11 on branch "default" -------------------------------------------- test_collections leaked [0, 0, 2] references, sum=2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog1jOrj9', '-x'] From python-checkins at python.org Sat Jul 12 11:04:59 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 12 Jul 2014 11:04:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321932=3A_Skip_tes?= =?utf-8?q?t=5Fos=2Etest=5Flarge=5Fread=28=29_on_32-bit_system?= Message-ID: <3h9QDq34cBz7Lk3@mail.python.org> http://hg.python.org/cpython/rev/880e2cdac8b1 changeset: 91659:880e2cdac8b1 user: Victor Stinner date: Sat Jul 12 11:03:53 2014 +0200 summary: Issue #21932: Skip test_os.test_large_read() on 32-bit system files: Lib/test/test_os.py | 8 ++++++-- 1 files changed, 6 insertions(+), 2 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 @@ -44,9 +44,9 @@ except ImportError: _winapi = None try: - from _testcapi import INT_MAX + from _testcapi import INT_MAX, PY_SSIZE_T_MAX except ImportError: - INT_MAX = 2 ** 31 - 1 + INT_MAX = PY_SSIZE_T_MAX = sys.maxsize from test.script_helper import assert_python_ok @@ -124,6 +124,10 @@ self.assertEqual(s, b"spam") @support.cpython_only + # Skip the test on 32-bit platforms: the number of bytes must fit in a + # Py_ssize_t type + @unittest.skipUnless(INT_MAX < PY_SSIZE_T_MAX, + "needs INT_MAX < PY_SSIZE_T_MAX") @support.bigmemtest(size=INT_MAX + 10, memuse=1, dry_run=False) def test_large_read(self, size): with open(support.TESTFN, "wb") as fp: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 17:26:04 2014 From: python-checkins at python.org (berker.peksag) Date: Sat, 12 Jul 2014 17:26:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5MDc2?= =?utf-8?q?=3A_Don=27t_pass_the_redundant_=27file=27_argument_to_self=2Eer?= =?utf-8?b?cm9yKCku?= Message-ID: <3h9ZhX3gqbz7LjS@mail.python.org> http://hg.python.org/cpython/rev/afa9c0e24a71 changeset: 91660:afa9c0e24a71 branch: 3.4 parent: 91657:23b439ac9e2d user: Berker Peksag date: Sat Jul 12 18:24:32 2014 +0300 summary: Issue #19076: Don't pass the redundant 'file' argument to self.error(). files: Lib/pdb.py | 2 +- Misc/NEWS | 2 ++ 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -673,7 +673,7 @@ # now set the break point err = self.set_break(filename, line, temporary, cond, funcname) if err: - self.error(err, file=self.stdout) + self.error(err) else: bp = self.get_breaks(filename, line)[-1] self.message("Breakpoint %d at %s:%d" % diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,8 @@ Library ------- +- Issue #19076: Don't pass the redundant 'file' argument to self.error(). + - Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. - Issue #11259: asynchat.async_chat().set_terminator() now raises a ValueError -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 17:26:05 2014 From: python-checkins at python.org (berker.peksag) Date: Sat, 12 Jul 2014 17:26:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319076=3A_Merge_with_3=2E4=2E?= Message-ID: <3h9ZhY54QYz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/d891ad8aeb80 changeset: 91661:d891ad8aeb80 parent: 91659:880e2cdac8b1 parent: 91660:afa9c0e24a71 user: Berker Peksag date: Sat Jul 12 18:26:03 2014 +0300 summary: Issue #19076: Merge with 3.4. files: Lib/pdb.py | 2 +- Misc/NEWS | 2 ++ 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -673,7 +673,7 @@ # now set the break point err = self.set_break(filename, line, temporary, cond, funcname) if err: - self.error(err, file=self.stdout) + self.error(err) else: bp = self.get_breaks(filename, line)[-1] self.message("Breakpoint %d at %s:%d" % diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,8 @@ Library ------- +- Issue #19076: Don't pass the redundant 'file' argument to self.error(). + - Issue #16382: Improve exception message of warnings.warn() for bad category. Initial patch by Phil Elson. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 12 22:36:46 2014 From: python-checkins at python.org (alexander.belopolsky) Date: Sat, 12 Jul 2014 22:36:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321966=3A_Respect_?= =?utf-8?q?-q_command-line_option_when_code_module_is_ran=2E?= Message-ID: <3h9jb26z8pz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/7f8843ec34ee changeset: 91662:7f8843ec34ee user: Alexander Belopolsky date: Sat Jul 12 16:36:33 2014 -0400 summary: Issue #21966: Respect -q command-line option when code module is ran. Contributed by Anton Barkovsky. files: Lib/code.py | 11 ++++++++++- Misc/NEWS | 2 ++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/Lib/code.py b/Lib/code.py --- a/Lib/code.py +++ b/Lib/code.py @@ -7,6 +7,7 @@ import sys import traceback +import argparse from codeop import CommandCompiler, compile_command __all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", @@ -299,4 +300,12 @@ if __name__ == "__main__": - interact() + parser = argparse.ArgumentParser() + parser.add_argument('-q', action='store_true', + help="don't print version and copyright messages") + args = parser.parse_args() + if args.q or sys.flags.quiet: + banner = '' + else: + banner = None + interact(banner) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,8 @@ Library ------- +- Issue #21966: Respect -q command-line option when code module is ran. + - Issue #19076: Don't pass the redundant 'file' argument to self.error(). - Issue #16382: Improve exception message of warnings.warn() for bad -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 07:21:16 2014 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Jul 2014 07:21:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxMzIz?= =?utf-8?q?=3A_Fix_CGIHTTPServer_to_again_handle_scripts_in_CGI_subdirecto?= =?utf-8?q?ries=2C?= Message-ID: <3h9xDD6TKrz7LkG@mail.python.org> http://hg.python.org/cpython/rev/d367ea865ea4 changeset: 91663:d367ea865ea4 branch: 2.7 parent: 91654:cc8849331528 user: Ned Deily date: Sat Jul 12 22:01:15 2014 -0700 summary: Issue #21323: Fix CGIHTTPServer to again handle scripts in CGI subdirectories, broken by the fix for security issue #19435. Patch by Zach Byrne. files: Lib/CGIHTTPServer.py | 10 +++++----- Lib/test/test_httpservers.py | 14 ++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Lib/CGIHTTPServer.py b/Lib/CGIHTTPServer.py --- a/Lib/CGIHTTPServer.py +++ b/Lib/CGIHTTPServer.py @@ -106,16 +106,16 @@ def run_cgi(self): """Execute a CGI script.""" dir, rest = self.cgi_info - - i = rest.find('/') + path = dir + '/' + rest + i = path.find('/', len(dir)+1) while i >= 0: - nextdir = rest[:i] - nextrest = rest[i+1:] + nextdir = path[:i] + nextrest = path[i+1:] scriptdir = self.translate_path(nextdir) if os.path.isdir(scriptdir): dir, rest = nextdir, nextrest - i = rest.find('/') + i = path.find('/', len(dir)+1) else: break diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -386,7 +386,9 @@ BaseTestCase.setUp(self) self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') + self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') os.mkdir(self.cgi_dir) + os.mkdir(self.cgi_child_dir) # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -411,6 +413,11 @@ file2.write(cgi_file2 % self.pythonexe) os.chmod(self.file2_path, 0777) + self.file3_path = os.path.join(self.cgi_child_dir, 'file3.py') + with open(self.file3_path, 'w') as file3: + file3.write(cgi_file1 % self.pythonexe) + os.chmod(self.file3_path, 0777) + self.cwd = os.getcwd() os.chdir(self.parent_dir) @@ -422,6 +429,8 @@ os.remove(self.nocgi_path) os.remove(self.file1_path) os.remove(self.file2_path) + os.remove(self.file3_path) + os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.parent_dir) finally: @@ -516,6 +525,11 @@ self.assertEqual((b'Hello World\n', 'text/html', 200), (res.read(), res.getheader('Content-type'), res.status)) + def test_nested_cgi_path_issue21323(self): + res = self.request('/cgi-bin/child-dir/file3.py') + self.assertEqual((b'Hello World\n', 'text/html', 200), + (res.read(), res.getheader('Content-type'), res.status)) + class SimpleHTTPRequestHandlerTestCase(unittest.TestCase): """ Test url parsing """ diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -198,6 +198,7 @@ Lee Busby Katherine Busch Ralph Butler +Zach Byrne Nicolas Cadou Jp Calderone Arnaud Calmettes diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -25,6 +25,9 @@ - Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler due to possible uninitialized _config_vars. +- Issue #21323: Fix CGIHTTPServer to again handle scripts in CGI subdirectories, + broken by the fix for security issue #19435. Patch by Zach Byrne. + What's New in Python 2.7.8? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 07:21:18 2014 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Jul 2014 07:21:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzIxMzIz?= =?utf-8?q?=3A_Fix_http=2Eserver_to_again_handle_scripts_in_CGI_subdirecto?= =?utf-8?q?ries=2C?= Message-ID: <3h9xDG2bHLz7LkY@mail.python.org> http://hg.python.org/cpython/rev/4de94641ba3e changeset: 91664:4de94641ba3e branch: 3.2 parent: 91236:77f227624cff user: Ned Deily date: Sat Jul 12 22:06:26 2014 -0700 summary: Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, broken by the fix for security issue #19435. Patch by Zach Byrne. files: Lib/http/server.py | 10 +++++----- Lib/test/test_httpservers.py | 16 ++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Lib/http/server.py b/Lib/http/server.py --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -969,16 +969,16 @@ def run_cgi(self): """Execute a CGI script.""" dir, rest = self.cgi_info - - i = rest.find('/') + path = dir + '/' + rest + i = path.find('/', len(dir)+1) while i >= 0: - nextdir = rest[:i] - nextrest = rest[i+1:] + nextdir = path[:i] + nextrest = path[i+1:] scriptdir = self.translate_path(nextdir) if os.path.isdir(scriptdir): dir, rest = nextdir, nextrest - i = rest.find('/') + i = path.find('/', len(dir)+1) else: break diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -321,10 +321,13 @@ self.cwd = os.getcwd() self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') + self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') os.mkdir(self.cgi_dir) + os.mkdir(self.cgi_child_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None + self.file3_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -358,6 +361,11 @@ file2.write(cgi_file2 % self.pythonexe) os.chmod(self.file2_path, 0o777) + self.file3_path = os.path.join(self.cgi_child_dir, 'file3.py') + with open(self.file3_path, 'w', encoding='utf-8') as file3: + file3.write(cgi_file1 % self.pythonexe) + os.chmod(self.file3_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -371,6 +379,9 @@ os.remove(self.file1_path) if self.file2_path: os.remove(self.file2_path) + if self.file3_path: + os.remove(self.file3_path) + os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.parent_dir) finally: @@ -466,6 +477,11 @@ self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), (res.read(), res.getheader('Content-type'), res.status)) + def test_nested_cgi_path_issue21323(self): + res = self.request('/cgi-bin/child-dir/file3.py') + self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), + (res.read(), res.getheader('Content-type'), res.status)) + class SocketlessRequestHandler(SimpleHTTPRequestHandler): def __init__(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -164,6 +164,7 @@ Tarn Weisner Burton Lee Busby Ralph Butler +Zach Byrne Jp Calderone Arnaud Calmettes Daniel Calvelo diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ - Issue #17980: Fix possible abuse of ssl.match_hostname() for denial of service using certificates with many wildcards (CVE-2013-2099). +- Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, + broken by the fix for security issue #19435. Patch by Zach Byrne. + What's New in Python 3.2.5? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 07:21:19 2014 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Jul 2014 07:21:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMyk6?= =?utf-8?q?_Issue_=2321323=3A_Fix_http=2Eserver_to_again_handle_scripts_in?= =?utf-8?q?_CGI_subdirectories=2C?= Message-ID: <3h9xDH5fVjz7LlN@mail.python.org> http://hg.python.org/cpython/rev/b957f475e41e changeset: 91665:b957f475e41e branch: 3.3 parent: 91398:cf156cfb12e7 parent: 91664:4de94641ba3e user: Ned Deily date: Sat Jul 12 22:12:39 2014 -0700 summary: Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, broken by the fix for security issue #19435. Patch by Zach Byrne. files: Lib/http/server.py | 10 +++++----- Lib/test/test_httpservers.py | 16 ++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Lib/http/server.py b/Lib/http/server.py --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -994,16 +994,16 @@ def run_cgi(self): """Execute a CGI script.""" dir, rest = self.cgi_info - - i = rest.find('/') + path = dir + '/' + rest + i = path.find('/', len(dir)+1) while i >= 0: - nextdir = rest[:i] - nextrest = rest[i+1:] + nextdir = path[:i] + nextrest = path[i+1:] scriptdir = self.translate_path(nextdir) if os.path.isdir(scriptdir): dir, rest = nextdir, nextrest - i = rest.find('/') + i = path.find('/', len(dir)+1) else: break diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -324,10 +324,13 @@ self.cwd = os.getcwd() self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') + self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') os.mkdir(self.cgi_dir) + os.mkdir(self.cgi_child_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None + self.file3_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -361,6 +364,11 @@ file2.write(cgi_file2 % self.pythonexe) os.chmod(self.file2_path, 0o777) + self.file3_path = os.path.join(self.cgi_child_dir, 'file3.py') + with open(self.file3_path, 'w', encoding='utf-8') as file3: + file3.write(cgi_file1 % self.pythonexe) + os.chmod(self.file3_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -374,6 +382,9 @@ os.remove(self.file1_path) if self.file2_path: os.remove(self.file2_path) + if self.file3_path: + os.remove(self.file3_path) + os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.parent_dir) finally: @@ -469,6 +480,11 @@ self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), (res.read(), res.getheader('Content-type'), res.status)) + def test_nested_cgi_path_issue21323(self): + res = self.request('/cgi-bin/child-dir/file3.py') + self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), + (res.read(), res.getheader('Content-type'), res.status)) + class SocketlessRequestHandler(SimpleHTTPRequestHandler): def __init__(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -186,6 +186,7 @@ Tarn Weisner Burton Lee Busby Ralph Butler +Zach Byrne Nicolas Cadou Jp Calderone Arnaud Calmettes diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -38,6 +38,9 @@ as documented. The pattern and source keyword parameters are left as deprecated aliases. +- Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, + broken by the fix for security issue #19435. Patch by Zach Byrne. + Tests ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 07:21:21 2014 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Jul 2014 07:21:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy4zIC0+IDMuNCk6?= =?utf-8?q?_Issue_=2321323=3A_Fix_http=2Eserver_to_again_handle_scripts_in?= =?utf-8?q?_CGI_subdirectories=2C?= Message-ID: <3h9xDK1wltz7Ll1@mail.python.org> http://hg.python.org/cpython/rev/385f4406dc26 changeset: 91666:385f4406dc26 branch: 3.4 parent: 91660:afa9c0e24a71 parent: 91665:b957f475e41e user: Ned Deily date: Sat Jul 12 22:16:56 2014 -0700 summary: Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, broken by the fix for security issue #19435. Patch by Zach Byrne. files: Lib/http/server.py | 10 +++++----- Lib/test/test_httpservers.py | 16 ++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 5 ++++- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Lib/http/server.py b/Lib/http/server.py --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1000,16 +1000,16 @@ def run_cgi(self): """Execute a CGI script.""" dir, rest = self.cgi_info - - i = rest.find('/') + path = dir + '/' + rest + i = path.find('/', len(dir)+1) while i >= 0: - nextdir = rest[:i] - nextrest = rest[i+1:] + nextdir = path[:i] + nextrest = path[i+1:] scriptdir = self.translate_path(nextdir) if os.path.isdir(scriptdir): dir, rest = nextdir, nextrest - i = rest.find('/') + i = path.find('/', len(dir)+1) else: break diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -346,10 +346,13 @@ self.cwd = os.getcwd() self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') + self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') os.mkdir(self.cgi_dir) + os.mkdir(self.cgi_child_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None + self.file3_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -383,6 +386,11 @@ file2.write(cgi_file2 % self.pythonexe) os.chmod(self.file2_path, 0o777) + self.file3_path = os.path.join(self.cgi_child_dir, 'file3.py') + with open(self.file3_path, 'w', encoding='utf-8') as file3: + file3.write(cgi_file1 % self.pythonexe) + os.chmod(self.file3_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -396,6 +404,9 @@ os.remove(self.file1_path) if self.file2_path: os.remove(self.file2_path) + if self.file3_path: + os.remove(self.file3_path) + os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.parent_dir) finally: @@ -491,6 +502,11 @@ self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), (res.read(), res.getheader('Content-type'), res.status)) + def test_nested_cgi_path_issue21323(self): + res = self.request('/cgi-bin/child-dir/file3.py') + self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), + (res.read(), res.getheader('Content-type'), res.status)) + class SocketlessRequestHandler(SimpleHTTPRequestHandler): def __init__(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -200,6 +200,7 @@ Lee Busby Katherine Busch Ralph Butler +Zach Byrne Nicolas Cadou Jp Calderone Arnaud Calmettes diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1,4 +1,4 @@ -?+++++++++++ ++++++++++++ Python News +++++++++++ @@ -158,6 +158,9 @@ - Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler due to possible uninitialized _config_vars. +- Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, + broken by the fix for security issue #19435. Patch by Zach Byrne. + Build ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 07:21:22 2014 From: python-checkins at python.org (ned.deily) Date: Sun, 13 Jul 2014 07:21:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321323=3A_Fix_http=2Eserver_to_again_handle_scri?= =?utf-8?q?pts_in_CGI_subdirectories=2C?= Message-ID: <3h9xDL5QdQz7Llm@mail.python.org> http://hg.python.org/cpython/rev/22e5a85ba840 changeset: 91667:22e5a85ba840 parent: 91662:7f8843ec34ee parent: 91666:385f4406dc26 user: Ned Deily date: Sat Jul 12 22:20:15 2014 -0700 summary: Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, broken by the fix for security issue #19435. Patch by Zach Byrne. files: Lib/http/server.py | 10 +++++----- Lib/test/test_httpservers.py | 16 ++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Lib/http/server.py b/Lib/http/server.py --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1000,16 +1000,16 @@ def run_cgi(self): """Execute a CGI script.""" dir, rest = self.cgi_info - - i = rest.find('/') + path = dir + '/' + rest + i = path.find('/', len(dir)+1) while i >= 0: - nextdir = rest[:i] - nextrest = rest[i+1:] + nextdir = path[:i] + nextrest = path[i+1:] scriptdir = self.translate_path(nextdir) if os.path.isdir(scriptdir): dir, rest = nextdir, nextrest - i = rest.find('/') + i = path.find('/', len(dir)+1) else: break diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -346,10 +346,13 @@ self.cwd = os.getcwd() self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') + self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') os.mkdir(self.cgi_dir) + os.mkdir(self.cgi_child_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None + self.file3_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -383,6 +386,11 @@ file2.write(cgi_file2 % self.pythonexe) os.chmod(self.file2_path, 0o777) + self.file3_path = os.path.join(self.cgi_child_dir, 'file3.py') + with open(self.file3_path, 'w', encoding='utf-8') as file3: + file3.write(cgi_file1 % self.pythonexe) + os.chmod(self.file3_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -396,6 +404,9 @@ os.remove(self.file1_path) if self.file2_path: os.remove(self.file2_path) + if self.file3_path: + os.remove(self.file3_path) + os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) os.rmdir(self.parent_dir) finally: @@ -491,6 +502,11 @@ self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), (res.read(), res.getheader('Content-type'), res.status)) + def test_nested_cgi_path_issue21323(self): + res = self.request('/cgi-bin/child-dir/file3.py') + self.assertEqual((b'Hello World' + self.linesep, 'text/html', 200), + (res.read(), res.getheader('Content-type'), res.status)) + class SocketlessRequestHandler(SimpleHTTPRequestHandler): def __init__(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -201,6 +201,7 @@ Lee Busby Katherine Busch Ralph Butler +Zach Byrne Nicolas Cadou Jp Calderone Arnaud Calmettes diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -573,6 +573,9 @@ - Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler due to possible uninitialized _config_vars. +- Issue #21323: Fix http.server to again handle scripts in CGI subdirectories, + broken by the fix for security issue #19435. Patch by Zach Byrne. + Extension Modules ----------------- -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Jul 13 09:21:23 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 13 Jul 2014 09:21:23 +0200 Subject: [Python-checkins] Daily reference leaks (7f8843ec34ee): sum=18 Message-ID: results for 7f8843ec34ee on branch "default" -------------------------------------------- test_asyncio leaked [0, 4, 0] memory blocks, sum=4 test_collections leaked [0, -2, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_nntplib leaked [0, 0, 13] references, sum=13 test_nntplib leaked [0, 0, 4] memory blocks, sum=4 test_site leaked [-2, 2, -2] references, sum=-2 test_site leaked [-2, 2, -2] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/refloguNEoze', '-x'] From python-checkins at python.org Sun Jul 13 23:28:27 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 13 Jul 2014 23:28:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Method_return_signature_changes_made_to_SearchDialogBase_fo?= =?utf-8?q?r?= Message-ID: <3hBLhC0TDfz7LjP@mail.python.org> http://hg.python.org/cpython/rev/b6c5719e0f4e changeset: 91668:b6c5719e0f4e branch: 2.7 parent: 91663:d367ea865ea4 user: Terry Jan Reedy date: Sun Jul 13 17:27:21 2014 -0400 summary: Issue #18592: Method return signature changes made to SearchDialogBase for test purposes are now reflected in GrepDialog and ReplaceDialog. Docstrings are improved. Initial patch by Saimadhav Heblikar files: Lib/idlelib/GrepDialog.py | 4 +- Lib/idlelib/ReplaceDialog.py | 2 +- Lib/idlelib/SearchDialogBase.py | 46 ++++++--- Lib/idlelib/idle_test/test_searchdialogbase.py | 2 +- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/Lib/idlelib/GrepDialog.py b/Lib/idlelib/GrepDialog.py --- a/Lib/idlelib/GrepDialog.py +++ b/Lib/idlelib/GrepDialog.py @@ -45,10 +45,10 @@ def create_entries(self): SearchDialogBase.create_entries(self) - self.globent = self.make_entry("In files:", self.globvar) + self.globent = self.make_entry("In files:", self.globvar)[0] def create_other_buttons(self): - f = self.make_frame() + f = self.make_frame()[0] btn = Checkbutton(f, anchor="w", variable=self.recvar, diff --git a/Lib/idlelib/ReplaceDialog.py b/Lib/idlelib/ReplaceDialog.py --- a/Lib/idlelib/ReplaceDialog.py +++ b/Lib/idlelib/ReplaceDialog.py @@ -40,7 +40,7 @@ def create_entries(self): SearchDialogBase.create_entries(self) - self.replent = self.make_entry("Replace with:", self.replvar) + self.replent = self.make_entry("Replace with:", self.replvar)[0] def create_command_buttons(self): SearchDialogBase.create_command_buttons(self) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -89,21 +89,29 @@ self.create_other_buttons() # next row, cols 0, 1 self.create_command_buttons() # col 2, all rows - def make_entry(self, label, var): - "Return gridded labeled Entry." - l = Label(self.top, text=label) - l.grid(row=self.row, column=0, sticky="nw") - e = Entry(self.top, textvariable=var, exportselection=0) - e.grid(row=self.row, column=1, sticky="nwe") + def make_entry(self, label_text, var): + '''Return (entry, label), . + + entry - gridded labeled Entry for text entry. + label - Label widget, returned for testing. + ''' + label = Label(self.top, text=label_text) + label.grid(row=self.row, column=0, sticky="nw") + entry = Entry(self.top, textvariable=var, exportselection=0) + entry.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 - return l, e # return label for testing + return entry, label def create_entries(self): "Create one or more entry lines with make_entry." - self.ent = self.make_entry("Find:", self.engine.patvar)[1] + self.ent = self.make_entry("Find:", self.engine.patvar)[0] def make_frame(self,labeltext=None): - "Return gridded labeled Frame for option or other buttons." + '''Return (frame, label). + + frame - gridded labeled Frame for option or other buttons. + label - Label widget, returned for testing. + ''' if labeltext: label = Label(self.top, text=labeltext) label.grid(row=self.row, column=0, sticky="nw") @@ -112,10 +120,15 @@ frame = Frame(self.top) frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return frame, label # label for test + return frame, label def create_option_buttons(self): - "Fill frame with Checkbuttons bound to SearchEngine booleanvars." + '''Return (filled frame, options) for testing. + + Options is a list of SearchEngine booleanvar, label pairs. + A gridded frame from make_frame is filled with a Checkbutton + for each pair, bound to the var, with the corresponding label. + ''' frame = self.make_frame("Options")[0] engine = self.engine options = [(engine.revar, "Regular expression"), @@ -128,10 +141,14 @@ btn.pack(side="left", fill="both") if var.get(): btn.select() - return frame, options # for test + return frame, options def create_other_buttons(self): - "Fill frame with buttons tied to other options." + '''Return (frame, others) for testing. + + Others is a list of value, label pairs. + A gridded frame from make_frame is filled with radio buttons. + ''' frame = self.make_frame("Direction")[0] var = self.engine.backvar others = [(1, 'Up'), (0, 'Down')] @@ -139,10 +156,9 @@ btn = Radiobutton(frame, anchor="w", variable=var, value=val, text=label) btn.pack(side="left", fill="both") - #print(var.get(), val, label) if var.get() == val: btn.select() - return frame, others # for test + return frame, others def make_button(self, label, command, isdef=0): "Return command button gridded in command frame." diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -75,7 +75,7 @@ equal = self.assertEqual self.dialog.row = 0 self.dialog.top = Toplevel(self.root) - label, entry = self.dialog.make_entry("Test:", 'hello') + entry, label = self.dialog.make_entry("Test:", 'hello') equal(label['text'], 'Test:') self.assertIn(entry.get(), 'hello') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 23:28:28 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 13 Jul 2014 23:28:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE4NTky?= =?utf-8?q?=3A_Method_return_signature_changes_made_to_SearchDialogBase_fo?= =?utf-8?q?r?= Message-ID: <3hBLhD3Flkz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/407110796b16 changeset: 91669:407110796b16 branch: 3.4 parent: 91666:385f4406dc26 user: Terry Jan Reedy date: Sun Jul 13 17:27:26 2014 -0400 summary: Issue #18592: Method return signature changes made to SearchDialogBase for test purposes are now reflected in GrepDialog and ReplaceDialog. Docstrings are improved. Initial patch by Saimadhav Heblikar files: Lib/idlelib/GrepDialog.py | 4 +- Lib/idlelib/ReplaceDialog.py | 2 +- Lib/idlelib/SearchDialogBase.py | 46 ++++++--- Lib/idlelib/idle_test/test_searchdialogbase.py | 2 +- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/Lib/idlelib/GrepDialog.py b/Lib/idlelib/GrepDialog.py --- a/Lib/idlelib/GrepDialog.py +++ b/Lib/idlelib/GrepDialog.py @@ -45,10 +45,10 @@ def create_entries(self): SearchDialogBase.create_entries(self) - self.globent = self.make_entry("In files:", self.globvar) + self.globent = self.make_entry("In files:", self.globvar)[0] def create_other_buttons(self): - f = self.make_frame() + f = self.make_frame()[0] btn = Checkbutton(f, anchor="w", variable=self.recvar, diff --git a/Lib/idlelib/ReplaceDialog.py b/Lib/idlelib/ReplaceDialog.py --- a/Lib/idlelib/ReplaceDialog.py +++ b/Lib/idlelib/ReplaceDialog.py @@ -40,7 +40,7 @@ def create_entries(self): SearchDialogBase.create_entries(self) - self.replent = self.make_entry("Replace with:", self.replvar) + self.replent = self.make_entry("Replace with:", self.replvar)[0] def create_command_buttons(self): SearchDialogBase.create_command_buttons(self) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -89,21 +89,29 @@ self.create_other_buttons() # next row, cols 0, 1 self.create_command_buttons() # col 2, all rows - def make_entry(self, label, var): - "Return gridded labeled Entry." - l = Label(self.top, text=label) - l.grid(row=self.row, column=0, sticky="nw") - e = Entry(self.top, textvariable=var, exportselection=0) - e.grid(row=self.row, column=1, sticky="nwe") + def make_entry(self, label_text, var): + '''Return (entry, label), . + + entry - gridded labeled Entry for text entry. + label - Label widget, returned for testing. + ''' + label = Label(self.top, text=label_text) + label.grid(row=self.row, column=0, sticky="nw") + entry = Entry(self.top, textvariable=var, exportselection=0) + entry.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 - return l, e # return label for testing + return entry, label def create_entries(self): "Create one or more entry lines with make_entry." - self.ent = self.make_entry("Find:", self.engine.patvar)[1] + self.ent = self.make_entry("Find:", self.engine.patvar)[0] def make_frame(self,labeltext=None): - "Return gridded labeled Frame for option or other buttons." + '''Return (frame, label). + + frame - gridded labeled Frame for option or other buttons. + label - Label widget, returned for testing. + ''' if labeltext: label = Label(self.top, text=labeltext) label.grid(row=self.row, column=0, sticky="nw") @@ -112,10 +120,15 @@ frame = Frame(self.top) frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return frame, label # label for test + return frame, label def create_option_buttons(self): - "Fill frame with Checkbuttons bound to SearchEngine booleanvars." + '''Return (filled frame, options) for testing. + + Options is a list of SearchEngine booleanvar, label pairs. + A gridded frame from make_frame is filled with a Checkbutton + for each pair, bound to the var, with the corresponding label. + ''' frame = self.make_frame("Options")[0] engine = self.engine options = [(engine.revar, "Regular expression"), @@ -128,10 +141,14 @@ btn.pack(side="left", fill="both") if var.get(): btn.select() - return frame, options # for test + return frame, options def create_other_buttons(self): - "Fill frame with buttons tied to other options." + '''Return (frame, others) for testing. + + Others is a list of value, label pairs. + A gridded frame from make_frame is filled with radio buttons. + ''' frame = self.make_frame("Direction")[0] var = self.engine.backvar others = [(1, 'Up'), (0, 'Down')] @@ -139,10 +156,9 @@ btn = Radiobutton(frame, anchor="w", variable=var, value=val, text=label) btn.pack(side="left", fill="both") - #print(var.get(), val, label) if var.get() == val: btn.select() - return frame, others # for test + return frame, others def make_button(self, label, command, isdef=0): "Return command button gridded in command frame." diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -75,7 +75,7 @@ equal = self.assertEqual self.dialog.row = 0 self.dialog.top = Toplevel(self.root) - label, entry = self.dialog.make_entry("Test:", 'hello') + entry, label = self.dialog.make_entry("Test:", 'hello') equal(label['text'], 'Test:') self.assertIn(entry.get(), 'hello') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 13 23:28:29 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 13 Jul 2014 23:28:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hBLhF6346z7Ljw@mail.python.org> http://hg.python.org/cpython/rev/dac25d8ac95a changeset: 91670:dac25d8ac95a parent: 91667:22e5a85ba840 parent: 91669:407110796b16 user: Terry Jan Reedy date: Sun Jul 13 17:27:41 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/GrepDialog.py | 4 +- Lib/idlelib/ReplaceDialog.py | 2 +- Lib/idlelib/SearchDialogBase.py | 46 ++++++--- Lib/idlelib/idle_test/test_searchdialogbase.py | 2 +- 4 files changed, 35 insertions(+), 19 deletions(-) diff --git a/Lib/idlelib/GrepDialog.py b/Lib/idlelib/GrepDialog.py --- a/Lib/idlelib/GrepDialog.py +++ b/Lib/idlelib/GrepDialog.py @@ -45,10 +45,10 @@ def create_entries(self): SearchDialogBase.create_entries(self) - self.globent = self.make_entry("In files:", self.globvar) + self.globent = self.make_entry("In files:", self.globvar)[0] def create_other_buttons(self): - f = self.make_frame() + f = self.make_frame()[0] btn = Checkbutton(f, anchor="w", variable=self.recvar, diff --git a/Lib/idlelib/ReplaceDialog.py b/Lib/idlelib/ReplaceDialog.py --- a/Lib/idlelib/ReplaceDialog.py +++ b/Lib/idlelib/ReplaceDialog.py @@ -40,7 +40,7 @@ def create_entries(self): SearchDialogBase.create_entries(self) - self.replent = self.make_entry("Replace with:", self.replvar) + self.replent = self.make_entry("Replace with:", self.replvar)[0] def create_command_buttons(self): SearchDialogBase.create_command_buttons(self) diff --git a/Lib/idlelib/SearchDialogBase.py b/Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py +++ b/Lib/idlelib/SearchDialogBase.py @@ -89,21 +89,29 @@ self.create_other_buttons() # next row, cols 0, 1 self.create_command_buttons() # col 2, all rows - def make_entry(self, label, var): - "Return gridded labeled Entry." - l = Label(self.top, text=label) - l.grid(row=self.row, column=0, sticky="nw") - e = Entry(self.top, textvariable=var, exportselection=0) - e.grid(row=self.row, column=1, sticky="nwe") + def make_entry(self, label_text, var): + '''Return (entry, label), . + + entry - gridded labeled Entry for text entry. + label - Label widget, returned for testing. + ''' + label = Label(self.top, text=label_text) + label.grid(row=self.row, column=0, sticky="nw") + entry = Entry(self.top, textvariable=var, exportselection=0) + entry.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 - return l, e # return label for testing + return entry, label def create_entries(self): "Create one or more entry lines with make_entry." - self.ent = self.make_entry("Find:", self.engine.patvar)[1] + self.ent = self.make_entry("Find:", self.engine.patvar)[0] def make_frame(self,labeltext=None): - "Return gridded labeled Frame for option or other buttons." + '''Return (frame, label). + + frame - gridded labeled Frame for option or other buttons. + label - Label widget, returned for testing. + ''' if labeltext: label = Label(self.top, text=labeltext) label.grid(row=self.row, column=0, sticky="nw") @@ -112,10 +120,15 @@ frame = Frame(self.top) frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 - return frame, label # label for test + return frame, label def create_option_buttons(self): - "Fill frame with Checkbuttons bound to SearchEngine booleanvars." + '''Return (filled frame, options) for testing. + + Options is a list of SearchEngine booleanvar, label pairs. + A gridded frame from make_frame is filled with a Checkbutton + for each pair, bound to the var, with the corresponding label. + ''' frame = self.make_frame("Options")[0] engine = self.engine options = [(engine.revar, "Regular expression"), @@ -128,10 +141,14 @@ btn.pack(side="left", fill="both") if var.get(): btn.select() - return frame, options # for test + return frame, options def create_other_buttons(self): - "Fill frame with buttons tied to other options." + '''Return (frame, others) for testing. + + Others is a list of value, label pairs. + A gridded frame from make_frame is filled with radio buttons. + ''' frame = self.make_frame("Direction")[0] var = self.engine.backvar others = [(1, 'Up'), (0, 'Down')] @@ -139,10 +156,9 @@ btn = Radiobutton(frame, anchor="w", variable=var, value=val, text=label) btn.pack(side="left", fill="both") - #print(var.get(), val, label) if var.get() == val: btn.select() - return frame, others # for test + return frame, others def make_button(self, label, command, isdef=0): "Return command button gridded in command frame." diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py --- a/Lib/idlelib/idle_test/test_searchdialogbase.py +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -75,7 +75,7 @@ equal = self.assertEqual self.dialog.row = 0 self.dialog.top = Toplevel(self.root) - label, entry = self.dialog.make_entry("Test:", 'hello') + entry, label = self.dialog.make_entry("Test:", 'hello') equal(label['text'], 'Test:') self.assertIn(entry.get(), 'hello') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 02:41:14 2014 From: python-checkins at python.org (guido.van.rossum) Date: Mon, 14 Jul 2014 02:41:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_PEP_472=3A_=22Support_for?= =?utf-8?q?_indexing_with_keyword_arguments=22_by_Stefano_Borini=2C?= Message-ID: <3hBQyf401mzSpj@mail.python.org> http://hg.python.org/peps/rev/a29585b16cb2 changeset: 5496:a29585b16cb2 user: Guido van Rossum date: Sun Jul 13 17:40:44 2014 -0700 summary: Add PEP 472: "Support for indexing with keyword arguments" by Stefano Borini, Joseph Martinot-Lagarde. files: pep-0472.txt | 653 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 653 insertions(+), 0 deletions(-) diff --git a/pep-0472.txt b/pep-0472.txt new file mode 100644 --- /dev/null +++ b/pep-0472.txt @@ -0,0 +1,653 @@ +PEP: 472 +Title: Support for indexing with keyword arguments +Version: $Revision$ +Last-Modified: $Date$ +Author: Stefano Borini, Joseph Martinot-Lagarde +Discussion-To: python-ideas at python.org +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 24-Jun-2014 +Python-Version: 3.6 +Post-History: 02-Jul-2014 + +Abstract +======== + +This PEP proposes an extension of the indexing operation to support keyword +arguments. Notations in the form ``a[K=3,R=2]`` would become legal syntax. +For future-proofing considerations, ``a[1:2, K=3, R=4]`` are considered and +may be allowed as well, depending on the choice for implementation. In addition +to a change in the parser, the index protocol (``__getitem__``, ``__setitem__`` +and ``__delitem__``) will also potentially require adaptation. + +Motivation +========== + +The indexing syntax carries a strong semantic content, differentiating it from +a method call: it implies referring to a subset of data. We believe this +semantic association to be important, and wish to expand the strategies allowed +to refer to this data. + +As a general observation, the number of indices needed by an indexing operation +depends on the dimensionality of the data: one-dimensional data (e.g. a list) +requires one index (e.g. ``a[3]``), two-dimensional data (e.g. a matrix) requires +two indices (e.g. ``a[2,3]``) and so on. Each index is a selector along one of the +axes of the dimensionality, and the position in the index tuple is the +metainformation needed to associate each index to the corresponding axis. + +The current python syntax focuses exclusively on position to express the +association to the axes, and also contains syntactic sugar to refer to +non-punctiform selection (slices) + +:: + + >>> a[3] # returns the fourth element of a + >>> a[1:10:2] # slice notation (extract a non-trivial data subset) + >>> a[3,2] # multiple indexes (for multidimensional arrays) + +The additional notation proposed in this PEP would allow notations involving +keyword arguments in the indexing operation, e.g. + +:: + + >>> a[K=3, R=2] + +which would allow to refer to axes by conventional names. + +One must additionally consider the extended form that allows both positional +and keyword specification + +:: + + >>> a[3,R=3,K=4] + +This PEP will explore different strategies to enable the use of these notations. + +Use cases +========= + +The following practical use cases present two broad categories of usage of a +keyworded specification: Indexing and contextual option. For indexing: + +1. To provide a more communicative meaning to the index, preventing e.g. accidental + inversion of indexes + + :: + + >>> gridValues[x=3, y=5, z=8] + >>> rain[time=0:12, location=location] + +2. In some domain, such as computational physics and chemistry, the use of a + notation such as ``Basis[Z=5]`` is a Domain Specific Language notation to represent + a level of accuracy + + :: + + >>> low_accuracy_energy = computeEnergy(molecule, BasisSet[Z=3]) + + In this case, the index operation would return a basis set at the chosen level + of accuracy (represented by the parameter Z). The reason behind an indexing is that + the BasisSet object could be internally represented as a numeric table, where + rows (the "coefficient" axis, hidden to the user in this example) are associated + to individual elements (e.g. row 0:5 contains coefficients for element 1, + row 5:8 coefficients for element 2) and each column is associated to a given + degree of accuracy ("accuracy" or "Z" axis) so that first column is low + accuracy, second column is medium accuracy and so on. With that indexing, + the user would obtain another object representing the contents of the column + of the internal table for accuracy level 3. + +Additionally, the keyword specification can be used as an option contextual to +the indexing. Specifically: + +1. A "default" option allows to specify a default return value when the index + is not present + + :: + + >>> lst = [1, 2, 3] + >>> value = lst[5, default=0] # value is 0 + +2. For a sparse dataset, to specify an interpolation strategy + to infer a missing point from e.g. its surrounding data. + + :: + + >>> value = array[1, 3, interpolate=spline_interpolator] + +3. A unit could be specified with the same mechanism + + :: + + >>> value = array[1, 3, unit="degrees"] + +How the notation is interpreted is up to the implementing class. + +Current implementation +====================== + +Currently, the indexing operation is handled by methods ``__getitem__``, +``__setitem__`` and ``__delitem__``. These methods' signature accept one argument +for the index (with ``__setitem__`` accepting an additional argument for the set +value). In the following, we will analyze ``__getitem__(self, idx)`` exclusively, +with the same considerations implied for the remaining two methods. + +When an indexing operation is performed, ``__getitem__(self, idx)`` is called. +Traditionally, the full content between square brackets is turned into a single +object passed to argument ``idx``: + + - When a single element is passed, e.g. ``a[2]``, ``idx`` will be ``2``. + - When multiple elements are passed, they must be separated by commas: ``a[2, 3]``. + In this case, ``idx`` will be a tuple ``(2, 3)``. With ``a[2, 3, "hello", {}]`` + ``idx`` will be ``(2, 3, "hello", {})``. + - A slicing notation e.g. ``a[2:10]`` will produce a slice object, or a tuple + containing slice objects if multiple values were passed. + +Except for its unique ability to handle slice notation, the indexing operation +has similarities to a plain method call: it acts like one when invoked with +only one element; If the number of elements is greater than one, the ``idx`` +argument behaves like a ``*args``. However, as stated in the Motivation section, +an indexing operation has the strong semantic implication of extraction of a +subset out of a larger set, which is not automatically associated to a regular +method call unless appropriate naming is chosen. Moreover, its different visual +style is important for readability. + +Specifications +============== + +The implementation should try to preserve the current signature for +``__getitem__``, or modify it in a backward-compatible way. We will present +different alternatives, taking into account the possible cases that need +to be addressed + +:: + + C0. a[1]; a[1,2] # Traditional indexing + C1. a[Z=3] + C2. a[Z=3, R=4] + C3. a[1, Z=3] + C4. a[1, Z=3, R=4] + C5. a[1, 2, Z=3] + C6. a[1, 2, Z=3, R=4] + C7. a[1, Z=3, 2, R=4] # Interposed ordering + +Strategy "Strict dictionary" +---------------------------- + +This strategy acknowledges that ``__getitem__`` is special in accepting only +one object, and the nature of that object must be non-ambiguous in its +specification of the axes: it can be either by order, or by name. As a result +of this assumption, in presence of keyword arguments, the passed entity is a +dictionary and all labels must be specified. + +:: + + C0. a[1]; a[1,2] -> idx = 1; idx = (1, 2) + C1. a[Z=3] -> idx = {"Z": 3} + C2. a[Z=3, R=4] -> idx = {"Z": 3, "R": 4} + C3. a[1, Z=3] -> raise SyntaxError + C4. a[1, Z=3, R=4] -> raise SyntaxError + C5. a[1, 2, Z=3] -> raise SyntaxError + C6. a[1, 2, Z=3, R=4] -> raise SyntaxError + C7. a[1, Z=3, 2, R=4] -> raise SyntaxError + +Pros +'''' + +- Strong conceptual similarity between the tuple case and the dictionary case. + In the first case, we are specifying a tuple, so we are naturally defining + a plain set of values separated by commas. In the second, we are specifying a + dictionary, so we are specifying a homogeneous set of key/value pairs, as + in ``dict(Z=3, R=4)``; +- Simple and easy to parse on the ``__getitem__`` side: if it gets a tuple, + determine the axes using positioning. If it gets a dictionary, use + the keywords. +- C interface does not need changes. + +Neutral +''''''' + +- Degeneracy of ``a[{"Z": 3, "R": 4}]`` with ``a[Z=3, R=4]`` means the notation + is syntactic sugar. + +Cons +'''' + +- Very strict. +- Destroys ordering of the passed arguments. Preserving the + order would be possible with an OrderedDict as drafted by PEP-468 [#PEP-468]_. +- Does not allow use cases with mixed positional/keyword arguments such as + ``a[1, 2, default=5]``. + +Strategy "mixed dictionary" +--------------------------- + +This strategy relaxes the above constraint to return a dictionary containing +both numbers and strings as keys. + +:: + + C0. a[1]; a[1,2] -> idx = 1; idx = (1, 2) + C1. a[Z=3] -> idx = {"Z": 3} + C2. a[Z=3, R=4] -> idx = {"Z": 3, "R": 4} + C3. a[1, Z=3] -> idx = { 0: 1, "Z": 3} + C4. a[1, Z=3, R=4] -> idx = { 0: 1, "Z": 3, "R": 4} + C5. a[1, 2, Z=3] -> idx = { 0: 1, 1: 2, "Z": 3} + C6. a[1, 2, Z=3, R=4] -> idx = { 0: 1, 1: 2, "Z": 3, "R": 4} + C7. a[1, Z=3, 2, R=4] -> idx = { 0: 1, "Z": 3, 2: 2, "R": 4} + +Pros +'''' +- Opens for mixed cases. + +Cons +'''' +- Destroys ordering information for string keys. We have no way of saying if + ``"Z"`` in C7 was in position 1 or 3. +- Implies switching from a tuple to a dict as soon as one specified index + has a keyword argument. May be confusing to parse. + +Strategy "named tuple" +----------------------- + +Return a named tuple for ``idx`` instead of a tuple. Keyword arguments would +obviously have their stated name as key, and positional argument would have an +underscore followed by their order: + +:: + + C0. a[1]; a[1,2] -> idx = 1; idx = (_0=1, _1=2) + C1. a[Z=3] -> idx = (Z=3) + C2. a[Z=3, R=2] -> idx = (Z=3, R=2) + C3. a[1, Z=3] -> idx = (_0=1, Z=3) + C4. a[1, Z=3, R=2] -> idx = (_0=1, Z=3, R=2) + C5. a[1, 2, Z=3] -> idx = (_0=1, _2=2, Z=3) + C6. a[1, 2, Z=3, R=4] -> (_0=1, _1=2, Z=3, R=4) + C7. a[1, Z=3, 2, R=4] -> (_0=1, Z=3, _1=2, R=4) + or (_0=1, Z=3, _2=2, R=4) + or raise SyntaxError + +The required typename of the namedtuple could be ``Index`` or the name of the +argument in the function definition, it keeps the ordering and is easy to +analyse by using the ``_fields`` attribute. It is backward compatible, provided +that C0 with more than one entry now passes a namedtuple instead of a plain +tuple. + +Pros +'''' +- Looks nice. namedtuple transparently replaces tuple and gracefully + degrades to the old behavior. +- Does not require a change in the C interface + +Cons +'''' +- According to some sources [#namedtuple]_ namedtuple is not well developed. + To include it as such important object would probably require rework + and improvement; +- The namedtuple fields, and thus the type, will have to change according + to the passed arguments. This can be a performance bottleneck, and makes + it impossible to guarantee that two subsequent index accesses get the same + Index class; +- the ``_n`` "magic" fields are a bit unusual, but ipython already uses them + for result history. +- Python currently has no builtin namedtuple. The current one is available + in the "collections" module in the standard library. +- Differently from a function, the two notations ``gridValues[x=3, y=5, z=8]`` + and ``gridValues[3,5,8]`` would not gracefully match if the order is modified + at call time (e.g. we ask for ``gridValues[y=5, z=8, x=3])``. In a function, + we can pre-define argument names so that keyword arguments are properly + matched. Not so in ``__getitem__``, leaving the task for interpreting and + matching to ``__getitem__`` itself. + + +Strategy "New argument contents" +-------------------------------- + +In the current implementation, when many arguments are passed to ``__getitem__``, +they are grouped in a tuple and this tuple is passed to ``__getitem__`` as the +single argument ``idx``. This strategy keeps the current signature, but expands the +range of variability in type and contents of ``idx`` to more complex representations. + +We identify four possible ways to implement this strategy: + +- **P1**: uses a single dictionary for the keyword arguments. +- **P2**: uses individual single-item dictionaries. +- **P3**: similar to **P2**, but replaces single-item dictionaries with a ``(key, value)`` tuple. +- **P4**: similar to **P2**, but uses a special and additional new object: ``keyword()`` + +Some of these possibilities lead to degenerate notations, i.e. indistinguishable +from an already possible representation. Once again, the proposed notation +becomes syntactic sugar for these representations. + +Under this strategy, the old behavior for C0 is unchanged. + +:: + + C0: a[1] -> idx = 1 # integer + a[1,2] -> idx = (1,2) # tuple + +In C1, we can use either a dictionary or a tuple to represent key and value pair +for the specific indexing entry. We need to have a tuple with a tuple in C1 +because otherwise we cannot differentiate ``a["Z", 3]`` from ``a[Z=3]``. + +:: + + C1: a[Z=3] -> idx = {"Z": 3} # P1/P2 dictionary with single key + or idx = (("Z", 3),) # P3 tuple of tuples + or idx = keyword("Z", 3) # P4 keyword object + +As you can see, notation P1/P2 implies that ``a[Z=3]`` and ``a[{"Z": 3}]`` will +call ``__getitem__`` passing the exact same value, and is therefore syntactic +sugar for the latter. Same situation occurs, although with different index, for +P3. Using a keyword object as in P4 would remove this degeneracy. + +For the C2 case: + +:: + + C2. a[Z=3, R=4] -> idx = {"Z": 3, "R": 4} # P1 dictionary/ordereddict + or idx = ({"Z": 3}, {"R": 4}) # P2 tuple of two single-key dict + or idx = (("Z", 3), ("R", 4)) # P3 tuple of tuples + or idx = (keyword("Z", 3), + keyword("R", 4) ) # P4 keyword objects + + +P1 naturally maps to the traditional ``**kwargs`` behavior, however it breaks +the convention that two or more entries for the index produce a tuple. P2 +preserves this behavior, and additionally preserves the order. Preserving the +order would also be possible with an OrderedDict as drafted by PEP-468 [#PEP-468]_. + +The remaining cases are here shown: + +:: + + C3. a[1, Z=3] -> idx = (1, {"Z": 3}) # P1/P2 + or idx = (1, ("Z", 3)) # P3 + or idx = (1, keyword("Z", 3)) # P4 + + C4. a[1, Z=3, R=4] -> idx = (1, {"Z": 3, "R": 4}) # P1 + or idx = (1, {"Z": 3}, {"R": 4}) # P2 + or idx = (1, ("Z", 3), ("R", 4)) # P3 + or idx = (1, keyword("Z", 3), + keyword("R", 4)) # P4 + + C5. a[1, 2, Z=3] -> idx = (1, 2, {"Z": 3}) # P1/P2 + or idx = (1, 2, ("Z", 3)) # P3 + or idx = (1, 2, keyword("Z", 3)) # P4 + + C6. a[1, 2, Z=3, R=4] -> idx = (1, 2, {"Z":3, "R": 4}) # P1 + or idx = (1, 2, {"Z": 3}, {"R": 4}) # P2 + or idx = (1, 2, ("Z", 3), ("R", 4)) # P3 + or idx = (1, 2, keyword("Z", 3), + keyword("R", 4)) # P4 + + C7. a[1, Z=3, 2, R=4] -> idx = (1, 2, {"Z": 3, "R": 4}) # P1. Pack the keyword arguments. Ugly. + or raise SyntaxError # P1. Same behavior as in function calls. + or idx = (1, {"Z": 3}, 2, {"R": 4}) # P2 + or idx = (1, ("Z", 3), 2, ("R", 4)) # P3 + or idx = (1, keyword("Z", 3), + 2, keyword("R", 4)) # P4 + +Pros +'''' +- Signature is unchanged; +- P2/P3 can preserve ordering of keyword arguments as specified at indexing, +- P1 needs an OrderedDict, but would destroy interposed ordering if allowed: + all keyword indexes would be dumped into the dictionary; +- Stays within traditional types: tuples and dicts. Evt. OrderedDict; +- Some proposed strategies are similar in behavior to a traditional function call; +- The C interface for ``PyObject_GetItem`` and family would remain unchanged. + +Cons +'''' +- Apparenty complex and wasteful; +- Degeneracy in notation (e.g. ``a[Z=3]`` and ``a[{"Z":3}]`` are equivalent and + indistinguishable notations at the ``__[get|set|del]item__`` level). + This behavior may or may not be acceptable. +- for P4, an additional object similar in nature to slice() is needed, + but only to disambiguate the above degeneracy. +- ``idx`` type and layout seems to change depending on the whims of the caller; +- May be complex to parse what is passed, especially in the case of tuple of tuples; +- P2 Creates a lot of single keys dictionary as members of a tuple. Looks ugly. + P3 would be lighter and easier to use than the tuple of dicts, and still + preserves order (unlike the regular dict), but would result in clumsy + extraction of keywords. + +Strategy "kwargs argument" +--------------------------- + +``__getitem__`` accepts an optional ``**kwargs`` argument which should be keyword only. +``idx`` also becomes optional to support a case where no non-keyword arguments are allowed. +The signature would then be either + +:: + + __getitem__(self, idx) + __getitem__(self, idx, **kwargs) + __getitem__(self, **kwargs) + +Applied to our cases would produce: + +:: + + C0. a[1,2] -> idx=(1,2); kwargs={} + C1. a[Z=3] -> idx=None ; kwargs={"Z":3} + C2. a[Z=3, R=4] -> idx=None ; kwargs={"Z":3, "R":4} + C3. a[1, Z=3] -> idx=1 ; kwargs={"Z":3} + C4. a[1, Z=3, R=4] -> idx=1 ; kwargs={"Z":3, "R":4} + C5. a[1, 2, Z=3] -> idx=(1,2); kwargs={"Z":3} + C6. a[1, 2, Z=3, R=4] -> idx=(1,2); kwargs={"Z":3, "R":4} + C7. a[1, Z=3, 2, R=4] -> raise SyntaxError # in agreement to function behavior + +Empty indexing ``a[]`` of course remains invalid syntax. + +Pros +'''' +- Similar to function call, evolves naturally from it; +- Use of keyword indexing with an object whose ``__getitem__`` + doesn't have a kwargs will fail in an obvious way. + That's not the case for the other strategies. + +Cons +'''' +- It doesn't preserve order, unless an OrderedDict is used; +- Forbids C7, but is it really needed? +- Requires a change in the C interface to pass an additional + PyObject for the keyword arguments. + + +C interface +=========== + +As briefly introduced in the previous analysis, the C interface would +potentially have to change to allow the new feature. Specifically, +``PyObject_GetItem`` and related routines would have to accept an additional +``PyObject *kw`` argument for Strategy "kwargs argument". The remaining +strategies would not require a change in the C function signatures, but the +different nature of the passed object would potentially require adaptation. + +Strategy "named tuple" would behave correctly without any change: the class +returned by the factory method in collections returns a subclass of tuple, +meaning that ``PyTuple_*`` functions can handle the resulting object. + +Alternative Solutions +===================== + +In this section, we present alternative solutions that would workaround the +missing feature and make the proposed enhancement not worth of implementation. + +Use a method +------------ + +One could keep the indexing as is, and use a traditional ``get()`` method for those +cases where basic indexing is not enough. This is a good point, but as already +reported in the introduction, methods have a different semantic weight from +indexing, and you can't use slices directly in methods. Compare e.g. +``a[1:3, Z=2]`` with ``a.get(slice(1,3), Z=2)``. + +The authors however recognize this argument as compelling, and the advantage +in semantic expressivity of a keyword-based indexing may be offset by a rarely +used feature that does not bring enough benefit and may have limited adoption. + +Emulate requested behavior by abusing the slice object +------------------------------------------------------ + +This extremely creative method exploits the slice objects' behavior, provided +that one accepts to use strings (or instantiate properly named placeholder +objects for the keys), and accept to use ":" instead of "=". + +:: + + >>> a["K":3] + slice('K', 3, None) + >>> a["K":3, "R":4] + (slice('K', 3, None), slice('R', 4, None)) + >>> + +While clearly smart, this approach does not allow easy inquire of the key/value +pair, it's too clever and esotheric, and does not allow to pass a slice as in +``a[K=1:10:2]``. + +However, Tim Delaney comments + + "I really do think that ``a[b=c, d=e]`` should just be syntax sugar for + ``a['b':c, 'd':e]``. It's simple to explain, and gives the greatest backwards + compatibility. In particular, libraries that already abused slices in this + way will just continue to work with the new syntax." + +We think this behavior would produce inconvenient results. The library Pandas uses +strings as labels, allowing notation such as + +:: + + >>> a[:, "A":"F"] + +to extract data from column "A" to column "F". Under the above comment, this notation +would be equally obtained with + +:: + + >>> a[:, A="F"] + +which is weird and collides with the intended meaning of keyword in indexing, that +is, specifying the axis through conventional names rather than positioning. + +Pass a dictionary as an additional index +---------------------------------------- + +:: + + >>> a[1, 2, {"K": 3}] + +this notation, although less elegant, can already be used and achieves similar +results. It's evident that the proposed Strategy "New argument contents" can be +interpreted as syntactic sugar for this notation. + +Additional Comments +=================== + +Commenters also expressed the following relevant points: + +Relevance of ordering of keyword arguments +------------------------------------------ + +As part of the discussion of this PEP, it's important to decide if the ordering +information of the keyword arguments is important, and if indexes and keys can +be ordered in an arbitrary way (e.g. ``a[1,Z=3,2,R=4]``). PEP-468 [#PEP-468]_ +tries to address the first point by proposing the use of an ordereddict, +however one would be inclined to accept that keyword arguments in indexing are +equivalent to kwargs in function calls, and therefore as of today equally +unordered, and with the same restrictions. + +Need for homogeneity of behavior +-------------------------------- + +Relative to Strategy "New argument contents", a comment from Ian Cordasco +points out that + + "it would be unreasonable for just one method to behave totally + differently from the standard behaviour in Python. It would be confusing for + only ``__getitem__`` (and ostensibly, ``__setitem__``) to take keyword + arguments but instead of turning them into a dictionary, turn them into + individual single-item dictionaries." We agree with his point, however it must + be pointed out that ``__getitem__`` is already special in some regards when it + comes to passed arguments. + +Chris Angelico also states: + + "it seems very odd to start out by saying "here, let's give indexing the + option to carry keyword args, just like with function calls", and then come + back and say "oh, but unlike function calls, they're inherently ordered and + carried very differently"." Again, we agree on this point. The most + straightforward strategy to keep homogeneity would be Strategy "kwargs + argument", opening to a ``**kwargs`` argument on ``__getitem__``. + +One of the authors (Stefano Borini) thinks that only the "strict dictionary" +strategy is worth of implementation. It is non-ambiguous, simple, does not +force complex parsing, and addresses the problem of referring to axes either +by position or by name. The "options" use case is probably best handled with +a different approach, and may be irrelevant for this PEP. The alternative +"named tuple" is another valid choice. + +Having .get() become obsolete for indexing with default fallback +---------------------------------------------------------------- + +Introducing a "default" keyword could make ``dict.get()`` obsolete, which would be +replaced by ``d["key", default=3]``. Chris Angelico however states: + + "Currently, you need to write ``__getitem__`` (which raises an exception on + finding a problem) plus something else, e.g. ``get()``, which returns a default + instead. By your proposal, both branches would go inside ``__getitem__``, which + means they could share code; but there still need to be two branches." + +Additionally, Chris continues: + + "There'll be an ad-hoc and fairly arbitrary puddle of names (some will go + ``default=``, others will say that's way too long and go ``def=``, except that + that's a keyword so they'll use ``dflt=`` or something...), unless there's a + strong force pushing people to one consistent name.". + +This argument is valid but it's equally valid for any function call, and is +generally fixed by established convention and documentation. + +On degeneracy of notation +------------------------- + +User Drekin commented: "The case of ``a[Z=3]`` and ``a[{"Z": 3}]`` is similar to +current ``a[1, 2]`` and ``a[(1, 2)]``. Even though one may argue that the parentheses +are actually not part of tuple notation but are just needed because of syntax, +it may look as degeneracy of notation when compared to function call: ``f(1, 2)`` +is not the same thing as ``f((1, 2))``.". + +References +========== + +.. [#keyword-1] "keyword-only args in __getitem__" + (http://article.gmane.org/gmane.comp.python.ideas/27584) + +.. [#keyword-2] "Accepting keyword arguments for __getitem__" + (https://mail.python.org/pipermail/python-ideas/2014-June/028164.html) + +.. [#keyword-3] "PEP pre-draft: Support for indexing with keyword arguments" + https://mail.python.org/pipermail/python-ideas/2014-July/028250.html + +.. [#namedtuple] "namedtuple is not as good as it should be" + (https://mail.python.org/pipermail/python-ideas/2013-June/021257.html) + +.. [#PEP-468] "Preserving the order of \*\*kwargs in a function." + http://legacy.python.org/dev/peps/pep-0468/ + +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 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Jul 14 08:08:08 2014 From: python-checkins at python.org (terry.reedy) Date: Mon, 14 Jul 2014 08:08:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE3NTA2?= =?utf-8?q?=3A_Synchronize_Misc/NEWS_and_idlelib/NEWS=2Etxt_for_2=2E7=2E?= Message-ID: <3hBZCr2Xbrz7LjR@mail.python.org> http://hg.python.org/cpython/rev/aa059a8fb55a changeset: 91671:aa059a8fb55a branch: 2.7 parent: 91668:b6c5719e0f4e user: Terry Jan Reedy date: Mon Jul 14 02:07:26 2014 -0400 summary: Issue #17506: Synchronize Misc/NEWS and idlelib/NEWS.txt for 2.7. files: Lib/idlelib/NEWS.txt | 298 +++++++++++++++++++++++++++++- Misc/NEWS | 54 +++++ 2 files changed, 333 insertions(+), 19 deletions(-) diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -1,6 +1,151 @@ +What's New in IDLE 2.7.9? +========================= + +What's New in IDLE 2.7.8? +========================= + +*Release date: 2014-06-29* + +- Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav + Heblikar. + +- Issue #18592: Add unittest for SearchDialogBase. Patch by Phil Webster. + +- Issue #21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar. + +- Issue #21686: add unittest for HyperParser. Original patch by Saimadhav + Heblikar. + +- Issue #12387: Add missing upper(lower)case versions of default Windows key + bindings for Idle so Caps Lock does not disable them. Patch by Roger Serwy. + +- Issue #21695: Closing a Find-in-files output window while the search is + still in progress no longer closes Idle. + +- Issue #18910: Add unittest for textView. Patch by Phil Webster. + +- Issue #18292: Add unittest for AutoExpand. Patch by Saihadhav Heblikar. + +- Issue #18409: Add unittest for AutoComplete. Patch by Phil Webster. + + +What's New in IDLE 2.7.7? +========================= + +*Release date: 2014-05-31* + +- Issue #18104: Add idlelib/idle_test/htest.py with a few sample tests to begin + consolidating and improving human-validated tests of Idle. Change other files + as needed to work with htest. Running the module as __main__ runs all tests. + +- Issue #21139: Change default paragraph width to 72, the PEP 8 recommendation. + +- Issue #21284: Paragraph reformat test passes after user changes reformat width. + +- Issue #20406: Use Python application icons for Idle window title bars. + Patch mostly by Serhiy Storchaka. + +- Issue #21029: Occurrences of "print" are now consistently colored as + being a keyword (the colorizer doesn't know if print functions are + enabled in the source). + +- Issue #17721: Remove non-functional configuration dialog help button until we + make it actually gives some help when clicked. Patch by Guilherme Sim?es. + +- Issue #17390: Add Python version to Idle editor window title bar. + Original patches by Edmond Burnett and Kent Johnson. + +- Issue #20058: sys.stdin.readline() in IDLE now always returns only one line. + +- Issue #19481: print() of unicode, str or bytearray subclass instance in IDLE + no more hangs. + +- Issue #18270: Prevent possible IDLE AttributeError on OS X when no initial + shell window is present. + +- Issue #17654: Ensure IDLE menus are customized properly on OS X for + non-framework builds and for all variants of Tk. + + +What's New in IDLE 2.7.6? +========================= + +*Release date: 2013-11-10* + +- Issue #19426: Fixed the opening of Python source file with specified encoding. + +- Issue #18873: IDLE now detects Python source code encoding only in comment + lines. + +- Issue #18988: The "Tab" key now works when a word is already autocompleted. + +- Issue #18489: Add tests for SearchEngine. Original patch by Phil Webster. + +- Issue #18429: Format / Format Paragraph, now works when comment blocks + are selected. As with text blocks, this works best when the selection + only includes complete lines. + +- Issue #18226: Add docstrings and unittests for FormatParagraph.py. + Original patches by Todd Rovito and Phil Webster. + +- Issue #18279: Format - Strip trailing whitespace no longer marks a file as + changed when it has not been changed. This fix followed the addition of a + test file originally written by Phil Webster (the issue's main goal). + +- Issue #18539: Calltips now work for float default arguments. + +- Issue #7136: In the Idle File menu, "New Window" is renamed "New File". + Patch by Tal Einat, Roget Serwy, and Todd Rovito. + +- Issue #8515: Set __file__ when run file in IDLE. + Initial patch by Bruce Frederiksen. + +- Issue #5492: Avoid traceback when exiting IDLE caused by a race condition. + +- Issue #17511: Keep IDLE find dialog open after clicking "Find Next". + Original patch by Sarah K. + +- Issue #15392: Create a unittest framework for IDLE. + Preliminary patch by Rajagopalasarma Jayakrishnan + See Lib/idlelib/idle_test/README.txt for how to run Idle tests. + +- Issue #14146: Highlight source line while debugging on Windows. + +- Issue #17532: Always include Options menu for IDLE on OS X. + Patch by Guilherme Sim?es. + + What's New in IDLE 2.7.5? ========================= +*Release date: 2013-05-12* + +- Issue #17838: Allow sys.stdin to be reassigned. + +- Issue #14735: Update IDLE docs to omit "Control-z on Windows". + +- Issue #17585: Fixed IDLE regression. Now closes when using exit() or quit(). + +- Issue #17657: Show full Tk version in IDLE's about dialog. + Patch by Todd Rovito. + +- Issue #17613: Prevent traceback when removing syntax colorizer in IDLE. + +- Issue #1207589: Backwards-compatibility patch for right-click menu in IDLE. + +- Issue #16887: IDLE now accepts Cancel in tabify/untabify dialog box. + +- Issue #14254: IDLE now handles readline correctly across shell restarts. + +- Issue #17614: IDLE no longer raises exception when quickly closing a file. + +- Issue #6698: IDLE now opens just an editor window when configured to do so. + +- Issue #8900: Using keyboard shortcuts in IDLE to open a file no longer + raises an exception. + +- Issue #6649: Fixed missing exit status in IDLE. Patch by Guilherme Polo. + - Issue #17390: Display Python version on Idle title bar. Initial patch by Edmond Burnett. @@ -8,17 +153,67 @@ What's New in IDLE 2.7.4? ========================= +*Release date: 2013-04-06* + +- Issue #17625: In IDLE, close the replace dialog after it is used. + +- IDLE was displaying spurious SystemExit tracebacks when running scripts + that terminated by raising SystemExit (i.e. unittest and turtledemo). + +- Issue #9290: In IDLE the sys.std* streams now implement io.TextIOBase + interface and support all mandatory methods and properties. + +- Issue #16829: IDLE printing no longer fails if there are spaces or other + special characters in the file path. + +- Issue #16819: IDLE method completion now correctly works for unicode literals. + +- Issue #16504: IDLE now catches SyntaxErrors raised by tokenizer. Patch by + Roger Serwy. + +- Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu + Patch by Todd Rovito. + +- Issue #13052: Fix IDLE crashing when replace string in Search/Replace dialog + ended with '\'. Patch by Roger Serwy. + +- Issue #9803: Don't close IDLE on saving if breakpoint is open. + Patch by Roger Serwy. + +- Issue #14958: Change IDLE systax highlighting to recognize all string and byte + literals currently supported in Python 2.7. + +- Issue #14962: Update text coloring in IDLE shell window after changing + options. Patch by Roger Serwy. + +- Issue #10997: Prevent a duplicate entry in IDLE's "Recent Files" menu. + +- Issue #12510: Attempting to get invalid tooltip no longer closes IDLE. + Original patch by Roger Serwy. + +- Issue #10365: File open dialog now works instead of crashing + even when parent window is closed. Patch by Roger Serwy. + +- Issue #14876: Use user-selected font for highlight configuration. + Patch by Roger Serwy. + +- Issue #14409: IDLE now properly executes commands in the Shell window + when it cannot read the normal config files on startup and + has to use the built-in default key bindings. + There was previously a bug in one of the defaults. + +- Issue #3573: IDLE hangs when passing invalid command line args + (directory(ies) instead of file(s)) (Patch by Guilherme Polo) + +- Issue #5219: Prevent event handler cascade in IDLE. + - Issue #15318: Prevent writing to sys.stdin. - Issue #13532, #15319: Check that arguments to sys.stdout.write are strings. -- Issue # 12510: Attempt to get certain tool tips no longer crashes IDLE. - -- Issue10365: File open dialog now works instead of crashing even when +- Issue #10365: File open dialog now works instead of crashing even when parent window is closed while dialog is open. -- Issue 14876: use user-selected font for highlight configuration. - - Issue #14018: Update checks for unstable system Tcl/Tk versions on OS X to include versions shipped with OS X 10.7 and 10.8 in addition to 10.6. @@ -29,6 +224,27 @@ What's New in IDLE 2.7.3? ========================= +*Release date: 2012-04-09* + +- Issue #964437 Make IDLE help window non-modal. + Patch by Guilherme Polo and Roger Serwy. + +- Issue #13933: IDLE auto-complete did not work with some imported + module, like hashlib. (Patch by Roger Serwy) + +- Issue #13506: Add '' to path for IDLE Shell when started and restarted with Restart Shell. + Original patches by Marco Scataglini and Roger Serwy. + +- Issue #4625: If IDLE cannot write to its recent file or breakpoint + files, display a message popup and continue rather than crash. + (original patch by Roger Serwy) + +- Issue #8793: Prevent IDLE crash when given strings with invalid hex escape + sequences. + +- Issue #13296: Fix IDLE to clear compile __future__ flags on shell restart. + (Patch by Roger Serwy) + - Issue #14409: IDLE now properly executes commands in the Shell window when it cannot read the normal config files on startup and has to use the built-in default key bindings. @@ -41,41 +257,85 @@ What's New in IDLE 2.7.2? ========================= -*Release date: 29-May-2011* +*Release date: 2011-06-11* + +- Issue #11718: IDLE's open module dialog couldn't find the __init__.py + file in a package. + +- Issue #12590: IDLE editor window now always displays the first line + when opening a long file. With Tk 8.5, the first line was hidden. + +- Issue #11088: don't crash when using F5 to run a script in IDLE on MacOSX + with Tk 8.5. + +- Issue #10940: Workaround an IDLE hang on Mac OS X 10.6 when using the + menu accelerators for Open Module, Go to Line, and New Indent Width. + The accelerators still work but no longer appear in the menu items. + +- Issue #10907: Warn OS X 10.6 IDLE users to use ActiveState Tcl/Tk 8.5, rather + than the currently problematic Apple-supplied one, when running with the + 64-/32-bit installer variant. + +- Issue #11052: Correct IDLE menu accelerators on Mac OS X for Save + commands. + +- Issue #6075: IDLE on Mac OS X now works with both Carbon AquaTk and + Cocoa AquaTk. + +- Issue #10404: Use ctl-button-1 on OSX for the context menu in Idle. + +- Issue #10107: Warn about unsaved files in IDLE on OSX. + +- Issue #10406: Enable Rstrip IDLE extension on OSX (just like on other + platforms). - Issue #6378: Further adjust idle.bat to start associated Python - Issue #11896: Save on Close failed despite selecting "Yes" in dialog. -- toggle failing on Tk 8.5, causing IDLE exits and strange selection - behavior. Issue 4676. Improve selection extension behaviour. +- Issue #4676: toggle failing on Tk 8.5, causing IDLE exits and + strange selection behavior. Improve selection extension behaviour. -- toggle non-functional when NumLock set on Windows. Issue 3851. +- Issue #3851 toggle non-functional when NumLock set on Windows. + + +What's New in Python 2.7.1? +=========================== + +*Release date: 2010-11-27* + +- Issue #6378: idle.bat now runs with the appropriate Python version rather than + the system default. Patch by Sridhar Ratnakumar. What's New in IDLE 2.7? ======================= -*Release date: 07-03-2010* +*Release date: 2010-07-03* + +- Issue #5150: IDLE's format menu now has an option to strip trailing + whitespace. + +- Issue #5847: Remove -n switch on "Edit with IDLE" menu item. - idle.py modified and simplified to better support developing experimental versions of IDLE which are not installed in the standard location. -- OutputWindow/PyShell right click menu "Go to file/line" wasn't working with - file paths containing spaces. Bug 5559. +- Issue #5559: OutputWindow/PyShell right click menu "Go to file/line" + wasn't working with file paths containing spaces. -- Windows: Version string for the .chm help file changed, file not being - accessed Patch 5783 Guilherme Polo +- Issue #5783: Windows: Version string for the .chm help file changed, + file not being accessed Patch by Guilherme Polo/ -- Allow multiple IDLE GUI/subprocess pairs to exist simultaneously. Thanks to - David Scherer for suggesting the use of an ephemeral port for the GUI. - Patch 1529142 Weeble. +- Issue #1529142: Allow multiple IDLE GUI/subprocess pairs to exist + simultaneously. Thanks to David Scherer for suggesting the use of an + ephemeral port for the GUI. Patch by Weeble. - Remove port spec from run.py and fix bug where subprocess fails to extract port from command line when warnings are present. -- Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr to handle - mixed space/tab properly. Issue 5129, patch by Guilherme Polo. +- Issue #5129: Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr + to handle mixed space/tab properly. Patch by Guilherme Polo. - Issue #3549: On MacOS the preferences menu was not present diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1212,6 +1212,9 @@ - Issue #6649: Fixed missing exit status in IDLE. Patch by Guilherme Polo. +- Issue #17390: Display Python version on Idle title bar. + Initial patch by Edmond Burnett. + Documentation ------------- @@ -2093,6 +2096,19 @@ - Issue #5219: Prevent event handler cascade in IDLE. +- Issue #15318: Prevent writing to sys.stdin. + +- Issue #13532, #15319: Check that arguments to sys.stdout.write are strings. + +- Issue #10365: File open dialog now works instead of crashing even when + parent window is closed while dialog is open. + +- Issue #14018: Update checks for unstable system Tcl/Tk versions on OS X + to include versions shipped with OS X 10.7 and 10.8 in addition to 10.6. + +- Issue #15853: Prevent IDLE crash on OS X when opening Preferences menu + with certain versions of Tk 8.5. Initial patch by Kevin Walzer. + Tests ----- @@ -2847,6 +2863,14 @@ - Issue #13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) +- Issue #14409: IDLE now properly executes commands in the Shell window + when it cannot read the normal config files on startup and + has to use the built-in default key bindings. + There was previously a bug in one of the defaults. + +- Issue #3573: IDLE hangs when passing invalid command line args + (directory(ies) instead of file(s)). + Build ----- @@ -3416,6 +3440,15 @@ - Issue #10406: Enable Rstrip IDLE extension on OSX (just like on other platforms). +- Issue #6378: Further adjust idle.bat to start associated Python + +- Issue #11896: Save on Close failed despite selecting "Yes" in dialog. + +- Issue #4676: toggle failing on Tk 8.5, causing IDLE exits and + strange selection behavior. Improve selection extension behaviour. + +- Issue #3851 toggle non-functional when NumLock set on Windows. + Build ----- @@ -6863,6 +6896,27 @@ - Issue #5847: Remove -n switch on "Edit with IDLE" menu item. +- idle.py modified and simplified to better support developing experimental + versions of IDLE which are not installed in the standard location. + +- Issue #5559: OutputWindow/PyShell right click menu "Go to file/line" + wasn't working with file paths containing spaces. + +- Issue #5783: Windows: Version string for the .chm help file changed, + file not being accessed Patch by Guilherme Polo/ + +- Issue #1529142: Allow multiple IDLE GUI/subprocess pairs to exist + simultaneously. Thanks to David Scherer for suggesting the use of an + ephemeral port for the GUI. Patch by Weeble. + +- Remove port spec from run.py and fix bug where subprocess fails to + extract port from command line when warnings are present. + +- Issue #5129: Tk 8.5 Text widget requires 'wordprocessor' tabstyle attr + to handle mixed space/tab properly. Patch by Guilherme Polo. + +- Issue #3549: On MacOS the preferences menu was not present + Tools/Demos ----------- -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Jul 14 09:16:04 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 14 Jul 2014 09:16:04 +0200 Subject: [Python-checkins] Daily reference leaks (dac25d8ac95a): sum=-3 Message-ID: results for dac25d8ac95a on branch "default" -------------------------------------------- test_collections leaked [-2, 0, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [-2, 2, -2] references, sum=-2 test_site leaked [-2, 2, -2] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogE_Wskx', '-x'] From python-checkins at python.org Mon Jul 14 10:52:52 2014 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 14 Jul 2014 10:52:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgMjE5Nzc6?= =?utf-8?q?__Minor_improvements_to_the_regexes_in_the_tokenizer_example=2E?= Message-ID: <3hBdsw0vDZz7LjM@mail.python.org> http://hg.python.org/cpython/rev/bb28542af060 changeset: 91672:bb28542af060 branch: 3.4 parent: 91669:407110796b16 user: Raymond Hettinger date: Mon Jul 14 01:52:00 2014 -0700 summary: Issue 21977: Minor improvements to the regexes in the tokenizer example. files: Doc/library/re.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1340,9 +1340,9 @@ ('ASSIGN', r':='), # Assignment operator ('END', r';'), # Statement terminator ('ID', r'[A-Za-z]+'), # Identifiers - ('OP', r'[+*\/\-]'), # Arithmetic operators + ('OP', r'[+\-*/]'), # Arithmetic operators ('NEWLINE', r'\n'), # Line endings - ('SKIP', r'[ \t]'), # Skip over spaces and tabs + ('SKIP', r'[ \t]+'), # Skip over spaces and tabs ] tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification) get_token = re.compile(tok_regex).match -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 10:52:53 2014 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 14 Jul 2014 10:52:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3hBdsx2Zdbz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/b66f81069bc3 changeset: 91673:b66f81069bc3 parent: 91670:dac25d8ac95a parent: 91672:bb28542af060 user: Raymond Hettinger date: Mon Jul 14 01:52:44 2014 -0700 summary: merge files: Doc/library/re.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1340,9 +1340,9 @@ ('ASSIGN', r':='), # Assignment operator ('END', r';'), # Statement terminator ('ID', r'[A-Za-z]+'), # Identifiers - ('OP', r'[+*\/\-]'), # Arithmetic operators + ('OP', r'[+\-*/]'), # Arithmetic operators ('NEWLINE', r'\n'), # Line endings - ('SKIP', r'[ \t]'), # Skip over spaces and tabs + ('SKIP', r'[ \t]+'), # Skip over spaces and tabs ] tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification) get_token = re.compile(tok_regex).match -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 11:21:29 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Jul 2014 11:21:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2FsbCBQeUVycl9O?= =?utf-8?q?oMemory=28=29_when_PyMem=5FMalloc=28=29_fails=2E?= Message-ID: <3hBfVx5F6qz7LjM@mail.python.org> http://hg.python.org/cpython/rev/1c42f1ff2439 changeset: 91674:1c42f1ff2439 branch: 2.7 parent: 91671:aa059a8fb55a user: Serhiy Storchaka date: Mon Jul 14 12:20:01 2014 +0300 summary: Call PyErr_NoMemory() when PyMem_Malloc() fails. files: Modules/_tkinter.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -468,8 +468,10 @@ const char *e = s + size; PyErr_Clear(); q = buf = (char *)PyMem_Malloc(size); - if (buf == NULL) + if (buf == NULL) { + PyErr_NoMemory(); return NULL; + } while (s != e) { if (s + 1 != e && s[0] == '\xc0' && s[1] == '\x80') { *q++ = '\0'; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 11:21:30 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Jul 2014 11:21:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQ2FsbCBQeUVycl9O?= =?utf-8?q?oMemory=28=29_when_PyMem=5FMalloc=28=29_fails=2E?= Message-ID: <3hBfVy715Nz7LjM@mail.python.org> http://hg.python.org/cpython/rev/b57b4e3b83ff changeset: 91675:b57b4e3b83ff branch: 3.4 parent: 91672:bb28542af060 user: Serhiy Storchaka date: Mon Jul 14 12:20:15 2014 +0300 summary: Call PyErr_NoMemory() when PyMem_Malloc() fails. files: Modules/_tkinter.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -339,8 +339,10 @@ const char *e = s + size; PyErr_Clear(); q = buf = (char *)PyMem_Malloc(size); - if (buf == NULL) + if (buf == NULL) { + PyErr_NoMemory(); return NULL; + } while (s != e) { if (s + 1 != e && s[0] == '\xc0' && s[1] == '\x80') { *q++ = '\0'; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 11:21:32 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Mon, 14 Jul 2014 11:21:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Call_PyErr=5FNoMemory=28=29_when_PyMem=5FMalloc=28=29_fa?= =?utf-8?q?ils=2E?= Message-ID: <3hBfW01h1zz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/bdf04552f4df changeset: 91676:bdf04552f4df parent: 91673:b66f81069bc3 parent: 91675:b57b4e3b83ff user: Serhiy Storchaka date: Mon Jul 14 12:20:49 2014 +0300 summary: Call PyErr_NoMemory() when PyMem_Malloc() fails. files: Modules/_tkinter.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -339,8 +339,10 @@ const char *e = s + size; PyErr_Clear(); q = buf = (char *)PyMem_Malloc(size); - if (buf == NULL) + if (buf == NULL) { + PyErr_NoMemory(); return NULL; + } while (s != e) { if (s + 1 != e && s[0] == '\xc0' && s[1] == '\x80') { *q++ = '\0'; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 18:37:30 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 14 Jul 2014 18:37:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3hBrB261Wnz7LjM@mail.python.org> http://hg.python.org/cpython/rev/3027bf42e29c changeset: 91677:3027bf42e29c branch: 3.4 parent: 91675:b57b4e3b83ff user: Victor Stinner date: Mon Jul 14 18:33:40 2014 +0200 summary: asyncio: sync with Tulip * Tulip issue #184: Log subprocess events in debug mode - Log stdin, stdout and stderr transports and protocols - Log process identifier (pid) - Log connection of pipes - Log process exit - Log Process.communicate() tasks: feed stdin, read stdout and stderr - Add __repr__() method to many classes related to subprocesses * Add BaseSubprocessTransport._pid attribute. Store the pid so it is still accessible after the process exited. It's more convinient for debug. * create_connection(): add the socket in the "connected to" debug log * Clean up some docstrings and comments. Remove unused unimplemented _read_from_self(). files: Lib/asyncio/base_events.py | 131 +++++++-- Lib/asyncio/base_subprocess.py | 40 ++- Lib/asyncio/streams.py | 12 + Lib/asyncio/subprocess.py | 26 + Lib/asyncio/unix_events.py | 13 +- Lib/test/test_asyncio/test_base_events.py | 2 - 6 files changed, 181 insertions(+), 43 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1,7 +1,7 @@ """Base implementation of event loop. The event loop can be broken up into a multiplexer (the part -responsible for notifying us of IO events) and the event loop proper, +responsible for notifying us of I/O events) and the event loop proper, which wraps a multiplexer with functionality for scheduling callbacks, immediately or at a given time in the future. @@ -50,6 +50,15 @@ return str(handle) +def _format_pipe(fd): + if fd == subprocess.PIPE: + return '' + elif fd == subprocess.STDOUT: + return '' + else: + return repr(fd) + + class _StopError(BaseException): """Raised to stop the event loop.""" @@ -70,7 +79,7 @@ type_mask |= socket.SOCK_NONBLOCK if hasattr(socket, 'SOCK_CLOEXEC'): type_mask |= socket.SOCK_CLOEXEC - # Use getaddrinfo(AI_NUMERICHOST) to ensure that the address is + # Use getaddrinfo(flags=AI_NUMERICHOST) to ensure that the address is # already resolved. try: socket.getaddrinfo(host, port, @@ -158,7 +167,8 @@ def create_task(self, coro): """Schedule a coroutine object. - Return a task object.""" + Return a task object. + """ task = tasks.Task(coro, loop=self) if task._source_traceback: del task._source_traceback[-1] @@ -197,12 +207,13 @@ """Create subprocess transport.""" raise NotImplementedError - def _read_from_self(self): - """XXX""" - raise NotImplementedError + def _write_to_self(self): + """Write a byte to self-pipe, to wake up the event loop. - def _write_to_self(self): - """XXX""" + This may be called from a different thread. + + The subclass is responsible for implementing the self-pipe. + """ raise NotImplementedError def _process_events(self, event_list): @@ -233,7 +244,7 @@ If the argument is a coroutine, it is wrapped in a Task. - XXX TBD: It would be disastrous to call run_until_complete() + WARNING: It would be disastrous to call run_until_complete() with the same coroutine twice -- it would wrap it in two different Tasks and that can't be good. @@ -261,7 +272,7 @@ Every callback scheduled before stop() is called will run. Callback scheduled after stop() is called won't. However, - those callbacks will run if run() is called again later. + those callbacks will run if run_*() is called again later. """ self.call_soon(_raise_stop_error) @@ -274,7 +285,7 @@ The event loop must not be running. """ if self._running: - raise RuntimeError("cannot close a running event loop") + raise RuntimeError("Cannot close a running event loop") if self._closed: return if self._debug: @@ -292,11 +303,16 @@ return self._closed def is_running(self): - """Returns running status of event loop.""" + """Returns True if the event loop is running.""" return self._running def time(self): - """Return the time according to the event loop's clock.""" + """Return the time according to the event loop's clock. + + This is a float expressed in seconds since an epoch, but the + epoch, precision, accuracy and drift are unspecified and may + differ per event loop. + """ return time.monotonic() def call_later(self, delay, callback, *args): @@ -306,7 +322,7 @@ can be used to cancel the call. The delay can be an int or float, expressed in seconds. It is - always a relative time. + always relative to the current time. Each callback will be called exactly once. If two callbacks are scheduled for exactly the same time, it undefined which @@ -321,7 +337,10 @@ return timer def call_at(self, when, callback, *args): - """Like call_later(), but uses an absolute time.""" + """Like call_later(), but uses an absolute time. + + Absolute time corresponds to the event loop's time() method. + """ if coroutines.iscoroutinefunction(callback): raise TypeError("coroutines cannot be used with call_at()") if self._debug: @@ -335,7 +354,7 @@ def call_soon(self, callback, *args): """Arrange for a callback to be called as soon as possible. - This operates as a FIFO queue, callbacks are called in the + This operates as a FIFO queue: callbacks are called in the order in which they are registered. Each callback will be called exactly once. @@ -361,10 +380,10 @@ def _assert_is_current_event_loop(self): """Asserts that this event loop is the current event loop. - Non-threadsafe methods of this class make this assumption and will + Non-thread-safe methods of this class make this assumption and will likely behave incorrectly when the assumption is violated. - Should only be called when (self._debug == True). The caller is + Should only be called when (self._debug == True). The caller is responsible for checking this condition for performance reasons. """ try: @@ -373,11 +392,11 @@ return if current is not self: raise RuntimeError( - "non-threadsafe operation invoked on an event loop other " + "Non-thread-safe operation invoked on an event loop other " "than the current one") def call_soon_threadsafe(self, callback, *args): - """Like call_soon(), but thread safe.""" + """Like call_soon(), but thread-safe.""" handle = self._call_soon(callback, args, check_loop=False) if handle._source_traceback: del handle._source_traceback[-1] @@ -386,7 +405,7 @@ def run_in_executor(self, executor, callback, *args): if coroutines.iscoroutinefunction(callback): - raise TypeError("coroutines cannot be used with run_in_executor()") + raise TypeError("Coroutines cannot be used with run_in_executor()") if isinstance(callback, events.Handle): assert not args assert not isinstance(callback, events.TimerHandle) @@ -416,13 +435,13 @@ if flags: msg.append('flags=%r' % flags) msg = ', '.join(msg) - logger.debug('Get addresss info %s', msg) + logger.debug('Get address info %s', msg) t0 = self.time() addrinfo = socket.getaddrinfo(host, port, family, type, proto, flags) dt = self.time() - t0 - msg = ('Getting addresss info %s took %.3f ms: %r' + msg = ('Getting address info %s took %.3f ms: %r' % (msg, dt * 1e3, addrinfo)) if dt >= self.slow_callback_duration: logger.info(msg) @@ -559,8 +578,8 @@ transport, protocol = yield from self._create_connection_transport( sock, protocol_factory, ssl, server_hostname) if self._debug: - logger.debug("connected to %s:%r: (%r, %r)", - host, port, transport, protocol) + logger.debug("%r connected to %s:%r: (%r, %r)", + sock, host, port, transport, protocol) return transport, protocol @coroutine @@ -589,7 +608,7 @@ raise ValueError('unexpected address family') addr_pairs_info = (((family, proto), (None, None)),) else: - # join addresss by (family, protocol) + # join address by (family, protocol) addr_infos = collections.OrderedDict() for idx, addr in ((0, local_addr), (1, remote_addr)): if addr is not None: @@ -674,7 +693,7 @@ reuse_address=None): """Create a TCP server bound to host and port. - Return an Server object which can be used to stop the service. + Return a Server object which can be used to stop the service. This method is a coroutine. """ @@ -731,8 +750,7 @@ sock.close() else: if sock is None: - raise ValueError( - 'host and port was not specified and no sock specified') + raise ValueError('Neither host/port nor sock were specified') sockets = [sock] server = Server(self, sockets) @@ -750,6 +768,9 @@ waiter = futures.Future(loop=self) transport = self._make_read_pipe_transport(pipe, protocol, waiter) yield from waiter + if self._debug: + logger.debug('Read pipe %r connected: (%r, %r)', + pipe.fileno(), transport, protocol) return transport, protocol @coroutine @@ -758,8 +779,24 @@ waiter = futures.Future(loop=self) transport = self._make_write_pipe_transport(pipe, protocol, waiter) yield from waiter + if self._debug: + logger.debug('Write pipe %r connected: (%r, %r)', + pipe.fileno(), transport, protocol) return transport, protocol + def _log_subprocess(self, msg, stdin, stdout, stderr): + info = [msg] + if stdin is not None: + info.append('stdin=%s' % _format_pipe(stdin)) + if stdout is not None and stderr == subprocess.STDOUT: + info.append('stdout=stderr=%s' % _format_pipe(stdout)) + else: + if stdout is not None: + info.append('stdout=%s' % _format_pipe(stdout)) + if stderr is not None: + info.append('stderr=%s' % _format_pipe(stderr)) + logger.debug(' '.join(info)) + @coroutine def subprocess_shell(self, protocol_factory, cmd, *, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -774,8 +811,15 @@ if bufsize != 0: raise ValueError("bufsize must be 0") protocol = protocol_factory() + if self._debug: + # don't log parameters: they may contain sensitive information + # (password) and may be too long + debug_log = 'run shell command %r' % cmd + self._log_subprocess(debug_log, stdin, stdout, stderr) transport = yield from self._make_subprocess_transport( protocol, cmd, True, stdin, stdout, stderr, bufsize, **kwargs) + if self._debug: + logger.info('%s: %r' % (debug_log, transport)) return transport, protocol @coroutine @@ -796,9 +840,16 @@ "a bytes or text string, not %s" % type(arg).__name__) protocol = protocol_factory() + if self._debug: + # don't log parameters: they may contain sensitive information + # (password) and may be too long + debug_log = 'execute program %r' % program + self._log_subprocess(debug_log, stdin, stdout, stderr) transport = yield from self._make_subprocess_transport( protocol, popen_args, False, stdin, stdout, stderr, bufsize, **kwargs) + if self._debug: + logger.info('%s: %r' % (debug_log, transport)) return transport, protocol def set_exception_handler(self, handler): @@ -808,7 +859,7 @@ be set. If handler is a callable object, it should have a - matching signature to '(loop, context)', where 'loop' + signature matching '(loop, context)', where 'loop' will be a reference to the active event loop, 'context' will be a dict object (see `call_exception_handler()` documentation for details about context). @@ -825,7 +876,7 @@ handler is set, and can be called by a custom exception handler that wants to defer to the default behavior. - context parameter has the same meaning as in + The context parameter has the same meaning as in `call_exception_handler()`. """ message = context.get('message') @@ -854,10 +905,10 @@ logger.error('\n'.join(log_lines), exc_info=exc_info) def call_exception_handler(self, context): - """Call the current event loop exception handler. + """Call the current event loop's exception handler. - context is a dict object containing the following keys - (new keys maybe introduced later): + The context argument is a dict containing the following keys: + - 'message': Error message; - 'exception' (optional): Exception object; - 'future' (optional): Future instance; @@ -866,8 +917,10 @@ - 'transport' (optional): Transport instance; - 'socket' (optional): Socket instance. - Note: this method should not be overloaded in subclassed - event loops. For any custom exception handling, use + New keys maybe introduced in the future. + + Note: do not overload this method in an event loop subclass. + For custom exception handling, use the `set_exception_handler()` method. """ if self._exception_handler is None: @@ -892,7 +945,7 @@ 'context': context, }) except Exception: - # Guard 'default_exception_handler' in case it's + # Guard 'default_exception_handler' in case it is # overloaded. logger.error('Exception in default exception handler ' 'while handling an unexpected error ' @@ -900,7 +953,7 @@ exc_info=True) def _add_callback(self, handle): - """Add a Handle to ready or scheduled.""" + """Add a Handle to _scheduled (TimerHandle) or _ready.""" assert isinstance(handle, events.Handle), 'A Handle is required here' if handle._cancelled: return @@ -971,7 +1024,7 @@ # Note: We run all currently scheduled callbacks, but not any # callbacks scheduled by callbacks run this time around -- # they will be run the next time (after another I/O poll). - # Use an idiom that is threadsafe without using locks. + # Use an idiom that is thread-safe without using locks. ntodo = len(self._ready) for i in range(ntodo): handle = self._ready.popleft() diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -4,6 +4,7 @@ from . import protocols from . import transports from .coroutines import coroutine +from .log import logger class BaseSubprocessTransport(transports.SubprocessTransport): @@ -14,6 +15,7 @@ super().__init__(extra) self._protocol = protocol self._loop = loop + self._pid = None self._pipes = {} if stdin == subprocess.PIPE: @@ -27,7 +29,36 @@ self._returncode = None self._start(args=args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, bufsize=bufsize, **kwargs) + self._pid = self._proc.pid self._extra['subprocess'] = self._proc + if self._loop.get_debug(): + if isinstance(args, (bytes, str)): + program = args + else: + program = args[0] + logger.debug('process %r created: pid %s', + program, self._pid) + + def __repr__(self): + info = [self.__class__.__name__, 'pid=%s' % self._pid] + if self._returncode is not None: + info.append('returncode=%s' % self._returncode) + + stdin = self._pipes.get(0) + if stdin is not None: + info.append('stdin=%s' % stdin.pipe) + + stdout = self._pipes.get(1) + stderr = self._pipes.get(2) + if stdout is not None and stderr is stdout: + info.append('stdout=stderr=%s' % stdout.pipe) + else: + if stdout is not None: + info.append('stdout=%s' % stdout.pipe) + if stderr is not None: + info.append('stderr=%s' % stderr.pipe) + + return '<%s>' % ' '.join(info) def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): raise NotImplementedError @@ -45,7 +76,7 @@ self.terminate() def get_pid(self): - return self._proc.pid + return self._pid def get_returncode(self): return self._returncode @@ -108,6 +139,9 @@ def _process_exited(self, returncode): assert returncode is not None, returncode assert self._returncode is None, self._returncode + if self._loop.get_debug(): + logger.info('%r exited with return code %r', + self, returncode) self._returncode = returncode self._call(self._protocol.process_exited) self._try_finish() @@ -141,6 +175,10 @@ def connection_made(self, transport): self.pipe = transport + def __repr__(self): + return ('<%s fd=%s pipe=%r>' + % (self.__class__.__name__, self.fd, self.pipe)) + def connection_lost(self, exc): self.disconnected = True self.proc._pipe_connection_lost(self.fd, exc) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -15,6 +15,7 @@ from . import futures from . import protocols from .coroutines import coroutine +from .log import logger _DEFAULT_LIMIT = 2**16 @@ -153,10 +154,15 @@ def pause_writing(self): assert not self._paused self._paused = True + if self._loop.get_debug(): + logger.debug("%r pauses writing", self) def resume_writing(self): assert self._paused self._paused = False + if self._loop.get_debug(): + logger.debug("%r resumes writing", self) + waiter = self._drain_waiter if waiter is not None: self._drain_waiter = None @@ -244,6 +250,12 @@ self._reader = reader self._loop = loop + def __repr__(self): + info = [self.__class__.__name__, 'transport=%r' % self._transport] + if self._reader is not None: + info.append('reader=%r' % self._reader) + return '<%s>' % ' '.join(info) + @property def transport(self): return self._transport diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -9,6 +9,7 @@ from . import streams from . import tasks from .coroutines import coroutine +from .log import logger PIPE = subprocess.PIPE @@ -28,6 +29,16 @@ self._waiters = collections.deque() self._transport = None + def __repr__(self): + info = [self.__class__.__name__] + if self.stdin is not None: + info.append('stdin=%r' % self.stdin) + if self.stdout is not None: + info.append('stdout=%r' % self.stdout) + if self.stderr is not None: + info.append('stderr=%r' % self.stderr) + return '<%s>' % ' '.join(info) + def connection_made(self, transport): self._transport = transport if transport.get_pipe_transport(1): @@ -91,6 +102,9 @@ self.stderr = protocol.stderr self.pid = transport.get_pid() + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, self.pid) + @property def returncode(self): return self._transport.get_returncode() @@ -126,7 +140,13 @@ @coroutine def _feed_stdin(self, input): self.stdin.write(input) + if self._loop.get_debug(): + logger.debug('%r communicate: feed stdin (%s bytes)', + self, len(input)) yield from self.stdin.drain() + + if self._loop.get_debug(): + logger.debug('%r communicate: close stdin', self) self.stdin.close() @coroutine @@ -141,7 +161,13 @@ else: assert fd == 1 stream = self.stdout + if self._loop.get_debug(): + name = 'stdout' if fd == 1 else 'stderr' + logger.debug('%r communicate: read %s', self, name) output = yield from stream.read() + if self._loop.get_debug(): + name = 'stdout' if fd == 1 else 'stderr' + logger.debug('%r communicate: close %s', self, name) transport.close() return output diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -565,7 +565,7 @@ process 'pid' terminates. Specifying another callback for the same process replaces the previous handler. - Note: callback() must be thread-safe + Note: callback() must be thread-safe. """ raise NotImplementedError() @@ -721,6 +721,9 @@ return returncode = self._compute_returncode(status) + if self._loop.get_debug(): + logger.debug('process %s exited with returncode %s', + expected_pid, returncode) try: callback, args = self._callbacks.pop(pid) @@ -818,8 +821,16 @@ if self._forks: # It may not be registered yet. self._zombies[pid] = returncode + if self._loop.get_debug(): + logger.debug('unknown process %s exited ' + 'with returncode %s', + pid, returncode) continue callback = None + else: + if self._loop.get_debug(): + logger.debug('process %s exited with returncode %s', + pid, returncode) if callback is None: logger.warning( diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -44,8 +44,6 @@ self.assertRaises( NotImplementedError, self.loop._write_to_self) self.assertRaises( - NotImplementedError, self.loop._read_from_self) - self.assertRaises( NotImplementedError, self.loop._make_read_pipe_transport, m, m) self.assertRaises( -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 18:37:32 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 14 Jul 2014 18:37:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_Python_3=2E4?= Message-ID: <3hBrB42xQkz7LjM@mail.python.org> http://hg.python.org/cpython/rev/8c17e65b68ca changeset: 91678:8c17e65b68ca parent: 91676:bdf04552f4df parent: 91677:3027bf42e29c user: Victor Stinner date: Mon Jul 14 18:36:24 2014 +0200 summary: Merge with Python 3.4 files: Lib/asyncio/base_events.py | 131 +++++++-- Lib/asyncio/base_subprocess.py | 40 ++- Lib/asyncio/streams.py | 12 + Lib/asyncio/subprocess.py | 26 + Lib/asyncio/unix_events.py | 13 +- Lib/test/test_asyncio/test_base_events.py | 2 - 6 files changed, 181 insertions(+), 43 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -1,7 +1,7 @@ """Base implementation of event loop. The event loop can be broken up into a multiplexer (the part -responsible for notifying us of IO events) and the event loop proper, +responsible for notifying us of I/O events) and the event loop proper, which wraps a multiplexer with functionality for scheduling callbacks, immediately or at a given time in the future. @@ -50,6 +50,15 @@ return str(handle) +def _format_pipe(fd): + if fd == subprocess.PIPE: + return '' + elif fd == subprocess.STDOUT: + return '' + else: + return repr(fd) + + class _StopError(BaseException): """Raised to stop the event loop.""" @@ -70,7 +79,7 @@ type_mask |= socket.SOCK_NONBLOCK if hasattr(socket, 'SOCK_CLOEXEC'): type_mask |= socket.SOCK_CLOEXEC - # Use getaddrinfo(AI_NUMERICHOST) to ensure that the address is + # Use getaddrinfo(flags=AI_NUMERICHOST) to ensure that the address is # already resolved. try: socket.getaddrinfo(host, port, @@ -158,7 +167,8 @@ def create_task(self, coro): """Schedule a coroutine object. - Return a task object.""" + Return a task object. + """ task = tasks.Task(coro, loop=self) if task._source_traceback: del task._source_traceback[-1] @@ -197,12 +207,13 @@ """Create subprocess transport.""" raise NotImplementedError - def _read_from_self(self): - """XXX""" - raise NotImplementedError + def _write_to_self(self): + """Write a byte to self-pipe, to wake up the event loop. - def _write_to_self(self): - """XXX""" + This may be called from a different thread. + + The subclass is responsible for implementing the self-pipe. + """ raise NotImplementedError def _process_events(self, event_list): @@ -233,7 +244,7 @@ If the argument is a coroutine, it is wrapped in a Task. - XXX TBD: It would be disastrous to call run_until_complete() + WARNING: It would be disastrous to call run_until_complete() with the same coroutine twice -- it would wrap it in two different Tasks and that can't be good. @@ -261,7 +272,7 @@ Every callback scheduled before stop() is called will run. Callback scheduled after stop() is called won't. However, - those callbacks will run if run() is called again later. + those callbacks will run if run_*() is called again later. """ self.call_soon(_raise_stop_error) @@ -274,7 +285,7 @@ The event loop must not be running. """ if self._running: - raise RuntimeError("cannot close a running event loop") + raise RuntimeError("Cannot close a running event loop") if self._closed: return if self._debug: @@ -292,11 +303,16 @@ return self._closed def is_running(self): - """Returns running status of event loop.""" + """Returns True if the event loop is running.""" return self._running def time(self): - """Return the time according to the event loop's clock.""" + """Return the time according to the event loop's clock. + + This is a float expressed in seconds since an epoch, but the + epoch, precision, accuracy and drift are unspecified and may + differ per event loop. + """ return time.monotonic() def call_later(self, delay, callback, *args): @@ -306,7 +322,7 @@ can be used to cancel the call. The delay can be an int or float, expressed in seconds. It is - always a relative time. + always relative to the current time. Each callback will be called exactly once. If two callbacks are scheduled for exactly the same time, it undefined which @@ -321,7 +337,10 @@ return timer def call_at(self, when, callback, *args): - """Like call_later(), but uses an absolute time.""" + """Like call_later(), but uses an absolute time. + + Absolute time corresponds to the event loop's time() method. + """ if coroutines.iscoroutinefunction(callback): raise TypeError("coroutines cannot be used with call_at()") if self._debug: @@ -335,7 +354,7 @@ def call_soon(self, callback, *args): """Arrange for a callback to be called as soon as possible. - This operates as a FIFO queue, callbacks are called in the + This operates as a FIFO queue: callbacks are called in the order in which they are registered. Each callback will be called exactly once. @@ -361,10 +380,10 @@ def _assert_is_current_event_loop(self): """Asserts that this event loop is the current event loop. - Non-threadsafe methods of this class make this assumption and will + Non-thread-safe methods of this class make this assumption and will likely behave incorrectly when the assumption is violated. - Should only be called when (self._debug == True). The caller is + Should only be called when (self._debug == True). The caller is responsible for checking this condition for performance reasons. """ try: @@ -373,11 +392,11 @@ return if current is not self: raise RuntimeError( - "non-threadsafe operation invoked on an event loop other " + "Non-thread-safe operation invoked on an event loop other " "than the current one") def call_soon_threadsafe(self, callback, *args): - """Like call_soon(), but thread safe.""" + """Like call_soon(), but thread-safe.""" handle = self._call_soon(callback, args, check_loop=False) if handle._source_traceback: del handle._source_traceback[-1] @@ -386,7 +405,7 @@ def run_in_executor(self, executor, callback, *args): if coroutines.iscoroutinefunction(callback): - raise TypeError("coroutines cannot be used with run_in_executor()") + raise TypeError("Coroutines cannot be used with run_in_executor()") if isinstance(callback, events.Handle): assert not args assert not isinstance(callback, events.TimerHandle) @@ -416,13 +435,13 @@ if flags: msg.append('flags=%r' % flags) msg = ', '.join(msg) - logger.debug('Get addresss info %s', msg) + logger.debug('Get address info %s', msg) t0 = self.time() addrinfo = socket.getaddrinfo(host, port, family, type, proto, flags) dt = self.time() - t0 - msg = ('Getting addresss info %s took %.3f ms: %r' + msg = ('Getting address info %s took %.3f ms: %r' % (msg, dt * 1e3, addrinfo)) if dt >= self.slow_callback_duration: logger.info(msg) @@ -559,8 +578,8 @@ transport, protocol = yield from self._create_connection_transport( sock, protocol_factory, ssl, server_hostname) if self._debug: - logger.debug("connected to %s:%r: (%r, %r)", - host, port, transport, protocol) + logger.debug("%r connected to %s:%r: (%r, %r)", + sock, host, port, transport, protocol) return transport, protocol @coroutine @@ -589,7 +608,7 @@ raise ValueError('unexpected address family') addr_pairs_info = (((family, proto), (None, None)),) else: - # join addresss by (family, protocol) + # join address by (family, protocol) addr_infos = collections.OrderedDict() for idx, addr in ((0, local_addr), (1, remote_addr)): if addr is not None: @@ -674,7 +693,7 @@ reuse_address=None): """Create a TCP server bound to host and port. - Return an Server object which can be used to stop the service. + Return a Server object which can be used to stop the service. This method is a coroutine. """ @@ -731,8 +750,7 @@ sock.close() else: if sock is None: - raise ValueError( - 'host and port was not specified and no sock specified') + raise ValueError('Neither host/port nor sock were specified') sockets = [sock] server = Server(self, sockets) @@ -750,6 +768,9 @@ waiter = futures.Future(loop=self) transport = self._make_read_pipe_transport(pipe, protocol, waiter) yield from waiter + if self._debug: + logger.debug('Read pipe %r connected: (%r, %r)', + pipe.fileno(), transport, protocol) return transport, protocol @coroutine @@ -758,8 +779,24 @@ waiter = futures.Future(loop=self) transport = self._make_write_pipe_transport(pipe, protocol, waiter) yield from waiter + if self._debug: + logger.debug('Write pipe %r connected: (%r, %r)', + pipe.fileno(), transport, protocol) return transport, protocol + def _log_subprocess(self, msg, stdin, stdout, stderr): + info = [msg] + if stdin is not None: + info.append('stdin=%s' % _format_pipe(stdin)) + if stdout is not None and stderr == subprocess.STDOUT: + info.append('stdout=stderr=%s' % _format_pipe(stdout)) + else: + if stdout is not None: + info.append('stdout=%s' % _format_pipe(stdout)) + if stderr is not None: + info.append('stderr=%s' % _format_pipe(stderr)) + logger.debug(' '.join(info)) + @coroutine def subprocess_shell(self, protocol_factory, cmd, *, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -774,8 +811,15 @@ if bufsize != 0: raise ValueError("bufsize must be 0") protocol = protocol_factory() + if self._debug: + # don't log parameters: they may contain sensitive information + # (password) and may be too long + debug_log = 'run shell command %r' % cmd + self._log_subprocess(debug_log, stdin, stdout, stderr) transport = yield from self._make_subprocess_transport( protocol, cmd, True, stdin, stdout, stderr, bufsize, **kwargs) + if self._debug: + logger.info('%s: %r' % (debug_log, transport)) return transport, protocol @coroutine @@ -796,9 +840,16 @@ "a bytes or text string, not %s" % type(arg).__name__) protocol = protocol_factory() + if self._debug: + # don't log parameters: they may contain sensitive information + # (password) and may be too long + debug_log = 'execute program %r' % program + self._log_subprocess(debug_log, stdin, stdout, stderr) transport = yield from self._make_subprocess_transport( protocol, popen_args, False, stdin, stdout, stderr, bufsize, **kwargs) + if self._debug: + logger.info('%s: %r' % (debug_log, transport)) return transport, protocol def set_exception_handler(self, handler): @@ -808,7 +859,7 @@ be set. If handler is a callable object, it should have a - matching signature to '(loop, context)', where 'loop' + signature matching '(loop, context)', where 'loop' will be a reference to the active event loop, 'context' will be a dict object (see `call_exception_handler()` documentation for details about context). @@ -825,7 +876,7 @@ handler is set, and can be called by a custom exception handler that wants to defer to the default behavior. - context parameter has the same meaning as in + The context parameter has the same meaning as in `call_exception_handler()`. """ message = context.get('message') @@ -854,10 +905,10 @@ logger.error('\n'.join(log_lines), exc_info=exc_info) def call_exception_handler(self, context): - """Call the current event loop exception handler. + """Call the current event loop's exception handler. - context is a dict object containing the following keys - (new keys maybe introduced later): + The context argument is a dict containing the following keys: + - 'message': Error message; - 'exception' (optional): Exception object; - 'future' (optional): Future instance; @@ -866,8 +917,10 @@ - 'transport' (optional): Transport instance; - 'socket' (optional): Socket instance. - Note: this method should not be overloaded in subclassed - event loops. For any custom exception handling, use + New keys maybe introduced in the future. + + Note: do not overload this method in an event loop subclass. + For custom exception handling, use the `set_exception_handler()` method. """ if self._exception_handler is None: @@ -892,7 +945,7 @@ 'context': context, }) except Exception: - # Guard 'default_exception_handler' in case it's + # Guard 'default_exception_handler' in case it is # overloaded. logger.error('Exception in default exception handler ' 'while handling an unexpected error ' @@ -900,7 +953,7 @@ exc_info=True) def _add_callback(self, handle): - """Add a Handle to ready or scheduled.""" + """Add a Handle to _scheduled (TimerHandle) or _ready.""" assert isinstance(handle, events.Handle), 'A Handle is required here' if handle._cancelled: return @@ -971,7 +1024,7 @@ # Note: We run all currently scheduled callbacks, but not any # callbacks scheduled by callbacks run this time around -- # they will be run the next time (after another I/O poll). - # Use an idiom that is threadsafe without using locks. + # Use an idiom that is thread-safe without using locks. ntodo = len(self._ready) for i in range(ntodo): handle = self._ready.popleft() diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -4,6 +4,7 @@ from . import protocols from . import transports from .coroutines import coroutine +from .log import logger class BaseSubprocessTransport(transports.SubprocessTransport): @@ -14,6 +15,7 @@ super().__init__(extra) self._protocol = protocol self._loop = loop + self._pid = None self._pipes = {} if stdin == subprocess.PIPE: @@ -27,7 +29,36 @@ self._returncode = None self._start(args=args, shell=shell, stdin=stdin, stdout=stdout, stderr=stderr, bufsize=bufsize, **kwargs) + self._pid = self._proc.pid self._extra['subprocess'] = self._proc + if self._loop.get_debug(): + if isinstance(args, (bytes, str)): + program = args + else: + program = args[0] + logger.debug('process %r created: pid %s', + program, self._pid) + + def __repr__(self): + info = [self.__class__.__name__, 'pid=%s' % self._pid] + if self._returncode is not None: + info.append('returncode=%s' % self._returncode) + + stdin = self._pipes.get(0) + if stdin is not None: + info.append('stdin=%s' % stdin.pipe) + + stdout = self._pipes.get(1) + stderr = self._pipes.get(2) + if stdout is not None and stderr is stdout: + info.append('stdout=stderr=%s' % stdout.pipe) + else: + if stdout is not None: + info.append('stdout=%s' % stdout.pipe) + if stderr is not None: + info.append('stderr=%s' % stderr.pipe) + + return '<%s>' % ' '.join(info) def _start(self, args, shell, stdin, stdout, stderr, bufsize, **kwargs): raise NotImplementedError @@ -45,7 +76,7 @@ self.terminate() def get_pid(self): - return self._proc.pid + return self._pid def get_returncode(self): return self._returncode @@ -108,6 +139,9 @@ def _process_exited(self, returncode): assert returncode is not None, returncode assert self._returncode is None, self._returncode + if self._loop.get_debug(): + logger.info('%r exited with return code %r', + self, returncode) self._returncode = returncode self._call(self._protocol.process_exited) self._try_finish() @@ -141,6 +175,10 @@ def connection_made(self, transport): self.pipe = transport + def __repr__(self): + return ('<%s fd=%s pipe=%r>' + % (self.__class__.__name__, self.fd, self.pipe)) + def connection_lost(self, exc): self.disconnected = True self.proc._pipe_connection_lost(self.fd, exc) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -15,6 +15,7 @@ from . import futures from . import protocols from .coroutines import coroutine +from .log import logger _DEFAULT_LIMIT = 2**16 @@ -153,10 +154,15 @@ def pause_writing(self): assert not self._paused self._paused = True + if self._loop.get_debug(): + logger.debug("%r pauses writing", self) def resume_writing(self): assert self._paused self._paused = False + if self._loop.get_debug(): + logger.debug("%r resumes writing", self) + waiter = self._drain_waiter if waiter is not None: self._drain_waiter = None @@ -244,6 +250,12 @@ self._reader = reader self._loop = loop + def __repr__(self): + info = [self.__class__.__name__, 'transport=%r' % self._transport] + if self._reader is not None: + info.append('reader=%r' % self._reader) + return '<%s>' % ' '.join(info) + @property def transport(self): return self._transport diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -9,6 +9,7 @@ from . import streams from . import tasks from .coroutines import coroutine +from .log import logger PIPE = subprocess.PIPE @@ -28,6 +29,16 @@ self._waiters = collections.deque() self._transport = None + def __repr__(self): + info = [self.__class__.__name__] + if self.stdin is not None: + info.append('stdin=%r' % self.stdin) + if self.stdout is not None: + info.append('stdout=%r' % self.stdout) + if self.stderr is not None: + info.append('stderr=%r' % self.stderr) + return '<%s>' % ' '.join(info) + def connection_made(self, transport): self._transport = transport if transport.get_pipe_transport(1): @@ -91,6 +102,9 @@ self.stderr = protocol.stderr self.pid = transport.get_pid() + def __repr__(self): + return '<%s %s>' % (self.__class__.__name__, self.pid) + @property def returncode(self): return self._transport.get_returncode() @@ -126,7 +140,13 @@ @coroutine def _feed_stdin(self, input): self.stdin.write(input) + if self._loop.get_debug(): + logger.debug('%r communicate: feed stdin (%s bytes)', + self, len(input)) yield from self.stdin.drain() + + if self._loop.get_debug(): + logger.debug('%r communicate: close stdin', self) self.stdin.close() @coroutine @@ -141,7 +161,13 @@ else: assert fd == 1 stream = self.stdout + if self._loop.get_debug(): + name = 'stdout' if fd == 1 else 'stderr' + logger.debug('%r communicate: read %s', self, name) output = yield from stream.read() + if self._loop.get_debug(): + name = 'stdout' if fd == 1 else 'stderr' + logger.debug('%r communicate: close %s', self, name) transport.close() return output diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -565,7 +565,7 @@ process 'pid' terminates. Specifying another callback for the same process replaces the previous handler. - Note: callback() must be thread-safe + Note: callback() must be thread-safe. """ raise NotImplementedError() @@ -721,6 +721,9 @@ return returncode = self._compute_returncode(status) + if self._loop.get_debug(): + logger.debug('process %s exited with returncode %s', + expected_pid, returncode) try: callback, args = self._callbacks.pop(pid) @@ -818,8 +821,16 @@ if self._forks: # It may not be registered yet. self._zombies[pid] = returncode + if self._loop.get_debug(): + logger.debug('unknown process %s exited ' + 'with returncode %s', + pid, returncode) continue callback = None + else: + if self._loop.get_debug(): + logger.debug('process %s exited with returncode %s', + pid, returncode) if callback is None: logger.warning( diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -44,8 +44,6 @@ self.assertRaises( NotImplementedError, self.loop._write_to_self) self.assertRaises( - NotImplementedError, self.loop._read_from_self) - self.assertRaises( NotImplementedError, self.loop._make_read_pipe_transport, m, m) self.assertRaises( -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 21:31:35 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 14 Jul 2014 21:31:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321645=3A_Add_debu?= =?utf-8?q?g_code_to_analyze_a_failure_on_FreeBSD_9?= Message-ID: <3hBw2v0SWDz7LjX@mail.python.org> http://hg.python.org/cpython/rev/a0e6a370755f changeset: 91679:a0e6a370755f user: Victor Stinner date: Mon Jul 14 21:29:23 2014 +0200 summary: Issue #21645: Add debug code to analyze a failure on FreeBSD 9 files: Lib/test/test_asyncio/test_streams.py | 50 +++++++++----- 1 files changed, 33 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -609,25 +609,41 @@ rfd, wfd = os.pipe() args = [sys.executable, '-c', code, str(wfd)] - pipe = open(rfd, 'rb', 0) - reader = asyncio.StreamReader(loop=self.loop, limit=1) - protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop) - transport, _ = self.loop.run_until_complete( - self.loop.connect_read_pipe(lambda: protocol, pipe)) + # FIXME: Debug code for issue #21645 + import logging + self.loop.set_debug(True) + logger = logging.getLogger('asyncio') + log_level = logger.level + try: + log_handler = logging.StreamHandler(sys.stderr) + logger.addHandler(log_handler) + logger.setLevel(logging.DEBUG) + # FIXME: Debug code for issue #21645 --- - watcher = asyncio.SafeChildWatcher() - watcher.attach_loop(self.loop) - try: - asyncio.set_child_watcher(watcher) - proc = self.loop.run_until_complete( - asyncio.create_subprocess_exec(*args, pass_fds={wfd}, loop=self.loop)) - self.loop.run_until_complete(proc.wait()) + pipe = open(rfd, 'rb', 0) + reader = asyncio.StreamReader(loop=self.loop, limit=1) + protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop) + transport, _ = self.loop.run_until_complete( + self.loop.connect_read_pipe(lambda: protocol, pipe)) + + watcher = asyncio.SafeChildWatcher() + watcher.attach_loop(self.loop) + try: + asyncio.set_child_watcher(watcher) + proc = self.loop.run_until_complete( + asyncio.create_subprocess_exec(*args, pass_fds={wfd}, loop=self.loop)) + self.loop.run_until_complete(proc.wait()) + finally: + asyncio.set_child_watcher(None) + + os.close(wfd) + data = self.loop.run_until_complete(reader.read(-1)) + self.assertEqual(data, b'data') finally: - asyncio.set_child_watcher(None) - - os.close(wfd) - data = self.loop.run_until_complete(reader.read(-1)) - self.assertEqual(data, b'data') + # FIXME: Debug code for issue #21645 + logger.removeHandler(log_handler) + logger.setLevel(log_level) + # FIXME: Debug code for issue #21645 --- if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 22:04:33 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 14 Jul 2014 22:04:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321645=3A_test=5Fa?= =?utf-8?q?syncio=2C_log_debug_trace_into_sys=2E=5F=5Fstderr=5F=5F=2C_not_?= =?utf-8?q?in?= Message-ID: <3hBwmx40RHz7LkB@mail.python.org> http://hg.python.org/cpython/rev/dbf991650441 changeset: 91680:dbf991650441 user: Victor Stinner date: Mon Jul 14 22:04:18 2014 +0200 summary: Issue #21645: test_asyncio, log debug trace into sys.__stderr__, not in sys.stderr, to get output even if tests are run with the -j command line option. files: Lib/test/test_asyncio/test_streams.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -615,7 +615,7 @@ logger = logging.getLogger('asyncio') log_level = logger.level try: - log_handler = logging.StreamHandler(sys.stderr) + log_handler = logging.StreamHandler(sys.__stderr__) logger.addHandler(log_handler) logger.setLevel(logging.DEBUG) # FIXME: Debug code for issue #21645 --- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 22:28:03 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 14 Jul 2014 22:28:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_asyncio_tests?= =?utf-8?q?=3A_make_quiet_the_logs_of_SSL_handshake_failures_when_running_?= =?utf-8?q?tests?= Message-ID: <3hBxJ325kcz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/e461e352d426 changeset: 91681:e461e352d426 branch: 3.4 parent: 91677:3027bf42e29c user: Victor Stinner date: Mon Jul 14 22:26:34 2014 +0200 summary: asyncio tests: make quiet the logs of SSL handshake failures when running tests in debug mode files: Lib/asyncio/test_utils.py | 16 ++++++ Lib/test/test_asyncio/test_events.py | 23 +++++---- Lib/test/test_asyncio/test_selector_events.py | 15 +++--- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -3,6 +3,7 @@ import collections import contextlib import io +import logging import os import re import socket @@ -28,6 +29,7 @@ from . import selectors from . import tasks from .coroutines import coroutine +from .log import logger if sys.platform == 'win32': # pragma: no cover @@ -401,3 +403,17 @@ def tearDown(self): events.set_event_loop(None) + + + at contextlib.contextmanager +def disable_logger(): + """Context manager to disable asyncio logger. + + For example, it can be used to ignore warnings in debug mode. + """ + old_level = logger.level + try: + logger.setLevel(logging.CRITICAL+1) + yield + finally: + logger.setLevel(old_level) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -819,9 +819,10 @@ # no CA loaded f_c = self.loop.create_connection(MyProto, host, port, ssl=sslcontext_client) - with self.assertRaisesRegex(ssl.SSLError, - 'certificate verify failed '): - self.loop.run_until_complete(f_c) + with test_utils.disable_logger(): + with self.assertRaisesRegex(ssl.SSLError, + 'certificate verify failed '): + self.loop.run_until_complete(f_c) # close connection self.assertIsNone(proto.transport) @@ -845,9 +846,10 @@ f_c = self.loop.create_unix_connection(MyProto, path, ssl=sslcontext_client, server_hostname='invalid') - with self.assertRaisesRegex(ssl.SSLError, - 'certificate verify failed '): - self.loop.run_until_complete(f_c) + with test_utils.disable_logger(): + with self.assertRaisesRegex(ssl.SSLError, + 'certificate verify failed '): + self.loop.run_until_complete(f_c) # close connection self.assertIsNone(proto.transport) @@ -871,10 +873,11 @@ # incorrect server_hostname f_c = self.loop.create_connection(MyProto, host, port, ssl=sslcontext_client) - with self.assertRaisesRegex( - ssl.CertificateError, - "hostname '127.0.0.1' doesn't match 'localhost'"): - self.loop.run_until_complete(f_c) + with test_utils.disable_logger(): + with self.assertRaisesRegex( + ssl.CertificateError, + "hostname '127.0.0.1' doesn't match 'localhost'"): + self.loop.run_until_complete(f_c) # close connection proto.transport.close() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1105,13 +1105,13 @@ def test_on_handshake_exc(self): exc = ValueError() self.sslsock.do_handshake.side_effect = exc - transport = _SelectorSslTransport( - self.loop, self.sock, self.protocol, self.sslcontext) - transport._waiter = asyncio.Future(loop=self.loop) - transport._on_handshake(None) + with test_utils.disable_logger(): + waiter = asyncio.Future(loop=self.loop) + transport = _SelectorSslTransport( + self.loop, self.sock, self.protocol, self.sslcontext, waiter) + self.assertTrue(waiter.done()) + self.assertIs(exc, waiter.exception()) self.assertTrue(self.sslsock.close.called) - self.assertTrue(transport._waiter.done()) - self.assertIs(exc, transport._waiter.exception()) def test_on_handshake_base_exc(self): transport = _SelectorSslTransport( @@ -1119,7 +1119,8 @@ transport._waiter = asyncio.Future(loop=self.loop) exc = BaseException() self.sslsock.do_handshake.side_effect = exc - self.assertRaises(BaseException, transport._on_handshake, None) + with test_utils.disable_logger(): + self.assertRaises(BaseException, transport._on_handshake, None) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 14 22:28:04 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 14 Jul 2014 22:28:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_Python_3=2E4?= Message-ID: <3hBxJ44xbfz7LkV@mail.python.org> http://hg.python.org/cpython/rev/41c8fc189671 changeset: 91682:41c8fc189671 parent: 91680:dbf991650441 parent: 91681:e461e352d426 user: Victor Stinner date: Mon Jul 14 22:26:57 2014 +0200 summary: Merge with Python 3.4 files: Lib/asyncio/test_utils.py | 16 ++++++ Lib/test/test_asyncio/test_events.py | 23 +++++---- Lib/test/test_asyncio/test_selector_events.py | 15 +++--- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -3,6 +3,7 @@ import collections import contextlib import io +import logging import os import re import socket @@ -28,6 +29,7 @@ from . import selectors from . import tasks from .coroutines import coroutine +from .log import logger if sys.platform == 'win32': # pragma: no cover @@ -401,3 +403,17 @@ def tearDown(self): events.set_event_loop(None) + + + at contextlib.contextmanager +def disable_logger(): + """Context manager to disable asyncio logger. + + For example, it can be used to ignore warnings in debug mode. + """ + old_level = logger.level + try: + logger.setLevel(logging.CRITICAL+1) + yield + finally: + logger.setLevel(old_level) diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -819,9 +819,10 @@ # no CA loaded f_c = self.loop.create_connection(MyProto, host, port, ssl=sslcontext_client) - with self.assertRaisesRegex(ssl.SSLError, - 'certificate verify failed '): - self.loop.run_until_complete(f_c) + with test_utils.disable_logger(): + with self.assertRaisesRegex(ssl.SSLError, + 'certificate verify failed '): + self.loop.run_until_complete(f_c) # close connection self.assertIsNone(proto.transport) @@ -845,9 +846,10 @@ f_c = self.loop.create_unix_connection(MyProto, path, ssl=sslcontext_client, server_hostname='invalid') - with self.assertRaisesRegex(ssl.SSLError, - 'certificate verify failed '): - self.loop.run_until_complete(f_c) + with test_utils.disable_logger(): + with self.assertRaisesRegex(ssl.SSLError, + 'certificate verify failed '): + self.loop.run_until_complete(f_c) # close connection self.assertIsNone(proto.transport) @@ -871,10 +873,11 @@ # incorrect server_hostname f_c = self.loop.create_connection(MyProto, host, port, ssl=sslcontext_client) - with self.assertRaisesRegex( - ssl.CertificateError, - "hostname '127.0.0.1' doesn't match 'localhost'"): - self.loop.run_until_complete(f_c) + with test_utils.disable_logger(): + with self.assertRaisesRegex( + ssl.CertificateError, + "hostname '127.0.0.1' doesn't match 'localhost'"): + self.loop.run_until_complete(f_c) # close connection proto.transport.close() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1105,13 +1105,13 @@ def test_on_handshake_exc(self): exc = ValueError() self.sslsock.do_handshake.side_effect = exc - transport = _SelectorSslTransport( - self.loop, self.sock, self.protocol, self.sslcontext) - transport._waiter = asyncio.Future(loop=self.loop) - transport._on_handshake(None) + with test_utils.disable_logger(): + waiter = asyncio.Future(loop=self.loop) + transport = _SelectorSslTransport( + self.loop, self.sock, self.protocol, self.sslcontext, waiter) + self.assertTrue(waiter.done()) + self.assertIs(exc, waiter.exception()) self.assertTrue(self.sslsock.close.called) - self.assertTrue(transport._waiter.done()) - self.assertIs(exc, transport._waiter.exception()) def test_on_handshake_base_exc(self): transport = _SelectorSslTransport( @@ -1119,7 +1119,8 @@ transport._waiter = asyncio.Future(loop=self.loop) exc = BaseException() self.sslsock.do_handshake.side_effect = exc - self.assertRaises(BaseException, transport._on_handshake, None) + with test_utils.disable_logger(): + self.assertRaises(BaseException, transport._on_handshake, None) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 15 05:08:33 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 15 Jul 2014 05:08:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTgy?= =?utf-8?q?=3A_Add_minimal_unittest_for_configDialog_with_46=25_coverage?= =?utf-8?q?=2E?= Message-ID: <3hC6B96nWkz7LlV@mail.python.org> http://hg.python.org/cpython/rev/af1351800c7a changeset: 91683:af1351800c7a branch: 2.7 parent: 91674:1c42f1ff2439 user: Terry Jan Reedy date: Mon Jul 14 23:07:21 2014 -0400 summary: Issue #21982: Add minimal unittest for configDialog with 46% coverage. files: Lib/idlelib/configDialog.py | 12 ++- Lib/idlelib/idle_test/test_configdialog.py | 32 ++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -23,9 +23,10 @@ class ConfigDialog(Toplevel): - def __init__(self,parent,title,_htest=False): + def __init__(self, parent, title, _htest=False, _utest=False): """ _htest - bool, change box location when running htest + _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) self.wm_withdraw() @@ -68,8 +69,9 @@ self.LoadConfigs() self.AttachVarCallbacks() #avoid callbacks during LoadConfigs - self.wm_deiconify() - self.wait_window() + if not _utest: + self.wm_deiconify() + self.wait_window() def CreateWidgets(self): self.tabPages = TabbedPageSet(self, @@ -1156,5 +1158,9 @@ pass if __name__ == '__main__': + import unittest + unittest.main('idlelib.idle_test.test_configdialog', + verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(ConfigDialog) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -0,0 +1,32 @@ +'''Unittests for idlelib/configHandler.py + +Coverage: 46% just by creating dialog. The other half is change code. + +''' +import unittest +from test.test_support import requires +from Tkinter import Tk +from idlelib.configDialog import ConfigDialog +from idlelib.macosxSupport import _initializeTkVariantTests + + +class ConfigDialogTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + _initializeTkVariantTests(cls.root) + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def test_dialog(self): + d=ConfigDialog(self.root, 'Test', _utest=True) + d.destroy() + + +if __name__ == '__main__': + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 15 05:08:35 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 15 Jul 2014 05:08:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTgy?= =?utf-8?q?=3A_Add_minimal_unittest_for_configDialog_with_46=25_coverage?= =?utf-8?q?=2E?= Message-ID: <3hC6BC1SPBz7LlV@mail.python.org> http://hg.python.org/cpython/rev/681979c6e6b2 changeset: 91684:681979c6e6b2 branch: 3.4 parent: 91681:e461e352d426 user: Terry Jan Reedy date: Mon Jul 14 23:07:32 2014 -0400 summary: Issue #21982: Add minimal unittest for configDialog with 46% coverage. Fix regression that this test would have caught. files: Lib/idlelib/configDialog.py | 14 +++- Lib/idlelib/idle_test/test_configdialog.py | 32 ++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -24,9 +24,10 @@ class ConfigDialog(Toplevel): - def __init__(self,parent,title,_htest=False): + def __init__(self, parent, title, _htest=False, _utest=False): """ _htest - bool, change box location when running htest + _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) self.wm_withdraw() @@ -69,8 +70,9 @@ self.LoadConfigs() self.AttachVarCallbacks() #avoid callbacks during LoadConfigs - self.wm_deiconify() - self.wait_window() + if not _utest: + self.wm_deiconify() + self.wait_window() def CreateWidgets(self): self.tabPages = TabbedPageSet(self, @@ -678,7 +680,7 @@ if self.listBindings.curselection(): reselect=1 listIndex=self.listBindings.index(ANCHOR) - # keySet=idleConf.GetKeySet(keySetName) # unused, delete? + keySet=idleConf.GetKeySet(keySetName) bindNames = list(keySet.keys()) bindNames.sort() self.listBindings.delete(0,END) @@ -1144,5 +1146,9 @@ pass if __name__ == '__main__': + import unittest + unittest.main('idlelib.idle_test.test_configdialog', + verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(ConfigDialog) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -0,0 +1,32 @@ +'''Unittests for idlelib/configHandler.py + +Coverage: 46% just by creating dialog. The other half is change code. + +''' +import unittest +from test.support import requires +from tkinter import Tk +from idlelib.configDialog import ConfigDialog +from idlelib.macosxSupport import _initializeTkVariantTests + + +class ConfigDialogTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + _initializeTkVariantTests(cls.root) + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def test_dialog(self): + d=ConfigDialog(self.root, 'Test', _utest=True) + d.destroy() + + +if __name__ == '__main__': + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 15 05:08:36 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 15 Jul 2014 05:08:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hC6BD32ryz7LlN@mail.python.org> http://hg.python.org/cpython/rev/ddfcaeb1c56b changeset: 91685:ddfcaeb1c56b parent: 91682:41c8fc189671 parent: 91684:681979c6e6b2 user: Terry Jan Reedy date: Mon Jul 14 23:07:47 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/configDialog.py | 14 +++- Lib/idlelib/idle_test/test_configdialog.py | 32 ++++++++++ 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -24,9 +24,10 @@ class ConfigDialog(Toplevel): - def __init__(self,parent,title,_htest=False): + def __init__(self, parent, title, _htest=False, _utest=False): """ _htest - bool, change box location when running htest + _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) self.wm_withdraw() @@ -69,8 +70,9 @@ self.LoadConfigs() self.AttachVarCallbacks() #avoid callbacks during LoadConfigs - self.wm_deiconify() - self.wait_window() + if not _utest: + self.wm_deiconify() + self.wait_window() def CreateWidgets(self): self.tabPages = TabbedPageSet(self, @@ -678,7 +680,7 @@ if self.listBindings.curselection(): reselect=1 listIndex=self.listBindings.index(ANCHOR) - # keySet=idleConf.GetKeySet(keySetName) # unused, delete? + keySet=idleConf.GetKeySet(keySetName) bindNames = list(keySet.keys()) bindNames.sort() self.listBindings.delete(0,END) @@ -1144,5 +1146,9 @@ pass if __name__ == '__main__': + import unittest + unittest.main('idlelib.idle_test.test_configdialog', + verbosity=2, exit=False) + from idlelib.idle_test.htest import run run(ConfigDialog) diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -0,0 +1,32 @@ +'''Unittests for idlelib/configHandler.py + +Coverage: 46% just by creating dialog. The other half is change code. + +''' +import unittest +from test.support import requires +from tkinter import Tk +from idlelib.configDialog import ConfigDialog +from idlelib.macosxSupport import _initializeTkVariantTests + + +class ConfigDialogTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + _initializeTkVariantTests(cls.root) + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + del cls.root + + def test_dialog(self): + d=ConfigDialog(self.root, 'Test', _utest=True) + d.destroy() + + +if __name__ == '__main__': + unittest.main(verbosity=2) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Jul 15 09:33:15 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 15 Jul 2014 09:33:15 +0200 Subject: [Python-checkins] Daily reference leaks (41c8fc189671): sum=6 Message-ID: results for 41c8fc189671 on branch "default" -------------------------------------------- test_collections leaked [0, -2, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_normalization leaked [9, 0, 0] memory blocks, sum=9 test_site leaked [-2, 0, 0] references, sum=-2 test_site leaked [-2, 0, 0] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogXPm7Gj', '-x'] From python-checkins at python.org Tue Jul 15 12:23:56 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 15 Jul 2014 12:23:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318974=3A_Tools/sc?= =?utf-8?q?ripts/diff=2Epy_now_uses_argparse_instead_of_optparse=2E?= Message-ID: <3hCHrX1DNMz7LjX@mail.python.org> http://hg.python.org/cpython/rev/08b3ee523577 changeset: 91686:08b3ee523577 user: Serhiy Storchaka date: Tue Jul 15 13:23:58 2014 +0300 summary: Issue #18974: Tools/scripts/diff.py now uses argparse instead of optparse. files: Misc/NEWS | 2 + Tools/scripts/diff.py | 34 ++++++++++++++++-------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -759,6 +759,8 @@ Tools/Demos ----------- +- Issue #18974: Tools/scripts/diff.py now uses argparse instead of optparse. + - Issue #21906: Make Tools/scripts/md5sum.py work in Python 3. Patch by Zachary Ware. diff --git a/Tools/scripts/diff.py b/Tools/scripts/diff.py --- a/Tools/scripts/diff.py +++ b/Tools/scripts/diff.py @@ -8,7 +8,7 @@ """ -import sys, os, time, difflib, optparse +import sys, os, time, difflib, argparse from datetime import datetime, timezone def file_mtime(path): @@ -18,23 +18,25 @@ def main(): - usage = "usage: %prog [options] fromfile tofile" - parser = optparse.OptionParser(usage) - parser.add_option("-c", action="store_true", default=False, help='Produce a context format diff (default)') - parser.add_option("-u", action="store_true", default=False, help='Produce a unified format diff') - parser.add_option("-m", action="store_true", default=False, help='Produce HTML side by side diff (can use -c and -l in conjunction)') - parser.add_option("-n", action="store_true", default=False, help='Produce a ndiff format diff') - parser.add_option("-l", "--lines", type="int", default=3, help='Set number of context lines (default 3)') - (options, args) = parser.parse_args() - - if len(args) == 0: - parser.print_help() - sys.exit(1) - if len(args) != 2: - parser.error("need to specify both a fromfile and tofile") + parser = argparse.ArgumentParser() + parser.add_argument('-c', action='store_true', default=False, + help='Produce a context format diff (default)') + parser.add_argument('-u', action='store_true', default=False, + help='Produce a unified format diff') + parser.add_argument('-m', action='store_true', default=False, + help='Produce HTML side by side diff ' + '(can use -c and -l in conjunction)') + parser.add_argument('-n', action='store_true', default=False, + help='Produce a ndiff format diff') + parser.add_argument('-l', '--lines', type=int, default=3, + help='Set number of context lines (default 3)') + parser.add_argument('fromfile') + parser.add_argument('tofile') + options = parser.parse_args() n = options.lines - fromfile, tofile = args + fromfile = options.fromfile + tofile = options.tofile fromdate = file_mtime(fromfile) todate = file_mtime(tofile) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 15 21:29:28 2014 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 15 Jul 2014 21:29:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fix_getargspec=28=29_doctr?= =?utf-8?q?ing_=28varkw_-=3E_keywords=29=2E?= Message-ID: <3hCWy03CsRz7LjS@mail.python.org> http://hg.python.org/cpython/rev/c8ce5bca0fcd changeset: 91687:c8ce5bca0fcd user: Guido van Rossum date: Tue Jul 15 12:29:11 2014 -0700 summary: Fix getargspec() doctring (varkw -> keywords). files: Lib/inspect.py | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -914,10 +914,9 @@ def getargspec(func): """Get the names and default values of a function's arguments. - A tuple of four things is returned: (args, varargs, varkw, defaults). - 'args' is a list of the argument names. - 'args' will include keyword-only argument names. - 'varargs' and 'varkw' are the names of the * and ** arguments or None. + A tuple of four things is returned: (args, varargs, keywords, defaults). + 'args' is a list of the argument names, including keyword-only argument names. + 'varargs' and 'keywords' are the names of the * and ** arguments or None. 'defaults' is an n-tuple of the default values of the last n arguments. Use the getfullargspec() API for Python 3 code, as annotations -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Jul 16 10:16:42 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 16 Jul 2014 10:16:42 +0200 Subject: [Python-checkins] Daily reference leaks (c8ce5bca0fcd): sum=7 Message-ID: results for c8ce5bca0fcd on branch "default" -------------------------------------------- test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogmELHEQ', '-x'] From python-checkins at python.org Wed Jul 16 10:24:48 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 10:24:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321645=2C_=2321985?= =?utf-8?q?=3A_Remove_debug_code?= Message-ID: <3hCs8c2lX0z7Llv@mail.python.org> http://hg.python.org/cpython/rev/1ff9ce2204ee changeset: 91688:1ff9ce2204ee user: Victor Stinner date: Wed Jul 16 10:24:27 2014 +0200 summary: Issue #21645, #21985: Remove debug code files: Lib/test/test_asyncio/test_streams.py | 50 +++++--------- 1 files changed, 17 insertions(+), 33 deletions(-) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -609,41 +609,25 @@ rfd, wfd = os.pipe() args = [sys.executable, '-c', code, str(wfd)] - # FIXME: Debug code for issue #21645 - import logging - self.loop.set_debug(True) - logger = logging.getLogger('asyncio') - log_level = logger.level + pipe = open(rfd, 'rb', 0) + reader = asyncio.StreamReader(loop=self.loop, limit=1) + protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop) + transport, _ = self.loop.run_until_complete( + self.loop.connect_read_pipe(lambda: protocol, pipe)) + + watcher = asyncio.SafeChildWatcher() + watcher.attach_loop(self.loop) try: - log_handler = logging.StreamHandler(sys.__stderr__) - logger.addHandler(log_handler) - logger.setLevel(logging.DEBUG) - # FIXME: Debug code for issue #21645 --- + asyncio.set_child_watcher(watcher) + proc = self.loop.run_until_complete( + asyncio.create_subprocess_exec(*args, pass_fds={wfd}, loop=self.loop)) + self.loop.run_until_complete(proc.wait()) + finally: + asyncio.set_child_watcher(None) - pipe = open(rfd, 'rb', 0) - reader = asyncio.StreamReader(loop=self.loop, limit=1) - protocol = asyncio.StreamReaderProtocol(reader, loop=self.loop) - transport, _ = self.loop.run_until_complete( - self.loop.connect_read_pipe(lambda: protocol, pipe)) - - watcher = asyncio.SafeChildWatcher() - watcher.attach_loop(self.loop) - try: - asyncio.set_child_watcher(watcher) - proc = self.loop.run_until_complete( - asyncio.create_subprocess_exec(*args, pass_fds={wfd}, loop=self.loop)) - self.loop.run_until_complete(proc.wait()) - finally: - asyncio.set_child_watcher(None) - - os.close(wfd) - data = self.loop.run_until_complete(reader.read(-1)) - self.assertEqual(data, b'data') - finally: - # FIXME: Debug code for issue #21645 - logger.removeHandler(log_handler) - logger.setLevel(log_level) - # FIXME: Debug code for issue #21645 --- + os.close(wfd) + data = self.loop.run_until_complete(reader.read(-1)) + self.assertEqual(data, b'data') if __name__ == '__main__': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 15:46:34 2014 From: python-checkins at python.org (tal.einat) Date: Wed, 16 Jul 2014 15:46:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzY1?= =?utf-8?q?=3A_Add_support_for_non-ascii_identifiers_to_HyperParser?= Message-ID: <3hD0Ht0QX8z7Ljv@mail.python.org> http://hg.python.org/cpython/rev/8b3f7aecdf85 changeset: 91689:8b3f7aecdf85 branch: 3.4 parent: 91684:681979c6e6b2 user: Tal Einat date: Wed Jul 16 16:33:36 2014 +0300 summary: Issue #21765: Add support for non-ascii identifiers to HyperParser files: Lib/idlelib/HyperParser.py | 97 ++++++++-- Lib/idlelib/PyParse.py | 80 ++++++-- Lib/idlelib/idle_test/test_hyperparser.py | 82 +++++++++ Misc/NEWS | 2 + 4 files changed, 215 insertions(+), 46 deletions(-) diff --git a/Lib/idlelib/HyperParser.py b/Lib/idlelib/HyperParser.py --- a/Lib/idlelib/HyperParser.py +++ b/Lib/idlelib/HyperParser.py @@ -6,11 +6,24 @@ """ import string -import keyword +from keyword import iskeyword from idlelib import PyParse + +# all ASCII chars that may be in an identifier +_ASCII_ID_CHARS = frozenset(string.ascii_letters + string.digits + "_") +# all ASCII chars that may be the first char of an identifier +_ASCII_ID_FIRST_CHARS = frozenset(string.ascii_letters + "_") + +# lookup table for whether 7-bit ASCII chars are valid in a Python identifier +_IS_ASCII_ID_CHAR = [(chr(x) in _ASCII_ID_CHARS) for x in range(128)] +# lookup table for whether 7-bit ASCII chars are valid as the first +# char in a Python identifier +_IS_ASCII_ID_FIRST_CHAR = \ + [(chr(x) in _ASCII_ID_FIRST_CHARS) for x in range(128)] + + class HyperParser: - def __init__(self, editwin, index): "To initialize, analyze the surroundings of the given index." @@ -143,25 +156,69 @@ return beforeindex, afterindex - # Ascii chars that may be in a white space + # the set of built-in identifiers which are also keywords, + # i.e. keyword.iskeyword() returns True for them + _ID_KEYWORDS = frozenset({"True", "False", "None"}) + + @classmethod + def _eat_identifier(cls, str, limit, pos): + """Given a string and pos, return the number of chars in the + identifier which ends at pos, or 0 if there is no such one. + + This ignores non-identifier eywords are not identifiers. + """ + is_ascii_id_char = _IS_ASCII_ID_CHAR + + # Start at the end (pos) and work backwards. + i = pos + + # Go backwards as long as the characters are valid ASCII + # identifier characters. This is an optimization, since it + # is faster in the common case where most of the characters + # are ASCII. + while i > limit and ( + ord(str[i - 1]) < 128 and + is_ascii_id_char[ord(str[i - 1])] + ): + i -= 1 + + # If the above loop ended due to reaching a non-ASCII + # character, continue going backwards using the most generic + # test for whether a string contains only valid identifier + # characters. + if i > limit and ord(str[i - 1]) >= 128: + while i - 4 >= limit and ('a' + str[i - 4:pos]).isidentifier(): + i -= 4 + if i - 2 >= limit and ('a' + str[i - 2:pos]).isidentifier(): + i -= 2 + if i - 1 >= limit and ('a' + str[i - 1:pos]).isidentifier(): + i -= 1 + + # The identifier candidate starts here. If it isn't a valid + # identifier, don't eat anything. At this point that is only + # possible if the first character isn't a valid first + # character for an identifier. + if not str[i:pos].isidentifier(): + return 0 + elif i < pos: + # All characters in str[i:pos] are valid ASCII identifier + # characters, so it is enough to check that the first is + # valid as the first character of an identifier. + if not _IS_ASCII_ID_FIRST_CHAR[ord(str[i])]: + return 0 + + # All keywords are valid identifiers, but should not be + # considered identifiers here, except for True, False and None. + if i < pos and ( + iskeyword(str[i:pos]) and + str[i:pos] not in cls._ID_KEYWORDS + ): + return 0 + + return pos - i + + # This string includes all chars that may be in a white space _whitespace_chars = " \t\n\\" - # Ascii chars that may be in an identifier - _id_chars = string.ascii_letters + string.digits + "_" - # Ascii chars that may be the first char of an identifier - _id_first_chars = string.ascii_letters + "_" - - # Given a string and pos, return the number of chars in the - # identifier which ends at pos, or 0 if there is no such one. Saved - # words are not identifiers. - def _eat_identifier(self, str, limit, pos): - i = pos - while i > limit and str[i-1] in self._id_chars: - i -= 1 - if (i < pos and (str[i] not in self._id_first_chars or - (keyword.iskeyword(str[i:pos]) and - str[i:pos] not in {'None', 'False', 'True'}))): - i = pos - return pos - i def get_expression(self): """Return a string with the Python expression which ends at the diff --git a/Lib/idlelib/PyParse.py b/Lib/idlelib/PyParse.py --- a/Lib/idlelib/PyParse.py +++ b/Lib/idlelib/PyParse.py @@ -1,5 +1,7 @@ import re import sys +from collections import Mapping +from functools import partial # Reason last stmt is continued (or C_NONE if it's not). (C_NONE, C_BACKSLASH, C_STRING_FIRST_LINE, @@ -91,19 +93,48 @@ [^[\](){}#'"\\]+ """, re.VERBOSE).match -# Build translation table to map uninteresting chars to "x", open -# brackets to "(", and close brackets to ")". -_tran = {} -for i in range(256): - _tran[i] = 'x' -for ch in "({[": - _tran[ord(ch)] = '(' -for ch in ")}]": - _tran[ord(ch)] = ')' -for ch in "\"'\\\n#": - _tran[ord(ch)] = ch -del i, ch +class StringTranslatePseudoMapping(Mapping): + r"""Utility class to be used with str.translate() + + This Mapping class wraps a given dict. When a value for a key is + requested via __getitem__() or get(), the key is looked up in the + given dict. If found there, the value from the dict is returned. + Otherwise, the default value given upon initialization is returned. + + This allows using str.translate() to make some replacements, and to + replace all characters for which no replacement was specified with + a given character instead of leaving them as-is. + + For example, to replace everything except whitespace with 'x': + + >>> whitespace_chars = ' \t\n\r' + >>> preserve_dict = {ord(c): ord(c) for c in whitespace_chars} + >>> mapping = StringTranslatePseudoMapping(preserve_dict, ord('x')) + >>> text = "a + b\tc\nd" + >>> text.translate(mapping) + 'x x x\tx\nx' + """ + def __init__(self, non_defaults, default_value): + self._non_defaults = non_defaults + self._default_value = default_value + + def _get(key, _get=non_defaults.get, _default=default_value): + return _get(key, _default) + self._get = _get + + def __getitem__(self, item): + return self._get(item) + + def __len__(self): + return len(self._non_defaults) + + def __iter__(self): + return iter(self._non_defaults) + + def get(self, key, default=None): + return self._get(key) + class Parser: @@ -113,19 +144,6 @@ def set_str(self, s): assert len(s) == 0 or s[-1] == '\n' - if isinstance(s, str): - # The parse functions have no idea what to do with Unicode, so - # replace all Unicode characters with "x". This is "safe" - # so long as the only characters germane to parsing the structure - # of Python are 7-bit ASCII. It's *necessary* because Unicode - # strings don't have a .translate() method that supports - # deletechars. - uniphooey = s - s = [] - push = s.append - for raw in map(ord, uniphooey): - push(raw < 127 and chr(raw) or "x") - s = "".join(s) self.str = s self.study_level = 0 @@ -197,6 +215,16 @@ if lo > 0: self.str = self.str[lo:] + # Build a translation table to map uninteresting chars to 'x', open + # brackets to '(', close brackets to ')' while preserving quotes, + # backslashes, newlines and hashes. This is to be passed to + # str.translate() in _study1(). + _tran = {} + _tran.update((ord(c), ord('(')) for c in "({[") + _tran.update((ord(c), ord(')')) for c in ")}]") + _tran.update((ord(c), ord(c)) for c in "\"'\\\n#") + _tran = StringTranslatePseudoMapping(_tran, default_value=ord('x')) + # As quickly as humanly possible , find the line numbers (0- # based) of the non-continuation lines. # Creates self.{goodlines, continuation}. @@ -211,7 +239,7 @@ # uninteresting characters. This can cut the number of chars # by a factor of 10-40, and so greatly speed the following loop. str = self.str - str = str.translate(_tran) + str = str.translate(self._tran) str = str.replace('xxxxxxxx', 'x') str = str.replace('xxxx', 'x') str = str.replace('xx', 'x') diff --git a/Lib/idlelib/idle_test/test_hyperparser.py b/Lib/idlelib/idle_test/test_hyperparser.py --- a/Lib/idlelib/idle_test/test_hyperparser.py +++ b/Lib/idlelib/idle_test/test_hyperparser.py @@ -30,6 +30,7 @@ "z = ((r'asdf')+('a')))\n" '[x for x in\n' 'for = False\n' + 'clich? = "this is a string with unicode, what a clich?"' ) @classmethod @@ -93,6 +94,8 @@ self.assertTrue(p.is_in_string()) p = get('4.6') self.assertTrue(p.is_in_string()) + p = get('12.54') + self.assertTrue(p.is_in_string()) def test_is_in_code(self): get = self.get_parser @@ -180,12 +183,91 @@ p = get('10.0') self.assertEqual(p.get_expression(), '') + p = get('10.6') + self.assertEqual(p.get_expression(), '') + + p = get('10.11') + self.assertEqual(p.get_expression(), '') + p = get('11.3') self.assertEqual(p.get_expression(), '') p = get('11.11') self.assertEqual(p.get_expression(), 'False') + p = get('12.6') + self.assertEqual(p.get_expression(), 'clich?') + + def test_eat_identifier(self): + def is_valid_id(candidate): + result = HyperParser._eat_identifier(candidate, 0, len(candidate)) + if result == len(candidate): + return True + elif result == 0: + return False + else: + err_msg = "Unexpected result: {} (expected 0 or {}".format( + result, len(candidate) + ) + raise Exception(err_msg) + + # invalid first character which is valid elsewhere in an identifier + self.assertFalse(is_valid_id('2notid')) + + # ASCII-only valid identifiers + self.assertTrue(is_valid_id('valid_id')) + self.assertTrue(is_valid_id('_valid_id')) + self.assertTrue(is_valid_id('valid_id_')) + self.assertTrue(is_valid_id('_2valid_id')) + + # keywords which should be "eaten" + self.assertTrue(is_valid_id('True')) + self.assertTrue(is_valid_id('False')) + self.assertTrue(is_valid_id('None')) + + # keywords which should not be "eaten" + self.assertFalse(is_valid_id('for')) + self.assertFalse(is_valid_id('import')) + self.assertFalse(is_valid_id('return')) + + # valid unicode identifiers + self.assertTrue(is_valid_id('cliche')) + self.assertTrue(is_valid_id('clich?')) + self.assertTrue(is_valid_id('a?')) + + # invalid unicode identifiers + self.assertFalse(is_valid_id('2a')) + self.assertFalse(is_valid_id('?a')) + self.assertFalse(is_valid_id('a?')) + + # valid identifier after "punctuation" + self.assertEqual(HyperParser._eat_identifier('+ var', 0, 5), len('var')) + self.assertEqual(HyperParser._eat_identifier('+var', 0, 4), len('var')) + self.assertEqual(HyperParser._eat_identifier('.var', 0, 4), len('var')) + + # invalid identifiers + self.assertFalse(is_valid_id('+')) + self.assertFalse(is_valid_id(' ')) + self.assertFalse(is_valid_id(':')) + self.assertFalse(is_valid_id('?')) + self.assertFalse(is_valid_id('^')) + self.assertFalse(is_valid_id('\\')) + self.assertFalse(is_valid_id('"')) + self.assertFalse(is_valid_id('"a string"')) + + def test_eat_identifier_various_lengths(self): + eat_id = HyperParser._eat_identifier + + for length in range(1, 21): + self.assertEqual(eat_id('a' * length, 0, length), length) + self.assertEqual(eat_id('?' * length, 0, length), length) + self.assertEqual(eat_id('a' + '2' * (length - 1), 0, length), length) + self.assertEqual(eat_id('?' + '2' * (length - 1), 0, length), length) + self.assertEqual(eat_id('?' + 'a' * (length - 1), 0, length), length) + self.assertEqual(eat_id('?' * (length - 1) + 'a', 0, length), length) + self.assertEqual(eat_id('+' * length, 0, length), 0) + self.assertEqual(eat_id('2' + 'a' * (length - 1), 0, length), 0) + self.assertEqual(eat_id('2' + '?' * (length - 1), 0, length), 0) if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -171,6 +171,8 @@ IDLE ---- +- Issue #21765: Add support for non-ascii identifiers to HyperParser. + - Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav Heblikar. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 15:46:35 2014 From: python-checkins at python.org (tal.einat) Date: Wed, 16 Jul 2014 15:46:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321765=3A_Add_support_for_non-ascii_identifiers_?= =?utf-8?q?to_HyperParser?= Message-ID: <3hD0Hv2ycWz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/73a8c614af4d changeset: 91690:73a8c614af4d parent: 91688:1ff9ce2204ee parent: 91689:8b3f7aecdf85 user: Tal Einat date: Wed Jul 16 16:41:14 2014 +0300 summary: Issue #21765: Add support for non-ascii identifiers to HyperParser files: Lib/idlelib/HyperParser.py | 97 ++++++++-- Lib/idlelib/PyParse.py | 80 ++++++-- Lib/idlelib/idle_test/test_hyperparser.py | 82 +++++++++ Misc/NEWS | 2 + 4 files changed, 215 insertions(+), 46 deletions(-) diff --git a/Lib/idlelib/HyperParser.py b/Lib/idlelib/HyperParser.py --- a/Lib/idlelib/HyperParser.py +++ b/Lib/idlelib/HyperParser.py @@ -6,11 +6,24 @@ """ import string -import keyword +from keyword import iskeyword from idlelib import PyParse + +# all ASCII chars that may be in an identifier +_ASCII_ID_CHARS = frozenset(string.ascii_letters + string.digits + "_") +# all ASCII chars that may be the first char of an identifier +_ASCII_ID_FIRST_CHARS = frozenset(string.ascii_letters + "_") + +# lookup table for whether 7-bit ASCII chars are valid in a Python identifier +_IS_ASCII_ID_CHAR = [(chr(x) in _ASCII_ID_CHARS) for x in range(128)] +# lookup table for whether 7-bit ASCII chars are valid as the first +# char in a Python identifier +_IS_ASCII_ID_FIRST_CHAR = \ + [(chr(x) in _ASCII_ID_FIRST_CHARS) for x in range(128)] + + class HyperParser: - def __init__(self, editwin, index): "To initialize, analyze the surroundings of the given index." @@ -143,25 +156,69 @@ return beforeindex, afterindex - # Ascii chars that may be in a white space + # the set of built-in identifiers which are also keywords, + # i.e. keyword.iskeyword() returns True for them + _ID_KEYWORDS = frozenset({"True", "False", "None"}) + + @classmethod + def _eat_identifier(cls, str, limit, pos): + """Given a string and pos, return the number of chars in the + identifier which ends at pos, or 0 if there is no such one. + + This ignores non-identifier eywords are not identifiers. + """ + is_ascii_id_char = _IS_ASCII_ID_CHAR + + # Start at the end (pos) and work backwards. + i = pos + + # Go backwards as long as the characters are valid ASCII + # identifier characters. This is an optimization, since it + # is faster in the common case where most of the characters + # are ASCII. + while i > limit and ( + ord(str[i - 1]) < 128 and + is_ascii_id_char[ord(str[i - 1])] + ): + i -= 1 + + # If the above loop ended due to reaching a non-ASCII + # character, continue going backwards using the most generic + # test for whether a string contains only valid identifier + # characters. + if i > limit and ord(str[i - 1]) >= 128: + while i - 4 >= limit and ('a' + str[i - 4:pos]).isidentifier(): + i -= 4 + if i - 2 >= limit and ('a' + str[i - 2:pos]).isidentifier(): + i -= 2 + if i - 1 >= limit and ('a' + str[i - 1:pos]).isidentifier(): + i -= 1 + + # The identifier candidate starts here. If it isn't a valid + # identifier, don't eat anything. At this point that is only + # possible if the first character isn't a valid first + # character for an identifier. + if not str[i:pos].isidentifier(): + return 0 + elif i < pos: + # All characters in str[i:pos] are valid ASCII identifier + # characters, so it is enough to check that the first is + # valid as the first character of an identifier. + if not _IS_ASCII_ID_FIRST_CHAR[ord(str[i])]: + return 0 + + # All keywords are valid identifiers, but should not be + # considered identifiers here, except for True, False and None. + if i < pos and ( + iskeyword(str[i:pos]) and + str[i:pos] not in cls._ID_KEYWORDS + ): + return 0 + + return pos - i + + # This string includes all chars that may be in a white space _whitespace_chars = " \t\n\\" - # Ascii chars that may be in an identifier - _id_chars = string.ascii_letters + string.digits + "_" - # Ascii chars that may be the first char of an identifier - _id_first_chars = string.ascii_letters + "_" - - # Given a string and pos, return the number of chars in the - # identifier which ends at pos, or 0 if there is no such one. Saved - # words are not identifiers. - def _eat_identifier(self, str, limit, pos): - i = pos - while i > limit and str[i-1] in self._id_chars: - i -= 1 - if (i < pos and (str[i] not in self._id_first_chars or - (keyword.iskeyword(str[i:pos]) and - str[i:pos] not in {'None', 'False', 'True'}))): - i = pos - return pos - i def get_expression(self): """Return a string with the Python expression which ends at the diff --git a/Lib/idlelib/PyParse.py b/Lib/idlelib/PyParse.py --- a/Lib/idlelib/PyParse.py +++ b/Lib/idlelib/PyParse.py @@ -1,5 +1,7 @@ import re import sys +from collections import Mapping +from functools import partial # Reason last stmt is continued (or C_NONE if it's not). (C_NONE, C_BACKSLASH, C_STRING_FIRST_LINE, @@ -91,19 +93,48 @@ [^[\](){}#'"\\]+ """, re.VERBOSE).match -# Build translation table to map uninteresting chars to "x", open -# brackets to "(", and close brackets to ")". -_tran = {} -for i in range(256): - _tran[i] = 'x' -for ch in "({[": - _tran[ord(ch)] = '(' -for ch in ")}]": - _tran[ord(ch)] = ')' -for ch in "\"'\\\n#": - _tran[ord(ch)] = ch -del i, ch +class StringTranslatePseudoMapping(Mapping): + r"""Utility class to be used with str.translate() + + This Mapping class wraps a given dict. When a value for a key is + requested via __getitem__() or get(), the key is looked up in the + given dict. If found there, the value from the dict is returned. + Otherwise, the default value given upon initialization is returned. + + This allows using str.translate() to make some replacements, and to + replace all characters for which no replacement was specified with + a given character instead of leaving them as-is. + + For example, to replace everything except whitespace with 'x': + + >>> whitespace_chars = ' \t\n\r' + >>> preserve_dict = {ord(c): ord(c) for c in whitespace_chars} + >>> mapping = StringTranslatePseudoMapping(preserve_dict, ord('x')) + >>> text = "a + b\tc\nd" + >>> text.translate(mapping) + 'x x x\tx\nx' + """ + def __init__(self, non_defaults, default_value): + self._non_defaults = non_defaults + self._default_value = default_value + + def _get(key, _get=non_defaults.get, _default=default_value): + return _get(key, _default) + self._get = _get + + def __getitem__(self, item): + return self._get(item) + + def __len__(self): + return len(self._non_defaults) + + def __iter__(self): + return iter(self._non_defaults) + + def get(self, key, default=None): + return self._get(key) + class Parser: @@ -113,19 +144,6 @@ def set_str(self, s): assert len(s) == 0 or s[-1] == '\n' - if isinstance(s, str): - # The parse functions have no idea what to do with Unicode, so - # replace all Unicode characters with "x". This is "safe" - # so long as the only characters germane to parsing the structure - # of Python are 7-bit ASCII. It's *necessary* because Unicode - # strings don't have a .translate() method that supports - # deletechars. - uniphooey = s - s = [] - push = s.append - for raw in map(ord, uniphooey): - push(raw < 127 and chr(raw) or "x") - s = "".join(s) self.str = s self.study_level = 0 @@ -197,6 +215,16 @@ if lo > 0: self.str = self.str[lo:] + # Build a translation table to map uninteresting chars to 'x', open + # brackets to '(', close brackets to ')' while preserving quotes, + # backslashes, newlines and hashes. This is to be passed to + # str.translate() in _study1(). + _tran = {} + _tran.update((ord(c), ord('(')) for c in "({[") + _tran.update((ord(c), ord(')')) for c in ")}]") + _tran.update((ord(c), ord(c)) for c in "\"'\\\n#") + _tran = StringTranslatePseudoMapping(_tran, default_value=ord('x')) + # As quickly as humanly possible , find the line numbers (0- # based) of the non-continuation lines. # Creates self.{goodlines, continuation}. @@ -211,7 +239,7 @@ # uninteresting characters. This can cut the number of chars # by a factor of 10-40, and so greatly speed the following loop. str = self.str - str = str.translate(_tran) + str = str.translate(self._tran) str = str.replace('xxxxxxxx', 'x') str = str.replace('xxxx', 'x') str = str.replace('xx', 'x') diff --git a/Lib/idlelib/idle_test/test_hyperparser.py b/Lib/idlelib/idle_test/test_hyperparser.py --- a/Lib/idlelib/idle_test/test_hyperparser.py +++ b/Lib/idlelib/idle_test/test_hyperparser.py @@ -30,6 +30,7 @@ "z = ((r'asdf')+('a')))\n" '[x for x in\n' 'for = False\n' + 'clich? = "this is a string with unicode, what a clich?"' ) @classmethod @@ -93,6 +94,8 @@ self.assertTrue(p.is_in_string()) p = get('4.6') self.assertTrue(p.is_in_string()) + p = get('12.54') + self.assertTrue(p.is_in_string()) def test_is_in_code(self): get = self.get_parser @@ -180,12 +183,91 @@ p = get('10.0') self.assertEqual(p.get_expression(), '') + p = get('10.6') + self.assertEqual(p.get_expression(), '') + + p = get('10.11') + self.assertEqual(p.get_expression(), '') + p = get('11.3') self.assertEqual(p.get_expression(), '') p = get('11.11') self.assertEqual(p.get_expression(), 'False') + p = get('12.6') + self.assertEqual(p.get_expression(), 'clich?') + + def test_eat_identifier(self): + def is_valid_id(candidate): + result = HyperParser._eat_identifier(candidate, 0, len(candidate)) + if result == len(candidate): + return True + elif result == 0: + return False + else: + err_msg = "Unexpected result: {} (expected 0 or {}".format( + result, len(candidate) + ) + raise Exception(err_msg) + + # invalid first character which is valid elsewhere in an identifier + self.assertFalse(is_valid_id('2notid')) + + # ASCII-only valid identifiers + self.assertTrue(is_valid_id('valid_id')) + self.assertTrue(is_valid_id('_valid_id')) + self.assertTrue(is_valid_id('valid_id_')) + self.assertTrue(is_valid_id('_2valid_id')) + + # keywords which should be "eaten" + self.assertTrue(is_valid_id('True')) + self.assertTrue(is_valid_id('False')) + self.assertTrue(is_valid_id('None')) + + # keywords which should not be "eaten" + self.assertFalse(is_valid_id('for')) + self.assertFalse(is_valid_id('import')) + self.assertFalse(is_valid_id('return')) + + # valid unicode identifiers + self.assertTrue(is_valid_id('cliche')) + self.assertTrue(is_valid_id('clich?')) + self.assertTrue(is_valid_id('a?')) + + # invalid unicode identifiers + self.assertFalse(is_valid_id('2a')) + self.assertFalse(is_valid_id('?a')) + self.assertFalse(is_valid_id('a?')) + + # valid identifier after "punctuation" + self.assertEqual(HyperParser._eat_identifier('+ var', 0, 5), len('var')) + self.assertEqual(HyperParser._eat_identifier('+var', 0, 4), len('var')) + self.assertEqual(HyperParser._eat_identifier('.var', 0, 4), len('var')) + + # invalid identifiers + self.assertFalse(is_valid_id('+')) + self.assertFalse(is_valid_id(' ')) + self.assertFalse(is_valid_id(':')) + self.assertFalse(is_valid_id('?')) + self.assertFalse(is_valid_id('^')) + self.assertFalse(is_valid_id('\\')) + self.assertFalse(is_valid_id('"')) + self.assertFalse(is_valid_id('"a string"')) + + def test_eat_identifier_various_lengths(self): + eat_id = HyperParser._eat_identifier + + for length in range(1, 21): + self.assertEqual(eat_id('a' * length, 0, length), length) + self.assertEqual(eat_id('?' * length, 0, length), length) + self.assertEqual(eat_id('a' + '2' * (length - 1), 0, length), length) + self.assertEqual(eat_id('?' + '2' * (length - 1), 0, length), length) + self.assertEqual(eat_id('?' + 'a' * (length - 1), 0, length), length) + self.assertEqual(eat_id('?' * (length - 1) + 'a', 0, length), length) + self.assertEqual(eat_id('+' * length, 0, length), 0) + self.assertEqual(eat_id('2' + 'a' * (length - 1), 0, length), 0) + self.assertEqual(eat_id('2' + '?' * (length - 1), 0, length), 0) if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -264,6 +264,8 @@ - Issue #21455: Add a default backlog to socket.listen(). - Issue #21525: Most Tkinter methods which accepted tuples now accept lists too. +- Issue #21765: Add support for non-ascii identifiers to HyperParser. + - Issue #10744: Fix PEP 3118 format strings on ctypes objects with a nontrivial shape. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 15:52:31 2014 From: python-checkins at python.org (tal.einat) Date: Wed, 16 Jul 2014 15:52:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Fixed_recently_added_Misc/?= =?utf-8?q?NEWS_entry_which_was_moved_during_merge?= Message-ID: <3hD0Ql18zXz7Lp2@mail.python.org> http://hg.python.org/cpython/rev/73edc2c31249 changeset: 91691:73edc2c31249 user: Tal Einat date: Wed Jul 16 16:52:20 2014 +0300 summary: Fixed recently added Misc/NEWS entry which was moved during merge 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 @@ -264,8 +264,6 @@ - Issue #21455: Add a default backlog to socket.listen(). - Issue #21525: Most Tkinter methods which accepted tuples now accept lists too. -- Issue #21765: Add support for non-ascii identifiers to HyperParser. - - Issue #10744: Fix PEP 3118 format strings on ctypes objects with a nontrivial shape. @@ -590,6 +588,8 @@ IDLE ---- +- Issue #21765: Add support for non-ascii identifiers to HyperParser. + - Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav Heblikar. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:05:16 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:05:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogdGVz?= =?utf-8?q?t=5Fselector=5Fevents=3A_remove_duplicate_call_to_=5Fon=5Fhands?= =?utf-8?q?hake=28=29_method?= Message-ID: <3hD3Mw1520z7Ljv@mail.python.org> http://hg.python.org/cpython/rev/bf0e0a7f4795 changeset: 91692:bf0e0a7f4795 branch: 3.4 parent: 91689:8b3f7aecdf85 user: Victor Stinner date: Wed Jul 16 18:02:10 2014 +0200 summary: asyncio: test_selector_events: remove duplicate call to _on_handshake() method The _SelectorSslTransport constructor already calls it. files: Lib/test/test_asyncio/test_selector_events.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1089,17 +1089,17 @@ self.assertIsNone(waiter.result()) def test_on_handshake_reader_retry(self): + self.loop.set_debug(False) self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake(None) self.loop.assert_reader(1, transport._on_handshake, None) def test_on_handshake_writer_retry(self): + self.loop.set_debug(False) self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake(None) self.loop.assert_writer(1, transport._on_handshake, None) def test_on_handshake_exc(self): @@ -1120,7 +1120,7 @@ exc = BaseException() self.sslsock.do_handshake.side_effect = exc with test_utils.disable_logger(): - self.assertRaises(BaseException, transport._on_handshake, None) + self.assertRaises(BaseException, transport._on_handshake, 0) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:05:17 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:05:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgYXN5bmNpbzogdGVzdF9zZWxlY3Rvcl9ldmVudHM6?= =?utf-8?q?_remove_duplicate_call_to?= Message-ID: <3hD3Mx2s1ZzSTC@mail.python.org> http://hg.python.org/cpython/rev/c6091112648c changeset: 91693:c6091112648c parent: 91691:73edc2c31249 parent: 91692:bf0e0a7f4795 user: Victor Stinner date: Wed Jul 16 18:03:26 2014 +0200 summary: (Merge 3.4) asyncio: test_selector_events: remove duplicate call to _on_handshake() method The _SelectorSslTransport constructor already calls it. files: Lib/test/test_asyncio/test_selector_events.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -1089,17 +1089,17 @@ self.assertIsNone(waiter.result()) def test_on_handshake_reader_retry(self): + self.loop.set_debug(False) self.sslsock.do_handshake.side_effect = ssl.SSLWantReadError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake(None) self.loop.assert_reader(1, transport._on_handshake, None) def test_on_handshake_writer_retry(self): + self.loop.set_debug(False) self.sslsock.do_handshake.side_effect = ssl.SSLWantWriteError transport = _SelectorSslTransport( self.loop, self.sock, self.protocol, self.sslcontext) - transport._on_handshake(None) self.loop.assert_writer(1, transport._on_handshake, None) def test_on_handshake_exc(self): @@ -1120,7 +1120,7 @@ exc = BaseException() self.sslsock.do_handshake.side_effect = exc with test_utils.disable_logger(): - self.assertRaises(BaseException, transport._on_handshake, None) + self.assertRaises(BaseException, transport._on_handshake, 0) self.assertTrue(self.sslsock.close.called) self.assertTrue(transport._waiter.done()) self.assertIs(exc, transport._waiter.exception()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:38:41 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:38:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxMTYz?= =?utf-8?q?=2C_asyncio=3A_Ignore_=22destroy_pending_task=22_warnings_for_p?= =?utf-8?q?rivate_tasks?= Message-ID: <3hD46T2JyJz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/6d5a76214166 changeset: 91694:6d5a76214166 branch: 3.4 parent: 91692:bf0e0a7f4795 user: Victor Stinner date: Wed Jul 16 18:36:24 2014 +0200 summary: Issue #21163, asyncio: Ignore "destroy pending task" warnings for private tasks in gather(). files: Lib/asyncio/tasks.py | 34 +++++++++++++++++++++---------- 1 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -558,21 +558,33 @@ prevent the cancellation of one child to cause other children to be cancelled.) """ - arg_to_fut = {arg: async(arg, loop=loop) for arg in set(coros_or_futures)} - children = [arg_to_fut[arg] for arg in coros_or_futures] - n = len(children) - if n == 0: + if not coros_or_futures: outer = futures.Future(loop=loop) outer.set_result([]) return outer - if loop is None: - loop = children[0]._loop - for fut in children: - if fut._loop is not loop: - raise ValueError("futures are tied to different event loops") + + arg_to_fut = {} + for arg in set(coros_or_futures): + if not isinstance(arg, futures.Future): + fut = async(arg, loop=loop) + if loop is None: + loop = fut._loop + # The caller cannot control this future, the "destroy pending task" + # warning should not be emitted. + fut._log_destroy_pending = False + else: + fut = arg + if loop is None: + loop = fut._loop + elif fut._loop is not loop: + raise ValueError("futures are tied to different event loops") + arg_to_fut[arg] = fut + + children = [arg_to_fut[arg] for arg in coros_or_futures] + nchildren = len(children) outer = _GatheringFuture(children, loop=loop) nfinished = 0 - results = [None] * n + results = [None] * nchildren def _done_callback(i, fut): nonlocal nfinished @@ -595,7 +607,7 @@ res = fut._result results[i] = res nfinished += 1 - if nfinished == n: + if nfinished == nchildren: outer.set_result(results) for i, fut in enumerate(children): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:38:42 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:38:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzIxMTYzLCBhc3luY2lvOiBJZ25vcmUg?= =?utf-8?q?=22destroy_pending_task=22_warnings_for?= Message-ID: <3hD46V3hH6z7LkP@mail.python.org> http://hg.python.org/cpython/rev/fbd3e9f635b6 changeset: 91695:fbd3e9f635b6 parent: 91693:c6091112648c parent: 91694:6d5a76214166 user: Victor Stinner date: Wed Jul 16 18:36:58 2014 +0200 summary: (Merge 3.4) Issue #21163, asyncio: Ignore "destroy pending task" warnings for private tasks in gather(). files: Lib/asyncio/tasks.py | 34 +++++++++++++++++++++---------- 1 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -558,21 +558,33 @@ prevent the cancellation of one child to cause other children to be cancelled.) """ - arg_to_fut = {arg: async(arg, loop=loop) for arg in set(coros_or_futures)} - children = [arg_to_fut[arg] for arg in coros_or_futures] - n = len(children) - if n == 0: + if not coros_or_futures: outer = futures.Future(loop=loop) outer.set_result([]) return outer - if loop is None: - loop = children[0]._loop - for fut in children: - if fut._loop is not loop: - raise ValueError("futures are tied to different event loops") + + arg_to_fut = {} + for arg in set(coros_or_futures): + if not isinstance(arg, futures.Future): + fut = async(arg, loop=loop) + if loop is None: + loop = fut._loop + # The caller cannot control this future, the "destroy pending task" + # warning should not be emitted. + fut._log_destroy_pending = False + else: + fut = arg + if loop is None: + loop = fut._loop + elif fut._loop is not loop: + raise ValueError("futures are tied to different event loops") + arg_to_fut[arg] = fut + + children = [arg_to_fut[arg] for arg in coros_or_futures] + nchildren = len(children) outer = _GatheringFuture(children, loop=loop) nfinished = 0 - results = [None] * n + results = [None] * nchildren def _done_callback(i, fut): nonlocal nfinished @@ -595,7 +607,7 @@ res = fut._result results[i] = res nfinished += 1 - if nfinished == n: + if nfinished == nchildren: outer.set_result(results) for i, fut in enumerate(children): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:52:11 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:52:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxMTYz?= =?utf-8?q?=3A_Fix_=22destroy_pending_task=22_warning_in_test=5Fwait=5Ferr?= =?utf-8?b?b3JzKCk=?= Message-ID: <3hD4Q324mQz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/e4fe6706b7b4 changeset: 91696:e4fe6706b7b4 branch: 3.4 parent: 91694:6d5a76214166 user: Victor Stinner date: Wed Jul 16 18:50:39 2014 +0200 summary: Issue #21163: Fix "destroy pending task" warning in test_wait_errors() files: Lib/asyncio/tasks.py | 4 ++-- Lib/test/test_asyncio/test_tasks.py | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -330,14 +330,14 @@ raise TypeError("expect a list of futures, not %s" % type(fs).__name__) if not fs: raise ValueError('Set of coroutines/Futures is empty.') + if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): + raise ValueError('Invalid return_when value: {}'.format(return_when)) if loop is None: loop = events.get_event_loop() fs = {async(f, loop=loop) for f in set(fs)} - if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): - raise ValueError('Invalid return_when value: {}'.format(return_when)) return (yield from _wait(fs, timeout, return_when, loop)) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -623,10 +623,13 @@ ValueError, self.loop.run_until_complete, asyncio.wait(set(), loop=self.loop)) - self.assertRaises( - ValueError, self.loop.run_until_complete, - asyncio.wait([asyncio.sleep(10.0, loop=self.loop)], - return_when=-1, loop=self.loop)) + # -1 is an invalid return_when value + sleep_coro = asyncio.sleep(10.0, loop=self.loop) + wait_coro = asyncio.wait([sleep_coro], return_when=-1, loop=self.loop) + self.assertRaises(ValueError, + self.loop.run_until_complete, wait_coro) + + sleep_coro.close() def test_wait_first_completed(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:52:12 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:52:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2321163=3A_Fix_=22destroy_pendi?= =?utf-8?q?ng_task=22_warning_in?= Message-ID: <3hD4Q43vrtz7Lll@mail.python.org> http://hg.python.org/cpython/rev/a627b23f57d4 changeset: 91697:a627b23f57d4 parent: 91695:fbd3e9f635b6 parent: 91696:e4fe6706b7b4 user: Victor Stinner date: Wed Jul 16 18:50:54 2014 +0200 summary: (Merge 3.4) Issue #21163: Fix "destroy pending task" warning in test_wait_errors() files: Lib/asyncio/tasks.py | 4 ++-- Lib/test/test_asyncio/test_tasks.py | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -330,14 +330,14 @@ raise TypeError("expect a list of futures, not %s" % type(fs).__name__) if not fs: raise ValueError('Set of coroutines/Futures is empty.') + if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): + raise ValueError('Invalid return_when value: {}'.format(return_when)) if loop is None: loop = events.get_event_loop() fs = {async(f, loop=loop) for f in set(fs)} - if return_when not in (FIRST_COMPLETED, FIRST_EXCEPTION, ALL_COMPLETED): - raise ValueError('Invalid return_when value: {}'.format(return_when)) return (yield from _wait(fs, timeout, return_when, loop)) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -623,10 +623,13 @@ ValueError, self.loop.run_until_complete, asyncio.wait(set(), loop=self.loop)) - self.assertRaises( - ValueError, self.loop.run_until_complete, - asyncio.wait([asyncio.sleep(10.0, loop=self.loop)], - return_when=-1, loop=self.loop)) + # -1 is an invalid return_when value + sleep_coro = asyncio.sleep(10.0, loop=self.loop) + wait_coro = asyncio.wait([sleep_coro], return_when=-1, loop=self.loop) + self.assertRaises(ValueError, + self.loop.run_until_complete, wait_coro) + + sleep_coro.close() def test_wait_first_completed(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:53:32 2014 From: python-checkins at python.org (guido.van.rossum) Date: Wed, 16 Jul 2014 18:53:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Add_PEP_473_=22Adding_structu?= =?utf-8?q?red_data_to_built-in_exceptions=22_by_Sebastian_Kreft=2E?= Message-ID: <3hD4Rc0yc5z7LrD@mail.python.org> http://hg.python.org/peps/rev/26b6f245312d changeset: 5497:26b6f245312d user: Guido van Rossum date: Wed Jul 16 09:53:21 2014 -0700 summary: Add PEP 473 "Adding structured data to built-in exceptions" by Sebastian Kreft. files: pep-0473.txt | 290 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 290 insertions(+), 0 deletions(-) diff --git a/pep-0473.txt b/pep-0473.txt new file mode 100644 --- /dev/null +++ b/pep-0473.txt @@ -0,0 +1,290 @@ +PEP: 473 +Title: Adding structured data to built-in exceptions +Version: $Revision$ +Last-Modified: $Date$ +Author: Sebastian Kreft +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 29-Mar-2014 +Post-History: + + +Abstract +======== + +Exceptions like ``AttributeError``, ``IndexError``, ``KeyError``, +``LookupError``, ``NameError``, , ``TypeError`` and ``ValueError`` do not +provide all information required by programmers to debug and better understand +what caused them. +Furthermore, in some cases the messages even have slightly different formats, +which makes it really difficult for tools to automatically provide additional +information to diagnose the problem. +To tackle the former and to lay ground for the latter, it is proposed to expand +these exceptions so to hold both the offending and affected entities. + + +Rationale +========= + +The main issue this PEP aims to solve is the fact that currently error messages +are not that expressive and lack some key information to resolve the exceptions. +Additionally, the information present on the error message is not always in the +same format, which makes it very difficult for third-party libraries to +provide automated diagnosis of the error. + +These automated tools could, for example, detect typos or display or log extra +debug information. These could be particularly useful when running tests or in a +long running application. + +Although it is in theory possible to have such libraries, they need to resort to +hacks in order to achieve the goal. One such example is +python-improved-exceptions [1]_, which modifies the byte-code to keep references +to the possibly interesting objects and also parses the error messages to +extract information like types or names. Unfortunately, such approach is +extremely fragile and not portable. + +A similar proposal [2]_ has been implemented for ``ImportError`` and in the same +fashion this idea has received support [3]_. Additionally, almost 10 years ago +Guido asked in [11]_ to have a clean API to access the affected objects in +Exceptions like ``KeyError``, ``AttributeError``, ``NameError`` and +``IndexError``. Similar issues and proposals ideas have been written in the +last year. Some other issues have been created, but despite receiving support +they finally get abandoned. References to the created issues are listed below: + +* ``AttributeError``: [11]_, [10]_, [5]_, [4]_, [3]_ + +* ``IndexError``: [11]_, [6]_, [3]_ + +* ``KeyError``: [11]_, [7]_, [3]_ + +* ``LookupError``: [11]_ + +* ``NameError``: [11]_, [10]_, [3]_ + +* ``TypeError``: [8]_ + +* ``ValueError``: [9]_ + + +To move forward with the development and to centralize the information and +discussion, this PEP aims to be a meta-issue summarizing all the above +discussions and ideas. + + +Examples +======== + +IndexError +---------- + +The error message does not reference the list's length nor the index used. + +:: + + a = [1, 2, 3, 4, 5] + a[5] + IndexError: list index out of range + + +KeyError +-------- + +By convention the key is the first element of the error's argument, but there's +no other information regarding the affected dictionary (keys types, size, etc.) + +:: + + b = {'foo': 1} + b['fo'] + KeyError: 'fo' + + +AttributeError +-------------- + +The object's type and the offending attribute are part of the error message. +However, there are some different formats and the information is not always +available. Furthermore, although the object type is useful in some cases, given +the dynamic nature of Python, it would be much more useful to have a reference +to the object itself. Additionally the reference to the type is not fully +qualified and in some cases the type is just too generic to provide useful +information, for example in case of accessing a module's attribute. + +:: + + c = object() + c.foo + AttributeError: 'object' object has no attribute 'foo' + + import string + string.foo + AttributeError: 'module' object has no attribute 'foo' + + a = string.Formatter() + a.foo + AttributeError: 'Formatter' object has no attribute 'foo' + + +NameError +--------- + +The error message provides typically the name. + +:: + + foo = 1 + fo + NameError: global name 'fo' is not defined + + +Other Cases +----------- + +Issues are even harder to debug when the target object is the result of +another expression, for example: + +:: + + a[b[c[0]]] + +This issue is also related to the fact that opcodes only have line number +information and not the offset. This proposal would help in this case but not as +much as having offsets. + + +Proposal +======== + +Extend the exceptions ``AttributeError``, ``IndexError``, ``KeyError``, +``LookupError``, ``NameError``, , ``TypeError`` and ``ValueError`` with the +following: + +* ``AttributeError``: target :sup:`w`, attribute + +* ``IndexError``: target :sup:`w`, key :sup:`w`, index (just an alias to + key) + +* ``KeyError``: target :sup:`w`, key :sup:`w` + +* ``LookupError``: target :sup:`w`, key :sup:`w` + +* ``NameError``: name, scope? + +* ``TypeError``: unexpected_type + +* ``ValueError``: unexpected_value :sup:`w` + +Attributes with the superscript :sup:`w` may need to be weak references [12]_ to +prevent any memory cycles. However, this may add an unnecessary extra +complexity as noted by R. David Murray [13]_. This is specially true given that +builtin types do not support being weak referenced. + +TODO(skreft): expand this with examples of corner cases. + +To remain backwards compatible these new attributes will be optional and keyword +only. + +It is proposed to add this information, rather than just improve the error, as +the former would allow new debugging frameworks and tools and also in the future +to switch to a lazy generated message. Generated messages are discussed in [2]_, +although they are not implemented at the moment. They would not only save some +resources, but also uniform the messages. + +The stdlib will be then gradually changed so to start using these new +attributes. + + +Potential Uses +============== + +An automated tool could for example search for similar keys within the object, +allowing to display the following::: + + a = {'foo': 1} + a['fo'] + KeyError: 'fo'. Did you mean 'foo'? + + foo = 1 + fo + NameError: global name 'fo' is not defined. Did you mean 'foo'? + +See [3]_ for the output a TestRunner could display. + + +Performance +=========== + +Filling these new attributes would only require two extra parameters with data +already available so the impact should be marginal. However, it may need +special care for ``KeyError`` as the following pattern is already widespread. + +:: + + try: + a[foo] = a[foo] + 1 + except: + a[foo] = 0 + +Note as well that storing these objects into the error itself would allow the +lazy generation of the error message, as discussed in [2]_. + + +References +========== + +.. [1] Python Exceptions Improved + (https://www.github.com/sk-/python-exceptions-improved) + +.. [2] ImportError needs attributes for module and file name + (http://bugs.python.org/issue1559549) + +.. [3] Enhance exceptions by attaching some more information to them + (https://mail.python.org/pipermail/python-ideas/2014-February/025601.html) + +.. [4] Specifity in AttributeError + (https://mail.python.org/pipermail/python-ideas/2013-April/020308.html) + +.. [5] Add an 'attr' attribute to AttributeError + (http://bugs.python.org/issue18156) + +.. [6] Add index attribute to IndexError + (http://bugs.python.org/issue18162) + +.. [7] Add a 'key' attribute to KeyError + (http://bugs.python.org/issue18163) + +.. [8] Add 'unexpected_type' to TypeError + (http://bugs.python.org/issue18165) + +.. [9] 'value' attribute for ValueError + (http://bugs.python.org/issue18166) + +.. [10] making builtin exceptions more informative + (http://bugs.python.org/issue1182143) + +.. [11] LookupError etc. need API to get the key + (http://bugs.python.org/issue614557) + +.. [12] weakref - Weak References + (https://docs.python.org/3/library/weakref.html) + +.. [13] Message by R. David Murray: Weak refs on exceptions? + (http://bugs.python.org/issue18163#msg190791) + + +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 Wed Jul 16 18:56:23 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:56:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogdGVz?= =?utf-8?q?t=5Fas=5Fcompleted=28=29=3A_disable_=22slow_callback=22_warning?= Message-ID: <3hD4Vv3qdCz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/f89d0ffd67ab changeset: 91698:f89d0ffd67ab branch: 3.4 parent: 91696:e4fe6706b7b4 user: Victor Stinner date: Wed Jul 16 18:54:13 2014 +0200 summary: asyncio: test_as_completed(): disable "slow callback" warning files: Lib/test/test_asyncio/test_tasks.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -851,6 +851,8 @@ yield 0 loop = self.new_test_loop(gen) + # disable "slow callback" warning + loop.slow_callback_duration = 1.0 completed = set() time_shifted = False -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 18:56:24 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 16 Jul 2014 18:56:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgYXN5bmNpbzogdGVzdF9hc19jb21wbGV0ZWQoKTog?= =?utf-8?q?disable_=22slow_callback=22_warning?= Message-ID: <3hD4Vw5cghz7Ll6@mail.python.org> http://hg.python.org/cpython/rev/4c39d69bf08f changeset: 91699:4c39d69bf08f parent: 91697:a627b23f57d4 parent: 91698:f89d0ffd67ab user: Victor Stinner date: Wed Jul 16 18:54:25 2014 +0200 summary: (Merge 3.4) asyncio: test_as_completed(): disable "slow callback" warning files: Lib/test/test_asyncio/test_tasks.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -851,6 +851,8 @@ yield 0 loop = self.new_test_loop(gen) + # disable "slow callback" warning + loop.slow_callback_duration = 1.0 completed = set() time_shifted = False -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 20:30:42 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 20:30:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Remove_Tools/s?= =?utf-8?q?cripts/pydocgui=2Epyw=2E?= Message-ID: <3hD6bk1CT9z7LnY@mail.python.org> http://hg.python.org/cpython/rev/2e578b80c2f3 changeset: 91700:2e578b80c2f3 branch: 3.4 parent: 91698:f89d0ffd67ab user: Zachary Ware date: Wed Jul 16 13:24:55 2014 -0500 summary: Remove Tools/scripts/pydocgui.pyw. pydoc.gui was removed over 3 years ago (#10818), this script has been utterly bereft of worth since then. files: Tools/scripts/pydocgui.pyw | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) diff --git a/Tools/scripts/pydocgui.pyw b/Tools/scripts/pydocgui.pyw deleted file mode 100755 --- a/Tools/scripts/pydocgui.pyw +++ /dev/null @@ -1,7 +0,0 @@ -# Note: this file must not be named pydoc.pyw, lest it just end up -# importing itself (Python began allowing import of .pyw files -# between 2.2a1 and 2.2a2). -import pydoc - -if __name__ == '__main__': - pydoc.gui() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 20:30:43 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 20:30:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_removal_of_Tools/scripts/pydocgui=2Epyw?= Message-ID: <3hD6bl2s41z7LkP@mail.python.org> http://hg.python.org/cpython/rev/39e375050eee changeset: 91701:39e375050eee parent: 91699:4c39d69bf08f parent: 91700:2e578b80c2f3 user: Zachary Ware date: Wed Jul 16 13:30:27 2014 -0500 summary: Merge removal of Tools/scripts/pydocgui.pyw files: Tools/scripts/pydocgui.pyw | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) diff --git a/Tools/scripts/pydocgui.pyw b/Tools/scripts/pydocgui.pyw deleted file mode 100755 --- a/Tools/scripts/pydocgui.pyw +++ /dev/null @@ -1,7 +0,0 @@ -# Note: this file must not be named pydoc.pyw, lest it just end up -# importing itself (Python began allowing import of .pyw files -# between 2.2a1 and 2.2a2). -import pydoc - -if __name__ == '__main__': - pydoc.gui() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 21:33:59 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 21:33:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTE4?= =?utf-8?q?=3A_Convert_test=5Ftools=2Epy_to_a_sub-package_of_test=2E?= Message-ID: <3hD80l5GLwz7Llf@mail.python.org> http://hg.python.org/cpython/rev/e69f037332a6 changeset: 91702:e69f037332a6 branch: 3.4 parent: 91700:2e578b80c2f3 user: Zachary Ware date: Wed Jul 16 14:26:09 2014 -0500 summary: Issue #21918: Convert test_tools.py to a sub-package of test. files: Lib/test/test_tools/__init__.py | 31 + Lib/test/test_tools/__main__.py | 4 + Lib/test/test_tools.py | 497 +------------------- Lib/test/test_tools.py | 452 +----------------- Lib/test/test_tools.py | 497 +------------------- Lib/test/test_tools.py | 192 +------- Lib/test/test_tools.py | 501 +------------------- Lib/test/test_tools.py | 502 +------------------- Tools/parser/test_unparse.py | 20 +- Misc/NEWS | 3 + 10 files changed, 86 insertions(+), 2613 deletions(-) diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools/__init__.py @@ -0,0 +1,31 @@ +"""Support functions for testing scripts in the Tools directory.""" +import os +import unittest +import importlib +from test import support +from fnmatch import fnmatch + +basepath = os.path.dirname( # + os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__)))) # test_tools + +toolsdir = os.path.join(basepath, 'Tools') +scriptsdir = os.path.join(toolsdir, 'scripts') + +def skip_if_missing(): + if not os.path.isdir(scriptsdir): + raise unittest.SkipTest('scripts directory could not be found') + +def import_tool(toolname): + with support.DirsOnSysPath(scriptsdir): + return importlib.import_module(toolname) + +def load_tests(loader, standard_tests, pattern): + this_dir = os.path.dirname(__file__) + if pattern is None: + pattern = "test*" + with support.DirsOnSysPath(): + package_tests = loader.discover(start_dir=this_dir, pattern=pattern) + standard_tests.addTests(package_tests) + return standard_tests diff --git a/Lib/test/test_tools/__main__.py b/Lib/test/test_tools/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools/__main__.py @@ -0,0 +1,4 @@ +from test.test_tools import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_gprof2html.py rename from Lib/test/test_tools.py rename to Lib/test/test_tools/test_gprof2html.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_gprof2html.py @@ -1,438 +1,20 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the gprof2html script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery +import importlib import unittest from unittest import mock -import shutil -import subprocess -import sysconfig import tempfile -import textwrap -from test import support -from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing, import_tool -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._SpecMethods(spec).load() - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - +skip_if_missing() class Gprof2htmlTests(unittest.TestCase): def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._SpecMethods(spec).load() + self.gprof = import_tool('gprof2html') oldargv = sys.argv def fixup(): sys.argv = oldargv @@ -450,74 +32,5 @@ self.assertTrue(wmock.open.called) -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_md5sum.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_md5sum.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_md5sum.py @@ -1,457 +1,16 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the md5sum script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap from test import support from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, import_tool, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._SpecMethods(spec).load() - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._SpecMethods(spec).load() - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - +skip_if_missing() class MD5SumTests(unittest.TestCase): - @classmethod def setUpClass(cls): cls.script = os.path.join(scriptsdir, 'md5sum.py') @@ -514,10 +73,5 @@ self.assertGreater(err, b'') -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_pdeps.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_pdeps.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_pdeps.py @@ -1,418 +1,21 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the pdeps script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig import tempfile -import textwrap from test import support -from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing, import_tool -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp +skip_if_missing() class PdepsTests(unittest.TestCase): @classmethod def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._SpecMethods(spec).load() - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] + self.pdeps = import_tool('pdeps') def test_process_errors(self): # Issue #14492: m_import.match(line) can be None. @@ -427,97 +30,5 @@ self.pdeps.inverse({'a': []}) -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._SpecMethods(spec).load() - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_pindent.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_pindent.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_pindent.py @@ -1,43 +1,16 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the pindent script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil import subprocess -import sysconfig -import tempfile import textwrap from test import support -from test.script_helper import assert_python_ok, assert_python_failure +from test.script_helper import assert_python_ok -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') +skip_if_missing() class PindentTests(unittest.TestCase): @@ -362,162 +335,5 @@ self.pindent_test(clean, closed) -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._SpecMethods(spec).load() - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._SpecMethods(spec).load() - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_reindent.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_reindent.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_reindent.py @@ -5,28 +5,12 @@ """ import os -import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap -from test import support -from test.script_helper import assert_python_ok, assert_python_failure +from test.script_helper import assert_python_ok -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - +skip_if_missing() class ReindentTests(unittest.TestCase): script = os.path.join(scriptsdir, 'reindent.py') @@ -40,484 +24,5 @@ self.assertGreater(err, b'') -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._SpecMethods(spec).load() - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._SpecMethods(spec).load() - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_sundry.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_sundry.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_sundry.py @@ -1,523 +1,53 @@ """Tests for scripts in the Tools directory. -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. +This file contains extremely basic regression tests for the scripts found in +the Tools directory of a Python checkout or tarball which don't have separate +tests of their own, such as h2py.py. """ import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap from test import support -from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, import_tool, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - +skip_if_missing() class TestSundryScripts(unittest.TestCase): # At least make sure the rest don't have syntax errors. When tests are # added for a script it should be added to the whitelist below. # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] + whitelist = ['reindent', 'pdeps', 'gprof2html', 'md5sum'] # scripts that can't be imported without running - blacklist = ['make_ctype.py'] + blacklist = ['make_ctype'] # scripts that use windows-only modules - windows_only = ['win_add2path.py'] + windows_only = ['win_add2path'] # blacklisted for other reasons - other = ['analyze_dxp.py'] + other = ['analyze_dxp'] skiplist = blacklist + whitelist + windows_only + other - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - def test_sundry(self): for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) + name = fn[:-3] + if fn.endswith('.py') and name not in self.skiplist: + import_tool(name) @unittest.skipIf(sys.platform != "win32", "Windows-only test") def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) + for name in self.windows_only: + import_tool(name) @unittest.skipIf(not support.threading, "test requires _thread module") def test_analyze_dxp_import(self): if hasattr(sys, 'getdxp'): - import analyze_dxp + import_tool('analyze_dxp') else: with self.assertRaises(RuntimeError): - import analyze_dxp + import_tool('analyze_dxp') -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._SpecMethods(spec).load() - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._SpecMethods(spec).load() - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Tools/parser/test_unparse.py b/Lib/test/test_tools/test_unparse.py rename from Tools/parser/test_unparse.py rename to Lib/test/test_tools/test_unparse.py --- a/Tools/parser/test_unparse.py +++ b/Lib/test/test_tools/test_unparse.py @@ -1,12 +1,22 @@ +"""Tests for the unparse.py script in the Tools/parser directory.""" + import unittest import test.support import io import os import random import tokenize -import unparse import ast +from test.test_tools import basepath, toolsdir, skip_if_missing + +skip_if_missing() + +parser_path = os.path.join(toolsdir, "parser") + +with test.support.DirsOnSysPath(parser_path): + import unparse + def read_pyfile(filename): """Read and return the contents of a Python source file (as a string), taking into account the file encoding.""" @@ -249,11 +259,10 @@ def test_files(self): # get names of files to test - dist_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir) names = [] for d in self.test_directories: - test_dir = os.path.join(dist_dir, d) + test_dir = os.path.join(basepath, d) for n in os.listdir(test_dir): if n.endswith('.py') and not n.startswith('bad'): names.append(os.path.join(test_dir, n)) @@ -269,8 +278,5 @@ self.check_roundtrip(source) -def test_main(): - test.support.run_unittest(UnparseTestCase, DirectoryTestCase) - if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -198,6 +198,9 @@ Tests ----- +- Issue #21918: Converted test_tools from a module to a package containing + separate test files for each tested script. + - Issue #20155: Changed HTTP method names in failing tests in test_httpservers so that packet filtering software (specifically Windows Base Filtering Engine) does not interfere with the transaction semantics expected by the tests. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 21:34:01 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 21:34:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321918=3A_Convert_test=5Ftools=2Epy_to_a_sub-pac?= =?utf-8?q?kage_of_test=2E?= Message-ID: <3hD80n4qcGz7Lmc@mail.python.org> http://hg.python.org/cpython/rev/1d0ca204c36f changeset: 91703:1d0ca204c36f parent: 91701:39e375050eee parent: 91702:e69f037332a6 user: Zachary Ware date: Wed Jul 16 14:31:51 2014 -0500 summary: Issue #21918: Convert test_tools.py to a sub-package of test. Merge with 3.4. files: Lib/test/test_tools/__init__.py | 31 + Lib/test/test_tools/__main__.py | 4 + Lib/test/test_tools.py | 497 +------------------- Lib/test/test_tools.py | 452 +----------------- Lib/test/test_tools.py | 497 +------------------- Lib/test/test_tools.py | 192 +------- Lib/test/test_tools.py | 501 +------------------- Lib/test/test_tools.py | 502 +------------------- Tools/parser/test_unparse.py | 20 +- Misc/NEWS | 3 + 10 files changed, 86 insertions(+), 2613 deletions(-) diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools/__init__.py @@ -0,0 +1,31 @@ +"""Support functions for testing scripts in the Tools directory.""" +import os +import unittest +import importlib +from test import support +from fnmatch import fnmatch + +basepath = os.path.dirname( # + os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__)))) # test_tools + +toolsdir = os.path.join(basepath, 'Tools') +scriptsdir = os.path.join(toolsdir, 'scripts') + +def skip_if_missing(): + if not os.path.isdir(scriptsdir): + raise unittest.SkipTest('scripts directory could not be found') + +def import_tool(toolname): + with support.DirsOnSysPath(scriptsdir): + return importlib.import_module(toolname) + +def load_tests(loader, standard_tests, pattern): + this_dir = os.path.dirname(__file__) + if pattern is None: + pattern = "test*" + with support.DirsOnSysPath(): + package_tests = loader.discover(start_dir=this_dir, pattern=pattern) + standard_tests.addTests(package_tests) + return standard_tests diff --git a/Lib/test/test_tools/__main__.py b/Lib/test/test_tools/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools/__main__.py @@ -0,0 +1,4 @@ +from test.test_tools import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_gprof2html.py rename from Lib/test/test_tools.py rename to Lib/test/test_tools/test_gprof2html.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_gprof2html.py @@ -1,438 +1,20 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the gprof2html script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery +import importlib import unittest from unittest import mock -import shutil -import subprocess -import sysconfig import tempfile -import textwrap -from test import support -from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing, import_tool -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._load(spec) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - +skip_if_missing() class Gprof2htmlTests(unittest.TestCase): def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._load(spec) + self.gprof = import_tool('gprof2html') oldargv = sys.argv def fixup(): sys.argv = oldargv @@ -450,74 +32,5 @@ self.assertTrue(wmock.open.called) -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_md5sum.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_md5sum.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_md5sum.py @@ -1,457 +1,16 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the md5sum script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap from test import support from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, import_tool, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._load(spec) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._load(spec) - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - +skip_if_missing() class MD5SumTests(unittest.TestCase): - @classmethod def setUpClass(cls): cls.script = os.path.join(scriptsdir, 'md5sum.py') @@ -514,10 +73,5 @@ self.assertGreater(err, b'') -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_pdeps.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_pdeps.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_pdeps.py @@ -1,418 +1,21 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the pdeps script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig import tempfile -import textwrap from test import support -from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing, import_tool -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp +skip_if_missing() class PdepsTests(unittest.TestCase): @classmethod def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._load(spec) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] + self.pdeps = import_tool('pdeps') def test_process_errors(self): # Issue #14492: m_import.match(line) can be None. @@ -427,97 +30,5 @@ self.pdeps.inverse({'a': []}) -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._load(spec) - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_pindent.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_pindent.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_pindent.py @@ -1,43 +1,16 @@ -"""Tests for scripts in the Tools directory. - -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. -""" +"""Tests for the pindent script in the Tools directory.""" import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil import subprocess -import sysconfig -import tempfile import textwrap from test import support -from test.script_helper import assert_python_ok, assert_python_failure +from test.script_helper import assert_python_ok -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') +skip_if_missing() class PindentTests(unittest.TestCase): @@ -362,162 +335,5 @@ self.pindent_test(clean, closed) -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._load(spec) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._load(spec) - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_reindent.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_reindent.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_reindent.py @@ -5,28 +5,12 @@ """ import os -import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap -from test import support -from test.script_helper import assert_python_ok, assert_python_failure +from test.script_helper import assert_python_ok -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - +skip_if_missing() class ReindentTests(unittest.TestCase): script = os.path.join(scriptsdir, 'reindent.py') @@ -40,484 +24,5 @@ self.assertGreater(err, b'') -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - - -class TestSundryScripts(unittest.TestCase): - # At least make sure the rest don't have syntax errors. When tests are - # added for a script it should be added to the whitelist below. - - # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] - # scripts that can't be imported without running - blacklist = ['make_ctype.py'] - # scripts that use windows-only modules - windows_only = ['win_add2path.py'] - # blacklisted for other reasons - other = ['analyze_dxp.py'] - - skiplist = blacklist + whitelist + windows_only + other - - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - - def test_sundry(self): - for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) - - @unittest.skipIf(sys.platform != "win32", "Windows-only test") - def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) - - @unittest.skipIf(not support.threading, "test requires _thread module") - def test_analyze_dxp_import(self): - if hasattr(sys, 'getdxp'): - import analyze_dxp - else: - with self.assertRaises(RuntimeError): - import analyze_dxp - - -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._load(spec) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._load(spec) - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools/test_sundry.py copy from Lib/test/test_tools.py copy to Lib/test/test_tools/test_sundry.py --- a/Lib/test/test_tools.py +++ b/Lib/test/test_tools/test_sundry.py @@ -1,523 +1,53 @@ """Tests for scripts in the Tools directory. -This file contains regression tests for some of the scripts found in the -Tools directory of a Python checkout or tarball, such as reindent.py. +This file contains extremely basic regression tests for the scripts found in +the Tools directory of a Python checkout or tarball which don't have separate +tests of their own, such as h2py.py. """ import os import sys -import importlib._bootstrap -import importlib.machinery import unittest -from unittest import mock -import shutil -import subprocess -import sysconfig -import tempfile -import textwrap from test import support -from test.script_helper import assert_python_ok, assert_python_failure -if not sysconfig.is_python_build(): - # XXX some installers do contain the tools, should we detect that - # and run the tests in that case too? - raise unittest.SkipTest('test irrelevant for an installed Python') +from test.test_tools import scriptsdir, import_tool, skip_if_missing -basepath = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), - 'Tools') -scriptsdir = os.path.join(basepath, 'scripts') - - -class ReindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'reindent.py') - - def test_noargs(self): - assert_python_ok(self.script) - - def test_help(self): - rc, out, err = assert_python_ok(self.script, '-h') - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -class PindentTests(unittest.TestCase): - script = os.path.join(scriptsdir, 'pindent.py') - - def assertFileEqual(self, fn1, fn2): - with open(fn1) as f1, open(fn2) as f2: - self.assertEqual(f1.readlines(), f2.readlines()) - - def pindent(self, source, *args): - with subprocess.Popen( - (sys.executable, self.script) + args, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - universal_newlines=True) as proc: - out, err = proc.communicate(source) - self.assertIsNone(err) - return out - - def lstriplines(self, data): - return '\n'.join(line.lstrip() for line in data.splitlines()) + '\n' - - def test_selftest(self): - self.maxDiff = None - with support.temp_dir() as directory: - data_path = os.path.join(directory, '_test.py') - with open(self.script) as f: - closed = f.read() - with open(data_path, 'w') as f: - f.write(closed) - - rc, out, err = assert_python_ok(self.script, '-d', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - backup = data_path + '~' - self.assertTrue(os.path.exists(backup)) - with open(backup) as f: - self.assertEqual(f.read(), closed) - with open(data_path) as f: - clean = f.read() - compile(clean, '_test.py', 'exec') - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - rc, out, err = assert_python_ok(self.script, '-c', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), clean) - with open(data_path) as f: - self.assertEqual(f.read(), closed) - - broken = self.lstriplines(closed) - with open(data_path, 'w') as f: - f.write(broken) - rc, out, err = assert_python_ok(self.script, '-r', data_path) - self.assertEqual(out, b'') - self.assertEqual(err, b'') - with open(backup) as f: - self.assertEqual(f.read(), broken) - with open(data_path) as f: - indented = f.read() - compile(indented, '_test.py', 'exec') - self.assertEqual(self.pindent(broken, '-r'), indented) - - def pindent_test(self, clean, closed): - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '4'), closed) - - def test_statements(self): - clean = textwrap.dedent("""\ - if a: - pass - - if a: - pass - else: - pass - - if a: - pass - elif: - pass - else: - pass - - while a: - break - - while a: - break - else: - pass - - for i in a: - break - - for i in a: - break - else: - pass - - try: - pass - finally: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - - with a: - pass - - class A: - pass - - def f(): - pass - """) - - closed = textwrap.dedent("""\ - if a: - pass - # end if - - if a: - pass - else: - pass - # end if - - if a: - pass - elif: - pass - else: - pass - # end if - - while a: - break - # end while - - while a: - break - else: - pass - # end while - - for i in a: - break - # end for - - for i in a: - break - else: - pass - # end for - - try: - pass - finally: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - else: - pass - # end try - - try: - pass - except TypeError: - pass - except ValueError: - pass - finally: - pass - # end try - - with a: - pass - # end with - - class A: - pass - # end class A - - def f(): - pass - # end def f - """) - self.pindent_test(clean, closed) - - def test_multilevel(self): - clean = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - else: - print 'oops!' - """) - closed = textwrap.dedent("""\ - def foobar(a, b): - if a == b: - a = a+1 - elif a < b: - b = b-1 - if b > a: a = a-1 - # end if - else: - print 'oops!' - # end if - # end def foobar - """) - self.pindent_test(clean, closed) - - def test_preserve_indents(self): - clean = textwrap.dedent("""\ - if a: - if b: - pass - """) - closed = textwrap.dedent("""\ - if a: - if b: - pass - # end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r', '-e', '-s', '9'), closed) - clean = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - """) - closed = textwrap.dedent("""\ - if a: - \tif b: - \t\tpass - \t# end if - # end if - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - broken = self.lstriplines(closed) - self.assertEqual(self.pindent(broken, '-r'), closed) - - def test_escaped_newline(self): - clean = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - """) - closed = textwrap.dedent("""\ - class\\ - \\ - A: - def\ - \\ - f: - pass - # end def f - # end class A - """) - self.assertEqual(self.pindent(clean, '-c'), closed) - self.assertEqual(self.pindent(closed, '-d'), clean) - - def test_empty_line(self): - clean = textwrap.dedent("""\ - if a: - - pass - """) - closed = textwrap.dedent("""\ - if a: - - pass - # end if - """) - self.pindent_test(clean, closed) - - def test_oneline(self): - clean = textwrap.dedent("""\ - if a: pass - """) - closed = textwrap.dedent("""\ - if a: pass - # end if - """) - self.pindent_test(clean, closed) - +skip_if_missing() class TestSundryScripts(unittest.TestCase): # At least make sure the rest don't have syntax errors. When tests are # added for a script it should be added to the whitelist below. # scripts that have independent tests. - whitelist = ['reindent.py', 'pdeps.py', 'gprof2html', 'md5sum.py'] + whitelist = ['reindent', 'pdeps', 'gprof2html', 'md5sum'] # scripts that can't be imported without running - blacklist = ['make_ctype.py'] + blacklist = ['make_ctype'] # scripts that use windows-only modules - windows_only = ['win_add2path.py'] + windows_only = ['win_add2path'] # blacklisted for other reasons - other = ['analyze_dxp.py'] + other = ['analyze_dxp'] skiplist = blacklist + whitelist + windows_only + other - def setUp(self): - cm = support.DirsOnSysPath(scriptsdir) - cm.__enter__() - self.addCleanup(cm.__exit__) - def test_sundry(self): for fn in os.listdir(scriptsdir): - if fn.endswith('.py') and fn not in self.skiplist: - __import__(fn[:-3]) + name = fn[:-3] + if fn.endswith('.py') and name not in self.skiplist: + import_tool(name) @unittest.skipIf(sys.platform != "win32", "Windows-only test") def test_sundry_windows(self): - for fn in self.windows_only: - __import__(fn[:-3]) + for name in self.windows_only: + import_tool(name) @unittest.skipIf(not support.threading, "test requires _thread module") def test_analyze_dxp_import(self): if hasattr(sys, 'getdxp'): - import analyze_dxp + import_tool('analyze_dxp') else: with self.assertRaises(RuntimeError): - import analyze_dxp + import_tool('analyze_dxp') -class PdepsTests(unittest.TestCase): - - @classmethod - def setUpClass(self): - path = os.path.join(scriptsdir, 'pdeps.py') - spec = importlib.util.spec_from_file_location('pdeps', path) - self.pdeps = importlib._bootstrap._load(spec) - - @classmethod - def tearDownClass(self): - if 'pdeps' in sys.modules: - del sys.modules['pdeps'] - - def test_process_errors(self): - # Issue #14492: m_import.match(line) can be None. - with tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'foo') - with open(fn, 'w') as stream: - stream.write("#!/this/will/fail") - self.pdeps.process(fn, {}) - - def test_inverse_attribute_error(self): - # Issue #14492: this used to fail with an AttributeError. - self.pdeps.inverse({'a': []}) - - -class Gprof2htmlTests(unittest.TestCase): - - def setUp(self): - path = os.path.join(scriptsdir, 'gprof2html.py') - spec = importlib.util.spec_from_file_location('gprof2html', path) - self.gprof = importlib._bootstrap._load(spec) - oldargv = sys.argv - def fixup(): - sys.argv = oldargv - self.addCleanup(fixup) - sys.argv = [] - - def test_gprof(self): - # Issue #14508: this used to fail with an NameError. - with mock.patch.object(self.gprof, 'webbrowser') as wmock, \ - tempfile.TemporaryDirectory() as tmpdir: - fn = os.path.join(tmpdir, 'abc') - open(fn, 'w').close() - sys.argv = ['gprof2html', fn] - self.gprof.main() - self.assertTrue(wmock.open.called) - - -class MD5SumTests(unittest.TestCase): - - @classmethod - def setUpClass(cls): - cls.script = os.path.join(scriptsdir, 'md5sum.py') - os.mkdir(support.TESTFN) - cls.fodder = os.path.join(support.TESTFN, 'md5sum.fodder') - with open(cls.fodder, 'wb') as f: - f.write(b'md5sum\r\ntest file\r\n') - cls.fodder_md5 = b'd38dae2eb1ab346a292ef6850f9e1a0d' - cls.fodder_textmode_md5 = b'a8b07894e2ca3f2a4c3094065fa6e0a5' - - @classmethod - def tearDownClass(cls): - support.rmtree(support.TESTFN) - - def test_noargs(self): - rc, out, err = assert_python_ok(self.script) - self.assertEqual(rc, 0) - self.assertTrue( - out.startswith(b'd41d8cd98f00b204e9800998ecf8427e ')) - self.assertFalse(err) - - def test_checksum_fodder(self): - rc, out, err = assert_python_ok(self.script, self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_md5)) - for part in self.fodder.split(os.path.sep): - self.assertIn(part.encode(), out) - self.assertFalse(err) - - def test_dash_l(self): - rc, out, err = assert_python_ok(self.script, '-l', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - parts = self.fodder.split(os.path.sep) - self.assertIn(parts[-1].encode(), out) - self.assertNotIn(parts[-2].encode(), out) - - def test_dash_t(self): - rc, out, err = assert_python_ok(self.script, '-t', self.fodder) - self.assertEqual(rc, 0) - self.assertTrue(out.startswith(self.fodder_textmode_md5)) - self.assertNotIn(self.fodder_md5, out) - - def test_dash_s(self): - rc, out, err = assert_python_ok(self.script, '-s', '512', self.fodder) - self.assertEqual(rc, 0) - self.assertIn(self.fodder_md5, out) - - def test_multiple_files(self): - rc, out, err = assert_python_ok(self.script, self.fodder, self.fodder) - self.assertEqual(rc, 0) - lines = out.splitlines() - self.assertEqual(len(lines), 2) - self.assertEqual(*lines) - - def test_usage(self): - rc, out, err = assert_python_failure(self.script, '-h') - self.assertEqual(rc, 2) - self.assertEqual(out, b'') - self.assertGreater(err, b'') - - -# Run the tests in Tools/parser/test_unparse.py -with support.DirsOnSysPath(os.path.join(basepath, 'parser')): - from test_unparse import UnparseTestCase - from test_unparse import DirectoryTestCase - if __name__ == '__main__': unittest.main() diff --git a/Tools/parser/test_unparse.py b/Lib/test/test_tools/test_unparse.py rename from Tools/parser/test_unparse.py rename to Lib/test/test_tools/test_unparse.py --- a/Tools/parser/test_unparse.py +++ b/Lib/test/test_tools/test_unparse.py @@ -1,12 +1,22 @@ +"""Tests for the unparse.py script in the Tools/parser directory.""" + import unittest import test.support import io import os import random import tokenize -import unparse import ast +from test.test_tools import basepath, toolsdir, skip_if_missing + +skip_if_missing() + +parser_path = os.path.join(toolsdir, "parser") + +with test.support.DirsOnSysPath(parser_path): + import unparse + def read_pyfile(filename): """Read and return the contents of a Python source file (as a string), taking into account the file encoding.""" @@ -249,11 +259,10 @@ def test_files(self): # get names of files to test - dist_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir) names = [] for d in self.test_directories: - test_dir = os.path.join(dist_dir, d) + test_dir = os.path.join(basepath, d) for n in os.listdir(test_dir): if n.endswith('.py') and not n.startswith('bad'): names.append(os.path.join(test_dir, n)) @@ -269,8 +278,5 @@ self.check_roundtrip(source) -def test_main(): - test.support.run_unittest(UnparseTestCase, DirectoryTestCase) - if __name__ == '__main__': - test_main() + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -698,6 +698,9 @@ Tests ----- +- Issue #21918: Converted test_tools from a module to a package containing + separate test files for each tested script. + - Issue #9554: Use modern unittest features in test_argparse. Initial patch by Denver Coneybeare and Radu Voicilas. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 21:49:25 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 21:49:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_a_minor_ty?= =?utf-8?q?po_in_the_turtle_docs=2E__Found_by_Brandon_Passmore_on_docs=40?= =?utf-8?q?=2E?= Message-ID: <3hD8LY2d6Sz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/d4a20597033a changeset: 91704:d4a20597033a branch: 2.7 parent: 91683:af1351800c7a user: Zachary Ware date: Wed Jul 16 14:48:11 2014 -0500 summary: Fix a minor typo in the turtle docs. Found by Brandon Passmore on docs at . files: Doc/library/turtle.rst | 2 +- 1 files changed, 1 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 @@ -1859,7 +1859,7 @@ :param startx: if positive, starting position in pixels from the left edge of the screen, if negative from the right edge, if None, center window horizontally - :param startx: if positive, starting position in pixels from the top + :param starty: if positive, starting position in pixels from the top edge of the screen, if negative from the bottom edge, if None, center window vertically -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 21:49:26 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 21:49:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_a_minor_ty?= =?utf-8?q?po_in_the_turtle_docs=2E__Found_by_Brandon_Passmore_on_docs=40?= =?utf-8?q?=2E?= Message-ID: <3hD8LZ4F7mz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/04281a6f7940 changeset: 91705:04281a6f7940 branch: 3.4 parent: 91702:e69f037332a6 user: Zachary Ware date: Wed Jul 16 14:48:48 2014 -0500 summary: Fix a minor typo in the turtle docs. Found by Brandon Passmore on docs at . files: Doc/library/turtle.rst | 2 +- 1 files changed, 1 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 @@ -1981,7 +1981,7 @@ :param startx: if positive, starting position in pixels from the left edge of the screen, if negative from the right edge, if None, center window horizontally - :param startx: if positive, starting position in pixels from the top + :param starty: if positive, starting position in pixels from the top edge of the screen, if negative from the bottom edge, if None, center window vertically -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 21:49:27 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 16 Jul 2014 21:49:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hD8Lb5vNYz7Lkd@mail.python.org> http://hg.python.org/cpython/rev/0a4f286105b4 changeset: 91706:0a4f286105b4 parent: 91703:1d0ca204c36f parent: 91705:04281a6f7940 user: Zachary Ware date: Wed Jul 16 14:49:05 2014 -0500 summary: Merge with 3.4 files: Doc/library/turtle.rst | 2 +- 1 files changed, 1 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 @@ -1981,7 +1981,7 @@ :param startx: if positive, starting position in pixels from the left edge of the screen, if negative from the right edge, if None, center window horizontally - :param startx: if positive, starting position in pixels from the top + :param starty: if positive, starting position in pixels from the top edge of the screen, if negative from the bottom edge, if None, center window vertically -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 23:06:59 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 16 Jul 2014 23:06:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Add_helpers_fo?= =?utf-8?q?r_testing_unicode_disabled_builds=2E?= Message-ID: <3hDB435Ck9z7LjT@mail.python.org> http://hg.python.org/cpython/rev/f3b9814fb81a changeset: 91707:f3b9814fb81a branch: 2.7 parent: 91704:d4a20597033a user: Serhiy Storchaka date: Wed Jul 16 23:50:37 2014 +0300 summary: Add helpers for testing unicode disabled builds. files: Lib/test/test_support.py | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -498,13 +498,18 @@ # for a discussion of this number). SOCK_MAX_SIZE = 16 * 1024 * 1024 + 1 +is_jython = sys.platform.startswith('java') + try: unicode have_unicode = True except NameError: have_unicode = False -is_jython = sys.platform.startswith('java') +requires_unicode = unittest.skipUnless(have_unicode, 'no unicode support') + +def u(s): + return unicode(s, 'unicode-escape') # FS_NONASCII: non-ASCII Unicode character encodable by # sys.getfilesystemencoding(), or None if there is no such character. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 23:07:01 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 16 Jul 2014 23:07:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgMjEwNDQ6?= =?utf-8?q?_tarfile=2Eopen=28=29_now_handles_fileobj_with_an_integer_=27na?= =?utf-8?b?bWUn?= Message-ID: <3hDB4511Bbz7LkQ@mail.python.org> http://hg.python.org/cpython/rev/308f3c1e36d3 changeset: 91708:308f3c1e36d3 branch: 2.7 user: Serhiy Storchaka date: Wed Jul 16 23:58:12 2014 +0300 summary: Issue 21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. files: Lib/tarfile.py | 3 +- Lib/test/test_tarfile.py | 38 ++++++++++++++++++++++++--- Misc/ACKS | 1 + Misc/NEWS | 3 ++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1522,7 +1522,8 @@ fileobj = bltn_open(name, self._mode) self._extfileobj = False else: - if name is None and hasattr(fileobj, "name"): + if (name is None and hasattr(fileobj, "name") and + isinstance(fileobj.name, basestring)): name = fileobj.name if hasattr(fileobj, "mode"): self._mode = fileobj.mode 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 @@ -1,6 +1,7 @@ # -*- coding: iso-8859-15 -*- import sys +import io import os import shutil import StringIO @@ -289,24 +290,49 @@ class MiscReadTest(CommonReadTest): taropen = tarfile.TarFile.taropen + def requires_name_attribute(self): + pass + def test_no_name_argument(self): - fobj = open(self.tarname, "rb") - tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, os.path.abspath(fobj.name)) + self.requires_name_attribute() + with open(self.tarname, "rb") as fobj: + self.assertIsInstance(fobj.name, str) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_no_name_attribute(self): data = open(self.tarname, "rb").read() fobj = StringIO.StringIO(data) self.assertRaises(AttributeError, getattr, fobj, "name") tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, None) + self.assertIsNone(tar.name) def test_empty_name_attribute(self): data = open(self.tarname, "rb").read() fobj = StringIO.StringIO(data) fobj.name = "" tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, None) + self.assertIsNone(tar.name) + + def test_int_name_attribute(self): + # Issue 21044: tarfile.open() should handle fileobj with an integer + # 'name' attribute. + fd = os.open(self.tarname, os.O_RDONLY) + with io.open(fd, 'rb') as fobj: + self.assertIsInstance(fobj.name, int) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsNone(tar.name) + + @test_support.requires_unicode + def test_unicode_name_attribute(self): + self.requires_name_attribute() + tarname = unicode(self.tarname, test_support.TESTFN_ENCODING) + with io.open(tarname, 'rb') as fobj: + self.assertIsInstance(fobj.name, unicode) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsInstance(tar.name, unicode) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_illegal_mode_arg(self): with open(tmpname, 'wb'): @@ -1668,6 +1694,8 @@ tarname = bz2name mode = "r:bz2" taropen = tarfile.TarFile.bz2open + def requires_name_attribute(self): + self.skipTest("BZ2File have no name attribute") class Bz2UstarReadTest(UstarReadTest): tarname = bz2name mode = "r:bz2" diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -995,6 +995,7 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus +Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue 21044: tarfile.open() now handles fileobj with an integer 'name' + attribute. Based on patch by Martin Panter. + - Issue #21151: Fixed a segfault in the _winreg module when ``None`` is passed as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 23:07:02 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 16 Jul 2014 23:07:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgMjEwNDQ6?= =?utf-8?q?_tarfile=2Eopen=28=29_now_handles_fileobj_with_an_integer_=27na?= =?utf-8?b?bWUn?= Message-ID: <3hDB464Byrz7LnV@mail.python.org> http://hg.python.org/cpython/rev/d6b71971b228 changeset: 91709:d6b71971b228 branch: 3.4 parent: 91705:04281a6f7940 user: Serhiy Storchaka date: Wed Jul 16 23:58:58 2014 +0300 summary: Issue 21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. files: Lib/tarfile.py | 3 +- Lib/test/test_tarfile.py | 36 +++++++++++++++++++++++---- Misc/ACKS | 1 + Misc/NEWS | 3 ++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1423,7 +1423,8 @@ fileobj = bltn_open(name, self._mode) self._extfileobj = False else: - if name is None and hasattr(fileobj, "name"): + if (name is None and hasattr(fileobj, "name") and + isinstance(fileobj.name, (str, bytes))): name = fileobj.name if hasattr(fileobj, "mode"): self._mode = fileobj.mode 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 @@ -352,10 +352,16 @@ class MiscReadTestBase(CommonReadTest): + def requires_name_attribute(self): + pass + def test_no_name_argument(self): + self.requires_name_attribute() with open(self.tarname, "rb") as fobj: - tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, os.path.abspath(fobj.name)) + self.assertIsInstance(fobj.name, str) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_no_name_attribute(self): with open(self.tarname, "rb") as fobj: @@ -363,7 +369,7 @@ fobj = io.BytesIO(data) self.assertRaises(AttributeError, getattr, fobj, "name") tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, None) + self.assertIsNone(tar.name) def test_empty_name_attribute(self): with open(self.tarname, "rb") as fobj: @@ -371,7 +377,25 @@ fobj = io.BytesIO(data) fobj.name = "" with tarfile.open(fileobj=fobj, mode=self.mode) as tar: - self.assertEqual(tar.name, None) + self.assertIsNone(tar.name) + + def test_int_name_attribute(self): + # Issue 21044: tarfile.open() should handle fileobj with an integer + # 'name' attribute. + fd = os.open(self.tarname, os.O_RDONLY) + with open(fd, 'rb') as fobj: + self.assertIsInstance(fobj.name, int) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsNone(tar.name) + + def test_bytes_name_attribute(self): + self.requires_name_attribute() + tarname = os.fsencode(self.tarname) + with open(tarname, 'rb') as fobj: + self.assertIsInstance(fobj.name, bytes) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsInstance(tar.name, bytes) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_illegal_mode_arg(self): with open(tmpname, 'wb'): @@ -549,11 +573,11 @@ pass class Bz2MiscReadTest(Bz2Test, MiscReadTestBase, unittest.TestCase): - def test_no_name_argument(self): + def requires_name_attribute(self): self.skipTest("BZ2File have no name attribute") class LzmaMiscReadTest(LzmaTest, MiscReadTestBase, unittest.TestCase): - def test_no_name_argument(self): + def requires_name_attribute(self): self.skipTest("LZMAFile have no name attribute") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -996,6 +996,7 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus +Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue 21044: tarfile.open() now handles fileobj with an integer 'name' + attribute. Based on patch by Martin Panter. + - Issue #19076: Don't pass the redundant 'file' argument to self.error(). - Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 16 23:07:04 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 16 Jul 2014 23:07:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_21044=3A_tarfile=2Eopen=28=29_now_handles_fileobj_?= =?utf-8?q?with_an_integer_=27name=27?= Message-ID: <3hDB480XFfz7LlR@mail.python.org> http://hg.python.org/cpython/rev/4c2f3240ad65 changeset: 91710:4c2f3240ad65 parent: 91706:0a4f286105b4 parent: 91709:d6b71971b228 user: Serhiy Storchaka date: Thu Jul 17 00:00:26 2014 +0300 summary: Issue 21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. files: Lib/tarfile.py | 3 +- Lib/test/test_tarfile.py | 36 +++++++++++++++++++++++---- Misc/ACKS | 1 + Misc/NEWS | 3 ++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1423,7 +1423,8 @@ fileobj = bltn_open(name, self._mode) self._extfileobj = False else: - if name is None and hasattr(fileobj, "name"): + if (name is None and hasattr(fileobj, "name") and + isinstance(fileobj.name, (str, bytes))): name = fileobj.name if hasattr(fileobj, "mode"): self._mode = fileobj.mode 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 @@ -351,10 +351,16 @@ class MiscReadTestBase(CommonReadTest): + def requires_name_attribute(self): + pass + def test_no_name_argument(self): + self.requires_name_attribute() with open(self.tarname, "rb") as fobj: - tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, os.path.abspath(fobj.name)) + self.assertIsInstance(fobj.name, str) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsInstance(tar.name, str) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_no_name_attribute(self): with open(self.tarname, "rb") as fobj: @@ -362,7 +368,7 @@ fobj = io.BytesIO(data) self.assertRaises(AttributeError, getattr, fobj, "name") tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertEqual(tar.name, None) + self.assertIsNone(tar.name) def test_empty_name_attribute(self): with open(self.tarname, "rb") as fobj: @@ -370,7 +376,25 @@ fobj = io.BytesIO(data) fobj.name = "" with tarfile.open(fileobj=fobj, mode=self.mode) as tar: - self.assertEqual(tar.name, None) + self.assertIsNone(tar.name) + + def test_int_name_attribute(self): + # Issue 21044: tarfile.open() should handle fileobj with an integer + # 'name' attribute. + fd = os.open(self.tarname, os.O_RDONLY) + with open(fd, 'rb') as fobj: + self.assertIsInstance(fobj.name, int) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsNone(tar.name) + + def test_bytes_name_attribute(self): + self.requires_name_attribute() + tarname = os.fsencode(self.tarname) + with open(tarname, 'rb') as fobj: + self.assertIsInstance(fobj.name, bytes) + with tarfile.open(fileobj=fobj, mode=self.mode) as tar: + self.assertIsInstance(tar.name, bytes) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_illegal_mode_arg(self): with open(tmpname, 'wb'): @@ -548,11 +572,11 @@ pass class Bz2MiscReadTest(Bz2Test, MiscReadTestBase, unittest.TestCase): - def test_no_name_argument(self): + def requires_name_attribute(self): self.skipTest("BZ2File have no name attribute") class LzmaMiscReadTest(LzmaTest, MiscReadTestBase, unittest.TestCase): - def test_no_name_argument(self): + def requires_name_attribute(self): self.skipTest("LZMAFile have no name attribute") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1004,6 +1004,7 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus +Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue 21044: tarfile.open() now handles fileobj with an integer 'name' + attribute. Based on patch by Martin Panter. + - Issue #21966: Respect -q command-line option when code module is ran. - Issue #19076: Don't pass the redundant 'file' argument to self.error(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 04:01:47 2014 From: python-checkins at python.org (berker.peksag) Date: Thu, 17 Jul 2014 04:01:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTk0?= =?utf-8?q?=3A_Fix_SyntaxError_in_the_SSLContext=2Echeck=5Fhostname_docume?= =?utf-8?q?ntation=2E?= Message-ID: <3hDJcC28S0z7Lk5@mail.python.org> http://hg.python.org/cpython/rev/0045eec1e247 changeset: 91711:0045eec1e247 branch: 3.4 parent: 91709:d6b71971b228 user: Berker Peksag date: Thu Jul 17 05:00:36 2014 +0300 summary: Issue #21994: Fix SyntaxError in the SSLContext.check_hostname documentation. 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 @@ -1220,8 +1220,8 @@ context.load_default_certs() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com'): - ssl_sock.connect(('www.verisign.com', 443)) + ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com') + ssl_sock.connect(('www.verisign.com', 443)) .. versionadded:: 3.4 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 04:01:48 2014 From: python-checkins at python.org (berker.peksag) Date: Thu, 17 Jul 2014 04:01:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321994=3A_Merge_with_3=2E4=2E?= Message-ID: <3hDJcD3Yttz7LpH@mail.python.org> http://hg.python.org/cpython/rev/8039a20b18cc changeset: 91712:8039a20b18cc parent: 91710:4c2f3240ad65 parent: 91711:0045eec1e247 user: Berker Peksag date: Thu Jul 17 05:02:02 2014 +0300 summary: Issue #21994: Merge with 3.4. 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 @@ -1241,8 +1241,8 @@ context.load_default_certs() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com'): - ssl_sock.connect(('www.verisign.com', 443)) + ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com') + ssl_sock.connect(('www.verisign.com', 443)) .. versionadded:: 3.4 -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Jul 17 10:38:37 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 17 Jul 2014 10:38:37 +0200 Subject: [Python-checkins] Daily reference leaks (4c2f3240ad65): sum=1 Message-ID: results for 4c2f3240ad65 on branch "default" -------------------------------------------- test_collections leaked [0, -2, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [0, -2, 2] references, sum=0 test_site leaked [0, -2, 2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogdkOxqX', '-x'] From python-checkins at python.org Thu Jul 17 12:48:44 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 12:48:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbywgdHVs?= =?utf-8?q?ip_issue_190=3A_Process=2Ecommunicate=28=29_must_ignore_BrokenP?= =?utf-8?q?ipeError?= Message-ID: <3hDXJD3Bgrz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/244ab7f41065 changeset: 91713:244ab7f41065 branch: 3.4 parent: 91711:0045eec1e247 user: Victor Stinner date: Thu Jul 17 12:25:27 2014 +0200 summary: asyncio, tulip issue 190: Process.communicate() must ignore BrokenPipeError If you want to handle the BrokenPipeError, you can easily reimplement communicate(). Add also a unit test to ensure that stdin.write() + stdin.drain() raises BrokenPipeError. files: Doc/library/asyncio-subprocess.rst | 7 +++ Lib/asyncio/subprocess.py | 6 ++- Lib/test/test_asyncio/test_subprocess.py | 27 ++++++++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -191,6 +191,10 @@ process, or ``None``, if no data should be sent to the child. The type of *input* must be bytes. + If a :exc:`BrokenPipeError` is raised when writing *input* into stdin, + the exception is ignored. It occurs when the process exits before all + data are written into stdin. + :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``. Note that if you want to send data to the process's stdin, you need to @@ -205,6 +209,9 @@ This method is a :ref:`coroutine `. + .. versionchanged:: 3.4.2 + The method now ignores :exc:`BrokenPipeError`. + .. method:: kill() Kills the child. On Posix OSs the function sends :py:data:`SIGKILL` to diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -143,7 +143,11 @@ if self._loop.get_debug(): logger.debug('%r communicate: feed stdin (%s bytes)', self, len(input)) - yield from self.stdin.drain() + try: + yield from self.stdin.drain() + except BrokenPipeError: + # ignore BrokenPipeError + pass if self._loop.get_debug(): logger.debug('%r communicate: close stdin', self) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -11,9 +11,6 @@ # Program blocking PROGRAM_BLOCKED = [sys.executable, '-c', 'import time; time.sleep(3600)'] -# Program sleeping during 1 second -PROGRAM_SLEEP_1SEC = [sys.executable, '-c', 'import time; time.sleep(1)'] - # Program copying input to output PROGRAM_CAT = [ sys.executable, '-c', @@ -118,16 +115,32 @@ returncode = self.loop.run_until_complete(proc.wait()) self.assertEqual(-signal.SIGHUP, returncode) - def test_broken_pipe(self): + def prepare_broken_pipe_test(self): + # buffer large enough to feed the whole pipe buffer large_data = b'x' * support.PIPE_MAX_SIZE + # the program ends before the stdin can be feeded create = asyncio.create_subprocess_exec( - *PROGRAM_SLEEP_1SEC, + sys.executable, '-c', 'pass', stdin=subprocess.PIPE, loop=self.loop) proc = self.loop.run_until_complete(create) - with self.assertRaises(BrokenPipeError): - self.loop.run_until_complete(proc.communicate(large_data)) + return (proc, large_data) + + def test_stdin_broken_pipe(self): + proc, large_data = self.prepare_broken_pipe_test() + + # drain() must raise BrokenPipeError + proc.stdin.write(large_data) + self.assertRaises(BrokenPipeError, + self.loop.run_until_complete, proc.stdin.drain()) + self.loop.run_until_complete(proc.wait()) + + def test_communicate_ignore_broken_pipe(self): + proc, large_data = self.prepare_broken_pipe_test() + + # communicate() must ignore BrokenPipeError when feeding stdin + self.loop.run_until_complete(proc.communicate(large_data)) self.loop.run_until_complete(proc.wait()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 12:48:45 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 12:48:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=2C_tulip_issue_190=3A_Process?= =?utf-8?q?=2Ecommunicate=28=29_must_ignore?= Message-ID: <3hDXJF63Yxz7LvP@mail.python.org> http://hg.python.org/cpython/rev/b4b42b7ddf7d changeset: 91714:b4b42b7ddf7d parent: 91712:8039a20b18cc parent: 91713:244ab7f41065 user: Victor Stinner date: Thu Jul 17 12:48:33 2014 +0200 summary: (Merge 3.4) asyncio, tulip issue 190: Process.communicate() must ignore BrokenPipeError If you want to handle the BrokenPipeError, you can easily reimplement communicate(). Add also a unit test to ensure that stdin.write() + stdin.drain() raises BrokenPipeError. files: Doc/library/asyncio-subprocess.rst | 7 +++ Lib/asyncio/subprocess.py | 6 ++- Lib/test/test_asyncio/test_subprocess.py | 27 ++++++++--- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -191,6 +191,10 @@ process, or ``None``, if no data should be sent to the child. The type of *input* must be bytes. + If a :exc:`BrokenPipeError` is raised when writing *input* into stdin, + the exception is ignored. It occurs when the process exits before all + data are written into stdin. + :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``. Note that if you want to send data to the process's stdin, you need to @@ -205,6 +209,9 @@ This method is a :ref:`coroutine `. + .. versionchanged:: 3.4.2 + The method now ignores :exc:`BrokenPipeError`. + .. method:: kill() Kills the child. On Posix OSs the function sends :py:data:`SIGKILL` to diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -143,7 +143,11 @@ if self._loop.get_debug(): logger.debug('%r communicate: feed stdin (%s bytes)', self, len(input)) - yield from self.stdin.drain() + try: + yield from self.stdin.drain() + except BrokenPipeError: + # ignore BrokenPipeError + pass if self._loop.get_debug(): logger.debug('%r communicate: close stdin', self) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -11,9 +11,6 @@ # Program blocking PROGRAM_BLOCKED = [sys.executable, '-c', 'import time; time.sleep(3600)'] -# Program sleeping during 1 second -PROGRAM_SLEEP_1SEC = [sys.executable, '-c', 'import time; time.sleep(1)'] - # Program copying input to output PROGRAM_CAT = [ sys.executable, '-c', @@ -118,16 +115,32 @@ returncode = self.loop.run_until_complete(proc.wait()) self.assertEqual(-signal.SIGHUP, returncode) - def test_broken_pipe(self): + def prepare_broken_pipe_test(self): + # buffer large enough to feed the whole pipe buffer large_data = b'x' * support.PIPE_MAX_SIZE + # the program ends before the stdin can be feeded create = asyncio.create_subprocess_exec( - *PROGRAM_SLEEP_1SEC, + sys.executable, '-c', 'pass', stdin=subprocess.PIPE, loop=self.loop) proc = self.loop.run_until_complete(create) - with self.assertRaises(BrokenPipeError): - self.loop.run_until_complete(proc.communicate(large_data)) + return (proc, large_data) + + def test_stdin_broken_pipe(self): + proc, large_data = self.prepare_broken_pipe_test() + + # drain() must raise BrokenPipeError + proc.stdin.write(large_data) + self.assertRaises(BrokenPipeError, + self.loop.run_until_complete, proc.stdin.drain()) + self.loop.run_until_complete(proc.wait()) + + def test_communicate_ignore_broken_pipe(self): + proc, large_data = self.prepare_broken_pipe_test() + + # communicate() must ignore BrokenPipeError when feeding stdin + self.loop.run_until_complete(proc.communicate(large_data)) self.loop.run_until_complete(proc.wait()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 13:12:29 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 13:12:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbywgdHVs?= =?utf-8?q?ip_issue_190=3A_Process=2Ecommunicate=28=29_now_ignores?= Message-ID: <3hDXqd5PRKz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/cb327c64cffb changeset: 91715:cb327c64cffb branch: 3.4 parent: 91713:244ab7f41065 user: Victor Stinner date: Thu Jul 17 13:12:03 2014 +0200 summary: asyncio, tulip issue 190: Process.communicate() now ignores ConnectionResetError too files: Doc/library/asyncio-subprocess.rst | 9 +++++---- Lib/asyncio/subprocess.py | 12 +++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -191,9 +191,9 @@ process, or ``None``, if no data should be sent to the child. The type of *input* must be bytes. - If a :exc:`BrokenPipeError` is raised when writing *input* into stdin, - the exception is ignored. It occurs when the process exits before all - data are written into stdin. + If a :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is + raised when writing *input* into stdin, the exception is ignored. It + occurs when the process exits before all data are written into stdin. :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``. @@ -210,7 +210,8 @@ This method is a :ref:`coroutine `. .. versionchanged:: 3.4.2 - The method now ignores :exc:`BrokenPipeError`. + The method now ignores :exc:`BrokenPipeError` and + :exc:`ConnectionResetError`. .. method:: kill() diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -139,17 +139,19 @@ @coroutine def _feed_stdin(self, input): + debug = self._loop.get_debug() self.stdin.write(input) - if self._loop.get_debug(): + if debug: logger.debug('%r communicate: feed stdin (%s bytes)', self, len(input)) try: yield from self.stdin.drain() - except BrokenPipeError: - # ignore BrokenPipeError - pass + except (BrokenPipeError, ConnectionResetError) as exc: + # communicate() ignores BrokenPipeError and ConnectionResetError + if debug: + logger.debug('%r communicate: stdin got %r', self, exc) - if self._loop.get_debug(): + if debug: logger.debug('%r communicate: close stdin', self) self.stdin.close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 13:12:30 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 13:12:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=2C_tulip_issue_190=3A_Process?= =?utf-8?q?=2Ecommunicate=28=29_now_ignores?= Message-ID: <3hDXqf72pJz7Lp0@mail.python.org> http://hg.python.org/cpython/rev/4bbeff36ae9d changeset: 91716:4bbeff36ae9d parent: 91714:b4b42b7ddf7d parent: 91715:cb327c64cffb user: Victor Stinner date: Thu Jul 17 13:12:20 2014 +0200 summary: (Merge 3.4) asyncio, tulip issue 190: Process.communicate() now ignores ConnectionResetError too files: Doc/library/asyncio-subprocess.rst | 9 +++++---- Lib/asyncio/subprocess.py | 12 +++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -191,9 +191,9 @@ process, or ``None``, if no data should be sent to the child. The type of *input* must be bytes. - If a :exc:`BrokenPipeError` is raised when writing *input* into stdin, - the exception is ignored. It occurs when the process exits before all - data are written into stdin. + If a :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is + raised when writing *input* into stdin, the exception is ignored. It + occurs when the process exits before all data are written into stdin. :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``. @@ -210,7 +210,8 @@ This method is a :ref:`coroutine `. .. versionchanged:: 3.4.2 - The method now ignores :exc:`BrokenPipeError`. + The method now ignores :exc:`BrokenPipeError` and + :exc:`ConnectionResetError`. .. method:: kill() diff --git a/Lib/asyncio/subprocess.py b/Lib/asyncio/subprocess.py --- a/Lib/asyncio/subprocess.py +++ b/Lib/asyncio/subprocess.py @@ -139,17 +139,19 @@ @coroutine def _feed_stdin(self, input): + debug = self._loop.get_debug() self.stdin.write(input) - if self._loop.get_debug(): + if debug: logger.debug('%r communicate: feed stdin (%s bytes)', self, len(input)) try: yield from self.stdin.drain() - except BrokenPipeError: - # ignore BrokenPipeError - pass + except (BrokenPipeError, ConnectionResetError) as exc: + # communicate() ignores BrokenPipeError and ConnectionResetError + if debug: + logger.debug('%r communicate: stdin got %r', self, exc) - if self._loop.get_debug(): + if debug: logger.debug('%r communicate: close stdin', self) self.stdin.close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 14:01:55 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 14:01:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogRml4?= =?utf-8?q?_test=5Fstdin=5Fbroken=5Fpipe=28=29=2C_drain=28=29_can_also_rai?= =?utf-8?q?se?= Message-ID: <3hDYwg0wrcz7Lk5@mail.python.org> http://hg.python.org/cpython/rev/ffbc1f65823d changeset: 91717:ffbc1f65823d branch: 3.4 parent: 91715:cb327c64cffb user: Victor Stinner date: Thu Jul 17 14:01:14 2014 +0200 summary: asyncio: Fix test_stdin_broken_pipe(), drain() can also raise ConnectionResetError files: Lib/test/test_asyncio/test_subprocess.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -130,9 +130,9 @@ def test_stdin_broken_pipe(self): proc, large_data = self.prepare_broken_pipe_test() - # drain() must raise BrokenPipeError + # drain() must raise BrokenPipeError or ConnectionResetError proc.stdin.write(large_data) - self.assertRaises(BrokenPipeError, + self.assertRaises((BrokenPipeError, ConnectionResetError), self.loop.run_until_complete, proc.stdin.drain()) self.loop.run_until_complete(proc.wait()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 14:01:56 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 14:01:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgYXN5bmNpbzogRml4IHRlc3Rfc3RkaW5fYnJva2Vu?= =?utf-8?q?=5Fpipe=28=29=2C_drain=28=29_can_also_raise?= Message-ID: <3hDYwh2fYjz7Lk5@mail.python.org> http://hg.python.org/cpython/rev/84f9bf424720 changeset: 91718:84f9bf424720 parent: 91716:4bbeff36ae9d parent: 91717:ffbc1f65823d user: Victor Stinner date: Thu Jul 17 14:01:39 2014 +0200 summary: (Merge 3.4) asyncio: Fix test_stdin_broken_pipe(), drain() can also raise ConnectionResetError files: Lib/test/test_asyncio/test_subprocess.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -130,9 +130,9 @@ def test_stdin_broken_pipe(self): proc, large_data = self.prepare_broken_pipe_test() - # drain() must raise BrokenPipeError + # drain() must raise BrokenPipeError or ConnectionResetError proc.stdin.write(large_data) - self.assertRaises(BrokenPipeError, + self.assertRaises((BrokenPipeError, ConnectionResetError), self.loop.run_until_complete, proc.stdin.drain()) self.loop.run_until_complete(proc.wait()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 22:49:25 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 22:49:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Python_issue_?= =?utf-8?q?=2321645=2C_Tulip_issue_192=3A_Rewrite_signal_handling?= Message-ID: <3hDndK0JKSz7LkR@mail.python.org> http://hg.python.org/cpython/rev/c4f053f1b47f changeset: 91719:c4f053f1b47f branch: 3.4 parent: 91717:ffbc1f65823d user: Victor Stinner date: Thu Jul 17 22:43:40 2014 +0200 summary: Python issue #21645, Tulip issue 192: Rewrite signal handling Since Python 3.3, the C signal handler writes the signal number into the wakeup file descriptor and then schedules the Python call using Py_AddPendingCall(). asyncio uses the wakeup file descriptor to wake up the event loop, and relies on Py_AddPendingCall() to schedule the final callback with call_soon(). If the C signal handler is called in a thread different than the thread of the event loop, the loop is awaken but Py_AddPendingCall() was not called yet. In this case, the event loop has nothing to do and go to sleep again. Py_AddPendingCall() is called while the event loop is sleeping again and so the final callback is not scheduled immediatly. This patch changes how asyncio handles signals. Instead of relying on Py_AddPendingCall() and the wakeup file descriptor, asyncio now only relies on the wakeup file descriptor. asyncio reads signal numbers from the wakeup file descriptor to call its signal handler. files: Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/selector_events.py | 6 ++- Lib/asyncio/unix_events.py | 20 +++++++++- Lib/test/test_asyncio/test_proactor_events.py | 2 +- Lib/test/test_asyncio/test_unix_events.py | 4 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -443,7 +443,7 @@ f.add_done_callback(self._loop_self_reading) def _write_to_self(self): - self._csock.send(b'x') + self._csock.send(b'\0') def _start_serving(self, protocol_factory, sock, ssl=None, server=None): if ssl: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -94,12 +94,16 @@ self._internal_fds += 1 self.add_reader(self._ssock.fileno(), self._read_from_self) + def _process_self_data(self, data): + pass + def _read_from_self(self): while True: try: data = self._ssock.recv(4096) if not data: break + self._process_self_data(data) except InterruptedError: continue except BlockingIOError: @@ -114,7 +118,7 @@ csock = self._csock if csock is not None: try: - csock.send(b'x') + csock.send(b'\0') except OSError: pass diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -31,6 +31,11 @@ raise ImportError('Signals are not really supported on Windows') +def _sighandler_noop(signum, frame): + """Dummy signal handler.""" + pass + + class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): """Unix event loop. @@ -49,6 +54,13 @@ for sig in list(self._signal_handlers): self.remove_signal_handler(sig) + def _process_self_data(self, data): + for signum in data: + if not signum: + # ignore null bytes written by _write_to_self() + continue + self._handle_signal(signum) + def add_signal_handler(self, sig, callback, *args): """Add a handler for a signal. UNIX only. @@ -69,7 +81,11 @@ self._signal_handlers[sig] = handle try: - signal.signal(sig, self._handle_signal) + # Register a dummy signal handler to ask Python to write the signal + # number in the wakup file descriptor. _process_self_data() will + # read signal numbers from this file descriptor to handle signals. + signal.signal(sig, _sighandler_noop) + # Set SA_RESTART to limit EINTR occurrences. signal.siginterrupt(sig, False) except OSError as exc: @@ -85,7 +101,7 @@ else: raise - def _handle_signal(self, sig, arg): + def _handle_signal(self, sig): """Internal helper that is the actual signal handler.""" handle = self._signal_handlers.get(sig) if handle is None: diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -435,7 +435,7 @@ def test_write_to_self(self): self.loop._write_to_self() - self.csock.send.assert_called_with(b'x') + self.csock.send.assert_called_with(b'\0') def test_process_events(self): self.loop._process_events([]) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -42,7 +42,7 @@ ValueError, self.loop._check_signal, signal.NSIG + 1) def test_handle_signal_no_handler(self): - self.loop._handle_signal(signal.NSIG + 1, ()) + self.loop._handle_signal(signal.NSIG + 1) def test_handle_signal_cancelled_handler(self): h = asyncio.Handle(mock.Mock(), (), @@ -50,7 +50,7 @@ h.cancel() self.loop._signal_handlers[signal.NSIG + 1] = h self.loop.remove_signal_handler = mock.Mock() - self.loop._handle_signal(signal.NSIG + 1, ()) + self.loop._handle_signal(signal.NSIG + 1) self.loop.remove_signal_handler.assert_called_with(signal.NSIG + 1) @mock.patch('asyncio.unix_events.signal') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 22:49:26 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 22:49:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Python_issue_=2321645=2C_Tulip_issue_1?= =?utf-8?q?92=3A_Rewrite_signal_handling?= Message-ID: <3hDndL3HjFz7LlQ@mail.python.org> http://hg.python.org/cpython/rev/2176496951a4 changeset: 91720:2176496951a4 parent: 91718:84f9bf424720 parent: 91719:c4f053f1b47f user: Victor Stinner date: Thu Jul 17 22:45:42 2014 +0200 summary: (Merge 3.4) Python issue #21645, Tulip issue 192: Rewrite signal handling Since Python 3.3, the C signal handler writes the signal number into the wakeup file descriptor and then schedules the Python call using Py_AddPendingCall(). asyncio uses the wakeup file descriptor to wake up the event loop, and relies on Py_AddPendingCall() to schedule the final callback with call_soon(). If the C signal handler is called in a thread different than the thread of the event loop, the loop is awaken but Py_AddPendingCall() was not called yet. In this case, the event loop has nothing to do and go to sleep again. Py_AddPendingCall() is called while the event loop is sleeping again and so the final callback is not scheduled immediatly. This patch changes how asyncio handles signals. Instead of relying on Py_AddPendingCall() and the wakeup file descriptor, asyncio now only relies on the wakeup file descriptor. asyncio reads signal numbers from the wakeup file descriptor to call its signal handler. files: Lib/asyncio/proactor_events.py | 2 +- Lib/asyncio/selector_events.py | 6 ++- Lib/asyncio/unix_events.py | 20 +++++++++- Lib/test/test_asyncio/test_proactor_events.py | 2 +- Lib/test/test_asyncio/test_unix_events.py | 4 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -443,7 +443,7 @@ f.add_done_callback(self._loop_self_reading) def _write_to_self(self): - self._csock.send(b'x') + self._csock.send(b'\0') def _start_serving(self, protocol_factory, sock, ssl=None, server=None): if ssl: diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -94,12 +94,16 @@ self._internal_fds += 1 self.add_reader(self._ssock.fileno(), self._read_from_self) + def _process_self_data(self, data): + pass + def _read_from_self(self): while True: try: data = self._ssock.recv(4096) if not data: break + self._process_self_data(data) except InterruptedError: continue except BlockingIOError: @@ -114,7 +118,7 @@ csock = self._csock if csock is not None: try: - csock.send(b'x') + csock.send(b'\0') except OSError: pass diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -31,6 +31,11 @@ raise ImportError('Signals are not really supported on Windows') +def _sighandler_noop(signum, frame): + """Dummy signal handler.""" + pass + + class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): """Unix event loop. @@ -49,6 +54,13 @@ for sig in list(self._signal_handlers): self.remove_signal_handler(sig) + def _process_self_data(self, data): + for signum in data: + if not signum: + # ignore null bytes written by _write_to_self() + continue + self._handle_signal(signum) + def add_signal_handler(self, sig, callback, *args): """Add a handler for a signal. UNIX only. @@ -69,7 +81,11 @@ self._signal_handlers[sig] = handle try: - signal.signal(sig, self._handle_signal) + # Register a dummy signal handler to ask Python to write the signal + # number in the wakup file descriptor. _process_self_data() will + # read signal numbers from this file descriptor to handle signals. + signal.signal(sig, _sighandler_noop) + # Set SA_RESTART to limit EINTR occurrences. signal.siginterrupt(sig, False) except OSError as exc: @@ -85,7 +101,7 @@ else: raise - def _handle_signal(self, sig, arg): + def _handle_signal(self, sig): """Internal helper that is the actual signal handler.""" handle = self._signal_handlers.get(sig) if handle is None: diff --git a/Lib/test/test_asyncio/test_proactor_events.py b/Lib/test/test_asyncio/test_proactor_events.py --- a/Lib/test/test_asyncio/test_proactor_events.py +++ b/Lib/test/test_asyncio/test_proactor_events.py @@ -435,7 +435,7 @@ def test_write_to_self(self): self.loop._write_to_self() - self.csock.send.assert_called_with(b'x') + self.csock.send.assert_called_with(b'\0') def test_process_events(self): self.loop._process_events([]) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -42,7 +42,7 @@ ValueError, self.loop._check_signal, signal.NSIG + 1) def test_handle_signal_no_handler(self): - self.loop._handle_signal(signal.NSIG + 1, ()) + self.loop._handle_signal(signal.NSIG + 1) def test_handle_signal_cancelled_handler(self): h = asyncio.Handle(mock.Mock(), (), @@ -50,7 +50,7 @@ h.cancel() self.loop._signal_handlers[signal.NSIG + 1] = h self.loop.remove_signal_handler = mock.Mock() - self.loop._handle_signal(signal.NSIG + 1, ()) + self.loop._handle_signal(signal.NSIG + 1) self.loop.remove_signal_handler.assert_called_with(signal.NSIG + 1) @mock.patch('asyncio.unix_events.signal') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 23:51:18 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 23:51:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxMjQ3?= =?utf-8?q?=3A_Fix_a_race_condition_in_test=5Fsend=5Fsignal=28=29_of_async?= =?utf-8?q?io?= Message-ID: <3hDq0k1s2Tz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/651475d67225 changeset: 91721:651475d67225 branch: 3.4 parent: 91719:c4f053f1b47f user: Victor Stinner date: Thu Jul 17 23:49:11 2014 +0200 summary: Issue #21247: Fix a race condition in test_send_signal() of asyncio Add a basic synchronization mechanism to wait until the child process is ready before sending it a signal. files: Lib/test/test_asyncio/test_subprocess.py | 19 +++++++++-- 1 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -108,11 +108,22 @@ @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP") def test_send_signal(self): - args = PROGRAM_BLOCKED - create = asyncio.create_subprocess_exec(*args, loop=self.loop) + code = 'import time; print("sleeping", flush=True); time.sleep(3600)' + args = [sys.executable, '-c', code] + create = asyncio.create_subprocess_exec(*args, loop=self.loop, stdout=subprocess.PIPE) proc = self.loop.run_until_complete(create) - proc.send_signal(signal.SIGHUP) - returncode = self.loop.run_until_complete(proc.wait()) + + @asyncio.coroutine + def send_signal(proc): + # basic synchronization to wait until the program is sleeping + line = yield from proc.stdout.readline() + self.assertEqual(line, b'sleeping\n') + + proc.send_signal(signal.SIGHUP) + returncode = (yield from proc.wait()) + return returncode + + returncode = self.loop.run_until_complete(send_signal(proc)) self.assertEqual(-signal.SIGHUP, returncode) def prepare_broken_pipe_test(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 17 23:51:19 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 17 Jul 2014 23:51:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2321247=3A_Fix_a_race_condition?= =?utf-8?q?_in_test=5Fsend=5Fsignal=28=29_of_asyncio?= Message-ID: <3hDq0l3dVkz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/45e8eb53edbc changeset: 91722:45e8eb53edbc parent: 91720:2176496951a4 parent: 91721:651475d67225 user: Victor Stinner date: Thu Jul 17 23:49:40 2014 +0200 summary: (Merge 3.4) Issue #21247: Fix a race condition in test_send_signal() of asyncio Add a basic synchronization mechanism to wait until the child process is ready before sending it a signal. files: Lib/test/test_asyncio/test_subprocess.py | 19 +++++++++-- 1 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -108,11 +108,22 @@ @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP") def test_send_signal(self): - args = PROGRAM_BLOCKED - create = asyncio.create_subprocess_exec(*args, loop=self.loop) + code = 'import time; print("sleeping", flush=True); time.sleep(3600)' + args = [sys.executable, '-c', code] + create = asyncio.create_subprocess_exec(*args, loop=self.loop, stdout=subprocess.PIPE) proc = self.loop.run_until_complete(create) - proc.send_signal(signal.SIGHUP) - returncode = self.loop.run_until_complete(proc.wait()) + + @asyncio.coroutine + def send_signal(proc): + # basic synchronization to wait until the program is sleeping + line = yield from proc.stdout.readline() + self.assertEqual(line, b'sleeping\n') + + proc.send_signal(signal.SIGHUP) + returncode = (yield from proc.wait()) + return returncode + + returncode = self.loop.run_until_complete(send_signal(proc)) self.assertEqual(-signal.SIGHUP, returncode) def prepare_broken_pipe_test(self): -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Jul 18 10:34:52 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 18 Jul 2014 10:34:52 +0200 Subject: [Python-checkins] Daily reference leaks (45e8eb53edbc): sum=7 Message-ID: results for 45e8eb53edbc on branch "default" -------------------------------------------- test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, 0, 0] references, sum=2 test_site leaked [2, 0, 0] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogVg9d93', '-x'] From python-checkins at python.org Fri Jul 18 12:47:55 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 18 Jul 2014 12:47:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogRml4IGFzeW5jaW8u?= =?utf-8?q?=5F=5Fall=5F=5F=3A_export_also_unix=5Fevents_and_windows=5Feven?= =?utf-8?q?ts_symbols?= Message-ID: <3hF8Dq5F0Jz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/82e0aca2cf9e changeset: 91723:82e0aca2cf9e branch: 3.4 parent: 91721:651475d67225 user: Victor Stinner date: Fri Jul 18 12:44:25 2014 +0200 summary: Fix asyncio.__all__: export also unix_events and windows_events symbols For example, on Windows, it was not possible to get ProactorEventLoop or DefaultEventLoopPolicy using "from asyncio import *". files: Lib/asyncio/__init__.py | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -29,12 +29,6 @@ from .tasks import * from .transports import * -if sys.platform == 'win32': # pragma: no cover - from .windows_events import * -else: - from .unix_events import * # pragma: no cover - - __all__ = (coroutines.__all__ + events.__all__ + futures.__all__ + @@ -45,3 +39,10 @@ subprocess.__all__ + tasks.__all__ + transports.__all__) + +if sys.platform == 'win32': # pragma: no cover + from .windows_events import * + __all__ += windows_events.__all__ +else: + from .unix_events import * # pragma: no cover + __all__ += unix_events.__all__ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 18 12:47:56 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 18 Jul 2014 12:47:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgRml4IGFzeW5jaW8uX19hbGxfXzogZXhwb3J0IGFs?= =?utf-8?q?so_unix=5Fevents_and_windows=5Fevents?= Message-ID: <3hF8Dr6hFcz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/0e4e3ba73f3c changeset: 91724:0e4e3ba73f3c parent: 91722:45e8eb53edbc parent: 91723:82e0aca2cf9e user: Victor Stinner date: Fri Jul 18 12:47:14 2014 +0200 summary: (Merge 3.4) Fix asyncio.__all__: export also unix_events and windows_events symbols For example, on Windows, it was not possible to get ProactorEventLoop or DefaultEventLoopPolicy using "from asyncio import *". files: Lib/asyncio/__init__.py | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Lib/asyncio/__init__.py b/Lib/asyncio/__init__.py --- a/Lib/asyncio/__init__.py +++ b/Lib/asyncio/__init__.py @@ -29,12 +29,6 @@ from .tasks import * from .transports import * -if sys.platform == 'win32': # pragma: no cover - from .windows_events import * -else: - from .unix_events import * # pragma: no cover - - __all__ = (coroutines.__all__ + events.__all__ + futures.__all__ + @@ -45,3 +39,10 @@ subprocess.__all__ + tasks.__all__ + transports.__all__) + +if sys.platform == 'win32': # pragma: no cover + from .windows_events import * + __all__ += windows_events.__all__ +else: + from .unix_events import * # pragma: no cover + __all__ += unix_events.__all__ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 18 16:15:50 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 18 Jul 2014 16:15:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDA0?= =?utf-8?q?=3A_Correct_an_argument_name=2E?= Message-ID: <3hFDrk19Slz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/4c98086194d5 changeset: 91725:4c98086194d5 branch: 2.7 parent: 91708:308f3c1e36d3 user: Zachary Ware date: Fri Jul 18 09:11:48 2014 -0500 summary: Issue #22004: Correct an argument name. files: Doc/library/io.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -287,7 +287,7 @@ most *limit* bytes will be read. The line terminator is always ``b'\n'`` for binary files; for text files, - the *newlines* argument to :func:`.open` can be used to select the line + the *newline* argument to :func:`.open` can be used to select the line terminator(s) recognized. .. method:: readlines(hint=-1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 18 16:15:51 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 18 Jul 2014 16:15:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDA0?= =?utf-8?q?=3A_Correct_an_argument_name=2E?= Message-ID: <3hFDrl2yWTz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/252cd056d1cf changeset: 91726:252cd056d1cf branch: 3.4 parent: 91723:82e0aca2cf9e user: Zachary Ware date: Fri Jul 18 09:11:48 2014 -0500 summary: Issue #22004: Correct an argument name. files: Doc/library/io.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -289,7 +289,7 @@ most *size* bytes will be read. The line terminator is always ``b'\n'`` for binary files; for text files, - the *newlines* argument to :func:`open` can be used to select the line + the *newline* argument to :func:`open` can be used to select the line terminator(s) recognized. .. method:: readlines(hint=-1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 18 16:15:52 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 18 Jul 2014 16:15:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Closes_=2322004=3A_Merge_with_3=2E4?= Message-ID: <3hFDrm4ptlz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/f83adc06f486 changeset: 91727:f83adc06f486 parent: 91724:0e4e3ba73f3c parent: 91726:252cd056d1cf user: Zachary Ware date: Fri Jul 18 09:14:55 2014 -0500 summary: Closes #22004: Merge with 3.4 files: Doc/library/io.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -289,7 +289,7 @@ most *size* bytes will be read. The line terminator is always ``b'\n'`` for binary files; for text files, - the *newlines* argument to :func:`open` can be used to select the line + the *newline* argument to :func:`open` can be used to select the line terminator(s) recognized. .. method:: readlines(hint=-1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 18 18:22:52 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 18 Jul 2014 18:22:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_472=3A_Fix_typo_in_header?= =?utf-8?q?s?= Message-ID: <3hFHgJ1kbxz7Llk@mail.python.org> http://hg.python.org/peps/rev/d55e0abb124a changeset: 5498:d55e0abb124a user: Victor Stinner date: Fri Jul 18 18:22:40 2014 +0200 summary: PEP 472: Fix typo in headers files: pep-0472.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0472.txt b/pep-0472.txt --- a/pep-0472.txt +++ b/pep-0472.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Stefano Borini, Joseph Martinot-Lagarde -Discussion-To: python-ideas at python.org +Discussions-To: python-ideas at python.org Status: Draft Type: Standards Track Content-Type: text/x-rst -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Jul 18 18:30:50 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 18 Jul 2014 18:30:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_471=3A_Ben_Hoyt_updates?= Message-ID: <3hFHrV5FwGz7LjY@mail.python.org> http://hg.python.org/peps/rev/40a6c3b54559 changeset: 5499:40a6c3b54559 user: Victor Stinner date: Fri Jul 18 18:25:41 2014 +0200 summary: PEP 471: Ben Hoyt updates files: pep-0471.txt | 318 +++++++++++++++++++++++++------------- 1 files changed, 205 insertions(+), 113 deletions(-) diff --git a/pep-0471.txt b/pep-0471.txt --- a/pep-0471.txt +++ b/pep-0471.txt @@ -8,7 +8,7 @@ Content-Type: text/x-rst Created: 30-May-2014 Python-Version: 3.5 -Post-History: 27-Jun-2014, 8-Jul-2014 +Post-History: 27-Jun-2014, 8-Jul-2014, 14-Jul-2014, 18-Jul-2014 Abstract @@ -16,9 +16,9 @@ This PEP proposes including a new directory iteration function, ``os.scandir()``, in the standard library. This new function adds -useful functionality and increases the speed of ``os.walk()`` by 2-10 -times (depending on the platform and file system) by significantly -reducing the number of times ``stat()`` needs to be called. +useful functionality and increases the speed of ``os.walk()`` by 2-20 +times (depending on the platform and file system) by avoiding calls to +``os.stat()`` in most cases. Rationale @@ -34,8 +34,8 @@ ``FindNextFile`` on Windows and ``readdir`` on POSIX systems -- already tell you whether the files returned are directories or not, so no further system calls are needed. Further, the Windows system calls -return all the information for a ``stat_result`` object, such as file -size and last modification time. +return all the information for a ``stat_result`` object on the directory +entry, such as file size and last modification time. In short, you can reduce the number of system calls required for a tree function like ``os.walk()`` from approximately 2N to N, where N @@ -56,7 +56,7 @@ memory efficiency for iterating very large directories. So, as well as providing a ``scandir()`` iterator function for calling -directly, Python's existing ``os.walk()`` function could be sped up a +directly, Python's existing ``os.walk()`` function can be sped up a huge amount. .. _`Issue 11406`: http://bugs.python.org/issue11406 @@ -67,7 +67,8 @@ The implementation of this proposal was written by Ben Hoyt (initial version) and Tim Golden (who helped a lot with the C extension -module). It lives on GitHub at `benhoyt/scandir`_. +module). It lives on GitHub at `benhoyt/scandir`_. (The implementation +may lag behind the updates to this PEP a little.) .. _`benhoyt/scandir`: https://github.com/benhoyt/scandir @@ -82,67 +83,83 @@ Specifics of proposal ===================== +os.scandir() +------------ + Specifically, this PEP proposes adding a single function to the ``os`` module in the standard library, ``scandir``, that takes a single, optional string as its argument:: - scandir(path='.') -> generator of DirEntry objects + scandir(directory='.') -> generator of DirEntry objects Like ``listdir``, ``scandir`` calls the operating system's directory -iteration system calls to get the names of the files in the ``path`` -directory, but it's different from ``listdir`` in two ways: +iteration system calls to get the names of the files in the given +``directory``, but it's different from ``listdir`` in two ways: * Instead of returning bare filename strings, it returns lightweight ``DirEntry`` objects that hold the filename string and provide simple methods that allow access to the additional data the - operating system returned. + operating system may have returned. * It returns a generator instead of a list, so that ``scandir`` acts as a true iterator instead of returning the full list immediately. -``scandir()`` yields a ``DirEntry`` object for each file and directory -in ``path``. Just like ``listdir``, the ``'.'`` and ``'..'`` -pseudo-directories are skipped, and the entries are yielded in -system-dependent order. Each ``DirEntry`` object has the following -attributes and methods: +``scandir()`` yields a ``DirEntry`` object for each file and +sub-directory in ``directory``. Just like ``listdir``, the ``'.'`` +and ``'..'`` pseudo-directories are skipped, and the entries are +yielded in system-dependent order. Each ``DirEntry`` object has the +following attributes and methods: -* ``name``: the entry's filename, relative to the ``path`` argument - (corresponds to the return values of ``os.listdir``) +* ``name``: the entry's filename, relative to the ``directory`` + argument (corresponds to the return values of ``os.listdir``) -* ``full_name``: the entry's full path name -- the equivalent of - ``os.path.join(path, entry.name)`` +* ``path``: the entry's full path name (not necessarily an absolute + path) -- the equivalent of ``os.path.join(directory, entry.name)`` -* ``is_dir()``: like ``os.path.isdir()``, but much cheaper -- it never - requires a system call on Windows, and usually doesn't on POSIX - systems +* ``is_dir(*, follow_symlinks=True)``: similar to + ``pathlib.Path.is_dir()``, but the return value is cached on the + ``DirEntry`` object; doesn't require a system call in most cases; + don't follow symbolic links if ``follow_symlinks`` is False -* ``is_file()``: like ``os.path.isfile()``, but much cheaper -- it - never requires a system call on Windows, and usually doesn't on - POSIX systems +* ``is_file(*, follow_symlinks=True)``: similar to + ``pathlib.Path.is_file()``, but the return value is cached on the + ``DirEntry`` object; doesn't require a system call in most cases; + don't follow symbolic links if ``follow_symlinks`` is False -* ``is_symlink()``: like ``os.path.islink()``, but much cheaper -- it - never requires a system call on Windows, and usually doesn't on - POSIX systems +* ``is_symlink()``: similar to ``pathlib.Path.is_symlink()``, but the + return value is cached on the ``DirEntry`` object; doesn't require a + system call in most cases -* ``lstat()``: like ``os.lstat()``, but much cheaper on some systems - -- it only requires a system call on POSIX systems +* ``stat(*, follow_symlinks=True)``: like ``os.stat()``, but the + return value is cached on the ``DirEntry`` object; does not require a + system call on Windows (except for symlinks); don't follow symbolic links + (like ``os.lstat()``) if ``follow_symlinks`` is False -The ``is_X`` methods may perform a ``stat()`` call under certain -conditions (for example, on certain file systems on POSIX systems), -and therefore possibly raise ``OSError``. The ``lstat()`` method will -call ``stat()`` on POSIX systems and therefore also possibly raise -``OSError``. See the "Notes on exception handling" section for more -details. +All *methods* may perform system calls in some cases and therefore +possibly raise ``OSError`` -- see the "Notes on exception handling" +section for more details. The ``DirEntry`` attribute and method names were chosen to be the same -as those in the new ``pathlib`` module for consistency. +as those in the new ``pathlib`` module where possible, for +consistency. The only difference in functionality is that the +``DirEntry`` methods cache their values on the entry object after the +first call. Like the other functions in the ``os`` module, ``scandir()`` accepts -either a bytes or str object for the ``path`` parameter, and returns -the ``DirEntry.name`` and ``DirEntry.full_name`` attributes with the -same type as ``path``. However, it is *strongly recommended* to use -the str type, as this ensures cross-platform support for Unicode -filenames. +either a bytes or str object for the ``directory`` parameter, and +returns the ``DirEntry.name`` and ``DirEntry.path`` attributes with +the same type as ``directory``. However, it is *strongly recommended* +to use the str type, as this ensures cross-platform support for +Unicode filenames. (On Windows, bytes filenames have been deprecated +since Python 3.3). + +os.walk() +--------- + +As part of this proposal, ``os.walk()`` will also be modified to use +``scandir()`` rather than ``listdir()`` and ``os.path.isdir()``. This +will increase the speed of ``os.walk()`` very significantly (as +mentioned above, by 2-20 times, depending on the system). Examples @@ -154,7 +171,7 @@ dirs = [] non_dirs = [] - for entry in os.scandir(path): + for entry in os.scandir(directory): if entry.is_dir(): dirs.append(entry) else: @@ -165,19 +182,25 @@ and POSIX systems. Or, for getting the total size of files in a directory tree, showing -use of the ``DirEntry.lstat()`` method and ``DirEntry.full_name`` +use of the ``DirEntry.stat()`` method and ``DirEntry.path`` attribute:: - def get_tree_size(path): - """Return total size of files in path and subdirs.""" + def get_tree_size(directory): + """Return total size of files in directory and subdirs.""" total = 0 - for entry in os.scandir(path): - if entry.is_dir(): - total += get_tree_size(entry.full_name) + for entry in os.scandir(directory): + if entry.is_dir(follow_symlinks=False): + total += get_tree_size(entry.path) else: - total += entry.lstat().st_size + total += entry.stat(follow_symlinks=False).st_size return total +This also shows the use of the ``follow_symlinks`` parameter to +``is_dir()`` -- in a recursive function like this, we probably don't +want to follow links. (To properly follow links in a recursive +function like this we'd want special handling for the case where +following a symlink leads to a recursive loop.) + Note that ``get_tree_size()`` will get a huge speed boost on Windows, because no extra stat call are needed, but on POSIX systems the size information is not returned by the directory iteration functions, so @@ -188,10 +211,10 @@ ---------------- The ``DirEntry`` objects are relatively dumb -- the ``name`` and -``full_name`` attributes are obviously always cached, and the ``is_X`` -and ``lstat`` methods cache their values (immediately on Windows via +``path`` attributes are obviously always cached, and the ``is_X`` +and ``stat`` methods cache their values (immediately on Windows via ``FindNextFile``, and on first use on POSIX systems via a ``stat`` -call) and never refetch from the system. +system call) and never refetch from the system. For this reason, ``DirEntry`` objects are intended to be used and thrown away after iteration, not stored in long-lived data structured @@ -199,50 +222,61 @@ If developers want "refresh" behaviour (for example, for watching a file's size change), they can simply use ``pathlib.Path`` objects, -or call the regular ``os.lstat()`` or ``os.path.getsize()`` functions +or call the regular ``os.stat()`` or ``os.path.getsize()`` functions which get fresh data from the operating system every call. Notes on exception handling --------------------------- -``DirEntry.is_X()`` and ``DirEntry.lstat()`` are explicitly methods +``DirEntry.is_X()`` and ``DirEntry.stat()`` are explicitly methods rather than attributes or properties, to make it clear that they may -not be cheap operations, and they may do a system call. As a result, -these methods may raise ``OSError``. +not be cheap operations (although they often are), and they may do a +system call. As a result, these methods may raise ``OSError``. -For example, ``DirEntry.lstat()`` will always make a system call on +For example, ``DirEntry.stat()`` will always make a system call on POSIX-based systems, and the ``DirEntry.is_X()`` methods will make a -``stat()`` system call on such systems if ``readdir()`` returns a -``d_type`` with a value of ``DT_UNKNOWN``, which can occur under -certain conditions or on certain file systems. +``stat()`` system call on such systems if ``readdir()`` does not +support ``d_type`` or returns a ``d_type`` with a value of +``DT_UNKNOWN``, which can occur under certain conditions or on +certain file systems. -For this reason, when a user requires fine-grained error handling, -it's good to catch ``OSError`` around these method calls and then -handle as appropriate. +Often this does not matter -- for example, ``os.walk()`` as defined in +the standard library only catches errors around the ``listdir()`` +calls. + +Also, because the exception-raising behaviour of the ``DirEntry.is_X`` +methods matches that of ``pathlib`` -- which only raises ``OSError`` +in the case of permissions or other fatal errors, but returns False +if the path doesn't exist or is a broken symlink -- it's often +not necessary to catch errors around the ``is_X()`` calls. + +However, when a user requires fine-grained error handling, it may be +desirable to catch ``OSError`` around all method calls and handle as +appropriate. For example, below is a version of the ``get_tree_size()`` example -shown above, but with basic error handling added:: +shown above, but with fine-grained error handling added:: - def get_tree_size(path): - """Return total size of files in path and subdirs. If - is_dir() or lstat() fails, print an error message to stderr + def get_tree_size(directory): + """Return total size of files in directory and subdirs. If + is_dir() or stat() fails, print an error message to stderr and assume zero size (for example, file has been deleted). """ total = 0 - for entry in os.scandir(path): + for entry in os.scandir(directory): try: - is_dir = entry.is_dir() + is_dir = entry.is_dir(follow_symlinks=False) except OSError as error: print('Error calling is_dir():', error, file=sys.stderr) continue if is_dir: - total += get_tree_size(entry.full_name) + total += get_tree_size(entry.path) else: try: - total += entry.lstat().st_size + total += entry.stat(follow_symlinks=False).st_size except OSError as error: - print('Error calling lstat():', error, file=sys.stderr) + print('Error calling stat():', error, file=sys.stderr) return total @@ -316,6 +350,12 @@ Seems pretty solid, so first thing, just want to say nice work!" [via personal email] +* Matt Z: "I used scandir to dump the contents of a network dir in + under 15 seconds. 13 root dirs, 60,000 files in the structure. This + will replace some old VBA code embedded in a spreadsheet that was + taking 15-20 minutes to do the exact same thing." [via personal + email] + Others have `requested a PyPI package`_ for it, which has been created. See `PyPI package`_. @@ -331,13 +371,11 @@ * Forks: 20 * Issues: 4 open, 26 closed -**However, the much larger point is this:**, if this PEP is accepted, -``os.walk()`` can easily be reimplemented using ``scandir`` rather -than ``listdir`` and ``stat``, increasing the speed of ``os.walk()`` -very significantly. There are thousands of developers, scripts, and -production code that would benefit from this large speedup of -``os.walk()``. For example, on GitHub, there are almost as many uses -of ``os.walk`` (194,000) as there are of ``os.mkdir`` (230,000). +Also, because this PEP will increase the speed of ``os.walk()`` +significantly, there are thousands of developers and scripts, and a lot +of production code, that would benefit from it. For example, on GitHub, +there are almost as many uses of ``os.walk`` (194,000) as there are of +``os.mkdir`` (230,000). Rejected ideas @@ -392,12 +430,51 @@ `_. +Methods not following symlinks by default +----------------------------------------- + +There was much debate on python-dev (see messages in `this thread +`_) +over whether the ``DirEntry`` methods should follow symbolic links or +not (when the ``is_X()`` methods had no ``follow_symlinks`` parameter). + +Initially they did not (see previous versions of this PEP and the +scandir.py module), but Victor Stinner made a pretty compelling case on +python-dev that following symlinks by default is a better idea, because: + +* following links is usually what you want (in 92% of cases in the + standard library, functions using ``os.listdir()`` and + ``os.path.isdir()`` do follow symlinks) + +* that's the precedent set by the similar functions + ``os.path.isdir()`` and ``pathlib.Path.is_dir()``, so to do + otherwise would be confusing + +* with the non-link-following approach, if you wanted to follow links + you'd have to say something like ``if (entry.is_symlink() and + os.path.isdir(entry.path)) or entry.is_dir()``, which is clumsy + +As a case in point that shows the non-symlink-following version is +error prone, this PEP's author had a bug caused by getting this +exact test wrong in his initial implementation of ``scandir.walk()`` +in scandir.py (see `Issue #4 here +`_). + +In the end there was not total agreement that the methods should +follow symlinks, but there was basic consensus among the most involved +participants, and this PEP's author believes that the above case is +strong enough to warrant following symlinks by default. + +In addition, it's straight-forward to call the relevant methods with +``follow_symlinks=False`` if the other behaviour is desired. + + DirEntry attributes being properties ------------------------------------ In some ways it would be nicer for the ``DirEntry`` ``is_X()`` and -``lstat()`` to be properties instead of methods, to indicate they're -very cheap or free. However, this isn't quite the case, as ``lstat()`` +``stat()`` to be properties instead of methods, to indicate they're +very cheap or free. However, this isn't quite the case, as ``stat()`` will require an OS call on POSIX-based systems but not on Windows. Even ``is_dir()`` and friends may perform an OS call on POSIX-based systems if the ``dirent.d_type`` value is ``DT_UNKNOWN`` (on certain @@ -422,8 +499,8 @@ `_, Paul Moore suggested a solution that was a "thin wrapper round the OS feature", where the ``DirEntry`` object had only static attributes: -``name``, ``full_name``, and ``is_X``, with the ``st_X`` attributes -only present on Windows. The idea was to use this simpler, lower-level +``name``, ``path``, and ``is_X``, with the ``st_X`` attributes only +present on Windows. The idea was to use this simpler, lower-level function as a building block for higher-level functions. At first there was general agreement that simplifying in this way was @@ -459,19 +536,24 @@ ``OSError``) during iteration, leading to a rather ugly, hand-made iteration loop:: - it = os.scandir(path) + it = os.scandir(directory) while True: try: entry = next(it) except OSError as error: - handle_error(path, error) + handle_error(directory, error) except StopIteration: break Or it means that ``scandir()`` would have to accept an ``onerror`` argument -- a function to call when ``stat()`` errors occur during iteration. This seems to this PEP's author neither as direct nor as -Pythonic as ``try``/``except`` around a ``DirEntry.lstat()`` call. +Pythonic as ``try``/``except`` around a ``DirEntry.stat()`` call. + +Another drawback is that ``os.scandir()`` is written to make code faster. +Always calling ``os.lstat()`` on POSIX would not bring any speedup. In most +cases, you don't need the full ``stat_result`` object -- the ``is_X()`` +methods are enough and this information is already known. See `Ben Hoyt's July 2014 reply `_ @@ -513,7 +595,7 @@ -------------------------------------------------- Another alternative discussed was making the return values to be -overloaded ``stat_result`` objects with ``name`` and ``full_name`` +overloaded ``stat_result`` objects with ``name`` and ``path`` attributes. However, apart from this being a strange (and strained!) kind of overloading, this has the same problems mentioned above -- most of the ``stat_result`` information is not fetched by @@ -526,15 +608,15 @@ With Antoine Pitrou's new standard library ``pathlib`` module, it at first seems like a great idea for ``scandir()`` to return instances of ``pathlib.Path``. However, ``pathlib.Path``'s ``is_X()`` and -``lstat()`` functions are explicitly not cached, whereas ``scandir`` +``stat()`` functions are explicitly not cached, whereas ``scandir`` has to cache them by design, because it's (often) returning values from the original directory iteration system call. And if the ``pathlib.Path`` instances returned by ``scandir`` cached -lstat values, but the ordinary ``pathlib.Path`` objects explicitly +stat values, but the ordinary ``pathlib.Path`` objects explicitly don't, that would be more than a little confusing. -Guido van Rossum explicitly rejected ``pathlib.Path`` caching lstat in +Guido van Rossum explicitly rejected ``pathlib.Path`` caching stat in the context of scandir `here `_, making ``pathlib.Path`` objects a bad choice for scandir return @@ -564,35 +646,45 @@ Previous discussion =================== -* `Original thread Ben Hoyt started on python-ideas`_ about speeding - up ``os.walk()`` +* `Original November 2012 thread Ben Hoyt started on python-ideas + `_ + about speeding up ``os.walk()`` * Python `Issue 11406`_, which includes the original proposal for a scandir-like function -* `Further thread Ben Hoyt started on python-dev`_ that refined the - ``scandir()`` API, including Nick Coghlan's suggestion of scandir - yielding ``DirEntry``-like objects +* `Further May 2013 thread Ben Hoyt started on python-dev + `_ + that refined the ``scandir()`` API, including Nick Coghlan's + suggestion of scandir yielding ``DirEntry``-like objects -* `Another thread Ben Hoyt started on python-dev`_ to discuss the - interaction between scandir and the new ``pathlib`` module +* `November 2013 thread Ben Hoyt started on python-dev + `_ + to discuss the interaction between scandir and the new ``pathlib`` + module -* `Final thread Ben Hoyt started on python-dev`_ to discuss the first - version of this PEP, with extensive discussion about the API. +* `June 2014 thread Ben Hoyt started on python-dev + `_ + to discuss the first version of this PEP, with extensive discussion + about the API -* `Question on StackOverflow`_ about why ``os.walk()`` is slow and - pointers on how to fix it (this inspired the author of this PEP - early on) +* `First July 2014 thread Ben Hoyt started on python-dev + `_ + to discuss his updates to PEP 471 -* `BetterWalk`_, this PEP's author's previous attempt at this, on - which the scandir code is based +* `Second July 2014 thread Ben Hoyt started on python-dev + `_ + to discuss the remaining decisions needed to finalize PEP 471, + specifically whether the ``DirEntry`` methods should follow symlinks + by default -.. _`Original thread Ben Hoyt started on python-ideas`: https://mail.python.org/pipermail/python-ideas/2012-November/017770.html -.. _`Further thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2013-May/126119.html -.. _`Another thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2013-November/130572.html -.. _`Final thread Ben Hoyt started on python-dev`: https://mail.python.org/pipermail/python-dev/2014-June/135215.html -.. _`Question on StackOverflow`: http://stackoverflow.com/questions/2485719/very-quickly-getting-total-size-of-folder -.. _`BetterWalk`: https://github.com/benhoyt/betterwalk +* `Question on StackOverflow + `_ + about why ``os.walk()`` is slow and pointers on how to fix it (this + inspired the author of this PEP early on) + +* `BetterWalk `_, this PEP's + author's previous attempt at this, on which the scandir code is based Copyright -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Jul 19 01:26:21 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 19 Jul 2014 01:26:21 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_add_missing_?= =?utf-8?q?=27because=27_=28closes_=2322008=29?= Message-ID: <3hFT3x564fz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/ef009b76bca3 changeset: 91728:ef009b76bca3 branch: 2.7 parent: 91725:4c98086194d5 user: Benjamin Peterson date: Fri Jul 18 16:25:13 2014 -0700 summary: add missing 'because' (closes #22008) Patch from A Kaptur. files: Python/symtable.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/symtable.c b/Python/symtable.c --- a/Python/symtable.c +++ b/Python/symtable.c @@ -504,7 +504,7 @@ case OPT_BARE_EXEC: PyOS_snprintf(buf, sizeof(buf), "unqualified exec is not allowed in function " - "'%.100s' it %s", + "'%.100s' because it %s", PyString_AS_STRING(ste->ste_name), trailer); break; default: -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Jul 19 10:31:11 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 19 Jul 2014 10:31:11 +0200 Subject: [Python-checkins] Daily reference leaks (f83adc06f486): sum=9 Message-ID: results for f83adc06f486 on branch "default" -------------------------------------------- test_collections leaked [2, 0, 0] references, sum=2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [0, 0, 2] references, sum=2 test_site leaked [0, 0, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog6JnxyN', '-x'] From python-checkins at python.org Sat Jul 19 11:49:43 2014 From: python-checkins at python.org (nick.coghlan) Date: Sat, 19 Jul 2014 11:49:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Split_software_forge_proposal?= =?utf-8?q?_into_a_new_PEP?= Message-ID: <3hFkvC0fkCz7LmZ@mail.python.org> http://hg.python.org/peps/rev/0f5f7c61c522 changeset: 5500:0f5f7c61c522 user: Nick Coghlan date: Sat Jul 19 19:49:30 2014 +1000 summary: Split software forge proposal into a new PEP - moved the software forge proposal out to its own PEP - switched forge proposal to Kallithea based on SFC concerns with the current RhodeCode licensing structure files: pep-0462.txt | 161 +++----------------------------------- pep-0474.txt | 161 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 147 deletions(-) diff --git a/pep-0462.txt b/pep-0462.txt --- a/pep-0462.txt +++ b/pep-0462.txt @@ -21,11 +21,6 @@ experience for other contributors that are reliant on the core team to get their changes incorporated. -This PEP also proposes changes to the way certain supporting repositories -(such as the repository for Python Enhancement Proposals) are managed to -make them more accessible to new contributors, and easier to manage for -core developers. - Rationale for changes to the core development workflow ====================================================== @@ -158,23 +153,6 @@ the case for OpenStack). -Rationale for changes to source code repository management -========================================================== - -Currently, hg.python.org hosts more than just the core CPython repository, -it also hosts other repositories such as those for the CPython developer -guide and for Python Enhancement Proposals, along with various "sandbox" -repositories for core developer experimentation. - -These supporting repositories could benefit greatly from user the simple -"pull request" style workflow made popular by code hosting sites like -GitHub and BitBucket. - -This PEP proposes introducing a more sophisticated approach to repository -management that includes more "self service" features, including support -for pull requests. - - Current Tools ============= @@ -198,53 +176,8 @@ Proposal ======== -This proposal consists of two key components: - -* Introducing RhodeCode for improved repository management -* Introducing automated merge gating for the CPython project - - -Improved repository management ------------------------------- - -The rise of free source code hosting sites like GitHub and BitBucket with a -focus on improving the user experience have increased user expectations -for the web based interface offered for source code repositories. This -includes features like dynamic control of user permissions for repository -administrators, online editing for documentation updates and similar small -fixes, easy cloning and branching, etc. - -While GitHub and BitBucket are proprietary solutions to this problem that -cannot be self-hosted, RhodeCode_ is a popular primarily open source solution -that offers similar features to the major free hosting sites, while also -allowing installation on your own servers. RhodeCode is also implemented -in Python, allowing us to preserve our current situation of having our -workflow tools being almost entirely self-hosting. - -There's nothing too complicated with this part of the proposal: it is -essentially just a suggestion to convert hg.python.org to being backed -by a RhodeCode Enterprise instance hosted on PSF infrastructure. - -All of the functional parts of RhodeCode Enterprise are open source under -the GPLv3 license. The "look & feel" components are licensed under a -`business source license`_ that is free for up to 20 users, as well as for -organisations that qualify for one of RhodeCode's exemption categories -(in the case of ``hg.python.org``, the relevant category is "public open -source project"). - -The RhodeCode developers have also expressed interest in helping out with -ensuring a python.org RhodeCode deployment is successful. - -.. _RhodeCode: https://rhodecode.com/ -.. _business source license: https://rhodecode.com/licenses - - -Automated merge gating for CPython ----------------------------------- - -The essence of this part of the proposal is that CPython aim to adopt a -"core reviewer" development model, similar to that used by the OpenStack -project. +The essence of this proposal is that CPython aim to adopt a "core reviewer" +development model, similar to that used by the OpenStack project. The workflow problems experienced by the CPython core development team are not unique. The OpenStack infrastructure team have come up with a well @@ -255,7 +188,7 @@ * patches never get merged without being tested relative to the current state of the branch * the main development branch always stays green. Patches that do not pass - the automated tests do not get merged. + the automated tests do not get merged If a core developer wants to tweak a patch prior to merging, they download it from the review tool, modify and *upload it back to the review tool* @@ -360,25 +293,6 @@ Perceived Benefits ================== -Improved repository management ------------------------------- - -The primary benefit of using RhodeCode to manage hg.python.org is that -supporting repositories such as the developer guide and the PEP repo could -now be managed using pull requests and online editing. This would be -much simpler then the current workflow which requires PEP editors and -other core developers to act as intermediaries to apply updates suggested -by other users. - -The richer administrative functionality would also make it substantially -easier to grant users access to particular repositories for collaboration -purposes, without having to grant them general access to the entire -installation. - - -Automated merge gating for CPython ----------------------------------- - The benefits of this proposal accrue most directly to the core development team. First and foremost, it means that once we mark a patch as "Approved" in the updated code review system, *we're usually done*. The extra 20-30 @@ -438,35 +352,6 @@ Zuul trigger and action plugins, and may require additional development in some of our existing tools. -RhodeCode may also require some adjustment to fit in with existing -infrastructure. - - -User account management ------------------------ - -Ideally we'd be able to offer a single account that spans all python.org -services, including RhodeCode, Roundup/Rietveld, PyPI and the back end for -the new python.org site, but actually implementing that would be a distinct -infrastructure project, independent of this PEP. - -A potentially simpler near term solution would be if RhodeCode's user -account management could be integrated with the existing account management -in Roundup, similar to what was done for Rietveld. However, if that also -turns out to be impractical in the near term, we would merely end up with -another identity silo to be integrated at a later date, suggesting that -this doesn't need to be considered a blocker for an initial RhodeCode -deployment. - - -Preserving existing SSH access and links for Mercurial repositories -------------------------------------------------------------------- - -Adopting RhodeCode may result in some changes to where repositories are -located on the hg.python.org filesystem. We may want to ensure that -existing links into the hg.python.org web service are preserved, and should -definitely ensure that existing SSH based clones continue to work correctly. - Rietveld/Roundup vs Gerrit -------------------------- @@ -512,18 +397,10 @@ version control system. Zuul is also directly integrated with git for patch manipulation - as far -as I am aware, this part of the design isn't pluggable. - -Rather than trying to adapt Zuul to work directly with Mercurial, it will -likely be more practical to let Zuul continue to use git internally, and -then use the hg-git Mercurial plugin to pull the output from Zuul into the -master repo at hg.python.org. (While there are various plugins that are -designed to let git push to Mercurial repos, the influence of GitHub is -such that the hg-git plugin appears to be the most mature of the available -options for hg-git interoperability). - -One advantage of adopting RhodeCode to manage the repository infrastructure -is that it supports git repositories in addition to Mercurial repositories. +as I am aware, this part of the design isn't pluggable. However, at PyCon +US 2014, the Mercurial core developers at the sprints expressed some +interest in collaborating with the core development team and the Zuul +developers on enabling the use of Zuul with Mercurial in addition to git. Buildbot vs Jenkins @@ -779,10 +656,9 @@ Open Questions ============== -Pretty much everything in the PEP. Do we want to adopt RhodeCode? Do we -want to adopt merge gating and Zuul? Is Rietveld the right place to hook -Zuul into our current workflows? How do we want to address the various -technical challenges? +Pretty much everything in the PEP. Do we want to adopt merge gating and +Zuul? Is Rietveld the right place to hook Zuul into our current workflows? +How do we want to address the various technical challenges? Assuming we do want to do it (or something like it), how is the work going to get done? Do we try to get it done solely as a volunteer effort? Do we @@ -798,15 +674,10 @@ Next Steps ========== -The topic of CPython workflow automation is on the agenda for the Language -Summit at PyCon US 2014 in Montreal, and we will be inviting additional -participants (specifically Mercurial and Zuul developers) to be involved -in the discussions (Guido van Rossum is the creator of Rietveld, and these -workflow changes are not expected to require any significant changes in -Roundup or Buildbot). - -Unfortunately, the lead RhodeCode developers aren't able to attend PyCon US -this year, or we would have invited them, too. +Unfortunately, we ran out of time at the PyCon 2014 language summit to really +discuss these issues. However, the `core-workflow mailing list +`__ has now been set +up to discuss workflow issues in general. Acknowledgements @@ -817,10 +688,6 @@ Taylor for additional technical feedback following publication of the initial draft. -Thanks also to Marcin Kuzminski (CTO of RhodeCode) for getting in touch to -express their interest in helping to ensure the success of a RhodeCode -deployment if we choose to proceed down that path. - Copyright ========= diff --git a/pep-0474.txt b/pep-0474.txt new file mode 100644 --- /dev/null +++ b/pep-0474.txt @@ -0,0 +1,161 @@ +PEP: 474 +Title: Creating forge.python.org +Version: $Revision$ +Last-Modified: $Date$ +Author: Nick Coghlan +Status: Draft +Type: Process +Content-Type: text/x-rst +Created: 19-Jul-2014 +Post-History: 19-Jul-2014 + + +Abstract +======== + +This PEP proposes setting up a new PSF provided resource, forge.python.org, +as a location for maintaining various supporting repositories +(such as the repository for Python Enhancement Proposals) in a way that is +more accessible to new contributors, and easier to manage for core +developers. + +This PEP does *not* propose any changes to the core development workflow +for CPython itself (see PEP 462 in relation to that). + + +Proposal +======== + +This PEP proposes that, once the Kallithea project has made an official +release, that a Kallithea instance be deployed as "forge.python.org". + +Individual repositories (such as the developer guide or the PEPs repository) +may then be migrated from the existing hg.python.org infrastructure to the +new forge.python.org infrastructure on a case by case basis. Each migration +will need to decide whether to retain a read-only mirror on hg.python.org, +or whether to just migrate wholesale to the new location. + +This would not be a general purpose hosting site for arbitrary Python +projects, but a more narrowly focused site akin to the existing +hg.python.org. + + +Rationale +========= + +Currently, hg.python.org hosts more than just the core CPython repository, +it also hosts other repositories such as those for the CPython developer +guide and for Python Enhancement Proposals, along with various "sandbox" +repositories for core developer experimentation. + +While the simple "pull request" style workflow made popular by code hosting +sites like GitHub and BitBucket isn't adequate for the complex branching +model needed for parallel maintenance and development of the various +CPython releases, it's a good fit for several of the ancillary projects +that surround CPython that we don't wish to move to a proprietary hosting +site. + +The key requirements proposed for a PSF provided software forge are: + +* Must support self-hosting on PSF infrastructure without ongoing fees +* Must support Mercurial (for consistency with existing tooling) +* Must support simple "pull request" style workflows +* Must support online editing for simple changes + +Ideally, the chosen solution would also be a fully open source application +written in Python. + +The requirement for self-hosting without ongoing fees rules out the +free-as-in-beer providers like GitHub and BitBucket, in addition to the +various proprietary source code management offerings. + +The requirement for Mercurial support not only rules out GitHub, but also +other Git-only solutions like GitLab and Gitorious. + +The requirement for online editing support rules out the Apache +Allura/HgForge combination. + +That leaves two main contenders from a technical perspective: + +* `RhodeCode `__ +* `Kallithea SCM `__ + +The `legal uncertainty +`__ over the +interaction between RhodeCode's current "Business Source" licensing model and +the various GPL components it relies on currently make it unclear whether it +is legally permissible to deploy it. + +By contrast, Kallithea is a full GPLv3 application (derived from the clearly +and unambiguously GPLv3 licensed components of RhodeCode) that is being +developed under the auspices of the `Software Freedom Conservancy +`__. The +Conservancy has `affirmed +`__ that the +Kallithea codebase is completely and validly licensed under GPLv3. In +addition to their role in building the initial Kallithea community, the +Conservancy is also the legal home of both the Mercurial and Git projects. +Other SFC member projects that may be familiar to Python users include +Twisted, Gevent, BuildBot and PyPy. + + +Perceived Benefits +================== + +The primary benefit of deploying Kallithea as forge.python.org is that +supporting repositories such as the developer guide and the PEP repo could +potentially be managed using pull requests and online editing. This would be +much simpler than the current workflow which requires PEP editors and +other core developers to act as intermediaries to apply updates suggested +by other users. + +The richer administrative functionality would also make it substantially +easier to grant users access to particular repositories for collaboration +purposes, without having to grant them general access to the entire +installation. + + +Technical Challenges +==================== + +User account management +----------------------- + +Ideally we'd be able to offer a single account that spans all python.org +services, including Kallithea, Roundup/Rietveld, PyPI and the back end for +the new python.org site, but actually implementing that would be a distinct +infrastructure project, independent of this PEP. + +A potentially simpler near term solution would be if Kallithea's user +account management could be integrated with the existing account management +in Roundup, similar to what was done for Rietveld. However, if that also +turns out to be impractical in the near term, we would merely end up with +another identity silo to be integrated at a later date, suggesting that +this doesn't need to be considered a blocker for an initial Kallithea +deployment. + + +Breaking existing SSH access and links for Mercurial repositories +----------------------------------------------------------------- + +This PEP proposes leaving the existing hg.python.org installation alone, +and setting up Kallithea on a new host. This approach minimises the risk +of interfering with the development of CPython itself (and any other +projects that don't migrate to the new software forge), but does make any +migrations of existing repos more disruptive (since existing checkouts will +break). + + +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 Sat Jul 19 18:52:15 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 19 Jul 2014 18:52:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_471=3A_update_by_Ben_Hoyt?= =?utf-8?q?=2C_simpler_example?= Message-ID: <3hFwGl1Nhqz7Ljf@mail.python.org> http://hg.python.org/peps/rev/8be4c830ea27 changeset: 5501:8be4c830ea27 user: Victor Stinner date: Sat Jul 19 18:50:09 2014 +0200 summary: PEP 471: update by Ben Hoyt, simpler example files: pep-0471.txt | 25 +++++++++++-------------- 1 files changed, 11 insertions(+), 14 deletions(-) diff --git a/pep-0471.txt b/pep-0471.txt --- a/pep-0471.txt +++ b/pep-0471.txt @@ -8,7 +8,7 @@ Content-Type: text/x-rst Created: 30-May-2014 Python-Version: 3.5 -Post-History: 27-Jun-2014, 8-Jul-2014, 14-Jul-2014, 18-Jul-2014 +Post-History: 27-Jun-2014, 8-Jul-2014, 14-Jul-2014 Abstract @@ -165,21 +165,18 @@ Examples ======== -Below is a good usage pattern for ``scandir``. This is in fact almost -exactly how the scandir module's faster ``os.walk()`` implementation -uses it:: +First, a very simple example of ``scandir()`` showing use of the +``DirEntry.name`` attribute and the ``DirEntry.is_dir()`` method:: - dirs = [] - non_dirs = [] - for entry in os.scandir(directory): - if entry.is_dir(): - dirs.append(entry) - else: - non_dirs.append(entry) + def subdirs(path): + """Yield directory names not starting with '.' under given path.""" + for entry in os.scandir(path): + if not entry.name.startswith('.') and entry.is_dir(): + yield entry.name -The above ``os.walk()``-like code will be significantly faster with -scandir than ``os.listdir()`` and ``os.path.isdir()`` on both Windows -and POSIX systems. +This ``subdirs()`` function will be significantly faster with scandir +than ``os.listdir()`` and ``os.path.isdir()`` on both Windows and POSIX +systems, especially on medium-sized or large directories. Or, for getting the total size of files in a directory tree, showing use of the ``DirEntry.stat()`` method and ``DirEntry.path`` -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Jul 19 22:46:10 2014 From: python-checkins at python.org (mark.dickinson) Date: Sat, 19 Jul 2014 22:46:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDA2?= =?utf-8?q?=3A_Remove_outdated_=5Fthread_caveat=2E__Thanks_Dan_O=27Reilly_?= =?utf-8?q?for_the?= Message-ID: <3hG1Sf1Twnz7LrP@mail.python.org> http://hg.python.org/cpython/rev/855ff9182a07 changeset: 91729:855ff9182a07 branch: 3.4 parent: 91726:252cd056d1cf user: Mark Dickinson date: Sat Jul 19 21:45:06 2014 +0100 summary: Issue #22006: Remove outdated _thread caveat. Thanks Dan O'Reilly for the report. files: Doc/library/_thread.rst | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -176,10 +176,6 @@ * Calling :func:`sys.exit` or raising the :exc:`SystemExit` exception is equivalent to calling :func:`_thread.exit`. -* Not all built-in functions that may block waiting for I/O allow other threads - to run. (The most popular ones (:func:`time.sleep`, :meth:`io.FileIO.read`, - :func:`select.select`) work as expected.) - * It is not possible to interrupt the :meth:`acquire` method on a lock --- the :exc:`KeyboardInterrupt` exception will happen after the lock has been acquired. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 19 22:46:11 2014 From: python-checkins at python.org (mark.dickinson) Date: Sat, 19 Jul 2014 22:46:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2322006=3A_Merge_from_3=2E4=2E?= Message-ID: <3hG1Sg3BzPz7LrN@mail.python.org> http://hg.python.org/cpython/rev/3b6b905ae229 changeset: 91730:3b6b905ae229 parent: 91727:f83adc06f486 parent: 91729:855ff9182a07 user: Mark Dickinson date: Sat Jul 19 21:45:24 2014 +0100 summary: Issue #22006: Merge from 3.4. files: Doc/library/_thread.rst | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -176,10 +176,6 @@ * Calling :func:`sys.exit` or raising the :exc:`SystemExit` exception is equivalent to calling :func:`_thread.exit`. -* Not all built-in functions that may block waiting for I/O allow other threads - to run. (The most popular ones (:func:`time.sleep`, :meth:`io.FileIO.read`, - :func:`select.select`) work as expected.) - * It is not possible to interrupt the :meth:`acquire` method on a lock --- the :exc:`KeyboardInterrupt` exception will happen after the lock has been acquired. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 19 22:47:36 2014 From: python-checkins at python.org (mark.dickinson) Date: Sat, 19 Jul 2014 22:47:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDA2?= =?utf-8?q?=3A_Remove_outdated_thread_module_caveat=2E__Thanks_Dan_O=27Rei?= =?utf-8?q?lly_for?= Message-ID: <3hG1VJ1ytmz7Lqg@mail.python.org> http://hg.python.org/cpython/rev/4f359c631bb0 changeset: 91731:4f359c631bb0 branch: 2.7 parent: 91728:ef009b76bca3 user: Mark Dickinson date: Sat Jul 19 21:47:13 2014 +0100 summary: Issue #22006: Remove outdated thread module caveat. Thanks Dan O'Reilly for the report. files: Doc/library/thread.rst | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/Doc/library/thread.rst b/Doc/library/thread.rst --- a/Doc/library/thread.rst +++ b/Doc/library/thread.rst @@ -159,10 +159,6 @@ * Calling :func:`sys.exit` or raising the :exc:`SystemExit` exception is equivalent to calling :func:`thread.exit`. -* Not all built-in functions that may block waiting for I/O allow other threads - to run. (The most popular ones (:func:`time.sleep`, :meth:`file.read`, - :func:`select.select`) work as expected.) - * It is not possible to interrupt the :meth:`acquire` method on a lock --- the :exc:`KeyboardInterrupt` exception will happen after the lock has been acquired. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 20 01:35:32 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 01:35:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogYXJncyBkb2Vzbid0?= =?utf-8?q?_need_to_be_a_tuple_=28closes_=2317210=29?= Message-ID: <3hG5D45Hxyz7LkH@mail.python.org> http://hg.python.org/cpython/rev/9cd3ab7c09d1 changeset: 91732:9cd3ab7c09d1 branch: 2.7 user: Benjamin Peterson date: Sat Jul 19 16:34:33 2014 -0700 summary: args doesn't need to be a tuple (closes #17210) 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 @@ -1108,7 +1108,7 @@ .. c:function:: PyObject* PyUnicode_Format(PyObject *format, PyObject *args) Return a new string object from *format* and *args*; this is analogous to - ``format % args``. The *args* argument must be a tuple. + ``format % args``. .. c:function:: int PyUnicode_Contains(PyObject *container, PyObject *element) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 20 01:35:33 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 01:35:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXJncyBkb2Vzbid0?= =?utf-8?q?_need_to_be_a_tuple_=28closes_=2317210=29?= Message-ID: <3hG5D572dpz7LqL@mail.python.org> http://hg.python.org/cpython/rev/ffbbd43d7342 changeset: 91733:ffbbd43d7342 branch: 3.4 parent: 91729:855ff9182a07 user: Benjamin Peterson date: Sat Jul 19 16:34:33 2014 -0700 summary: args doesn't need to be a tuple (closes #17210) 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 @@ -1646,7 +1646,7 @@ .. c:function:: PyObject* PyUnicode_Format(PyObject *format, PyObject *args) Return a new string object from *format* and *args*; this is analogous to - ``format % args``. The *args* argument must be a tuple. + ``format % args``. .. c:function:: int PyUnicode_Contains(PyObject *container, PyObject *element) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 20 01:35:35 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 01:35:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy40ICgjMTcyMTAp?= Message-ID: <3hG5D71jQ9z7Lrw@mail.python.org> http://hg.python.org/cpython/rev/2fc379ce5762 changeset: 91734:2fc379ce5762 parent: 91730:3b6b905ae229 parent: 91733:ffbbd43d7342 user: Benjamin Peterson date: Sat Jul 19 16:35:08 2014 -0700 summary: merge 3.4 (#17210) 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 @@ -1646,7 +1646,7 @@ .. c:function:: PyObject* PyUnicode_Format(PyObject *format, PyObject *args) Return a new string object from *format* and *args*; this is analogous to - ``format % args``. The *args* argument must be a tuple. + ``format % args``. .. c:function:: int PyUnicode_Contains(PyObject *container, PyObject *element) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Jul 20 10:30:04 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 20 Jul 2014 10:30:04 +0200 Subject: [Python-checkins] Daily reference leaks (2fc379ce5762): sum=1 Message-ID: results for 2fc379ce5762 on branch "default" -------------------------------------------- test_collections leaked [0, 2, 0] references, sum=2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [0, 0, -2] references, sum=-2 test_site leaked [0, 0, -2] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogCtqamK', '-x'] From python-checkins at python.org Sun Jul 20 22:04:49 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 22:04:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_correct_ref_co?= =?utf-8?q?unting_of_default=5Faction_=28closes_=2322017=29?= Message-ID: <3hGcVT4Yhsz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/8106f91fccd6 changeset: 91735:8106f91fccd6 branch: 2.7 parent: 91732:9cd3ab7c09d1 user: Benjamin Peterson date: Sun Jul 20 13:04:11 2014 -0700 summary: correct ref counting of default_action (closes #22017) files: Misc/NEWS | 3 +++ Python/_warnings.c | 1 + 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #22017: Correct reference counting errror in the initialization of the + _warnings module. + - Issue 21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -905,6 +905,7 @@ _default_action = PyString_FromString("default"); if (_default_action == NULL) return; + Py_INCREF(_default_action); if (PyModule_AddObject(m, "default_action", _default_action) < 0) return; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 20 22:06:24 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 22:06:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogYWRkICM=?= Message-ID: <3hGcXJ6byrz7LjY@mail.python.org> http://hg.python.org/cpython/rev/393bf4d748d4 changeset: 91736:393bf4d748d4 branch: 2.7 user: Benjamin Peterson date: Sun Jul 20 13:05:01 2014 -0700 summary: add # 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 @@ -16,7 +16,7 @@ - Issue #22017: Correct reference counting errror in the initialization of the _warnings module. -- Issue 21044: tarfile.open() now handles fileobj with an integer 'name' +- Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. - Issue #21151: Fixed a segfault in the _winreg module when ``None`` is passed -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 20 22:06:26 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 22:06:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYWRkICM=?= Message-ID: <3hGcXL1KRkz7Ljy@mail.python.org> http://hg.python.org/cpython/rev/a821cc06082b changeset: 91737:a821cc06082b branch: 3.4 parent: 91733:ffbbd43d7342 user: Benjamin Peterson date: Sun Jul 20 13:05:01 2014 -0700 summary: add # 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 @@ -27,7 +27,7 @@ Library ------- -- Issue 21044: tarfile.open() now handles fileobj with an integer 'name' +- Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. - Issue #19076: Don't pass the redundant 'file' argument to self.error(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 20 22:06:27 2014 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 20 Jul 2014 22:06:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy40?= Message-ID: <3hGcXM3T8hz7Lkb@mail.python.org> http://hg.python.org/cpython/rev/4d0eec3139f7 changeset: 91738:4d0eec3139f7 parent: 91734:2fc379ce5762 parent: 91737:a821cc06082b user: Benjamin Peterson date: Sun Jul 20 13:06:19 2014 -0700 summary: merge 3.4 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 @@ -108,7 +108,7 @@ Library ------- -- Issue 21044: tarfile.open() now handles fileobj with an integer 'name' +- Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. - Issue #21966: Respect -q command-line option when code module is ran. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 06:26:14 2014 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 21 Jul 2014 06:26:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxODY4?= =?utf-8?q?=3A_Prevent_turtle_crash_due_to_invalid_undo_buffer_size=2E?= Message-ID: <3hGqd25r9Zz7LjP@mail.python.org> http://hg.python.org/cpython/rev/847a0e74c4cc changeset: 91739:847a0e74c4cc branch: 2.7 parent: 91736:393bf4d748d4 user: Raymond Hettinger date: Sun Jul 20 21:26:04 2014 -0700 summary: Issue #21868: Prevent turtle crash due to invalid undo buffer size. files: Lib/lib-tk/turtle.py | 2 +- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 5 insertions(+), 1 deletions(-) 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 @@ -2499,7 +2499,7 @@ Example (for a Turtle instance named turtle): >>> turtle.setundobuffer(42) """ - if size is None: + if size is None or size <= 0: self.undobuffer = None else: self.undobuffer = Tbuffer(size) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -235,6 +235,7 @@ Albert Chin-A-Young Adal Chiriliuc Matt Chisholm +Lita Cho Anders Chrigstr?m Tom Christiansen Renee Chu diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,9 @@ - Issue #22017: Correct reference counting errror in the initialization of the _warnings module. +- Issue #21868: Prevent turtle crash when undo buffer set to a value less + than one. + - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 06:31:44 2014 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 21 Jul 2014 06:31:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODY4?= =?utf-8?q?=3A_Prevent_turtle_crash_due_to_invalid_undo_buffer_size=2E?= Message-ID: <3hGqlN3sH7z7LjP@mail.python.org> http://hg.python.org/cpython/rev/02b25ec13c94 changeset: 91740:02b25ec13c94 branch: 3.4 parent: 91737:a821cc06082b user: Raymond Hettinger date: Sun Jul 20 21:30:32 2014 -0700 summary: Issue #21868: Prevent turtle crash due to invalid undo buffer size. files: Lib/turtle.py | 2 +- Misc/NEWS | 2 ++ 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/turtle.py b/Lib/turtle.py --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2594,7 +2594,7 @@ Example (for a Turtle instance named turtle): >>> turtle.setundobuffer(42) """ - if size is None: + if size is None or size <= 0: self.undobuffer = None else: self.undobuffer = Tbuffer(size) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,6 +30,8 @@ - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. +- Issue #21867: Prevent turtle crash due to invalid undo buffer size. + - Issue #19076: Don't pass the redundant 'file' argument to self.error(). - Issue #21942: Fixed source file viewing in pydoc's server mode on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 06:31:45 2014 From: python-checkins at python.org (raymond.hettinger) Date: Mon, 21 Jul 2014 06:31:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3hGqlP5lR1z7LkP@mail.python.org> http://hg.python.org/cpython/rev/6fcdeea47cea changeset: 91741:6fcdeea47cea parent: 91738:4d0eec3139f7 parent: 91740:02b25ec13c94 user: Raymond Hettinger date: Sun Jul 20 21:31:35 2014 -0700 summary: merge files: Lib/turtle.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/turtle.py b/Lib/turtle.py --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -2594,7 +2594,7 @@ Example (for a Turtle instance named turtle): >>> turtle.setundobuffer(42) """ - if size is None: + if size is None or size <= 0: self.undobuffer = None else: self.undobuffer = Tbuffer(size) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Jul 21 10:30:21 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 21 Jul 2014 10:30:21 +0200 Subject: [Python-checkins] Daily reference leaks (4d0eec3139f7): sum=8 Message-ID: results for 4d0eec3139f7 on branch "default" -------------------------------------------- test_collections leaked [2, 4, 0] references, sum=6 test_collections leaked [1, 2, 0] memory blocks, sum=3 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [-2, 0, 0] references, sum=-2 test_site leaked [-2, 0, 0] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflognErrip', '-x'] From python-checkins at python.org Mon Jul 21 15:02:12 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 15:02:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322018=3A_Add_=5Ft?= =?utf-8?q?estcapi=2Eraise=5Fsignal=28=29?= Message-ID: <3hH34N6JyDz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/6b536f0516ea changeset: 91742:6b536f0516ea user: Victor Stinner date: Mon Jul 21 12:30:22 2014 +0200 summary: Issue #22018: Add _testcapi.raise_signal() - Use _testcapi.raise_signal() in test_signal - close also os.pipe() file descriptors in some test_signal tests where they were not closed properly - Remove faulthandler._sigill() and faulthandler._sigbus(): reuse _testcapi.raise_signal() in test_faulthandler files: Lib/test/test_faulthandler.py | 26 ++++++-- Lib/test/test_signal.py | 65 ++++++++++++++++------ Modules/_testcapimodule.c | 21 +++++++ Modules/faulthandler.c | 26 --------- 4 files changed, 85 insertions(+), 53 deletions(-) diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -16,6 +16,10 @@ HAVE_THREADS = True except ImportError: HAVE_THREADS = False +try: + import _testcapi +except ImportError: + _testcapi = None TIMEOUT = 0.5 @@ -133,26 +137,32 @@ 3, 'Floating point exception') - @unittest.skipIf(not hasattr(faulthandler, '_sigbus'), - "need faulthandler._sigbus()") + @unittest.skipIf(_testcapi is None, 'need _testcapi') + @unittest.skipUnless(hasattr(signal, 'SIGBUS'), 'need signal.SIGBUS') def test_sigbus(self): self.check_fatal_error(""" +import _testcapi import faulthandler +import signal + faulthandler.enable() -faulthandler._sigbus() +_testcapi.raise_signal(signal.SIGBUS) """.strip(), - 3, + 6, 'Bus error') - @unittest.skipIf(not hasattr(faulthandler, '_sigill'), - "need faulthandler._sigill()") + @unittest.skipIf(_testcapi is None, 'need _testcapi') + @unittest.skipUnless(hasattr(signal, 'SIGILL'), 'need signal.SIGILL') def test_sigill(self): self.check_fatal_error(""" +import _testcapi import faulthandler +import signal + faulthandler.enable() -faulthandler._sigill() +_testcapi.raise_signal(signal.SIGILL) """.strip(), - 3, + 6, 'Illegal instruction') def test_fatal_error(self): 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 @@ -15,6 +15,10 @@ import threading except ImportError: threading = None +try: + import _testcapi +except ImportError: + _testcapi = None class HandlerBCalled(Exception): @@ -250,12 +254,27 @@ fd = support.make_bad_fd() self.assertRaises(ValueError, signal.set_wakeup_fd, fd) + def test_set_wakeup_fd_result(self): + r1, w1 = os.pipe() + os.close(r1) + self.addCleanup(os.close, w1) + r2, w2 = os.pipe() + os.close(r2) + self.addCleanup(os.close, w2) + + signal.set_wakeup_fd(w1) + self.assertIs(signal.set_wakeup_fd(w2), w1) + self.assertIs(signal.set_wakeup_fd(-1), w2) + self.assertIs(signal.set_wakeup_fd(-1), -1) + @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class WakeupSignalTests(unittest.TestCase): + @unittest.skipIf(_testcapi is None, 'need _testcapi') def check_wakeup(self, test_body, *signals, ordered=True): # use a subprocess to have only one thread code = """if 1: + import _testcapi import fcntl import os import signal @@ -294,17 +313,18 @@ assert_python_ok('-c', code) + @unittest.skipIf(_testcapi is None, 'need _testcapi') def test_wakeup_write_error(self): # Issue #16105: write() errors in the C signal handler should not # pass silently. # Use a subprocess to have only one thread. code = """if 1: + import _testcapi import errno import fcntl import os import signal import sys - import time from test.support import captured_stderr def handler(signum, frame): @@ -319,8 +339,7 @@ signal.set_wakeup_fd(r) try: with captured_stderr() as err: - signal.alarm(1) - time.sleep(5.0) + _testcapi.raise_signal(signal.SIGALRM) except ZeroDivisionError: # An ignored exception should have been printed out on stderr err = err.getvalue() @@ -331,6 +350,9 @@ raise AssertionError(err) else: raise AssertionError("ZeroDivisionError not raised") + + os.close(r) + os.close(w) """ r, w = os.pipe() try: @@ -394,9 +416,10 @@ def test_signum(self): self.check_wakeup("""def test(): + import _testcapi signal.signal(signal.SIGUSR1, handler) - os.kill(os.getpid(), signal.SIGUSR1) - os.kill(os.getpid(), signal.SIGALRM) + _testcapi.raise_signal(signal.SIGUSR1) + _testcapi.raise_signal(signal.SIGALRM) """, signal.SIGUSR1, signal.SIGALRM) @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), @@ -410,8 +433,8 @@ signal.signal(signum2, handler) signal.pthread_sigmask(signal.SIG_BLOCK, (signum1, signum2)) - os.kill(os.getpid(), signum1) - os.kill(os.getpid(), signum2) + _testcapi.raise_signal(signum1) + _testcapi.raise_signal(signum2) # Unblocking the 2 signals calls the C signal handler twice signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2)) """, signal.SIGUSR1, signal.SIGUSR2, ordered=False) @@ -447,18 +470,22 @@ sys.stdout.flush() # run the test twice - for loop in range(2): - # send a SIGALRM in a second (during the read) - signal.alarm(1) - try: - # blocking call: read from a pipe without data - os.read(r, 1) - except OSError as err: - if err.errno != errno.EINTR: - raise - else: - sys.exit(2) - sys.exit(3) + try: + for loop in range(2): + # send a SIGALRM in a second (during the read) + signal.alarm(1) + try: + # blocking call: read from a pipe without data + os.read(r, 1) + except OSError as err: + if err.errno != errno.EINTR: + raise + else: + sys.exit(2) + sys.exit(3) + finally: + os.close(r) + os.close(w) """ % (interrupt,) with spawn_python('-c', code) as process: try: diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -11,6 +11,7 @@ #include #include "structmember.h" #include "datetime.h" +#include #ifdef WITH_THREAD #include "pythread.h" @@ -3063,6 +3064,24 @@ } #endif /* WITH_THREAD */ +static PyObject* +test_raise_signal(PyObject* self, PyObject *args) +{ + int signum, err; + + if (PyArg_ParseTuple(args, "i:raise_signal", &signum) < 0) + return NULL; + + err = raise(signum); + if (err) + return PyErr_SetFromErrno(PyExc_OSError); + + if (PyErr_CheckSignals() < 0) + return NULL; + + Py_RETURN_NONE; +} + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, @@ -3198,6 +3217,8 @@ {"docstring_with_signature_with_defaults", (PyCFunction)test_with_docstring, METH_NOARGS, docstring_with_signature_with_defaults}, + {"raise_signal", + (PyCFunction)test_raise_signal, METH_VARARGS}, #ifdef WITH_THREAD {"call_in_temporary_c_thread", call_in_temporary_c_thread, METH_O, PyDoc_STR("set_error_class(error_class) -> None")}, diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -874,24 +874,6 @@ Py_RETURN_NONE; } -#ifdef SIGBUS -static PyObject * -faulthandler_sigbus(PyObject *self, PyObject *args) -{ - raise(SIGBUS); - Py_RETURN_NONE; -} -#endif - -#ifdef SIGILL -static PyObject * -faulthandler_sigill(PyObject *self, PyObject *args) -{ - raise(SIGILL); - Py_RETURN_NONE; -} -#endif - static PyObject * faulthandler_fatal_error_py(PyObject *self, PyObject *args) { @@ -1012,14 +994,6 @@ PyDoc_STR("_sigabrt(): raise a SIGABRT signal")}, {"_sigfpe", (PyCFunction)faulthandler_sigfpe, METH_NOARGS, PyDoc_STR("_sigfpe(): raise a SIGFPE signal")}, -#ifdef SIGBUS - {"_sigbus", (PyCFunction)faulthandler_sigbus, METH_NOARGS, - PyDoc_STR("_sigbus(): raise a SIGBUS signal")}, -#endif -#ifdef SIGILL - {"_sigill", (PyCFunction)faulthandler_sigill, METH_NOARGS, - PyDoc_STR("_sigill(): raise a SIGILL signal")}, -#endif {"_fatal_error", faulthandler_fatal_error_py, METH_VARARGS, PyDoc_STR("_fatal_error(message): call Py_FatalError(message)")}, #if defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 16:24:45 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 16:24:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogRml4?= =?utf-8?q?_test=5Fstdin=5Fbroken=5Fpipe=28=29=2C_drain=28=29_is_not_a_cor?= =?utf-8?q?outine?= Message-ID: <3hH4vd6YbCz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/cb8fc24e209f changeset: 91743:cb8fc24e209f branch: 3.4 parent: 91740:02b25ec13c94 user: Victor Stinner date: Mon Jul 21 16:23:33 2014 +0200 summary: asyncio: Fix test_stdin_broken_pipe(), drain() is not a coroutine files: Lib/test/test_asyncio/test_subprocess.py | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -141,10 +141,15 @@ def test_stdin_broken_pipe(self): proc, large_data = self.prepare_broken_pipe_test() + @asyncio.coroutine + def write_stdin(proc, data): + proc.stdin.write(data) + yield from proc.stdin.drain() + + coro = write_stdin(proc, large_data) # drain() must raise BrokenPipeError or ConnectionResetError - proc.stdin.write(large_data) self.assertRaises((BrokenPipeError, ConnectionResetError), - self.loop.run_until_complete, proc.stdin.drain()) + self.loop.run_until_complete, coro) self.loop.run_until_complete(proc.wait()) def test_communicate_ignore_broken_pipe(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 16:24:47 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 16:24:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgYXN5bmNpbzogRml4IHRlc3Rfc3RkaW5fYnJva2Vu?= =?utf-8?q?=5Fpipe=28=29=2C_drain=28=29_is_not_a_coroutine?= Message-ID: <3hH4vg1Jrmz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/057a8bd043ea changeset: 91744:057a8bd043ea parent: 91742:6b536f0516ea parent: 91743:cb8fc24e209f user: Victor Stinner date: Mon Jul 21 16:23:51 2014 +0200 summary: (Merge 3.4) asyncio: Fix test_stdin_broken_pipe(), drain() is not a coroutine files: Lib/test/test_asyncio/test_subprocess.py | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -141,10 +141,15 @@ def test_stdin_broken_pipe(self): proc, large_data = self.prepare_broken_pipe_test() + @asyncio.coroutine + def write_stdin(proc, data): + proc.stdin.write(data) + yield from proc.stdin.drain() + + coro = write_stdin(proc, large_data) # drain() must raise BrokenPipeError or ConnectionResetError - proc.stdin.write(large_data) self.assertRaises((BrokenPipeError, ConnectionResetError), - self.loop.run_until_complete, proc.stdin.drain()) + self.loop.run_until_complete, coro) self.loop.run_until_complete(proc.wait()) def test_communicate_ignore_broken_pipe(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 16:30:23 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 16:30:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322018=3A_signal?= =?utf-8?q?=2Eset=5Fwakeup=5Ffd=28=29_now_raises_an_OSError_instead_of_a?= Message-ID: <3hH5276yJ8z7Lyf@mail.python.org> http://hg.python.org/cpython/rev/42cf963e3ab1 changeset: 91745:42cf963e3ab1 user: Victor Stinner date: Mon Jul 21 16:28:54 2014 +0200 summary: Issue #22018: signal.set_wakeup_fd() now raises an OSError instead of a ValueError on fstat() failure. files: Lib/test/test_signal.py | 6 +++--- Misc/NEWS | 3 +++ Modules/signalmodule.c | 14 +++++++++++--- 3 files changed, 17 insertions(+), 6 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 @@ -252,14 +252,14 @@ def test_invalid_fd(self): fd = support.make_bad_fd() - self.assertRaises(ValueError, signal.set_wakeup_fd, fd) + self.assertRaises(OSError, signal.set_wakeup_fd, fd) def test_set_wakeup_fd_result(self): r1, w1 = os.pipe() - os.close(r1) + self.addCleanup(os.close, r1) self.addCleanup(os.close, w1) r2, w2 = os.pipe() - os.close(r2) + self.addCleanup(os.close, r2) self.addCleanup(os.close, w2) signal.set_wakeup_fd(w1) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #22018: signal.set_wakeup_fd() now raises an OSError instead of a + ValueError on ``fstat()`` failure. + - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Martin Panter. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -437,12 +437,20 @@ return NULL; } #endif - if (fd != -1 && (!_PyVerify_fd(fd) || fstat(fd, &buf) != 0)) { - PyErr_SetString(PyExc_ValueError, "invalid fd"); - return NULL; + + if (fd != -1) { + if (!_PyVerify_fd(fd)) { + PyErr_SetString(PyExc_ValueError, "invalid fd"); + return NULL; + } + + if (fstat(fd, &buf) != 0) + return PyErr_SetFromErrno(PyExc_OSError); } + old_fd = wakeup_fd; wakeup_fd = fd; + return PyLong_FromLong(old_fd); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 17:18:31 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 17:18:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322018=3A_Hum=2C_s?= =?utf-8?q?et=5Fwakeup=5Ffd=28=29_still_raises_ValueError_on_Windows?= Message-ID: <3hH65g2ZMyz7LjR@mail.python.org> http://hg.python.org/cpython/rev/7a1737033a23 changeset: 91746:7a1737033a23 user: Victor Stinner date: Mon Jul 21 17:17:28 2014 +0200 summary: Issue #22018: Hum, set_wakeup_fd() still raises ValueError on Windows files: Lib/test/test_signal.py | 3 ++- 1 files changed, 2 insertions(+), 1 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 @@ -252,7 +252,8 @@ def test_invalid_fd(self): fd = support.make_bad_fd() - self.assertRaises(OSError, signal.set_wakeup_fd, fd) + self.assertRaises((ValueError, OSError), + signal.set_wakeup_fd, fd) def test_set_wakeup_fd_result(self): r1, w1 = os.pipe() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 19:20:31 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 19:20:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5NjI5?= =?utf-8?q?=3A_Fix_support=2Ermtree=28=29=2C_use_os=2Elstat=28=29_to_check?= =?utf-8?q?_if_the_file_is_a?= Message-ID: <3hH8pR22QJz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/28bb1aa9ca3d changeset: 91747:28bb1aa9ca3d branch: 3.4 parent: 91743:cb8fc24e209f user: Victor Stinner date: Mon Jul 21 19:18:12 2014 +0200 summary: Issue #19629: Fix support.rmtree(), use os.lstat() to check if the file is a directory, not os.path.isdir() files: Lib/test/support/__init__.py | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -316,7 +316,13 @@ def _rmtree_inner(path): for name in os.listdir(path): fullname = os.path.join(path, name) - if os.path.isdir(fullname): + try: + mode = os.lstat(fullname).st_mode + except OSError as exc: + print("support.rmtree(): os.lstat(%r) failed with %s" % (fullname, exc), + file=sys.__stderr__) + mode = 0 + if stat.S_ISDIR(mode): _waitfor(_rmtree_inner, fullname, waitall=True) os.rmdir(fullname) else: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 19:20:32 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 19:20:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5ODEx?= =?utf-8?q?=2C_=2322022=3A_test=5Fpathlib_uses_support=2Ermtree=28=29_inst?= =?utf-8?q?ead_of?= Message-ID: <3hH8pS3sxSz7LkZ@mail.python.org> http://hg.python.org/cpython/rev/1db5cde4958f changeset: 91748:1db5cde4958f branch: 3.4 user: Victor Stinner date: Mon Jul 21 19:19:05 2014 +0200 summary: Issue #19811, #22022: test_pathlib uses support.rmtree() instead of shutil.rmtree() to remove the temporary directory. files: Lib/test/test_pathlib.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1214,7 +1214,7 @@ def setUp(self): os.mkdir(BASE) - self.addCleanup(shutil.rmtree, BASE) + self.addCleanup(support.rmtree, BASE) os.mkdir(join('dirA')) os.mkdir(join('dirB')) os.mkdir(join('dirC')) @@ -1399,7 +1399,7 @@ self._check_resolve_relative(p, P(BASE, 'dirB', 'fileB')) # Now create absolute symlinks d = tempfile.mkdtemp(suffix='-dirD') - self.addCleanup(shutil.rmtree, d) + self.addCleanup(support.rmtree, d) os.symlink(os.path.join(d), join('dirA', 'linkX')) os.symlink(join('dirB'), os.path.join(d, 'linkY')) p = P(BASE, 'dirA', 'linkX', 'linkY', 'fileB') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 19:20:33 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 19:20:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_Python_3=2E4?= Message-ID: <3hH8pT5nh2z7Llg@mail.python.org> http://hg.python.org/cpython/rev/e405bcbf761c changeset: 91749:e405bcbf761c parent: 91746:7a1737033a23 parent: 91748:1db5cde4958f user: Victor Stinner date: Mon Jul 21 19:20:06 2014 +0200 summary: Merge Python 3.4 * Issue #19811, #22022: test_pathlib uses support.rmtree() instead of shutil.rmtree() to remove the temporary directory. * Issue #19629: Fix support.rmtree(), use os.lstat() to check if the file is a directory, not os.path.isdir() files: Lib/test/support/__init__.py | 8 +++++++- Lib/test/test_pathlib.py | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -316,7 +316,13 @@ def _rmtree_inner(path): for name in os.listdir(path): fullname = os.path.join(path, name) - if os.path.isdir(fullname): + try: + mode = os.lstat(fullname).st_mode + except OSError as exc: + print("support.rmtree(): os.lstat(%r) failed with %s" % (fullname, exc), + file=sys.__stderr__) + mode = 0 + if stat.S_ISDIR(mode): _waitfor(_rmtree_inner, fullname, waitall=True) os.rmdir(fullname) else: diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -1214,7 +1214,7 @@ def setUp(self): os.mkdir(BASE) - self.addCleanup(shutil.rmtree, BASE) + self.addCleanup(support.rmtree, BASE) os.mkdir(join('dirA')) os.mkdir(join('dirB')) os.mkdir(join('dirC')) @@ -1419,7 +1419,7 @@ self._check_resolve_relative(p, P(BASE, 'dirB', 'fileB')) # Now create absolute symlinks d = tempfile.mkdtemp(suffix='-dirD') - self.addCleanup(shutil.rmtree, d) + self.addCleanup(support.rmtree, d) os.symlink(os.path.join(d), join('dirA', 'linkX')) os.symlink(join('dirB'), os.path.join(d, 'linkY')) p = P(BASE, 'dirA', 'linkX', 'linkY', 'fileB') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 21:41:09 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 21:41:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5NjI5?= =?utf-8?q?=3A_Add_missing_=22import_stat=22?= Message-ID: <3hHCwj3L6fz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/c026ed24a211 changeset: 91750:c026ed24a211 branch: 3.4 parent: 91748:1db5cde4958f user: Victor Stinner date: Mon Jul 21 21:40:19 2014 +0200 summary: Issue #19629: Add missing "import stat" Sort also imports in support/__init__.py files: Lib/test/support/__init__.py | 29 ++++++++++++----------- 1 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3,28 +3,29 @@ if __name__ != 'test.support': raise ImportError('support must be imported from the test package') +import collections.abc import contextlib import errno +import fnmatch import functools import gc -import socket -import sys +import importlib +import importlib.util +import logging.handlers import os import platform +import re import shutil +import socket +import stat +import struct +import subprocess +import sys +import sysconfig +import tempfile +import time +import unittest import warnings -import unittest -import importlib -import importlib.util -import collections.abc -import re -import subprocess -import time -import sysconfig -import fnmatch -import logging.handlers -import struct -import tempfile try: import _thread, threading -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 21 21:41:10 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 21 Jul 2014 21:41:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2319629=3A_Add_missing_=22impor?= =?utf-8?q?t_stat=22?= Message-ID: <3hHCwk4jSTz7LkP@mail.python.org> http://hg.python.org/cpython/rev/168cd3d19fef changeset: 91751:168cd3d19fef parent: 91749:e405bcbf761c parent: 91750:c026ed24a211 user: Victor Stinner date: Mon Jul 21 21:40:55 2014 +0200 summary: (Merge 3.4) Issue #19629: Add missing "import stat" Sort also imports in support/__init__.py files: Lib/test/support/__init__.py | 29 ++++++++++++----------- 1 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -3,28 +3,29 @@ if __name__ != 'test.support': raise ImportError('support must be imported from the test package') +import collections.abc import contextlib import errno +import fnmatch import functools import gc -import socket -import sys +import importlib +import importlib.util +import logging.handlers import os import platform +import re import shutil +import socket +import stat +import struct +import subprocess +import sys +import sysconfig +import tempfile +import time +import unittest import warnings -import unittest -import importlib -import importlib.util -import collections.abc -import re -import subprocess -import time -import sysconfig -import fnmatch -import logging.handlers -import struct -import tempfile try: import _thread, threading -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 00:37:49 2014 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 22 Jul 2014 00:37:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTc2?= =?utf-8?q?=3A_Fix_test=5Fssl_to_accept_LibreSSL_version_strings=2E?= Message-ID: <3hHHrY6myMz7LjP@mail.python.org> http://hg.python.org/cpython/rev/4dac45f88d45 changeset: 91752:4dac45f88d45 branch: 3.4 parent: 91750:c026ed24a211 user: Antoine Pitrou date: Mon Jul 21 18:35:01 2014 -0400 summary: Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. files: Lib/test/test_ssl.py | 16 ++++++++++------ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 6 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 @@ -281,11 +281,11 @@ # Some sanity checks follow # >= 0.9 self.assertGreaterEqual(n, 0x900000) - # < 2.0 - self.assertLess(n, 0x20000000) + # < 3.0 + self.assertLess(n, 0x30000000) major, minor, fix, patch, status = t self.assertGreaterEqual(major, 0) - self.assertLess(major, 2) + self.assertLess(major, 3) self.assertGreaterEqual(minor, 0) self.assertLess(minor, 256) self.assertGreaterEqual(fix, 0) @@ -294,9 +294,13 @@ self.assertLessEqual(patch, 26) self.assertGreaterEqual(status, 0) self.assertLessEqual(status, 15) - # Version string as returned by OpenSSL, the format might change - self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, minor, fix)), - (s, t)) + # Version string as returned by {Open,Libre}SSL, the format might change + if "LibreSSL" in s: + self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major, minor)), + (s, t)) + else: + self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, minor, fix)), + (s, t)) @support.cpython_only def test_refcycle(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -981,6 +981,7 @@ Tomas Oppelstrup Jason Orendorff Douglas Orr +William Orr Michele Orr? Oleg Oshmyan Denis S. Otkidach diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -203,6 +203,9 @@ Tests ----- +- Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks + to William Orr. + - Issue #21918: Converted test_tools from a module to a package containing separate test files for each tested script. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 00:37:51 2014 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 22 Jul 2014 00:37:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321976=3A_Fix_test=5Fssl_to_accept_LibreSSL_vers?= =?utf-8?q?ion_strings=2E?= Message-ID: <3hHHrb1JJkz7LlP@mail.python.org> http://hg.python.org/cpython/rev/98aec1d9e2a0 changeset: 91753:98aec1d9e2a0 parent: 91751:168cd3d19fef parent: 91752:4dac45f88d45 user: Antoine Pitrou date: Mon Jul 21 18:37:36 2014 -0400 summary: Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. files: Lib/test/test_ssl.py | 16 ++++++++++------ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 6 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 @@ -295,11 +295,11 @@ # Some sanity checks follow # >= 0.9 self.assertGreaterEqual(n, 0x900000) - # < 2.0 - self.assertLess(n, 0x20000000) + # < 3.0 + self.assertLess(n, 0x30000000) major, minor, fix, patch, status = t self.assertGreaterEqual(major, 0) - self.assertLess(major, 2) + self.assertLess(major, 3) self.assertGreaterEqual(minor, 0) self.assertLess(minor, 256) self.assertGreaterEqual(fix, 0) @@ -308,9 +308,13 @@ self.assertLessEqual(patch, 26) self.assertGreaterEqual(status, 0) self.assertLessEqual(status, 15) - # Version string as returned by OpenSSL, the format might change - self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, minor, fix)), - (s, t)) + # Version string as returned by {Open,Libre}SSL, the format might change + if "LibreSSL" in s: + self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major, minor)), + (s, t)) + else: + self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, minor, fix)), + (s, t)) @support.cpython_only def test_refcycle(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -989,6 +989,7 @@ Tomas Oppelstrup Jason Orendorff Douglas Orr +William Orr Michele Orr? Oleg Oshmyan Denis S. Otkidach diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -704,6 +704,9 @@ Tests ----- +- Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks + to William Orr. + - Issue #21918: Converted test_tools from a module to a package containing separate test files for each tested script. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 00:40:33 2014 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 22 Jul 2014 00:40:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTc2?= =?utf-8?q?=3A_Fix_test=5Fssl_to_accept_LibreSSL_version_strings=2E?= Message-ID: <3hHHvj0CqSz7LlP@mail.python.org> http://hg.python.org/cpython/rev/33fc081285b2 changeset: 91754:33fc081285b2 branch: 2.7 parent: 91739:847a0e74c4cc user: Antoine Pitrou date: Mon Jul 21 18:35:01 2014 -0400 summary: Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. files: Lib/test/test_ssl.py | 16 ++++++++++------ Misc/ACKS | 1 + Misc/NEWS | 6 ++++++ 3 files changed, 17 insertions(+), 6 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 @@ -175,11 +175,11 @@ # Some sanity checks follow # >= 0.9 self.assertGreaterEqual(n, 0x900000) - # < 2.0 - self.assertLess(n, 0x20000000) + # < 3.0 + self.assertLess(n, 0x30000000) major, minor, fix, patch, status = t self.assertGreaterEqual(major, 0) - self.assertLess(major, 2) + self.assertLess(major, 3) self.assertGreaterEqual(minor, 0) self.assertLess(minor, 256) self.assertGreaterEqual(fix, 0) @@ -188,9 +188,13 @@ self.assertLessEqual(patch, 26) self.assertGreaterEqual(status, 0) self.assertLessEqual(status, 15) - # Version string as returned by OpenSSL, the format might change - self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, minor, fix)), - (s, t)) + # Version string as returned by {Open,Libre}SSL, the format might change + if "LibreSSL" in s: + self.assertTrue(s.startswith("LibreSSL {:d}.{:d}".format(major, minor)), + (s, t)) + else: + self.assertTrue(s.startswith("OpenSSL {:d}.{:d}.{:d}".format(major, minor, fix)), + (s, t)) @test_support.requires_resource('network') def test_ciphers(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -981,6 +981,7 @@ Tomas Oppelstrup Jason Orendorff Douglas Orr +William Orr Michele Orr? Oleg Oshmyan Denis S. Otkidach diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -37,6 +37,12 @@ - Issue #21323: Fix CGIHTTPServer to again handle scripts in CGI subdirectories, broken by the fix for security issue #19435. Patch by Zach Byrne. +Tests +----- + +- Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks + to William Orr. + What's New in Python 2.7.8? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 09:16:29 2014 From: python-checkins at python.org (senthil.kumaran) Date: Tue, 22 Jul 2014 09:16:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_localhost_?= =?utf-8?q?checking_in_FileHandler=2E_Raised_in_=2321970=2E?= Message-ID: <3hHWM10FBHz7Llx@mail.python.org> http://hg.python.org/cpython/rev/4b98961748f1 changeset: 91755:4b98961748f1 branch: 3.4 parent: 91752:4dac45f88d45 user: Senthil Kumaran date: Tue Jul 22 00:15:20 2014 -0700 summary: Fix localhost checking in FileHandler. Raised in #21970. files: Lib/test/test_urllib2.py | 3 ++- Lib/urllib/request.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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 @@ -678,7 +678,7 @@ self.assertEqual(int(headers["Content-length"]), len(data)) def test_file(self): - import email.utils, socket + import email.utils h = urllib.request.FileHandler() o = h.parent = MockOpener() @@ -725,6 +725,7 @@ for url in [ "file://localhost:80%s" % urlpath, "file:///file_does_not_exist.txt", + "file://not-a-local-host.com//dir/file.txt", "file://%s:80%s/%s" % (socket.gethostbyname('localhost'), os.getcwd(), TESTFN), "file://somerandomhost.ontheinternet.com%s/%s" % diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1315,7 +1315,7 @@ url = req.selector if url[:2] == '//' and url[2:3] != '/' and (req.host and req.host != 'localhost'): - if not req.host is self.get_names(): + if not req.host in self.get_names(): raise URLError("file:// scheme is supported only on localhost") else: return self.open_local_file(req) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 09:16:30 2014 From: python-checkins at python.org (senthil.kumaran) Date: Tue, 22 Jul 2014 09:16:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy40?= Message-ID: <3hHWM22Bvvz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/2c660948bb41 changeset: 91756:2c660948bb41 parent: 91753:98aec1d9e2a0 parent: 91755:4b98961748f1 user: Senthil Kumaran date: Tue Jul 22 00:16:18 2014 -0700 summary: Merge 3.4 Fix localhost checking in FileHandler. Raised in #21970. files: Lib/test/test_urllib2.py | 3 ++- Lib/urllib/request.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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 @@ -678,7 +678,7 @@ self.assertEqual(int(headers["Content-length"]), len(data)) def test_file(self): - import email.utils, socket + import email.utils h = urllib.request.FileHandler() o = h.parent = MockOpener() @@ -725,6 +725,7 @@ for url in [ "file://localhost:80%s" % urlpath, "file:///file_does_not_exist.txt", + "file://not-a-local-host.com//dir/file.txt", "file://%s:80%s/%s" % (socket.gethostbyname('localhost'), os.getcwd(), TESTFN), "file://somerandomhost.ontheinternet.com%s/%s" % diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1315,7 +1315,7 @@ url = req.selector if url[:2] == '//' and url[2:3] != '/' and (req.host and req.host != 'localhost'): - if not req.host is self.get_names(): + if not req.host in self.get_names(): raise URLError("file:// scheme is supported only on localhost") else: return self.open_local_file(req) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Jul 22 09:52:23 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 22 Jul 2014 09:52:23 +0200 Subject: [Python-checkins] Daily reference leaks (98aec1d9e2a0): sum=7 Message-ID: results for 98aec1d9e2a0 on branch "default" -------------------------------------------- test_asyncio leaked [0, 4, 0] memory blocks, sum=4 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 0] references, sum=0 test_site leaked [2, -2, 0] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog7Hn_88', '-x'] From python-checkins at python.org Tue Jul 22 10:05:55 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:05:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE1NzU5?= =?utf-8?q?=3A_=22make_suspicious=22=2C_=22make_linkcheck=22_and_=22make_d?= =?utf-8?q?octest=22_in_Doc/?= Message-ID: <3hHXS35hfPz7LjS@mail.python.org> http://hg.python.org/cpython/rev/10b83036c723 changeset: 91757:10b83036c723 branch: 3.4 parent: 91752:4dac45f88d45 user: Serhiy Storchaka date: Tue Jul 22 10:24:25 2014 +0300 summary: Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ now display special message when and only when there are failures. files: Doc/Makefile | 26 ++++++++++++++++---------- Misc/NEWS | 3 +++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile --- a/Doc/Makefile +++ b/Doc/Makefile @@ -69,24 +69,30 @@ @echo "The overview file is in build/changes." linkcheck: BUILDER = linkcheck -linkcheck: build - @echo "Link check complete; look for any errors in the above output" \ - "or in build/$(BUILDER)/output.txt" +linkcheck: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Link check complete; look for any errors in the above output" \ + "or in build/$(BUILDER)/output.txt"; \ + false; } suspicious: BUILDER = suspicious -suspicious: build - @echo "Suspicious check complete; look for any errors in the above output" \ - "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \ - "positives, append that file to tools/sphinxext/susp-ignored.csv." +suspicious: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Suspicious check complete; look for any errors in the above output" \ + "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \ + "positives, append that file to tools/sphinxext/susp-ignored.csv."; \ + false; } coverage: BUILDER = coverage coverage: build @echo "Coverage finished; see c.txt and python.txt in build/coverage" doctest: BUILDER = doctest -doctest: build - @echo "Testing of doctests in the sources finished, look at the" \ - "results in build/doctest/output.txt" +doctest: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Testing of doctests in the sources finished, look at the" \ + "results in build/doctest/output.txt"; \ + false; } pydoc-topics: BUILDER = pydoc-topics pydoc-topics: build diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -169,6 +169,9 @@ Build ----- +- Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ + now display special message when and only when there are failures. + - Issue #17095: Fix Modules/Setup *shared* support. - Issue #21811: Anticipated fixes to support OS X versions > 10.9. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:05:57 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:05:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2315759=3A_=22make_suspicious=22=2C_=22make_linkc?= =?utf-8?q?heck=22_and_=22make_doctest=22_in_Doc/?= Message-ID: <3hHXS505VWz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/c755a3b58fa6 changeset: 91758:c755a3b58fa6 parent: 91753:98aec1d9e2a0 parent: 91757:10b83036c723 user: Serhiy Storchaka date: Tue Jul 22 10:28:21 2014 +0300 summary: Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ now display special message when and only when there are failures. files: Doc/Makefile | 26 ++++++++++++++++---------- Misc/NEWS | 3 +++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile --- a/Doc/Makefile +++ b/Doc/Makefile @@ -69,24 +69,30 @@ @echo "The overview file is in build/changes." linkcheck: BUILDER = linkcheck -linkcheck: build - @echo "Link check complete; look for any errors in the above output" \ - "or in build/$(BUILDER)/output.txt" +linkcheck: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Link check complete; look for any errors in the above output" \ + "or in build/$(BUILDER)/output.txt"; \ + false; } suspicious: BUILDER = suspicious -suspicious: build - @echo "Suspicious check complete; look for any errors in the above output" \ - "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \ - "positives, append that file to tools/sphinxext/susp-ignored.csv." +suspicious: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Suspicious check complete; look for any errors in the above output" \ + "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \ + "positives, append that file to tools/sphinxext/susp-ignored.csv."; \ + false; } coverage: BUILDER = coverage coverage: build @echo "Coverage finished; see c.txt and python.txt in build/coverage" doctest: BUILDER = doctest -doctest: build - @echo "Testing of doctests in the sources finished, look at the" \ - "results in build/doctest/output.txt" +doctest: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Testing of doctests in the sources finished, look at the" \ + "results in build/doctest/output.txt"; \ + false; } pydoc-topics: BUILDER = pydoc-topics pydoc-topics: build diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -635,6 +635,9 @@ Build ----- +- Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ + now display special message when and only when there are failures. + - Issue #21141: The Windows build process no longer attempts to find Perl, instead relying on OpenSSL source being configured and ready to build. The ``PCbuild\build_ssl.py`` script has been re-written and re-named to -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:05:58 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:05:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE1NzU5?= =?utf-8?q?=3A_=22make_suspicious=22=2C_=22make_linkcheck=22_and_=22make_d?= =?utf-8?q?octest=22_in_Doc/?= Message-ID: <3hHXS6224Xz7LjS@mail.python.org> http://hg.python.org/cpython/rev/a61c3d17fe4f changeset: 91759:a61c3d17fe4f branch: 2.7 parent: 91754:33fc081285b2 user: Serhiy Storchaka date: Tue Jul 22 10:28:36 2014 +0300 summary: Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ now display special message when and only when there are failures. files: Doc/Makefile | 26 ++++++++++++++++---------- Misc/NEWS | 6 ++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Doc/Makefile b/Doc/Makefile --- a/Doc/Makefile +++ b/Doc/Makefile @@ -86,24 +86,30 @@ @echo "The overview file is in build/changes." linkcheck: BUILDER = linkcheck -linkcheck: build - @echo "Link check complete; look for any errors in the above output" \ - "or in build/$(BUILDER)/output.txt" +linkcheck: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Link check complete; look for any errors in the above output" \ + "or in build/$(BUILDER)/output.txt"; \ + false; } suspicious: BUILDER = suspicious -suspicious: build - @echo "Suspicious check complete; look for any errors in the above output" \ - "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \ - "positives, append that file to tools/sphinxext/susp-ignored.csv." +suspicious: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Suspicious check complete; look for any errors in the above output" \ + "or in build/$(BUILDER)/suspicious.csv. If all issues are false" \ + "positives, append that file to tools/sphinxext/susp-ignored.csv."; \ + false; } coverage: BUILDER = coverage coverage: build @echo "Coverage finished; see c.txt and python.txt in build/coverage" doctest: BUILDER = doctest -doctest: build - @echo "Testing of doctests in the sources finished, look at the" \ - "results in build/doctest/output.txt" +doctest: + @$(MAKE) build BUILDER=$(BUILDER) || { \ + echo "Testing of doctests in the sources finished, look at the" \ + "results in build/doctest/output.txt"; \ + false; } pydoc-topics: BUILDER = pydoc-topics pydoc-topics: build diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,12 @@ - Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. +Build +----- + +- Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ + now display special message when and only when there are failures. + What's New in Python 2.7.8? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:05:59 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:05:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Backout_308f3c?= =?utf-8?q?1e36d3=2E__This_change_=28issue21044=29_does_not_need_to_be_mer?= =?utf-8?q?ged_on?= Message-ID: <3hHXS75FqVz7LmB@mail.python.org> http://hg.python.org/cpython/rev/51699f5f5430 changeset: 91760:51699f5f5430 branch: 2.7 user: Serhiy Storchaka date: Tue Jul 22 10:39:59 2014 +0300 summary: Backout 308f3c1e36d3. This change (issue21044) does not need to be merged on 2.7, as the os.fdopen sets the name attribute to '' and not to the fd. files: Lib/tarfile.py | 3 +- Lib/test/test_tarfile.py | 38 +++------------------------ Misc/ACKS | 1 - Misc/NEWS | 3 -- 4 files changed, 6 insertions(+), 39 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -1522,8 +1522,7 @@ fileobj = bltn_open(name, self._mode) self._extfileobj = False else: - if (name is None and hasattr(fileobj, "name") and - isinstance(fileobj.name, basestring)): + if name is None and hasattr(fileobj, "name"): name = fileobj.name if hasattr(fileobj, "mode"): self._mode = fileobj.mode 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 @@ -1,7 +1,6 @@ # -*- coding: iso-8859-15 -*- import sys -import io import os import shutil import StringIO @@ -290,49 +289,24 @@ class MiscReadTest(CommonReadTest): taropen = tarfile.TarFile.taropen - def requires_name_attribute(self): - pass - def test_no_name_argument(self): - self.requires_name_attribute() - with open(self.tarname, "rb") as fobj: - self.assertIsInstance(fobj.name, str) - with tarfile.open(fileobj=fobj, mode=self.mode) as tar: - self.assertIsInstance(tar.name, str) - self.assertEqual(tar.name, os.path.abspath(fobj.name)) + fobj = open(self.tarname, "rb") + tar = tarfile.open(fileobj=fobj, mode=self.mode) + self.assertEqual(tar.name, os.path.abspath(fobj.name)) def test_no_name_attribute(self): data = open(self.tarname, "rb").read() fobj = StringIO.StringIO(data) self.assertRaises(AttributeError, getattr, fobj, "name") tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertIsNone(tar.name) + self.assertEqual(tar.name, None) def test_empty_name_attribute(self): data = open(self.tarname, "rb").read() fobj = StringIO.StringIO(data) fobj.name = "" tar = tarfile.open(fileobj=fobj, mode=self.mode) - self.assertIsNone(tar.name) - - def test_int_name_attribute(self): - # Issue 21044: tarfile.open() should handle fileobj with an integer - # 'name' attribute. - fd = os.open(self.tarname, os.O_RDONLY) - with io.open(fd, 'rb') as fobj: - self.assertIsInstance(fobj.name, int) - with tarfile.open(fileobj=fobj, mode=self.mode) as tar: - self.assertIsNone(tar.name) - - @test_support.requires_unicode - def test_unicode_name_attribute(self): - self.requires_name_attribute() - tarname = unicode(self.tarname, test_support.TESTFN_ENCODING) - with io.open(tarname, 'rb') as fobj: - self.assertIsInstance(fobj.name, unicode) - with tarfile.open(fileobj=fobj, mode=self.mode) as tar: - self.assertIsInstance(tar.name, unicode) - self.assertEqual(tar.name, os.path.abspath(fobj.name)) + self.assertEqual(tar.name, None) def test_illegal_mode_arg(self): with open(tmpname, 'wb'): @@ -1694,8 +1668,6 @@ tarname = bz2name mode = "r:bz2" taropen = tarfile.TarFile.bz2open - def requires_name_attribute(self): - self.skipTest("BZ2File have no name attribute") class Bz2UstarReadTest(UstarReadTest): tarname = bz2name mode = "r:bz2" diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -997,7 +997,6 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus -Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,9 +19,6 @@ - Issue #21868: Prevent turtle crash when undo buffer set to a value less than one. -- Issue #21044: tarfile.open() now handles fileobj with an integer 'name' - attribute. Based on patch by Martin Panter. - - Issue #21151: Fixed a segfault in the _winreg module when ``None`` is passed as a ``REG_BINARY`` value to SetValueEx. Patch by John Ehresman. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:06:01 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:06:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy40IC0+IDMuNCk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3hHXS902Hlz7Lm1@mail.python.org> http://hg.python.org/cpython/rev/a74c48aa43eb changeset: 91761:a74c48aa43eb branch: 3.4 parent: 91757:10b83036c723 parent: 91755:4b98961748f1 user: Serhiy Storchaka date: Tue Jul 22 11:02:56 2014 +0300 summary: Merge heads files: Lib/test/test_urllib2.py | 3 ++- Lib/urllib/request.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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 @@ -678,7 +678,7 @@ self.assertEqual(int(headers["Content-length"]), len(data)) def test_file(self): - import email.utils, socket + import email.utils h = urllib.request.FileHandler() o = h.parent = MockOpener() @@ -725,6 +725,7 @@ for url in [ "file://localhost:80%s" % urlpath, "file:///file_does_not_exist.txt", + "file://not-a-local-host.com//dir/file.txt", "file://%s:80%s/%s" % (socket.gethostbyname('localhost'), os.getcwd(), TESTFN), "file://somerandomhost.ontheinternet.com%s/%s" % diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1315,7 +1315,7 @@ url = req.selector if url[:2] == '//' and url[2:3] != '/' and (req.host and req.host != 'localhost'): - if not req.host is self.get_names(): + if not req.host in self.get_names(): raise URLError("file:// scheme is supported only on localhost") else: return self.open_local_file(req) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:06:02 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:06:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3hHXSB26X8z7LpV@mail.python.org> http://hg.python.org/cpython/rev/6a65b7bcc137 changeset: 91762:6a65b7bcc137 parent: 91758:c755a3b58fa6 parent: 91756:2c660948bb41 user: Serhiy Storchaka date: Tue Jul 22 11:03:16 2014 +0300 summary: Merge heads files: Lib/test/test_urllib2.py | 3 ++- Lib/urllib/request.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) 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 @@ -678,7 +678,7 @@ self.assertEqual(int(headers["Content-length"]), len(data)) def test_file(self): - import email.utils, socket + import email.utils h = urllib.request.FileHandler() o = h.parent = MockOpener() @@ -725,6 +725,7 @@ for url in [ "file://localhost:80%s" % urlpath, "file:///file_does_not_exist.txt", + "file://not-a-local-host.com//dir/file.txt", "file://%s:80%s/%s" % (socket.gethostbyname('localhost'), os.getcwd(), TESTFN), "file://somerandomhost.ontheinternet.com%s/%s" % diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1315,7 +1315,7 @@ url = req.selector if url[:2] == '//' and url[2:3] != '/' and (req.host and req.host != 'localhost'): - if not req.host is self.get_names(): + if not req.host in self.get_names(): raise URLError("file:// scheme is supported only on localhost") else: return self.open_local_file(req) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:06:03 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:06:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3hHXSC3mD4z7LlF@mail.python.org> http://hg.python.org/cpython/rev/b50f0a9054e0 changeset: 91763:b50f0a9054e0 parent: 91762:6a65b7bcc137 parent: 91761:a74c48aa43eb user: Serhiy Storchaka date: Tue Jul 22 11:03:28 2014 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:11:44 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:11:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fixed_bugs_in_?= =?utf-8?q?reprs_of_CookieJar_and_multiprocessing=2Edummy=2EValue=2E?= Message-ID: <3hHXZm3jWzz7LjP@mail.python.org> http://hg.python.org/cpython/rev/61066d464777 changeset: 91764:61066d464777 branch: 3.4 parent: 91761:a74c48aa43eb user: Serhiy Storchaka date: Tue Jul 22 11:09:36 2014 +0300 summary: Fixed bugs in reprs of CookieJar and multiprocessing.dummy.Value. files: Lib/http/cookiejar.py | 4 ++-- Lib/multiprocessing/dummy/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1722,12 +1722,12 @@ def __repr__(self): r = [] for cookie in self: r.append(repr(cookie)) - return "<%s[%s]>" % (self.__class__, ", ".join(r)) + return "<%s[%s]>" % (self.__class__.__name__, ", ".join(r)) def __str__(self): r = [] for cookie in self: r.append(str(cookie)) - return "<%s[%s]>" % (self.__class__, ", ".join(r)) + return "<%s[%s]>" % (self.__class__.__name__, ", ".join(r)) # derives from OSError for backwards-compatibility with Python 2.4.0 diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py --- a/Lib/multiprocessing/dummy/__init__.py +++ b/Lib/multiprocessing/dummy/__init__.py @@ -104,7 +104,7 @@ self._value = value value = property(_get, _set) def __repr__(self): - return '<%r(%r, %r)>'%(type(self).__name__,self._typecode,self._value) + return '<%s(%r, %r)>'%(type(self).__name__,self._typecode,self._value) def Manager(): return sys.modules[__name__] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:11:45 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:11:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Fixed_bugs_in_reprs_of_CookieJar_and_multiprocessing=2Ed?= =?utf-8?q?ummy=2EValue=2E?= Message-ID: <3hHXZn5cFFz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/69c8f9bef647 changeset: 91765:69c8f9bef647 parent: 91763:b50f0a9054e0 parent: 91764:61066d464777 user: Serhiy Storchaka date: Tue Jul 22 11:10:37 2014 +0300 summary: Fixed bugs in reprs of CookieJar and multiprocessing.dummy.Value. files: Lib/http/cookiejar.py | 4 ++-- Lib/multiprocessing/dummy/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1722,12 +1722,12 @@ def __repr__(self): r = [] for cookie in self: r.append(repr(cookie)) - return "<%s[%s]>" % (self.__class__, ", ".join(r)) + return "<%s[%s]>" % (self.__class__.__name__, ", ".join(r)) def __str__(self): r = [] for cookie in self: r.append(str(cookie)) - return "<%s[%s]>" % (self.__class__, ", ".join(r)) + return "<%s[%s]>" % (self.__class__.__name__, ", ".join(r)) # derives from OSError for backwards-compatibility with Python 2.4.0 diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py --- a/Lib/multiprocessing/dummy/__init__.py +++ b/Lib/multiprocessing/dummy/__init__.py @@ -104,7 +104,7 @@ self._value = value value = property(_get, _set) def __repr__(self): - return '<%r(%r, %r)>'%(type(self).__name__,self._typecode,self._value) + return '<%s(%r, %r)>'%(type(self).__name__,self._typecode,self._value) def Manager(): return sys.modules[__name__] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 10:11:47 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 10:11:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fixed_bugs_in_?= =?utf-8?q?reprs_of_CookieJar_and_multiprocessing=2Edummy=2EValue=2E?= Message-ID: <3hHXZq00sLz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/30e29c1c4032 changeset: 91766:30e29c1c4032 branch: 2.7 parent: 91760:51699f5f5430 user: Serhiy Storchaka date: Tue Jul 22 11:11:01 2014 +0300 summary: Fixed bugs in reprs of CookieJar and multiprocessing.dummy.Value. files: Lib/cookielib.py | 4 ++-- Lib/multiprocessing/dummy/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/cookielib.py b/Lib/cookielib.py --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -1719,12 +1719,12 @@ def __repr__(self): r = [] for cookie in self: r.append(repr(cookie)) - return "<%s[%s]>" % (self.__class__, ", ".join(r)) + return "<%s[%s]>" % (self.__class__.__name__, ", ".join(r)) def __str__(self): r = [] for cookie in self: r.append(str(cookie)) - return "<%s[%s]>" % (self.__class__, ", ".join(r)) + return "<%s[%s]>" % (self.__class__.__name__, ", ".join(r)) # derives from IOError for backwards-compatibility with Python 2.4.0 diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py --- a/Lib/multiprocessing/dummy/__init__.py +++ b/Lib/multiprocessing/dummy/__init__.py @@ -138,7 +138,7 @@ self._value = value value = property(_get, _set) def __repr__(self): - return '<%r(%r, %r)>'%(type(self).__name__,self._typecode,self._value) + return '<%s(%r, %r)>'%(type(self).__name__,self._typecode,self._value) def Manager(): return sys.modules[__name__] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 11:14:58 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 11:14:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322031=3A_Reprs_no?= =?utf-8?q?w_always_use_hexadecimal_format_with_the_=220x=22_prefix?= Message-ID: <3hHYzk3mJLz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/4cef7b0ec659 changeset: 91767:4cef7b0ec659 parent: 91765:69c8f9bef647 user: Serhiy Storchaka date: Tue Jul 22 12:14:52 2014 +0300 summary: Issue #22031: Reprs now always use hexadecimal format with the "0x" prefix when contain an id in form " at 0x...". files: Lib/ctypes/__init__.py | 2 +- Lib/reprlib.py | 2 +- Lib/test/test_reprlib.py | 2 +- Lib/test/test_weakref.py | 8 ++++++++ Lib/test/test_xmlrpc.py | 2 +- Lib/weakref.py | 4 ++-- Lib/xmlrpc/client.py | 4 ++-- Misc/NEWS | 3 +++ 8 files changed, 19 insertions(+), 8 deletions(-) diff --git a/Lib/ctypes/__init__.py b/Lib/ctypes/__init__.py --- a/Lib/ctypes/__init__.py +++ b/Lib/ctypes/__init__.py @@ -353,7 +353,7 @@ self._handle = handle def __repr__(self): - return "<%s '%s', handle %x at %x>" % \ + return "<%s '%s', handle %x at %#x>" % \ (self.__class__.__name__, self._name, (self._handle & (_sys.maxsize*2 + 1)), id(self) & (_sys.maxsize*2 + 1)) diff --git a/Lib/reprlib.py b/Lib/reprlib.py --- a/Lib/reprlib.py +++ b/Lib/reprlib.py @@ -136,7 +136,7 @@ # Bugs in x.__repr__() can cause arbitrary # exceptions -- then make up something except Exception: - return '<%s instance at %x>' % (x.__class__.__name__, id(x)) + return '<%s instance at %#x>' % (x.__class__.__name__, id(x)) if len(s) > self.maxother: i = max(0, (self.maxother-3)//2) j = max(0, self.maxother-3-i) diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py --- a/Lib/test/test_reprlib.py +++ b/Lib/test/test_reprlib.py @@ -123,7 +123,7 @@ eq(r(i2), expected) i3 = ClassWithFailingRepr() - eq(r(i3), (""%id(i3))) + eq(r(i3), (""%id(i3))) s = r(ClassWithFailingRepr) self.assertTrue(s.startswith("') + + def test_make_weak_keyed_dict_repr(self): + dict = weakref.WeakKeyDictionary() + self.assertRegex(repr(dict), '') + from test import mapping_tests class WeakValueDictionaryTestCase(mapping_tests.BasicTestMappingProtocol): 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 @@ -287,7 +287,7 @@ def test_repr(self): d = datetime.datetime(2007,1,2,3,4,5) t = xmlrpclib.DateTime(d) - val ="" % id(t) + val ="" % id(t) self.assertEqual(repr(t), val) def test_decode(self): diff --git a/Lib/weakref.py b/Lib/weakref.py --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -144,7 +144,7 @@ return o is not None def __repr__(self): - return "" % id(self) + return "" % id(self) def __setitem__(self, key, value): if self._pending_removals: @@ -348,7 +348,7 @@ return len(self.data) - len(self._pending_removals) def __repr__(self): - return "" % id(self) + return "" % id(self) def __setitem__(self, key, value): self.data[ref(key, self._remove)] = value diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -354,7 +354,7 @@ return self.value def __repr__(self): - return "" % (self.value, id(self)) + return "" % (self.value, id(self)) def decode(self, data): self.value = str(data).strip() @@ -846,7 +846,7 @@ self.__call_list = [] def __repr__(self): - return "" % id(self) + return "" % id(self) __str__ = __repr__ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #22031: Reprs now always use hexadecimal format with the "0x" prefix + when contain an id in form " at 0x...". + - Issue #22018: signal.set_wakeup_fd() now raises an OSError instead of a ValueError on ``fstat()`` failure. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 12:05:43 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 22 Jul 2014 12:05:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbywgdHVs?= =?utf-8?q?ip_issue_193=3A_Convert_StreamWriter=2Edrain=28=29_to_a_classic?= =?utf-8?q?_coroutine?= Message-ID: <3hHb6H6k7fz7LkF@mail.python.org> http://hg.python.org/cpython/rev/bf1b0afe419b changeset: 91768:bf1b0afe419b branch: 3.4 parent: 91764:61066d464777 user: Victor Stinner date: Tue Jul 22 12:03:40 2014 +0200 summary: asyncio, tulip issue 193: Convert StreamWriter.drain() to a classic coroutine Replace also _make_drain_waiter() function with a classic _drain_helper() coroutine. files: Lib/asyncio/streams.py | 37 ++++++++++++++--------------- 1 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -141,15 +141,14 @@ resume_reading() and connection_lost(). If the subclass overrides these it must call the super methods. - StreamWriter.drain() must check for error conditions and then call - _make_drain_waiter(), which will return either () or a Future - depending on the paused state. + StreamWriter.drain() must wait for _drain_helper() coroutine. """ def __init__(self, loop=None): self._loop = loop # May be None; we may never need it. self._paused = False self._drain_waiter = None + self._connection_lost = False def pause_writing(self): assert not self._paused @@ -170,6 +169,7 @@ waiter.set_result(None) def connection_lost(self, exc): + self._connection_lost = True # Wake up the writer if currently paused. if not self._paused: return @@ -184,14 +184,17 @@ else: waiter.set_exception(exc) - def _make_drain_waiter(self): + @coroutine + def _drain_helper(self): + if self._connection_lost: + raise ConnectionResetError('Connection lost') if not self._paused: - return () + return waiter = self._drain_waiter assert waiter is None or waiter.cancelled() waiter = futures.Future(loop=self._loop) self._drain_waiter = waiter - return waiter + yield from waiter class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): @@ -247,6 +250,8 @@ def __init__(self, transport, protocol, reader, loop): self._transport = transport self._protocol = protocol + # drain() expects that the reader has a exception() method + assert reader is None or isinstance(reader, StreamReader) self._reader = reader self._loop = loop @@ -278,26 +283,20 @@ def get_extra_info(self, name, default=None): return self._transport.get_extra_info(name, default) + @coroutine def drain(self): - """This method has an unusual return value. + """Flush the write buffer. The intended use is to write w.write(data) yield from w.drain() - - When there's nothing to wait for, drain() returns (), and the - yield-from continues immediately. When the transport buffer - is full (the protocol is paused), drain() creates and returns - a Future and the yield-from will block until that Future is - completed, which will happen when the buffer is (partially) - drained and the protocol is resumed. """ - if self._reader is not None and self._reader._exception is not None: - raise self._reader._exception - if self._transport._conn_lost: # Uses private variable. - raise ConnectionResetError('Connection lost') - return self._protocol._make_drain_waiter() + if self._reader is not None: + exc = self._reader.exception() + if exc is not None: + raise exc + yield from self._protocol._drain_helper() class StreamReader: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 12:06:40 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 22 Jul 2014 12:06:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=2C_tulip_issue_193=3A_Convert_?= =?utf-8?q?StreamWriter=2Edrain=28=29_to_a_classic?= Message-ID: <3hHb7N1VQBz7LjN@mail.python.org> http://hg.python.org/cpython/rev/fd7550508ca3 changeset: 91769:fd7550508ca3 parent: 91767:4cef7b0ec659 parent: 91768:bf1b0afe419b user: Victor Stinner date: Tue Jul 22 12:03:54 2014 +0200 summary: (Merge 3.4) asyncio, tulip issue 193: Convert StreamWriter.drain() to a classic coroutine Replace also _make_drain_waiter() function with a classic _drain_helper() coroutine. files: Lib/asyncio/streams.py | 37 ++++++++++++++--------------- 1 files changed, 18 insertions(+), 19 deletions(-) diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -141,15 +141,14 @@ resume_reading() and connection_lost(). If the subclass overrides these it must call the super methods. - StreamWriter.drain() must check for error conditions and then call - _make_drain_waiter(), which will return either () or a Future - depending on the paused state. + StreamWriter.drain() must wait for _drain_helper() coroutine. """ def __init__(self, loop=None): self._loop = loop # May be None; we may never need it. self._paused = False self._drain_waiter = None + self._connection_lost = False def pause_writing(self): assert not self._paused @@ -170,6 +169,7 @@ waiter.set_result(None) def connection_lost(self, exc): + self._connection_lost = True # Wake up the writer if currently paused. if not self._paused: return @@ -184,14 +184,17 @@ else: waiter.set_exception(exc) - def _make_drain_waiter(self): + @coroutine + def _drain_helper(self): + if self._connection_lost: + raise ConnectionResetError('Connection lost') if not self._paused: - return () + return waiter = self._drain_waiter assert waiter is None or waiter.cancelled() waiter = futures.Future(loop=self._loop) self._drain_waiter = waiter - return waiter + yield from waiter class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): @@ -247,6 +250,8 @@ def __init__(self, transport, protocol, reader, loop): self._transport = transport self._protocol = protocol + # drain() expects that the reader has a exception() method + assert reader is None or isinstance(reader, StreamReader) self._reader = reader self._loop = loop @@ -278,26 +283,20 @@ def get_extra_info(self, name, default=None): return self._transport.get_extra_info(name, default) + @coroutine def drain(self): - """This method has an unusual return value. + """Flush the write buffer. The intended use is to write w.write(data) yield from w.drain() - - When there's nothing to wait for, drain() returns (), and the - yield-from continues immediately. When the transport buffer - is full (the protocol is paused), drain() creates and returns - a Future and the yield-from will block until that Future is - completed, which will happen when the buffer is (partially) - drained and the protocol is resumed. """ - if self._reader is not None and self._reader._exception is not None: - raise self._reader._exception - if self._transport._conn_lost: # Uses private variable. - raise ConnectionResetError('Connection lost') - return self._protocol._make_drain_waiter() + if self._reader is not None: + exc = self._reader.exception() + if exc is not None: + raise exc + yield from self._protocol._drain_helper() class StreamReader: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 14:00:36 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Tue, 22 Jul 2014 14:00:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbjogSXNzdWUgIzIyMDMyOiBfX3F1?= =?utf-8?q?alname=5F=5F_instead_of_=5F=5Fname=5F=5F_is_now_always_used_to_?= =?utf-8?q?format?= Message-ID: <3hHdfr0ssDz7LjP@mail.python.org> http://hg.python.org/cpython/rev/fe3c98313855 changeset: 91770:fe3c98313855 user: Serhiy Storchaka date: Tue Jul 22 15:00:37 2014 +0300 summary: Issue #22032: __qualname__ instead of __name__ is now always used to format fully qualified class names of Python implemented classes. files: Lib/abc.py | 2 +- Lib/asyncore.py | 2 +- Lib/codecs.py | 4 ++-- Lib/distutils/extension.py | 2 +- Lib/functools.py | 2 +- Lib/inspect.py | 4 ++-- Lib/pdb.py | 2 +- Lib/socket.py | 2 +- Lib/test/test_configparser.py | 2 +- Lib/test/test_io.py | 2 +- Lib/test/test_traceback.py | 4 ++-- Lib/test/test_zipimport_support.py | 2 +- Lib/traceback.py | 2 +- Lib/unittest/test/test_setups.py | 7 ++++--- Lib/unittest/util.py | 2 +- Misc/NEWS | 3 +++ 16 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Lib/abc.py b/Lib/abc.py --- a/Lib/abc.py +++ b/Lib/abc.py @@ -168,7 +168,7 @@ def _dump_registry(cls, file=None): """Debug helper to print the ABC registry.""" - print("Class: %s.%s" % (cls.__module__, cls.__name__), file=file) + print("Class: %s.%s" % (cls.__module__, cls.__qualname__), file=file) print("Inv.counter: %s" % ABCMeta._abc_invalidation_counter, file=file) for name in sorted(cls.__dict__.keys()): if name.startswith("_abc_"): diff --git a/Lib/asyncore.py b/Lib/asyncore.py --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -255,7 +255,7 @@ self.socket = None def __repr__(self): - status = [self.__class__.__module__+"."+self.__class__.__name__] + status = [self.__class__.__module__+"."+self.__class__.__qualname__] if self.accepting and self.addr: status.append('listening') elif self.connected: diff --git a/Lib/codecs.py b/Lib/codecs.py --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -99,8 +99,8 @@ return self def __repr__(self): - return "<%s.%s object for encoding %s at 0x%x>" % \ - (self.__class__.__module__, self.__class__.__name__, + return "<%s.%s object for encoding %s at %#x>" % \ + (self.__class__.__module__, self.__class__.__qualname__, self.name, id(self)) class Codec: diff --git a/Lib/distutils/extension.py b/Lib/distutils/extension.py --- a/Lib/distutils/extension.py +++ b/Lib/distutils/extension.py @@ -134,7 +134,7 @@ def __repr__(self): return '<%s.%s(%r) at %#x>' % ( self.__class__.__module__, - self.__class__.__name__, + self.__class__.__qualname__, self.name, id(self)) diff --git a/Lib/functools.py b/Lib/functools.py --- a/Lib/functools.py +++ b/Lib/functools.py @@ -277,7 +277,7 @@ for k, v in self.keywords.items()) format_string = "{module}.{cls}({func}, {args}, {keywords})" return format_string.format(module=self.__class__.__module__, - cls=self.__class__.__name__, + cls=self.__class__.__qualname__, func=self.func, args=args, keywords=keywords) diff --git a/Lib/inspect.py b/Lib/inspect.py --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1038,8 +1038,8 @@ def formatannotation(annotation, base_module=None): if isinstance(annotation, type): if annotation.__module__ in ('builtins', base_module): - return annotation.__name__ - return annotation.__module__+'.'+annotation.__name__ + return annotation.__qualname__ + return annotation.__module__+'.'+annotation.__qualname__ return repr(annotation) def formatannotationrelativeto(object): diff --git a/Lib/pdb.py b/Lib/pdb.py --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1316,7 +1316,7 @@ return # Is it a class? if value.__class__ is type: - self.message('Class %s.%s' % (value.__module__, value.__name__)) + self.message('Class %s.%s' % (value.__module__, value.__qualname__)) return # None of the above... self.message(type(value)) diff --git a/Lib/socket.py b/Lib/socket.py --- a/Lib/socket.py +++ b/Lib/socket.py @@ -141,7 +141,7 @@ closed = getattr(self, '_closed', False) s = "<%s.%s%s fd=%i, family=%s, type=%s, proto=%i" \ % (self.__class__.__module__, - self.__class__.__name__, + self.__class__.__qualname__, " [closed]" if closed else "", self.fileno(), self.family, diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py --- a/Lib/test/test_configparser.py +++ b/Lib/test/test_configparser.py @@ -579,7 +579,7 @@ return e else: self.fail("expected exception type %s.%s" - % (exc.__module__, exc.__name__)) + % (exc.__module__, exc.__qualname__)) def test_boolean(self): cf = self.fromstring( 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 @@ -778,7 +778,7 @@ def test_repr(self): raw = self.MockRawIO() b = self.tp(raw) - clsname = "%s.%s" % (self.tp.__module__, self.tp.__name__) + clsname = "%s.%s" % (self.tp.__module__, self.tp.__qualname__) self.assertEqual(repr(b), "<%s>" % clsname) raw.name = "dummy" self.assertEqual(repr(b), "<%s name='dummy'>" % clsname) diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -92,9 +92,9 @@ self.assertEqual(len(err), 1) str_value = '' % X.__name__ if X.__module__ in ('__main__', 'builtins'): - str_name = X.__name__ + str_name = X.__qualname__ else: - str_name = '.'.join([X.__module__, X.__name__]) + str_name = '.'.join([X.__module__, X.__qualname__]) self.assertEqual(err[0], "%s: %s\n" % (str_name, str_value)) def test_without_exception(self): diff --git a/Lib/test/test_zipimport_support.py b/Lib/test/test_zipimport_support.py --- a/Lib/test/test_zipimport_support.py +++ b/Lib/test/test_zipimport_support.py @@ -39,7 +39,7 @@ # Use the object's fully qualified name if it has one # Otherwise, use the module's name try: - name = "%s.%s" % (obj.__module__, obj.__name__) + name = "%s.%s" % (obj.__module__, obj.__qualname__) except AttributeError: name = module.__name__ for example in finder.find(obj, name, module): diff --git a/Lib/traceback.py b/Lib/traceback.py --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -205,7 +205,7 @@ yield _format_final_exc_line(etype, value) return - stype = etype.__name__ + stype = etype.__qualname__ smod = etype.__module__ if smod not in ("__main__", "builtins"): stype = smod + '.' + stype diff --git a/Lib/unittest/test/test_setups.py b/Lib/unittest/test/test_setups.py --- a/Lib/unittest/test/test_setups.py +++ b/Lib/unittest/test/test_setups.py @@ -111,7 +111,7 @@ self.assertEqual(len(result.errors), 1) error, _ = result.errors[0] self.assertEqual(str(error), - 'setUpClass (%s.BrokenTest)' % __name__) + 'setUpClass (%s.%s)' % (__name__, BrokenTest.__qualname__)) def test_error_in_teardown_class(self): class Test(unittest.TestCase): @@ -144,7 +144,7 @@ error, _ = result.errors[0] self.assertEqual(str(error), - 'tearDownClass (%s.Test)' % __name__) + 'tearDownClass (%s.%s)' % (__name__, Test.__qualname__)) def test_class_not_torndown_when_setup_fails(self): class Test(unittest.TestCase): @@ -414,7 +414,8 @@ self.assertEqual(len(result.errors), 0) self.assertEqual(len(result.skipped), 1) skipped = result.skipped[0][0] - self.assertEqual(str(skipped), 'setUpClass (%s.Test)' % __name__) + self.assertEqual(str(skipped), + 'setUpClass (%s.%s)' % (__name__, Test.__qualname__)) def test_skiptest_in_setupmodule(self): class Test(unittest.TestCase): diff --git a/Lib/unittest/util.py b/Lib/unittest/util.py --- a/Lib/unittest/util.py +++ b/Lib/unittest/util.py @@ -52,7 +52,7 @@ return result[:_MAX_LENGTH] + ' [truncated]...' def strclass(cls): - return "%s.%s" % (cls.__module__, cls.__name__) + return "%s.%s" % (cls.__module__, cls.__qualname__) def sorted_list_difference(expected, actual): """Finds elements in only one or the other of two, sorted input lists. diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #22032: __qualname__ instead of __name__ is now always used to format + fully qualified class names of Python implemented classes. + - Issue #22031: Reprs now always use hexadecimal format with the "0x" prefix when contain an id in form " at 0x...". -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 19:28:29 2014 From: python-checkins at python.org (zach.ware) Date: Tue, 22 Jul 2014 19:28:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICMyMTY2?= =?utf-8?q?5=3A_Don=27t_use_OPTS=3Dnoxp_or_-DWINVER=3D0x0500_when_compilin?= =?utf-8?q?g_Tcl/Tk?= Message-ID: <3hHmx90TLXz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/73fcf00b9e0c changeset: 91771:73fcf00b9e0c branch: 2.7 parent: 91766:30e29c1c4032 user: Zachary Ware date: Tue Jul 22 12:26:34 2014 -0500 summary: Closes #21665: Don't use OPTS=noxp or -DWINVER=0x0500 when compiling Tcl/Tk on the buildbots. 2.7 does still support Win2k, but using those options makes default ttk ugly while not using them doesn't seem to break Win2k. files: Tools/buildbot/external-amd64.bat | 18 +++++++++--------- Tools/buildbot/external.bat | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Tools/buildbot/external-amd64.bat b/Tools/buildbot/external-amd64.bat --- a/Tools/buildbot/external-amd64.bat +++ b/Tools/buildbot/external-amd64.bat @@ -6,23 +6,23 @@ if not exist tcltk64\bin\tcl85g.dll ( cd tcl-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install cd ..\.. ) if not exist tcltk64\bin\tk85g.dll ( cd tk-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 clean - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 all - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 install + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 clean + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 all + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 install cd ..\.. ) if not exist tcltk64\lib\tix8.4.3\tix84g.dll ( cd tix-8.4.3.5\win - nmake -f python.mak DEBUG=1 MACHINE=AMD64 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 clean - nmake -f python.mak DEBUG=1 MACHINE=AMD64 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 all - nmake -f python.mak DEBUG=1 MACHINE=AMD64 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 install + nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 clean + nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 all + nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 install cd ..\.. -) \ No newline at end of file +) diff --git a/Tools/buildbot/external.bat b/Tools/buildbot/external.bat --- a/Tools/buildbot/external.bat +++ b/Tools/buildbot/external.bat @@ -7,23 +7,23 @@ if not exist tcltk\bin\tcl85g.dll ( @rem all and install need to be separate invocations, otherwise nmakehlp is not found on install cd tcl-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 INSTALLDIR=..\..\tcltk clean all + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk clean all nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk install cd ..\.. ) if not exist tcltk\bin\tk85g.dll ( cd tk-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 clean - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 all - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 install + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 clean + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 all + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 install cd ..\.. ) if not exist tcltk\lib\tix8.4.3\tix84g.dll ( cd tix-8.4.3.5\win - nmake -f python.mak DEBUG=1 MACHINE=IX86 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk clean - nmake -f python.mak DEBUG=1 MACHINE=IX86 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk all - nmake -f python.mak DEBUG=1 MACHINE=IX86 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk install + nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk clean + nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk all + nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk install cd ..\.. ) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 20:16:32 2014 From: python-checkins at python.org (zach.ware) Date: Tue, 22 Jul 2014 20:16:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_minor_typo?= =?utf-8?q?_in_round_docs=2E__Reported_by_Scott_Hinton_on_docs=40=2E?= Message-ID: <3hHp0c2msrz7LjV@mail.python.org> http://hg.python.org/cpython/rev/5549075d6223 changeset: 91772:5549075d6223 branch: 2.7 user: Zachary Ware date: Tue Jul 22 13:14:54 2014 -0500 summary: Fix minor typo in round docs. Reported by Scott Hinton on docs at . 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 @@ -1229,7 +1229,7 @@ the decimal point. If *ndigits* is omitted, it defaults to zero. The result is a floating point number. Values are rounded to the closest multiple of 10 to the power minus *ndigits*; if two multiples are equally close, - rounding is done away from 0 (so. for example, ``round(0.5)`` is ``1.0`` and + rounding is done away from 0 (so, for example, ``round(0.5)`` is ``1.0`` and ``round(-0.5)`` is ``-1.0``). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 22:30:31 2014 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 22 Jul 2014 22:30:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTAx?= =?utf-8?q?=3A_Cap_the_maximum_number_of_file_descriptors_to_use_for_the_t?= =?utf-8?q?est=2E?= Message-ID: <3hHrzC4sckz7LjM@mail.python.org> http://hg.python.org/cpython/rev/7238c6a05ca6 changeset: 91773:7238c6a05ca6 branch: 3.4 parent: 91768:bf1b0afe419b user: Charles-Fran?ois Natali date: Tue Jul 22 21:25:03 2014 +0100 summary: Issue #21901: Cap the maximum number of file descriptors to use for the test. files: Lib/test/test_selectors.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -378,7 +378,7 @@ resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard)) self.addCleanup(resource.setrlimit, resource.RLIMIT_NOFILE, (soft, hard)) - NUM_FDS = hard + NUM_FDS = min(hard, 2**16) except (OSError, ValueError): NUM_FDS = soft -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 22:30:32 2014 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 22 Jul 2014 22:30:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321901=3A_Cap_the_maximum_number_of_file_descrip?= =?utf-8?q?tors_to_use_for_the_test=2E?= Message-ID: <3hHrzD6CXKz7LlF@mail.python.org> http://hg.python.org/cpython/rev/89665cc05592 changeset: 91774:89665cc05592 parent: 91770:fe3c98313855 parent: 91773:7238c6a05ca6 user: Charles-Fran?ois Natali date: Tue Jul 22 21:29:52 2014 +0100 summary: Issue #21901: Cap the maximum number of file descriptors to use for the test. files: Lib/test/test_selectors.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -378,7 +378,7 @@ resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard)) self.addCleanup(resource.setrlimit, resource.RLIMIT_NOFILE, (soft, hard)) - NUM_FDS = hard + NUM_FDS = min(hard, 2**16) except (OSError, ValueError): NUM_FDS = soft -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 22 23:32:11 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 22 Jul 2014 23:32:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_471=3A_I=27m_the_BDFL-del?= =?utf-8?q?egate_and_I_accept_the_PEP?= Message-ID: <3hHtLM4TX0z7LkW@mail.python.org> http://hg.python.org/peps/rev/6724965df437 changeset: 5502:6724965df437 user: Victor Stinner date: Tue Jul 22 23:32:05 2014 +0200 summary: PEP 471: I'm the BDFL-delegate and I accept the PEP files: pep-0471.txt | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/pep-0471.txt b/pep-0471.txt --- a/pep-0471.txt +++ b/pep-0471.txt @@ -3,7 +3,8 @@ Version: $Revision$ Last-Modified: $Date$ Author: Ben Hoyt -Status: Draft +BDFL-Delegate: Victor Stinner +Status: Accepted Type: Standards Track Content-Type: text/x-rst Created: 30-May-2014 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Jul 23 10:28:05 2014 From: python-checkins at python.org (andrew.svetlov) Date: Wed, 23 Jul 2014 10:28:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_grammar?= Message-ID: <3hJ8v94t3Qz7LkC@mail.python.org> http://hg.python.org/cpython/rev/d19c58e13ac9 changeset: 91775:d19c58e13ac9 branch: 3.4 parent: 91773:7238c6a05ca6 user: Andrew Svetlov date: Wed Jul 23 11:27:17 2014 +0300 summary: Fix grammar files: Doc/library/asyncio-protocol.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -459,7 +459,7 @@ example to raise an exception if the server is not listening, instead of having to write a short coroutine to handle the exception and stop the running loop. At :meth:`~BaseEventLoop.run_until_complete` exit, the loop is -no more running, so there is no need to stop the loop in case of an error. +no longer running, so there is no need to stop the loop in case of an error. Echo server ----------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 10:28:06 2014 From: python-checkins at python.org (andrew.svetlov) Date: Wed, 23 Jul 2014 10:28:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogTWVyZ2UgMy40?= Message-ID: <3hJ8vB6jgLz7LkC@mail.python.org> http://hg.python.org/cpython/rev/0e284e2a6752 changeset: 91776:0e284e2a6752 parent: 91774:89665cc05592 parent: 91775:d19c58e13ac9 user: Andrew Svetlov date: Wed Jul 23 11:27:49 2014 +0300 summary: Merge 3.4 files: Doc/library/asyncio-protocol.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -459,7 +459,7 @@ example to raise an exception if the server is not listening, instead of having to write a short coroutine to handle the exception and stop the running loop. At :meth:`~BaseEventLoop.run_until_complete` exit, the loop is -no more running, so there is no need to stop the loop in case of an error. +no longer running, so there is no need to stop the loop in case of an error. Echo server ----------- -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Jul 23 10:34:31 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 23 Jul 2014 10:34:31 +0200 Subject: [Python-checkins] Daily reference leaks (89665cc05592): sum=7 Message-ID: results for 89665cc05592 on branch "default" -------------------------------------------- test_asyncio leaked [0, 4, 0] memory blocks, sum=4 test_functools leaked [0, 0, 3] memory blocks, sum=3 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog9XUBo7', '-x'] From python-checkins at python.org Wed Jul 23 17:42:11 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 17:42:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Correct_issue_?= =?utf-8?q?=2321044_patch_author=2E?= Message-ID: <3hJLX35CLZz7LjR@mail.python.org> http://hg.python.org/cpython/rev/825137d0d4ca changeset: 91777:825137d0d4ca branch: 3.4 parent: 91775:d19c58e13ac9 user: Serhiy Storchaka date: Wed Jul 23 18:41:21 2014 +0300 summary: Correct issue #21044 patch author. files: Misc/ACKS | 1 - Misc/NEWS | 2 +- 2 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -997,7 +997,6 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus -Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -28,7 +28,7 @@ ------- - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' - attribute. Based on patch by Martin Panter. + attribute. Based on patch by Antoine Pietri. - Issue #21867: Prevent turtle crash due to invalid undo buffer size. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 17:42:12 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 17:42:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Correct_issue_=2321044_patch_author=2E?= Message-ID: <3hJLX46zkQz7Lnp@mail.python.org> http://hg.python.org/cpython/rev/4fe27263f9d4 changeset: 91778:4fe27263f9d4 parent: 91776:0e284e2a6752 parent: 91777:825137d0d4ca user: Serhiy Storchaka date: Wed Jul 23 18:42:09 2014 +0300 summary: Correct issue #21044 patch author. files: Misc/ACKS | 1 - Misc/NEWS | 2 +- 2 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1005,7 +1005,6 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus -Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -118,7 +118,7 @@ ValueError on ``fstat()`` failure. - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' - attribute. Based on patch by Martin Panter. + attribute. Based on patch by Antoine Pietri. - Issue #21966: Respect -q command-line option when code module is ran. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 17:50:31 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 17:50:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODg4?= =?utf-8?q?=3A_plistlib=27s_load=28=29_and_loads=28=29_now_work_if_the_fmt?= =?utf-8?q?_parameter_is?= Message-ID: <3hJLjg1sbTz7MpM@mail.python.org> http://hg.python.org/cpython/rev/09746dc1a3b4 changeset: 91779:09746dc1a3b4 branch: 3.4 parent: 91777:825137d0d4ca user: Serhiy Storchaka date: Wed Jul 23 18:49:31 2014 +0300 summary: Issue #21888: plistlib's load() and loads() now work if the fmt parameter is specified. files: Lib/plistlib.py | 8 +++----- Lib/test/test_plistlib.py | 5 +++++ Misc/NEWS | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/plistlib.py b/Lib/plistlib.py --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -984,18 +984,16 @@ fp.seek(0) for info in _FORMATS.values(): if info['detect'](header): - p = info['parser']( - use_builtin_types=use_builtin_types, - dict_type=dict_type, - ) + P = info['parser'] break else: raise InvalidFileException() else: - p = _FORMATS[fmt]['parser'](use_builtin_types=use_builtin_types) + P = _FORMATS[fmt]['parser'] + p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) return p.parse(fp) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -207,6 +207,9 @@ for fmt in ALL_FORMATS: with self.subTest(fmt=fmt): pl = self._create(fmt=fmt) + pl2 = plistlib.loads(TESTDATA[fmt], fmt=fmt) + self.assertEqual(dict(pl), dict(pl2), + "generated data was not identical to Apple's output") pl2 = plistlib.loads(TESTDATA[fmt]) self.assertEqual(dict(pl), dict(pl2), "generated data was not identical to Apple's output") @@ -217,6 +220,8 @@ b = BytesIO() pl = self._create(fmt=fmt) plistlib.dump(pl, b, fmt=fmt) + pl2 = plistlib.load(BytesIO(b.getvalue()), fmt=fmt) + self.assertEqual(dict(pl), dict(pl2)) pl2 = plistlib.load(BytesIO(b.getvalue())) self.assertEqual(dict(pl), dict(pl2)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21888: plistlib's load() and loads() now work if the fmt parameter is + specified. + - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' attribute. Based on patch by Antoine Pietri. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 17:50:32 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 17:50:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogSXNzdWUgIzIxODg4OiBwbGlzdGxpYidzIGxvYWQoKSBhbmQgbG9hZHMo?= =?utf-8?q?=29_now_work_if_the_fmt_parameter_is?= Message-ID: <3hJLjh3jNKz7Lxg@mail.python.org> http://hg.python.org/cpython/rev/275d02865d11 changeset: 91780:275d02865d11 parent: 91778:4fe27263f9d4 parent: 91779:09746dc1a3b4 user: Serhiy Storchaka date: Wed Jul 23 18:50:19 2014 +0300 summary: Issue #21888: plistlib's load() and loads() now work if the fmt parameter is specified. files: Lib/plistlib.py | 8 +++----- Lib/test/test_plistlib.py | 5 +++++ Misc/NEWS | 3 +++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/plistlib.py b/Lib/plistlib.py --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -984,18 +984,16 @@ fp.seek(0) for info in _FORMATS.values(): if info['detect'](header): - p = info['parser']( - use_builtin_types=use_builtin_types, - dict_type=dict_type, - ) + P = info['parser'] break else: raise InvalidFileException() else: - p = _FORMATS[fmt]['parser'](use_builtin_types=use_builtin_types) + P = _FORMATS[fmt]['parser'] + p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) return p.parse(fp) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -207,6 +207,9 @@ for fmt in ALL_FORMATS: with self.subTest(fmt=fmt): pl = self._create(fmt=fmt) + pl2 = plistlib.loads(TESTDATA[fmt], fmt=fmt) + self.assertEqual(dict(pl), dict(pl2), + "generated data was not identical to Apple's output") pl2 = plistlib.loads(TESTDATA[fmt]) self.assertEqual(dict(pl), dict(pl2), "generated data was not identical to Apple's output") @@ -217,6 +220,8 @@ b = BytesIO() pl = self._create(fmt=fmt) plistlib.dump(pl, b, fmt=fmt) + pl2 = plistlib.load(BytesIO(b.getvalue()), fmt=fmt) + self.assertEqual(dict(pl), dict(pl2)) pl2 = plistlib.load(BytesIO(b.getvalue())) self.assertEqual(dict(pl), dict(pl2)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #21888: plistlib's load() and loads() now work if the fmt parameter is + specified. + - Issue #22032: __qualname__ instead of __name__ is now always used to format fully qualified class names of Python implemented classes. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 18:25:25 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Jul 2014 18:25:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3hJMTx2Zggz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/80b62cb19a67 changeset: 91781:80b62cb19a67 branch: 3.4 parent: 91779:09746dc1a3b4 user: Victor Stinner date: Wed Jul 23 18:21:45 2014 +0200 summary: asyncio: sync with Tulip * Tulip issue 194: Don't use sys.getrefcount() in unit tests * signal.set_wakeup_fd() can now raise an OSError on Python 3.5 files: Lib/asyncio/unix_events.py | 6 +- Lib/test/test_asyncio/test_selector_events.py | 4 +- Lib/test/test_asyncio/test_unix_events.py | 17 ++++----- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -74,7 +74,7 @@ # event loop running in another thread cannot add a signal # handler. signal.set_wakeup_fd(self._csock.fileno()) - except ValueError as exc: + except (ValueError, OSError) as exc: raise RuntimeError(str(exc)) handle = events.Handle(callback, args, self) @@ -93,7 +93,7 @@ if not self._signal_handlers: try: signal.set_wakeup_fd(-1) - except ValueError as nexc: + except (ValueError, OSError) as nexc: logger.info('set_wakeup_fd(-1) failed: %s', nexc) if exc.errno == errno.EINVAL: @@ -138,7 +138,7 @@ if not self._signal_handlers: try: signal.set_wakeup_fd(-1) - except ValueError as exc: + except (ValueError, OSError) as exc: logger.info('set_wakeup_fd(-1) failed: %s', exc) return True diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -672,6 +672,8 @@ def test_connection_lost(self): exc = OSError() tr = _SelectorTransport(self.loop, self.sock, self.protocol, None) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) tr._call_connection_lost(exc) self.protocol.connection_lost.assert_called_with(exc) @@ -679,8 +681,6 @@ self.assertIsNone(tr._sock) self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -435,6 +435,8 @@ def test__call_connection_lost(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = None tr._call_connection_lost(err) @@ -442,13 +444,13 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test__call_connection_lost_with_err(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = OSError() tr._call_connection_lost(err) @@ -456,9 +458,6 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) @@ -717,6 +716,8 @@ def test__call_connection_lost(self): tr = unix_events._UnixWritePipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = None tr._call_connection_lost(err) @@ -724,13 +725,13 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test__call_connection_lost_with_err(self): tr = unix_events._UnixWritePipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = OSError() tr._call_connection_lost(err) @@ -738,8 +739,6 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test_close(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 18:25:26 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Jul 2014 18:25:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3hJMTy5XDBz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/2df1bf279bdf changeset: 91782:2df1bf279bdf parent: 91780:275d02865d11 parent: 91781:80b62cb19a67 user: Victor Stinner date: Wed Jul 23 18:24:12 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip * Tulip issue 194: Don't use sys.getrefcount() in unit tests * signal.set_wakeup_fd() can now raise an OSError on Python 3.5 files: Lib/asyncio/unix_events.py | 6 +- Lib/test/test_asyncio/test_selector_events.py | 4 +- Lib/test/test_asyncio/test_unix_events.py | 17 ++++----- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -74,7 +74,7 @@ # event loop running in another thread cannot add a signal # handler. signal.set_wakeup_fd(self._csock.fileno()) - except ValueError as exc: + except (ValueError, OSError) as exc: raise RuntimeError(str(exc)) handle = events.Handle(callback, args, self) @@ -93,7 +93,7 @@ if not self._signal_handlers: try: signal.set_wakeup_fd(-1) - except ValueError as nexc: + except (ValueError, OSError) as nexc: logger.info('set_wakeup_fd(-1) failed: %s', nexc) if exc.errno == errno.EINVAL: @@ -138,7 +138,7 @@ if not self._signal_handlers: try: signal.set_wakeup_fd(-1) - except ValueError as exc: + except (ValueError, OSError) as exc: logger.info('set_wakeup_fd(-1) failed: %s', exc) return True diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -672,6 +672,8 @@ def test_connection_lost(self): exc = OSError() tr = _SelectorTransport(self.loop, self.sock, self.protocol, None) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) tr._call_connection_lost(exc) self.protocol.connection_lost.assert_called_with(exc) @@ -679,8 +681,6 @@ self.assertIsNone(tr._sock) self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -435,6 +435,8 @@ def test__call_connection_lost(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = None tr._call_connection_lost(err) @@ -442,13 +444,13 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test__call_connection_lost_with_err(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = OSError() tr._call_connection_lost(err) @@ -456,9 +458,6 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) @@ -717,6 +716,8 @@ def test__call_connection_lost(self): tr = unix_events._UnixWritePipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = None tr._call_connection_lost(err) @@ -724,13 +725,13 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test__call_connection_lost_with_err(self): tr = unix_events._UnixWritePipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = OSError() tr._call_connection_lost(err) @@ -738,8 +739,6 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test_close(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 19:07:12 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 23 Jul 2014 19:07:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDAy?= =?utf-8?q?=3A_Make_full_use_of_test_discovery_in_test_sub-packages=2E?= Message-ID: <3hJNQ84tvRz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/4f9f7e0fe1fd changeset: 91783:4f9f7e0fe1fd branch: 3.4 parent: 91781:80b62cb19a67 user: Zachary Ware date: Wed Jul 23 12:00:29 2014 -0500 summary: Issue #22002: Make full use of test discovery in test sub-packages. Adds `load_package_tests` function to test.support, uses it in test_asyncio, test_email, test_json, test_tools, test_importlib and all test_importlib sub-packages to implement test discovery. files: Doc/library/test.rst | 17 ++++- Lib/test/support/__init__.py | 21 +++++- Lib/test/test_asyncio/__init__.py | 25 +------ Lib/test/test_asyncio/__main__.py | 7 +- Lib/test/test_email/__init__.py | 23 +----- Lib/test/test_email/__main__.py | 5 +- Lib/test/test_importlib/__init__.py | 34 +--------- Lib/test/test_importlib/__main__.py | 11 +-- Lib/test/test_importlib/builtin/__init__.py | 13 +-- Lib/test/test_importlib/builtin/__main__.py | 4 + Lib/test/test_importlib/extension/__init__.py | 16 +--- Lib/test/test_importlib/extension/__main__.py | 4 + Lib/test/test_importlib/frozen/__init__.py | 16 +--- Lib/test/test_importlib/frozen/__main__.py | 4 + Lib/test/test_importlib/import_/__init__.py | 16 +--- Lib/test/test_importlib/import_/__main__.py | 4 + Lib/test/test_importlib/source/__init__.py | 16 +--- Lib/test/test_importlib/source/__main__.py | 4 + Lib/test/test_json/__init__.py | 19 +---- Lib/test/test_tools/__init__.py | 10 +-- Misc/NEWS | 4 + 21 files changed, 104 insertions(+), 169 deletions(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -461,7 +461,7 @@ .. function:: make_bad_fd() Create an invalid file descriptor by opening and closing a temporary file, - and returning its descripor. + and returning its descriptor. .. function:: import_module(name, deprecated=False) @@ -554,6 +554,21 @@ run simultaneously, which is a problem for buildbots. +.. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern) + + Generic implementation of the :mod:`unittest` ``load_tests`` protocol for + use in test packages. *pkg_dir* is the root directory of the package; + *loader*, *standard_tests*, and *pattern* are the arguments expected by + ``load_tests``. In simple cases, the test package's ``__init__.py`` + can be the following:: + + import os + from test.support import load_package_tests + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + + The :mod:`test.support` module defines the following classes: .. class:: TransientResource(exc, **kwargs) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -85,7 +85,7 @@ "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", - "anticipate_failure", + "anticipate_failure", "load_package_tests", # sys "is_jython", "check_impl_detail", # network @@ -188,6 +188,25 @@ return unittest.expectedFailure return lambda f: f +def load_package_tests(pkg_dir, loader, standard_tests, pattern): + """Generic load_tests implementation for simple test packages. + + Most packages can implement load_tests using this function as follows: + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + """ + if pattern is None: + pattern = "test*" + top_dir = os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__))) # support + package_tests = loader.discover(start_dir=pkg_dir, + top_level_dir=top_dir, + pattern=pattern) + standard_tests.addTests(package_tests) + return standard_tests + def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): """Import and return a module, deliberately bypassing sys.modules. diff --git a/Lib/test/test_asyncio/__init__.py b/Lib/test/test_asyncio/__init__.py --- a/Lib/test/test_asyncio/__init__.py +++ b/Lib/test/test_asyncio/__init__.py @@ -1,29 +1,10 @@ import os -import sys -import unittest -from test.support import run_unittest, import_module +from test.support import load_package_tests, import_module # Skip tests if we don't have threading. import_module('threading') # Skip tests if we don't have concurrent.futures. import_module('concurrent.futures') - -def suite(): - tests = unittest.TestSuite() - loader = unittest.TestLoader() - for fn in os.listdir(os.path.dirname(__file__)): - if fn.startswith("test") and fn.endswith(".py"): - mod_name = 'test.test_asyncio.' + fn[:-3] - try: - __import__(mod_name) - except unittest.SkipTest: - pass - else: - mod = sys.modules[mod_name] - tests.addTests(loader.loadTestsFromModule(mod)) - return tests - - -def test_main(): - run_unittest(suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_asyncio/__main__.py b/Lib/test/test_asyncio/__main__.py --- a/Lib/test/test_asyncio/__main__.py +++ b/Lib/test/test_asyncio/__main__.py @@ -1,5 +1,4 @@ -from . import test_main +from . import load_tests +import unittest - -if __name__ == '__main__': - test_main() +unittest.main() diff --git a/Lib/test/test_email/__init__.py b/Lib/test/test_email/__init__.py --- a/Lib/test/test_email/__init__.py +++ b/Lib/test/test_email/__init__.py @@ -1,31 +1,16 @@ import os import sys import unittest -import test.support import collections import email from email.message import Message from email._policybase import compat32 +from test.support import load_package_tests from test.test_email import __file__ as landmark -# Run all tests in package for '-m unittest test.test_email' -def load_tests(loader, standard_tests, pattern): - this_dir = os.path.dirname(__file__) - if pattern is None: - pattern = "test*" - package_tests = loader.discover(start_dir=this_dir, pattern=pattern) - standard_tests.addTests(package_tests) - return standard_tests - - -# used by regrtest and __main__. -def test_main(): - here = os.path.dirname(__file__) - # Unittest mucks with the path, so we have to save and restore - # it to keep regrtest happy. - savepath = sys.path[:] - test.support._run_suite(unittest.defaultTestLoader.discover(here)) - sys.path[:] = savepath +# Load all tests in package +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) # helper code used by a number of test modules. diff --git a/Lib/test/test_email/__main__.py b/Lib/test/test_email/__main__.py --- a/Lib/test/test_email/__main__.py +++ b/Lib/test/test_email/__main__.py @@ -1,3 +1,4 @@ -from test.test_email import test_main +from test.test_email import load_tests +import unittest -test_main() +unittest.main() diff --git a/Lib/test/test_importlib/__init__.py b/Lib/test/test_importlib/__init__.py --- a/Lib/test/test_importlib/__init__.py +++ b/Lib/test/test_importlib/__init__.py @@ -1,33 +1,5 @@ import os -import sys -from test import support -import unittest +from test.support import load_package_tests -def test_suite(package=__package__, directory=os.path.dirname(__file__)): - suite = unittest.TestSuite() - for name in os.listdir(directory): - if name.startswith(('.', '__')): - continue - path = os.path.join(directory, name) - if (os.path.isfile(path) and name.startswith('test_') and - name.endswith('.py')): - submodule_name = os.path.splitext(name)[0] - module_name = "{0}.{1}".format(package, submodule_name) - __import__(module_name, level=0) - module_tests = unittest.findTestCases(sys.modules[module_name]) - suite.addTest(module_tests) - elif os.path.isdir(path): - package_name = "{0}.{1}".format(package, name) - __import__(package_name, level=0) - package_tests = getattr(sys.modules[package_name], 'test_suite')() - suite.addTest(package_tests) - else: - continue - return suite - - -def test_main(): - start_dir = os.path.dirname(__file__) - top_dir = os.path.dirname(os.path.dirname(start_dir)) - test_loader = unittest.TestLoader() - support.run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir)) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/__main__.py b/Lib/test/test_importlib/__main__.py --- a/Lib/test/test_importlib/__main__.py +++ b/Lib/test/test_importlib/__main__.py @@ -1,9 +1,4 @@ -"""Run importlib's test suite. +from . import load_tests +import unittest -Specifying the ``--builtin`` flag will run tests, where applicable, with -builtins.__import__ instead of importlib.__import__. - -""" -if __name__ == '__main__': - from . import test_main - test_main() +unittest.main() diff --git a/Lib/test/test_importlib/builtin/__init__.py b/Lib/test/test_importlib/builtin/__init__.py --- a/Lib/test/test_importlib/builtin/__init__.py +++ b/Lib/test/test_importlib/builtin/__init__.py @@ -1,12 +1,5 @@ -from .. import test_suite import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.builtin', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/builtin/__main__.py b/Lib/test/test_importlib/builtin/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/builtin/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/extension/__init__.py b/Lib/test/test_importlib/extension/__init__.py --- a/Lib/test/test_importlib/extension/__init__.py +++ b/Lib/test/test_importlib/extension/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.extension', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/extension/__main__.py b/Lib/test/test_importlib/extension/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/extension/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/frozen/__init__.py b/Lib/test/test_importlib/frozen/__init__.py --- a/Lib/test/test_importlib/frozen/__init__.py +++ b/Lib/test/test_importlib/frozen/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.frozen', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/frozen/__main__.py b/Lib/test/test_importlib/frozen/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/frozen/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/import_/__init__.py b/Lib/test/test_importlib/import_/__init__.py --- a/Lib/test/test_importlib/import_/__init__.py +++ b/Lib/test/test_importlib/import_/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.import_', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/import_/__main__.py b/Lib/test/test_importlib/import_/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/import_/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/source/__init__.py b/Lib/test/test_importlib/source/__init__.py --- a/Lib/test/test_importlib/source/__init__.py +++ b/Lib/test/test_importlib/source/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test.test_suite('importlib.test.source', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/source/__main__.py b/Lib/test/test_importlib/source/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/source/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_json/__init__.py b/Lib/test/test_json/__init__.py --- a/Lib/test/test_json/__init__.py +++ b/Lib/test/test_json/__init__.py @@ -42,23 +42,12 @@ '_json') -here = os.path.dirname(__file__) - -def load_tests(*args): - suite = additional_tests() - loader = unittest.TestLoader() - for fn in os.listdir(here): - if fn.startswith("test") and fn.endswith(".py"): - modname = "test.test_json." + fn[:-3] - __import__(modname) - module = sys.modules[modname] - suite.addTests(loader.loadTestsFromModule(module)) - return suite - -def additional_tests(): +def load_tests(loader, _, pattern): suite = unittest.TestSuite() for mod in (json, json.encoder, json.decoder): suite.addTest(doctest.DocTestSuite(mod)) suite.addTest(TestPyTest('test_pyjson')) suite.addTest(TestCTest('test_cjson')) - return suite + + pkg_dir = os.path.dirname(__file__) + return support.load_package_tests(pkg_dir, loader, suite, pattern) diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py --- a/Lib/test/test_tools/__init__.py +++ b/Lib/test/test_tools/__init__.py @@ -21,11 +21,5 @@ with support.DirsOnSysPath(scriptsdir): return importlib.import_module(toolname) -def load_tests(loader, standard_tests, pattern): - this_dir = os.path.dirname(__file__) - if pattern is None: - pattern = "test*" - with support.DirsOnSysPath(): - package_tests = loader.discover(start_dir=this_dir, pattern=pattern) - standard_tests.addTests(package_tests) - return standard_tests +def load_tests(*args): + return support.load_package_tests(os.path.dirname(__file__), *args) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -209,6 +209,10 @@ Tests ----- +- Issue #22002: Added ``load_package_tests`` function to test.support and used + it to implement/augment test discovery in test_asyncio, test_email, + test_importlib, test_json, and test_tools. + - Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 19:07:14 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 23 Jul 2014 19:07:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Closes_=2322002=3A_Merge_with_3=2E4?= Message-ID: <3hJNQB1rBcz7LkC@mail.python.org> http://hg.python.org/cpython/rev/6298895a52de changeset: 91784:6298895a52de parent: 91782:2df1bf279bdf parent: 91783:4f9f7e0fe1fd user: Zachary Ware date: Wed Jul 23 12:06:47 2014 -0500 summary: Closes #22002: Merge with 3.4 files: Doc/library/test.rst | 17 ++++- Lib/test/support/__init__.py | 21 +++++- Lib/test/test_asyncio/__init__.py | 25 +------ Lib/test/test_asyncio/__main__.py | 7 +- Lib/test/test_email/__init__.py | 23 +----- Lib/test/test_email/__main__.py | 5 +- Lib/test/test_importlib/__init__.py | 34 +--------- Lib/test/test_importlib/__main__.py | 11 +-- Lib/test/test_importlib/builtin/__init__.py | 13 +-- Lib/test/test_importlib/builtin/__main__.py | 4 + Lib/test/test_importlib/extension/__init__.py | 16 +--- Lib/test/test_importlib/extension/__main__.py | 4 + Lib/test/test_importlib/frozen/__init__.py | 16 +--- Lib/test/test_importlib/frozen/__main__.py | 4 + Lib/test/test_importlib/import_/__init__.py | 16 +--- Lib/test/test_importlib/import_/__main__.py | 4 + Lib/test/test_importlib/source/__init__.py | 16 +--- Lib/test/test_importlib/source/__main__.py | 4 + Lib/test/test_json/__init__.py | 19 +---- Lib/test/test_tools/__init__.py | 10 +-- Misc/NEWS | 4 + 21 files changed, 104 insertions(+), 169 deletions(-) diff --git a/Doc/library/test.rst b/Doc/library/test.rst --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -461,7 +461,7 @@ .. function:: make_bad_fd() Create an invalid file descriptor by opening and closing a temporary file, - and returning its descripor. + and returning its descriptor. .. function:: import_module(name, deprecated=False) @@ -554,6 +554,21 @@ run simultaneously, which is a problem for buildbots. +.. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern) + + Generic implementation of the :mod:`unittest` ``load_tests`` protocol for + use in test packages. *pkg_dir* is the root directory of the package; + *loader*, *standard_tests*, and *pattern* are the arguments expected by + ``load_tests``. In simple cases, the test package's ``__init__.py`` + can be the following:: + + import os + from test.support import load_package_tests + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + + The :mod:`test.support` module defines the following classes: .. class:: TransientResource(exc, **kwargs) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -85,7 +85,7 @@ "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", - "anticipate_failure", + "anticipate_failure", "load_package_tests", # sys "is_jython", "check_impl_detail", # network @@ -188,6 +188,25 @@ return unittest.expectedFailure return lambda f: f +def load_package_tests(pkg_dir, loader, standard_tests, pattern): + """Generic load_tests implementation for simple test packages. + + Most packages can implement load_tests using this function as follows: + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + """ + if pattern is None: + pattern = "test*" + top_dir = os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__))) # support + package_tests = loader.discover(start_dir=pkg_dir, + top_level_dir=top_dir, + pattern=pattern) + standard_tests.addTests(package_tests) + return standard_tests + def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): """Import and return a module, deliberately bypassing sys.modules. diff --git a/Lib/test/test_asyncio/__init__.py b/Lib/test/test_asyncio/__init__.py --- a/Lib/test/test_asyncio/__init__.py +++ b/Lib/test/test_asyncio/__init__.py @@ -1,29 +1,10 @@ import os -import sys -import unittest -from test.support import run_unittest, import_module +from test.support import load_package_tests, import_module # Skip tests if we don't have threading. import_module('threading') # Skip tests if we don't have concurrent.futures. import_module('concurrent.futures') - -def suite(): - tests = unittest.TestSuite() - loader = unittest.TestLoader() - for fn in os.listdir(os.path.dirname(__file__)): - if fn.startswith("test") and fn.endswith(".py"): - mod_name = 'test.test_asyncio.' + fn[:-3] - try: - __import__(mod_name) - except unittest.SkipTest: - pass - else: - mod = sys.modules[mod_name] - tests.addTests(loader.loadTestsFromModule(mod)) - return tests - - -def test_main(): - run_unittest(suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_asyncio/__main__.py b/Lib/test/test_asyncio/__main__.py --- a/Lib/test/test_asyncio/__main__.py +++ b/Lib/test/test_asyncio/__main__.py @@ -1,5 +1,4 @@ -from . import test_main +from . import load_tests +import unittest - -if __name__ == '__main__': - test_main() +unittest.main() diff --git a/Lib/test/test_email/__init__.py b/Lib/test/test_email/__init__.py --- a/Lib/test/test_email/__init__.py +++ b/Lib/test/test_email/__init__.py @@ -1,31 +1,16 @@ import os import sys import unittest -import test.support import collections import email from email.message import Message from email._policybase import compat32 +from test.support import load_package_tests from test.test_email import __file__ as landmark -# Run all tests in package for '-m unittest test.test_email' -def load_tests(loader, standard_tests, pattern): - this_dir = os.path.dirname(__file__) - if pattern is None: - pattern = "test*" - package_tests = loader.discover(start_dir=this_dir, pattern=pattern) - standard_tests.addTests(package_tests) - return standard_tests - - -# used by regrtest and __main__. -def test_main(): - here = os.path.dirname(__file__) - # Unittest mucks with the path, so we have to save and restore - # it to keep regrtest happy. - savepath = sys.path[:] - test.support._run_suite(unittest.defaultTestLoader.discover(here)) - sys.path[:] = savepath +# Load all tests in package +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) # helper code used by a number of test modules. diff --git a/Lib/test/test_email/__main__.py b/Lib/test/test_email/__main__.py --- a/Lib/test/test_email/__main__.py +++ b/Lib/test/test_email/__main__.py @@ -1,3 +1,4 @@ -from test.test_email import test_main +from test.test_email import load_tests +import unittest -test_main() +unittest.main() diff --git a/Lib/test/test_importlib/__init__.py b/Lib/test/test_importlib/__init__.py --- a/Lib/test/test_importlib/__init__.py +++ b/Lib/test/test_importlib/__init__.py @@ -1,33 +1,5 @@ import os -import sys -from test import support -import unittest +from test.support import load_package_tests -def test_suite(package=__package__, directory=os.path.dirname(__file__)): - suite = unittest.TestSuite() - for name in os.listdir(directory): - if name.startswith(('.', '__')): - continue - path = os.path.join(directory, name) - if (os.path.isfile(path) and name.startswith('test_') and - name.endswith('.py')): - submodule_name = os.path.splitext(name)[0] - module_name = "{0}.{1}".format(package, submodule_name) - __import__(module_name, level=0) - module_tests = unittest.findTestCases(sys.modules[module_name]) - suite.addTest(module_tests) - elif os.path.isdir(path): - package_name = "{0}.{1}".format(package, name) - __import__(package_name, level=0) - package_tests = getattr(sys.modules[package_name], 'test_suite')() - suite.addTest(package_tests) - else: - continue - return suite - - -def test_main(): - start_dir = os.path.dirname(__file__) - top_dir = os.path.dirname(os.path.dirname(start_dir)) - test_loader = unittest.TestLoader() - support.run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir)) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/__main__.py b/Lib/test/test_importlib/__main__.py --- a/Lib/test/test_importlib/__main__.py +++ b/Lib/test/test_importlib/__main__.py @@ -1,9 +1,4 @@ -"""Run importlib's test suite. +from . import load_tests +import unittest -Specifying the ``--builtin`` flag will run tests, where applicable, with -builtins.__import__ instead of importlib.__import__. - -""" -if __name__ == '__main__': - from . import test_main - test_main() +unittest.main() diff --git a/Lib/test/test_importlib/builtin/__init__.py b/Lib/test/test_importlib/builtin/__init__.py --- a/Lib/test/test_importlib/builtin/__init__.py +++ b/Lib/test/test_importlib/builtin/__init__.py @@ -1,12 +1,5 @@ -from .. import test_suite import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.builtin', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/builtin/__main__.py b/Lib/test/test_importlib/builtin/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/builtin/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/extension/__init__.py b/Lib/test/test_importlib/extension/__init__.py --- a/Lib/test/test_importlib/extension/__init__.py +++ b/Lib/test/test_importlib/extension/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.extension', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/extension/__main__.py b/Lib/test/test_importlib/extension/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/extension/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/frozen/__init__.py b/Lib/test/test_importlib/frozen/__init__.py --- a/Lib/test/test_importlib/frozen/__init__.py +++ b/Lib/test/test_importlib/frozen/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.frozen', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/frozen/__main__.py b/Lib/test/test_importlib/frozen/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/frozen/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/import_/__init__.py b/Lib/test/test_importlib/import_/__init__.py --- a/Lib/test/test_importlib/import_/__init__.py +++ b/Lib/test/test_importlib/import_/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.import_', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/import_/__main__.py b/Lib/test/test_importlib/import_/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/import_/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/source/__init__.py b/Lib/test/test_importlib/source/__init__.py --- a/Lib/test/test_importlib/source/__init__.py +++ b/Lib/test/test_importlib/source/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test.test_suite('importlib.test.source', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/source/__main__.py b/Lib/test/test_importlib/source/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/source/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_json/__init__.py b/Lib/test/test_json/__init__.py --- a/Lib/test/test_json/__init__.py +++ b/Lib/test/test_json/__init__.py @@ -42,23 +42,12 @@ '_json') -here = os.path.dirname(__file__) - -def load_tests(*args): - suite = additional_tests() - loader = unittest.TestLoader() - for fn in os.listdir(here): - if fn.startswith("test") and fn.endswith(".py"): - modname = "test.test_json." + fn[:-3] - __import__(modname) - module = sys.modules[modname] - suite.addTests(loader.loadTestsFromModule(module)) - return suite - -def additional_tests(): +def load_tests(loader, _, pattern): suite = unittest.TestSuite() for mod in (json, json.encoder, json.decoder): suite.addTest(doctest.DocTestSuite(mod)) suite.addTest(TestPyTest('test_pyjson')) suite.addTest(TestCTest('test_cjson')) - return suite + + pkg_dir = os.path.dirname(__file__) + return support.load_package_tests(pkg_dir, loader, suite, pattern) diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py --- a/Lib/test/test_tools/__init__.py +++ b/Lib/test/test_tools/__init__.py @@ -21,11 +21,5 @@ with support.DirsOnSysPath(scriptsdir): return importlib.import_module(toolname) -def load_tests(loader, standard_tests, pattern): - this_dir = os.path.dirname(__file__) - if pattern is None: - pattern = "test*" - with support.DirsOnSysPath(): - package_tests = loader.discover(start_dir=this_dir, pattern=pattern) - standard_tests.addTests(package_tests) - return standard_tests +def load_tests(*args): + return support.load_package_tests(os.path.dirname(__file__), *args) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -716,6 +716,10 @@ Tests ----- +- Issue #22002: Added ``load_package_tests`` function to test.support and used + it to implement/augment test discovery in test_asyncio, test_email, + test_importlib, test_json, and test_tools. + - Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 19:43:25 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 19:43:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2315275=3A_Clean_up?= =?utf-8?q?_and_speed_up_the_ntpath_module=2E?= Message-ID: <3hJPCx39slzPYS@mail.python.org> http://hg.python.org/cpython/rev/b22aaa59d24f changeset: 91785:b22aaa59d24f user: Serhiy Storchaka date: Wed Jul 23 20:43:13 2014 +0300 summary: Issue #15275: Clean up and speed up the ntpath module. files: Lib/ntpath.py | 170 +++++++++++++++++-------------------- Misc/NEWS | 2 + 2 files changed, 79 insertions(+), 93 deletions(-) diff --git a/Lib/ntpath.py b/Lib/ntpath.py --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -32,48 +32,12 @@ defpath = '\\Windows' devnull = 'nul' -def _get_empty(path): - if isinstance(path, bytes): - return b'' - else: - return '' - -def _get_sep(path): - if isinstance(path, bytes): - return b'\\' - else: - return '\\' - -def _get_altsep(path): - if isinstance(path, bytes): - return b'/' - else: - return '/' - def _get_bothseps(path): if isinstance(path, bytes): return b'\\/' else: return '\\/' -def _get_dot(path): - if isinstance(path, bytes): - return b'.' - else: - return '.' - -def _get_colon(path): - if isinstance(path, bytes): - return b':' - else: - return ':' - -def _get_special(path): - if isinstance(path, bytes): - return (b'\\\\.\\', b'\\\\?\\') - else: - return ('\\\\.\\', '\\\\?\\') - # Normalize the case of a pathname and map slashes to backslashes. # Other normalizations (such as optimizing '../' away) are not done # (this is done by normpath). @@ -82,10 +46,16 @@ """Normalize case of pathname. Makes all characters lowercase and all slashes into backslashes.""" - if not isinstance(s, (bytes, str)): - raise TypeError("normcase() argument must be str or bytes, " - "not '{}'".format(s.__class__.__name__)) - return s.replace(_get_altsep(s), _get_sep(s)).lower() + try: + if isinstance(s, bytes): + return s.replace(b'/', b'\\').lower() + else: + return s.replace('/', '\\').lower() + except (TypeError, AttributeError): + if not isinstance(s, (bytes, str)): + raise TypeError("normcase() argument must be str or bytes, " + "not %r" % s.__class__.__name__) from None + raise # Return whether a path is absolute. @@ -97,14 +67,19 @@ def isabs(s): """Test whether a path is absolute""" s = splitdrive(s)[1] - return len(s) > 0 and s[:1] in _get_bothseps(s) + return len(s) > 0 and s[0] in _get_bothseps(s) # Join two (or more) paths. def join(path, *paths): - sep = _get_sep(path) - seps = _get_bothseps(path) - colon = _get_colon(path) + if isinstance(path, bytes): + sep = b'\\' + seps = b'\\/' + colon = b':' + else: + sep = '\\' + seps = '\\/' + colon = ':' result_drive, result_path = splitdrive(path) for p in paths: p_drive, p_path = splitdrive(p) @@ -155,10 +130,16 @@ Paths cannot contain both a drive letter and a UNC path. """ - empty = _get_empty(p) - if len(p) > 1: - sep = _get_sep(p) - normp = p.replace(_get_altsep(p), sep) + if len(p) >= 2: + if isinstance(p, bytes): + sep = b'\\' + altsep = b'/' + colon = b':' + else: + sep = '\\' + altsep = '/' + colon = ':' + normp = p.replace(altsep, sep) if (normp[0:2] == sep*2) and (normp[2:3] != sep): # is a UNC path: # vvvvvvvvvvvvvvvvvvvv drive letter or UNC path @@ -166,18 +147,18 @@ # directory ^^^^^^^^^^^^^^^ index = normp.find(sep, 2) if index == -1: - return empty, p + return p[:0], p index2 = normp.find(sep, index + 1) # a UNC path can't have two slashes in a row # (after the initial two) if index2 == index + 1: - return empty, p + return p[:0], p if index2 == -1: index2 = len(p) return p[:index2], p[index2:] - if normp[1:2] == _get_colon(p): + if normp[1:2] == colon: return p[:2], p[2:] - return empty, p + return p[:0], p # Parse UNC paths @@ -221,10 +202,7 @@ i -= 1 head, tail = p[:i], p[i:] # now tail has no slashes # remove trailing slashes from head, unless it's all slashes - head2 = head - while head2 and head2[-1:] in seps: - head2 = head2[:-1] - head = head2 or head + head = head.rstrip(seps) or head return d + head, tail @@ -234,8 +212,10 @@ # It is always true that root + ext == p. def splitext(p): - return genericpath._splitext(p, _get_sep(p), _get_altsep(p), - _get_dot(p)) + if isinstance(p, bytes): + return genericpath._splitext(p, b'\\', b'/', b'.') + else: + return genericpath._splitext(p, '\\', '/', '.') splitext.__doc__ = genericpath._splitext.__doc__ @@ -343,7 +323,7 @@ userhome = join(drive, os.environ['HOMEPATH']) if isinstance(path, bytes): - userhome = userhome.encode(sys.getfilesystemencoding()) + userhome = os.fsencode(userhome) if i != 1: #~user userhome = join(dirname(userhome), path[1:i]) @@ -369,13 +349,14 @@ Unknown variables are left unchanged.""" if isinstance(path, bytes): - if ord('$') not in path and ord('%') not in path: + if b'$' not in path and b'%' not in path: return path import string varchars = bytes(string.ascii_letters + string.digits + '_-', 'ascii') quote = b'\'' percent = b'%' brace = b'{' + rbrace = b'}' dollar = b'$' environ = getattr(os, 'environb', None) else: @@ -386,6 +367,7 @@ quote = '\'' percent = '%' brace = '{' + rbrace = '}' dollar = '$' environ = os.environ res = path[:0] @@ -432,15 +414,9 @@ path = path[index+2:] pathlen = len(path) try: - if isinstance(path, bytes): - index = path.index(b'}') - else: - index = path.index('}') + index = path.index(rbrace) except ValueError: - if isinstance(path, bytes): - res += b'${' + path - else: - res += '${' + path + res += dollar + brace + path index = pathlen - 1 else: var = path[:index] @@ -450,10 +426,7 @@ else: value = environ[var] except KeyError: - if isinstance(path, bytes): - value = b'${' + var + b'}' - else: - value = '${' + var + '}' + value = dollar + brace + var + rbrace res += value else: var = path[:0] @@ -485,16 +458,25 @@ def normpath(path): """Normalize path, eliminating double slashes, etc.""" - sep = _get_sep(path) - dotdot = _get_dot(path) * 2 - special_prefixes = _get_special(path) + if isinstance(path, bytes): + sep = b'\\' + altsep = b'/' + curdir = b'.' + pardir = b'..' + special_prefixes = (b'\\\\.\\', b'\\\\?\\') + else: + sep = '\\' + altsep = '/' + curdir = '.' + pardir = '..' + special_prefixes = ('\\\\.\\', '\\\\?\\') if path.startswith(special_prefixes): # in the case of paths with these prefixes: # \\.\ -> device names # \\?\ -> literal paths # do not do any normalization, but return the path unchanged return path - path = path.replace(_get_altsep(path), sep) + path = path.replace(altsep, sep) prefix, path = splitdrive(path) # collapse initial backslashes @@ -505,13 +487,13 @@ comps = path.split(sep) i = 0 while i < len(comps): - if not comps[i] or comps[i] == _get_dot(path): + if not comps[i] or comps[i] == curdir: del comps[i] - elif comps[i] == dotdot: - if i > 0 and comps[i-1] != dotdot: + elif comps[i] == pardir: + if i > 0 and comps[i-1] != pardir: del comps[i-1:i+1] i -= 1 - elif i == 0 and prefix.endswith(_get_sep(path)): + elif i == 0 and prefix.endswith(sep): del comps[i] else: i += 1 @@ -519,7 +501,7 @@ i += 1 # If the path is now empty, substitute '.' if not prefix and not comps: - comps.append(_get_dot(path)) + comps.append(curdir) return prefix + sep.join(comps) @@ -559,12 +541,19 @@ supports_unicode_filenames = (hasattr(sys, "getwindowsversion") and sys.getwindowsversion()[3] >= 2) -def relpath(path, start=curdir): +def relpath(path, start=None): """Return a relative version of a path""" - sep = _get_sep(path) + if isinstance(path, bytes): + sep = b'\\' + curdir = b'.' + pardir = b'..' + else: + sep = '\\' + curdir = '.' + pardir = '..' - if start is curdir: - start = _get_dot(path) + if start is None: + start = curdir if not path: raise ValueError("no path specified") @@ -574,9 +563,8 @@ start_drive, start_rest = splitdrive(start_abs) path_drive, path_rest = splitdrive(path_abs) if normcase(start_drive) != normcase(path_drive): - error = "path is on mount '{0}', start on mount '{1}'".format( - path_drive, start_drive) - raise ValueError(error) + raise ValueError("path is on mount %r, start on mount %r" % ( + path_drive, start_drive)) start_list = [x for x in start_rest.split(sep) if x] path_list = [x for x in path_rest.split(sep) if x] @@ -587,13 +575,9 @@ break i += 1 - if isinstance(path, bytes): - pardir = b'..' - else: - pardir = '..' rel_list = [pardir] * (len(start_list)-i) + path_list[i:] if not rel_list: - return _get_dot(path) + return curdir return join(*rel_list) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,8 @@ Library ------- +- Issue #15275: Clean up and speed up the ntpath module. + - Issue #21888: plistlib's load() and loads() now work if the fmt parameter is specified. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 20:28:59 2014 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 23 Jul 2014 20:28:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321566=3A_Make_use?= =?utf-8?q?_of_socket=2Elisten=28=29_default_backlog=2E?= Message-ID: <3hJQDW6jLNz7LjS@mail.python.org> http://hg.python.org/cpython/rev/f7643c893587 changeset: 91786:f7643c893587 user: Charles-Fran?ois Natali date: Wed Jul 23 19:28:13 2014 +0100 summary: Issue #21566: Make use of socket.listen() default backlog. files: Lib/multiprocessing/forkserver.py | 2 +- Lib/test/_test_multiprocessing.py | 4 ++-- Lib/test/test_asynchat.py | 2 +- Lib/test/test_asyncio/test_events.py | 2 +- Lib/test/test_asyncore.py | 2 +- Lib/test/test_epoll.py | 2 +- Lib/test/test_ftplib.py | 6 +++--- Lib/test/test_httplib.py | 4 ++-- Lib/test/test_kqueue.py | 2 +- Lib/test/test_poplib.py | 2 +- Lib/test/test_selectors.py | 2 +- Lib/test/test_smtplib.py | 2 +- Lib/test/test_socket.py | 10 +++++----- Lib/test/test_ssl.py | 10 +++++----- Lib/test/test_support.py | 2 +- Lib/test/test_telnetlib.py | 2 +- Lib/test/test_timeout.py | 8 ++++---- Lib/test/test_urllib.py | 2 +- 18 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Lib/multiprocessing/forkserver.py b/Lib/multiprocessing/forkserver.py --- a/Lib/multiprocessing/forkserver.py +++ b/Lib/multiprocessing/forkserver.py @@ -107,7 +107,7 @@ address = connection.arbitrary_address('AF_UNIX') listener.bind(address) os.chmod(address, 0o600) - listener.listen(100) + listener.listen() # all client processes own the write end of the "alive" pipe; # when they all terminate the read end becomes ready. 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 @@ -2543,7 +2543,7 @@ l = socket.socket() l.bind((test.support.HOST, 0)) - l.listen(1) + l.listen() conn.send(l.getsockname()) new_conn, addr = l.accept() conn.send(new_conn) @@ -3190,7 +3190,7 @@ from multiprocessing.connection import wait l = socket.socket() l.bind((test.support.HOST, 0)) - l.listen(4) + l.listen() addr = l.getsockname() readers = [] procs = [] diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -37,7 +37,7 @@ self.start_resend_event = None def run(self): - self.sock.listen(1) + self.sock.listen() self.event.set() conn, client = self.sock.accept() self.buffer = b"" diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -428,7 +428,7 @@ listener = socket.socket() listener.setblocking(False) listener.bind(('127.0.0.1', 0)) - listener.listen(1) + listener.listen() client = socket.socket() client.connect(listener.getsockname()) 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 @@ -64,7 +64,7 @@ # used when testing senders; just collects what it gets until newline is sent def capture_server(evt, buf, serv): try: - serv.listen(5) + serv.listen() conn, addr = serv.accept() except socket.timeout: pass diff --git a/Lib/test/test_epoll.py b/Lib/test/test_epoll.py --- a/Lib/test/test_epoll.py +++ b/Lib/test/test_epoll.py @@ -44,7 +44,7 @@ def setUp(self): self.serverSocket = socket.socket() self.serverSocket.bind(('127.0.0.1', 0)) - self.serverSocket.listen(1) + self.serverSocket.listen() self.connections = [self.serverSocket] def tearDown(self): diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py --- a/Lib/test/test_ftplib.py +++ b/Lib/test/test_ftplib.py @@ -137,7 +137,7 @@ def cmd_pasv(self, arg): with socket.socket() as sock: sock.bind((self.socket.getsockname()[0], 0)) - sock.listen(5) + sock.listen() sock.settimeout(TIMEOUT) ip, port = sock.getsockname()[:2] ip = ip.replace('.', ','); p1 = port / 256; p2 = port % 256 @@ -155,7 +155,7 @@ def cmd_epsv(self, arg): with socket.socket(socket.AF_INET6) as sock: sock.bind((self.socket.getsockname()[0], 0)) - sock.listen(5) + sock.listen() sock.settimeout(TIMEOUT) port = sock.getsockname()[1] self.push('229 entering extended passive mode (|||%d|)' %port) @@ -983,7 +983,7 @@ # 1) when the connection is ready to be accepted. # 2) when it is safe for the caller to close the connection # 3) when we have closed the socket - self.sock.listen(5) + self.sock.listen() # (1) Signal the caller that we are ready to accept the connection. self.evt.set() try: 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 @@ -919,7 +919,7 @@ self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.port = support.bind_port(self.serv) self.source_port = support.find_unused_port() - self.serv.listen(5) + self.serv.listen() self.conn = None def tearDown(self): @@ -951,7 +951,7 @@ def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) TimeoutTest.PORT = support.bind_port(self.serv) - self.serv.listen(5) + self.serv.listen() def tearDown(self): self.serv.close() diff --git a/Lib/test/test_kqueue.py b/Lib/test/test_kqueue.py --- a/Lib/test/test_kqueue.py +++ b/Lib/test/test_kqueue.py @@ -89,7 +89,7 @@ def test_queue_event(self): serverSocket = socket.socket() serverSocket.bind(('127.0.0.1', 0)) - serverSocket.listen(1) + serverSocket.listen() client = socket.socket() client.setblocking(False) try: diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py --- a/Lib/test/test_poplib.py +++ b/Lib/test/test_poplib.py @@ -451,7 +451,7 @@ del self.thread # Clear out any dangling Thread objects. def server(self, evt, serv): - serv.listen(5) + serv.listen() evt.set() try: conn, addr = serv.accept() diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py --- a/Lib/test/test_selectors.py +++ b/Lib/test/test_selectors.py @@ -24,7 +24,7 @@ def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0): with socket.socket(family, type, proto) as l: l.bind((support.HOST, 0)) - l.listen(3) + l.listen() c = socket.socket(family, type, proto) try: c.connect(l.getsockname()) diff --git a/Lib/test/test_smtplib.py b/Lib/test/test_smtplib.py --- a/Lib/test/test_smtplib.py +++ b/Lib/test/test_smtplib.py @@ -31,7 +31,7 @@ def server(evt, buf, serv): - serv.listen(5) + serv.listen() evt.set() try: conn, addr = serv.accept() 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 @@ -72,7 +72,7 @@ def setUp(self): self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.port = support.bind_port(self.serv) - self.serv.listen(1) + self.serv.listen() def tearDown(self): self.serv.close() @@ -441,7 +441,7 @@ def setUp(self): super().setUp() - self.serv.listen(1) + self.serv.listen() class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase, @@ -3784,7 +3784,7 @@ self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM | socket.SOCK_NONBLOCK) self.port = support.bind_port(self.serv) - self.serv.listen(1) + self.serv.listen() # actual testing start = time.time() try: @@ -4559,7 +4559,7 @@ address = b"\x00python-test-hello\x00\xff" with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1: s1.bind(address) - s1.listen(1) + s1.listen() with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2: s2.connect(s1.getsockname()) with s1.accept()[0] as s3: @@ -4791,7 +4791,7 @@ srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE, TIPC_LOWER, TIPC_UPPER) self.srv.bind(srvaddr) - self.srv.listen(5) + self.srv.listen() self.serverExplicitReady() self.conn, self.connaddr = self.srv.accept() self.addCleanup(self.conn.close) 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 @@ -1211,7 +1211,7 @@ ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1) with socket.socket() as s: s.bind(("127.0.0.1", 0)) - s.listen(5) + s.listen() c = socket.socket() c.connect(s.getsockname()) c.setblocking(False) @@ -1736,7 +1736,7 @@ def run(self): self.sock.settimeout(0.05) - self.sock.listen(5) + self.sock.listen() self.active = True if self.flag: # signal an event @@ -2162,7 +2162,7 @@ # and sets Event `listener_gone` to let the main thread know # the socket is gone. def listener(): - s.listen(5) + s.listen() listener_ready.set() newsock, addr = s.accept() newsock.close() @@ -2590,7 +2590,7 @@ finish = False def serve(): - server.listen(5) + server.listen() started.set() conns = [] while not finish: @@ -2647,7 +2647,7 @@ peer = None def serve(): nonlocal remote, peer - server.listen(5) + server.listen() # Block on the accept and wait on the connection to close. evt.set() remote, peer = server.accept() diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -84,7 +84,7 @@ def test_bind_port(self): s = socket.socket() support.bind_port(s) - s.listen(1) + s.listen() s.close() # Tests for temp_dir() diff --git a/Lib/test/test_telnetlib.py b/Lib/test/test_telnetlib.py --- a/Lib/test/test_telnetlib.py +++ b/Lib/test/test_telnetlib.py @@ -11,7 +11,7 @@ HOST = support.HOST def server(evt, serv): - serv.listen(5) + serv.listen() evt.set() try: conn, addr = serv.accept() diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -243,14 +243,14 @@ def testAcceptTimeout(self): # Test accept() timeout support.bind_port(self.sock, self.localhost) - self.sock.listen(5) + self.sock.listen() self._sock_operation(1, 1.5, 'accept') def testSend(self): # Test send() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: support.bind_port(serv, self.localhost) - serv.listen(5) + serv.listen() self.sock.connect(serv.getsockname()) # Send a lot of data in order to bypass buffering in the TCP stack. self._sock_operation(100, 1.5, 'send', b"X" * 200000) @@ -259,7 +259,7 @@ # Test sendto() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: support.bind_port(serv, self.localhost) - serv.listen(5) + serv.listen() self.sock.connect(serv.getsockname()) # The address argument is ignored since we already connected. self._sock_operation(100, 1.5, 'sendto', b"X" * 200000, @@ -269,7 +269,7 @@ # Test sendall() timeout with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as serv: support.bind_port(serv, self.localhost) - serv.listen(5) + serv.listen() self.sock.connect(serv.getsockname()) # Send a lot of data in order to bypass buffering in the TCP stack. self._sock_operation(100, 1.5, 'sendall', b"X" * 200000) 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 @@ -1333,7 +1333,7 @@ # serv.settimeout(3) # serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # serv.bind(("", 9093)) -# serv.listen(5) +# serv.listen() # try: # conn, addr = serv.accept() # conn.send("1 Hola mundo\n") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:01:56 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 23 Jul 2014 21:01:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxNTk3?= =?utf-8?q?=3A_Turtledemo_text_pane_can_now_be_widened_to_view_or_copy_com?= =?utf-8?q?plete?= Message-ID: <3hJQyX37TZz7LjW@mail.python.org> http://hg.python.org/cpython/rev/60301b9982b2 changeset: 91787:60301b9982b2 branch: 2.7 parent: 91772:5549075d6223 user: Terry Jan Reedy date: Wed Jul 23 15:01:07 2014 -0400 summary: Issue #21597: Turtledemo text pane can now be widened to view or copy complete lines or narrowed for small screens. Issie #19132: Turtledemo buttons no longer disappear when window is shrun. Patch mostly by Lita Cho (21597) using idea from patch by Jan Kanis (18132). files: Demo/turtle/turtleDemo.py | 165 ++++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 92 insertions(+), 74 deletions(-) diff --git a/Demo/turtle/turtleDemo.py b/Demo/turtle/turtleDemo.py --- a/Demo/turtle/turtleDemo.py +++ b/Demo/turtle/turtleDemo.py @@ -58,72 +58,47 @@ class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() - turtle.TurtleScreen.__init__(_s_, _s_._canvas) - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -132,9 +107,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -160,9 +172,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -172,17 +184,18 @@ self.loadfile(x) return emit if isinstance(entry,str): - CmdBtn.menu.add_command(label=entry[6:-3], underline=0, font=menufont, + CmdBtn.menu.add_command(label=entry[6:-3], underline=0, + font=menufont, command=loadexample(entry)) else: _dir, entries = entry[0], entry[1:] CmdBtn.menu.choices = Menu(CmdBtn.menu) for e in entries: - CmdBtn.menu.choices.add_command(label=e[6:-3], underline=0, font=menufont, - command = loadexample(os.path.join(_dir,e))) - - CmdBtn.menu.add_cascade(label=_dir[6:], - menu = CmdBtn.menu.choices, font=menufont ) + CmdBtn.menu.choices.add_command( + label=e[6:-3], underline=0, font=menufont, + command = loadexample(os.path.join(_dir,e))) + CmdBtn.menu.add_cascade( + label=_dir[6:], menu = CmdBtn.menu.choices, font=menufont) CmdBtn['menu'] = CmdBtn.menu return CmdBtn @@ -193,9 +206,12 @@ CmdBtn.pack(side=LEFT, padx='2m') CmdBtn.menu = Menu(CmdBtn) - CmdBtn.menu.add_command(label='About turtle.py', font=menufont, command=showAboutTurtle) - CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, command=showDemoHelp) - CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, command=showAboutDemo) + CmdBtn.menu.add_command(label='About turtle.py', font=menufont, + command=showAboutTurtle) + CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, + command=showDemoHelp) + CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, + command=showAboutDemo) CmdBtn['menu'] = CmdBtn.menu return CmdBtn @@ -203,7 +219,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self,filename): @@ -262,10 +277,12 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + sys.exit() if __name__ == '__main__': demo = DemoWindow() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -662,6 +662,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:01:57 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 23 Jul 2014 21:01:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNTk3?= =?utf-8?q?=3A_Turtledemo_text_pane_can_now_be_widened_to_view_or_copy_com?= =?utf-8?q?plete?= Message-ID: <3hJQyY5tRPz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/0fb515063324 changeset: 91788:0fb515063324 branch: 3.4 parent: 91783:4f9f7e0fe1fd user: Terry Jan Reedy date: Wed Jul 23 15:01:12 2014 -0400 summary: Issue #21597: Turtledemo text pane can now be widened to view or copy complete lines or narrowed for small screens. Issie #19132: Turtledemo buttons no longer disappear when window is shrun. Patch mostly by Lita Cho (21597) using idea from patch by Jan Kanis (18132). files: Lib/turtledemo/__main__.py | 146 +++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 80 insertions(+), 67 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -41,74 +41,47 @@ class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() -##### - turtle.TurtleScreen.__init__(_s_, _s_._canvas) -##### - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -117,9 +90,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -145,9 +155,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -180,7 +190,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self, filename): @@ -238,10 +247,13 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + sys.exit() + if __name__ == '__main__': demo = DemoWindow() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -662,6 +662,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:01:59 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 23 Jul 2014 21:01:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hJQyb2TYnz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/2f4836848a51 changeset: 91789:2f4836848a51 parent: 91786:f7643c893587 parent: 91788:0fb515063324 user: Terry Jan Reedy date: Wed Jul 23 15:01:29 2014 -0400 summary: Merge with 3.4 files: Lib/turtledemo/__main__.py | 146 +++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 80 insertions(+), 67 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -107,74 +107,47 @@ class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() -##### - turtle.TurtleScreen.__init__(_s_, _s_._canvas) -##### - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -183,9 +156,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -211,9 +221,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -246,7 +256,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self, filename): @@ -304,10 +313,13 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + sys.exit() + if __name__ == '__main__': demo = DemoWindow() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -668,6 +668,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:26 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=236167=3A_Scrollbar?= =?utf-8?q?=2Eactivate=28=29_now_returns_the_name_of_active_element_if?= Message-ID: <3hJRKZ3crcz7LjW@mail.python.org> http://hg.python.org/cpython/rev/6ae34a948cb4 changeset: 91790:6ae34a948cb4 parent: 91786:f7643c893587 user: Serhiy Storchaka date: Wed Jul 23 22:00:44 2014 +0300 summary: Issue #6167: Scrollbar.activate() now returns the name of active element if the argument is not specified. Scrollbar.set() now always accepts only 2 arguments. Added tests for Scrollbar.activate() and Scrollbar.set(). files: Lib/tkinter/__init__.py | 16 +++++--- Lib/tkinter/test/test_tkinter/test_widgets.py | 19 ++++++++++ Misc/NEWS | 4 ++ 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -2875,10 +2875,14 @@ relief, repeatdelay, repeatinterval, takefocus, troughcolor, width.""" Widget.__init__(self, master, 'scrollbar', cnf, kw) - def activate(self, index): - """Display the element at INDEX with activebackground and activerelief. - INDEX can be "arrow1","slider" or "arrow2".""" - self.tk.call(self._w, 'activate', index) + def activate(self, index=None): + """Marks the element indicated by index as active. + The only index values understood by this method are "arrow1", + "slider", or "arrow2". If any other value is specified then no + element of the scrollbar will be active. If index is not specified, + the method returns the name of the element that is currently active, + or None if no element is active.""" + return self.tk.call(self._w, 'activate', index) or None def delta(self, deltax, deltay): """Return the fractional change of the scrollbar setting if it would be moved by DELTAX or DELTAY pixels.""" @@ -2896,10 +2900,10 @@ """Return the current fractional values (upper and lower end) of the slider position.""" return self._getdoubles(self.tk.call(self._w, 'get')) - def set(self, *args): + def set(self, first, last): """Set the fractional values of the slider position (upper and lower ends as value between 0 and 1).""" - self.tk.call((self._w, 'set') + args) + self.tk.call(self._w, 'set', first, last) diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -916,6 +916,25 @@ self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal', errmsg='bad orientation "{}": must be vertical or horizontal') + def test_activate(self): + sb = self.create() + for e in ('arrow1', 'slider', 'arrow2'): + sb.activate(e) + self.assertEqual(sb.activate(), e) + sb.activate('') + self.assertIsNone(sb.activate()) + self.assertRaises(TypeError, sb.activate, 'arrow1', 'arrow2') + + def test_set(self): + sb = self.create() + sb.set(0.2, 0.4) + self.assertEqual(sb.get(), (0.2, 0.4)) + self.assertRaises(TclError, sb.set, 'abc', 'def') + self.assertRaises(TclError, sb.set, 0.6, 'def') + self.assertRaises(TclError, sb.set, 0.6, None) + self.assertRaises(TypeError, sb.set, 0.6) + self.assertRaises(TypeError, sb.set, 0.6, 0.7, 0.8) + @add_standard_options(StandardOptionsTests) class PanedWindowTest(AbstractWidgetTest, unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,10 @@ Library ------- +- Issue #6167: Scrollbar.activate() now returns the name of active element if + the argument is not specified. Scrollbar.set() now always accepts only 2 + arguments. + - Issue #15275: Clean up and speed up the ntpath module. - Issue #21888: plistlib's load() and loads() now work if the fmt parameter is -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:27 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzYxNjc6?= =?utf-8?q?_Backported_tests_for_Scrollbar=2Eactivate=28=29_and_Scrollbar?= =?utf-8?b?LnNldCgp?= Message-ID: <3hJRKb57wDz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/f5df571bfe1d changeset: 91791:f5df571bfe1d branch: 2.7 parent: 91766:30e29c1c4032 user: Serhiy Storchaka date: Wed Jul 23 22:06:26 2014 +0300 summary: Issue #6167: Backported tests for Scrollbar.activate() and Scrollbar.set() from 6ae34a948cb4. files: Lib/lib-tk/test/test_tkinter/test_widgets.py | 18 ++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) diff --git a/Lib/lib-tk/test/test_tkinter/test_widgets.py b/Lib/lib-tk/test/test_tkinter/test_widgets.py --- a/Lib/lib-tk/test/test_tkinter/test_widgets.py +++ b/Lib/lib-tk/test/test_tkinter/test_widgets.py @@ -913,6 +913,24 @@ self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal', errmsg='bad orientation "{}": must be vertical or horizontal') + def test_activate(self): + sb = self.create() + for e in ('arrow1', 'slider', 'arrow2'): + sb.activate(e) + sb.activate('') + self.assertRaises(TypeError, sb.activate) + self.assertRaises(TypeError, sb.activate, 'arrow1', 'arrow2') + + def test_set(self): + sb = self.create() + sb.set(0.2, 0.4) + self.assertEqual(sb.get(), (0.2, 0.4)) + self.assertRaises(TclError, sb.set, 'abc', 'def') + self.assertRaises(TclError, sb.set, 0.6, 'def') + self.assertRaises(TclError, sb.set, 0.6, None) + self.assertRaises(TclError, sb.set, 0.6) + self.assertRaises(TclError, sb.set, 0.6, 0.7, 0.8) + @add_standard_options(StandardOptionsTests) class PanedWindowTest(AbstractWidgetTest, unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:29 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3hJRKd0cd2z7Ljh@mail.python.org> http://hg.python.org/cpython/rev/345ce3d2986a changeset: 91792:345ce3d2986a branch: 2.7 parent: 91791:f5df571bfe1d parent: 91772:5549075d6223 user: Serhiy Storchaka date: Wed Jul 23 22:07:37 2014 +0300 summary: Merge heads files: Doc/library/functions.rst | 2 +- Tools/buildbot/external-amd64.bat | 18 +++++++++--------- Tools/buildbot/external.bat | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1229,7 +1229,7 @@ the decimal point. If *ndigits* is omitted, it defaults to zero. The result is a floating point number. Values are rounded to the closest multiple of 10 to the power minus *ndigits*; if two multiples are equally close, - rounding is done away from 0 (so. for example, ``round(0.5)`` is ``1.0`` and + rounding is done away from 0 (so, for example, ``round(0.5)`` is ``1.0`` and ``round(-0.5)`` is ``-1.0``). diff --git a/Tools/buildbot/external-amd64.bat b/Tools/buildbot/external-amd64.bat --- a/Tools/buildbot/external-amd64.bat +++ b/Tools/buildbot/external-amd64.bat @@ -6,23 +6,23 @@ if not exist tcltk64\bin\tcl85g.dll ( cd tcl-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 clean all + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 install cd ..\.. ) if not exist tcltk64\bin\tk85g.dll ( cd tk-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 clean - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 all - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 install + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 clean + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 all + nmake -f makefile.vc DEBUG=1 MACHINE=AMD64 INSTALLDIR=..\..\tcltk64 TCLDIR=..\..\tcl-8.5.15.0 install cd ..\.. ) if not exist tcltk64\lib\tix8.4.3\tix84g.dll ( cd tix-8.4.3.5\win - nmake -f python.mak DEBUG=1 MACHINE=AMD64 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 clean - nmake -f python.mak DEBUG=1 MACHINE=AMD64 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 all - nmake -f python.mak DEBUG=1 MACHINE=AMD64 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 install + nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 clean + nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 all + nmake -f python.mak DEBUG=1 MACHINE=AMD64 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk64 install cd ..\.. -) \ No newline at end of file +) diff --git a/Tools/buildbot/external.bat b/Tools/buildbot/external.bat --- a/Tools/buildbot/external.bat +++ b/Tools/buildbot/external.bat @@ -7,23 +7,23 @@ if not exist tcltk\bin\tcl85g.dll ( @rem all and install need to be separate invocations, otherwise nmakehlp is not found on install cd tcl-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 DEBUG=1 INSTALLDIR=..\..\tcltk clean all + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk clean all nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk install cd ..\.. ) if not exist tcltk\bin\tk85g.dll ( cd tk-8.5.15.0\win - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 clean - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 all - nmake -f makefile.vc COMPILERFLAGS=-DWINVER=0x0500 OPTS=noxp DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 install + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 clean + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 all + nmake -f makefile.vc DEBUG=1 INSTALLDIR=..\..\tcltk TCLDIR=..\..\tcl-8.5.15.0 install cd ..\.. ) if not exist tcltk\lib\tix8.4.3\tix84g.dll ( cd tix-8.4.3.5\win - nmake -f python.mak DEBUG=1 MACHINE=IX86 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk clean - nmake -f python.mak DEBUG=1 MACHINE=IX86 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk all - nmake -f python.mak DEBUG=1 MACHINE=IX86 COMPILERFLAGS=-DWINVER=0x0500 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk install + nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk clean + nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk all + nmake -f python.mak DEBUG=1 MACHINE=IX86 TCL_DIR=..\..\tcl-8.5.15.0 TK_DIR=..\..\tk-8.5.15.0 INSTALL_DIR=..\..\tcltk install cd ..\.. ) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:30 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzYxNjc6?= =?utf-8?q?_Backported_tests_for_Scrollbar=2Eactivate=28=29_and_Scrollbar?= =?utf-8?b?LnNldCgp?= Message-ID: <3hJRKf2NPXz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/2cac1e3f825a changeset: 91793:2cac1e3f825a branch: 3.4 parent: 91783:4f9f7e0fe1fd user: Serhiy Storchaka date: Wed Jul 23 22:08:45 2014 +0300 summary: Issue #6167: Backported tests for Scrollbar.activate() and Scrollbar.set() from 6ae34a948cb4. files: Lib/tkinter/test/test_tkinter/test_widgets.py | 18 ++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -916,6 +916,24 @@ self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal', errmsg='bad orientation "{}": must be vertical or horizontal') + def test_activate(self): + sb = self.create() + for e in ('arrow1', 'slider', 'arrow2'): + sb.activate(e) + sb.activate('') + self.assertRaises(TypeError, sb.activate) + self.assertRaises(TypeError, sb.activate, 'arrow1', 'arrow2') + + def test_set(self): + sb = self.create() + sb.set(0.2, 0.4) + self.assertEqual(sb.get(), (0.2, 0.4)) + self.assertRaises(TclError, sb.set, 'abc', 'def') + self.assertRaises(TclError, sb.set, 0.6, 'def') + self.assertRaises(TclError, sb.set, 0.6, None) + self.assertRaises(TclError, sb.set, 0.6) + self.assertRaises(TclError, sb.set, 0.6, 0.7, 0.8) + @add_standard_options(StandardOptionsTests) class PanedWindowTest(AbstractWidgetTest, unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:31 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3hJRKg3prcz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/bf0221ca3477 changeset: 91794:bf0221ca3477 parent: 91790:6ae34a948cb4 parent: 91793:2cac1e3f825a user: Serhiy Storchaka date: Wed Jul 23 22:09:45 2014 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:32 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3hJRKh6FWqz7LkF@mail.python.org> http://hg.python.org/cpython/rev/61656684d295 changeset: 91795:61656684d295 branch: 2.7 parent: 91792:345ce3d2986a parent: 91787:60301b9982b2 user: Serhiy Storchaka date: Wed Jul 23 22:12:39 2014 +0300 summary: Merge heads files: Demo/turtle/turtleDemo.py | 165 ++++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 92 insertions(+), 74 deletions(-) diff --git a/Demo/turtle/turtleDemo.py b/Demo/turtle/turtleDemo.py --- a/Demo/turtle/turtleDemo.py +++ b/Demo/turtle/turtleDemo.py @@ -58,72 +58,47 @@ class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() - turtle.TurtleScreen.__init__(_s_, _s_._canvas) - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -132,9 +107,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -160,9 +172,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -172,17 +184,18 @@ self.loadfile(x) return emit if isinstance(entry,str): - CmdBtn.menu.add_command(label=entry[6:-3], underline=0, font=menufont, + CmdBtn.menu.add_command(label=entry[6:-3], underline=0, + font=menufont, command=loadexample(entry)) else: _dir, entries = entry[0], entry[1:] CmdBtn.menu.choices = Menu(CmdBtn.menu) for e in entries: - CmdBtn.menu.choices.add_command(label=e[6:-3], underline=0, font=menufont, - command = loadexample(os.path.join(_dir,e))) - - CmdBtn.menu.add_cascade(label=_dir[6:], - menu = CmdBtn.menu.choices, font=menufont ) + CmdBtn.menu.choices.add_command( + label=e[6:-3], underline=0, font=menufont, + command = loadexample(os.path.join(_dir,e))) + CmdBtn.menu.add_cascade( + label=_dir[6:], menu = CmdBtn.menu.choices, font=menufont) CmdBtn['menu'] = CmdBtn.menu return CmdBtn @@ -193,9 +206,12 @@ CmdBtn.pack(side=LEFT, padx='2m') CmdBtn.menu = Menu(CmdBtn) - CmdBtn.menu.add_command(label='About turtle.py', font=menufont, command=showAboutTurtle) - CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, command=showDemoHelp) - CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, command=showAboutDemo) + CmdBtn.menu.add_command(label='About turtle.py', font=menufont, + command=showAboutTurtle) + CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, + command=showDemoHelp) + CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, + command=showAboutDemo) CmdBtn['menu'] = CmdBtn.menu return CmdBtn @@ -203,7 +219,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self,filename): @@ -262,10 +277,12 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + sys.exit() if __name__ == '__main__': demo = DemoWindow() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -662,6 +662,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:34 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy40IC0+IDMuNCk6?= =?utf-8?q?_Merge_heads?= Message-ID: <3hJRKk1gMHz7LkM@mail.python.org> http://hg.python.org/cpython/rev/77312eda97d8 changeset: 91796:77312eda97d8 branch: 3.4 parent: 91793:2cac1e3f825a parent: 91788:0fb515063324 user: Serhiy Storchaka date: Wed Jul 23 22:12:53 2014 +0300 summary: Merge heads files: Lib/turtledemo/__main__.py | 146 +++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 80 insertions(+), 67 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -41,74 +41,47 @@ class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() -##### - turtle.TurtleScreen.__init__(_s_, _s_._canvas) -##### - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -117,9 +90,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -145,9 +155,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -180,7 +190,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self, filename): @@ -238,10 +247,13 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + sys.exit() + if __name__ == '__main__': demo = DemoWindow() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -662,6 +662,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:35 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_default_-=3E_default?= =?utf-8?q?=29=3A_Merge_heads?= Message-ID: <3hJRKl4nxcz7LkL@mail.python.org> http://hg.python.org/cpython/rev/d7d17fe48cc7 changeset: 91797:d7d17fe48cc7 parent: 91794:bf0221ca3477 parent: 91789:2f4836848a51 user: Serhiy Storchaka date: Wed Jul 23 22:13:09 2014 +0300 summary: Merge heads files: Lib/turtledemo/__main__.py | 146 +++++++++++++----------- Misc/ACKS | 1 + 2 files changed, 80 insertions(+), 67 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -107,74 +107,47 @@ class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() -##### - turtle.TurtleScreen.__init__(_s_, _s_._canvas) -##### - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -183,9 +156,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -211,9 +221,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -246,7 +256,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self, filename): @@ -304,10 +313,13 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + sys.exit() + if __name__ == '__main__': demo = DemoWindow() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -668,6 +668,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:18:36 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:18:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Null_merge?= Message-ID: <3hJRKm6Tvfz7Lkg@mail.python.org> http://hg.python.org/cpython/rev/928fa5cc09ab changeset: 91798:928fa5cc09ab parent: 91797:d7d17fe48cc7 parent: 91796:77312eda97d8 user: Serhiy Storchaka date: Wed Jul 23 22:13:37 2014 +0300 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:33:46 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 23 Jul 2014 21:33:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=234350=3A_Removed_a?= =?utf-8?q?_number_of_out-of-dated_and_non-working_for_a_long_time?= Message-ID: <3hJRgG2HXVz7LjW@mail.python.org> http://hg.python.org/cpython/rev/549a7615abe3 changeset: 91799:549a7615abe3 user: Serhiy Storchaka date: Wed Jul 23 22:33:50 2014 +0300 summary: Issue #4350: Removed a number of out-of-dated and non-working for a long time Tkinter methods. files: Lib/tkinter/__init__.py | 73 ----------------------------- Misc/NEWS | 3 + Modules/tkappinit.c | 19 ------- 3 files changed, 3 insertions(+), 92 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -419,9 +419,6 @@ disabledForeground, insertBackground, troughColor.""" self.tk.call(('tk_setPalette',) + _flatten(args) + _flatten(list(kw.items()))) - def tk_menuBar(self, *args): - """Do not use. Needed in Tk 3.6 and earlier.""" - pass # obsolete since Tk 4.0 def wait_variable(self, name='PY_VAR'): """Wait until the variable is modified. @@ -719,9 +716,6 @@ """Raise this widget in the stacking order.""" self.tk.call('raise', self._w, aboveThis) lift = tkraise - def colormodel(self, value=None): - """Useless. Not implemented in Tk.""" - return self.tk.call('tk', 'colormodel', self._w, value) def winfo_atom(self, name, displayof=0): """Return integer which represents atom NAME.""" args = ('winfo', 'atom') + self._displayof(displayof) + (name,) @@ -2165,21 +2159,6 @@ """ Widget.__init__(self, master, 'button', cnf, kw) - def tkButtonEnter(self, *dummy): - self.tk.call('tkButtonEnter', self._w) - - def tkButtonLeave(self, *dummy): - self.tk.call('tkButtonLeave', self._w) - - def tkButtonDown(self, *dummy): - self.tk.call('tkButtonDown', self._w) - - def tkButtonUp(self, *dummy): - self.tk.call('tkButtonUp', self._w) - - def tkButtonInvoke(self, *dummy): - self.tk.call('tkButtonInvoke', self._w) - def flash(self): """Flash the button. @@ -2678,28 +2657,6 @@ disabledforeground, fg, font, foreground, postcommand, relief, selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" Widget.__init__(self, master, 'menu', cnf, kw) - def tk_bindForTraversal(self): - pass # obsolete since Tk 4.0 - def tk_mbPost(self): - self.tk.call('tk_mbPost', self._w) - def tk_mbUnpost(self): - self.tk.call('tk_mbUnpost') - def tk_traverseToMenu(self, char): - self.tk.call('tk_traverseToMenu', self._w, char) - def tk_traverseWithinMenu(self, char): - self.tk.call('tk_traverseWithinMenu', self._w, char) - def tk_getMenuButtons(self): - return self.tk.call('tk_getMenuButtons', self._w) - def tk_nextMenu(self, count): - self.tk.call('tk_nextMenu', count) - def tk_nextMenuEntry(self, count): - self.tk.call('tk_nextMenuEntry', count) - def tk_invokeMenu(self): - self.tk.call('tk_invokeMenu', self._w) - def tk_firstMenu(self): - self.tk.call('tk_firstMenu', self._w) - def tk_mbButtonDown(self): - self.tk.call('tk_mbButtonDown', self._w) def tk_popup(self, x, y, entry=""): """Post the menu at position X,Y with entry ENTRY.""" self.tk.call('tk_popup', self._w, x, y, entry) @@ -2938,14 +2895,6 @@ box of the visible part of the character at the given index.""" return self._getints( self.tk.call(self._w, 'bbox', index)) or None - def tk_textSelectTo(self, index): - self.tk.call('tk_textSelectTo', self._w, index) - def tk_textBackspace(self): - self.tk.call('tk_textBackspace', self._w) - def tk_textIndexCloser(self, a, b, c): - self.tk.call('tk_textIndexCloser', self._w, a, b, c) - def tk_textResetAnchor(self, index): - self.tk.call('tk_textResetAnchor', self._w, index) def compare(self, index1, op, index2): """Return whether between index INDEX1 and index INDEX2 the relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=.""" @@ -3823,28 +3772,6 @@ """Returns an ordered list of the child panes.""" return self.tk.splitlist(self.tk.call(self._w, 'panes')) -###################################################################### -# Extensions: - -class Studbutton(Button): - def __init__(self, master=None, cnf={}, **kw): - Widget.__init__(self, master, 'studbutton', cnf, kw) - self.bind('', self.tkButtonEnter) - self.bind('', self.tkButtonLeave) - self.bind('<1>', self.tkButtonDown) - self.bind('', self.tkButtonUp) - -class Tributton(Button): - def __init__(self, master=None, cnf={}, **kw): - Widget.__init__(self, master, 'tributton', cnf, kw) - self.bind('', self.tkButtonEnter) - self.bind('', self.tkButtonLeave) - self.bind('<1>', self.tkButtonDown) - self.bind('', self.tkButtonUp) - self['fg'] = self['bg'] - self['activebackground'] = self['bg'] - -###################################################################### # Test: def _test(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #4350: Removed a number of out-of-dated and non-working for a long time + Tkinter methods. + - Issue #6167: Scrollbar.activate() now returns the name of active element if the argument is not specified. Scrollbar.set() now always accepts only 2 arguments. diff --git a/Modules/tkappinit.c b/Modules/tkappinit.c --- a/Modules/tkappinit.c +++ b/Modules/tkappinit.c @@ -26,9 +26,6 @@ int Tcl_AppInit(Tcl_Interp *interp) { -#ifdef WITH_MOREBUTTONS - Tk_Window main_window; -#endif const char *_tkinter_skip_tk_init; #ifdef TKINTER_PROTECT_LOADTK const char *_tkinter_tk_failed; @@ -113,29 +110,13 @@ return TCL_ERROR; } -#ifdef WITH_MOREBUTTONS - main_window = Tk_MainWindow(interp); -#else Tk_MainWindow(interp); -#endif #ifdef TK_AQUA TkMacOSXInitAppleEvents(interp); TkMacOSXInitMenus(interp); #endif -#ifdef WITH_MOREBUTTONS - { - extern Tcl_CmdProc studButtonCmd; - extern Tcl_CmdProc triButtonCmd; - - Tcl_CreateCommand(interp, "studbutton", studButtonCmd, - (ClientData) main_window, NULL); - Tcl_CreateCommand(interp, "tributton", triButtonCmd, - (ClientData) main_window, NULL); - } -#endif - #ifdef WITH_PIL /* 0.2b5 and later -- not yet released as of May 14 */ { extern void TkImaging_Init(Tcl_Interp *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:41:00 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 23 Jul 2014 21:41:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NDkz?= =?utf-8?q?=3A_Fix_two_uses_of_ctypes=2Etest=2Erequires_=28it=27s_not_a_de?= =?utf-8?q?corator=29?= Message-ID: <3hJRqc1Xk0z7LjW@mail.python.org> http://hg.python.org/cpython/rev/49a2bed5185a changeset: 91800:49a2bed5185a branch: 2.7 parent: 91795:61656684d295 user: Zachary Ware date: Wed Jul 23 14:29:25 2014 -0500 summary: Issue #19493: Fix two uses of ctypes.test.requires (it's not a decorator) and skip test_win32.FunctionCallTestCase.test_SEH when Python was compiled in debug configuration or by a non-MSC compiler. files: Lib/ctypes/test/test_python_api.py | 2 +- Lib/ctypes/test/test_win32.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -40,8 +40,8 @@ # This test is unreliable, because it is possible that code in # unittest changes the refcount of the '42' integer. So, it # is disabled by default. - @requires("refcount") def test_PyInt_Long(self): + requires("refcount") ref42 = grc(42) pythonapi.PyInt_FromLong.restype = py_object self.assertEqual(pythonapi.PyInt_FromLong(42), 42) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -38,8 +38,11 @@ @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class FunctionCallTestCase(unittest.TestCase): - @requires("SEH") + @unittest.skipUnless('MSC' in sys.version, "SEH only supported by MSC") + @unittest.skipIf(sys.executable.endswith('_d.exe'), + "SEH not enabled in debug builds") def test_SEH(self): + requires("SEH") # Call functions with invalid arguments, and make sure # that access violations are trapped and raise an # exception. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:41:01 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 23 Jul 2014 21:41:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5NDkz?= =?utf-8?q?=3A_Fix_two_uses_of_ctypes=2Etest=2Erequires_=28it=27s_not_a_de?= =?utf-8?q?corator=29?= Message-ID: <3hJRqd3V9wz7Ljq@mail.python.org> http://hg.python.org/cpython/rev/374a9a259c09 changeset: 91801:374a9a259c09 branch: 3.4 parent: 91796:77312eda97d8 user: Zachary Ware date: Wed Jul 23 14:39:50 2014 -0500 summary: Issue #19493: Fix two uses of ctypes.test.requires (it's not a decorator) and skip test_win32.FunctionCallTestCase.test_SEH when Python was compiled in debug configuration or by a non-MSC compiler. files: Lib/ctypes/test/test_python_api.py | 2 +- Lib/ctypes/test/test_win32.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -42,9 +42,9 @@ # This test is unreliable, because it is possible that code in # unittest changes the refcount of the '42' integer. So, it # is disabled by default. - @requires("refcount") @support.refcount_test def test_PyLong_Long(self): + requires("refcount") ref42 = grc(42) pythonapi.PyLong_FromLong.restype = py_object self.assertEqual(pythonapi.PyLong_FromLong(42), 42) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -38,8 +38,11 @@ @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class FunctionCallTestCase(unittest.TestCase): - @requires("SEH") + @unittest.skipUnless('MSC' in sys.version, "SEH only supported by MSC") + @unittest.skipIf(sys.executable.endswith('_d.exe'), + "SEH not enabled in debug builds") def test_SEH(self): + requires("SEH") # Call functions with invalid arguments, and make sure # that access violations are trapped and raise an # exception. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 21:41:02 2014 From: python-checkins at python.org (zach.ware) Date: Wed, 23 Jul 2014 21:41:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hJRqf5J6xz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/d08d1569aa04 changeset: 91802:d08d1569aa04 parent: 91799:549a7615abe3 parent: 91801:374a9a259c09 user: Zachary Ware date: Wed Jul 23 14:40:27 2014 -0500 summary: Merge with 3.4 files: Lib/ctypes/test/test_python_api.py | 2 +- Lib/ctypes/test/test_win32.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -42,9 +42,9 @@ # This test is unreliable, because it is possible that code in # unittest changes the refcount of the '42' integer. So, it # is disabled by default. - @requires("refcount") @support.refcount_test def test_PyLong_Long(self): + requires("refcount") ref42 = grc(42) pythonapi.PyLong_FromLong.restype = py_object self.assertEqual(pythonapi.PyLong_FromLong(42), 42) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -38,8 +38,11 @@ @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class FunctionCallTestCase(unittest.TestCase): - @requires("SEH") + @unittest.skipUnless('MSC' in sys.version, "SEH only supported by MSC") + @unittest.skipIf(sys.executable.endswith('_d.exe'), + "SEH not enabled in debug builds") def test_SEH(self): + requires("SEH") # Call functions with invalid arguments, and make sure # that access violations are trapped and raise an # exception. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 23:00:07 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 23 Jul 2014 23:00:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322042=3A_Avoid_da?= =?utf-8?q?ngerous_C_cast_in_socket=2Esetblocking=28=29?= Message-ID: <3hJTZv6sGBz7LjW@mail.python.org> http://hg.python.org/cpython/rev/9dc66b3a1d0d changeset: 91803:9dc66b3a1d0d user: Victor Stinner date: Wed Jul 23 22:56:55 2014 +0200 summary: Issue #22042: Avoid dangerous C cast in socket.setblocking() Avoid cast from (int*) to (u_long*), even if sizeof(int) == sizeof(u_long). files: Modules/socketmodule.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -548,6 +548,9 @@ static int internal_setblocking(PySocketSockObject *s, int block) { +#ifdef MS_WINDOWS + u_long arg; +#endif #if !defined(MS_WINDOWS) \ && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))) int delay_flag, new_delay_flag; @@ -574,8 +577,8 @@ fcntl(s->sock_fd, F_SETFL, new_delay_flag); #endif #else /* MS_WINDOWS */ - block = !block; - ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block); + arg = !block; + ioctlsocket(s->sock_fd, FIONBIO, &arg); #endif /* MS_WINDOWS */ Py_END_ALLOW_THREADS -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 23:28:40 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 23 Jul 2014 23:28:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDUz?= =?utf-8?q?=3A_Cleanup_turtledemo_start_and_stop_and_fix_debug_shutdown_wa?= =?utf-8?q?rning=2E?= Message-ID: <3hJVCr20H7z7LjV@mail.python.org> http://hg.python.org/cpython/rev/823f5507bd86 changeset: 91804:823f5507bd86 branch: 2.7 parent: 91800:49a2bed5185a user: Terry Jan Reedy date: Wed Jul 23 17:27:51 2014 -0400 summary: Issue #22053: Cleanup turtledemo start and stop and fix debug shutdown warning. files: Demo/turtle/turtleDemo.py | 21 ++++++--------------- 1 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Demo/turtle/turtleDemo.py b/Demo/turtle/turtleDemo.py --- a/Demo/turtle/turtleDemo.py +++ b/Demo/turtle/turtleDemo.py @@ -282,20 +282,11 @@ def _destroy(self): self.root.destroy() - sys.exit() + #sys.exit() + +def main(): + demo = DemoWindow() + demo.root.mainloop() if __name__ == '__main__': - demo = DemoWindow() - RUN = True - while RUN: - try: - print "ENTERING mainloop" - demo.root.mainloop() - except AttributeError: - print "CRASH!!!- WAIT A MOMENT!" - time.sleep(0.3) - print "GOING ON .." - demo.refreshCanvas() -## time.sleep(1) - except: - RUN = FALSE + main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 23:28:41 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 23 Jul 2014 23:28:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDUz?= =?utf-8?q?=3A_Cleanup_turtledemo_start_and_stop_and_fix_debug_shutdown_wa?= =?utf-8?q?rning=2E?= Message-ID: <3hJVCs3kpYz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/57531d65cdd4 changeset: 91805:57531d65cdd4 branch: 3.4 parent: 91801:374a9a259c09 user: Terry Jan Reedy date: Wed Jul 23 17:27:57 2014 -0400 summary: Issue #22053: Cleanup turtledemo start and stop and fix debug shutdown warning. files: Lib/turtledemo/__main__.py | 26 +++++--------------------- 1 files changed, 5 insertions(+), 21 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -252,27 +252,11 @@ def _destroy(self): self.root.destroy() - sys.exit() +def main(): + demo = DemoWindow() + demo.root.mainloop() + if __name__ == '__main__': - demo = DemoWindow() - RUN = True - while RUN: - try: - #print("ENTERING mainloop") - demo.root.mainloop() - except AttributeError: - #print("AttributeError!- WAIT A MOMENT!") - time.sleep(0.3) - print("GOING ON ..") - demo.ckearCanvas() - except TypeError: - demo.screen._delete("all") - #print("CRASH!!!- WAIT A MOMENT!") - time.sleep(0.3) - #print("GOING ON ..") - demo.clearCanvas() - except: - print("BYE!") - RUN = False + main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 23 23:28:42 2014 From: python-checkins at python.org (terry.reedy) Date: Wed, 23 Jul 2014 23:28:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hJVCt5YZ6z7Ljs@mail.python.org> http://hg.python.org/cpython/rev/f1faeca3971f changeset: 91806:f1faeca3971f parent: 91803:9dc66b3a1d0d parent: 91805:57531d65cdd4 user: Terry Jan Reedy date: Wed Jul 23 17:28:15 2014 -0400 summary: Merge with 3.4 files: Lib/turtledemo/__main__.py | 26 +++++--------------------- 1 files changed, 5 insertions(+), 21 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -318,27 +318,11 @@ def _destroy(self): self.root.destroy() - sys.exit() +def main(): + demo = DemoWindow() + demo.root.mainloop() + if __name__ == '__main__': - demo = DemoWindow() - RUN = True - while RUN: - try: - #print("ENTERING mainloop") - demo.root.mainloop() - except AttributeError: - #print("AttributeError!- WAIT A MOMENT!") - time.sleep(0.3) - print("GOING ON ..") - demo.ckearCanvas() - except TypeError: - demo.screen._delete("all") - #print("CRASH!!!- WAIT A MOMENT!") - time.sleep(0.3) - #print("GOING ON ..") - demo.clearCanvas() - except: - print("BYE!") - RUN = False + main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 02:31:02 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 24 Jul 2014 02:31:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_doc_exampl?= =?utf-8?q?e_bug_reported_on_python-list_by_Akshay_Verma=2E?= Message-ID: <3hJZGG4YP7z7Ljd@mail.python.org> http://hg.python.org/cpython/rev/7f444a4265df changeset: 91807:7f444a4265df branch: 3.4 parent: 91805:57531d65cdd4 user: Terry Jan Reedy date: Wed Jul 23 20:30:29 2014 -0400 summary: Fix doc example bug reported on python-list by Akshay Verma. files: Doc/library/multiprocessing.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -398,7 +398,7 @@ print(res.get(timeout=1)) # prints "100" # make worker sleep for 10 secs - res = pool.apply_async(sleep, 10) + res = pool.apply_async(sleep, [10]) print(res.get(timeout=1)) # raises multiprocessing.TimeoutError # exiting the 'with'-block has stopped the pool -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 02:31:03 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 24 Jul 2014 02:31:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hJZGH63hSz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/7d891572e361 changeset: 91808:7d891572e361 parent: 91806:f1faeca3971f parent: 91807:7f444a4265df user: Terry Jan Reedy date: Wed Jul 23 20:30:41 2014 -0400 summary: Merge with 3.4 files: Doc/library/multiprocessing.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -398,7 +398,7 @@ print(res.get(timeout=1)) # prints "100" # make worker sleep for 10 secs - res = pool.apply_async(sleep, 10) + res = pool.apply_async(sleep, [10]) print(res.get(timeout=1)) # raises multiprocessing.TimeoutError # exiting the 'with'-block has stopped the pool -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 06:40:07 2014 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 24 Jul 2014 06:40:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_s/stringobject?= =?utf-8?q?/bytesobject/_=28closes_=2322036=29?= Message-ID: <3hJgng5WbXz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/a5a80f79699e changeset: 91809:a5a80f79699e branch: 3.4 parent: 91807:7f444a4265df user: Benjamin Peterson date: Wed Jul 23 21:39:37 2014 -0700 summary: s/stringobject/bytesobject/ (closes #22036) Patch by Martin Matusiak. files: Objects/stringlib/README.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/stringlib/README.txt b/Objects/stringlib/README.txt --- a/Objects/stringlib/README.txt +++ b/Objects/stringlib/README.txt @@ -1,4 +1,4 @@ -bits shared by the stringobject and unicodeobject implementations (and +bits shared by the bytesobject and unicodeobject implementations (and possibly other modules, in a not too distant future). the stuff in here is included into relevant places; see the individual -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 06:40:09 2014 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 24 Jul 2014 06:40:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogbWVyZ2UgMy40ICgjMjIwMzYp?= Message-ID: <3hJgnj09GFz7LkK@mail.python.org> http://hg.python.org/cpython/rev/6be54158e935 changeset: 91810:6be54158e935 parent: 91808:7d891572e361 parent: 91809:a5a80f79699e user: Benjamin Peterson date: Wed Jul 23 21:39:59 2014 -0700 summary: merge 3.4 (#22036) files: Objects/stringlib/README.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/stringlib/README.txt b/Objects/stringlib/README.txt --- a/Objects/stringlib/README.txt +++ b/Objects/stringlib/README.txt @@ -1,4 +1,4 @@ -bits shared by the stringobject and unicodeobject implementations (and +bits shared by the bytesobject and unicodeobject implementations (and possibly other modules, in a not too distant future). the stuff in here is included into relevant places; see the individual -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 07:09:15 2014 From: python-checkins at python.org (andrew.svetlov) Date: Thu, 24 Jul 2014 07:09:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Fix_grammar?= Message-ID: <3hJhRH1pBcz7LjR@mail.python.org> http://hg.python.org/cpython/rev/e70ab72286b4 changeset: 91811:e70ab72286b4 branch: 2.7 parent: 91804:823f5507bd86 user: Andrew Svetlov date: Thu Jul 24 08:08:15 2014 +0300 summary: Fix grammar files: Doc/tutorial/errors.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -184,7 +184,7 @@ ... except Exception as inst: ... print type(inst) # the exception instance ... print inst.args # arguments stored in .args - ... print inst # __str__ allows args to printed directly + ... print inst # __str__ allows args to be printed directly ... x, y = inst.args ... print 'x =', x ... print 'y =', y -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 08:33:54 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 24 Jul 2014 08:33:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Englich_gramma?= =?utf-8?q?r_nit=2E?= Message-ID: <3hJkJy1GgMz7LjR@mail.python.org> http://hg.python.org/cpython/rev/4bbb86d42c36 changeset: 91812:4bbb86d42c36 branch: 3.4 parent: 91809:a5a80f79699e user: Terry Jan Reedy date: Thu Jul 24 02:33:14 2014 -0400 summary: Englich grammar nit. files: Doc/library/asyncio-task.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -261,7 +261,7 @@ print(future.result()) loop.close() -The coroutine function is responsible of the computation (which takes 1 second) +The coroutine function is responsible for the computation (which takes 1 second) and it stores the result into the future. The :meth:`~BaseEventLoop.run_until_complete` method waits for the completion of the future. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 08:33:55 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 24 Jul 2014 08:33:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hJkJz31hQz7LjR@mail.python.org> http://hg.python.org/cpython/rev/79c27bdeb045 changeset: 91813:79c27bdeb045 parent: 91810:6be54158e935 parent: 91812:4bbb86d42c36 user: Terry Jan Reedy date: Thu Jul 24 02:33:32 2014 -0400 summary: Merge with 3.4 files: Doc/library/asyncio-task.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -261,7 +261,7 @@ print(future.result()) loop.close() -The coroutine function is responsible of the computation (which takes 1 second) +The coroutine function is responsible for the computation (which takes 1 second) and it stores the result into the future. The :meth:`~BaseEventLoop.run_until_complete` method waits for the completion of the future. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 08:59:40 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 24 Jul 2014 08:59:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Asyncio_doc_fi?= =?utf-8?q?xes=3A_spelling=2C_grammar=2C_duplication=2E?= Message-ID: <3hJkth02tnz7Ljh@mail.python.org> http://hg.python.org/cpython/rev/61380b00a0a2 changeset: 91814:61380b00a0a2 branch: 3.4 parent: 91812:4bbb86d42c36 user: Terry Jan Reedy date: Thu Jul 24 02:59:02 2014 -0400 summary: Asyncio doc fixes: spelling, grammar, duplication. files: Doc/library/asyncio-eventloop.rst | 4 +--- Doc/library/asyncio.rst | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -58,13 +58,11 @@ .. method:: BaseEventLoop.close() - Close the event loop. The loop should not be running. + Close the event loop. The loop must not be running. This clears the queues and shuts down the executor, but does not wait for the executor to finish. - The event loop must not be running. - This is idempotent and irreversible. No other methods should be called after this one. diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -39,7 +39,7 @@ you absolutely, positively have to use a library that makes blocking I/O calls. -Table of content: +Table of contents: .. toctree:: :maxdepth: 3 @@ -55,6 +55,6 @@ .. seealso:: - The :mod:`asyncio` module was designed in the :PEP:`3156`. For a + The :mod:`asyncio` module was designed in :PEP:`3156`. For a motivational primer on transports and protocols, see :PEP:`3153`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 08:59:41 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 24 Jul 2014 08:59:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hJktj1hFHz7Ljr@mail.python.org> http://hg.python.org/cpython/rev/d3777a16840b changeset: 91815:d3777a16840b parent: 91813:79c27bdeb045 parent: 91814:61380b00a0a2 user: Terry Jan Reedy date: Thu Jul 24 02:59:17 2014 -0400 summary: Merge with 3.4 files: Doc/library/asyncio-eventloop.rst | 4 +--- Doc/library/asyncio.rst | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -58,13 +58,11 @@ .. method:: BaseEventLoop.close() - Close the event loop. The loop should not be running. + Close the event loop. The loop must not be running. This clears the queues and shuts down the executor, but does not wait for the executor to finish. - The event loop must not be running. - This is idempotent and irreversible. No other methods should be called after this one. diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -39,7 +39,7 @@ you absolutely, positively have to use a library that makes blocking I/O calls. -Table of content: +Table of contents: .. toctree:: :maxdepth: 3 @@ -55,6 +55,6 @@ .. seealso:: - The :mod:`asyncio` module was designed in the :PEP:`3156`. For a + The :mod:`asyncio` module was designed in :PEP:`3156`. For a motivational primer on transports and protocols, see :PEP:`3153`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 10:37:04 2014 From: python-checkins at python.org (andrew.svetlov) Date: Thu, 24 Jul 2014 10:37:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_incomplete?= =?utf-8?q?_sentence_in_asyncio_docs=2E?= Message-ID: <3hJn344lqmz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/f578e1d717b7 changeset: 91816:f578e1d717b7 branch: 3.4 parent: 91814:61380b00a0a2 user: Andrew Svetlov date: Thu Jul 24 11:36:33 2014 +0300 summary: Fix incomplete sentence in asyncio docs. files: Doc/library/asyncio-eventloop.rst | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -47,8 +47,9 @@ Stop running the event loop. Every callback scheduled before :meth:`stop` is called will run. - Callback scheduled after :meth:`stop` is called won't. However, those - callbacks will run if :meth:`run_forever` is called again later. + Callbacks scheduled after :meth:`stop` is called will not run. + However, those callbacks will run if :meth:`run_forever` is called + again later. .. method:: BaseEventLoop.is_closed() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 10:37:05 2014 From: python-checkins at python.org (andrew.svetlov) Date: Thu, 24 Jul 2014 10:37:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_3=2E4=3A_Fix_incomplete_sentence_in_asyncio_docs?= =?utf-8?q?=2E?= Message-ID: <3hJn356BR5z7Ljg@mail.python.org> http://hg.python.org/cpython/rev/7f40fb5e488f changeset: 91817:7f40fb5e488f parent: 91815:d3777a16840b parent: 91816:f578e1d717b7 user: Andrew Svetlov date: Thu Jul 24 11:36:54 2014 +0300 summary: Merge 3.4: Fix incomplete sentence in asyncio docs. files: Doc/library/asyncio-eventloop.rst | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -47,8 +47,9 @@ Stop running the event loop. Every callback scheduled before :meth:`stop` is called will run. - Callback scheduled after :meth:`stop` is called won't. However, those - callbacks will run if :meth:`run_forever` is called again later. + Callbacks scheduled after :meth:`stop` is called will not run. + However, those callbacks will run if :meth:`run_forever` is called + again later. .. method:: BaseEventLoop.is_closed() -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Jul 24 11:02:06 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 24 Jul 2014 11:02:06 +0200 Subject: [Python-checkins] Daily reference leaks (7d891572e361): sum=-1084 Message-ID: results for 7d891572e361 on branch "default" -------------------------------------------- test_asyncio leaked [-530, 318, -636] references, sum=-848 test_asyncio leaked [-150, 92, -179] memory blocks, sum=-237 test_collections leaked [0, -2, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogctwjsm', '-x'] From python-checkins at python.org Thu Jul 24 11:34:38 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 11:34:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIwMDU1?= =?utf-8?q?=3A_Fix_BaseEventLoop=2Estop=28=29_docstring=2C_incomplete_sent?= =?utf-8?q?ence=2E?= Message-ID: <3hJpKV5GJRz7LjR@mail.python.org> http://hg.python.org/cpython/rev/84f26a437893 changeset: 91818:84f26a437893 branch: 3.4 parent: 91816:f578e1d717b7 user: Victor Stinner date: Thu Jul 24 11:34:11 2014 +0200 summary: Issue #20055: Fix BaseEventLoop.stop() docstring, incomplete sentence. Patch written by Saimadhav Heblikar. files: Lib/asyncio/base_events.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -270,9 +270,9 @@ def stop(self): """Stop running the event loop. - Every callback scheduled before stop() is called will run. - Callback scheduled after stop() is called won't. However, - those callbacks will run if run_*() is called again later. + Every callback scheduled before stop() is called will run. Callbacks + scheduled after stop() is called will not run. However, those callbacks + will run if run_forever is called again later. """ self.call_soon(_raise_stop_error) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 11:34:39 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 11:34:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2320055=3A_Fix_BaseEventLoop=2E?= =?utf-8?q?stop=28=29_docstring=2C_incomplete?= Message-ID: <3hJpKW6y74z7Ljd@mail.python.org> http://hg.python.org/cpython/rev/f657b64c67ab changeset: 91819:f657b64c67ab parent: 91817:7f40fb5e488f parent: 91818:84f26a437893 user: Victor Stinner date: Thu Jul 24 11:34:26 2014 +0200 summary: (Merge 3.4) Issue #20055: Fix BaseEventLoop.stop() docstring, incomplete sentence. Patch written by Saimadhav Heblikar. files: Lib/asyncio/base_events.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -270,9 +270,9 @@ def stop(self): """Stop running the event loop. - Every callback scheduled before stop() is called will run. - Callback scheduled after stop() is called won't. However, - those callbacks will run if run_*() is called again later. + Every callback scheduled before stop() is called will run. Callbacks + scheduled after stop() is called will not run. However, those callbacks + will run if run_forever is called again later. """ self.call_soon(_raise_stop_error) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:08:14 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:08:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_asyncio_tests?= =?utf-8?q?=3A_relax_timings_for_slow_buildbots?= Message-ID: <3hJq4G3wVvz7LjR@mail.python.org> http://hg.python.org/cpython/rev/e6be82fbc025 changeset: 91820:e6be82fbc025 branch: 3.4 parent: 91818:84f26a437893 user: Victor Stinner date: Thu Jul 24 12:04:22 2014 +0200 summary: asyncio tests: relax timings for slow buildbots files: Lib/test/test_asyncio/test_windows_events.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -94,14 +94,14 @@ event = _overlapped.CreateEvent(None, True, False, None) self.addCleanup(_winapi.CloseHandle, event) - # Wait for unset event with 0.2s timeout; + # Wait for unset event with 0.5s timeout; # result should be False at timeout - f = self.loop._proactor.wait_for_handle(event, 0.2) + f = self.loop._proactor.wait_for_handle(event, 0.5) start = self.loop.time() self.loop.run_until_complete(f) elapsed = self.loop.time() - start self.assertFalse(f.result()) - self.assertTrue(0.18 < elapsed < 0.9, elapsed) + self.assertTrue(0.48 < elapsed < 0.9, elapsed) _overlapped.SetEvent(event) @@ -112,7 +112,7 @@ self.loop.run_until_complete(f) elapsed = self.loop.time() - start self.assertTrue(f.result()) - self.assertTrue(0 <= elapsed < 0.1, elapsed) + self.assertTrue(0 <= elapsed < 0.3, elapsed) _overlapped.ResetEvent(event) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:08:15 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:08:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio_tests=3A_relax_timings_for_slo?= =?utf-8?q?w_buildbots?= Message-ID: <3hJq4H5TgKz7LjV@mail.python.org> http://hg.python.org/cpython/rev/715675393032 changeset: 91821:715675393032 parent: 91819:f657b64c67ab parent: 91820:e6be82fbc025 user: Victor Stinner date: Thu Jul 24 12:04:35 2014 +0200 summary: (Merge 3.4) asyncio tests: relax timings for slow buildbots files: Lib/test/test_asyncio/test_windows_events.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -94,14 +94,14 @@ event = _overlapped.CreateEvent(None, True, False, None) self.addCleanup(_winapi.CloseHandle, event) - # Wait for unset event with 0.2s timeout; + # Wait for unset event with 0.5s timeout; # result should be False at timeout - f = self.loop._proactor.wait_for_handle(event, 0.2) + f = self.loop._proactor.wait_for_handle(event, 0.5) start = self.loop.time() self.loop.run_until_complete(f) elapsed = self.loop.time() - start self.assertFalse(f.result()) - self.assertTrue(0.18 < elapsed < 0.9, elapsed) + self.assertTrue(0.48 < elapsed < 0.9, elapsed) _overlapped.SetEvent(event) @@ -112,7 +112,7 @@ self.loop.run_until_complete(f) elapsed = self.loop.time() - start self.assertTrue(f.result()) - self.assertTrue(0 <= elapsed < 0.1, elapsed) + self.assertTrue(0 <= elapsed < 0.3, elapsed) _overlapped.ResetEvent(event) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:08:17 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:08:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogdGVzdF9nZXR0ZXh0?= =?utf-8?q?=3A_use_support=2Ermtree=28=29_instead_of_shutil=2Ermtree=28=29?= Message-ID: <3hJq4K08B9z7Lkb@mail.python.org> http://hg.python.org/cpython/rev/9cc55d7ef922 changeset: 91822:9cc55d7ef922 branch: 3.4 parent: 91820:e6be82fbc025 user: Victor Stinner date: Thu Jul 24 12:07:45 2014 +0200 summary: test_gettext: use support.rmtree() instead of shutil.rmtree() files: Lib/test/test_gettext.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -77,7 +77,7 @@ def tearDown(self): self.env.__exit__() del self.env - shutil.rmtree(os.path.split(LOCALEDIR)[0]) + support.rmtree(os.path.split(LOCALEDIR)[0]) class GettextTestCase1(GettextBaseTest): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:08:33 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:08:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_test=5Fgettext=3A_use_support=2Ermtree=28=29_instead_of_?= =?utf-8?b?c2h1dGlsLnJtdHJlZSgp?= Message-ID: <3hJq4d0sB2z7LtS@mail.python.org> http://hg.python.org/cpython/rev/85b213df0524 changeset: 91823:85b213df0524 parent: 91821:715675393032 parent: 91822:9cc55d7ef922 user: Victor Stinner date: Thu Jul 24 12:08:20 2014 +0200 summary: test_gettext: use support.rmtree() instead of shutil.rmtree() files: Lib/test/test_gettext.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -77,7 +77,7 @@ def tearDown(self): self.env.__exit__() del self.env - shutil.rmtree(os.path.split(LOCALEDIR)[0]) + support.rmtree(os.path.split(LOCALEDIR)[0]) class GettextTestCase1(GettextBaseTest): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:25:03 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:25:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5ODg0?= =?utf-8?q?=3A_readline=3A_Disable_the_meta_modifier_key_if_stdout_is_not_?= =?utf-8?q?a?= Message-ID: <3hJqRg57Qyz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/0177d8a4e82a changeset: 91824:0177d8a4e82a branch: 2.7 parent: 91811:e70ab72286b4 user: Victor Stinner date: Thu Jul 24 12:22:24 2014 +0200 summary: Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable support of 8 bit characters. files: Lib/test/test_readline.py | 22 +++++++++++++++++----- Misc/NEWS | 5 +++++ Modules/readline.c | 15 +++++++++++++-- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -1,17 +1,19 @@ """ Very minimal unittests for parts of the readline module. - -These tests were added to check that the libedit emulation on OSX and -the "real" readline have the same interface for history manipulation. That's -why the tests cover only a small subset of the interface. """ +import os import unittest from test.test_support import run_unittest, import_module +from test.script_helper import assert_python_ok # Skip tests if there is no readline module readline = import_module('readline') class TestHistoryManipulation (unittest.TestCase): + """These tests were added to check that the libedit emulation on OSX and + the "real" readline have the same interface for history manipulation. + That's why the tests cover only a small subset of the interface. + """ @unittest.skipIf(not hasattr(readline, 'clear_history'), "The history update test cannot be run because the " @@ -40,8 +42,18 @@ self.assertEqual(readline.get_current_history_length(), 1) +class TestReadline(unittest.TestCase): + def test_init(self): + # Issue #19884: Ensure that the ANSI sequence "\033[1034h" is not + # written into stdout when the readline module is imported and stdout + # is redirected to a pipe. + rc, stdout, stderr = assert_python_ok('-c', 'import readline', + TERM='xterm-256color') + self.assertEqual(stdout, b'') + + def test_main(): - run_unittest(TestHistoryManipulation) + run_unittest(TestHistoryManipulation, TestReadline) if __name__ == "__main__": test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,11 @@ Library ------- +- Issue #19884: readline: Disable the meta modifier key if stdout is not + a terminal to not write the ANSI sequence "\033[1034h" into stdout. This + sequence is used on some terminal (ex: TERM=xterm-256color") to enable + support of 8 bit characters. + - Issue #22017: Correct reference counting errror in the initialization of the _warnings module. diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -887,7 +887,7 @@ #endif #ifdef __APPLE__ - /* the libedit readline emulation resets key bindings etc + /* the libedit readline emulation resets key bindings etc * when calling rl_initialize. So call it upfront */ if (using_libedit_emulation) @@ -932,6 +932,17 @@ begidx = PyInt_FromLong(0L); endidx = PyInt_FromLong(0L); + + if (!isatty(STDOUT_FILENO)) { + /* Issue #19884: stdout is no a terminal. Disable meta modifier + keys to not write the ANSI sequence "\033[1034h" into stdout. On + terminals supporting 8 bit characters like TERM=xterm-256color + (which is now the default Fedora since Fedora 18), the meta key is + used to enable support of 8 bit characters (ANSI sequence + "\033[1034h"). */ + rl_variable_bind ("enable-meta-key", "off"); + } + /* Initialize (allows .inputrc to override) * * XXX: A bug in the readline-2.2 library causes a memory leak @@ -943,7 +954,7 @@ else #endif /* __APPLE__ */ rl_initialize(); - + RESTORE_LOCALE(saved_locale) } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:25:04 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:25:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5ODg0?= =?utf-8?q?=3A_readline=3A_Disable_the_meta_modifier_key_if_stdout_is_not_?= =?utf-8?q?a?= Message-ID: <3hJqRh6p9qz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/6303266beb80 changeset: 91825:6303266beb80 branch: 3.4 parent: 91822:9cc55d7ef922 user: Victor Stinner date: Thu Jul 24 12:23:56 2014 +0200 summary: Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable support of 8 bit characters. files: Lib/test/test_readline.py | 23 ++++++++++++++++++----- Misc/NEWS | 5 +++++ Modules/readline.c | 11 +++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -1,17 +1,20 @@ """ Very minimal unittests for parts of the readline module. - -These tests were added to check that the libedit emulation on OSX and -the "real" readline have the same interface for history manipulation. That's -why the tests cover only a small subset of the interface. """ +import os import unittest from test.support import run_unittest, import_module +from test.script_helper import assert_python_ok # Skip tests if there is no readline module readline = import_module('readline') class TestHistoryManipulation (unittest.TestCase): + """ + These tests were added to check that the libedit emulation on OSX and the + "real" readline have the same interface for history manipulation. That's + why the tests cover only a small subset of the interface. + """ @unittest.skipIf(not hasattr(readline, 'clear_history'), "The history update test cannot be run because the " @@ -40,8 +43,18 @@ self.assertEqual(readline.get_current_history_length(), 1) +class TestReadline(unittest.TestCase): + def test_init(self): + # Issue #19884: Ensure that the ANSI sequence "\033[1034h" is not + # written into stdout when the readline module is imported and stdout + # is redirected to a pipe. + rc, stdout, stderr = assert_python_ok('-c', 'import readline', + TERM='xterm-256color') + self.assertEqual(stdout, b'') + + def test_main(): - run_unittest(TestHistoryManipulation) + run_unittest(TestHistoryManipulation, TestReadline) if __name__ == "__main__": test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,11 @@ Library ------- +- Issue #19884: readline: Disable the meta modifier key if stdout is not + a terminal to not write the ANSI sequence "\033[1034h" into stdout. This + sequence is used on some terminal (ex: TERM=xterm-256color") to enable + support of 8 bit characters. + - Issue #21888: plistlib's load() and loads() now work if the fmt parameter is specified. diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1019,6 +1019,17 @@ mod_state->begidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L); + + if (!isatty(STDOUT_FILENO)) { + /* Issue #19884: stdout is no a terminal. Disable meta modifier + keys to not write the ANSI sequence "\033[1034h" into stdout. On + terminals supporting 8 bit characters like TERM=xterm-256color + (which is now the default Fedora since Fedora 18), the meta key is + used to enable support of 8 bit characters (ANSI sequence + "\033[1034h"). */ + rl_variable_bind ("enable-meta-key", "off"); + } + /* Initialize (allows .inputrc to override) * * XXX: A bug in the readline-2.2 library causes a memory leak -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:25:06 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:25:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2319884=3A_readline=3A_Disable_?= =?utf-8?q?the_meta_modifier_key_if_stdout_is?= Message-ID: <3hJqRk2mbyz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/f85a968f9e01 changeset: 91826:f85a968f9e01 parent: 91823:85b213df0524 parent: 91825:6303266beb80 user: Victor Stinner date: Thu Jul 24 12:24:45 2014 +0200 summary: (Merge 3.4) Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable support of 8 bit characters. files: Lib/test/test_readline.py | 23 ++++++++++++++++++----- Misc/NEWS | 5 +++++ Modules/readline.c | 11 +++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -1,17 +1,20 @@ """ Very minimal unittests for parts of the readline module. - -These tests were added to check that the libedit emulation on OSX and -the "real" readline have the same interface for history manipulation. That's -why the tests cover only a small subset of the interface. """ +import os import unittest from test.support import run_unittest, import_module +from test.script_helper import assert_python_ok # Skip tests if there is no readline module readline = import_module('readline') class TestHistoryManipulation (unittest.TestCase): + """ + These tests were added to check that the libedit emulation on OSX and the + "real" readline have the same interface for history manipulation. That's + why the tests cover only a small subset of the interface. + """ @unittest.skipIf(not hasattr(readline, 'clear_history'), "The history update test cannot be run because the " @@ -40,8 +43,18 @@ self.assertEqual(readline.get_current_history_length(), 1) +class TestReadline(unittest.TestCase): + def test_init(self): + # Issue #19884: Ensure that the ANSI sequence "\033[1034h" is not + # written into stdout when the readline module is imported and stdout + # is redirected to a pipe. + rc, stdout, stderr = assert_python_ok('-c', 'import readline', + TERM='xterm-256color') + self.assertEqual(stdout, b'') + + def test_main(): - run_unittest(TestHistoryManipulation) + run_unittest(TestHistoryManipulation, TestReadline) if __name__ == "__main__": test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,11 @@ Library ------- +- Issue #19884: readline: Disable the meta modifier key if stdout is not + a terminal to not write the ANSI sequence "\033[1034h" into stdout. This + sequence is used on some terminal (ex: TERM=xterm-256color") to enable + support of 8 bit characters. + - Issue #4350: Removed a number of out-of-dated and non-working for a long time Tkinter methods. diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1019,6 +1019,17 @@ mod_state->begidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L); + + if (!isatty(STDOUT_FILENO)) { + /* Issue #19884: stdout is no a terminal. Disable meta modifier + keys to not write the ANSI sequence "\033[1034h" into stdout. On + terminals supporting 8 bit characters like TERM=xterm-256color + (which is now the default Fedora since Fedora 18), the meta key is + used to enable support of 8 bit characters (ANSI sequence + "\033[1034h"). */ + rl_variable_bind ("enable-meta-key", "off"); + } + /* Initialize (allows .inputrc to override) * * XXX: A bug in the readline-2.2 library causes a memory leak -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:44:39 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:44:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxODEz?= =?utf-8?q?=3A_Enhance_documentation_of_the_os=2Estat=5Fresult_class=2E?= Message-ID: <3hJqtH2q46z7Ljg@mail.python.org> http://hg.python.org/cpython/rev/833325d45113 changeset: 91827:833325d45113 branch: 3.4 parent: 91825:6303266beb80 user: Victor Stinner date: Thu Jul 24 12:42:16 2014 +0200 summary: Issue #21813: Enhance documentation of the os.stat_result class. files: Doc/library/os.rst | 265 +++++++++++++++++++++++--------- 1 files changed, 187 insertions(+), 78 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -765,8 +765,14 @@ .. function:: fstat(fd) - Return status for file descriptor *fd*, like :func:`~os.stat`. As of Python - 3.3, this is equivalent to ``os.stat(fd)``. + Get the status of the file descriptor *fd*. Return a :class:`stat_result` + object. + + As of Python 3.3, this is equivalent to ``os.stat(fd)``. + + .. seealso:: + + The :func:`stat` function. Availability: Unix, Windows. @@ -1570,17 +1576,25 @@ Added support for specifying an open file descriptor for *path*. -.. function:: lstat(path, *, dir_fd=None) +.. function:: lstat(path, \*, dir_fd=None) Perform the equivalent of an :c:func:`lstat` system call on the given path. - Similar to :func:`~os.stat`, but does not follow symbolic links. On - platforms that do not support symbolic links, this is an alias for - :func:`~os.stat`. As of Python 3.3, this is equivalent to ``os.stat(path, - dir_fd=dir_fd, follow_symlinks=False)``. + Similar to :func:`~os.stat`, but does not follow symbolic links. Return a + :class:`stat_result` object. + + On platforms that do not support symbolic links, this is an alias for + :func:`~os.stat`. + + As of Python 3.3, this is equivalent to ``os.stat(path, dir_fd=dir_fd, + follow_symlinks=False)``. This function can also support :ref:`paths relative to directory descriptors `. + .. seealso:: + + The :func:`stat` function. + .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. @@ -1847,49 +1861,116 @@ The *dir_fd* parameter. -.. function:: stat(path, *, dir_fd=None, follow_symlinks=True) - - Perform the equivalent of a :c:func:`stat` system call on the given path. - *path* may be specified as either a string or as an open file descriptor. - (This function normally follows symlinks; to stat a symlink add the argument - ``follow_symlinks=False``, or use :func:`lstat`.) - - The return value is an object whose attributes correspond roughly - to the members of the :c:type:`stat` structure, namely: - - * :attr:`st_mode` - protection bits, - * :attr:`st_ino` - inode number, - * :attr:`st_dev` - device, - * :attr:`st_nlink` - number of hard links, - * :attr:`st_uid` - user id of owner, - * :attr:`st_gid` - group id of owner, - * :attr:`st_size` - size of file, in bytes, - * :attr:`st_atime` - time of most recent access expressed in seconds, - * :attr:`st_mtime` - time of most recent content modification - expressed in seconds, - * :attr:`st_ctime` - platform dependent; time of most recent metadata - change on Unix, or the time of creation on Windows, expressed in seconds - * :attr:`st_atime_ns` - time of most recent access - expressed in nanoseconds as an integer, - * :attr:`st_mtime_ns` - time of most recent content modification - expressed in nanoseconds as an integer, - * :attr:`st_ctime_ns` - platform dependent; time of most recent metadata - change on Unix, or the time of creation on Windows, - expressed in nanoseconds as an integer - - On some Unix systems (such as Linux), the following attributes may also be - available: - - * :attr:`st_blocks` - number of 512-byte blocks allocated for file - * :attr:`st_blksize` - filesystem blocksize for efficient file system I/O - * :attr:`st_rdev` - type of device if an inode device - * :attr:`st_flags` - user defined flags for file - - On other Unix systems (such as FreeBSD), the following attributes may be - available (but may be only filled out if root tries to use them): - - * :attr:`st_gen` - file generation number - * :attr:`st_birthtime` - time of file creation +.. function:: stat(path, \*, dir_fd=None, follow_symlinks=True) + + Get the status of a file or a file descriptor. Perform the equivalent of a + :c:func:`stat` system call on the given path. *path* may be specified as + either a string or as an open file descriptor. Return a :class:`stat_result` + object. + + This function normally follows symlinks; to stat a symlink add the argument + ``follow_symlinks=False``, or use :func:`lstat`. + + This function can support :ref:`specifying a file descriptor ` and + :ref:`not following symlinks `. + + .. index:: module: stat + + Example:: + + >>> import os + >>> statinfo = os.stat('somefile.txt') + >>> statinfo + os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, + st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, + st_mtime=1297230027, st_ctime=1297230027) + >>> statinfo.st_size + 264 + + Availability: Unix, Windows. + + .. seealso:: + + :func:`fstat` and :func:`lstat` functions. + + .. versionadded:: 3.3 + Added the *dir_fd* and *follow_symlinks* arguments, specifying a file + descriptor instead of a path. + + +.. class:: stat_result + + Object whose attributes correspond roughly to the members of the + :c:type:`stat` structure. It is used for the result of :func:`os.stat`, + :func:`os.fstat` and :func:`os.lstat`. + + Attributes: + + .. attribute:: st_mode + + File mode: file type and file mode bits (permissions). + + .. attribute:: st_ino + + Inode number. + + .. attribute:: st_dev + + Identifier of the device on which this file resides. + + .. attribute:: st_nlink + + Number of hard links. + + .. attribute:: st_uid + + User identifier of the file owner. + + .. attribute:: st_gid + + Group identifier of the file owner. + + .. attribute:: st_size + + Size of the file in bytes, if it is a regular file or a symbolic link. + The size of a symbolic link is the length of the pathname it contains, + without a terminating null byte. + + Timestamps: + + .. attribute:: st_atime + + Time of most recent access expressed in seconds. + + .. attribute:: st_mtime + + Time of most recent content modification expressed in seconds. + + .. attribute:: st_ctime + + Platform dependent: + + * the time of most recent metadata change on Unix, + * the time of creation on Windows, expressed in seconds. + + .. attribute:: st_atime_ns + + Time of most recent access expressed in nanoseconds as an integer. + + .. attribute:: st_mtime_ns + + Time of most recent content modification expressed in nanoseconds as an + integer. + + .. attribute:: st_ctime_ns + + Platform dependent: + + * the time of most recent metadata change on Unix, + * the time of creation on Windows, expressed in nanoseconds as an + integer. + + See also the :func:`stat_float_times` function. .. note:: @@ -1899,6 +1980,7 @@ or FAT32 file systems, :attr:`st_mtime` has 2-second resolution, and :attr:`st_atime` has only 1-day resolution. See your operating system documentation for details. + Similarly, although :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns` are always expressed in nanoseconds, many systems do not provide nanosecond precision. On systems that do @@ -1908,41 +1990,68 @@ If you need the exact timestamps you should always use :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns`. - For backward compatibility, the return value of :func:`~os.stat` is also + On some Unix systems (such as Linux), the following attributes may also be + available: + + .. attribute:: st_blocks + + Number of 512-byte blocks allocated for file. + This may be smaller than :attr:`st_size`/512 when the file has holes. + + .. attribute:: st_blksize + + "Preferred" blocksize for efficient file system I/O. Writing to a file in + smaller chunks may cause an inefficient read-modify-rewrite. + + .. attribute:: st_rdev + + Type of device if an inode device. + + .. attribute:: st_flags + + User defined flags for file. + + On other Unix systems (such as FreeBSD), the following attributes may be + available (but may be only filled out if root tries to use them): + + .. attribute:: st_gen + + File generation number. + + .. attribute:: st_birthtime + + Time of file creation. + + On Mac OS systems, the following attributes may also be available: + + .. attribute:: st_rsize + + Real size of the file. + + .. attribute:: st_creator + + Creator of the file. + + .. attribute:: st_type + + File type. + + The standard module :mod:`stat` defines functions and constants that are + useful for extracting information from a :c:type:`stat` structure. (On + Windows, some items are filled with dummy values.) + + For backward compatibility, a :class:`stat_result` instance is also accessible as a tuple of at least 10 integers giving the most important (and portable) members of the :c:type:`stat` structure, in the order :attr:`st_mode`, :attr:`st_ino`, :attr:`st_dev`, :attr:`st_nlink`, :attr:`st_uid`, :attr:`st_gid`, :attr:`st_size`, :attr:`st_atime`, :attr:`st_mtime`, :attr:`st_ctime`. More items may be added at the end by - some implementations. - - This function can support :ref:`specifying a file descriptor ` and - :ref:`not following symlinks `. - - .. index:: module: stat - - The standard module :mod:`stat` defines functions and constants that are useful - for extracting information from a :c:type:`stat` structure. (On Windows, some - items are filled with dummy values.) - - Example:: - - >>> import os - >>> statinfo = os.stat('somefile.txt') - >>> statinfo - posix.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, - st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, - st_mtime=1297230027, st_ctime=1297230027) - >>> statinfo.st_size - 264 - - Availability: Unix, Windows. + some implementations. For compatibility with older Python versions, + accessing :class:`stat_result` as a tuple always returns integers. .. versionadded:: 3.3 - Added the *dir_fd* and *follow_symlinks* arguments, - specifying a file descriptor instead of a path, - and the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, - and :attr:`st_ctime_ns` members. + Added the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and + :attr:`st_ctime_ns` members. .. function:: stat_float_times([newvalue]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:44:41 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:44:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQmFja3BvcnQgb3Mu?= =?utf-8?q?rst_documentation_from_Python_3=2E5=2E?= Message-ID: <3hJqtK2WwSz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/50527a1b769c changeset: 91828:50527a1b769c branch: 3.4 user: Victor Stinner date: Thu Jul 24 12:42:45 2014 +0200 summary: Backport os.rst documentation from Python 3.5. files: Doc/library/os.rst | 33 +++++++++++++++++++++++++++++---- 1 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1094,8 +1094,16 @@ All platforms support sockets as *out* file descriptor, and some platforms allow other types (e.g. regular file, pipe) as well. + Cross-platform applications should not use *headers*, *trailers* and *flags* + arguments. + Availability: Unix. + .. note:: + + For a higher-level wrapper of :func:`sendfile`, see + :mod:`socket.socket.sendfile`. + .. versionadded:: 3.3 @@ -2836,10 +2844,27 @@ Availability: Unix. -.. function:: popen(...) - - Run child processes, returning opened pipes for communications. These functions - are described in section :ref:`os-newstreams`. +.. function:: popen(command, mode='r', buffering=-1) + + Open a pipe to or from *command*. The return value is an open file object + connected to the pipe, which can be read or written depending on whether *mode* + is ``'r'`` (default) or ``'w'``. The *buffering* argument has the same meaning as + the corresponding argument to the built-in :func:`open` function. The + returned file object reads or writes text strings rather than bytes. + + The ``close`` method returns :const:`None` if the subprocess exited + successfully, or the subprocess's return code if there was an + error. On POSIX systems, if the return code is positive it + represents the return value of the process left-shifted by one + byte. If the return code is negative, the process was terminated + by the signal given by the negated value of the return code. (For + example, the return value might be ``- signal.SIGKILL`` if the + subprocess was killed.) On Windows systems, the return value + contains the signed integer return code from the child process. + + This is implemented using :class:`subprocess.Popen`; see that class's + documentation for more powerful ways to manage and communicate with + subprocesses. .. function:: spawnl(mode, path, ...) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 12:44:42 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 12:44:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321813=3A_Enhance_documentation_of_the_os=2Estat?= =?utf-8?q?=5Fresult_class=2E?= Message-ID: <3hJqtL5SRZz7LkG@mail.python.org> http://hg.python.org/cpython/rev/5d70ac83d104 changeset: 91829:5d70ac83d104 parent: 91826:f85a968f9e01 parent: 91828:50527a1b769c user: Victor Stinner date: Thu Jul 24 12:44:07 2014 +0200 summary: Issue #21813: Enhance documentation of the os.stat_result class. files: Doc/library/os.rst | 279 +++++++++++++++++++++--------- Doc/whatsnew/3.5.rst | 7 +- 2 files changed, 198 insertions(+), 88 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -765,8 +765,14 @@ .. function:: fstat(fd) - Return status for file descriptor *fd*, like :func:`~os.stat`. As of Python - 3.3, this is equivalent to ``os.stat(fd)``. + Get the status of the file descriptor *fd*. Return a :class:`stat_result` + object. + + As of Python 3.3, this is equivalent to ``os.stat(fd)``. + + .. seealso:: + + The :func:`stat` function. Availability: Unix, Windows. @@ -1578,17 +1584,25 @@ Added support for specifying an open file descriptor for *path*. -.. function:: lstat(path, *, dir_fd=None) +.. function:: lstat(path, \*, dir_fd=None) Perform the equivalent of an :c:func:`lstat` system call on the given path. - Similar to :func:`~os.stat`, but does not follow symbolic links. On - platforms that do not support symbolic links, this is an alias for - :func:`~os.stat`. As of Python 3.3, this is equivalent to ``os.stat(path, - dir_fd=dir_fd, follow_symlinks=False)``. + Similar to :func:`~os.stat`, but does not follow symbolic links. Return a + :class:`stat_result` object. + + On platforms that do not support symbolic links, this is an alias for + :func:`~os.stat`. + + As of Python 3.3, this is equivalent to ``os.stat(path, dir_fd=dir_fd, + follow_symlinks=False)``. This function can also support :ref:`paths relative to directory descriptors `. + .. seealso:: + + The :func:`stat` function. + .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. @@ -1855,54 +1869,116 @@ The *dir_fd* parameter. -.. function:: stat(path, *, dir_fd=None, follow_symlinks=True) - - Perform the equivalent of a :c:func:`stat` system call on the given path. - *path* may be specified as either a string or as an open file descriptor. - (This function normally follows symlinks; to stat a symlink add the argument - ``follow_symlinks=False``, or use :func:`lstat`.) - - The return value is an object whose attributes correspond roughly - to the members of the :c:type:`stat` structure, namely: - - * :attr:`st_mode` - protection bits, - * :attr:`st_ino` - inode number, - * :attr:`st_dev` - device, - * :attr:`st_nlink` - number of hard links, - * :attr:`st_uid` - user id of owner, - * :attr:`st_gid` - group id of owner, - * :attr:`st_size` - size of file, in bytes, - * :attr:`st_atime` - time of most recent access expressed in seconds, - * :attr:`st_mtime` - time of most recent content modification - expressed in seconds, - * :attr:`st_ctime` - platform dependent; time of most recent metadata - change on Unix, or the time of creation on Windows, expressed in seconds - * :attr:`st_atime_ns` - time of most recent access - expressed in nanoseconds as an integer, - * :attr:`st_mtime_ns` - time of most recent content modification - expressed in nanoseconds as an integer, - * :attr:`st_ctime_ns` - platform dependent; time of most recent metadata - change on Unix, or the time of creation on Windows, - expressed in nanoseconds as an integer - - On some Unix systems (such as Linux), the following attributes may also be - available: - - * :attr:`st_blocks` - number of 512-byte blocks allocated for file - * :attr:`st_blksize` - filesystem blocksize for efficient file system I/O - * :attr:`st_rdev` - type of device if an inode device - * :attr:`st_flags` - user defined flags for file - - On other Unix systems (such as FreeBSD), the following attributes may be - available (but may be only filled out if root tries to use them): - - * :attr:`st_gen` - file generation number - * :attr:`st_birthtime` - time of file creation - - On Windows systems, the following attribute is also available: - - * :attr:`st_file_attributes` - Windows file attribute bits (see the - ``FILE_ATTRIBUTE_*`` constants in the :mod:`stat` module) +.. function:: stat(path, \*, dir_fd=None, follow_symlinks=True) + + Get the status of a file or a file descriptor. Perform the equivalent of a + :c:func:`stat` system call on the given path. *path* may be specified as + either a string or as an open file descriptor. Return a :class:`stat_result` + object. + + This function normally follows symlinks; to stat a symlink add the argument + ``follow_symlinks=False``, or use :func:`lstat`. + + This function can support :ref:`specifying a file descriptor ` and + :ref:`not following symlinks `. + + .. index:: module: stat + + Example:: + + >>> import os + >>> statinfo = os.stat('somefile.txt') + >>> statinfo + os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, + st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, + st_mtime=1297230027, st_ctime=1297230027) + >>> statinfo.st_size + 264 + + Availability: Unix, Windows. + + .. seealso:: + + :func:`fstat` and :func:`lstat` functions. + + .. versionadded:: 3.3 + Added the *dir_fd* and *follow_symlinks* arguments, specifying a file + descriptor instead of a path. + + +.. class:: stat_result + + Object whose attributes correspond roughly to the members of the + :c:type:`stat` structure. It is used for the result of :func:`os.stat`, + :func:`os.fstat` and :func:`os.lstat`. + + Attributes: + + .. attribute:: st_mode + + File mode: file type and file mode bits (permissions). + + .. attribute:: st_ino + + Inode number. + + .. attribute:: st_dev + + Identifier of the device on which this file resides. + + .. attribute:: st_nlink + + Number of hard links. + + .. attribute:: st_uid + + User identifier of the file owner. + + .. attribute:: st_gid + + Group identifier of the file owner. + + .. attribute:: st_size + + Size of the file in bytes, if it is a regular file or a symbolic link. + The size of a symbolic link is the length of the pathname it contains, + without a terminating null byte. + + Timestamps: + + .. attribute:: st_atime + + Time of most recent access expressed in seconds. + + .. attribute:: st_mtime + + Time of most recent content modification expressed in seconds. + + .. attribute:: st_ctime + + Platform dependent: + + * the time of most recent metadata change on Unix, + * the time of creation on Windows, expressed in seconds. + + .. attribute:: st_atime_ns + + Time of most recent access expressed in nanoseconds as an integer. + + .. attribute:: st_mtime_ns + + Time of most recent content modification expressed in nanoseconds as an + integer. + + .. attribute:: st_ctime_ns + + Platform dependent: + + * the time of most recent metadata change on Unix, + * the time of creation on Windows, expressed in nanoseconds as an + integer. + + See also the :func:`stat_float_times` function. .. note:: @@ -1912,6 +1988,7 @@ or FAT32 file systems, :attr:`st_mtime` has 2-second resolution, and :attr:`st_atime` has only 1-day resolution. See your operating system documentation for details. + Similarly, although :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns` are always expressed in nanoseconds, many systems do not provide nanosecond precision. On systems that do @@ -1921,41 +1998,77 @@ If you need the exact timestamps you should always use :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns`. - For backward compatibility, the return value of :func:`~os.stat` is also + On some Unix systems (such as Linux), the following attributes may also be + available: + + .. attribute:: st_blocks + + Number of 512-byte blocks allocated for file. + This may be smaller than :attr:`st_size`/512 when the file has holes. + + .. attribute:: st_blksize + + "Preferred" blocksize for efficient file system I/O. Writing to a file in + smaller chunks may cause an inefficient read-modify-rewrite. + + .. attribute:: st_rdev + + Type of device if an inode device. + + .. attribute:: st_flags + + User defined flags for file. + + On other Unix systems (such as FreeBSD), the following attributes may be + available (but may be only filled out if root tries to use them): + + .. attribute:: st_gen + + File generation number. + + .. attribute:: st_birthtime + + Time of file creation. + + On Mac OS systems, the following attributes may also be available: + + .. attribute:: st_rsize + + Real size of the file. + + .. attribute:: st_creator + + Creator of the file. + + .. attribute:: st_type + + File type. + + On Windows systems, the following attribute is also available: + + .. attribute:: st_file_attributes + + Windows file attributes: ``dwFileAttributes`` member of the + ``BY_HANDLE_FILE_INFORMATION`` structure returned by + :c:func:`GetFileInformationByHandle`. See the ``FILE_ATTRIBUTE_*`` + constants in the :mod:`stat` module. + + The standard module :mod:`stat` defines functions and constants that are + useful for extracting information from a :c:type:`stat` structure. (On + Windows, some items are filled with dummy values.) + + For backward compatibility, a :class:`stat_result` instance is also accessible as a tuple of at least 10 integers giving the most important (and portable) members of the :c:type:`stat` structure, in the order :attr:`st_mode`, :attr:`st_ino`, :attr:`st_dev`, :attr:`st_nlink`, :attr:`st_uid`, :attr:`st_gid`, :attr:`st_size`, :attr:`st_atime`, :attr:`st_mtime`, :attr:`st_ctime`. More items may be added at the end by - some implementations. - - This function can support :ref:`specifying a file descriptor ` and - :ref:`not following symlinks `. - - .. index:: module: stat - - The standard module :mod:`stat` defines functions and constants that are useful - for extracting information from a :c:type:`stat` structure. (On Windows, some - items are filled with dummy values.) - - Example:: - - >>> import os - >>> statinfo = os.stat('somefile.txt') - >>> statinfo - posix.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, - st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, - st_mtime=1297230027, st_ctime=1297230027) - >>> statinfo.st_size - 264 - - Availability: Unix, Windows. + some implementations. For compatibility with older Python versions, + accessing :class:`stat_result` as a tuple always returns integers. .. versionadded:: 3.3 - Added the *dir_fd* and *follow_symlinks* arguments, - specifying a file descriptor instead of a path, - and the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, - and :attr:`st_ctime_ns` members. + Added the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and + :attr:`st_ctime_ns` members. .. versionadded:: 3.5 Added the :attr:`st_file_attributes` member on Windows. diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -185,11 +185,8 @@ os -- -* :class:`os.stat_result` now has a ``st_file_attributes`` field on Windows, - containing the ``dwFileAttributes`` member of the - ``BY_HANDLE_FILE_INFORMATION`` structure returned by - ``GetFileInformationByHandle()`` (contributed by Ben Hoyt in - :issue:`21719`). +* :class:`os.stat_result` now has a :attr:`~os.stat_result.st_file_attributes` + attribute on Windows (contributed by Ben Hoyt in :issue:`21719`). shutil ------ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 13:38:04 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 13:38:04 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_First_version_of_the_PEP_475?= Message-ID: <3hJs3w3VSNz7LjM@mail.python.org> http://hg.python.org/peps/rev/eeed281619eb changeset: 5503:eeed281619eb user: Victor Stinner date: Thu Jul 24 13:37:56 2014 +0200 summary: First version of the PEP 475 files: pep-0475.txt | 413 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 413 insertions(+), 0 deletions(-) diff --git a/pep-0475.txt b/pep-0475.txt new file mode 100644 --- /dev/null +++ b/pep-0475.txt @@ -0,0 +1,413 @@ +PEP: 475 +Title: Retry system calls failing with EINTR +Version: $Revision$ +Last-Modified: $Date$ +Author: Charles-Fran?ois Natali , Victor Stinner +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 29-July-2014 +Python-Version: 3.5 + + +Abstract +======== + +Retry system calls failing with the ``EINTR`` error and recompute +timeout if needed. Deprecate the ``signal.siginterrupt()`` function. + + +Rationale +========= + +Interrupted system calls +------------------------ + +On POSIX systems, signals are common. Your program must be prepared to +handle them. Examples of signals: + +* The most common signal is ``SIGINT``, signal sent when CTRL+c is + pressed. By default, Python raises a ``KeyboardInterrupt`` exception + when this signal is received. +* When running subprocesses, the ``SIGCHLD`` signal is sent when a + child process exits. +* Resizing the terminal sends the ``SIGWINCH`` signal to the + applications running in the terminal. +* Putting the application in background (ex: press CTRL-z and then + type the ``bg`` command) sends the ``SIGCONT`` signal. + +Writing a signal handler is difficult, only "signal-safe" functions +can be called. For example, ``printf()`` and ``malloc()`` are not +signal-safe. When a signal is sent to a process calling a system +call, the system call fails with the ``EINTR`` error to give the +program an opportunity to handle the signal without the restriction on +signal safe functions. + +If the signal handler was set with the ``SA_RESTART`` flag set, the C +library retries some the system call instead of failing with +``EINTR``. For example, ``read()`` is retried, whereas ``select()`` is +not retried. The Python function ``signal.signal()`` clears the +``SA_RESTART`` flag when setting the signal handler: all system calls +should fail with ``EINTR`` in Python. + +The problem is that handling ``EINTR`` should be done for all system +calls. The problem is similar to handling errors in the C language +which does not have exceptions: you must check all function returns to +check for error, and usually duplicate the code checking for errors. +Python does not have this issue, it uses exceptions to notify errors. + + +Current status +-------------- + +Currently in Python, the code to handle the ``InterruptedError`` +exception (``EINTR`` error) is duplicated on case by case. Only a few +Python modules handle this exception, and fixes usually took several +years to cover a whole module. Example of code retrying +``file.read()`` on ``InterruptedError``:: + + while True: + try: + data = file.read() + break + except InterruptedError: + continue + +List of Python modules of the standard library which handle +``InterruptedError``: + +* ``asyncio`` +* ``asyncore`` +* ``io``, ``_pyio`` +* ``multiprocessing`` +* ``selectors`` +* ``socket`` +* ``socketserver`` +* ``subprocess`` + + +Use Case 1: Don't Bother of Signals +----------------------------------- + +In most cases, you don't want to be interrupted by signals and you +don't expect to get ``InterruptedError`` exceptions. For example, do +you really want to write such complex code for an "Hello World" +example? + +:: + + while True: + try: + print("Hello World") + except InterruptedError: + pass + +``InterruptedError`` can happen in unexpected places. For example, +``os.close()`` and ``FileIO.close()`` can raises ``InterruptedError``: +see the article `close() and EINTR +`_. + +The `Python issues related to EINTR`_ section below gives examples of +bugs caused by "EINTR". + +The expectation is that Python hides the ``InterruptedError``: retry +system calls failing with the ``EINTR`` error. + + +Use Case 2: Be notified of signals as soon as possible +------------------------------------------------------ + +Sometimes, you expect some signals and you want to handle them as soon +as possible. For example, you may want to quit immediatly a program +using the ``CTRL+c`` keyboard shortcut. + +Some signals are not interesting and should not interrupt the the +application. There are two options to only interrupt an application +on some signals: + +* Raise an exception in the signal handler, like ``KeyboardInterrupt`` for + ``SIGINT`` +* Use a I/O multiplexing function like ``select()`` with the Python + signal "wakeup" file descriptor: see the function + ``signal.set_wakeupfd()``. + + +Proposition +=========== + +If a system call fails with ``EINTR``, Python must call signal +handlers: call ``PyErr_CheckSignals()``. If a signal handler raises +an exception, the Python function fails with the exception. +Otherwise, the system call is retried. If the system call takes a +timeout parameter, the timeout is recomputed. + +Modified functions +------------------ + +Example of functions that need to be modified: + +* ``os.read()``, ``io.FileIO.read()``, ``io.FileIO.readinto()`` +* ``os.write()``, ``io.FileIO.write()`` +* ``os.waitpid()`` +* ``socket.accept()`` +* ``socket.connect()`` +* ``socket.recv()``, ``socket.recv_into()`` +* ``socket.recv_from()`` +* ``socket.send()`` +* ``socket.sendto()`` +* ``time.sleep()`` +* ``select.select()`` +* ``select.poll()`` +* ``select.epoll.poll()`` +* ``select.devpoll.poll()`` +* ``select.kqueue.control()`` +* ``selectors.SelectSelector.select()`` and other selector classes + +Note: The ``selector`` module already retries on ``InterruptedError``, but it +doesn't recompute the timeout yet. + + +Deprecate siginterrupt() +------------------------ + +The function ``signal.siginterrupt()`` becomes useless with this PEP, +it should be deprecated. When ``signal.siginterrupt(signum, False)`` +is used, some system calls don't fail with ``EINTR`` when a signal is +received. Python cannot call its signal handler and interrupt the +system call. + +The function ``signal.siginterrupt()`` will be deprecated in Python +3.5. + +In Python 3.6, calling ``signal.siginterrupt(signum, False)`` will +raise an exception, whereas ``signal.siginterrupt(signum, True)`` will +only emit the deprecation warning. + + +Backward Compatibility +====================== + +Applications relying on the fact that system calls are interrupted +with ``InterruptedError`` will hang. The authors of this PEP don't +think that such application exist. + +If such applications exist, they must be fixed to handle signals +differently, to have a reliable behaviour on all platforms and all +Python versions. For example, use a signal handle which raises an +exception, or use a wakeup file descriptor. + +Applications should not call ``signal.siginterrupt(signum, False)`` +anymore, since this call will raise an exception in Python 3.6. + +For applications using event loops, ``signal.set_wakeup_fd()`` is the +recommanded option to handle signals. The signal handler writes signal +numbers into the file descriptor and the event loop is awaken to read +them. The event loop can decide how to handle these signals without +the restriction of signal handlers. + + +Appendix +======== + +Wakeup file descriptor +---------------------- + +Since Python 3.3, ``signal.set_wakeup_fd()`` writes the signal number +into the file descriptor, whereas it only wrote a null byte before. +It becomes possible to handle different signals using the wakeup file +descriptor. + +Linux has a ``signalfd()`` which provides more information on each +signal. For example, it's possible to know the pid and uid who sent +the signal. This function is not exposed in Python yet (see the +`issue 12304 `_). + +On Unix, the ``asyncio`` module uses the wakeup file descriptor to +wake up its event loop. + + +Multithreading +-------------- + +A C signal handler can be called from any thread, but the Python +signal handler should only be called in the main thread. + +Python has a ``PyErr_SetInterrupt()`` function which calls the +``SIGINT`` signal handler to interrupt the Python main thread. + + +Signals on Windows +------------------ + +Control events +^^^^^^^^^^^^^^ + +Windows uses "control events": + +* ``CTRL_BREAK_EVENT``: Break (``SIGBREAK``) +* ``CTRL_CLOSE_EVENT``: Close event +* ``CTRL_C_EVENT``: CTRL+C (``SIGINT``) +* ``CTRL_LOGOFF_EVENT``: Logoff +* ``CTRL_SHUTDOWN_EVENT``: Shutdown + +The `SetConsoleCtrlHandler() function +`_ +can be used to install a control handler. + +The ``CTRL_C_EVENT`` and ``CTRL_BREAK_EVENT`` events can be sent to a +process using the `GenerateConsoleCtrlEvent() function +`_. +This function is exposed in Python as ``os.kill()``. + + +Signals +^^^^^^^ + +The following signals are supported on Windows: + +* ``SIGABRT`` +* ``SIGBREAK`` (``CTRL_BREAK_EVENT``): signal only available on Windows +* ``SIGFPE`` +* ``SIGILL`` +* ``SIGINT`` (``CTRL_C_EVENT``) +* ``SIGSEGV`` +* ``SIGTERM`` + + +SIGINT +^^^^^^ + +The default Python signal handler for ``SIGINT`` sets a Windows event +object: ``sigint_event``. + +``time.sleep()`` is implemented with ``WaitForSingleObjectEx()``, it +waits for the ``sigint_event`` object using ``time.sleep()`` parameter +as the timeout. So the sleep can be interrupted by ``SIGINT``. + +``_winapi.WaitForMultipleObjects()`` automatically adds +``sigint_event`` to the list of watched handles, so it can also be +interrupted. + +``PyOS_StdioReadline()`` also used ``sigint_event`` when ``fgets()`` +failed to check if Ctrl-C or Ctrl-Z was pressed. + + +Links +----- + +Misc +^^^^ + +* `glibc manual: Primitives Interrupted by Signals + `_ +* `Bug #119097 for perl5: print returning EINTR in 5.14 + `_. + + +Python issues related to EINTR +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The main issue is: `handle EINTR in the stdlib +`_. + +Open issues: + +* `Add a new signal.set_wakeup_socket() function + `_ +* `signal.set_wakeup_fd(fd): set the fd to non-blocking mode + `_ +* `Use a monotonic clock to compute timeouts + `_ +* `sys.stdout.write on OS X is not EINTR safe + `_ +* `platform.uname() not EINTR safe + `_ +* `asyncore does not handle EINTR in recv, send, connect, accept, + `_ +* `socket.create_connection() doesn't handle EINTR properly + `_ + +Closed issues: + +* `Interrupted system calls are not retried + `_ +* `Solaris: EINTR exception in select/socket calls in telnetlib + `_ +* `subprocess: Popen.communicate() doesn't handle EINTR in some cases + `_ +* `multiprocessing.util._eintr_retry doen't recalculate timeouts + `_ +* `file readline, readlines & readall methods can lose data on EINTR + `_ +* `multiprocessing BaseManager serve_client() does not check EINTR on recv + `_ +* `selectors behaviour on EINTR undocumented + `_ +* `asyncio: limit EINTR occurrences with SA_RESTART + `_ +* `smtplib.py socket.create_connection() also doesn't handle EINTR properly + `_ +* `Faulty RESTART/EINTR handling in Parser/myreadline.c + `_ +* `test_httpservers intermittent failure, test_post and EINTR + `_ +* `os.spawnv(P_WAIT, ...) on Linux doesn't handle EINTR + `_ +* `asyncore fails when EINTR happens in pol + `_ +* `file.write and file.read don't handle EINTR + `_ +* `socket.readline() interface doesn't handle EINTR properly + `_ +* `subprocess is not EINTR-safe + `_ +* `SocketServer doesn't handle syscall interruption + `_ +* `subprocess deadlock when read() is interrupted + `_ +* `time.sleep(1): call PyErr_CheckSignals() if the sleep was interrupted + `_ +* `siginterrupt with flag=False is reset when signal received + `_ +* `need siginterrupt() on Linux - impossible to do timeouts + `_ +* `[Windows] Can not interrupt time.sleep() + `_ + +Python issues related to signals +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Open issues: + +* `expose signalfd(2) in the signal module + `_ +* `missing return in win32_kill? + `_ +* `Interrupts are lost during readline PyOS_InputHook processing + `_ +* `cannot catch KeyboardInterrupt when using curses getkey() + `_ +* `Deferred KeyboardInterrupt in interactive mode + `_ + +Closed issues: + +* `sys.interrupt_main() + `_ + + +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 Jul 24 16:48:33 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 24 Jul 2014 16:48:33 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE3MzAx?= =?utf-8?q?36=3A_Fix_comparison_between_a_tk_Font_object_and_an_object_of_?= =?utf-8?q?a?= Message-ID: <3hJxHj5ycHz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/841cdb6145e9 changeset: 91830:841cdb6145e9 branch: 2.7 parent: 91824:0177d8a4e82a user: Serhiy Storchaka date: Thu Jul 24 17:48:28 2014 +0300 summary: Issue #1730136: Fix comparison between a tk Font object and an object of a different type. files: Lib/lib-tk/test/test_tkinter/test_font.py | 35 +++++++++++ Lib/lib-tk/tkFont.py | 2 +- Misc/NEWS | 3 + 3 files changed, 39 insertions(+), 1 deletions(-) diff --git a/Lib/lib-tk/test/test_tkinter/test_font.py b/Lib/lib-tk/test/test_tkinter/test_font.py new file mode 100644 --- /dev/null +++ b/Lib/lib-tk/test/test_tkinter/test_font.py @@ -0,0 +1,35 @@ +import unittest +import Tkinter +#from Tkinter +import tkFont as font +from test.test_support import requires, run_unittest +import test_ttk.support as support + +requires('gui') + +class FontTest(unittest.TestCase): + + def setUp(self): + support.root_deiconify() + + def tearDown(self): + support.root_withdraw() + + def test_font_eq(self): + fontname = "TkDefaultFont" + try: + f = font.Font(name=fontname, exists=True) + except tkinter._tkinter.TclError: + f = font.Font(name=fontname, exists=False) + font1 = font.nametofont(fontname) + font2 = font.nametofont(fontname) + self.assertIsNot(font1, font2) + self.assertEqual(font1, font2) + self.assertNotEqual(font1, font1.copy()) + self.assertNotEqual(font1, 0) + self.assertNotIn(font1, [0]) + +tests_gui = (FontTest, ) + +if __name__ == "__main__": + run_unittest(*tests_gui) diff --git a/Lib/lib-tk/tkFont.py b/Lib/lib-tk/tkFont.py --- a/Lib/lib-tk/tkFont.py +++ b/Lib/lib-tk/tkFont.py @@ -97,7 +97,7 @@ return self.name def __eq__(self, other): - return self.name == other.name and isinstance(other, Font) + return isinstance(other, Font) and self.name == other.name def __getitem__(self, key): return self.cget(key) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #1730136: Fix the comparison between a tkFont.Font and an object of + another kind. + - Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 19:00:39 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 19:00:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE2MTMz?= =?utf-8?q?=3A_The_asynchat=2Easync=5Fchat=2Ehandle=5Fread=28=29_method_no?= =?utf-8?q?w_ignores?= Message-ID: <3hK0D71z3Cz7LjM@mail.python.org> http://hg.python.org/cpython/rev/b7f144d14798 changeset: 91831:b7f144d14798 branch: 3.4 parent: 91828:50527a1b769c user: Victor Stinner date: Thu Jul 24 18:49:36 2014 +0200 summary: Issue #16133: The asynchat.async_chat.handle_read() method now ignores BlockingIOError exceptions. Initial patch written by Xavier de Gaye. Document also in asyncore documentation that recv() may raise BlockingIOError. files: Doc/library/asyncore.rst | 4 ++++ Lib/asynchat.py | 2 ++ Lib/test/test_asynchat.py | 17 +++++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 26 insertions(+), 0 deletions(-) diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -216,6 +216,10 @@ empty bytes object implies that the channel has been closed from the other end. + Note that :meth:`recv` may raise :exc:`BlockingIOError` , even though + :func:`select.select` or :func:`select.poll` has reported the socket + ready for reading. + .. method:: listen(backlog) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -115,6 +115,8 @@ try: data = self.recv(self.ac_in_buffer_size) + except BlockingIOError: + return except OSError as why: self.handle_error() return diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -7,10 +7,12 @@ import asynchat import asyncore +import errno import socket import sys import time import unittest +import unittest.mock try: import threading except ImportError: @@ -273,6 +275,21 @@ usepoll = True +class TestAsynchatMocked(unittest.TestCase): + def test_blockingioerror(self): + # Issue #16133: handle_read() must ignore BlockingIOError + sock = unittest.mock.Mock() + sock.recv.side_effect = BlockingIOError(errno.EAGAIN) + + dispatcher = asynchat.async_chat() + dispatcher.set_socket(sock) + self.addCleanup(dispatcher.del_channel) + + with unittest.mock.patch.object(dispatcher, 'handle_error') as error: + dispatcher.handle_read() + self.assertFalse(error.called) + + class TestHelperFunctions(unittest.TestCase): def test_find_prefix_at_end(self): self.assertEqual(asynchat.find_prefix_at_end("qwerty\r", "\r\n"), 1) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #16133: The asynchat.async_chat.handle_read() method now ignores + BlockingIOError exceptions. + - Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 19:00:40 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 19:00:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2316133=3A_The_asynchat=2Easync?= =?utf-8?q?=5Fchat=2Ehandle=5Fread=28=29_method_now?= Message-ID: <3hK0D83kZSz7LjM@mail.python.org> http://hg.python.org/cpython/rev/aa150c7a5d24 changeset: 91832:aa150c7a5d24 parent: 91829:5d70ac83d104 parent: 91831:b7f144d14798 user: Victor Stinner date: Thu Jul 24 19:00:28 2014 +0200 summary: (Merge 3.4) Issue #16133: The asynchat.async_chat.handle_read() method now ignores BlockingIOError exceptions. Initial patch written by Xavier de Gaye. Document also in asyncore documentation that recv() may raise BlockingIOError. files: Doc/library/asyncore.rst | 4 ++++ Lib/asynchat.py | 2 ++ Lib/test/test_asynchat.py | 17 +++++++++++++++++ Misc/NEWS | 3 +++ 4 files changed, 26 insertions(+), 0 deletions(-) diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -216,6 +216,10 @@ empty bytes object implies that the channel has been closed from the other end. + Note that :meth:`recv` may raise :exc:`BlockingIOError` , even though + :func:`select.select` or :func:`select.poll` has reported the socket + ready for reading. + .. method:: listen(backlog) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -115,6 +115,8 @@ try: data = self.recv(self.ac_in_buffer_size) + except BlockingIOError: + return except OSError as why: self.handle_error() return diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -7,11 +7,13 @@ import asynchat import asyncore +import errno import socket import sys import time import unittest import warnings +import unittest.mock try: import threading except ImportError: @@ -274,6 +276,21 @@ usepoll = True +class TestAsynchatMocked(unittest.TestCase): + def test_blockingioerror(self): + # Issue #16133: handle_read() must ignore BlockingIOError + sock = unittest.mock.Mock() + sock.recv.side_effect = BlockingIOError(errno.EAGAIN) + + dispatcher = asynchat.async_chat() + dispatcher.set_socket(sock) + self.addCleanup(dispatcher.del_channel) + + with unittest.mock.patch.object(dispatcher, 'handle_error') as error: + dispatcher.handle_read() + self.assertFalse(error.called) + + class TestHelperFunctions(unittest.TestCase): def test_find_prefix_at_end(self): self.assertEqual(asynchat.find_prefix_at_end("qwerty\r", "\r\n"), 1) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #16133: The asynchat.async_chat.handle_read() method now ignores + BlockingIOError exceptions. + - Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 19:15:42 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 19:15:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE2MTMz?= =?utf-8?q?=3A_The_asynchat=2Easync=5Fchat=2Ehandle=5Fread=28=29_method_no?= =?utf-8?q?w_ignores?= Message-ID: <3hK0YV5FGHz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/d422062d7d36 changeset: 91833:d422062d7d36 branch: 2.7 parent: 91830:841cdb6145e9 user: Victor Stinner date: Thu Jul 24 19:15:00 2014 +0200 summary: Issue #16133: The asynchat.async_chat.handle_read() method now ignores socket.error() exceptions with blocking I/O errors: EAGAIN, EALREADY, EINPROGRESS, or EWOULDBLOCK. Initial patch written by Xavier de Gaye. files: Doc/library/asyncore.rst | 5 ++++ Lib/asynchat.py | 9 ++++++- Lib/test/test_asynchat.py | 32 ++++++++++++++++++++++++++- Misc/NEWS | 4 +++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -193,6 +193,11 @@ Read at most *buffer_size* bytes from the socket's remote end-point. An empty string implies that the channel has been closed from the other end. + Note that :meth:`recv` may raise :exc:`socket.error` with + :data:`~errno.EAGAIN` or :data:`~errno.EWOULDBLOCK`, even though + :func:`select.select` or :func:`select.poll` has reported the socket + ready for reading. + .. method:: listen(backlog) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -46,12 +46,17 @@ you - by calling your self.found_terminator() method. """ +import asyncore +import errno import socket -import asyncore from collections import deque from sys import py3kwarning from warnings import filterwarnings, catch_warnings +_BLOCKING_IO_ERRORS = (errno.EAGAIN, errno.EALREADY, errno.EINPROGRESS, + errno.EWOULDBLOCK) + + class async_chat (asyncore.dispatcher): """This is an abstract class. You must derive from this class, and add the two methods collect_incoming_data() and found_terminator()""" @@ -109,6 +114,8 @@ try: data = self.recv (self.ac_in_buffer_size) except socket.error, why: + if why.args[0] in _BLOCKING_IO_ERRORS: + return self.handle_error() return diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -1,6 +1,10 @@ # test asynchat -import asyncore, asynchat, socket, time +import errno +import asyncore +import asynchat +import socket +import time import unittest import sys from test import test_support @@ -235,6 +239,31 @@ class TestAsynchat_WithPoll(TestAsynchat): usepoll = True + +class TestAsynchatMocked(unittest.TestCase): + def test_blockingioerror(self): + # Issue #16133: handle_read() must ignore blocking I/O errors like + # EAGAIN + class fake_socket: + def fileno(self): + return 0 + + def recv(self, size): + raise socket.error(errno.EAGAIN, "EAGAIN") + + class MyChat(asynchat.async_chat): + def handle_error(self): + raise Exception("error") + + sock = fake_socket() + dispatcher = MyChat() + dispatcher.set_socket(sock) + self.addCleanup(dispatcher.del_channel) + + # must not call handle_error() + dispatcher.handle_read() + + class TestHelperFunctions(unittest.TestCase): def test_find_prefix_at_end(self): self.assertEqual(asynchat.find_prefix_at_end("qwerty\r", "\r\n"), 1) @@ -267,6 +296,7 @@ def test_main(verbose=None): test_support.run_unittest(TestAsynchat, TestAsynchat_WithPoll, + TestAsynchatMocked, TestHelperFunctions, TestFifo) if __name__ == "__main__": diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,10 @@ Library ------- +- Issue #16133: The asynchat.async_chat.handle_read() method now ignores + socket.error() exceptions with blocking I/O errors: EAGAIN, EALREADY, + EINPROGRESS, or EWOULDBLOCK. + - Issue #1730136: Fix the comparison between a tkFont.Font and an object of another kind. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 22:12:56 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 22:12:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_tets?= Message-ID: <3hK4V00hVfz7LjV@mail.python.org> http://hg.python.org/cpython/rev/42ced0d023cd changeset: 91834:42ced0d023cd parent: 91832:aa150c7a5d24 user: Victor Stinner date: Thu Jul 24 21:58:53 2014 +0200 summary: tets files: Doc/c-api/exceptions.rst | 13 +- Doc/library/signal.rst | 5 + Lib/test/test_signal.py | 128 +++++++++++++++++++- Modules/signalmodule.c | 155 +++++++++++++++++++++--- PCbuild/pythoncore.vcxproj | 16 +- 5 files changed, 277 insertions(+), 40 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 @@ -443,13 +443,20 @@ .. c:function:: int PySignal_SetWakeupFd(int fd) - This utility function specifies a file descriptor to which a ``'\0'`` byte will - be written whenever a signal is received. It returns the previous such file - descriptor. The value ``-1`` disables the feature; this is the initial state. + This utility function specifies a file descriptor to which the signal number + is written as a single byte whenever a signal is received. *fd* must be + non-blocking. It returns the previous such file descriptor. + + On Windows, the function only supports socket handles. + + The value ``-1`` disables the feature; this is the initial state. This is equivalent to :func:`signal.set_wakeup_fd` in Python, but without any error checking. *fd* should be a valid file descriptor. The function should only be called from the main thread. + .. versionchanged:: 3.5 + On Windows, the function now only supports socket handles. + .. c:function:: PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -308,6 +308,8 @@ a library to wakeup a poll or select call, allowing the signal to be fully processed. + On Windows, the function only supports socket handles. + The old wakeup fd is returned. *fd* must be non-blocking. It is up to the library to remove any bytes before calling poll or select again. @@ -318,6 +320,9 @@ attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. + .. versionchanged:: 3.5 + On Windows, the function now only supports socket handles. + .. function:: siginterrupt(signalnum, flag) 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 @@ -6,6 +6,7 @@ import pickle import select import signal +import socket import struct import subprocess import traceback @@ -251,21 +252,43 @@ class WakeupFDTests(unittest.TestCase): def test_invalid_fd(self): - fd = support.make_bad_fd() + if sys.platform == "win32": + sock = socket.socket() + fd = sock.fileno() + sock.close() + else: + fd = support.make_bad_fd() self.assertRaises((ValueError, OSError), signal.set_wakeup_fd, fd) + @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') + def test_only_socket(self): + # set_wakeup_fd() expects a socket on Windows + with open(support.TESTFN, 'wb') as fp: + self.addCleanup(support.unlink, support.TESTFN) + self.assertRaises(ValueError, + signal.set_wakeup_fd, fp.fileno()) + def test_set_wakeup_fd_result(self): - r1, w1 = os.pipe() - self.addCleanup(os.close, r1) - self.addCleanup(os.close, w1) - r2, w2 = os.pipe() - self.addCleanup(os.close, r2) - self.addCleanup(os.close, w2) + if sys.platform == 'win32': + sock1 = socket.socket() + self.addCleanup(sock1.close) + fd1 = sock1.fileno() - signal.set_wakeup_fd(w1) - self.assertIs(signal.set_wakeup_fd(w2), w1) - self.assertIs(signal.set_wakeup_fd(-1), w2) + sock2 = socket.socket() + self.addCleanup(sock2.close) + fd2 = sock2.fileno() + else: + r1, fd1 = os.pipe() + self.addCleanup(os.close, r1) + self.addCleanup(os.close, fd1) + r2, fd2 = os.pipe() + self.addCleanup(os.close, r2) + self.addCleanup(os.close, fd2) + + signal.set_wakeup_fd(fd1) + self.assertIs(signal.set_wakeup_fd(fd2), fd1) + self.assertIs(signal.set_wakeup_fd(-1), fd2) self.assertIs(signal.set_wakeup_fd(-1), -1) @@ -441,6 +464,90 @@ """, signal.SIGUSR1, signal.SIGUSR2, ordered=False) + at unittest.skipUnless(hasattr(socket, 'socketpair'), 'need socket.socketpair') +class WakeupSocketSignalTests(unittest.TestCase): + + @unittest.skipIf(_testcapi is None, 'need _testcapi') + def test_socket(self): + # use a subprocess to have only one thread + code = """if 1: + import signal + import socket + import struct + import _testcapi + + signum = signal.SIGINT + signals = (signum,) + + def handler(signum, frame): + pass + + signal.signal(signum, handler) + + read, write = socket.socketpair() + read.setblocking(False) + write.setblocking(False) + signal.set_wakeup_fd(write.fileno()) + + _testcapi.raise_signal(signum) + + data = read.recv(1) + if not data: + raise Exception("no signum written") + raised = struct.unpack('B', data) + if raised != signals: + raise Exception("%r != %r" % (raised, signals)) + + read.close() + write.close() + """ + + assert_python_ok('-c', code) + + @unittest.skipIf(_testcapi is None, 'need _testcapi') + def test_send_error(self): + # Use a subprocess to have only one thread. + if os.name == 'nt': + action = 'send' + else: + action = 'write' + code = """if 1: + import errno + import signal + import socket + import sys + import time + import _testcapi + from test.support import captured_stderr + + signum = signal.SIGINT + + def handler(signum, frame): + pass + + signal.signal(signum, handler) + + read, write = socket.socketpair() + read.setblocking(False) + write.setblocking(False) + + signal.set_wakeup_fd(write.fileno()) + + # Close sockets: send() will fail + read.close() + write.close() + + with captured_stderr() as err: + _testcapi.raise_signal(signum) + + err = err.getvalue() + if ('Exception ignored when trying to {action} to the signal wakeup fd' + not in err): + raise AssertionError(err) + """.format(action=action) + assert_python_ok('-c', code) + + @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class SiginterruptTest(unittest.TestCase): @@ -990,6 +1097,7 @@ try: support.run_unittest(GenericTests, PosixTests, InterProcessSignalTests, WakeupFDTests, WakeupSignalTests, + WakeupSocketSignalTests, SiginterruptTest, ItimerTest, WindowsSignalTests, PendingSignalsTests) finally: diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -4,6 +4,9 @@ /* XXX Signals should be recorded per thread, now we have thread state. */ #include "Python.h" +#ifdef MS_WINDOWS +#include "socketmodule.h" /* needed for SOCKET_T */ +#endif #ifndef MS_WINDOWS #include "posixmodule.h" #endif @@ -87,7 +90,18 @@ PyObject *func; } Handlers[NSIG]; +#ifdef MS_WINDOWS +#define INVALID_SOCKET ((SOCKET_T)-1) + +static volatile struct { + SOCKET_T fd; + int send_err_set; + int send_errno; + int send_win_error; +} wakeup = {INVALID_SOCKET, 0, 0}; +#else static volatile sig_atomic_t wakeup_fd = -1; +#endif /* Speed up sigcheck() when none tripped */ static volatile sig_atomic_t is_tripped = 0; @@ -171,6 +185,33 @@ return PyErr_CheckSignals(); } +#ifdef MS_WINDOWS +static int +report_wakeup_error(void* Py_UNUSED(data)) +{ + PyObject *res; + + if (wakeup.send_win_error) { + /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which + recognizes the error codes used by both GetLastError() and + WSAGetLastError */ + res = PyErr_SetExcFromWindowsErr(PyExc_OSError, wakeup.send_win_error); + } + else { + errno = wakeup.send_errno; + res = PyErr_SetFromErrno(PyExc_OSError); + } + + assert(res == NULL); + wakeup.send_err_set = 0; + + PySys_WriteStderr("Exception ignored when trying to send to the " + "signal wakeup fd:\n"); + PyErr_WriteUnraisable(NULL); + + return 0; +} +#else static int report_wakeup_error(void *data) { @@ -183,26 +224,51 @@ errno = save_errno; return 0; } +#endif static void trip_signal(int sig_num) { unsigned char byte; - int rc = 0; + Py_ssize_t rc; Handlers[sig_num].tripped = 1; + +#ifdef MS_WINDOWS + if (wakeup.fd != INVALID_SOCKET) { + byte = (unsigned char)sig_num; + do { + rc = send(wakeup.fd, &byte, 1, 0); + } while (rc < 0 && errno == EINTR); + + /* we only have a storage for one error in the wakeup structure */ + if (rc < 0 && !wakeup.send_err_set) { + wakeup.send_err_set = 1; + wakeup.send_errno = errno; + wakeup.send_win_error = GetLastError(); + Py_AddPendingCall(report_wakeup_error, NULL); + } + } +#else if (wakeup_fd != -1) { byte = (unsigned char)sig_num; - while ((rc = write(wakeup_fd, &byte, 1)) == -1 && errno == EINTR); - if (rc == -1) - Py_AddPendingCall(report_wakeup_error, (void *) (Py_intptr_t) errno); + do { + rc = write(wakeup_fd, &byte, 1); + } while (rc < 0 && errno == EINTR); + + if (rc < 0) { + Py_AddPendingCall(report_wakeup_error, + (void *)(Py_intptr_t)errno); + } } - if (is_tripped) - return; - /* Set is_tripped after setting .tripped, as it gets - cleared in PyErr_CheckSignals() before .tripped. */ - is_tripped = 1; - Py_AddPendingCall(checksignals_witharg, NULL); +#endif + + if (!is_tripped) { + /* Set is_tripped after setting .tripped, as it gets + cleared in PyErr_CheckSignals() before .tripped. */ + is_tripped = 1; + Py_AddPendingCall(checksignals_witharg, NULL); + } } static void @@ -426,10 +492,28 @@ static PyObject * signal_set_wakeup_fd(PyObject *self, PyObject *args) { - struct stat buf; +#ifdef MS_WINDOWS + PyObject *fdobj; + SOCKET_T fd, old_fd; + int res; + int res_size = sizeof res; + PyObject *mod; + struct stat st; + + if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj)) + return NULL; + + fd = PyLong_AsSocket_t(fdobj); + if (fd == (SOCKET_T)(-1) && PyErr_Occurred()) + return NULL; +#else int fd, old_fd; + struct stat st; + if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd)) return NULL; +#endif + #ifdef WITH_THREAD if (PyThread_get_thread_ident() != main_thread) { PyErr_SetString(PyExc_ValueError, @@ -438,28 +522,54 @@ } #endif - if (fd != -1) { - if (!_PyVerify_fd(fd)) { - PyErr_SetString(PyExc_ValueError, "invalid fd"); +#ifdef MS_WINDOWS + if (fd != INVALID_SOCKET) { + /* Import the _socket module to call WSAStartup() */ + mod = PyImport_ImportModuleNoBlock("_socket"); + if (mod == NULL) + return NULL; + Py_DECREF(mod); + + /* test the socket */ + if (getsockopt(fd, SOL_SOCKET, SO_ERROR, + (char *)&res, &res_size) != 0) { + int err = WSAGetLastError(); + if (err == WSAENOTSOCK) + PyErr_SetString(PyExc_ValueError, "fd is not a socket"); + else + PyErr_SetExcFromWindowsErr(PyExc_OSError, err); return NULL; } + } - if (fstat(fd, &buf) != 0) - return PyErr_SetFromErrno(PyExc_OSError); + old_fd = wakeup.fd; + wakeup.fd = fd; + + if (old_fd != INVALID_SOCKET) + return PyLong_FromSocket_t(old_fd); + else + return PyLong_FromLong(-1); +#else + if (fd != -1) { + if (fstat(fd, &st) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } } old_fd = wakeup_fd; wakeup_fd = fd; return PyLong_FromLong(old_fd); +#endif } PyDoc_STRVAR(set_wakeup_fd_doc, "set_wakeup_fd(fd) -> fd\n\ \n\ -Sets the fd to be written to (with '\\0') when a signal\n\ +Sets the fd to be written to (with the signal number) when a signal\n\ comes in. A library can use this to wakeup select or poll.\n\ -The previous fd is returned.\n\ +The previous fd or -1 is returned.\n\ \n\ The fd must be non-blocking."); @@ -467,10 +577,17 @@ int PySignal_SetWakeupFd(int fd) { - int old_fd = wakeup_fd; + int old_fd; if (fd < 0) fd = -1; + +#ifdef MS_WINDOWS + old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); + wakeup.fd = fd; +#else + old_fd = wakeup_fd; wakeup_fd = fd; +#endif return old_fd; } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -176,7 +176,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -212,7 +212,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -247,7 +247,7 @@ "$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -285,7 +285,7 @@ "$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -317,7 +317,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -353,7 +353,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 MachineX64 @@ -386,7 +386,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -422,7 +422,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 MachineX64 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 22:12:57 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 22:12:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5ODg0?= =?utf-8?q?=2C_readline=3A_calling_rl=5Fvariable=5Fbind_=28=22enable-meta-?= =?utf-8?b?a2V5IiwgIm9mZiIp?= Message-ID: <3hK4V12XZxz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/f0ab6f9f0603 changeset: 91835:f0ab6f9f0603 branch: 2.7 parent: 91833:d422062d7d36 user: Victor Stinner date: Thu Jul 24 22:11:21 2014 +0200 summary: Issue #19884, readline: calling rl_variable_bind ("enable-meta-key", "off") does crash on Mac OS X which uses libedit instead of readline. files: Modules/readline.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -933,15 +933,19 @@ begidx = PyInt_FromLong(0L); endidx = PyInt_FromLong(0L); +#ifndef __APPLE__ if (!isatty(STDOUT_FILENO)) { /* Issue #19884: stdout is no a terminal. Disable meta modifier keys to not write the ANSI sequence "\033[1034h" into stdout. On terminals supporting 8 bit characters like TERM=xterm-256color (which is now the default Fedora since Fedora 18), the meta key is used to enable support of 8 bit characters (ANSI sequence - "\033[1034h"). */ + "\033[1034h"). + + With libedit, this call makes readline() crash. */ rl_variable_bind ("enable-meta-key", "off"); } +#endif /* Initialize (allows .inputrc to override) * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 22:12:58 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 22:12:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5ODg0?= =?utf-8?q?=2C_readline=3A_calling_rl=5Fvariable=5Fbind_=28=22enable-meta-?= =?utf-8?b?a2V5IiwgIm9mZiIp?= Message-ID: <3hK4V24MlDz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/3f08c1156050 changeset: 91836:3f08c1156050 branch: 3.4 parent: 91831:b7f144d14798 user: Victor Stinner date: Thu Jul 24 22:11:38 2014 +0200 summary: Issue #19884, readline: calling rl_variable_bind ("enable-meta-key", "off") does crash on Mac OS X which uses libedit instead of readline. files: Modules/readline.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1020,15 +1020,19 @@ mod_state->begidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L); +#ifndef __APPLE__ if (!isatty(STDOUT_FILENO)) { /* Issue #19884: stdout is no a terminal. Disable meta modifier keys to not write the ANSI sequence "\033[1034h" into stdout. On terminals supporting 8 bit characters like TERM=xterm-256color (which is now the default Fedora since Fedora 18), the meta key is used to enable support of 8 bit characters (ANSI sequence - "\033[1034h"). */ + "\033[1034h"). + + With libedit, this call makes readline() crash. */ rl_variable_bind ("enable-meta-key", "off"); } +#endif /* Initialize (allows .inputrc to override) * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 22:12:59 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 22:12:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2319884=2C_readline=3A_calling_?= =?utf-8?q?rl=5Fvariable=5Fbind?= Message-ID: <3hK4V36Hvzz7Ljx@mail.python.org> http://hg.python.org/cpython/rev/0ed1801bf4bd changeset: 91837:0ed1801bf4bd parent: 91834:42ced0d023cd parent: 91836:3f08c1156050 user: Victor Stinner date: Thu Jul 24 22:11:55 2014 +0200 summary: (Merge 3.4) Issue #19884, readline: calling rl_variable_bind ("enable-meta-key", "off") does crash on Mac OS X which uses libedit instead of readline. files: Modules/readline.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1020,15 +1020,19 @@ mod_state->begidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L); +#ifndef __APPLE__ if (!isatty(STDOUT_FILENO)) { /* Issue #19884: stdout is no a terminal. Disable meta modifier keys to not write the ANSI sequence "\033[1034h" into stdout. On terminals supporting 8 bit characters like TERM=xterm-256color (which is now the default Fedora since Fedora 18), the meta key is used to enable support of 8 bit characters (ANSI sequence - "\033[1034h"). */ + "\033[1034h"). + + With libedit, this call makes readline() crash. */ rl_variable_bind ("enable-meta-key", "off"); } +#endif /* Initialize (allows .inputrc to override) * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 24 22:33:31 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 22:33:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_475=3A_Fix_Hello_World_ex?= =?utf-8?q?ample?= Message-ID: <3hK4xl2091z7LjQ@mail.python.org> http://hg.python.org/peps/rev/c499dee43fdd changeset: 5504:c499dee43fdd user: Victor Stinner date: Thu Jul 24 22:33:23 2014 +0200 summary: PEP 475: Fix Hello World example files: pep-0475.txt | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/pep-0475.txt b/pep-0475.txt --- a/pep-0475.txt +++ b/pep-0475.txt @@ -99,8 +99,9 @@ while True: try: print("Hello World") + break except InterruptedError: - pass + continue ``InterruptedError`` can happen in unexpected places. For example, ``os.close()`` and ``FileIO.close()`` can raises ``InterruptedError``: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Jul 24 22:51:23 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 24 Jul 2014 22:51:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Backout_42ced0d023cd=3A_oo?= =?utf-8?q?ps=2C_i_didn=27t_want_to_push_this_changeset_=3A-/?= Message-ID: <3hK5LM2b2Dz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/96ea15ee8525 changeset: 91838:96ea15ee8525 user: Victor Stinner date: Thu Jul 24 22:51:05 2014 +0200 summary: Backout 42ced0d023cd: oops, i didn't want to push this changeset :-/ files: Doc/c-api/exceptions.rst | 13 +- Doc/library/signal.rst | 5 - Lib/test/test_signal.py | 130 +------------------- Modules/signalmodule.c | 155 +++--------------------- PCbuild/pythoncore.vcxproj | 16 +- 5 files changed, 41 insertions(+), 278 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 @@ -443,20 +443,13 @@ .. c:function:: int PySignal_SetWakeupFd(int fd) - This utility function specifies a file descriptor to which the signal number - is written as a single byte whenever a signal is received. *fd* must be - non-blocking. It returns the previous such file descriptor. - - On Windows, the function only supports socket handles. - - The value ``-1`` disables the feature; this is the initial state. + This utility function specifies a file descriptor to which a ``'\0'`` byte will + be written whenever a signal is received. It returns the previous such file + descriptor. The value ``-1`` disables the feature; this is the initial state. This is equivalent to :func:`signal.set_wakeup_fd` in Python, but without any error checking. *fd* should be a valid file descriptor. The function should only be called from the main thread. - .. versionchanged:: 3.5 - On Windows, the function now only supports socket handles. - .. c:function:: PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -308,8 +308,6 @@ a library to wakeup a poll or select call, allowing the signal to be fully processed. - On Windows, the function only supports socket handles. - The old wakeup fd is returned. *fd* must be non-blocking. It is up to the library to remove any bytes before calling poll or select again. @@ -320,9 +318,6 @@ attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. - .. versionchanged:: 3.5 - On Windows, the function now only supports socket handles. - .. function:: siginterrupt(signalnum, flag) 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 @@ -6,7 +6,6 @@ import pickle import select import signal -import socket import struct import subprocess import traceback @@ -252,43 +251,21 @@ class WakeupFDTests(unittest.TestCase): def test_invalid_fd(self): - if sys.platform == "win32": - sock = socket.socket() - fd = sock.fileno() - sock.close() - else: - fd = support.make_bad_fd() + fd = support.make_bad_fd() self.assertRaises((ValueError, OSError), signal.set_wakeup_fd, fd) - @unittest.skipUnless(sys.platform == "win32", 'test specific to Windows') - def test_only_socket(self): - # set_wakeup_fd() expects a socket on Windows - with open(support.TESTFN, 'wb') as fp: - self.addCleanup(support.unlink, support.TESTFN) - self.assertRaises(ValueError, - signal.set_wakeup_fd, fp.fileno()) + def test_set_wakeup_fd_result(self): + r1, w1 = os.pipe() + self.addCleanup(os.close, r1) + self.addCleanup(os.close, w1) + r2, w2 = os.pipe() + self.addCleanup(os.close, r2) + self.addCleanup(os.close, w2) - def test_set_wakeup_fd_result(self): - if sys.platform == 'win32': - sock1 = socket.socket() - self.addCleanup(sock1.close) - fd1 = sock1.fileno() - - sock2 = socket.socket() - self.addCleanup(sock2.close) - fd2 = sock2.fileno() - else: - r1, fd1 = os.pipe() - self.addCleanup(os.close, r1) - self.addCleanup(os.close, fd1) - r2, fd2 = os.pipe() - self.addCleanup(os.close, r2) - self.addCleanup(os.close, fd2) - - signal.set_wakeup_fd(fd1) - self.assertIs(signal.set_wakeup_fd(fd2), fd1) - self.assertIs(signal.set_wakeup_fd(-1), fd2) + signal.set_wakeup_fd(w1) + self.assertIs(signal.set_wakeup_fd(w2), w1) + self.assertIs(signal.set_wakeup_fd(-1), w2) self.assertIs(signal.set_wakeup_fd(-1), -1) @@ -464,90 +441,6 @@ """, signal.SIGUSR1, signal.SIGUSR2, ordered=False) - at unittest.skipUnless(hasattr(socket, 'socketpair'), 'need socket.socketpair') -class WakeupSocketSignalTests(unittest.TestCase): - - @unittest.skipIf(_testcapi is None, 'need _testcapi') - def test_socket(self): - # use a subprocess to have only one thread - code = """if 1: - import signal - import socket - import struct - import _testcapi - - signum = signal.SIGINT - signals = (signum,) - - def handler(signum, frame): - pass - - signal.signal(signum, handler) - - read, write = socket.socketpair() - read.setblocking(False) - write.setblocking(False) - signal.set_wakeup_fd(write.fileno()) - - _testcapi.raise_signal(signum) - - data = read.recv(1) - if not data: - raise Exception("no signum written") - raised = struct.unpack('B', data) - if raised != signals: - raise Exception("%r != %r" % (raised, signals)) - - read.close() - write.close() - """ - - assert_python_ok('-c', code) - - @unittest.skipIf(_testcapi is None, 'need _testcapi') - def test_send_error(self): - # Use a subprocess to have only one thread. - if os.name == 'nt': - action = 'send' - else: - action = 'write' - code = """if 1: - import errno - import signal - import socket - import sys - import time - import _testcapi - from test.support import captured_stderr - - signum = signal.SIGINT - - def handler(signum, frame): - pass - - signal.signal(signum, handler) - - read, write = socket.socketpair() - read.setblocking(False) - write.setblocking(False) - - signal.set_wakeup_fd(write.fileno()) - - # Close sockets: send() will fail - read.close() - write.close() - - with captured_stderr() as err: - _testcapi.raise_signal(signum) - - err = err.getvalue() - if ('Exception ignored when trying to {action} to the signal wakeup fd' - not in err): - raise AssertionError(err) - """.format(action=action) - assert_python_ok('-c', code) - - @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class SiginterruptTest(unittest.TestCase): @@ -1097,7 +990,6 @@ try: support.run_unittest(GenericTests, PosixTests, InterProcessSignalTests, WakeupFDTests, WakeupSignalTests, - WakeupSocketSignalTests, SiginterruptTest, ItimerTest, WindowsSignalTests, PendingSignalsTests) finally: diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -4,9 +4,6 @@ /* XXX Signals should be recorded per thread, now we have thread state. */ #include "Python.h" -#ifdef MS_WINDOWS -#include "socketmodule.h" /* needed for SOCKET_T */ -#endif #ifndef MS_WINDOWS #include "posixmodule.h" #endif @@ -90,18 +87,7 @@ PyObject *func; } Handlers[NSIG]; -#ifdef MS_WINDOWS -#define INVALID_SOCKET ((SOCKET_T)-1) - -static volatile struct { - SOCKET_T fd; - int send_err_set; - int send_errno; - int send_win_error; -} wakeup = {INVALID_SOCKET, 0, 0}; -#else static volatile sig_atomic_t wakeup_fd = -1; -#endif /* Speed up sigcheck() when none tripped */ static volatile sig_atomic_t is_tripped = 0; @@ -185,33 +171,6 @@ return PyErr_CheckSignals(); } -#ifdef MS_WINDOWS -static int -report_wakeup_error(void* Py_UNUSED(data)) -{ - PyObject *res; - - if (wakeup.send_win_error) { - /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which - recognizes the error codes used by both GetLastError() and - WSAGetLastError */ - res = PyErr_SetExcFromWindowsErr(PyExc_OSError, wakeup.send_win_error); - } - else { - errno = wakeup.send_errno; - res = PyErr_SetFromErrno(PyExc_OSError); - } - - assert(res == NULL); - wakeup.send_err_set = 0; - - PySys_WriteStderr("Exception ignored when trying to send to the " - "signal wakeup fd:\n"); - PyErr_WriteUnraisable(NULL); - - return 0; -} -#else static int report_wakeup_error(void *data) { @@ -224,51 +183,26 @@ errno = save_errno; return 0; } -#endif static void trip_signal(int sig_num) { unsigned char byte; - Py_ssize_t rc; + int rc = 0; Handlers[sig_num].tripped = 1; - -#ifdef MS_WINDOWS - if (wakeup.fd != INVALID_SOCKET) { - byte = (unsigned char)sig_num; - do { - rc = send(wakeup.fd, &byte, 1, 0); - } while (rc < 0 && errno == EINTR); - - /* we only have a storage for one error in the wakeup structure */ - if (rc < 0 && !wakeup.send_err_set) { - wakeup.send_err_set = 1; - wakeup.send_errno = errno; - wakeup.send_win_error = GetLastError(); - Py_AddPendingCall(report_wakeup_error, NULL); - } - } -#else if (wakeup_fd != -1) { byte = (unsigned char)sig_num; - do { - rc = write(wakeup_fd, &byte, 1); - } while (rc < 0 && errno == EINTR); - - if (rc < 0) { - Py_AddPendingCall(report_wakeup_error, - (void *)(Py_intptr_t)errno); - } + while ((rc = write(wakeup_fd, &byte, 1)) == -1 && errno == EINTR); + if (rc == -1) + Py_AddPendingCall(report_wakeup_error, (void *) (Py_intptr_t) errno); } -#endif - - if (!is_tripped) { - /* Set is_tripped after setting .tripped, as it gets - cleared in PyErr_CheckSignals() before .tripped. */ - is_tripped = 1; - Py_AddPendingCall(checksignals_witharg, NULL); - } + if (is_tripped) + return; + /* Set is_tripped after setting .tripped, as it gets + cleared in PyErr_CheckSignals() before .tripped. */ + is_tripped = 1; + Py_AddPendingCall(checksignals_witharg, NULL); } static void @@ -492,28 +426,10 @@ static PyObject * signal_set_wakeup_fd(PyObject *self, PyObject *args) { -#ifdef MS_WINDOWS - PyObject *fdobj; - SOCKET_T fd, old_fd; - int res; - int res_size = sizeof res; - PyObject *mod; - struct stat st; - - if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj)) - return NULL; - - fd = PyLong_AsSocket_t(fdobj); - if (fd == (SOCKET_T)(-1) && PyErr_Occurred()) - return NULL; -#else + struct stat buf; int fd, old_fd; - struct stat st; - if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd)) return NULL; -#endif - #ifdef WITH_THREAD if (PyThread_get_thread_ident() != main_thread) { PyErr_SetString(PyExc_ValueError, @@ -522,54 +438,28 @@ } #endif -#ifdef MS_WINDOWS - if (fd != INVALID_SOCKET) { - /* Import the _socket module to call WSAStartup() */ - mod = PyImport_ImportModuleNoBlock("_socket"); - if (mod == NULL) - return NULL; - Py_DECREF(mod); - - /* test the socket */ - if (getsockopt(fd, SOL_SOCKET, SO_ERROR, - (char *)&res, &res_size) != 0) { - int err = WSAGetLastError(); - if (err == WSAENOTSOCK) - PyErr_SetString(PyExc_ValueError, "fd is not a socket"); - else - PyErr_SetExcFromWindowsErr(PyExc_OSError, err); + if (fd != -1) { + if (!_PyVerify_fd(fd)) { + PyErr_SetString(PyExc_ValueError, "invalid fd"); return NULL; } - } - old_fd = wakeup.fd; - wakeup.fd = fd; - - if (old_fd != INVALID_SOCKET) - return PyLong_FromSocket_t(old_fd); - else - return PyLong_FromLong(-1); -#else - if (fd != -1) { - if (fstat(fd, &st) != 0) { - PyErr_SetFromErrno(PyExc_OSError); - return NULL; - } + if (fstat(fd, &buf) != 0) + return PyErr_SetFromErrno(PyExc_OSError); } old_fd = wakeup_fd; wakeup_fd = fd; return PyLong_FromLong(old_fd); -#endif } PyDoc_STRVAR(set_wakeup_fd_doc, "set_wakeup_fd(fd) -> fd\n\ \n\ -Sets the fd to be written to (with the signal number) when a signal\n\ +Sets the fd to be written to (with '\\0') when a signal\n\ comes in. A library can use this to wakeup select or poll.\n\ -The previous fd or -1 is returned.\n\ +The previous fd is returned.\n\ \n\ The fd must be non-blocking."); @@ -577,17 +467,10 @@ int PySignal_SetWakeupFd(int fd) { - int old_fd; + int old_fd = wakeup_fd; if (fd < 0) fd = -1; - -#ifdef MS_WINDOWS - old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); - wakeup.fd = fd; -#else - old_fd = wakeup_fd; wakeup_fd = fd; -#endif return old_fd; } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -176,7 +176,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -212,7 +212,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -247,7 +247,7 @@ "$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -285,7 +285,7 @@ "$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -317,7 +317,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -353,7 +353,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 MachineX64 @@ -386,7 +386,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -422,7 +422,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 MachineX64 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 00:58:07 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 00:58:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322018=3A_Fix_test?= =?utf-8?b?X3NldF93YWtldXBfZmRfcmVzdWx0KCksIHVzZSBhc3NlcnRFcXVhbCgpIG5v?= =?utf-8?q?t?= Message-ID: <3hK88b66l4z7LjM@mail.python.org> http://hg.python.org/cpython/rev/5ce01ee2a8f4 changeset: 91839:5ce01ee2a8f4 user: Victor Stinner date: Thu Jul 24 22:55:12 2014 +0200 summary: Issue #22018: Fix test_set_wakeup_fd_result(), use assertEqual() not assertIs(). files: Lib/test/test_signal.py | 6 +++--- 1 files changed, 3 insertions(+), 3 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 @@ -264,9 +264,9 @@ self.addCleanup(os.close, w2) signal.set_wakeup_fd(w1) - self.assertIs(signal.set_wakeup_fd(w2), w1) - self.assertIs(signal.set_wakeup_fd(-1), w2) - self.assertIs(signal.set_wakeup_fd(-1), -1) + self.assertEqual(signal.set_wakeup_fd(w2), w1) + self.assertEqual(signal.set_wakeup_fd(-1), w2) + self.assertEqual(signal.set_wakeup_fd(-1), -1) @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 00:58:09 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 00:58:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3hK88d201Wz7Ljw@mail.python.org> http://hg.python.org/cpython/rev/ea1057bc60ab changeset: 91840:ea1057bc60ab branch: 3.4 parent: 91836:3f08c1156050 user: Victor Stinner date: Fri Jul 25 00:54:53 2014 +0200 summary: asyncio: sync with Tulip Improve stability of the proactor event loop, especially operations on overlapped objects: * Tulip issue 195: Don't call UnregisterWait() twice if a _WaitHandleFuture is cancelled twice to fix a crash. * IocpProactor.close(): cancel futures to cancel overlapped operations, instead of cancelling directly overlapped operations. Future objects may not call ov.cancel() if the future was cancelled or if the overlapped was already cancelled. The cancel() method of the future may also catch exceptions. Log also errors on cancellation. * tests: rename "f" to "fut" * Add a __repr__() method to IocpProactor * Add a destructor to IocpProactor which closes it * _OverlappedFuture.cancel() doesn't cancel the overlapped anymore if it is done: if it is already cancelled or completed. Log also an error if the cancellation failed. * Add the address of the overlapped object in repr(_OverlappedFuture) * _OverlappedFuture truncates the source traceback to hide the call to the parent constructor (useless in debug). files: Lib/asyncio/windows_events.py | 66 ++++++--- Lib/test/test_asyncio/test_windows_events.py | 30 +++- 2 files changed, 66 insertions(+), 30 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -38,14 +38,14 @@ def __init__(self, ov, *, loop=None): super().__init__(loop=loop) + if self._source_traceback: + del self._source_traceback[-1] self.ov = ov def __repr__(self): info = [self._state.lower()] - if self.ov.pending: - info.append('overlapped=pending') - else: - info.append('overlapped=completed') + state = 'pending' if self.ov.pending else 'completed' + info.append('overlapped=<%s, %#x>' % (state, self.ov.address)) if self._state == futures._FINISHED: info.append(self._format_result()) if self._callbacks: @@ -53,10 +53,18 @@ return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def cancel(self): - try: - self.ov.cancel() - except OSError: - pass + if not self.done(): + try: + self.ov.cancel() + except OSError as exc: + context = { + 'message': 'Cancelling an overlapped future failed', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) return super().cancel() @@ -67,13 +75,20 @@ super().__init__(loop=loop) self._wait_handle = wait_handle - def cancel(self): - super().cancel() + def _unregister(self): + if self._wait_handle is None: + return try: _overlapped.UnregisterWait(self._wait_handle) except OSError as e: if e.winerror != _overlapped.ERROR_IO_PENDING: raise + # ERROR_IO_PENDING is not an error, the wait was unregistered + self._wait_handle = None + + def cancel(self): + self._unregister() + super().cancel() class PipeServer(object): @@ -208,6 +223,11 @@ self._registered = weakref.WeakSet() self._stopped_serving = weakref.WeakSet() + def __repr__(self): + return ('<%s overlapped#=%s result#=%s>' + % (self.__class__.__name__, len(self._cache), + len(self._results))) + def set_loop(self, loop): self._loop = loop @@ -353,12 +373,7 @@ f = _WaitHandleFuture(wh, loop=self._loop) def finish_wait_for_handle(trans, key, ov): - if not f.cancelled(): - try: - _overlapped.UnregisterWait(wh) - except OSError as e: - if e.winerror != _overlapped.ERROR_IO_PENDING: - raise + f._unregister() # Note that this second wait means that we should only use # this with handles types where a successful wait has no # effect. So events or processes are all right, but locks @@ -455,7 +470,7 @@ def close(self): # Cancel remaining registered operations. - for address, (f, ov, obj, callback) in list(self._cache.items()): + for address, (fut, ov, obj, callback) in list(self._cache.items()): if obj is None: # The operation was started with connect_pipe() which # queues a task to Windows' thread pool. This cannot @@ -463,9 +478,17 @@ del self._cache[address] else: try: - ov.cancel() - except OSError: - pass + fut.cancel() + except OSError as exc: + if self._loop is not None: + context = { + 'message': 'Cancelling a future failed', + 'exception': exc, + 'future': fut, + } + if fut._source_traceback: + context['source_traceback'] = fut._source_traceback + self._loop.call_exception_handler(context) while self._cache: if not self._poll(1): @@ -476,6 +499,9 @@ _winapi.CloseHandle(self._iocp) self._iocp = None + def __del__(self): + self.close() + class _WindowsSubprocessTransport(base_subprocess.BaseSubprocessTransport): diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -96,36 +96,46 @@ # Wait for unset event with 0.5s timeout; # result should be False at timeout - f = self.loop._proactor.wait_for_handle(event, 0.5) + fut = self.loop._proactor.wait_for_handle(event, 0.5) start = self.loop.time() - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start - self.assertFalse(f.result()) + self.assertFalse(fut.result()) self.assertTrue(0.48 < elapsed < 0.9, elapsed) _overlapped.SetEvent(event) # Wait for for set event; # result should be True immediately - f = self.loop._proactor.wait_for_handle(event, 10) + fut = self.loop._proactor.wait_for_handle(event, 10) start = self.loop.time() - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start - self.assertTrue(f.result()) + self.assertTrue(fut.result()) self.assertTrue(0 <= elapsed < 0.3, elapsed) - _overlapped.ResetEvent(event) + # Tulip issue #195: cancelling a done _WaitHandleFuture must not crash + fut.cancel() + + def test_wait_for_handle_cancel(self): + event = _overlapped.CreateEvent(None, True, False, None) + self.addCleanup(_winapi.CloseHandle, event) # Wait for unset event with a cancelled future; # CancelledError should be raised immediately - f = self.loop._proactor.wait_for_handle(event, 10) - f.cancel() + fut = self.loop._proactor.wait_for_handle(event, 10) + fut.cancel() start = self.loop.time() with self.assertRaises(asyncio.CancelledError): - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start self.assertTrue(0 <= elapsed < 0.1, elapsed) + # Tulip issue #195: cancelling a _WaitHandleFuture twice must not crash + fut = self.loop._proactor.wait_for_handle(event) + fut.cancel() + fut.cancel() + if __name__ == '__main__': unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 00:58:10 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 00:58:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3hK88f4x85z7Lk9@mail.python.org> http://hg.python.org/cpython/rev/0ca9e0aa06df changeset: 91841:0ca9e0aa06df parent: 91839:5ce01ee2a8f4 parent: 91840:ea1057bc60ab user: Victor Stinner date: Fri Jul 25 00:55:23 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip Improve stability of the proactor event loop, especially operations on overlapped objects: * Tulip issue 195: Don't call UnregisterWait() twice if a _WaitHandleFuture is cancelled twice to fix a crash. * IocpProactor.close(): cancel futures to cancel overlapped operations, instead of cancelling directly overlapped operations. Future objects may not call ov.cancel() if the future was cancelled or if the overlapped was already cancelled. The cancel() method of the future may also catch exceptions. Log also errors on cancellation. * tests: rename "f" to "fut" * Add a __repr__() method to IocpProactor * Add a destructor to IocpProactor which closes it * _OverlappedFuture.cancel() doesn't cancel the overlapped anymore if it is done: if it is already cancelled or completed. Log also an error if the cancellation failed. * Add the address of the overlapped object in repr(_OverlappedFuture) * _OverlappedFuture truncates the source traceback to hide the call to the parent constructor (useless in debug). files: Lib/asyncio/windows_events.py | 66 ++++++--- Lib/test/test_asyncio/test_windows_events.py | 30 +++- 2 files changed, 66 insertions(+), 30 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -38,14 +38,14 @@ def __init__(self, ov, *, loop=None): super().__init__(loop=loop) + if self._source_traceback: + del self._source_traceback[-1] self.ov = ov def __repr__(self): info = [self._state.lower()] - if self.ov.pending: - info.append('overlapped=pending') - else: - info.append('overlapped=completed') + state = 'pending' if self.ov.pending else 'completed' + info.append('overlapped=<%s, %#x>' % (state, self.ov.address)) if self._state == futures._FINISHED: info.append(self._format_result()) if self._callbacks: @@ -53,10 +53,18 @@ return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) def cancel(self): - try: - self.ov.cancel() - except OSError: - pass + if not self.done(): + try: + self.ov.cancel() + except OSError as exc: + context = { + 'message': 'Cancelling an overlapped future failed', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) return super().cancel() @@ -67,13 +75,20 @@ super().__init__(loop=loop) self._wait_handle = wait_handle - def cancel(self): - super().cancel() + def _unregister(self): + if self._wait_handle is None: + return try: _overlapped.UnregisterWait(self._wait_handle) except OSError as e: if e.winerror != _overlapped.ERROR_IO_PENDING: raise + # ERROR_IO_PENDING is not an error, the wait was unregistered + self._wait_handle = None + + def cancel(self): + self._unregister() + super().cancel() class PipeServer(object): @@ -208,6 +223,11 @@ self._registered = weakref.WeakSet() self._stopped_serving = weakref.WeakSet() + def __repr__(self): + return ('<%s overlapped#=%s result#=%s>' + % (self.__class__.__name__, len(self._cache), + len(self._results))) + def set_loop(self, loop): self._loop = loop @@ -353,12 +373,7 @@ f = _WaitHandleFuture(wh, loop=self._loop) def finish_wait_for_handle(trans, key, ov): - if not f.cancelled(): - try: - _overlapped.UnregisterWait(wh) - except OSError as e: - if e.winerror != _overlapped.ERROR_IO_PENDING: - raise + f._unregister() # Note that this second wait means that we should only use # this with handles types where a successful wait has no # effect. So events or processes are all right, but locks @@ -455,7 +470,7 @@ def close(self): # Cancel remaining registered operations. - for address, (f, ov, obj, callback) in list(self._cache.items()): + for address, (fut, ov, obj, callback) in list(self._cache.items()): if obj is None: # The operation was started with connect_pipe() which # queues a task to Windows' thread pool. This cannot @@ -463,9 +478,17 @@ del self._cache[address] else: try: - ov.cancel() - except OSError: - pass + fut.cancel() + except OSError as exc: + if self._loop is not None: + context = { + 'message': 'Cancelling a future failed', + 'exception': exc, + 'future': fut, + } + if fut._source_traceback: + context['source_traceback'] = fut._source_traceback + self._loop.call_exception_handler(context) while self._cache: if not self._poll(1): @@ -476,6 +499,9 @@ _winapi.CloseHandle(self._iocp) self._iocp = None + def __del__(self): + self.close() + class _WindowsSubprocessTransport(base_subprocess.BaseSubprocessTransport): diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -96,36 +96,46 @@ # Wait for unset event with 0.5s timeout; # result should be False at timeout - f = self.loop._proactor.wait_for_handle(event, 0.5) + fut = self.loop._proactor.wait_for_handle(event, 0.5) start = self.loop.time() - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start - self.assertFalse(f.result()) + self.assertFalse(fut.result()) self.assertTrue(0.48 < elapsed < 0.9, elapsed) _overlapped.SetEvent(event) # Wait for for set event; # result should be True immediately - f = self.loop._proactor.wait_for_handle(event, 10) + fut = self.loop._proactor.wait_for_handle(event, 10) start = self.loop.time() - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start - self.assertTrue(f.result()) + self.assertTrue(fut.result()) self.assertTrue(0 <= elapsed < 0.3, elapsed) - _overlapped.ResetEvent(event) + # Tulip issue #195: cancelling a done _WaitHandleFuture must not crash + fut.cancel() + + def test_wait_for_handle_cancel(self): + event = _overlapped.CreateEvent(None, True, False, None) + self.addCleanup(_winapi.CloseHandle, event) # Wait for unset event with a cancelled future; # CancelledError should be raised immediately - f = self.loop._proactor.wait_for_handle(event, 10) - f.cancel() + fut = self.loop._proactor.wait_for_handle(event, 10) + fut.cancel() start = self.loop.time() with self.assertRaises(asyncio.CancelledError): - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start self.assertTrue(0 <= elapsed < 0.1, elapsed) + # Tulip issue #195: cancelling a _WaitHandleFuture twice must not crash + fut = self.loop._proactor.wait_for_handle(event) + fut.cancel() + fut.cancel() + if __name__ == '__main__': unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 08:27:08 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 25 Jul 2014 08:27:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDUz?= =?utf-8?q?=3A_Make_help_work=2C_after_previous_patch_for_this_issue_disab?= =?utf-8?q?led_it?= Message-ID: <3hKL6h5krrz7LjM@mail.python.org> http://hg.python.org/cpython/rev/7a55b34f1db2 changeset: 91842:7a55b34f1db2 branch: 2.7 parent: 91835:f0ab6f9f0603 user: Terry Jan Reedy date: Fri Jul 25 01:56:17 2014 -0400 summary: Issue #22053: Make help work, after previous patch for this issue disabled it by removing global 'demo'. Refactor and remove duplicate code. files: Demo/turtle/turtleDemo.py | 27 +++++++++------------------ 1 files changed, 9 insertions(+), 18 deletions(-) diff --git a/Demo/turtle/turtleDemo.py b/Demo/turtle/turtleDemo.py --- a/Demo/turtle/turtleDemo.py +++ b/Demo/turtle/turtleDemo.py @@ -44,17 +44,11 @@ entries2.append(subdir+scripts) return entries2 -def showDemoHelp(): - view_file(demo.root, "Help on turtleDemo", - os.path.join(demo_dir, "demohelp.txt")) - -def showAboutDemo(): - view_file(demo.root, "About turtleDemo", - os.path.join(demo_dir, "about_turtledemo.txt")) - -def showAboutTurtle(): - view_file(demo.root, "About the new turtle module.", - os.path.join(demo_dir, "about_turtle.txt")) +help_entries = ( # (help_label, help_file) + ('Turtledemo help', "demohelp.txt"), + ('About turtledemo', "about_turtledemo.txt"), + ('About turtle module', "about_turtle.txt"), + ) class DemoWindow(object): @@ -200,18 +194,15 @@ CmdBtn['menu'] = CmdBtn.menu return CmdBtn - def makeHelpMenu(self): CmdBtn = Menubutton(self.mBar, text='Help', underline=0, font = menufont) CmdBtn.pack(side=LEFT, padx='2m') CmdBtn.menu = Menu(CmdBtn) - CmdBtn.menu.add_command(label='About turtle.py', font=menufont, - command=showAboutTurtle) - CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, - command=showDemoHelp) - CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, - command=showAboutDemo) + for help_label, help_file in help_entries: + def show(help_label=help_label, help_file=help_file): + view_file(self.root, help_label, os.path.join(demo_dir, help_file)) + CmdBtn.menu.add_command(label=help_label, font=menufont, command=show) CmdBtn['menu'] = CmdBtn.menu return CmdBtn -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 08:27:10 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 25 Jul 2014 08:27:10 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDUz?= =?utf-8?q?=3A_Make_help_work=2C_after_previous_patch_for_this_issue_disab?= =?utf-8?q?led_it?= Message-ID: <3hKL6k0FDzz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/c26862955342 changeset: 91843:c26862955342 branch: 3.4 parent: 91840:ea1057bc60ab user: Terry Jan Reedy date: Fri Jul 25 01:56:24 2014 -0400 summary: Issue #22053: Make help work, after previous patch for this issue disabled it by removing global 'demo'. Refactor and remove duplicate code. files: Lib/turtledemo/__main__.py | 26 +++++++++----------------- 1 files changed, 9 insertions(+), 17 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -27,17 +27,11 @@ return [entry[:-3] for entry in os.listdir(demo_dir) if entry.endswith(".py") and entry[0] != '_'] -def showDemoHelp(): - view_file(demo.root, "Help on turtleDemo", - os.path.join(demo_dir, "demohelp.txt")) - -def showAboutDemo(): - view_file(demo.root, "About turtleDemo", - os.path.join(demo_dir, "about_turtledemo.txt")) - -def showAboutTurtle(): - view_file(demo.root, "About the new turtle module.", - os.path.join(demo_dir, "about_turtle.txt")) +help_entries = ( # (help_label, help_file) + ('Turtledemo help', "demohelp.txt"), + ('About turtledemo', "about_turtledemo.txt"), + ('About turtle module', "about_turtle.txt"), + ) class DemoWindow(object): @@ -177,12 +171,10 @@ CmdBtn.pack(side=LEFT, padx='2m') CmdBtn.menu = Menu(CmdBtn) - CmdBtn.menu.add_command(label='About turtle.py', font=menufont, - command=showAboutTurtle) - CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, - command=showDemoHelp) - CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, - command=showAboutDemo) + for help_label, help_file in help_entries: + def show(help_label=help_label, help_file=help_file): + view_file(self.root, help_label, os.path.join(demo_dir, help_file)) + CmdBtn.menu.add_command(label=help_label, font=menufont, command=show) CmdBtn['menu'] = CmdBtn.menu return CmdBtn -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 08:27:11 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 25 Jul 2014 08:27:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322053=3A_Make_hel?= =?utf-8?q?p_work=2C_after_previous_patch_for_this_issue_disabled_it?= Message-ID: <3hKL6l1wKMz7LkK@mail.python.org> http://hg.python.org/cpython/rev/8c972d528f06 changeset: 91844:8c972d528f06 parent: 91841:0ca9e0aa06df user: Terry Jan Reedy date: Fri Jul 25 02:26:40 2014 -0400 summary: Issue #22053: Make help work, after previous patch for this issue disabled it by removing global 'demo'. Simple fix because 2.7/3.4 fix cannot merge. files: Lib/turtledemo/__main__.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -121,7 +121,7 @@ self.mBar = Frame(root, relief=RAISED, borderwidth=2) self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) + #self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) self.mBar.grid(row=0, columnspan=4, sticky='news') pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, @@ -321,6 +321,7 @@ def main(): + global demo demo = DemoWindow() demo.root.mainloop() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 09:08:43 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 25 Jul 2014 09:08:43 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDYx?= =?utf-8?q?=3A_remove_call_of_useless_function_slated_for_removal=2E?= Message-ID: <3hKM2g4ZwLz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/3c4d45f73622 changeset: 91845:3c4d45f73622 branch: 2.7 parent: 91842:7a55b34f1db2 user: Terry Jan Reedy date: Fri Jul 25 03:06:27 2014 -0400 summary: Issue #22061: remove call of useless function slated for removal. files: Demo/turtle/turtleDemo.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Demo/turtle/turtleDemo.py b/Demo/turtle/turtleDemo.py --- a/Demo/turtle/turtleDemo.py +++ b/Demo/turtle/turtleDemo.py @@ -66,7 +66,6 @@ self.mBar = Frame(root, relief=RAISED, borderwidth=2) self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) self.mBar.grid(row=0, columnspan=4, sticky='news') pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 09:08:44 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 25 Jul 2014 09:08:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDYx?= =?utf-8?q?=3A_remove_call_of_useless_function_slated_for_removal=2E?= Message-ID: <3hKM2h6Jf6z7Ljv@mail.python.org> http://hg.python.org/cpython/rev/976f31b2858b changeset: 91846:976f31b2858b branch: 3.4 parent: 91843:c26862955342 user: Terry Jan Reedy date: Fri Jul 25 03:06:32 2014 -0400 summary: Issue #22061: remove call of useless function slated for removal. files: Lib/turtledemo/__main__.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -49,7 +49,6 @@ self.mBar = Frame(root, relief=RAISED, borderwidth=2) self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) self.mBar.grid(row=0, columnspan=4, sticky='news') pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 09:08:46 2014 From: python-checkins at python.org (terry.reedy) Date: Fri, 25 Jul 2014 09:08:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2322061=3A_remove_call_of_useless_function_slated?= =?utf-8?q?_for_removal=2E?= Message-ID: <3hKM2k0TrVz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/9e9e6e9f4cce changeset: 91847:9e9e6e9f4cce parent: 91844:8c972d528f06 parent: 91846:976f31b2858b user: Terry Jan Reedy date: Fri Jul 25 03:08:14 2014 -0400 summary: Issue #22061: remove call of useless function slated for removal. files: Lib/turtledemo/__main__.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -121,7 +121,6 @@ self.mBar = Frame(root, relief=RAISED, borderwidth=2) self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - #self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) self.mBar.grid(row=0, columnspan=4, sticky='news') pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Jul 25 10:37:20 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 25 Jul 2014 10:37:20 +0200 Subject: [Python-checkins] Daily reference leaks (0ca9e0aa06df): sum=-263 Message-ID: results for 0ca9e0aa06df on branch "default" -------------------------------------------- test_asyncio leaked [159, 0, -371] references, sum=-212 test_asyncio leaked [45, 0, -105] memory blocks, sum=-60 test_collections leaked [2, 0, 0] references, sum=2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogJ2jj1f', '-x'] From python-checkins at python.org Fri Jul 25 11:31:55 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 25 Jul 2014 11:31:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDYx?= =?utf-8?q?=3A_Add_deprecation_warnings_in_empty_obsolete_methods=2E?= Message-ID: <3hKQCv13m0z7Lk8@mail.python.org> http://hg.python.org/cpython/rev/f7c84674bdec changeset: 91848:f7c84674bdec branch: 2.7 parent: 91845:3c4d45f73622 user: Serhiy Storchaka date: Fri Jul 25 12:23:08 2014 +0300 summary: Issue #22061: Add deprecation warnings in empty obsolete methods. files: Lib/lib-tk/Tkinter.py | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py --- a/Lib/lib-tk/Tkinter.py +++ b/Lib/lib-tk/Tkinter.py @@ -425,7 +425,10 @@ + _flatten(args) + _flatten(kw.items())) def tk_menuBar(self, *args): """Do not use. Needed in Tk 3.6 and earlier.""" - pass # obsolete since Tk 4.0 + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_menuBar() does nothing and will be removed in 3.6', + DeprecationWarning, stacklevel=2) def wait_variable(self, name='PY_VAR'): """Wait until the variable is modified. @@ -2657,7 +2660,11 @@ selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" Widget.__init__(self, master, 'menu', cnf, kw) def tk_bindForTraversal(self): - pass # obsolete since Tk 4.0 + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_bindForTraversal() does nothing and ' + 'will be removed in 3.6', + DeprecationWarning, stacklevel=2) def tk_mbPost(self): self.tk.call('tk_mbPost', self._w) def tk_mbUnpost(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 11:31:56 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 25 Jul 2014 11:31:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDYx?= =?utf-8?q?=3A_Add_deprecation_warnings_in_empty_obsolete_methods=2E?= Message-ID: <3hKQCw2mRCz7LkQ@mail.python.org> http://hg.python.org/cpython/rev/a50297e793f9 changeset: 91849:a50297e793f9 branch: 3.4 parent: 91846:976f31b2858b user: Serhiy Storchaka date: Fri Jul 25 12:24:07 2014 +0300 summary: Issue #22061: Add deprecation warnings in empty obsolete methods. files: Lib/tkinter/__init__.py | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -421,7 +421,10 @@ + _flatten(args) + _flatten(list(kw.items()))) def tk_menuBar(self, *args): """Do not use. Needed in Tk 3.6 and earlier.""" - pass # obsolete since Tk 4.0 + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_menuBar() does nothing and will be removed in 3.6', + DeprecationWarning, stacklevel=2) def wait_variable(self, name='PY_VAR'): """Wait until the variable is modified. @@ -2674,7 +2677,11 @@ selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" Widget.__init__(self, master, 'menu', cnf, kw) def tk_bindForTraversal(self): - pass # obsolete since Tk 4.0 + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_bindForTraversal() does nothing and ' + 'will be removed in 3.6', + DeprecationWarning, stacklevel=2) def tk_mbPost(self): self.tk.call('tk_mbPost', self._w) def tk_mbUnpost(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 11:31:57 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 25 Jul 2014 11:31:57 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2322061=3A_Restored_empty_obsolete_methods_remove?= =?utf-8?q?d_in_issue_=234350_and?= Message-ID: <3hKQCx4Zlsz7Lkd@mail.python.org> http://hg.python.org/cpython/rev/7e6beea0eeab changeset: 91850:7e6beea0eeab parent: 91847:9e9e6e9f4cce parent: 91849:a50297e793f9 user: Serhiy Storchaka date: Fri Jul 25 12:29:40 2014 +0300 summary: Issue #22061: Restored empty obsolete methods removed in issue #4350 and added deprecation warnings to them. files: Lib/tkinter/__init__.py | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -419,6 +419,12 @@ disabledForeground, insertBackground, troughColor.""" self.tk.call(('tk_setPalette',) + _flatten(args) + _flatten(list(kw.items()))) + def tk_menuBar(self, *args): + """Do not use. Needed in Tk 3.6 and earlier.""" + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_menuBar() does nothing and will be removed in 3.6', + DeprecationWarning, stacklevel=2) def wait_variable(self, name='PY_VAR'): """Wait until the variable is modified. @@ -2660,6 +2666,12 @@ def tk_popup(self, x, y, entry=""): """Post the menu at position X,Y with entry ENTRY.""" self.tk.call('tk_popup', self._w, x, y, entry) + def tk_bindForTraversal(self): + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_bindForTraversal() does nothing and ' + 'will be removed in 3.6', + DeprecationWarning, stacklevel=2) def activate(self, index): """Activate entry at INDEX.""" self.tk.call(self._w, 'activate', index) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 13:18:52 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 13:18:52 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3hKSbJ5fR9z7LjV@mail.python.org> http://hg.python.org/cpython/rev/73ac59ee4d6e changeset: 91851:73ac59ee4d6e branch: 3.4 parent: 91849:a50297e793f9 user: Victor Stinner date: Fri Jul 25 13:05:20 2014 +0200 summary: asyncio: sync with Tulip * Fix _WaitHandleFuture.cancel(): return the result of the parent cancel() method. * _OverlappedFuture.cancel() now clears its reference to the overlapped object. Make also the _OverlappedFuture.ov attribute private. * Check if _WaitHandleFuture completed before unregistering it in the callback. Add also _WaitHandleFuture._poll() and repr(_WaitHandleFuture). * _WaitHandleFuture now unregisters its wait handler if WaitForSingleObject() raises an exception. * _OverlappedFuture.set_exception() now cancels the overlapped operation. files: Lib/asyncio/proactor_events.py | 8 +- Lib/asyncio/windows_events.py | 71 +++++++++++++++------ 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -44,13 +44,9 @@ def __repr__(self): info = [self.__class__.__name__, 'fd=%s' % self._sock.fileno()] if self._read_fut is not None: - ov = "pending" if self._read_fut.ov.pending else "completed" - info.append('read=%s' % ov) + info.append('read=%s' % self._read_fut) if self._write_fut is not None: - if self._write_fut.ov.pending: - info.append("write=pending=%s" % self._pending_write) - else: - info.append("write=completed") + info.append("write=%r" % self._write_fut) if self._buffer: bufsize = len(self._buffer) info.append('write_bufsize=%s' % bufsize) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -40,41 +40,69 @@ super().__init__(loop=loop) if self._source_traceback: del self._source_traceback[-1] - self.ov = ov + self._ov = ov def __repr__(self): info = [self._state.lower()] - state = 'pending' if self.ov.pending else 'completed' - info.append('overlapped=<%s, %#x>' % (state, self.ov.address)) + if self._ov is not None: + state = 'pending' if self._ov.pending else 'completed' + info.append('overlapped=<%s, %#x>' % (state, self._ov.address)) if self._state == futures._FINISHED: info.append(self._format_result()) if self._callbacks: info.append(self._format_callbacks()) return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def _cancel_overlapped(self): + if self._ov is None: + return + try: + self._ov.cancel() + except OSError as exc: + context = { + 'message': 'Cancelling an overlapped future failed', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + self._ov = None + def cancel(self): - if not self.done(): - try: - self.ov.cancel() - except OSError as exc: - context = { - 'message': 'Cancelling an overlapped future failed', - 'exception': exc, - 'future': self, - } - if self._source_traceback: - context['source_traceback'] = self._source_traceback - self._loop.call_exception_handler(context) + self._cancel_overlapped() return super().cancel() + def set_exception(self, exception): + super().set_exception(exception) + self._cancel_overlapped() + class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" - def __init__(self, wait_handle, *, loop=None): + def __init__(self, handle, wait_handle, *, loop=None): super().__init__(loop=loop) + self._handle = handle self._wait_handle = wait_handle + def _poll(self): + # non-blocking wait: use a timeout of 0 millisecond + return (_winapi.WaitForSingleObject(self._handle, 0) == + _winapi.WAIT_OBJECT_0) + + def __repr__(self): + info = [self._state.lower()] + if self._wait_handle: + state = 'pending' if self._poll() else 'completed' + info.append('wait_handle=<%s, %#x>' % (state, self._wait_handle)) + info.append('handle=<%#x>' % self._handle) + if self._state == futures._FINISHED: + info.append(self._format_result()) + if self._callbacks: + info.append(self._format_callbacks()) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def _unregister(self): if self._wait_handle is None: return @@ -88,7 +116,7 @@ def cancel(self): self._unregister() - super().cancel() + return super().cancel() class PipeServer(object): @@ -370,18 +398,19 @@ ov = _overlapped.Overlapped(NULL) wh = _overlapped.RegisterWaitWithQueue( handle, self._iocp, ov.address, ms) - f = _WaitHandleFuture(wh, loop=self._loop) + f = _WaitHandleFuture(handle, wh, loop=self._loop) def finish_wait_for_handle(trans, key, ov): - f._unregister() # Note that this second wait means that we should only use # this with handles types where a successful wait has no # effect. So events or processes are all right, but locks # or semaphores are not. Also note if the handle is # signalled and then quickly reset, then we may return # False even though we have not timed out. - return (_winapi.WaitForSingleObject(handle, 0) == - _winapi.WAIT_OBJECT_0) + try: + return f._poll() + finally: + f._unregister() self._cache[ov.address] = (f, ov, None, finish_wait_for_handle) return f -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 13:18:54 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 13:18:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3hKSbL1yS5z7Ljj@mail.python.org> http://hg.python.org/cpython/rev/dd3ecbe1ab26 changeset: 91852:dd3ecbe1ab26 parent: 91850:7e6beea0eeab parent: 91851:73ac59ee4d6e user: Victor Stinner date: Fri Jul 25 13:05:43 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip * Fix _WaitHandleFuture.cancel(): return the result of the parent cancel() method. * _OverlappedFuture.cancel() now clears its reference to the overlapped object. Make also the _OverlappedFuture.ov attribute private. * Check if _WaitHandleFuture completed before unregistering it in the callback. Add also _WaitHandleFuture._poll() and repr(_WaitHandleFuture). * _WaitHandleFuture now unregisters its wait handler if WaitForSingleObject() raises an exception. * _OverlappedFuture.set_exception() now cancels the overlapped operation. files: Lib/asyncio/proactor_events.py | 8 +- Lib/asyncio/windows_events.py | 71 +++++++++++++++------ 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -44,13 +44,9 @@ def __repr__(self): info = [self.__class__.__name__, 'fd=%s' % self._sock.fileno()] if self._read_fut is not None: - ov = "pending" if self._read_fut.ov.pending else "completed" - info.append('read=%s' % ov) + info.append('read=%s' % self._read_fut) if self._write_fut is not None: - if self._write_fut.ov.pending: - info.append("write=pending=%s" % self._pending_write) - else: - info.append("write=completed") + info.append("write=%r" % self._write_fut) if self._buffer: bufsize = len(self._buffer) info.append('write_bufsize=%s' % bufsize) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -40,41 +40,69 @@ super().__init__(loop=loop) if self._source_traceback: del self._source_traceback[-1] - self.ov = ov + self._ov = ov def __repr__(self): info = [self._state.lower()] - state = 'pending' if self.ov.pending else 'completed' - info.append('overlapped=<%s, %#x>' % (state, self.ov.address)) + if self._ov is not None: + state = 'pending' if self._ov.pending else 'completed' + info.append('overlapped=<%s, %#x>' % (state, self._ov.address)) if self._state == futures._FINISHED: info.append(self._format_result()) if self._callbacks: info.append(self._format_callbacks()) return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def _cancel_overlapped(self): + if self._ov is None: + return + try: + self._ov.cancel() + except OSError as exc: + context = { + 'message': 'Cancelling an overlapped future failed', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + self._ov = None + def cancel(self): - if not self.done(): - try: - self.ov.cancel() - except OSError as exc: - context = { - 'message': 'Cancelling an overlapped future failed', - 'exception': exc, - 'future': self, - } - if self._source_traceback: - context['source_traceback'] = self._source_traceback - self._loop.call_exception_handler(context) + self._cancel_overlapped() return super().cancel() + def set_exception(self, exception): + super().set_exception(exception) + self._cancel_overlapped() + class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" - def __init__(self, wait_handle, *, loop=None): + def __init__(self, handle, wait_handle, *, loop=None): super().__init__(loop=loop) + self._handle = handle self._wait_handle = wait_handle + def _poll(self): + # non-blocking wait: use a timeout of 0 millisecond + return (_winapi.WaitForSingleObject(self._handle, 0) == + _winapi.WAIT_OBJECT_0) + + def __repr__(self): + info = [self._state.lower()] + if self._wait_handle: + state = 'pending' if self._poll() else 'completed' + info.append('wait_handle=<%s, %#x>' % (state, self._wait_handle)) + info.append('handle=<%#x>' % self._handle) + if self._state == futures._FINISHED: + info.append(self._format_result()) + if self._callbacks: + info.append(self._format_callbacks()) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def _unregister(self): if self._wait_handle is None: return @@ -88,7 +116,7 @@ def cancel(self): self._unregister() - super().cancel() + return super().cancel() class PipeServer(object): @@ -370,18 +398,19 @@ ov = _overlapped.Overlapped(NULL) wh = _overlapped.RegisterWaitWithQueue( handle, self._iocp, ov.address, ms) - f = _WaitHandleFuture(wh, loop=self._loop) + f = _WaitHandleFuture(handle, wh, loop=self._loop) def finish_wait_for_handle(trans, key, ov): - f._unregister() # Note that this second wait means that we should only use # this with handles types where a successful wait has no # effect. So events or processes are all right, but locks # or semaphores are not. Also note if the handle is # signalled and then quickly reset, then we may return # False even though we have not timed out. - return (_winapi.WaitForSingleObject(handle, 0) == - _winapi.WAIT_OBJECT_0) + try: + return f._poll() + finally: + f._unregister() self._cache[ov.address] = (f, ov, None, finish_wait_for_handle) return f -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 13:53:08 2014 From: python-checkins at python.org (nick.coghlan) Date: Fri, 25 Jul 2014 13:53:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318093=3A_Factor_o?= =?utf-8?q?ut_the_programs_that_embed_the_runtime?= Message-ID: <3hKTLr6S8nz7LjY@mail.python.org> http://hg.python.org/cpython/rev/88a532a31eb3 changeset: 91853:88a532a31eb3 user: Nick Coghlan date: Fri Jul 25 21:52:14 2014 +1000 summary: Issue #18093: Factor out the programs that embed the runtime files: .gitignore | 4 +- .hgignore | 4 +- .hgtouch | 2 +- Makefile.pre.in | 40 +++++----- Modules/README | 2 + Objects/README | 1 + PCbuild/_freeze_importlib.vcxproj | 4 +- PCbuild/_freeze_importlib.vcxproj.filters | 4 +- PCbuild/python.vcxproj | 2 +- PCbuild/python.vcxproj.filters | 4 +- Programs/README | 1 + Modules/_freeze_importlib.c | 0 Modules/_testembed.c | 0 Modules/python.c | 0 Python/README | 1 + 15 files changed, 37 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -27,8 +27,8 @@ Modules/Setup.local Modules/config.c Modules/ld_so_aix -Modules/_freeze_importlib -Modules/_testembed +Programs/_freeze_importlib +Programs/_testembed PCbuild/*.bsc PCbuild/*.dll PCbuild/*.exe diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -89,8 +89,8 @@ Tools/unicode/MAPPINGS/ BuildLog.htm __pycache__ -Modules/_freeze_importlib -Modules/_testembed +Programs/_freeze_importlib +Programs/_testembed .coverage coverage/ htmlcov/ diff --git a/.hgtouch b/.hgtouch --- a/.hgtouch +++ b/.hgtouch @@ -2,7 +2,7 @@ # Define dependencies of generated files that are checked into hg. # The syntax of this file uses make rule dependencies, without actions -Python/importlib.h: Lib/importlib/_bootstrap.py Modules/_freeze_importlib.c +Python/importlib.h: Lib/importlib/_bootstrap.py Programs/_freeze_importlib.c Include/opcode.h: Lib/opcode.py Tools/scripts/generate_opcode_h.py diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -466,7 +466,7 @@ # Default target all: build_all -build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed python-config +build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Programs/_testembed python-config # Compile a binary with gcc profile guided optimization. profile-opt: @@ -539,8 +539,8 @@ $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make # Build the interpreter -$(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) - $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) +$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) + $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) platform: $(BUILDPYTHON) pybuilddir.txt $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform @@ -665,18 +665,18 @@ echo "-----------------------------------------------"; \ fi -Modules/_testembed: Modules/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) - $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) +Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) + $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) ############################################################################ # Importlib -Modules/_freeze_importlib: Modules/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) - $(LINKCC) $(PY_LDFLAGS) -o $@ Modules/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) +Programs/_freeze_importlib: Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) + $(LINKCC) $(PY_LDFLAGS) -o $@ Programs/_freeze_importlib.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) -Python/importlib.h: $(srcdir)/Lib/importlib/_bootstrap.py Modules/_freeze_importlib.c - $(MAKE) Modules/_freeze_importlib - ./Modules/_freeze_importlib \ +Python/importlib.h: $(srcdir)/Lib/importlib/_bootstrap.py Programs/_freeze_importlib.c + $(MAKE) Programs/_freeze_importlib + ./Programs/_freeze_importlib \ $(srcdir)/Lib/importlib/_bootstrap.py Python/importlib.h @@ -704,11 +704,11 @@ -DVPATH='"$(VPATH)"' \ -o $@ $(srcdir)/Modules/getpath.c -Modules/python.o: $(srcdir)/Modules/python.c - $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/python.c +Programs/python.o: $(srcdir)/Programs/python.c + $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Programs/python.c -Modules/_testembed.o: $(srcdir)/Modules/_testembed.c - $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/_testembed.c +Programs/_testembed.o: $(srcdir)/Programs/_testembed.c + $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Programs/_testembed.c Modules/_sre.o: $(srcdir)/Modules/_sre.c $(srcdir)/Modules/sre.h $(srcdir)/Modules/sre_constants.h $(srcdir)/Modules/sre_lib.h @@ -922,7 +922,7 @@ $(PARSER_HEADERS) \ $(AST_H) -$(LIBRARY_OBJS) $(MODOBJS) Modules/python.o: $(PYTHON_HEADERS) +$(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS) ###################################################################### @@ -1332,7 +1332,7 @@ fi; \ fi $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c - $(INSTALL_DATA) Modules/python.o $(DESTDIR)$(LIBPL)/python.o + $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in $(INSTALL_DATA) Makefile $(DESTDIR)$(LIBPL)/Makefile $(INSTALL_DATA) Modules/Setup $(DESTDIR)$(LIBPL)/Setup @@ -1343,10 +1343,10 @@ $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh $(INSTALL_SCRIPT) python-config.py $(DESTDIR)$(LIBPL)/python-config.py $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(LDVERSION)-config - @if [ -s Modules/python.exp -a \ + @if [ -s Programs/python.exp -a \ "`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ]; then \ echo; echo "Installing support files for building shared extension modules on AIX:"; \ - $(INSTALL_DATA) Modules/python.exp \ + $(INSTALL_DATA) Programs/python.exp \ $(DESTDIR)$(LIBPL)/python.exp; \ echo; echo "$(LIBPL)/python.exp"; \ $(INSTALL_SCRIPT) $(srcdir)/Modules/makexp_aix \ @@ -1526,7 +1526,7 @@ find build -name '*.py[co]' -exec rm -f {} ';' || true -rm -f pybuilddir.txt -rm -f Lib/lib2to3/*Grammar*.pickle - -rm -f Modules/_testembed Modules/_freeze_importlib + -rm -f Programs/_testembed Programs/_freeze_importlib profile-removal: find . -name '*.gc??' -exec rm -f {} ';' @@ -1550,7 +1550,7 @@ done -rm -f core Makefile Makefile.pre config.status \ Modules/Setup Modules/Setup.local Modules/Setup.config \ - Modules/ld_so_aix Modules/python.exp Misc/python.pc + Modules/ld_so_aix Programs/python.exp Misc/python.pc -rm -f python*-gdb.py find $(srcdir)/[a-zA-Z]* '(' -name '*.fdc' -o -name '*~' \ -o -name '[@,#]*' -o -name '*.old' \ diff --git a/Modules/README b/Modules/README new file mode 100644 --- /dev/null +++ b/Modules/README @@ -0,0 +1,2 @@ +Source files for standard library extension modules, +and former extension modules that are now builtin modules. diff --git a/Objects/README b/Objects/README new file mode 100644 --- /dev/null +++ b/Objects/README @@ -0,0 +1,1 @@ +Source files for various builtin objects diff --git a/PCbuild/_freeze_importlib.vcxproj b/PCbuild/_freeze_importlib.vcxproj --- a/PCbuild/_freeze_importlib.vcxproj +++ b/PCbuild/_freeze_importlib.vcxproj @@ -167,7 +167,7 @@ - + @@ -185,4 +185,4 @@ - \ No newline at end of file + diff --git a/PCbuild/_freeze_importlib.vcxproj.filters b/PCbuild/_freeze_importlib.vcxproj.filters --- a/PCbuild/_freeze_importlib.vcxproj.filters +++ b/PCbuild/_freeze_importlib.vcxproj.filters @@ -15,7 +15,7 @@ - + Source Files @@ -24,4 +24,4 @@ Source Files - \ No newline at end of file + diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -510,7 +510,7 @@ - + diff --git a/PCbuild/python.vcxproj.filters b/PCbuild/python.vcxproj.filters --- a/PCbuild/python.vcxproj.filters +++ b/PCbuild/python.vcxproj.filters @@ -19,8 +19,8 @@ - + Source Files - \ No newline at end of file + diff --git a/Programs/README b/Programs/README new file mode 100644 --- /dev/null +++ b/Programs/README @@ -0,0 +1,1 @@ +Source files for binary executables (as opposed to shared modules) diff --git a/Modules/_freeze_importlib.c b/Programs/_freeze_importlib.c rename from Modules/_freeze_importlib.c rename to Programs/_freeze_importlib.c diff --git a/Modules/_testembed.c b/Programs/_testembed.c rename from Modules/_testembed.c rename to Programs/_testembed.c diff --git a/Modules/python.c b/Programs/python.c rename from Modules/python.c rename to Programs/python.c diff --git a/Python/README b/Python/README new file mode 100644 --- /dev/null +++ b/Python/README @@ -0,0 +1,1 @@ +Miscellaneous source files for the main Python shared library -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 13:55:29 2014 From: python-checkins at python.org (nick.coghlan) Date: Fri, 25 Jul 2014 13:55:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Add_missing_NEWS_entry_for?= =?utf-8?q?_issue_=2318093?= Message-ID: <3hKTPY187Vz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/7640af73c19d changeset: 91854:7640af73c19d user: Nick Coghlan date: Fri Jul 25 21:55:07 2014 +1000 summary: Add missing NEWS entry for issue #18093 files: Misc/NEWS | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -661,6 +661,10 @@ Build ----- +- Issue #18093: the programs that embed the CPython runtime are now in a + separate "Programs" directory, rather than being kept in the Modules + directory. + - Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ now display special message when and only when there are failures. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 14:03:13 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 14:03:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_unicodeobject=2Ec=3A_fix_a?= =?utf-8?q?_compiler_warning_on_Windows_64_bits?= Message-ID: <3hKTZT2vfnz7MST@mail.python.org> http://hg.python.org/cpython/rev/906df134924d changeset: 91855:906df134924d user: Victor Stinner date: Fri Jul 25 14:03:03 2014 +0200 summary: unicodeobject.c: fix a compiler warning on Windows 64 bits 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 @@ -7015,7 +7015,8 @@ assert(outsize <= PyUnicode_WSTR_LENGTH(*v)); if (unicode_resize(v, outsize) < 0) goto error; - ret = in - startin; + /* (in - startin) <= size and size is an int */ + ret = Py_SAFE_DOWNCAST(in - startin, Py_ssize_t, int); error: Py_XDECREF(encoding_obj); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 14:05:27 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 14:05:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbywgdGVz?= =?utf-8?q?t=5Fsubprocess=3A_relax_timings_for_slow_builbots?= Message-ID: <3hKTd35bLkz7MFZ@mail.python.org> http://hg.python.org/cpython/rev/cdda2656ceae changeset: 91856:cdda2656ceae branch: 3.4 parent: 91851:73ac59ee4d6e user: Victor Stinner date: Fri Jul 25 14:05:07 2014 +0200 summary: asyncio, test_subprocess: relax timings for slow builbots files: Lib/test/test_asyncio/test_subprocess.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -42,7 +42,7 @@ return (exitcode, data) task = run(b'some data') - task = asyncio.wait_for(task, 10.0, loop=self.loop) + task = asyncio.wait_for(task, 60.0, loop=self.loop) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') @@ -61,7 +61,7 @@ return proc.returncode, stdout task = run(b'some data') - task = asyncio.wait_for(task, 10.0, loop=self.loop) + task = asyncio.wait_for(task, 60.0, loop=self.loop) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 14:05:28 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 14:05:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=2C_test=5Fsubprocess=3A_relax_?= =?utf-8?q?timings_for_slow_builbots?= Message-ID: <3hKTd46z8Hz7LwY@mail.python.org> http://hg.python.org/cpython/rev/eaddc617af1e changeset: 91857:eaddc617af1e parent: 91855:906df134924d parent: 91856:cdda2656ceae user: Victor Stinner date: Fri Jul 25 14:05:19 2014 +0200 summary: (Merge 3.4) asyncio, test_subprocess: relax timings for slow builbots files: Lib/test/test_asyncio/test_subprocess.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -42,7 +42,7 @@ return (exitcode, data) task = run(b'some data') - task = asyncio.wait_for(task, 10.0, loop=self.loop) + task = asyncio.wait_for(task, 60.0, loop=self.loop) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') @@ -61,7 +61,7 @@ return proc.returncode, stdout task = run(b'some data') - task = asyncio.wait_for(task, 10.0, loop=self.loop) + task = asyncio.wait_for(task, 60.0, loop=self.loop) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 14:47:07 2014 From: python-checkins at python.org (nick.coghlan) Date: Fri, 25 Jul 2014 14:47:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Document_the_new_Programs?= =?utf-8?q?_directory?= Message-ID: <3hKVY75Sp7z7LjM@mail.python.org> http://hg.python.org/devguide/rev/37fa50edb2c4 changeset: 708:37fa50edb2c4 user: Nick Coghlan date: Fri Jul 25 22:46:59 2014 +1000 summary: Document the new Programs directory files: setup.rst | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/setup.rst b/setup.rst --- a/setup.rst +++ b/setup.rst @@ -373,9 +373,14 @@ Code related to the parser. The definition of the AST nodes is also kept here. +``Programs`` + Source code for C executables, including the main function for the + CPython interpreter (in versions prior to Python 3.5, these files are + in the Modules directory). + ``Python`` - The code that makes up the CPython interpreter. This includes the compiler, - eval loop and various built-in modules. + The code that makes up the core CPython runtime. This includes the + compiler, eval loop and various built-in modules. ``Tools`` Various tools that are (or have been) used to maintain Python. -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Fri Jul 25 15:04:51 2014 From: python-checkins at python.org (nick.coghlan) Date: Fri, 25 Jul 2014 15:04:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2321947=3A_handle_g?= =?utf-8?q?enerator-iterator_objects_in_dis?= Message-ID: <3hKVxb4MNmz7LjS@mail.python.org> http://hg.python.org/cpython/rev/2ae5709692ef changeset: 91858:2ae5709692ef user: Nick Coghlan date: Fri Jul 25 23:02:56 2014 +1000 summary: Issue #21947: handle generator-iterator objects in dis Patch by Clement Rouault. files: Doc/library/dis.rst | 16 ++++++++-------- Lib/dis.py | 8 ++++++-- Lib/test/test_dis.py | 8 ++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -48,8 +48,8 @@ .. class:: Bytecode(x, *, first_line=None, current_offset=None) - Analyse the bytecode corresponding to a function, method, string of - source code, or a code object (as returned by :func:`compile`). + Analyse the bytecode corresponding to a function, generator, method, + string of source code, or a code object (as returned by :func:`compile`). This is a convenience wrapper around many of the functions listed below, most notably :func:`get_instructions`, as iterating over a @@ -112,7 +112,7 @@ .. function:: code_info(x) Return a formatted multi-line string with detailed code object information - for the supplied function, method, source code string or code object. + for the supplied function, generator, method, source code string or code object. Note that the exact contents of code info strings are highly implementation dependent and they may change arbitrarily across Python VMs or Python @@ -139,11 +139,11 @@ .. function:: dis(x=None, *, file=None) Disassemble the *x* object. *x* can denote either a module, a class, a - method, a function, a code object, a string of source code or a byte sequence - of raw bytecode. For a module, it disassembles all functions. For a class, - it disassembles all methods. For a code object or sequence of raw bytecode, - it prints one line per bytecode instruction. Strings are first compiled to - code objects with the :func:`compile` built-in function before being + method, a function, a generator, a code object, a string of source code or + a byte sequence of raw bytecode. For a module, it disassembles all functions. + For a class, it disassembles all methods. For a code object or sequence of + raw bytecode, it prints one line per bytecode instruction. Strings are first + compiled to code objects with the :func:`compile` built-in function before being disassembled. If no object is provided, this function disassembles the last traceback. diff --git a/Lib/dis.py b/Lib/dis.py --- a/Lib/dis.py +++ b/Lib/dis.py @@ -29,7 +29,7 @@ return c def dis(x=None, *, file=None): - """Disassemble classes, methods, functions, or code. + """Disassemble classes, methods, functions, generators, or code. With no argument, disassemble the last traceback. @@ -41,6 +41,8 @@ x = x.__func__ if hasattr(x, '__code__'): # Function x = x.__code__ + if hasattr(x, 'gi_code'): # Generator + x = x.gi_code if hasattr(x, '__dict__'): # Class or module items = sorted(x.__dict__.items()) for name, x1 in items: @@ -99,11 +101,13 @@ return ", ".join(names) def _get_code_object(x): - """Helper to handle methods, functions, strings and raw code objects""" + """Helper to handle methods, functions, generators, strings and raw code objects""" if hasattr(x, '__func__'): # Method x = x.__func__ if hasattr(x, '__code__'): # Function x = x.__code__ + if hasattr(x, 'gi_code'): # Generator + x = x.gi_code if isinstance(x, str): # Source code x = _try_compile(x, "") if hasattr(x, 'co_code'): # Code object 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 @@ -229,6 +229,9 @@ TRACEBACK_CODE.co_firstlineno + 4, TRACEBACK_CODE.co_firstlineno + 5) +def _g(x): + yield x + class DisTests(unittest.TestCase): def get_disassembly(self, func, lasti=-1, wrapper=True): @@ -314,6 +317,11 @@ method_bytecode = _C(1).__init__.__code__.co_code self.do_disassembly_test(method_bytecode, dis_c_instance_method_bytes) + def test_disassemble_generator(self): + gen_func_disas = self.get_disassembly(_g) # Disassemble generator function + gen_disas = self.get_disassembly(_g(1)) # Disassemble generator itself + self.assertEqual(gen_disas, gen_func_disas) + def test_dis_none(self): try: del sys.last_traceback diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1145,6 +1145,7 @@ Just van Rossum Hugo van Rossum Saskia van Rossum +Clement Rouault Donald Wallace Rouse II Liam Routt Todd Rovito diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #21947: The dis module can now disassemble generator-iterator + objects based on their gi_code attribute. Patch by Clement Rouault. + - Issue #16133: The asynchat.async_chat.handle_read() method now ignores BlockingIOError exceptions. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 15:58:02 2014 From: python-checkins at python.org (ronald.oussoren) Date: Fri, 25 Jul 2014 15:58:02 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_447=3A_update_the_name_of?= =?utf-8?q?_the_proposed_method_and_add_pseudo-code_explaining?= Message-ID: <3hKX6y0rVcz7LjZ@mail.python.org> http://hg.python.org/peps/rev/4a7bba0ee744 changeset: 5505:4a7bba0ee744 user: Ronald Oussoren date: Fri Jul 25 15:57:34 2014 +0200 summary: PEP 447: update the name of the proposed method and add pseudo-code explaining the current attribute lookup algorithm. files: pep-0447.txt | 153 ++++++++++++++++++++++++++++++++++---- 1 files changed, 136 insertions(+), 17 deletions(-) diff --git a/pep-0447.txt b/pep-0447.txt --- a/pep-0447.txt +++ b/pep-0447.txt @@ -1,5 +1,5 @@ PEP: 447 -Title: Add __locallookup__ method to metaclass +Title: Add __getdescriptor__ method to metaclass Version: $Revision$ Last-Modified: $Date$ Author: Ronald Oussoren @@ -15,7 +15,7 @@ Currently ``object.__getattribute__`` and ``super.__getattribute__`` peek in the ``__dict__`` of classes on the MRO for a class when looking for -an attribute. This PEP adds an optional ``__locallookup__`` method to +an attribute. This PEP adds an optional ``__getdescriptor__`` method to a metaclass that can be used to override this behavior. That is, the MRO walking loop in ``_PyType_Lookup`` and @@ -33,7 +33,7 @@ def lookup(mro_list, name): for cls in mro_list: try: - return cls.__locallookup__(name) + return cls.__getdescriptor__(name) except AttributeError: pass @@ -48,7 +48,7 @@ peeks in the class ``__dict__``), and that can be problematic for dynamic classes that can grow new methods on demand. -The ``__locallookup__`` method makes it possible to dynamically add +The ``__getdescriptor__`` method makes it possible to dynamically add attributes even when looking them up using the `super class`_. The new method affects ``object.__getattribute__`` (and @@ -80,31 +80,133 @@ attributes. With this proposal both lookup methods no longer peek in the class ``__dict__`` -but call the special method ``__locallookup__``, which is a slot defined +but call the special method ``__getdescriptor__``, which is a slot defined on the metaclass. The default implementation of that method looks up the name the class ``__dict__``, which means that attribute lookup is unchanged unless a metatype actually defines the new special method. +Aside: Attribute resolution algorithm in Python +----------------------------------------------- + +The attribute resolution proces as implemented by ``object.__getattribute__`` (or +PyObject_GenericGetAttr`` in CPython's implementation) is fairly straightforward, +but not entirely so without reading C code. + +The current CPython implementation of object.__getattribute__ is basicly equivalent +to the following (pseudo-) Python code (excluding some house keeping and speed tricks):: + + + def _PyType_Lookup(tp, name): + mro = tp.mro() + assert isinstance(mro, tuple) + + for base in mro: + assert isinstance(base, type) + + # PEP 447 will change these lines: + try: + return base.__dict__[name] + except KeyError: + pass + + return None + + + class object: + def __getattribute__(self, name): + assert isinstance(name, str) + + tp = type(self) + descr = _PyType_Lookup(tp, name) + + f = None + if descr is not None: + f = descr.__get__ + if f is not None and descr.__set__ is not None: + # Data descriptor + return f(descr, self, type(self)) + + dict = self.__dict__ + if dict is not None: + try: + return self.__dict__[name] + except KeyError: + pass + + if f is not None: + # Non-data descriptor + return f(descr, self, type(self)) + + if descr is not None: + # Regular class attribute + return descr + + raise AttributeError(name) + + + class super: + def __getattribute__(self, name): + assert isinstance(name, unicode) + + if name != '__class__': + starttype = self.__self_type__ + mro = startype.mro() + + try: + idx = mro.index(self.__thisclass__) + + except ValueError: + pass + + else: + for base in mro[idx+1:]: + # PEP 447 will change these lines: + try: + descr = base.__dict__[name] + except KeyError: + continue + + f = descr.__get__ + if f is not None: + return f(descr, + None if (self.__self__ is self.__self_type__) else self.__self__, + starttype) + + else: + return descr + + return object.__getattribute__(self, name) + + +This PEP should change the dict lookup at the lines starting at "# PEP 447" with +a method call to perform the actual lookup, making is possible to affect that lookup +both for normal attribute access and access through the `super proxy`_. + +Note that specific classes can already completely override the default +behaviour by implementing their own ``__getattribute__`` slot (with or without +calling the super class implementation). + + In Python code -------------- -A meta type can define a method ``__locallookup__`` that is called during +A meta type can define a method ``__getdescriptor__`` that is called during attribute resolution by both ``super.__getattribute__`` and ``object.__getattribute``:: class MetaType(type): - def __locallookup__(cls, name): + def __getdescriptor__(cls, name): try: return cls.__dict__[name] except KeyError: raise AttributeError(name) from None -The ``__locallookup__`` method has as its arguments a class (which is an +The ``__getdescriptor__`` method has as its arguments a class (which is an instance of the meta type) and the name of the attribute that is looked up. It should return the value of the attribute without invoking descriptors, and should raise `AttributeError`_ when the name cannot be found. -The `type`_ class provides a default implementation for ``__locallookup__``, +The `type`_ class provides a default implementation for ``__getdescriptor__``, that looks up the name in the class dictionary. Example usage @@ -114,8 +216,11 @@ uppercase versions of names:: class UpperCaseAccess (type): - def __locallookup__(cls, name): - return cls.__dict__[name.upper()] + def __getdescriptor__(cls, name): + try: + return cls.__dict__[name.upper()] + except KeyError: + raise AttributeError(name) from None class SillyObject (metaclass=UpperCaseAccess): def m(self): @@ -127,16 +232,28 @@ obj = SillyObject() assert obj.m() == "fortytwo" +As mentioned earlier in this PEP a more realistic use case of this functionallity +is a ``__getdescriptor__`` method that dynamicly populates the class ``__dict__`` +based on attribute access, primarily when it is not possible to reliably keep the +class dict in sync with its source, for example because the source used to populate +``__dict__`` is dynamic as well and does not have triggers that can be used to detect +changes to that source. + +An example of that are the class bridges in PyObjC: the class bridge is a Python +object (class) that represents an Objective-C class and conceptually has a Python +method for every Objective-C method in the Objective-C class. As with Python it is +possible to add new methods to an Objective-C class, or replace existing ones, and +there are no callbacks that can be used to detect this. In C code --------- -A new slot ``tp_locallookup`` is added to the ``PyTypeObject`` struct, this -slot corresponds to the ``__locallookup__`` method on `type`_. +A new slot ``tp_getdescriptor`` is added to the ``PyTypeObject`` struct, this +slot corresponds to the ``__getdescriptor__`` method on `type`_. The slot has the following prototype:: - PyObject* (*locallookupfunc)(PyTypeObject* cls, PyObject* name); + PyObject* (*getdescriptorfunc)(PyTypeObject* cls, PyObject* name); This method should lookup *name* in the namespace of *cls*, without looking at superclasses, and should not invoke descriptors. The method returns ``NULL`` @@ -149,7 +266,7 @@ The new method is required for metatypes and as such is defined on `type_`. Both ``super.__getattribute__`` and ``object.__getattribute__``/`PyObject_GenericGetAttr`_ -(through ``_PyType_Lookup``) use the this ``__locallookup__`` method when +(through ``_PyType_Lookup``) use the this ``__getdescriptor__`` method when walking the MRO. Other changes to the implementation @@ -157,13 +274,13 @@ The change for `PyObject_GenericGetAttr`_ will be done by changing the private function ``_PyType_Lookup``. This currently returns a borrowed reference, but -must return a new reference when the ``__locallookup__`` method is present. +must return a new reference when the ``__getdescriptor__`` method is present. Because of this ``_PyType_Lookup`` will be renamed to ``_PyType_LookupName``, this will cause compile-time errors for all out-of-tree users of this private API. The attribute lookup cache in ``Objects/typeobject.c`` is disabled for classes -that have a metaclass that overrides ``__locallookup__``, because using the +that have a metaclass that overrides ``__getdescriptor__``, because using the cache might not be valid for such classes. Performance impact @@ -428,6 +545,8 @@ .. _`super class`: http://docs.python.org/3/library/functions.html#super +.. _`super proxy`: http://docs.python.org/3/library/functions.html#super + .. _`NotImplemented`: http://docs.python.org/3/library/constants.html#NotImplemented .. _`PyObject_GenericGetAttr`: http://docs.python.org/3/c-api/object.html#PyObject_GenericGetAttr -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Jul 25 15:58:26 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 25 Jul 2014 15:58:26 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318093=3A_Give_the?= =?utf-8?q?_Windows_build_=5Ftestembed=2Ec=27s_new_location=2E?= Message-ID: <3hKX7Q2q0Mz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/766570a5d607 changeset: 91859:766570a5d607 user: Zachary Ware date: Fri Jul 25 08:58:07 2014 -0500 summary: Issue #18093: Give the Windows build _testembed.c's new location. files: PCbuild/_testembed.vcxproj | 2 +- PCbuild/_testembed.vcxproj.filters | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PCbuild/_testembed.vcxproj b/PCbuild/_testembed.vcxproj --- a/PCbuild/_testembed.vcxproj +++ b/PCbuild/_testembed.vcxproj @@ -143,7 +143,7 @@ - + diff --git a/PCbuild/_testembed.vcxproj.filters b/PCbuild/_testembed.vcxproj.filters --- a/PCbuild/_testembed.vcxproj.filters +++ b/PCbuild/_testembed.vcxproj.filters @@ -15,7 +15,7 @@ - + Source Files -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 17:59:59 2014 From: python-checkins at python.org (nick.coghlan) Date: Fri, 25 Jul 2014 17:59:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_403=3A_Try_a_simple_goles?= =?utf-8?q?s_example?= Message-ID: <3hKZqg37llz7Ljm@mail.python.org> http://hg.python.org/peps/rev/98e70c0223ea changeset: 5506:98e70c0223ea user: Nick Coghlan date: Sat Jul 26 01:59:36 2014 +1000 summary: PEP 403: Try a simple goless example files: pep-0403.txt | 98 +++++++++++++++++++++++++++++++++++++++- 1 files changed, 97 insertions(+), 1 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -392,7 +392,103 @@ def f(): ... - +`goless `__ aims to bring support for +"goroutine" style programming to Python, but some aspects currently need +to be written out of order relative to their go counterparts. This PEP +allows the "select" example from the goless documentation to be written as +follows (assuming appropriate tweaks to some existing APIs, and an +alternative ``switch`` API that is like ``select`` but expects the cases +to be supplied as functions on a class):: + + c1 = goless.chan() + c2 = goless.chan() + + @in goless.go(func1) + def func1(): + time.sleep(1) + c1.send('one') + + @in goless.go(func2) + def func2(): + time.sleep(2) + c2.send('two') + + @in [goless.switch(cases) for i in range(2)] + class cases: + @goless.rcase(c1) + def chan1(chan, msg): + print("From channel 1:", msg) + + @goless.rcase(c2) + def chan2(chan, msg): + print("From channel 2:", msg) + + @goless.dcase() + def default(chan, msg): + print("From other channel:", msg) + +Now, that ``goless`` example could be written as follows today (again, +assuming the addition of ``goless.switch`` and related changes):: + + c1 = goless.chan() + c2 = goless.chan() + + @goless.go + def func1(): + time.sleep(1) + c1.send('one') + + @goless.go + def func2(): + time.sleep(2) + c2.send('two') + + class cases: + @goless.rcase(c1) + def chan1(chan, msg): + print("From channel 1:", msg) + + @goless.rcase(c2) + def chan2(chan, msg): + print("From channel 2:", msg) + + @goless.dcase() + def default(chan, msg): + print("From other channel:", msg) + + for i in range(2): + goless.switch(cases) + +The ``@in`` version helps make it clear that the ``goless.go`` calls have +non-trivial side effects, as well as moving the ``switch`` call ahead +of the definition of the cases. However, it cries out for something more +readable, even if it's just syntactic sugar for an if-elif chain (as was +considered as one of the options in PEP 3103). That might look something +like:: + + for i in range(2): + switch goless.select() as chan, msg: + case chan is c1: + print("From channel 1:", msg) + case chan is c2: + print("From channel 2:", msg) + else: + print("From other channel:", msg) + +Rather than the current:: + + for i in range(2): + chan, msg = goless.select() + if chan is c1: + print("From channel 1:", msg) + elif chan is c2: + print("From channel 2:", msg) + else: + print("From other channel:", msg) + +(Note: the fact this doesn't appear to offer any particularly compelling +improvements to goless code *does* count heavily against the proposal) + Reference Implementation ======================== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Jul 25 19:26:45 2014 From: python-checkins at python.org (raymond.hettinger) Date: Fri, 25 Jul 2014 19:26:45 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTkw?= =?utf-8?q?=3A__Cleanup_unnecessary_inner_class_definition_in_saxutils=2E?= Message-ID: <3hKcln2cs8z7LjZ@mail.python.org> http://hg.python.org/cpython/rev/a5cb10f2dbaa changeset: 91860:a5cb10f2dbaa branch: 2.7 parent: 91848:f7c84674bdec user: Raymond Hettinger date: Fri Jul 25 10:26:36 2014 -0700 summary: Issue #21990: Cleanup unnecessary inner class definition in saxutils. files: Lib/xml/sax/saxutils.py | 13 ++++++++----- Misc/NEWS | 3 +++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py --- a/Lib/xml/sax/saxutils.py +++ b/Lib/xml/sax/saxutils.py @@ -98,14 +98,17 @@ except AttributeError: pass # wrap a binary writer with TextIOWrapper - class UnbufferedTextIOWrapper(io.TextIOWrapper): - def write(self, s): - super(UnbufferedTextIOWrapper, self).write(s) - self.flush() - return UnbufferedTextIOWrapper(buffer, encoding=encoding, + return _UnbufferedTextIOWrapper(buffer, encoding=encoding, errors='xmlcharrefreplace', newline='\n') + +class _UnbufferedTextIOWrapper(io.TextIOWrapper): + def write(self, s): + super(_UnbufferedTextIOWrapper, self).write(s) + self.flush() + + class XMLGenerator(handler.ContentHandler): def __init__(self, out=None, encoding="iso-8859-1"): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -17,6 +17,9 @@ socket.error() exceptions with blocking I/O errors: EAGAIN, EALREADY, EINPROGRESS, or EWOULDBLOCK. +- Issue #21990: Clean-up unnecessary and slow inner class definition in + saxutils (Contributed by Alex Gaynor). + - Issue #1730136: Fix the comparison between a tkFont.Font and an object of another kind. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 19:45:59 2014 From: python-checkins at python.org (charles-francois.natali) Date: Fri, 25 Jul 2014 19:45:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE5ODc1?= =?utf-8?q?=3A_Fix_random_test=5Fgetsockaddrarg=28=29_failure=2E?= Message-ID: <3hKd9z6sGLz7LjP@mail.python.org> http://hg.python.org/cpython/rev/897c9e6ddb1a changeset: 91861:897c9e6ddb1a branch: 3.4 parent: 91773:7238c6a05ca6 user: Charles-Fran?ois Natali date: Fri Jul 25 18:44:30 2014 +0100 summary: Issue #19875: Fix random test_getsockaddrarg() failure. files: Lib/test/test_socket.py | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 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 @@ -3,6 +3,7 @@ import errno import io +import itertools import socket import select import tempfile @@ -1145,17 +1146,24 @@ sock.close() def test_getsockaddrarg(self): - host = '0.0.0.0' + sock = socket.socket() + self.addCleanup(sock.close) port = support.find_unused_port() big_port = port + 65536 neg_port = port - 65536 - sock = socket.socket() - try: - self.assertRaises(OverflowError, sock.bind, (host, big_port)) - self.assertRaises(OverflowError, sock.bind, (host, neg_port)) - sock.bind((host, port)) - finally: - sock.close() + self.assertRaises(OverflowError, sock.bind, (HOST, big_port)) + self.assertRaises(OverflowError, sock.bind, (HOST, neg_port)) + # Since find_unused_port() is inherently subject to race conditions, we + # call it a couple times if necessary. + for i in itertools.count(): + port = support.find_unused_port() + try: + sock.bind((HOST, port)) + except OSError as e: + if e.errno != errno.EADDRINUSE or i == 5: + raise + else: + break @unittest.skipUnless(os.name == "nt", "Windows specific") def test_sock_ioctl(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 19:46:01 2014 From: python-checkins at python.org (charles-francois.natali) Date: Fri, 25 Jul 2014 19:46:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAobWVyZ2UgMy40IC0+IDMuNCk6?= =?utf-8?q?_Merge=2E?= Message-ID: <3hKdB16S54z7Lk9@mail.python.org> http://hg.python.org/cpython/rev/516877b962be changeset: 91862:516877b962be branch: 3.4 parent: 91861:897c9e6ddb1a parent: 91856:cdda2656ceae user: Charles-Fran?ois Natali date: Fri Jul 25 18:45:02 2014 +0100 summary: Merge. files: Doc/library/asyncio-eventloop.rst | 9 +- Doc/library/asyncio-protocol.rst | 2 +- Doc/library/asyncio-task.rst | 2 +- Doc/library/asyncio.rst | 4 +- Doc/library/asyncore.rst | 4 + Doc/library/multiprocessing.rst | 2 +- Doc/library/os.rst | 298 +++++++-- Doc/library/test.rst | 17 +- Lib/asynchat.py | 2 + Lib/asyncio/base_events.py | 6 +- Lib/asyncio/proactor_events.py | 8 +- Lib/asyncio/unix_events.py | 6 +- Lib/asyncio/windows_events.py | 105 ++- Lib/ctypes/test/test_python_api.py | 2 +- Lib/ctypes/test/test_win32.py | 5 +- Lib/plistlib.py | 8 +- Lib/test/support/__init__.py | 21 +- Lib/test/test_asynchat.py | 17 + Lib/test/test_asyncio/__init__.py | 25 +- Lib/test/test_asyncio/__main__.py | 7 +- Lib/test/test_asyncio/test_selector_events.py | 4 +- Lib/test/test_asyncio/test_subprocess.py | 4 +- Lib/test/test_asyncio/test_unix_events.py | 17 +- Lib/test/test_asyncio/test_windows_events.py | 36 +- Lib/test/test_email/__init__.py | 23 +- Lib/test/test_email/__main__.py | 5 +- Lib/test/test_gettext.py | 2 +- Lib/test/test_importlib/__init__.py | 34 +- Lib/test/test_importlib/__main__.py | 11 +- Lib/test/test_importlib/builtin/__init__.py | 13 +- Lib/test/test_importlib/builtin/__main__.py | 4 + Lib/test/test_importlib/extension/__init__.py | 16 +- Lib/test/test_importlib/extension/__main__.py | 4 + Lib/test/test_importlib/frozen/__init__.py | 16 +- Lib/test/test_importlib/frozen/__main__.py | 4 + Lib/test/test_importlib/import_/__init__.py | 16 +- Lib/test/test_importlib/import_/__main__.py | 4 + Lib/test/test_importlib/source/__init__.py | 16 +- Lib/test/test_importlib/source/__main__.py | 4 + Lib/test/test_json/__init__.py | 19 +- Lib/test/test_plistlib.py | 5 + Lib/test/test_readline.py | 23 +- Lib/test/test_tools/__init__.py | 10 +- Lib/tkinter/__init__.py | 11 +- Lib/tkinter/test/test_tkinter/test_widgets.py | 18 + Lib/turtledemo/__main__.py | 195 +++--- Misc/ACKS | 2 +- Misc/NEWS | 17 +- Modules/readline.c | 15 + Objects/stringlib/README.txt | 2 +- 50 files changed, 654 insertions(+), 446 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -47,8 +47,9 @@ Stop running the event loop. Every callback scheduled before :meth:`stop` is called will run. - Callback scheduled after :meth:`stop` is called won't. However, those - callbacks will run if :meth:`run_forever` is called again later. + Callbacks scheduled after :meth:`stop` is called will not run. + However, those callbacks will run if :meth:`run_forever` is called + again later. .. method:: BaseEventLoop.is_closed() @@ -58,13 +59,11 @@ .. method:: BaseEventLoop.close() - Close the event loop. The loop should not be running. + Close the event loop. The loop must not be running. This clears the queues and shuts down the executor, but does not wait for the executor to finish. - The event loop must not be running. - This is idempotent and irreversible. No other methods should be called after this one. diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -459,7 +459,7 @@ example to raise an exception if the server is not listening, instead of having to write a short coroutine to handle the exception and stop the running loop. At :meth:`~BaseEventLoop.run_until_complete` exit, the loop is -no more running, so there is no need to stop the loop in case of an error. +no longer running, so there is no need to stop the loop in case of an error. Echo server ----------- diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -261,7 +261,7 @@ print(future.result()) loop.close() -The coroutine function is responsible of the computation (which takes 1 second) +The coroutine function is responsible for the computation (which takes 1 second) and it stores the result into the future. The :meth:`~BaseEventLoop.run_until_complete` method waits for the completion of the future. diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -39,7 +39,7 @@ you absolutely, positively have to use a library that makes blocking I/O calls. -Table of content: +Table of contents: .. toctree:: :maxdepth: 3 @@ -55,6 +55,6 @@ .. seealso:: - The :mod:`asyncio` module was designed in the :PEP:`3156`. For a + The :mod:`asyncio` module was designed in :PEP:`3156`. For a motivational primer on transports and protocols, see :PEP:`3153`. diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -216,6 +216,10 @@ empty bytes object implies that the channel has been closed from the other end. + Note that :meth:`recv` may raise :exc:`BlockingIOError` , even though + :func:`select.select` or :func:`select.poll` has reported the socket + ready for reading. + .. method:: listen(backlog) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -398,7 +398,7 @@ print(res.get(timeout=1)) # prints "100" # make worker sleep for 10 secs - res = pool.apply_async(sleep, 10) + res = pool.apply_async(sleep, [10]) print(res.get(timeout=1)) # raises multiprocessing.TimeoutError # exiting the 'with'-block has stopped the pool diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -765,8 +765,14 @@ .. function:: fstat(fd) - Return status for file descriptor *fd*, like :func:`~os.stat`. As of Python - 3.3, this is equivalent to ``os.stat(fd)``. + Get the status of the file descriptor *fd*. Return a :class:`stat_result` + object. + + As of Python 3.3, this is equivalent to ``os.stat(fd)``. + + .. seealso:: + + The :func:`stat` function. Availability: Unix, Windows. @@ -1088,8 +1094,16 @@ All platforms support sockets as *out* file descriptor, and some platforms allow other types (e.g. regular file, pipe) as well. + Cross-platform applications should not use *headers*, *trailers* and *flags* + arguments. + Availability: Unix. + .. note:: + + For a higher-level wrapper of :func:`sendfile`, see + :mod:`socket.socket.sendfile`. + .. versionadded:: 3.3 @@ -1570,17 +1584,25 @@ Added support for specifying an open file descriptor for *path*. -.. function:: lstat(path, *, dir_fd=None) +.. function:: lstat(path, \*, dir_fd=None) Perform the equivalent of an :c:func:`lstat` system call on the given path. - Similar to :func:`~os.stat`, but does not follow symbolic links. On - platforms that do not support symbolic links, this is an alias for - :func:`~os.stat`. As of Python 3.3, this is equivalent to ``os.stat(path, - dir_fd=dir_fd, follow_symlinks=False)``. + Similar to :func:`~os.stat`, but does not follow symbolic links. Return a + :class:`stat_result` object. + + On platforms that do not support symbolic links, this is an alias for + :func:`~os.stat`. + + As of Python 3.3, this is equivalent to ``os.stat(path, dir_fd=dir_fd, + follow_symlinks=False)``. This function can also support :ref:`paths relative to directory descriptors `. + .. seealso:: + + The :func:`stat` function. + .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. @@ -1847,49 +1869,116 @@ The *dir_fd* parameter. -.. function:: stat(path, *, dir_fd=None, follow_symlinks=True) - - Perform the equivalent of a :c:func:`stat` system call on the given path. - *path* may be specified as either a string or as an open file descriptor. - (This function normally follows symlinks; to stat a symlink add the argument - ``follow_symlinks=False``, or use :func:`lstat`.) - - The return value is an object whose attributes correspond roughly - to the members of the :c:type:`stat` structure, namely: - - * :attr:`st_mode` - protection bits, - * :attr:`st_ino` - inode number, - * :attr:`st_dev` - device, - * :attr:`st_nlink` - number of hard links, - * :attr:`st_uid` - user id of owner, - * :attr:`st_gid` - group id of owner, - * :attr:`st_size` - size of file, in bytes, - * :attr:`st_atime` - time of most recent access expressed in seconds, - * :attr:`st_mtime` - time of most recent content modification - expressed in seconds, - * :attr:`st_ctime` - platform dependent; time of most recent metadata - change on Unix, or the time of creation on Windows, expressed in seconds - * :attr:`st_atime_ns` - time of most recent access - expressed in nanoseconds as an integer, - * :attr:`st_mtime_ns` - time of most recent content modification - expressed in nanoseconds as an integer, - * :attr:`st_ctime_ns` - platform dependent; time of most recent metadata - change on Unix, or the time of creation on Windows, - expressed in nanoseconds as an integer - - On some Unix systems (such as Linux), the following attributes may also be - available: - - * :attr:`st_blocks` - number of 512-byte blocks allocated for file - * :attr:`st_blksize` - filesystem blocksize for efficient file system I/O - * :attr:`st_rdev` - type of device if an inode device - * :attr:`st_flags` - user defined flags for file - - On other Unix systems (such as FreeBSD), the following attributes may be - available (but may be only filled out if root tries to use them): - - * :attr:`st_gen` - file generation number - * :attr:`st_birthtime` - time of file creation +.. function:: stat(path, \*, dir_fd=None, follow_symlinks=True) + + Get the status of a file or a file descriptor. Perform the equivalent of a + :c:func:`stat` system call on the given path. *path* may be specified as + either a string or as an open file descriptor. Return a :class:`stat_result` + object. + + This function normally follows symlinks; to stat a symlink add the argument + ``follow_symlinks=False``, or use :func:`lstat`. + + This function can support :ref:`specifying a file descriptor ` and + :ref:`not following symlinks `. + + .. index:: module: stat + + Example:: + + >>> import os + >>> statinfo = os.stat('somefile.txt') + >>> statinfo + os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, + st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, + st_mtime=1297230027, st_ctime=1297230027) + >>> statinfo.st_size + 264 + + Availability: Unix, Windows. + + .. seealso:: + + :func:`fstat` and :func:`lstat` functions. + + .. versionadded:: 3.3 + Added the *dir_fd* and *follow_symlinks* arguments, specifying a file + descriptor instead of a path. + + +.. class:: stat_result + + Object whose attributes correspond roughly to the members of the + :c:type:`stat` structure. It is used for the result of :func:`os.stat`, + :func:`os.fstat` and :func:`os.lstat`. + + Attributes: + + .. attribute:: st_mode + + File mode: file type and file mode bits (permissions). + + .. attribute:: st_ino + + Inode number. + + .. attribute:: st_dev + + Identifier of the device on which this file resides. + + .. attribute:: st_nlink + + Number of hard links. + + .. attribute:: st_uid + + User identifier of the file owner. + + .. attribute:: st_gid + + Group identifier of the file owner. + + .. attribute:: st_size + + Size of the file in bytes, if it is a regular file or a symbolic link. + The size of a symbolic link is the length of the pathname it contains, + without a terminating null byte. + + Timestamps: + + .. attribute:: st_atime + + Time of most recent access expressed in seconds. + + .. attribute:: st_mtime + + Time of most recent content modification expressed in seconds. + + .. attribute:: st_ctime + + Platform dependent: + + * the time of most recent metadata change on Unix, + * the time of creation on Windows, expressed in seconds. + + .. attribute:: st_atime_ns + + Time of most recent access expressed in nanoseconds as an integer. + + .. attribute:: st_mtime_ns + + Time of most recent content modification expressed in nanoseconds as an + integer. + + .. attribute:: st_ctime_ns + + Platform dependent: + + * the time of most recent metadata change on Unix, + * the time of creation on Windows, expressed in nanoseconds as an + integer. + + See also the :func:`stat_float_times` function. .. note:: @@ -1899,6 +1988,7 @@ or FAT32 file systems, :attr:`st_mtime` has 2-second resolution, and :attr:`st_atime` has only 1-day resolution. See your operating system documentation for details. + Similarly, although :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns` are always expressed in nanoseconds, many systems do not provide nanosecond precision. On systems that do @@ -1908,41 +1998,68 @@ If you need the exact timestamps you should always use :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and :attr:`st_ctime_ns`. - For backward compatibility, the return value of :func:`~os.stat` is also + On some Unix systems (such as Linux), the following attributes may also be + available: + + .. attribute:: st_blocks + + Number of 512-byte blocks allocated for file. + This may be smaller than :attr:`st_size`/512 when the file has holes. + + .. attribute:: st_blksize + + "Preferred" blocksize for efficient file system I/O. Writing to a file in + smaller chunks may cause an inefficient read-modify-rewrite. + + .. attribute:: st_rdev + + Type of device if an inode device. + + .. attribute:: st_flags + + User defined flags for file. + + On other Unix systems (such as FreeBSD), the following attributes may be + available (but may be only filled out if root tries to use them): + + .. attribute:: st_gen + + File generation number. + + .. attribute:: st_birthtime + + Time of file creation. + + On Mac OS systems, the following attributes may also be available: + + .. attribute:: st_rsize + + Real size of the file. + + .. attribute:: st_creator + + Creator of the file. + + .. attribute:: st_type + + File type. + + The standard module :mod:`stat` defines functions and constants that are + useful for extracting information from a :c:type:`stat` structure. (On + Windows, some items are filled with dummy values.) + + For backward compatibility, a :class:`stat_result` instance is also accessible as a tuple of at least 10 integers giving the most important (and portable) members of the :c:type:`stat` structure, in the order :attr:`st_mode`, :attr:`st_ino`, :attr:`st_dev`, :attr:`st_nlink`, :attr:`st_uid`, :attr:`st_gid`, :attr:`st_size`, :attr:`st_atime`, :attr:`st_mtime`, :attr:`st_ctime`. More items may be added at the end by - some implementations. - - This function can support :ref:`specifying a file descriptor ` and - :ref:`not following symlinks `. - - .. index:: module: stat - - The standard module :mod:`stat` defines functions and constants that are useful - for extracting information from a :c:type:`stat` structure. (On Windows, some - items are filled with dummy values.) - - Example:: - - >>> import os - >>> statinfo = os.stat('somefile.txt') - >>> statinfo - posix.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026, - st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295, - st_mtime=1297230027, st_ctime=1297230027) - >>> statinfo.st_size - 264 - - Availability: Unix, Windows. + some implementations. For compatibility with older Python versions, + accessing :class:`stat_result` as a tuple always returns integers. .. versionadded:: 3.3 - Added the *dir_fd* and *follow_symlinks* arguments, - specifying a file descriptor instead of a path, - and the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, - and :attr:`st_ctime_ns` members. + Added the :attr:`st_atime_ns`, :attr:`st_mtime_ns`, and + :attr:`st_ctime_ns` members. .. function:: stat_float_times([newvalue]) @@ -2727,10 +2844,27 @@ Availability: Unix. -.. function:: popen(...) - - Run child processes, returning opened pipes for communications. These functions - are described in section :ref:`os-newstreams`. +.. function:: popen(command, mode='r', buffering=-1) + + Open a pipe to or from *command*. The return value is an open file object + connected to the pipe, which can be read or written depending on whether *mode* + is ``'r'`` (default) or ``'w'``. The *buffering* argument has the same meaning as + the corresponding argument to the built-in :func:`open` function. The + returned file object reads or writes text strings rather than bytes. + + The ``close`` method returns :const:`None` if the subprocess exited + successfully, or the subprocess's return code if there was an + error. On POSIX systems, if the return code is positive it + represents the return value of the process left-shifted by one + byte. If the return code is negative, the process was terminated + by the signal given by the negated value of the return code. (For + example, the return value might be ``- signal.SIGKILL`` if the + subprocess was killed.) On Windows systems, the return value + contains the signed integer return code from the child process. + + This is implemented using :class:`subprocess.Popen`; see that class's + documentation for more powerful ways to manage and communicate with + subprocesses. .. function:: spawnl(mode, path, ...) diff --git a/Doc/library/test.rst b/Doc/library/test.rst --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -461,7 +461,7 @@ .. function:: make_bad_fd() Create an invalid file descriptor by opening and closing a temporary file, - and returning its descripor. + and returning its descriptor. .. function:: import_module(name, deprecated=False) @@ -554,6 +554,21 @@ run simultaneously, which is a problem for buildbots. +.. function:: load_package_tests(pkg_dir, loader, standard_tests, pattern) + + Generic implementation of the :mod:`unittest` ``load_tests`` protocol for + use in test packages. *pkg_dir* is the root directory of the package; + *loader*, *standard_tests*, and *pattern* are the arguments expected by + ``load_tests``. In simple cases, the test package's ``__init__.py`` + can be the following:: + + import os + from test.support import load_package_tests + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + + The :mod:`test.support` module defines the following classes: .. class:: TransientResource(exc, **kwargs) diff --git a/Lib/asynchat.py b/Lib/asynchat.py --- a/Lib/asynchat.py +++ b/Lib/asynchat.py @@ -115,6 +115,8 @@ try: data = self.recv(self.ac_in_buffer_size) + except BlockingIOError: + return except OSError as why: self.handle_error() return diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -270,9 +270,9 @@ def stop(self): """Stop running the event loop. - Every callback scheduled before stop() is called will run. - Callback scheduled after stop() is called won't. However, - those callbacks will run if run_*() is called again later. + Every callback scheduled before stop() is called will run. Callbacks + scheduled after stop() is called will not run. However, those callbacks + will run if run_forever is called again later. """ self.call_soon(_raise_stop_error) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -44,13 +44,9 @@ def __repr__(self): info = [self.__class__.__name__, 'fd=%s' % self._sock.fileno()] if self._read_fut is not None: - ov = "pending" if self._read_fut.ov.pending else "completed" - info.append('read=%s' % ov) + info.append('read=%s' % self._read_fut) if self._write_fut is not None: - if self._write_fut.ov.pending: - info.append("write=pending=%s" % self._pending_write) - else: - info.append("write=completed") + info.append("write=%r" % self._write_fut) if self._buffer: bufsize = len(self._buffer) info.append('write_bufsize=%s' % bufsize) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -74,7 +74,7 @@ # event loop running in another thread cannot add a signal # handler. signal.set_wakeup_fd(self._csock.fileno()) - except ValueError as exc: + except (ValueError, OSError) as exc: raise RuntimeError(str(exc)) handle = events.Handle(callback, args, self) @@ -93,7 +93,7 @@ if not self._signal_handlers: try: signal.set_wakeup_fd(-1) - except ValueError as nexc: + except (ValueError, OSError) as nexc: logger.info('set_wakeup_fd(-1) failed: %s', nexc) if exc.errno == errno.EINVAL: @@ -138,7 +138,7 @@ if not self._signal_handlers: try: signal.set_wakeup_fd(-1) - except ValueError as exc: + except (ValueError, OSError) as exc: logger.info('set_wakeup_fd(-1) failed: %s', exc) return True diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -38,42 +38,85 @@ def __init__(self, ov, *, loop=None): super().__init__(loop=loop) - self.ov = ov + if self._source_traceback: + del self._source_traceback[-1] + self._ov = ov def __repr__(self): info = [self._state.lower()] - if self.ov.pending: - info.append('overlapped=pending') - else: - info.append('overlapped=completed') + if self._ov is not None: + state = 'pending' if self._ov.pending else 'completed' + info.append('overlapped=<%s, %#x>' % (state, self._ov.address)) if self._state == futures._FINISHED: info.append(self._format_result()) if self._callbacks: info.append(self._format_callbacks()) return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + def _cancel_overlapped(self): + if self._ov is None: + return + try: + self._ov.cancel() + except OSError as exc: + context = { + 'message': 'Cancelling an overlapped future failed', + 'exception': exc, + 'future': self, + } + if self._source_traceback: + context['source_traceback'] = self._source_traceback + self._loop.call_exception_handler(context) + self._ov = None + def cancel(self): - try: - self.ov.cancel() - except OSError: - pass + self._cancel_overlapped() return super().cancel() + def set_exception(self, exception): + super().set_exception(exception) + self._cancel_overlapped() + class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" - def __init__(self, wait_handle, *, loop=None): + def __init__(self, handle, wait_handle, *, loop=None): super().__init__(loop=loop) + self._handle = handle self._wait_handle = wait_handle - def cancel(self): - super().cancel() + def _poll(self): + # non-blocking wait: use a timeout of 0 millisecond + return (_winapi.WaitForSingleObject(self._handle, 0) == + _winapi.WAIT_OBJECT_0) + + def __repr__(self): + info = [self._state.lower()] + if self._wait_handle: + state = 'pending' if self._poll() else 'completed' + info.append('wait_handle=<%s, %#x>' % (state, self._wait_handle)) + info.append('handle=<%#x>' % self._handle) + if self._state == futures._FINISHED: + info.append(self._format_result()) + if self._callbacks: + info.append(self._format_callbacks()) + return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + + def _unregister(self): + if self._wait_handle is None: + return try: _overlapped.UnregisterWait(self._wait_handle) except OSError as e: if e.winerror != _overlapped.ERROR_IO_PENDING: raise + # ERROR_IO_PENDING is not an error, the wait was unregistered + self._wait_handle = None + + def cancel(self): + self._unregister() + return super().cancel() class PipeServer(object): @@ -208,6 +251,11 @@ self._registered = weakref.WeakSet() self._stopped_serving = weakref.WeakSet() + def __repr__(self): + return ('<%s overlapped#=%s result#=%s>' + % (self.__class__.__name__, len(self._cache), + len(self._results))) + def set_loop(self, loop): self._loop = loop @@ -350,23 +398,19 @@ ov = _overlapped.Overlapped(NULL) wh = _overlapped.RegisterWaitWithQueue( handle, self._iocp, ov.address, ms) - f = _WaitHandleFuture(wh, loop=self._loop) + f = _WaitHandleFuture(handle, wh, loop=self._loop) def finish_wait_for_handle(trans, key, ov): - if not f.cancelled(): - try: - _overlapped.UnregisterWait(wh) - except OSError as e: - if e.winerror != _overlapped.ERROR_IO_PENDING: - raise # Note that this second wait means that we should only use # this with handles types where a successful wait has no # effect. So events or processes are all right, but locks # or semaphores are not. Also note if the handle is # signalled and then quickly reset, then we may return # False even though we have not timed out. - return (_winapi.WaitForSingleObject(handle, 0) == - _winapi.WAIT_OBJECT_0) + try: + return f._poll() + finally: + f._unregister() self._cache[ov.address] = (f, ov, None, finish_wait_for_handle) return f @@ -455,7 +499,7 @@ def close(self): # Cancel remaining registered operations. - for address, (f, ov, obj, callback) in list(self._cache.items()): + for address, (fut, ov, obj, callback) in list(self._cache.items()): if obj is None: # The operation was started with connect_pipe() which # queues a task to Windows' thread pool. This cannot @@ -463,9 +507,17 @@ del self._cache[address] else: try: - ov.cancel() - except OSError: - pass + fut.cancel() + except OSError as exc: + if self._loop is not None: + context = { + 'message': 'Cancelling a future failed', + 'exception': exc, + 'future': fut, + } + if fut._source_traceback: + context['source_traceback'] = fut._source_traceback + self._loop.call_exception_handler(context) while self._cache: if not self._poll(1): @@ -476,6 +528,9 @@ _winapi.CloseHandle(self._iocp) self._iocp = None + def __del__(self): + self.close() + class _WindowsSubprocessTransport(base_subprocess.BaseSubprocessTransport): diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -42,9 +42,9 @@ # This test is unreliable, because it is possible that code in # unittest changes the refcount of the '42' integer. So, it # is disabled by default. - @requires("refcount") @support.refcount_test def test_PyLong_Long(self): + requires("refcount") ref42 = grc(42) pythonapi.PyLong_FromLong.restype = py_object self.assertEqual(pythonapi.PyLong_FromLong(42), 42) diff --git a/Lib/ctypes/test/test_win32.py b/Lib/ctypes/test/test_win32.py --- a/Lib/ctypes/test/test_win32.py +++ b/Lib/ctypes/test/test_win32.py @@ -38,8 +38,11 @@ @unittest.skipUnless(sys.platform == "win32", 'Windows-specific test') class FunctionCallTestCase(unittest.TestCase): - @requires("SEH") + @unittest.skipUnless('MSC' in sys.version, "SEH only supported by MSC") + @unittest.skipIf(sys.executable.endswith('_d.exe'), + "SEH not enabled in debug builds") def test_SEH(self): + requires("SEH") # Call functions with invalid arguments, and make sure # that access violations are trapped and raise an # exception. diff --git a/Lib/plistlib.py b/Lib/plistlib.py --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -984,18 +984,16 @@ fp.seek(0) for info in _FORMATS.values(): if info['detect'](header): - p = info['parser']( - use_builtin_types=use_builtin_types, - dict_type=dict_type, - ) + P = info['parser'] break else: raise InvalidFileException() else: - p = _FORMATS[fmt]['parser'](use_builtin_types=use_builtin_types) + P = _FORMATS[fmt]['parser'] + p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) return p.parse(fp) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -85,7 +85,7 @@ "skip_unless_symlink", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", "requires_IEEE_754", "skip_unless_xattr", "requires_zlib", - "anticipate_failure", + "anticipate_failure", "load_package_tests", # sys "is_jython", "check_impl_detail", # network @@ -188,6 +188,25 @@ return unittest.expectedFailure return lambda f: f +def load_package_tests(pkg_dir, loader, standard_tests, pattern): + """Generic load_tests implementation for simple test packages. + + Most packages can implement load_tests using this function as follows: + + def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) + """ + if pattern is None: + pattern = "test*" + top_dir = os.path.dirname( # Lib + os.path.dirname( # test + os.path.dirname(__file__))) # support + package_tests = loader.discover(start_dir=pkg_dir, + top_level_dir=top_dir, + pattern=pattern) + standard_tests.addTests(package_tests) + return standard_tests + def import_fresh_module(name, fresh=(), blocked=(), deprecated=False): """Import and return a module, deliberately bypassing sys.modules. diff --git a/Lib/test/test_asynchat.py b/Lib/test/test_asynchat.py --- a/Lib/test/test_asynchat.py +++ b/Lib/test/test_asynchat.py @@ -7,10 +7,12 @@ import asynchat import asyncore +import errno import socket import sys import time import unittest +import unittest.mock try: import threading except ImportError: @@ -273,6 +275,21 @@ usepoll = True +class TestAsynchatMocked(unittest.TestCase): + def test_blockingioerror(self): + # Issue #16133: handle_read() must ignore BlockingIOError + sock = unittest.mock.Mock() + sock.recv.side_effect = BlockingIOError(errno.EAGAIN) + + dispatcher = asynchat.async_chat() + dispatcher.set_socket(sock) + self.addCleanup(dispatcher.del_channel) + + with unittest.mock.patch.object(dispatcher, 'handle_error') as error: + dispatcher.handle_read() + self.assertFalse(error.called) + + class TestHelperFunctions(unittest.TestCase): def test_find_prefix_at_end(self): self.assertEqual(asynchat.find_prefix_at_end("qwerty\r", "\r\n"), 1) diff --git a/Lib/test/test_asyncio/__init__.py b/Lib/test/test_asyncio/__init__.py --- a/Lib/test/test_asyncio/__init__.py +++ b/Lib/test/test_asyncio/__init__.py @@ -1,29 +1,10 @@ import os -import sys -import unittest -from test.support import run_unittest, import_module +from test.support import load_package_tests, import_module # Skip tests if we don't have threading. import_module('threading') # Skip tests if we don't have concurrent.futures. import_module('concurrent.futures') - -def suite(): - tests = unittest.TestSuite() - loader = unittest.TestLoader() - for fn in os.listdir(os.path.dirname(__file__)): - if fn.startswith("test") and fn.endswith(".py"): - mod_name = 'test.test_asyncio.' + fn[:-3] - try: - __import__(mod_name) - except unittest.SkipTest: - pass - else: - mod = sys.modules[mod_name] - tests.addTests(loader.loadTestsFromModule(mod)) - return tests - - -def test_main(): - run_unittest(suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_asyncio/__main__.py b/Lib/test/test_asyncio/__main__.py --- a/Lib/test/test_asyncio/__main__.py +++ b/Lib/test/test_asyncio/__main__.py @@ -1,5 +1,4 @@ -from . import test_main +from . import load_tests +import unittest - -if __name__ == '__main__': - test_main() +unittest.main() diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py --- a/Lib/test/test_asyncio/test_selector_events.py +++ b/Lib/test/test_asyncio/test_selector_events.py @@ -672,6 +672,8 @@ def test_connection_lost(self): exc = OSError() tr = _SelectorTransport(self.loop, self.sock, self.protocol, None) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) tr._call_connection_lost(exc) self.protocol.connection_lost.assert_called_with(exc) @@ -679,8 +681,6 @@ self.assertIsNone(tr._sock) self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py --- a/Lib/test/test_asyncio/test_subprocess.py +++ b/Lib/test/test_asyncio/test_subprocess.py @@ -42,7 +42,7 @@ return (exitcode, data) task = run(b'some data') - task = asyncio.wait_for(task, 10.0, loop=self.loop) + task = asyncio.wait_for(task, 60.0, loop=self.loop) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') @@ -61,7 +61,7 @@ return proc.returncode, stdout task = run(b'some data') - task = asyncio.wait_for(task, 10.0, loop=self.loop) + task = asyncio.wait_for(task, 60.0, loop=self.loop) exitcode, stdout = self.loop.run_until_complete(task) self.assertEqual(exitcode, 0) self.assertEqual(stdout, b'some data') diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -435,6 +435,8 @@ def test__call_connection_lost(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = None tr._call_connection_lost(err) @@ -442,13 +444,13 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test__call_connection_lost_with_err(self): tr = unix_events._UnixReadPipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = OSError() tr._call_connection_lost(err) @@ -456,9 +458,6 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) @@ -717,6 +716,8 @@ def test__call_connection_lost(self): tr = unix_events._UnixWritePipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = None tr._call_connection_lost(err) @@ -724,13 +725,13 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test__call_connection_lost_with_err(self): tr = unix_events._UnixWritePipeTransport( self.loop, self.pipe, self.protocol) + self.assertIsNotNone(tr._protocol) + self.assertIsNotNone(tr._loop) err = OSError() tr._call_connection_lost(err) @@ -738,8 +739,6 @@ self.pipe.close.assert_called_with() self.assertIsNone(tr._protocol) - self.assertEqual(2, sys.getrefcount(self.protocol), - pprint.pformat(gc.get_referrers(self.protocol))) self.assertIsNone(tr._loop) def test_close(self): diff --git a/Lib/test/test_asyncio/test_windows_events.py b/Lib/test/test_asyncio/test_windows_events.py --- a/Lib/test/test_asyncio/test_windows_events.py +++ b/Lib/test/test_asyncio/test_windows_events.py @@ -94,38 +94,48 @@ event = _overlapped.CreateEvent(None, True, False, None) self.addCleanup(_winapi.CloseHandle, event) - # Wait for unset event with 0.2s timeout; + # Wait for unset event with 0.5s timeout; # result should be False at timeout - f = self.loop._proactor.wait_for_handle(event, 0.2) + fut = self.loop._proactor.wait_for_handle(event, 0.5) start = self.loop.time() - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start - self.assertFalse(f.result()) - self.assertTrue(0.18 < elapsed < 0.9, elapsed) + self.assertFalse(fut.result()) + self.assertTrue(0.48 < elapsed < 0.9, elapsed) _overlapped.SetEvent(event) # Wait for for set event; # result should be True immediately - f = self.loop._proactor.wait_for_handle(event, 10) + fut = self.loop._proactor.wait_for_handle(event, 10) start = self.loop.time() - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start - self.assertTrue(f.result()) - self.assertTrue(0 <= elapsed < 0.1, elapsed) + self.assertTrue(fut.result()) + self.assertTrue(0 <= elapsed < 0.3, elapsed) - _overlapped.ResetEvent(event) + # Tulip issue #195: cancelling a done _WaitHandleFuture must not crash + fut.cancel() + + def test_wait_for_handle_cancel(self): + event = _overlapped.CreateEvent(None, True, False, None) + self.addCleanup(_winapi.CloseHandle, event) # Wait for unset event with a cancelled future; # CancelledError should be raised immediately - f = self.loop._proactor.wait_for_handle(event, 10) - f.cancel() + fut = self.loop._proactor.wait_for_handle(event, 10) + fut.cancel() start = self.loop.time() with self.assertRaises(asyncio.CancelledError): - self.loop.run_until_complete(f) + self.loop.run_until_complete(fut) elapsed = self.loop.time() - start self.assertTrue(0 <= elapsed < 0.1, elapsed) + # Tulip issue #195: cancelling a _WaitHandleFuture twice must not crash + fut = self.loop._proactor.wait_for_handle(event) + fut.cancel() + fut.cancel() + if __name__ == '__main__': unittest.main() diff --git a/Lib/test/test_email/__init__.py b/Lib/test/test_email/__init__.py --- a/Lib/test/test_email/__init__.py +++ b/Lib/test/test_email/__init__.py @@ -1,31 +1,16 @@ import os import sys import unittest -import test.support import collections import email from email.message import Message from email._policybase import compat32 +from test.support import load_package_tests from test.test_email import __file__ as landmark -# Run all tests in package for '-m unittest test.test_email' -def load_tests(loader, standard_tests, pattern): - this_dir = os.path.dirname(__file__) - if pattern is None: - pattern = "test*" - package_tests = loader.discover(start_dir=this_dir, pattern=pattern) - standard_tests.addTests(package_tests) - return standard_tests - - -# used by regrtest and __main__. -def test_main(): - here = os.path.dirname(__file__) - # Unittest mucks with the path, so we have to save and restore - # it to keep regrtest happy. - savepath = sys.path[:] - test.support._run_suite(unittest.defaultTestLoader.discover(here)) - sys.path[:] = savepath +# Load all tests in package +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) # helper code used by a number of test modules. diff --git a/Lib/test/test_email/__main__.py b/Lib/test/test_email/__main__.py --- a/Lib/test/test_email/__main__.py +++ b/Lib/test/test_email/__main__.py @@ -1,3 +1,4 @@ -from test.test_email import test_main +from test.test_email import load_tests +import unittest -test_main() +unittest.main() diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -77,7 +77,7 @@ def tearDown(self): self.env.__exit__() del self.env - shutil.rmtree(os.path.split(LOCALEDIR)[0]) + support.rmtree(os.path.split(LOCALEDIR)[0]) class GettextTestCase1(GettextBaseTest): diff --git a/Lib/test/test_importlib/__init__.py b/Lib/test/test_importlib/__init__.py --- a/Lib/test/test_importlib/__init__.py +++ b/Lib/test/test_importlib/__init__.py @@ -1,33 +1,5 @@ import os -import sys -from test import support -import unittest +from test.support import load_package_tests -def test_suite(package=__package__, directory=os.path.dirname(__file__)): - suite = unittest.TestSuite() - for name in os.listdir(directory): - if name.startswith(('.', '__')): - continue - path = os.path.join(directory, name) - if (os.path.isfile(path) and name.startswith('test_') and - name.endswith('.py')): - submodule_name = os.path.splitext(name)[0] - module_name = "{0}.{1}".format(package, submodule_name) - __import__(module_name, level=0) - module_tests = unittest.findTestCases(sys.modules[module_name]) - suite.addTest(module_tests) - elif os.path.isdir(path): - package_name = "{0}.{1}".format(package, name) - __import__(package_name, level=0) - package_tests = getattr(sys.modules[package_name], 'test_suite')() - suite.addTest(package_tests) - else: - continue - return suite - - -def test_main(): - start_dir = os.path.dirname(__file__) - top_dir = os.path.dirname(os.path.dirname(start_dir)) - test_loader = unittest.TestLoader() - support.run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir)) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/__main__.py b/Lib/test/test_importlib/__main__.py --- a/Lib/test/test_importlib/__main__.py +++ b/Lib/test/test_importlib/__main__.py @@ -1,9 +1,4 @@ -"""Run importlib's test suite. +from . import load_tests +import unittest -Specifying the ``--builtin`` flag will run tests, where applicable, with -builtins.__import__ instead of importlib.__import__. - -""" -if __name__ == '__main__': - from . import test_main - test_main() +unittest.main() diff --git a/Lib/test/test_importlib/builtin/__init__.py b/Lib/test/test_importlib/builtin/__init__.py --- a/Lib/test/test_importlib/builtin/__init__.py +++ b/Lib/test/test_importlib/builtin/__init__.py @@ -1,12 +1,5 @@ -from .. import test_suite import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.builtin', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/builtin/__main__.py b/Lib/test/test_importlib/builtin/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/builtin/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/extension/__init__.py b/Lib/test/test_importlib/extension/__init__.py --- a/Lib/test/test_importlib/extension/__init__.py +++ b/Lib/test/test_importlib/extension/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.extension', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/extension/__main__.py b/Lib/test/test_importlib/extension/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/extension/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/frozen/__init__.py b/Lib/test/test_importlib/frozen/__init__.py --- a/Lib/test/test_importlib/frozen/__init__.py +++ b/Lib/test/test_importlib/frozen/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.frozen', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/frozen/__main__.py b/Lib/test/test_importlib/frozen/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/frozen/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/import_/__init__.py b/Lib/test/test_importlib/import_/__init__.py --- a/Lib/test/test_importlib/import_/__init__.py +++ b/Lib/test/test_importlib/import_/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test_suite('importlib.test.import_', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/import_/__main__.py b/Lib/test/test_importlib/import_/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/import_/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_importlib/source/__init__.py b/Lib/test/test_importlib/source/__init__.py --- a/Lib/test/test_importlib/source/__init__.py +++ b/Lib/test/test_importlib/source/__init__.py @@ -1,13 +1,5 @@ -from .. import test_suite -import os.path -import unittest +import os +from test.support import load_package_tests - -def test_suite(): - directory = os.path.dirname(__file__) - return test.test_suite('importlib.test.source', directory) - - -if __name__ == '__main__': - from test.support import run_unittest - run_unittest(test_suite()) +def load_tests(*args): + return load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/test/test_importlib/source/__main__.py b/Lib/test/test_importlib/source/__main__.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_importlib/source/__main__.py @@ -0,0 +1,4 @@ +from . import load_tests +import unittest + +unittest.main() diff --git a/Lib/test/test_json/__init__.py b/Lib/test/test_json/__init__.py --- a/Lib/test/test_json/__init__.py +++ b/Lib/test/test_json/__init__.py @@ -42,23 +42,12 @@ '_json') -here = os.path.dirname(__file__) - -def load_tests(*args): - suite = additional_tests() - loader = unittest.TestLoader() - for fn in os.listdir(here): - if fn.startswith("test") and fn.endswith(".py"): - modname = "test.test_json." + fn[:-3] - __import__(modname) - module = sys.modules[modname] - suite.addTests(loader.loadTestsFromModule(module)) - return suite - -def additional_tests(): +def load_tests(loader, _, pattern): suite = unittest.TestSuite() for mod in (json, json.encoder, json.decoder): suite.addTest(doctest.DocTestSuite(mod)) suite.addTest(TestPyTest('test_pyjson')) suite.addTest(TestCTest('test_cjson')) - return suite + + pkg_dir = os.path.dirname(__file__) + return support.load_package_tests(pkg_dir, loader, suite, pattern) diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -207,6 +207,9 @@ for fmt in ALL_FORMATS: with self.subTest(fmt=fmt): pl = self._create(fmt=fmt) + pl2 = plistlib.loads(TESTDATA[fmt], fmt=fmt) + self.assertEqual(dict(pl), dict(pl2), + "generated data was not identical to Apple's output") pl2 = plistlib.loads(TESTDATA[fmt]) self.assertEqual(dict(pl), dict(pl2), "generated data was not identical to Apple's output") @@ -217,6 +220,8 @@ b = BytesIO() pl = self._create(fmt=fmt) plistlib.dump(pl, b, fmt=fmt) + pl2 = plistlib.load(BytesIO(b.getvalue()), fmt=fmt) + self.assertEqual(dict(pl), dict(pl2)) pl2 = plistlib.load(BytesIO(b.getvalue())) self.assertEqual(dict(pl), dict(pl2)) diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -1,17 +1,20 @@ """ Very minimal unittests for parts of the readline module. - -These tests were added to check that the libedit emulation on OSX and -the "real" readline have the same interface for history manipulation. That's -why the tests cover only a small subset of the interface. """ +import os import unittest from test.support import run_unittest, import_module +from test.script_helper import assert_python_ok # Skip tests if there is no readline module readline = import_module('readline') class TestHistoryManipulation (unittest.TestCase): + """ + These tests were added to check that the libedit emulation on OSX and the + "real" readline have the same interface for history manipulation. That's + why the tests cover only a small subset of the interface. + """ @unittest.skipIf(not hasattr(readline, 'clear_history'), "The history update test cannot be run because the " @@ -40,8 +43,18 @@ self.assertEqual(readline.get_current_history_length(), 1) +class TestReadline(unittest.TestCase): + def test_init(self): + # Issue #19884: Ensure that the ANSI sequence "\033[1034h" is not + # written into stdout when the readline module is imported and stdout + # is redirected to a pipe. + rc, stdout, stderr = assert_python_ok('-c', 'import readline', + TERM='xterm-256color') + self.assertEqual(stdout, b'') + + def test_main(): - run_unittest(TestHistoryManipulation) + run_unittest(TestHistoryManipulation, TestReadline) if __name__ == "__main__": test_main() diff --git a/Lib/test/test_tools/__init__.py b/Lib/test/test_tools/__init__.py --- a/Lib/test/test_tools/__init__.py +++ b/Lib/test/test_tools/__init__.py @@ -21,11 +21,5 @@ with support.DirsOnSysPath(scriptsdir): return importlib.import_module(toolname) -def load_tests(loader, standard_tests, pattern): - this_dir = os.path.dirname(__file__) - if pattern is None: - pattern = "test*" - with support.DirsOnSysPath(): - package_tests = loader.discover(start_dir=this_dir, pattern=pattern) - standard_tests.addTests(package_tests) - return standard_tests +def load_tests(*args): + return support.load_package_tests(os.path.dirname(__file__), *args) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -421,7 +421,10 @@ + _flatten(args) + _flatten(list(kw.items()))) def tk_menuBar(self, *args): """Do not use. Needed in Tk 3.6 and earlier.""" - pass # obsolete since Tk 4.0 + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_menuBar() does nothing and will be removed in 3.6', + DeprecationWarning, stacklevel=2) def wait_variable(self, name='PY_VAR'): """Wait until the variable is modified. @@ -2674,7 +2677,11 @@ selectcolor, takefocus, tearoff, tearoffcommand, title, type.""" Widget.__init__(self, master, 'menu', cnf, kw) def tk_bindForTraversal(self): - pass # obsolete since Tk 4.0 + # obsolete since Tk 4.0 + import warnings + warnings.warn('tk_bindForTraversal() does nothing and ' + 'will be removed in 3.6', + DeprecationWarning, stacklevel=2) def tk_mbPost(self): self.tk.call('tk_mbPost', self._w) def tk_mbUnpost(self): diff --git a/Lib/tkinter/test/test_tkinter/test_widgets.py b/Lib/tkinter/test/test_tkinter/test_widgets.py --- a/Lib/tkinter/test/test_tkinter/test_widgets.py +++ b/Lib/tkinter/test/test_tkinter/test_widgets.py @@ -916,6 +916,24 @@ self.checkEnumParam(widget, 'orient', 'vertical', 'horizontal', errmsg='bad orientation "{}": must be vertical or horizontal') + def test_activate(self): + sb = self.create() + for e in ('arrow1', 'slider', 'arrow2'): + sb.activate(e) + sb.activate('') + self.assertRaises(TypeError, sb.activate) + self.assertRaises(TypeError, sb.activate, 'arrow1', 'arrow2') + + def test_set(self): + sb = self.create() + sb.set(0.2, 0.4) + self.assertEqual(sb.get(), (0.2, 0.4)) + self.assertRaises(TclError, sb.set, 'abc', 'def') + self.assertRaises(TclError, sb.set, 0.6, 'def') + self.assertRaises(TclError, sb.set, 0.6, None) + self.assertRaises(TclError, sb.set, 0.6) + self.assertRaises(TclError, sb.set, 0.6, 0.7, 0.8) + @add_standard_options(StandardOptionsTests) class PanedWindowTest(AbstractWidgetTest, unittest.TestCase): diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -27,88 +27,54 @@ return [entry[:-3] for entry in os.listdir(demo_dir) if entry.endswith(".py") and entry[0] != '_'] -def showDemoHelp(): - view_file(demo.root, "Help on turtleDemo", - os.path.join(demo_dir, "demohelp.txt")) - -def showAboutDemo(): - view_file(demo.root, "About turtleDemo", - os.path.join(demo_dir, "about_turtledemo.txt")) - -def showAboutTurtle(): - view_file(demo.root, "About the new turtle module.", - os.path.join(demo_dir, "about_turtle.txt")) +help_entries = ( # (help_label, help_file) + ('Turtledemo help', "demohelp.txt"), + ('About turtledemo', "about_turtledemo.txt"), + ('About turtle module', "about_turtle.txt"), + ) class DemoWindow(object): - def __init__(self, filename=None): #, root=None): + def __init__(self, filename=None): self.root = root = turtle._root = Tk() + root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) - ################# + root.grid_rowconfigure(1, weight=1) + root.grid_columnconfigure(0, weight=1) + root.grid_columnconfigure(1, minsize=90, weight=1) + root.grid_columnconfigure(2, minsize=90, weight=1) + root.grid_columnconfigure(3, minsize=90, weight=1) + self.mBar = Frame(root, relief=RAISED, borderwidth=2) - self.mBar.pack(fill=X) - self.ExamplesBtn = self.makeLoadDemoMenu() self.OptionsBtn = self.makeHelpMenu() - self.mBar.tk_menuBar(self.ExamplesBtn, self.OptionsBtn) #, QuitBtn) + self.mBar.grid(row=0, columnspan=4, sticky='news') - root.title('Python turtle-graphics examples') - ################# - self.left_frame = left_frame = Frame(root) - self.text_frame = text_frame = Frame(left_frame) - self.vbar = vbar =Scrollbar(text_frame, name='vbar') - self.text = text = Text(text_frame, - name='text', padx=5, wrap='none', - width=45) - vbar['command'] = text.yview - vbar.pack(side=LEFT, fill=Y) - ##################### - self.hbar = hbar =Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) - hbar['command'] = text.xview - hbar.pack(side=BOTTOM, fill=X) - ##################### - text['yscrollcommand'] = vbar.set - text.config(font=txtfont) - text.config(xscrollcommand=hbar.set) - text.pack(side=LEFT, fill=Y, expand=1) - ##################### - self.output_lbl = Label(left_frame, height= 1,text=" --- ", bg = "#ddf", - font = ("Arial", 16, 'normal')) - self.output_lbl.pack(side=BOTTOM, expand=0, fill=X) - ##################### - text_frame.pack(side=LEFT, fill=BOTH, expand=0) - left_frame.pack(side=LEFT, fill=BOTH, expand=0) - self.graph_frame = g_frame = Frame(root) + pane = PanedWindow(orient=HORIZONTAL, sashwidth=5, + sashrelief=SOLID, bg='#ddd') + pane.add(self.makeTextFrame(pane)) + pane.add(self.makeGraphFrame(pane)) + pane.grid(row=1, columnspan=4, sticky='news') - turtle._Screen._root = g_frame - turtle._Screen._canvas = turtle.ScrolledCanvas(g_frame, 800, 600, 1000, 800) - #xturtle.Screen._canvas.pack(expand=1, fill="both") - self.screen = _s_ = turtle.Screen() -##### - turtle.TurtleScreen.__init__(_s_, _s_._canvas) -##### - self.scanvas = _s_._canvas - #xturtle.RawTurtle.canvases = [self.scanvas] - turtle.RawTurtle.screens = [_s_] + self.output_lbl = Label(root, height= 1, text=" --- ", bg="#ddf", + font=("Arial", 16, 'normal'), borderwidth=2, + relief=RIDGE) + self.start_btn = Button(root, text=" START ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.startDemo) + self.stop_btn = Button(root, text=" STOP ", font=btnfont, + fg="white", disabledforeground = "#fed", + command=self.stopIt) + self.clear_btn = Button(root, text=" CLEAR ", font=btnfont, + fg="white", disabledforeground="#fed", + command = self.clearCanvas) + self.output_lbl.grid(row=2, column=0, sticky='news', padx=(0,5)) + self.start_btn.grid(row=2, column=1, sticky='ew') + self.stop_btn.grid(row=2, column=2, sticky='ew') + self.clear_btn.grid(row=2, column=3, sticky='ew') - self.scanvas.pack(side=TOP, fill=BOTH, expand=1) - - self.btn_frame = btn_frame = Frame(g_frame, height=100) - self.start_btn = Button(btn_frame, text=" START ", font=btnfont, fg = "white", - disabledforeground = "#fed", command=self.startDemo) - self.start_btn.pack(side=LEFT, fill=X, expand=1) - self.stop_btn = Button(btn_frame, text=" STOP ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.stopIt) - self.stop_btn.pack(side=LEFT, fill=X, expand=1) - self.clear_btn = Button(btn_frame, text=" CLEAR ", font=btnfont, fg = "white", - disabledforeground = "#fed", command = self.clearCanvas) - self.clear_btn.pack(side=LEFT, fill=X, expand=1) - - self.btn_frame.pack(side=TOP, fill=BOTH, expand=0) - self.graph_frame.pack(side=TOP, fill=BOTH, expand=1) - - Percolator(text).insertfilter(ColorDelegator()) + Percolator(self.text).insertfilter(ColorDelegator()) self.dirty = False self.exitflag = False if filename: @@ -117,9 +83,46 @@ "Choose example from menu", "black") self.state = STARTUP - def _destroy(self): - self.root.destroy() - sys.exit() + + def onResize(self, event): + cwidth = self._canvas.winfo_width() + cheight = self._canvas.winfo_height() + self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth) + self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight) + + def makeTextFrame(self, root): + self.text_frame = text_frame = Frame(root) + self.text = text = Text(text_frame, name='text', padx=5, + wrap='none', width=45) + + self.vbar = vbar = Scrollbar(text_frame, name='vbar') + vbar['command'] = text.yview + vbar.pack(side=LEFT, fill=Y) + self.hbar = hbar = Scrollbar(text_frame, name='hbar', orient=HORIZONTAL) + hbar['command'] = text.xview + hbar.pack(side=BOTTOM, fill=X) + + text['font'] = txtfont + text['yscrollcommand'] = vbar.set + text['xscrollcommand'] = hbar.set + text.pack(side=LEFT, fill=BOTH, expand=1) + return text_frame + + def makeGraphFrame(self, root): + turtle._Screen._root = root + self.canvwidth = 1000 + self.canvheight = 800 + turtle._Screen._canvas = self._canvas = canvas = turtle.ScrolledCanvas( + root, 800, 600, self.canvwidth, self.canvheight) + canvas.adjustScrolls() + canvas._rootwindow.bind('', self.onResize) + canvas._canvas['borderwidth'] = 0 + + self.screen = _s_ = turtle.Screen() + turtle.TurtleScreen.__init__(_s_, _s_._canvas) + self.scanvas = _s_._canvas + turtle.RawTurtle.screens = [_s_] + return canvas def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) @@ -145,9 +148,9 @@ self.output_lbl.config(text=txt, fg=color) - def makeLoadDemoMenu(self): - CmdBtn = Menubutton(self.mBar, text='Examples', underline=0, font=menufont) + CmdBtn = Menubutton(self.mBar, text='Examples', + underline=0, font=menufont) CmdBtn.pack(side=LEFT, padx="2m") CmdBtn.menu = Menu(CmdBtn) @@ -167,12 +170,10 @@ CmdBtn.pack(side=LEFT, padx='2m') CmdBtn.menu = Menu(CmdBtn) - CmdBtn.menu.add_command(label='About turtle.py', font=menufont, - command=showAboutTurtle) - CmdBtn.menu.add_command(label='turtleDemo - Help', font=menufont, - command=showDemoHelp) - CmdBtn.menu.add_command(label='About turtleDemo', font=menufont, - command=showAboutDemo) + for help_label, help_file in help_entries: + def show(help_label=help_label, help_file=help_file): + view_file(self.root, help_label, os.path.join(demo_dir, help_file)) + CmdBtn.menu.add_command(label=help_label, font=menufont, command=show) CmdBtn['menu'] = CmdBtn.menu return CmdBtn @@ -180,7 +181,6 @@ def refreshCanvas(self): if not self.dirty: return self.screen.clear() - #self.screen.mode("standard") self.dirty=False def loadfile(self, filename): @@ -238,29 +238,16 @@ self.configGUI(NORMAL, NORMAL, DISABLED, DISABLED, "STOPPED!", "red") turtle.TurtleScreen._RUNNING = False - #print "stopIT: exitflag = True" else: turtle.TurtleScreen._RUNNING = False - #print "stopIt: exitflag = False" + + def _destroy(self): + self.root.destroy() + + +def main(): + demo = DemoWindow() + demo.root.mainloop() if __name__ == '__main__': - demo = DemoWindow() - RUN = True - while RUN: - try: - #print("ENTERING mainloop") - demo.root.mainloop() - except AttributeError: - #print("AttributeError!- WAIT A MOMENT!") - time.sleep(0.3) - print("GOING ON ..") - demo.ckearCanvas() - except TypeError: - demo.screen._delete("all") - #print("CRASH!!!- WAIT A MOMENT!") - time.sleep(0.3) - #print("GOING ON ..") - demo.clearCanvas() - except: - print("BYE!") - RUN = False + main() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -662,6 +662,7 @@ Tamito Kajiyama Jan Kaliszewski Peter van Kampen +Jan Kanis Rafe Kaplan Jacob Kaplan-Moss Janne Karila @@ -997,7 +998,6 @@ Todd R. Palmer Juan David Ib??ez Palomar Jan Palus -Martin Panter Mathias Panzenb?ck M. Papillon Peter Parente diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,8 +27,19 @@ Library ------- +- Issue #16133: The asynchat.async_chat.handle_read() method now ignores + BlockingIOError exceptions. + +- Issue #19884: readline: Disable the meta modifier key if stdout is not + a terminal to not write the ANSI sequence "\033[1034h" into stdout. This + sequence is used on some terminal (ex: TERM=xterm-256color") to enable + support of 8 bit characters. + +- Issue #21888: plistlib's load() and loads() now work if the fmt parameter is + specified. + - Issue #21044: tarfile.open() now handles fileobj with an integer 'name' - attribute. Based on patch by Martin Panter. + attribute. Based on patch by Antoine Pietri. - Issue #21867: Prevent turtle crash due to invalid undo buffer size. @@ -206,6 +217,10 @@ Tests ----- +- Issue #22002: Added ``load_package_tests`` function to test.support and used + it to implement/augment test discovery in test_asyncio, test_email, + test_importlib, test_json, and test_tools. + - Issue #21976: Fix test_ssl to accept LibreSSL version strings. Thanks to William Orr. diff --git a/Modules/readline.c b/Modules/readline.c --- a/Modules/readline.c +++ b/Modules/readline.c @@ -1019,6 +1019,21 @@ mod_state->begidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L); + +#ifndef __APPLE__ + if (!isatty(STDOUT_FILENO)) { + /* Issue #19884: stdout is no a terminal. Disable meta modifier + keys to not write the ANSI sequence "\033[1034h" into stdout. On + terminals supporting 8 bit characters like TERM=xterm-256color + (which is now the default Fedora since Fedora 18), the meta key is + used to enable support of 8 bit characters (ANSI sequence + "\033[1034h"). + + With libedit, this call makes readline() crash. */ + rl_variable_bind ("enable-meta-key", "off"); + } +#endif + /* Initialize (allows .inputrc to override) * * XXX: A bug in the readline-2.2 library causes a memory leak diff --git a/Objects/stringlib/README.txt b/Objects/stringlib/README.txt --- a/Objects/stringlib/README.txt +++ b/Objects/stringlib/README.txt @@ -1,4 +1,4 @@ -bits shared by the stringobject and unicodeobject implementations (and +bits shared by the bytesobject and unicodeobject implementations (and possibly other modules, in a not too distant future). the stuff in here is included into relevant places; see the individual -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 19:46:03 2014 From: python-checkins at python.org (charles-francois.natali) Date: Fri, 25 Jul 2014 19:46:03 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2319875=3A_Fix_random_test=5Fgetsockaddrarg=28=29?= =?utf-8?q?_failure=2E?= Message-ID: <3hKdB31l1jz7Lkm@mail.python.org> http://hg.python.org/cpython/rev/619feea86ce4 changeset: 91863:619feea86ce4 parent: 91859:766570a5d607 parent: 91862:516877b962be user: Charles-Fran?ois Natali date: Fri Jul 25 18:45:28 2014 +0100 summary: Issue #19875: Fix random test_getsockaddrarg() failure. files: Lib/test/test_socket.py | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 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 @@ -3,6 +3,7 @@ import errno import io +import itertools import socket import select import tempfile @@ -1147,17 +1148,24 @@ sock.close() def test_getsockaddrarg(self): - host = '0.0.0.0' + sock = socket.socket() + self.addCleanup(sock.close) port = support.find_unused_port() big_port = port + 65536 neg_port = port - 65536 - sock = socket.socket() - try: - self.assertRaises(OverflowError, sock.bind, (host, big_port)) - self.assertRaises(OverflowError, sock.bind, (host, neg_port)) - sock.bind((host, port)) - finally: - sock.close() + self.assertRaises(OverflowError, sock.bind, (HOST, big_port)) + self.assertRaises(OverflowError, sock.bind, (HOST, neg_port)) + # Since find_unused_port() is inherently subject to race conditions, we + # call it a couple times if necessary. + for i in itertools.count(): + port = support.find_unused_port() + try: + sock.bind((HOST, port)) + except OSError as e: + if e.errno != errno.EADDRINUSE or i == 5: + raise + else: + break @unittest.skipUnless(os.name == "nt", "Windows specific") def test_sock_ioctl(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 20:32:08 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 25 Jul 2014 20:32:08 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDcy?= =?utf-8?q?=3A_Fix_a_couple_of_SSL_doc_typos=2E__Patch_by_Alex_Gaynor=2E?= Message-ID: <3hKfCD4dtpz7LjP@mail.python.org> http://hg.python.org/cpython/rev/1c7567ec6292 changeset: 91864:1c7567ec6292 branch: 3.4 parent: 91862:516877b962be user: Zachary Ware date: Fri Jul 25 13:30:50 2014 -0500 summary: Issue #22072: Fix a couple of SSL doc typos. Patch by Alex Gaynor. 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 @@ -787,7 +787,7 @@ Perform the SSL setup handshake. .. versionchanged:: 3.4 - The handshake method also performce :func:`match_hostname` when the + The handshake method also performs :func:`match_hostname` when the :attr:`~SSLContext.check_hostname` attribute of the socket's :attr:`~SSLSocket.context` is true. @@ -1111,7 +1111,7 @@ returned. Other return values will result in a TLS fatal error with :const:`ALERT_DESCRIPTION_INTERNAL_ERROR`. - If there is a IDNA decoding error on the server name, the TLS connection + If there is an IDNA decoding error on the server name, the TLS connection will terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS alert message to the client. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 20:32:09 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 25 Jul 2014 20:32:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Closes_=2322072=3A_Merge_typo_fixes_from_3=2E4?= Message-ID: <3hKfCF60Q5z7Ljv@mail.python.org> http://hg.python.org/cpython/rev/967311e6c0d2 changeset: 91865:967311e6c0d2 parent: 91863:619feea86ce4 parent: 91864:1c7567ec6292 user: Zachary Ware date: Fri Jul 25 13:31:36 2014 -0500 summary: Closes #22072: Merge typo fixes from 3.4 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 @@ -808,7 +808,7 @@ Perform the SSL setup handshake. .. versionchanged:: 3.4 - The handshake method also performce :func:`match_hostname` when the + The handshake method also performs :func:`match_hostname` when the :attr:`~SSLContext.check_hostname` attribute of the socket's :attr:`~SSLSocket.context` is true. @@ -1132,7 +1132,7 @@ returned. Other return values will result in a TLS fatal error with :const:`ALERT_DESCRIPTION_INTERNAL_ERROR`. - If there is a IDNA decoding error on the server name, the TLS connection + If there is an IDNA decoding error on the server name, the TLS connection will terminate with an :const:`ALERT_DESCRIPTION_INTERNAL_ERROR` fatal TLS alert message to the client. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 21:42:17 2014 From: python-checkins at python.org (ned.deily) Date: Fri, 25 Jul 2014 21:42:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2318093=3A_Create_P?= =?utf-8?q?rograms_directory_in_build_location_for?= Message-ID: <3hKgm95vJZz7LjP@mail.python.org> http://hg.python.org/cpython/rev/413017768dde changeset: 91866:413017768dde user: Ned Deily date: Fri Jul 25 12:41:31 2014 -0700 summary: Issue #18093: Create Programs directory in build location for out-of-tree builds. files: configure | 2 +- configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure --- a/configure +++ b/configure @@ -15351,7 +15351,7 @@ done -SRCDIRS="Parser Grammar Objects Python Modules Mac" +SRCDIRS="Parser Grammar Objects Python Modules Mac Programs" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for build directories" >&5 $as_echo_n "checking for build directories... " >&6; } for dir in $SRCDIRS; do diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -4734,7 +4734,7 @@ done AC_SUBST(SRCDIRS) -SRCDIRS="Parser Grammar Objects Python Modules Mac" +SRCDIRS="Parser Grammar Objects Python Modules Mac Programs" AC_MSG_CHECKING(for build directories) for dir in $SRCDIRS; do if test ! -d $dir; then -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 21:48:48 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 25 Jul 2014 21:48:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTU4?= =?utf-8?q?=3A_Define_HAVE=5FROUND_when_building_with_VS_2013_and_above=2E?= Message-ID: <3hKgvh4B7rz7LjM@mail.python.org> http://hg.python.org/cpython/rev/cb2e1b3a395f changeset: 91867:cb2e1b3a395f branch: 2.7 parent: 91860:a5cb10f2dbaa user: Zachary Ware date: Fri Jul 25 14:34:19 2014 -0500 summary: Issue #21958: Define HAVE_ROUND when building with VS 2013 and above. Patch by Zachary Turner. files: Misc/NEWS | 3 +++ PC/pyconfig.h | 5 +++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -58,6 +58,9 @@ Build ----- +- Issue #21958: Define HAVE_ROUND when building with Visual Studio 2013 and + above. Patch by Zachary Turner. + - Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ now display special message when and only when there are failures. diff --git a/PC/pyconfig.h b/PC/pyconfig.h --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -435,6 +435,11 @@ /* Define to 1 if you have the `copysign' function. */ #define HAVE_COPYSIGN 1 +/* Define to 1 if you have the `round' function. */ +#if _MSC_VER >= 1800 +#define HAVE_ROUND 1 +#endif + /* Define to 1 if you have the `isinf' macro. */ #define HAVE_DECL_ISINF 1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 21:48:49 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 25 Jul 2014 21:48:49 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTU4?= =?utf-8?q?=3A_Define_HAVE=5FROUND_when_building_with_VS_2013_and_above=2E?= Message-ID: <3hKgvj63lMz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/1c35cefd25b7 changeset: 91868:1c35cefd25b7 branch: 3.4 parent: 91864:1c7567ec6292 user: Zachary Ware date: Fri Jul 25 14:34:19 2014 -0500 summary: Issue #21958: Define HAVE_ROUND when building with VS 2013 and above. Patch by Zachary Turner. files: Misc/NEWS | 3 +++ PC/pyconfig.h | 5 +++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -180,6 +180,9 @@ Build ----- +- Issue #21958: Define HAVE_ROUND when building with Visual Studio 2013 and + above. Patch by Zachary Turner. + - Issue #15759: "make suspicious", "make linkcheck" and "make doctest" in Doc/ now display special message when and only when there are failures. diff --git a/PC/pyconfig.h b/PC/pyconfig.h --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -436,6 +436,11 @@ /* Define to 1 if you have the `copysign' function. */ #define HAVE_COPYSIGN 1 +/* Define to 1 if you have the `round' function. */ +#if _MSC_VER >= 1800 +#define HAVE_ROUND 1 +#endif + /* Define to 1 if you have the `isinf' macro. */ #define HAVE_DECL_ISINF 1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 21:48:51 2014 From: python-checkins at python.org (zach.ware) Date: Fri, 25 Jul 2014 21:48:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321958=3A_Merge_with_3=2E4?= Message-ID: <3hKgvl0n0pz7LjV@mail.python.org> http://hg.python.org/cpython/rev/1f5e8380f791 changeset: 91869:1f5e8380f791 parent: 91866:413017768dde parent: 91868:1c35cefd25b7 user: Zachary Ware date: Fri Jul 25 14:47:29 2014 -0500 summary: Issue #21958: Merge with 3.4 files: Misc/NEWS | 3 +++ PC/pyconfig.h | 5 +++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -664,6 +664,9 @@ Build ----- +- Issue #21958: Define HAVE_ROUND when building with Visual Studio 2013 and + above. Patch by Zachary Turner. + - Issue #18093: the programs that embed the CPython runtime are now in a separate "Programs" directory, rather than being kept in the Modules directory. diff --git a/PC/pyconfig.h b/PC/pyconfig.h --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -436,6 +436,11 @@ /* Define to 1 if you have the `copysign' function. */ #define HAVE_COPYSIGN 1 +/* Define to 1 if you have the `round' function. */ +#if _MSC_VER >= 1800 +#define HAVE_ROUND 1 +#endif + /* Define to 1 if you have the `isinf' macro. */ #define HAVE_DECL_ISINF 1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 22:15:29 2014 From: python-checkins at python.org (ned.deily) Date: Fri, 25 Jul 2014 22:15:29 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_Issue_=2322073=3A_fix_footnot?= =?utf-8?q?e_references=2E?= Message-ID: <3hKhVT2Qc6z7LjY@mail.python.org> http://hg.python.org/peps/rev/3b3dc5fafb82 changeset: 5507:3b3dc5fafb82 user: Ned Deily date: Fri Jul 25 13:15:24 2014 -0700 summary: Issue #22073: fix footnote references. files: pep-0466.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0466.txt b/pep-0466.txt --- a/pep-0466.txt +++ b/pep-0466.txt @@ -620,13 +620,13 @@ Thanks to Donald Stufft and Alex Gaynor for identifying a more limited set of essential security features that allowed the proposal to be made more -fine-grained than backporting entire modules from Python 3.4 [7,8]_. +fine-grained than backporting entire modules from Python 3.4 ([7]_, [8]_). Christian and Donald also provided valuable feedback on a preliminary draft of this proposal. Thanks also to participants in the python-dev mailing list threads -[1,2,5,6]_, as well as the various folks I discussed this issue with at +([1]_, [2]_, [5]_, [6]_), as well as the various folks I discussed this issue with at PyCon 2014 in Montreal. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Jul 25 22:36:17 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Fri, 25 Jul 2014 22:36:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322033=3A_Reprs_of?= =?utf-8?q?_most_Python_implemened_classes_now_contain_actual?= Message-ID: <3hKhyT6tTMz7Lk9@mail.python.org> http://hg.python.org/cpython/rev/42276ad3acef changeset: 91870:42276ad3acef user: Serhiy Storchaka date: Fri Jul 25 23:36:00 2014 +0300 summary: Issue #22033: Reprs of most Python implemened classes now contain actual class name instead of hardcoded one. files: Lib/_pyio.py | 10 +- Lib/concurrent/futures/_base.py | 15 ++- Lib/datetime.py | 49 ++++++++------ Lib/doctest.py | 5 +- Lib/email/headerregistry.py | 6 +- Lib/fractions.py | 3 +- Lib/http/client.py | 3 +- Lib/http/cookiejar.py | 2 +- Lib/idlelib/WidgetRedirector.py | 8 +- Lib/multiprocessing/dummy/__init__.py | 2 +- Lib/multiprocessing/managers.py | 10 +- Lib/multiprocessing/pool.py | 2 +- Lib/multiprocessing/synchronize.py | 12 +- Lib/multiprocessing/util.py | 7 +- Lib/pydoc.py | 3 +- Lib/subprocess.py | 2 +- Lib/urllib/parse.py | 2 +- Lib/uuid.py | 2 +- Lib/weakref.py | 4 +- Lib/wsgiref/headers.py | 2 +- Lib/xml/dom/minidom.py | 5 +- Lib/xml/etree/ElementTree.py | 4 +- Lib/xmlrpc/client.py | 15 ++-- Misc/NEWS | 3 + 24 files changed, 102 insertions(+), 74 deletions(-) diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -808,13 +808,14 @@ .format(self.__class__.__name__)) def __repr__(self): - clsname = self.__class__.__name__ + modname = self.__class__.__module__ + clsname = self.__class__.__qualname__ try: name = self.name except AttributeError: - return "<_pyio.{0}>".format(clsname) + return "<{}.{}>".format(modname, clsname) else: - return "<_pyio.{0} name={1!r}>".format(clsname, name) + return "<{}.{} name={!r}>".format(modname, clsname, name) ### Lower-level APIs ### @@ -1635,7 +1636,8 @@ # - "chars_..." for integer variables that count decoded characters def __repr__(self): - result = "<_pyio.TextIOWrapper" + result = "<{}.{}".format(self.__class__.__module__, + self.__class__.__qualname__) try: name = self.name except AttributeError: diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -302,17 +302,20 @@ with self._condition: if self._state == FINISHED: if self._exception: - return '' % ( - hex(id(self)), + return '<%s at %#x state=%s raised %s>' % ( + self.__class__.__name__, + id(self), _STATE_TO_DESCRIPTION_MAP[self._state], self._exception.__class__.__name__) else: - return '' % ( - hex(id(self)), + return '<%s at %#x state=%s returned %s>' % ( + self.__class__.__name__, + id(self), _STATE_TO_DESCRIPTION_MAP[self._state], self._result.__class__.__name__) - return '' % ( - hex(id(self)), + return '<%s at %#x state=%s>' % ( + self.__class__.__name__, + id(self), _STATE_TO_DESCRIPTION_MAP[self._state]) def cancel(self): diff --git a/Lib/datetime.py b/Lib/datetime.py --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -414,15 +414,19 @@ def __repr__(self): if self._microseconds: - return "%s(%d, %d, %d)" % ('datetime.' + self.__class__.__name__, - self._days, - self._seconds, - self._microseconds) + return "%s.%s(%d, %d, %d)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._days, + self._seconds, + self._microseconds) if self._seconds: - return "%s(%d, %d)" % ('datetime.' + self.__class__.__name__, - self._days, - self._seconds) - return "%s(%d)" % ('datetime.' + self.__class__.__name__, self._days) + return "%s.%s(%d, %d)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._days, + self._seconds) + return "%s.%s(%d)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._days) def __str__(self): mm, ss = divmod(self._seconds, 60) @@ -700,10 +704,11 @@ >>> repr(dt) 'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)' """ - return "%s(%d, %d, %d)" % ('datetime.' + self.__class__.__name__, - self._year, - self._month, - self._day) + return "%s.%s(%d, %d, %d)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._year, + self._month, + self._day) # XXX These shouldn't depend on time.localtime(), because that # clips the usable dates to [1970 .. 2038). At least ctime() is # easily done without using strftime() -- that's better too because @@ -1155,8 +1160,9 @@ s = ", %d" % self._second else: s = "" - s= "%s(%d, %d%s)" % ('datetime.' + self.__class__.__name__, - self._hour, self._minute, s) + s= "%s.%s(%d, %d%s)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._hour, self._minute, s) if self._tzinfo is not None: assert s[-1:] == ")" s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")" @@ -1569,8 +1575,9 @@ del L[-1] if L[-1] == 0: del L[-1] - s = ", ".join(map(str, L)) - s = "%s(%s)" % ('datetime.' + self.__class__.__name__, s) + s = "%s.%s(%s)" % (self.__class__.__module__, + self.__class__.__qualname__, + ", ".join(map(str, L))) if self._tzinfo is not None: assert s[-1:] == ")" s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")" @@ -1857,10 +1864,12 @@ if self is self.utc: return 'datetime.timezone.utc' if self._name is None: - return "%s(%r)" % ('datetime.' + self.__class__.__name__, - self._offset) - return "%s(%r, %r)" % ('datetime.' + self.__class__.__name__, - self._offset, self._name) + return "%s.%s(%r)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._offset) + return "%s.%s(%r, %r)" % (self.__class__.__module__, + self.__class__.__qualname__, + self._offset, self._name) def __str__(self): return self.tzname(None) diff --git a/Lib/doctest.py b/Lib/doctest.py --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -533,8 +533,9 @@ examples = '1 example' else: examples = '%d examples' % len(self.examples) - return ('' % - (self.name, self.filename, self.lineno, examples)) + return ('<%s %s from %s:%s (%s)>' % + (self.__class__.__name__, + self.name, self.filename, self.lineno, examples)) def __eq__(self, other): if type(self) is not type(other): diff --git a/Lib/email/headerregistry.py b/Lib/email/headerregistry.py --- a/Lib/email/headerregistry.py +++ b/Lib/email/headerregistry.py @@ -80,7 +80,8 @@ return lp def __repr__(self): - return "Address(display_name={!r}, username={!r}, domain={!r})".format( + return "{}(display_name={!r}, username={!r}, domain={!r})".format( + self.__class__.__name__, self.display_name, self.username, self.domain) def __str__(self): @@ -131,7 +132,8 @@ return self._addresses def __repr__(self): - return "Group(display_name={!r}, addresses={!r}".format( + return "{}(display_name={!r}, addresses={!r}".format( + self.__class__.__name__, self.display_name, self.addresses) def __str__(self): diff --git a/Lib/fractions.py b/Lib/fractions.py --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -280,7 +280,8 @@ def __repr__(self): """repr(self)""" - return ('Fraction(%s, %s)' % (self._numerator, self._denominator)) + return '%s(%s, %s)' % (self.__class__.__name__, + self._numerator, self._denominator) def __str__(self): """str(self)""" diff --git a/Lib/http/client.py b/Lib/http/client.py --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -1334,7 +1334,8 @@ e = ', %i more expected' % self.expected else: e = '' - return 'IncompleteRead(%i bytes read%s)' % (len(self.partial), e) + return '%s(%i bytes read%s)' % (self.__class__.__name__, + len(self.partial), e) def __str__(self): return repr(self) diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -805,7 +805,7 @@ args.append("%s=%s" % (name, repr(attr))) args.append("rest=%s" % repr(self._rest)) args.append("rfc2109=%s" % repr(self.rfc2109)) - return "Cookie(%s)" % ", ".join(args) + return "%s(%s)" % (self.__class__.__name__, ", ".join(args)) class CookiePolicy: diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py +++ b/Lib/idlelib/WidgetRedirector.py @@ -47,8 +47,9 @@ tk.createcommand(w, self.dispatch) def __repr__(self): - return "WidgetRedirector(%s<%s>)" % (self.widget.__class__.__name__, - self.widget._w) + return "%s(%s<%s>)" % (self.__class__.__name__, + self.widget.__class__.__name__, + self.widget._w) def close(self): "Unregister operations and revert redirection created by .__init__." @@ -142,7 +143,8 @@ self.orig_and_operation = (redir.orig, operation) def __repr__(self): - return "OriginalCommand(%r, %r)" % (self.redir, self.operation) + return "%s(%r, %r)" % (self.__class__.__name__, + self.redir, self.operation) def __call__(self, *args): return self.tk_call(self.orig_and_operation + args) diff --git a/Lib/multiprocessing/dummy/__init__.py b/Lib/multiprocessing/dummy/__init__.py --- a/Lib/multiprocessing/dummy/__init__.py +++ b/Lib/multiprocessing/dummy/__init__.py @@ -86,7 +86,7 @@ if not name.startswith('_'): temp.append('%s=%r' % (name, value)) temp.sort() - return 'Namespace(%s)' % str.join(', ', temp) + return '%s(%s)' % (self.__class__.__name__, ', '.join(temp)) dict = dict list = list diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -65,8 +65,8 @@ (self.typeid, self.address, self.id) = state def __repr__(self): - return 'Token(typeid=%r, address=%r, id=%r)' % \ - (self.typeid, self.address, self.id) + return '%s(typeid=%r, address=%r, id=%r)' % \ + (self.__class__.__name__, self.typeid, self.address, self.id) # # Function for communication with a manager's server process @@ -803,8 +803,8 @@ return self._getvalue() def __repr__(self): - return '<%s object, typeid %r at %s>' % \ - (type(self).__name__, self._token.typeid, '0x%x' % id(self)) + return '<%s object, typeid %r at %#x>' % \ + (type(self).__name__, self._token.typeid, id(self)) def __str__(self): ''' @@ -901,7 +901,7 @@ if not name.startswith('_'): temp.append('%s=%r' % (name, value)) temp.sort() - return 'Namespace(%s)' % str.join(', ', temp) + return '%s(%s)' % (self.__class__.__name__, ', '.join(temp)) class Value(object): def __init__(self, typecode, value, lock=True): diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -87,7 +87,7 @@ self.exc) def __repr__(self): - return "" % str(self) + return "<%s: %s>" % (self.__class__.__name__, self) def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None, diff --git a/Lib/multiprocessing/synchronize.py b/Lib/multiprocessing/synchronize.py --- a/Lib/multiprocessing/synchronize.py +++ b/Lib/multiprocessing/synchronize.py @@ -134,7 +134,7 @@ value = self._semlock._get_value() except Exception: value = 'unknown' - return '' % value + return '<%s(value=%s)>' % (self.__class__.__name__, value) # # Bounded semaphore @@ -150,8 +150,8 @@ value = self._semlock._get_value() except Exception: value = 'unknown' - return '' % \ - (value, self._semlock.maxvalue) + return '<%s(value=%s, maxvalue=%s)>' % \ + (self.__class__.__name__, value, self._semlock.maxvalue) # # Non-recursive lock @@ -176,7 +176,7 @@ name = 'SomeOtherProcess' except Exception: name = 'unknown' - return '' % name + return '<%s(owner=%s)>' % (self.__class__.__name__, name) # # Recursive lock @@ -202,7 +202,7 @@ name, count = 'SomeOtherProcess', 'nonzero' except Exception: name, count = 'unknown', 'unknown' - return '' % (name, count) + return '<%s(%s, %s)>' % (self.__class__.__name__, name, count) # # Condition variable @@ -243,7 +243,7 @@ self._woken_count._semlock._get_value()) except Exception: num_waiters = 'unknown' - return '' % (self._lock, num_waiters) + return '<%s(%s, %s)>' % (self.__class__.__name__, self._lock, num_waiters) def wait(self, timeout=None): assert self._lock._semlock._is_mine(), \ diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -212,10 +212,11 @@ obj = None if obj is None: - return '' + return '<%s object, dead>' % self.__class__.__name__ - x = '' + return '<%s.%s instance>' % (self.__class__.__module__, + self.__class__.__qualname__) _GoInteractive = object() def __call__(self, request=_GoInteractive): diff --git a/Lib/subprocess.py b/Lib/subprocess.py --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -464,7 +464,7 @@ raise ValueError("already closed") def __repr__(self): - return "Handle(%d)" % int(self) + return "%s(%d)" % (self.__class__.__name__, int(self)) __del__ = Close __str__ = __repr__ diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py --- a/Lib/urllib/parse.py +++ b/Lib/urllib/parse.py @@ -641,7 +641,7 @@ def __repr__(self): # Without this, will just display as a defaultdict - return "" % dict(self) + return "<%s %r>" % (self.__class__.__name__, dict(self)) def __missing__(self, b): # Handle a cache miss. Store quoted string in cache and return. diff --git a/Lib/uuid.py b/Lib/uuid.py --- a/Lib/uuid.py +++ b/Lib/uuid.py @@ -222,7 +222,7 @@ return self.int def __repr__(self): - return 'UUID(%r)' % str(self) + return '%s(%r)' % (self.__class__.__name__, str(self)) def __setattr__(self, name, value): raise TypeError('UUID objects are immutable') diff --git a/Lib/weakref.py b/Lib/weakref.py --- a/Lib/weakref.py +++ b/Lib/weakref.py @@ -144,7 +144,7 @@ return o is not None def __repr__(self): - return "" % id(self) + return "<%s at %#x>" % (self.__class__.__name__, id(self)) def __setitem__(self, key, value): if self._pending_removals: @@ -348,7 +348,7 @@ return len(self.data) - len(self._pending_removals) def __repr__(self): - return "" % id(self) + return "<%s at %#x>" % (self.__class__.__name__, id(self)) def __setitem__(self, key, value): self.data[ref(key, self._remove)] = value diff --git a/Lib/wsgiref/headers.py b/Lib/wsgiref/headers.py --- a/Lib/wsgiref/headers.py +++ b/Lib/wsgiref/headers.py @@ -131,7 +131,7 @@ return self._headers[:] def __repr__(self): - return "Headers(%r)" % self._headers + return "%s(%r)" % (self.__class__.__name__, self._headers) def __str__(self): """str() returns the formatted headers, complete with end line, 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 @@ -648,9 +648,10 @@ def __repr__(self): if self.namespace: - return "" % (self.name, self.namespace) + return "<%s %r (from %r)>" % (self.__class__.__name__, self.name, + self.namespace) else: - return "" % self.name + return "<%s %r>" % (self.__class__.__name__, self.name) def _get_name(self): return self.name 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 @@ -174,7 +174,7 @@ self._children = [] def __repr__(self): - return "" % (repr(self.tag), id(self)) + return "<%s %r at %#x>" % (self.__class__.__name__, self.tag, id(self)) def makeelement(self, tag, attrib): """Create a new element with the same type. @@ -509,7 +509,7 @@ def __str__(self): return self.text def __repr__(self): - return '' % (self.text,) + return '<%s %r>' % (self.__class__.__name__, self.text) def __hash__(self): return hash(self.text) def __le__(self, other): diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -207,8 +207,8 @@ self.headers = headers def __repr__(self): return ( - "" % - (self.url, self.errcode, self.errmsg) + "<%s for %s: %s %s>" % + (self.__class__.__name__, self.url, self.errcode, self.errmsg) ) ## @@ -236,7 +236,8 @@ self.faultCode = faultCode self.faultString = faultString def __repr__(self): - return "" % (self.faultCode, self.faultString) + return "<%s %s: %r>" % (self.__class__.__name__, + self.faultCode, self.faultString) # -------------------------------------------------------------------- # Special values @@ -354,7 +355,7 @@ return self.value def __repr__(self): - return "" % (self.value, id(self)) + return "<%s %r at %#x>" % (self.__class__.__name__, self.value, id(self)) def decode(self, data): self.value = str(data).strip() @@ -846,7 +847,7 @@ self.__call_list = [] def __repr__(self): - return "" % id(self) + return "<%s at %#x>" % (self.__class__.__name__, id(self)) __str__ = __repr__ @@ -1426,8 +1427,8 @@ def __repr__(self): return ( - "" % - (self.__host, self.__handler) + "<%s for %s%s>" % + (self.__class__.__name__, self.__host, self.__handler) ) __str__ = __repr__ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Issue #22033: Reprs of most Python implemened classes now contain actual + class name instead of hardcoded one. + - Issue #21947: The dis module can now disassemble generator-iterator objects based on their gi_code attribute. Patch by Clement Rouault. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 22:40:27 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 22:40:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3hKj3H4MGjz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/ed8672e19db3 changeset: 91871:ed8672e19db3 branch: 3.4 parent: 91868:1c35cefd25b7 user: Victor Stinner date: Fri Jul 25 22:36:05 2014 +0200 summary: asyncio: sync with Tulip * Tulip issue #196: IocpProactor._poll() clears the reference to the overlapped operation when the operation is done. It would be better to clear the reference in a new _OverlappedFuture.set_result() method, but it cannot be done yet because of a weird bug. * BaseSelectorEventLoop._write_to_self() now logs errors in debug mode. files: Lib/asyncio/selector_events.py | 5 ++++- Lib/asyncio/windows_events.py | 5 +++++ 2 files changed, 9 insertions(+), 1 deletions(-) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -120,7 +120,10 @@ try: csock.send(b'\0') except OSError: - pass + if self._debug: + logger.debug("Fail to write a null byte into the " + "self-pipe socket", + exc_info=True) def _start_serving(self, protocol_factory, sock, sslcontext=None, server=None): diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -489,6 +489,11 @@ else: f.set_result(value) self._results.append(f) + # FIXME, tulip issue #196: add _OverlappedFuture.set_result() + # method to clear the refrence, don't do it here (f may + # by a _WaitHandleFuture). Problem: clearing the reference + # in _register() if ov.pedding is False leads to weird bugs. + f._ov = None ms = 0 def _stop_serving(self, obj): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Jul 25 22:40:28 2014 From: python-checkins at python.org (victor.stinner) Date: Fri, 25 Jul 2014 22:40:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3hKj3J61gbz7Ljs@mail.python.org> http://hg.python.org/cpython/rev/0f7b602d1b1f changeset: 91872:0f7b602d1b1f parent: 91870:42276ad3acef parent: 91871:ed8672e19db3 user: Victor Stinner date: Fri Jul 25 22:40:12 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip * Tulip issue #196: IocpProactor._poll() clears the reference to the overlapped operation when the operation is done. It would be better to clear the reference in a new _OverlappedFuture.set_result() method, but it cannot be done yet because of a weird bug. * BaseSelectorEventLoop._write_to_self() now logs errors in debug mode. files: Lib/asyncio/selector_events.py | 5 ++++- Lib/asyncio/windows_events.py | 5 +++++ 2 files changed, 9 insertions(+), 1 deletions(-) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -120,7 +120,10 @@ try: csock.send(b'\0') except OSError: - pass + if self._debug: + logger.debug("Fail to write a null byte into the " + "self-pipe socket", + exc_info=True) def _start_serving(self, protocol_factory, sock, sslcontext=None, server=None): diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -489,6 +489,11 @@ else: f.set_result(value) self._results.append(f) + # FIXME, tulip issue #196: add _OverlappedFuture.set_result() + # method to clear the refrence, don't do it here (f may + # by a _WaitHandleFuture). Problem: clearing the reference + # in _register() if ov.pedding is False leads to weird bugs. + f._ov = None ms = 0 def _stop_serving(self, obj): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 00:00:37 2014 From: python-checkins at python.org (raymond.hettinger) Date: Sat, 26 Jul 2014 00:00:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDQ0?= =?utf-8?q?=3A_Fixed_premature_DECREF_in_call=5Ftzinfo=5Fmethod=2E?= Message-ID: <3hKkqn4mBsz7LjM@mail.python.org> http://hg.python.org/cpython/rev/01c6d2893092 changeset: 91873:01c6d2893092 branch: 3.4 parent: 91871:ed8672e19db3 user: Raymond Hettinger date: Fri Jul 25 14:59:48 2014 -0700 summary: Issue #22044: Fixed premature DECREF in call_tzinfo_method. files: Lib/test/datetimetester.py | 11 +++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_datetimemodule.c | 14 +++++++------- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -5,6 +5,7 @@ import sys import pickle +import random import unittest from operator import lt, le, gt, ge, eq, ne, truediv, floordiv, mod @@ -76,8 +77,18 @@ def __init__(self, offset=None, name=None, dstoffset=None): FixedOffset.__init__(self, offset, name, dstoffset) +class _TZInfo(tzinfo): + def utcoffset(self, datetime_module): + return random.random() + class TestTZInfo(unittest.TestCase): + def test_refcnt_crash_bug_22044(self): + tz1 = _TZInfo() + dt1 = datetime(2014, 7, 21, 11, 32, 3, 0, tz1) + with self.assertRaises(TypeError): + dt1.utcoffset() + def test_non_abstractness(self): # In order to allow subclasses to get pickled, the C implementation # wasn't able to get away with having __init__ raise diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -410,6 +410,7 @@ Dan Finnie Nils Fischbeck Frederik Fix +Tom Flanagan Matt Fleming Hern?n Mart?nez Foffani Artem Fokin diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,6 +30,9 @@ - Issue #16133: The asynchat.async_chat.handle_read() method now ignores BlockingIOError exceptions. +- Issue #22044: Fixed premature DECREF in call_tzinfo_method. + Patch by Tom Flanagan. + - Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -897,11 +897,11 @@ } } else { - Py_DECREF(offset); PyErr_Format(PyExc_TypeError, "tzinfo.%s() must return None or " "timedelta, not '%.200s'", name, Py_TYPE(offset)->tp_name); + Py_DECREF(offset); return NULL; } @@ -2153,7 +2153,7 @@ * is odd. Note that x is odd when it's last bit is 1. The * code below uses bitwise and operation to check the last * bit. */ - temp = PyNumber_And(x, one); /* temp <- x & 1 */ + temp = PyNumber_And(x, one); /* temp <- x & 1 */ if (temp == NULL) { Py_DECREF(x); goto Done; @@ -3224,10 +3224,10 @@ if (op != Py_EQ && op != Py_NE) Py_RETURN_NOTIMPLEMENTED; if (Py_TYPE(other) != &PyDateTime_TimeZoneType) { - if (op == Py_EQ) - Py_RETURN_FALSE; - else - Py_RETURN_TRUE; + if (op == Py_EQ) + Py_RETURN_FALSE; + else + Py_RETURN_TRUE; } return delta_richcompare(self->offset, other->offset, op); } @@ -4814,7 +4814,7 @@ static char *keywords[] = {"tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:astimezone", keywords, - &tzinfo)) + &tzinfo)) return NULL; if (check_tzinfo_subclass(tzinfo) == -1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 00:00:38 2014 From: python-checkins at python.org (raymond.hettinger) Date: Sat, 26 Jul 2014 00:00:38 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_merge?= Message-ID: <3hKkqp6gGnz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/3b669b0bcd6f changeset: 91874:3b669b0bcd6f parent: 91872:0f7b602d1b1f parent: 91873:01c6d2893092 user: Raymond Hettinger date: Fri Jul 25 15:00:30 2014 -0700 summary: merge files: Lib/test/datetimetester.py | 11 +++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_datetimemodule.c | 14 +++++++------- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -5,6 +5,7 @@ import sys import pickle +import random import unittest from operator import lt, le, gt, ge, eq, ne, truediv, floordiv, mod @@ -76,8 +77,18 @@ def __init__(self, offset=None, name=None, dstoffset=None): FixedOffset.__init__(self, offset, name, dstoffset) +class _TZInfo(tzinfo): + def utcoffset(self, datetime_module): + return random.random() + class TestTZInfo(unittest.TestCase): + def test_refcnt_crash_bug_22044(self): + tz1 = _TZInfo() + dt1 = datetime(2014, 7, 21, 11, 32, 3, 0, tz1) + with self.assertRaises(TypeError): + dt1.utcoffset() + def test_non_abstractness(self): # In order to allow subclasses to get pickled, the C implementation # wasn't able to get away with having __init__ raise diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -411,6 +411,7 @@ Dan Finnie Nils Fischbeck Frederik Fix +Tom Flanagan Matt Fleming Hern?n Mart?nez Foffani Artem Fokin diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -117,6 +117,9 @@ - Issue #16133: The asynchat.async_chat.handle_read() method now ignores BlockingIOError exceptions. +- Issue #22044: Fixed premature DECREF in call_tzinfo_method. + Patch by Tom Flanagan. + - Issue #19884: readline: Disable the meta modifier key if stdout is not a terminal to not write the ANSI sequence "\033[1034h" into stdout. This sequence is used on some terminal (ex: TERM=xterm-256color") to enable diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -897,11 +897,11 @@ } } else { - Py_DECREF(offset); PyErr_Format(PyExc_TypeError, "tzinfo.%s() must return None or " "timedelta, not '%.200s'", name, Py_TYPE(offset)->tp_name); + Py_DECREF(offset); return NULL; } @@ -2153,7 +2153,7 @@ * is odd. Note that x is odd when it's last bit is 1. The * code below uses bitwise and operation to check the last * bit. */ - temp = PyNumber_And(x, one); /* temp <- x & 1 */ + temp = PyNumber_And(x, one); /* temp <- x & 1 */ if (temp == NULL) { Py_DECREF(x); goto Done; @@ -3224,10 +3224,10 @@ if (op != Py_EQ && op != Py_NE) Py_RETURN_NOTIMPLEMENTED; if (Py_TYPE(other) != &PyDateTime_TimeZoneType) { - if (op == Py_EQ) - Py_RETURN_FALSE; - else - Py_RETURN_TRUE; + if (op == Py_EQ) + Py_RETURN_FALSE; + else + Py_RETURN_TRUE; } return delta_richcompare(self->offset, other->offset, op); } @@ -4778,7 +4778,7 @@ static char *keywords[] = {"tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:astimezone", keywords, - &tzinfo)) + &tzinfo)) return NULL; if (check_tzinfo_subclass(tzinfo) == -1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 00:59:23 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 26 Jul 2014 00:59:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Tulip_issue_19?= =?utf-8?q?6=3A_=5FOverlappedFuture=2Eset=5Fresult=28=29_now_clears_its_re?= =?utf-8?q?ference_to_the?= Message-ID: <3hKm7b5nKtz7LjV@mail.python.org> http://hg.python.org/cpython/rev/b95cf0f1bb77 changeset: 91875:b95cf0f1bb77 branch: 3.4 parent: 91873:01c6d2893092 user: Victor Stinner date: Sat Jul 26 00:58:34 2014 +0200 summary: Tulip issue 196: _OverlappedFuture.set_result() now clears its reference to the overlapped object. IocpProactor._poll() now also ignores false alarms: GetQueuedCompletionStatus() returns the overlapped but it is still pending. files: Lib/asyncio/windows_events.py | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -77,6 +77,10 @@ super().set_exception(exception) self._cancel_overlapped() + def set_result(self, result): + super().set_result(result) + self._ov = None + class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" @@ -478,6 +482,13 @@ _winapi.CloseHandle(key) ms = 0 continue + + if ov.pending: + # False alarm: the overlapped operation is not completed. + # FIXME: why do we get false alarms? + self._cache[address] = (f, ov, obj, callback) + continue + if obj in self._stopped_serving: f.cancel() elif not f.cancelled(): @@ -489,11 +500,6 @@ else: f.set_result(value) self._results.append(f) - # FIXME, tulip issue #196: add _OverlappedFuture.set_result() - # method to clear the refrence, don't do it here (f may - # by a _WaitHandleFuture). Problem: clearing the reference - # in _register() if ov.pedding is False leads to weird bugs. - f._ov = None ms = 0 def _stop_serving(self, obj): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 00:59:25 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 26 Jul 2014 00:59:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Tulip_issue_196=3A_=5FOverlappedFuture?= =?utf-8?q?=2Eset=5Fresult=28=29_now_clears_its?= Message-ID: <3hKm7d0Jb9z7Ljw@mail.python.org> http://hg.python.org/cpython/rev/253c31930b32 changeset: 91876:253c31930b32 parent: 91874:3b669b0bcd6f parent: 91875:b95cf0f1bb77 user: Victor Stinner date: Sat Jul 26 00:58:55 2014 +0200 summary: (Merge 3.4) Tulip issue 196: _OverlappedFuture.set_result() now clears its reference to the overlapped object. IocpProactor._poll() now also ignores false alarms: GetQueuedCompletionStatus() returns the overlapped but it is still pending. files: Lib/asyncio/windows_events.py | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -77,6 +77,10 @@ super().set_exception(exception) self._cancel_overlapped() + def set_result(self, result): + super().set_result(result) + self._ov = None + class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" @@ -478,6 +482,13 @@ _winapi.CloseHandle(key) ms = 0 continue + + if ov.pending: + # False alarm: the overlapped operation is not completed. + # FIXME: why do we get false alarms? + self._cache[address] = (f, ov, obj, callback) + continue + if obj in self._stopped_serving: f.cancel() elif not f.cancelled(): @@ -489,11 +500,6 @@ else: f.set_result(value) self._results.append(f) - # FIXME, tulip issue #196: add _OverlappedFuture.set_result() - # method to clear the refrence, don't do it here (f may - # by a _WaitHandleFuture). Problem: clearing the reference - # in _register() if ov.pedding is False leads to weird bugs. - f._ov = None ms = 0 def _stop_serving(self, obj): -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Jul 26 10:31:25 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 26 Jul 2014 10:31:25 +0200 Subject: [Python-checkins] Daily reference leaks (253c31930b32): sum=71 Message-ID: results for 253c31930b32 on branch "default" -------------------------------------------- test_asyncio leaked [-53, 106, 0] references, sum=53 test_asyncio leaked [-15, 32, 0] memory blocks, sum=17 test_collections leaked [0, -2, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [0, -2, 2] references, sum=0 test_site leaked [0, -2, 2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogqWUCM0', '-x'] From python-checkins at python.org Sat Jul 26 14:45:37 2014 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 26 Jul 2014 14:45:37 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5ODc1?= =?utf-8?q?=3A_Fix_random_test=5Fgetsockaddrarg=28=29_failure=2E?= Message-ID: <3hL6Sx5NGFz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/57e3c4ae37ea changeset: 91877:57e3c4ae37ea branch: 2.7 parent: 91867:cb2e1b3a395f user: Charles-Fran?ois Natali date: Sat Jul 26 13:44:50 2014 +0100 summary: Issue #19875: Fix random test_getsockaddrarg() failure. files: Lib/test/test_socket.py | 26 +++++++++++++++++--------- 1 files changed, 17 insertions(+), 9 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 @@ -2,6 +2,7 @@ from test import test_support import errno +import itertools import socket import select import time @@ -600,17 +601,24 @@ sock.close() def test_getsockaddrarg(self): - host = '0.0.0.0' - port = self._get_unused_port(bind_address=host) + sock = socket.socket() + self.addCleanup(sock.close) + port = test_support.find_unused_port() big_port = port + 65536 neg_port = port - 65536 - sock = socket.socket() - try: - self.assertRaises(OverflowError, sock.bind, (host, big_port)) - self.assertRaises(OverflowError, sock.bind, (host, neg_port)) - sock.bind((host, port)) - finally: - sock.close() + self.assertRaises(OverflowError, sock.bind, (HOST, big_port)) + self.assertRaises(OverflowError, sock.bind, (HOST, neg_port)) + # Since find_unused_port() is inherently subject to race conditions, we + # call it a couple times if necessary. + for i in itertools.count(): + port = test_support.find_unused_port() + try: + sock.bind((HOST, port)) + except OSError as e: + if e.errno != errno.EADDRINUSE or i == 5: + raise + else: + break @unittest.skipUnless(os.name == "nt", "Windows specific") def test_sock_ioctl(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 14:54:05 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 26 Jul 2014 14:54:05 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogRml4IHJlcHIoX3Nv?= =?utf-8?q?cket=2Esocket=29_on_Windows_64-bit=3A_don=27t_fail_with_Overflo?= =?utf-8?q?wError?= Message-ID: <3hL6fj62Xtz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/2a4a3d3c47a8 changeset: 91878:2a4a3d3c47a8 branch: 3.4 parent: 91875:b95cf0f1bb77 user: Victor Stinner date: Sat Jul 26 14:36:55 2014 +0200 summary: Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. repr(socket.socket) already works fine. files: Lib/test/test_socket.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ Modules/socketmodule.c | 11 +++++++++-- 3 files changed, 30 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 @@ -38,6 +38,11 @@ except ImportError: thread = None threading = None +try: + import _socket +except ImportError: + _socket = None + def _have_socket_can(): """Check whether CAN sockets are supported on this host.""" @@ -658,6 +663,19 @@ self.assertIn('[closed]', repr(s)) self.assertNotIn('laddr', repr(s)) + @unittest.skipUnless(_socket is not None, 'need _socket module') + def test_csocket_repr(self): + s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) + try: + expected = ('' + % (s.fileno(), s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + finally: + s.close() + expected = ('' + % (s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + def test_weakref(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) p = proxy(s) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError + on closed socket. repr(socket.socket) already works fine. + - Issue #16133: The asynchat.async_chat.handle_read() method now ignores BlockingIOError exceptions. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3868,8 +3868,13 @@ static PyObject * sock_repr(PySocketSockObject *s) { + long sock_fd; + /* On Windows, this test is needed because SOCKET_T is unsigned */ + if (s->sock_fd == INVALID_SOCKET) { + sock_fd = -1; + } #if SIZEOF_SOCKET_T > SIZEOF_LONG - if (s->sock_fd > LONG_MAX) { + else if (s->sock_fd > LONG_MAX) { /* this can occur on Win64, and actually there is a special ugly printf formatter for decimal pointer length integer printing, only bother if necessary*/ @@ -3879,9 +3884,11 @@ return NULL; } #endif + else + sock_fd = (long)s->sock_fd; return PyUnicode_FromFormat( "", - (long)s->sock_fd, s->sock_family, + sock_fd, s->sock_family, s->sock_type, s->sock_proto); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 14:54:07 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 26 Jul 2014 14:54:07 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgRml4IHJlcHIoX3NvY2tldC5zb2NrZXQpIG9uIFdp?= =?utf-8?q?ndows_64-bit=3A_don=27t_fail_with?= Message-ID: <3hL6fl0WVWz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/68ab2fd81336 changeset: 91879:68ab2fd81336 parent: 91876:253c31930b32 parent: 91878:2a4a3d3c47a8 user: Victor Stinner date: Sat Jul 26 14:37:57 2014 +0200 summary: (Merge 3.4) Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. repr(socket.socket) already works fine. files: Lib/test/test_socket.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ Modules/socketmodule.c | 11 +++++++++-- 3 files changed, 30 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 @@ -40,6 +40,11 @@ except ImportError: thread = None threading = None +try: + import _socket +except ImportError: + _socket = None + def _have_socket_can(): """Check whether CAN sockets are supported on this host.""" @@ -660,6 +665,19 @@ self.assertIn('[closed]', repr(s)) self.assertNotIn('laddr', repr(s)) + @unittest.skipUnless(_socket is not None, 'need _socket module') + def test_csocket_repr(self): + s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) + try: + expected = ('' + % (s.fileno(), s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + finally: + s.close() + expected = ('' + % (s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + def test_weakref(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) p = proxy(s) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -108,6 +108,9 @@ Library ------- +- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError + on closed socket. repr(socket.socket) already works fine. + - Issue #22033: Reprs of most Python implemened classes now contain actual class name instead of hardcoded one. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3869,8 +3869,13 @@ static PyObject * sock_repr(PySocketSockObject *s) { + long sock_fd; + /* On Windows, this test is needed because SOCKET_T is unsigned */ + if (s->sock_fd == INVALID_SOCKET) { + sock_fd = -1; + } #if SIZEOF_SOCKET_T > SIZEOF_LONG - if (s->sock_fd > LONG_MAX) { + else if (s->sock_fd > LONG_MAX) { /* this can occur on Win64, and actually there is a special ugly printf formatter for decimal pointer length integer printing, only bother if necessary*/ @@ -3880,9 +3885,11 @@ return NULL; } #endif + else + sock_fd = (long)s->sock_fd; return PyUnicode_FromFormat( "", - (long)s->sock_fd, s->sock_family, + sock_fd, s->sock_family, s->sock_type, s->sock_proto); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 14:54:54 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 26 Jul 2014 14:54:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_socketmodule?= =?utf-8?q?=2Ec=3A_backport_INVALID=5FSOCKET_from_Python_3=2E5_to_simplify?= =?utf-8?q?_the_code?= Message-ID: <3hL6gf2TbHz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/a86c273a1270 changeset: 91880:a86c273a1270 branch: 2.7 parent: 91877:57e3c4ae37ea user: Victor Stinner date: Sat Jul 26 14:47:56 2014 +0200 summary: socketmodule.c: backport INVALID_SOCKET from Python 3.5 to simplify the code files: Modules/socketmodule.c | 19 +++++-------------- 1 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -94,6 +94,10 @@ #include "structmember.h" #include "timefuncs.h" +#ifndef INVALID_SOCKET /* MS defines this */ +#define INVALID_SOCKET (-1) +#endif + #undef MAX #define MAX(x, y) ((x) < (y) ? (y) : (x)) @@ -1705,11 +1709,7 @@ return NULL; memset(&addrbuf, 0, addrlen); -#ifdef MS_WINDOWS newfd = INVALID_SOCKET; -#else - newfd = -1; -#endif if (!IS_SELECTABLE(s)) return select_error(); @@ -1727,11 +1727,7 @@ } END_SELECT_LOOP(s) -#ifdef MS_WINDOWS if (newfd == INVALID_SOCKET) -#else - if (newfd < 0) -#endif return s->errorhandler(); /* Create the new object with unspecified family, @@ -3185,12 +3181,7 @@ fd = socket(family, type, proto); Py_END_ALLOW_THREADS -#ifdef MS_WINDOWS - if (fd == INVALID_SOCKET) -#else - if (fd < 0) -#endif - { + if (fd == INVALID_SOCKET) { set_error(); return -1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 14:54:55 2014 From: python-checkins at python.org (victor.stinner) Date: Sat, 26 Jul 2014 14:54:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogRml4IHJlcHIoX3Nv?= =?utf-8?q?cket=2Esocket=29_on_Windows_64-bit=3A_don=27t_fail_with_Overflo?= =?utf-8?q?wError?= Message-ID: <3hL6gg4QPrz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/04c916a1e82f changeset: 91881:04c916a1e82f branch: 2.7 user: Victor Stinner date: Sat Jul 26 14:52:55 2014 +0200 summary: Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. files: Lib/test/test_socket.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ Modules/socketmodule.c | 11 +++++++++-- 3 files changed, 30 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 @@ -15,6 +15,11 @@ from weakref import proxy import signal import math +try: + import _socket +except ImportError: + _socket = None + def try_address(host, port=0, family=socket.AF_INET): """Try to bind a socket on the given host:port and return True @@ -244,6 +249,19 @@ class GeneralModuleTests(unittest.TestCase): + @unittest.skipUnless(_socket is not None, 'need _socket module') + def test_csocket_repr(self): + s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM) + try: + expected = ('' + % (s.fileno(), s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + finally: + s.close() + expected = ('' + % (s.family, s.type, s.proto)) + self.assertEqual(repr(s), expected) + def test_weakref(self): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) p = proxy(s) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError + on closed socket. + - Issue #16133: The asynchat.async_chat.handle_read() method now ignores socket.error() exceptions with blocking I/O errors: EAGAIN, EALREADY, EINPROGRESS, or EWOULDBLOCK. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -3123,8 +3123,13 @@ sock_repr(PySocketSockObject *s) { char buf[512]; + long sock_fd; + /* On Windows, this test is needed because SOCKET_T is unsigned */ + if (s->sock_fd == INVALID_SOCKET) { + sock_fd = -1; + } #if SIZEOF_SOCKET_T > SIZEOF_LONG - if (s->sock_fd > LONG_MAX) { + else if (s->sock_fd > LONG_MAX) { /* this can occur on Win64, and actually there is a special ugly printf formatter for decimal pointer length integer printing, only bother if necessary*/ @@ -3134,10 +3139,12 @@ return NULL; } #endif + else + sock_fd = (long)s->sock_fd; PyOS_snprintf( buf, sizeof(buf), "", - (long)s->sock_fd, s->sock_family, + sock_fd, s->sock_family, s->sock_type, s->sock_proto); return PyString_FromString(buf); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 15:25:17 2014 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 26 Jul 2014 15:25:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_slotdefs_is_no_longer_sort?= =?utf-8?b?ZWQu?= Message-ID: <3hL7Lj32Gcz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/c5d8fae2b125 changeset: 91882:c5d8fae2b125 parent: 91879:68ab2fd81336 user: Martin v. L?wis date: Sat Jul 26 15:25:04 2014 +0200 summary: slotdefs is no longer sorted. files: Objects/typeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6509,7 +6509,7 @@ } /* Initialize the slotdefs table by adding interned string objects for the - names and sorting the entries. */ + names. */ static void init_slotdefs(void) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 16:44:20 2014 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 26 Jul 2014 16:44:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322082=3A_Clear_in?= =?utf-8?q?terned_strings_in_slotdefs=2E?= Message-ID: <3hL95w4sgwz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/c55300337932 changeset: 91883:c55300337932 user: Martin v. L?wis date: Sat Jul 26 16:44:07 2014 +0200 summary: Issue #22082: Clear interned strings in slotdefs. files: Misc/NEWS | 2 ++ Objects/typeobject.c | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #22082: Clear interned strings in slotdefs. + - Upgrade Unicode database to Unicode 7.0.0. - Issue #21897: Fix a crash with the f_locals attribute with closure diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -54,6 +54,9 @@ static PyObject * slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); +static void +clear_slotdefs(); + /* * finds the beginning of the docstring's introspection signature. * if present, returns a pointer pointing to the first '('. @@ -177,6 +180,7 @@ _PyType_Fini(void) { PyType_ClearCache(); + clear_slotdefs(); } void @@ -6508,15 +6512,15 @@ return 0; } +static int slotdefs_initialized = 0; /* Initialize the slotdefs table by adding interned string objects for the names. */ static void init_slotdefs(void) { slotdef *p; - static int initialized = 0; - - if (initialized) + + if (slotdefs_initialized) return; for (p = slotdefs; p->name; p++) { /* Slots must be ordered by their offset in the PyHeapTypeObject. */ @@ -6525,7 +6529,17 @@ if (!p->name_strobj) Py_FatalError("Out of memory interning slotdef names"); } - initialized = 1; + slotdefs_initialized = 1; +} + +/* Undo init_slotdefs, releasing the interned strings. */ +static void clear_slotdefs() +{ + slotdef *p; + for (p = slotdefs; p->name; p++) { + Py_CLEAR(p->name_strobj); + } + slotdefs_initialized = 0; } /* Update the slots after assignment to a class (type) attribute. */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 16:55:27 2014 From: python-checkins at python.org (andrew.svetlov) Date: Sat, 26 Jul 2014 16:55:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Accept_optiona?= =?utf-8?q?l_lock_object_in_Condition_ctor_=28tulip_issue_=23198=29?= Message-ID: <3hL9Ll0MHpz7LkD@mail.python.org> http://hg.python.org/cpython/rev/922ba40a6d3c changeset: 91884:922ba40a6d3c branch: 3.4 parent: 91878:2a4a3d3c47a8 user: Andrew Svetlov date: Sat Jul 26 17:54:34 2014 +0300 summary: Accept optional lock object in Condition ctor (tulip issue #198) files: Lib/asyncio/locks.py | 9 ++++++--- Lib/test/test_asyncio/test_locks.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -255,14 +255,17 @@ A new Lock object is created and used as the underlying lock. """ - def __init__(self, *, loop=None): + def __init__(self, lock=None, *, loop=None): if loop is not None: self._loop = loop else: self._loop = events.get_event_loop() - # Lock as an attribute as in threading.Condition. - lock = Lock(loop=self._loop) + if lock is None: + lock = Lock(loop=self._loop) + elif lock._loop is not self._loop: + raise ValueError("loop argument must agree with lock") + self._lock = lock # Export the lock's locked(), acquire() and release() methods. self.locked = lock.locked diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -656,6 +656,18 @@ self.assertFalse(cond.locked()) + def test_explicit_lock(self): + lock = asyncio.Lock(loop=self.loop) + cond = asyncio.Condition(lock, loop=self.loop) + + self.assertIs(lock._loop, cond._loop) + + def test_ambiguous_loops(self): + loop = self.new_test_loop() + lock = asyncio.Lock(loop=self.loop) + with self.assertRaises(ValueError): + asyncio.Condition(lock, loop=loop) + class SemaphoreTests(test_utils.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 16:55:28 2014 From: python-checkins at python.org (andrew.svetlov) Date: Sat, 26 Jul 2014 16:55:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Accept_optional_lock_object_in_Condition_ctor_=28tulip_i?= =?utf-8?q?ssue_=23198=29?= Message-ID: <3hL9Lm1l5Zz7LkM@mail.python.org> http://hg.python.org/cpython/rev/a0ae1ac69925 changeset: 91885:a0ae1ac69925 parent: 91883:c55300337932 parent: 91884:922ba40a6d3c user: Andrew Svetlov date: Sat Jul 26 17:54:56 2014 +0300 summary: Accept optional lock object in Condition ctor (tulip issue #198) files: Lib/asyncio/locks.py | 9 ++++++--- Lib/test/test_asyncio/test_locks.py | 12 ++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -255,14 +255,17 @@ A new Lock object is created and used as the underlying lock. """ - def __init__(self, *, loop=None): + def __init__(self, lock=None, *, loop=None): if loop is not None: self._loop = loop else: self._loop = events.get_event_loop() - # Lock as an attribute as in threading.Condition. - lock = Lock(loop=self._loop) + if lock is None: + lock = Lock(loop=self._loop) + elif lock._loop is not self._loop: + raise ValueError("loop argument must agree with lock") + self._lock = lock # Export the lock's locked(), acquire() and release() methods. self.locked = lock.locked diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -656,6 +656,18 @@ self.assertFalse(cond.locked()) + def test_explicit_lock(self): + lock = asyncio.Lock(loop=self.loop) + cond = asyncio.Condition(lock, loop=self.loop) + + self.assertIs(lock._loop, cond._loop) + + def test_ambiguous_loops(self): + loop = self.new_test_loop() + lock = asyncio.Lock(loop=self.loop) + with self.assertRaises(ValueError): + asyncio.Condition(lock, loop=loop) + class SemaphoreTests(test_utils.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 17:04:15 2014 From: python-checkins at python.org (brett.cannon) Date: Sat, 26 Jul 2014 17:04:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?devguide=3A_Note_Darjus_Loktevic=27s_?= =?utf-8?q?commit_privs?= Message-ID: <3hL9Xv3C2Tz7Lk2@mail.python.org> http://hg.python.org/devguide/rev/ed013d131832 changeset: 709:ed013d131832 user: Brett Cannon date: Sat Jul 26 11:04:13 2014 -0400 summary: Note Darjus Loktevic's commit privs 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 @@ -25,6 +25,9 @@ Permissions History ------------------- +- Darjus Loktevic was given push privileges on July 26, 2014 by Brett Cannon, + on the recommendation of Jim Baker for Jython development. + - Berker Peksa? was given push privileges on June 26, 2014 by Benjamin Peterson, on the recommendation of R. David Murray. -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sat Jul 26 17:18:15 2014 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 26 Jul 2014 17:18:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDc0?= =?utf-8?q?=3A_Fix_Lib/test/make=5Fssl=5Fcerts=2Epy?= Message-ID: <3hL9s32FZqz7Ljx@mail.python.org> http://hg.python.org/cpython/rev/83628d9e1035 changeset: 91886:83628d9e1035 branch: 3.4 parent: 91884:922ba40a6d3c user: Antoine Pitrou date: Sat Jul 26 11:15:52 2014 -0400 summary: Issue #22074: Fix Lib/test/make_ssl_certs.py files: Lib/test/make_ssl_certs.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/make_ssl_certs.py b/Lib/test/make_ssl_certs.py --- a/Lib/test/make_ssl_certs.py +++ b/Lib/test/make_ssl_certs.py @@ -115,7 +115,7 @@ with open(os.path.join('cadir','index.txt'),'a+') as f: pass # empty file with open(os.path.join('cadir','crl.txt'),'a+') as f: - r.write("00") + f.write("00") with open(os.path.join('cadir','index.txt.attr'),'w+') as f: f.write('unique_subject = no') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 17:18:16 2014 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 26 Jul 2014 17:18:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2322074=3A_Fix_Lib/test/make=5Fssl=5Fcerts=2Epy?= Message-ID: <3hL9s43fdCz7LkP@mail.python.org> http://hg.python.org/cpython/rev/17f46a7b1125 changeset: 91887:17f46a7b1125 parent: 91885:a0ae1ac69925 parent: 91886:83628d9e1035 user: Antoine Pitrou date: Sat Jul 26 11:18:05 2014 -0400 summary: Issue #22074: Fix Lib/test/make_ssl_certs.py files: Lib/test/make_ssl_certs.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/make_ssl_certs.py b/Lib/test/make_ssl_certs.py --- a/Lib/test/make_ssl_certs.py +++ b/Lib/test/make_ssl_certs.py @@ -115,7 +115,7 @@ with open(os.path.join('cadir','index.txt'),'a+') as f: pass # empty file with open(os.path.join('cadir','crl.txt'),'a+') as f: - r.write("00") + f.write("00") with open(os.path.join('cadir','index.txt.attr'),'w+') as f: f.write('unique_subject = no') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 18:53:50 2014 From: python-checkins at python.org (andrew.svetlov) Date: Sat, 26 Jul 2014 18:53:50 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Document_lock_?= =?utf-8?q?parameter_for_asyncio=2ECondition=28=29?= Message-ID: <3hLCzL0bqmz7Lk2@mail.python.org> http://hg.python.org/cpython/rev/1e047b8f68cd changeset: 91888:1e047b8f68cd branch: 3.4 parent: 91886:83628d9e1035 user: Andrew Svetlov date: Sat Jul 26 19:50:37 2014 +0300 summary: Document lock parameter for asyncio.Condition() files: Doc/library/asyncio-sync.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -130,7 +130,7 @@ Condition ^^^^^^^^^ -.. class:: Condition(\*, loop=None) +.. class:: Condition(lock=None, \*, loop=None) A Condition implementation, asynchronous equivalent to :class:`threading.Condition`. @@ -139,7 +139,9 @@ allows one or more coroutines to wait until they are notified by another coroutine. - A new :class:`Lock` object is created and used as the underlying lock. + If the *lock* argument is given and not ``None``, it must be a :class:`Lock` + object, and it is used as the underlying lock. Otherwise, + a new :class:`Lock` object is created and used as the underlying lock. .. method:: acquire() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Jul 26 18:53:51 2014 From: python-checkins at python.org (andrew.svetlov) Date: Sat, 26 Jul 2014 18:53:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Document_lock_parameter_for_asyncio=2ECondition=28=29?= Message-ID: <3hLCzM2GH6z7LkZ@mail.python.org> http://hg.python.org/cpython/rev/c26e6beb2e35 changeset: 91889:c26e6beb2e35 parent: 91887:17f46a7b1125 parent: 91888:1e047b8f68cd user: Andrew Svetlov date: Sat Jul 26 19:53:38 2014 +0300 summary: Document lock parameter for asyncio.Condition() files: Doc/library/asyncio-sync.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -130,7 +130,7 @@ Condition ^^^^^^^^^ -.. class:: Condition(\*, loop=None) +.. class:: Condition(lock=None, \*, loop=None) A Condition implementation, asynchronous equivalent to :class:`threading.Condition`. @@ -139,7 +139,9 @@ allows one or more coroutines to wait until they are notified by another coroutine. - A new :class:`Lock` object is created and used as the underlying lock. + If the *lock* argument is given and not ``None``, it must be a :class:`Lock` + object, and it is used as the underlying lock. Otherwise, + a new :class:`Lock` object is created and used as the underlying lock. .. method:: acquire() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 01:40:59 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 27 Jul 2014 01:40:59 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Reduce__unnece?= =?utf-8?q?ssary_2=2E7_versus_3=2E4+_differences_in_idlelib/configDialog?= =?utf-8?q?=2Epy=2E?= Message-ID: <3hLP173yzSz7LjP@mail.python.org> http://hg.python.org/cpython/rev/d0570cba3749 changeset: 91890:d0570cba3749 branch: 3.4 parent: 91888:1e047b8f68cd user: Terry Jan Reedy date: Sat Jul 26 19:40:16 2014 -0400 summary: Reduce unnecessary 2.7 versus 3.4+ differences in idlelib/configDialog.py. 2009-02-02 51562 (27c589f09a21) merged Mac support revisions into 3.0. 2009-03-04 52014 (dc3d24824b60) merged slightly improved version into 2.7. Change 3.4+ to match the later 2.7 patch. Buttons tested manually. files: Lib/idlelib/configDialog.py | 18 ++++++++---------- 1 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -79,28 +79,26 @@ page_names=['Fonts/Tabs','Highlighting','Keys','General']) frameActionButtons = Frame(self,pady=2) #action buttons - if macosxSupport.isAquaTk(): - # Surpress the padx and pady arguments when - # running as IDLE.app, otherwise the text - # on these buttons will not be readable. - extraKwds={} + # Changing the default padding on OSX results in unreadable + # text in the buttons + paddingArgs={} else: - extraKwds=dict(padx=6, pady=3) + paddingArgs={'padx':6, 'pady':3} # Comment out button creation and packing until implement self.Help ## self.buttonHelp = Button(frameActionButtons,text='Help', ## command=self.Help,takefocus=FALSE, -## **extraKwds) +## **paddingArgs) self.buttonOk = Button(frameActionButtons,text='Ok', command=self.Ok,takefocus=FALSE, - **extraKwds) + **paddingArgs) self.buttonApply = Button(frameActionButtons,text='Apply', command=self.Apply,takefocus=FALSE, - **extraKwds) + **paddingArgs) self.buttonCancel = Button(frameActionButtons,text='Cancel', command=self.Cancel,takefocus=FALSE, - **extraKwds) + **paddingArgs) self.CreatePageFontTab() self.CreatePageHighlight() self.CreatePageKeys() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 01:41:00 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 27 Jul 2014 01:41:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hLP185jGhz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/4afe9faeb1f9 changeset: 91891:4afe9faeb1f9 parent: 91889:c26e6beb2e35 parent: 91890:d0570cba3749 user: Terry Jan Reedy date: Sat Jul 26 19:40:31 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/configDialog.py | 18 ++++++++---------- 1 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -79,28 +79,26 @@ page_names=['Fonts/Tabs','Highlighting','Keys','General']) frameActionButtons = Frame(self,pady=2) #action buttons - if macosxSupport.isAquaTk(): - # Surpress the padx and pady arguments when - # running as IDLE.app, otherwise the text - # on these buttons will not be readable. - extraKwds={} + # Changing the default padding on OSX results in unreadable + # text in the buttons + paddingArgs={} else: - extraKwds=dict(padx=6, pady=3) + paddingArgs={'padx':6, 'pady':3} # Comment out button creation and packing until implement self.Help ## self.buttonHelp = Button(frameActionButtons,text='Help', ## command=self.Help,takefocus=FALSE, -## **extraKwds) +## **paddingArgs) self.buttonOk = Button(frameActionButtons,text='Ok', command=self.Ok,takefocus=FALSE, - **extraKwds) + **paddingArgs) self.buttonApply = Button(frameActionButtons,text='Apply', command=self.Apply,takefocus=FALSE, - **extraKwds) + **paddingArgs) self.buttonCancel = Button(frameActionButtons,text='Cancel', command=self.Cancel,takefocus=FALSE, - **extraKwds) + **paddingArgs) self.CreatePageFontTab() self.CreatePageHighlight() self.CreatePageKeys() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 09:01:53 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 27 Jul 2014 09:01:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Modernize_turt?= =?utf-8?q?ledemo_with_conditional_expressions=3B_remove_duplicate_line=2E?= Message-ID: <3hLZns4wXMz7LjM@mail.python.org> http://hg.python.org/cpython/rev/f279fb48c60a changeset: 91892:f279fb48c60a branch: 2.7 parent: 91881:04c916a1e82f user: Terry Jan Reedy date: Sun Jul 27 03:00:47 2014 -0400 summary: Modernize turtledemo with conditional expressions; remove duplicate line. files: Demo/turtle/turtleDemo.py | 25 ++++++------------------- 1 files changed, 6 insertions(+), 19 deletions(-) diff --git a/Demo/turtle/turtleDemo.py b/Demo/turtle/turtleDemo.py --- a/Demo/turtle/turtleDemo.py +++ b/Demo/turtle/turtleDemo.py @@ -144,25 +144,12 @@ def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) - self.start_btn.config(state=start) - if start==NORMAL: - self.start_btn.config(bg="#d00") - else: - self.start_btn.config(bg="#fca") - - self.stop_btn.config(state=stop) - if stop==NORMAL: - self.stop_btn.config(bg="#d00") - else: - self.stop_btn.config(bg="#fca") - self.clear_btn.config(state=clear) - - self.clear_btn.config(state=clear) - if clear==NORMAL: - self.clear_btn.config(bg="#d00") - else: - self.clear_btn.config(bg="#fca") - + self.start_btn.config(state=start, + bg="#d00" if start == NORMAL else "#fca") + self.stop_btn.config(state=stop, + bg="#d00" if stop == NORMAL else "#fca") + self.clear_btn.config(state=clear, + bg="#d00" if clear == NORMAL else"#fca") self.output_lbl.config(text=txt, fg=color) def makeLoadDemoMenu(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 09:01:54 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 27 Jul 2014 09:01:54 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Modernize_turt?= =?utf-8?q?ledemo_with_conditional_expressions=3B_remove_duplicate_line=2E?= Message-ID: <3hLZnt6NyFz7Ljb@mail.python.org> http://hg.python.org/cpython/rev/024d5655a20b changeset: 91893:024d5655a20b branch: 3.4 parent: 91890:d0570cba3749 user: Terry Jan Reedy date: Sun Jul 27 03:01:13 2014 -0400 summary: Modernize turtledemo with conditional expressions; remove duplicate line. files: Lib/turtledemo/__main__.py | 25 ++++++------------------- 1 files changed, 6 insertions(+), 19 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -127,25 +127,12 @@ def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) - self.start_btn.config(state=start) - if start == NORMAL: - self.start_btn.config(bg="#d00") - else: - self.start_btn.config(bg="#fca") - - self.stop_btn.config(state=stop) - if stop == NORMAL: - self.stop_btn.config(bg="#d00") - else: - self.stop_btn.config(bg="#fca") - self.clear_btn.config(state=clear) - - self.clear_btn.config(state=clear) - if clear == NORMAL: - self.clear_btn.config(bg="#d00") - else: - self.clear_btn.config(bg="#fca") - + self.start_btn.config(state=start, + bg="#d00" if start == NORMAL else "#fca") + self.stop_btn.config(state=stop, + bg="#d00" if stop == NORMAL else "#fca") + self.clear_btn.config(state=clear, + bg="#d00" if clear == NORMAL else"#fca") self.output_lbl.config(text=txt, fg=color) def makeLoadDemoMenu(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 09:01:56 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 27 Jul 2014 09:01:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hLZnw0w3mz7Ljm@mail.python.org> http://hg.python.org/cpython/rev/cdcadbb72241 changeset: 91894:cdcadbb72241 parent: 91891:4afe9faeb1f9 parent: 91893:024d5655a20b user: Terry Jan Reedy date: Sun Jul 27 03:01:29 2014 -0400 summary: Merge with 3.4 files: Lib/turtledemo/__main__.py | 25 ++++++------------------- 1 files changed, 6 insertions(+), 19 deletions(-) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -199,25 +199,12 @@ def configGUI(self, menu, start, stop, clear, txt="", color="blue"): self.ExamplesBtn.config(state=menu) - self.start_btn.config(state=start) - if start == NORMAL: - self.start_btn.config(bg="#d00") - else: - self.start_btn.config(bg="#fca") - - self.stop_btn.config(state=stop) - if stop == NORMAL: - self.stop_btn.config(bg="#d00") - else: - self.stop_btn.config(bg="#fca") - self.clear_btn.config(state=clear) - - self.clear_btn.config(state=clear) - if clear == NORMAL: - self.clear_btn.config(bg="#d00") - else: - self.clear_btn.config(bg="#fca") - + self.start_btn.config(state=start, + bg="#d00" if start == NORMAL else "#fca") + self.stop_btn.config(state=stop, + bg="#d00" if stop == NORMAL else "#fca") + self.clear_btn.config(state=clear, + bg="#d00" if clear == NORMAL else"#fca") self.output_lbl.config(text=txt, fg=color) def makeLoadDemoMenu(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 10:07:32 2014 From: python-checkins at python.org (terry.reedy) Date: Sun, 27 Jul 2014 10:07:32 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=282=2E7=29=3A_Reduce__unnece?= =?utf-8?q?ssary_2=2E7_versus_3=2E4+_differences_in_idlelib/configDialog?= =?utf-8?q?=2Epy=2E?= Message-ID: <3hLcFc6fxBz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/bffa0b8a16e8 changeset: 91895:bffa0b8a16e8 branch: 2.7 parent: 91892:f279fb48c60a user: Terry Jan Reedy date: Sun Jul 27 04:07:18 2014 -0400 summary: Reduce unnecessary 2.7 versus 3.4+ differences in idlelib/configDialog.py. Only change 2.7 version. Remove ".keys()" from "x in y.keys()" (leave .keys() elsewhere alone). Change "string.join" to "' '.join" (and string.join(s, ';') to ';'.join(s)). Change spacing to match 3.4 (will later make spacing changes to both). files: Lib/idlelib/configDialog.py | 57 ++++++++++++------------ 1 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -11,7 +11,6 @@ """ from Tkinter import * import tkMessageBox, tkColorChooser, tkFont -import string from idlelib.configHandler import idleConf from idlelib.dynOptionMenuWidget import DynOptionMenu @@ -209,7 +208,7 @@ (' ','normal'),('stderr','stderr'),('\n','normal')) for txTa in textAndTags: text.insert(END,txTa[0],txTa[1]) - for element in self.themeElements.keys(): + for element in self.themeElements: text.tag_bind(self.themeElements[element][0],'', lambda event,elem=element: event.widget.winfo_toplevel() .highlightTarget.set(elem)) @@ -576,7 +575,7 @@ def GetDefaultItems(self): dItems={'main':{},'highlight':{},'keys':{},'extensions':{}} - for configType in dItems.keys(): + for configType in dItems: sections=idleConf.GetSectionList('default',configType) for section in sections: dItems[configType][section]={} @@ -617,9 +616,9 @@ else: currentKeySetName=self.customKeys.get() currentBindings=idleConf.GetCurrentKeySet() - if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes + if currentKeySetName in self.changedItems['keys']: #unsaved changes keySetChanges=self.changedItems['keys'][currentKeySetName] - for event in keySetChanges.keys(): + for event in keySetChanges: currentBindings[event]=keySetChanges[event].split() currentKeySequences=currentBindings.values() newKeys=GetKeysDialog(self,'Get New Keys',bindName, @@ -668,14 +667,14 @@ prevKeySetName=self.customKeys.get() prevKeys=idleConf.GetCoreKeys(prevKeySetName) newKeys={} - for event in prevKeys.keys(): #add key set to changed items + for event in prevKeys: #add key set to changed items eventName=event[2:-2] #trim off the angle brackets - binding=string.join(prevKeys[event]) + binding=' '.join(prevKeys[event]) newKeys[eventName]=binding #handle any unsaved changes to prev key set - if prevKeySetName in self.changedItems['keys'].keys(): + if prevKeySetName in self.changedItems['keys']: keySetChanges=self.changedItems['keys'][prevKeySetName] - for event in keySetChanges.keys(): + for event in keySetChanges: newKeys[event]=keySetChanges[event] #save the new theme self.SaveNewKeySet(newKeySetName,newKeys) @@ -697,11 +696,11 @@ bindNames.sort() self.listBindings.delete(0,END) for bindName in bindNames: - key=string.join(keySet[bindName]) #make key(s) into a string + key=' '.join(keySet[bindName]) #make key(s) into a string bindName=bindName[2:-2] #trim off the angle brackets - if keySetName in self.changedItems['keys'].keys(): + if keySetName in self.changedItems['keys']: #handle any unsaved changes to this key set - if bindName in self.changedItems['keys'][keySetName].keys(): + if bindName in self.changedItems['keys'][keySetName]: key=self.changedItems['keys'][keySetName][bindName] self.listBindings.insert(END, bindName+' - '+key) if reselect: @@ -816,9 +815,9 @@ themeName=self.customTheme.get() newTheme=idleConf.GetThemeDict(themeType,themeName) #apply any of the old theme's unsaved changes to the new theme - if themeName in self.changedItems['highlight'].keys(): + if themeName in self.changedItems['highlight']: themeChanges=self.changedItems['highlight'][themeName] - for element in themeChanges.keys(): + for element in themeChanges: newTheme[element]=themeChanges[element] #save the new theme self.SaveNewTheme(newThemeName,newTheme) @@ -871,14 +870,14 @@ theme=self.builtinTheme.get() else: #a user theme theme=self.customTheme.get() - for elementTitle in self.themeElements.keys(): + for elementTitle in self.themeElements: element=self.themeElements[elementTitle][0] colours=idleConf.GetHighlight(theme,element) if element=='cursor': #cursor sample needs special painting colours['background']=idleConf.GetHighlight(theme, 'normal', fgBg='bg') #handle any unsaved changes to this theme - if theme in self.changedItems['highlight'].keys(): + if theme in self.changedItems['highlight']: themeDict=self.changedItems['highlight'][theme] if element+'-foreground' in themeDict: colours['foreground']=themeDict[element+'-foreground'] @@ -935,7 +934,7 @@ self.changedItems['main']['HelpFiles'] = {} for num in range(1,len(self.userHelpList)+1): self.AddChangedItem('main','HelpFiles',str(num), - string.join(self.userHelpList[num-1][:2],';')) + ';'.join(self.userHelpList[num-1][:2])) def LoadFontCfg(self): ##base editor font selection list @@ -944,7 +943,7 @@ for font in fonts: self.listFontName.insert(END,font) configuredFont=idleConf.GetOption('main','EditorWindow','font', - default='courier') + default='courier') lc_configuredFont = configuredFont.lower() self.fontName.set(lc_configuredFont) lc_fonts = [s.lower() for s in fonts] @@ -954,13 +953,13 @@ self.listFontName.select_set(currentFontIndex) self.listFontName.select_anchor(currentFontIndex) ##font size dropdown - fontSize=idleConf.GetOption('main','EditorWindow','font-size', - type='int', default='10') + fontSize=idleConf.GetOption('main', 'EditorWindow', 'font-size', + type='int', default='10') self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14', - '16','18','20','22'),fontSize ) + '16','18','20','22'), fontSize ) ##fontWeight self.fontBold.set(idleConf.GetOption('main','EditorWindow', - 'font-bold',default=0,type='bool')) + 'font-bold',default=0,type='bool')) ##font sample self.SetFontSample() @@ -1080,7 +1079,7 @@ """ if not idleConf.userCfg['keys'].has_section(keySetName): idleConf.userCfg['keys'].add_section(keySetName) - for event in keySet.keys(): + for event in keySet: value=keySet[event] idleConf.userCfg['keys'].SetOption(keySetName,event,value) @@ -1092,7 +1091,7 @@ """ if not idleConf.userCfg['highlight'].has_section(themeName): idleConf.userCfg['highlight'].add_section(themeName) - for element in theme.keys(): + for element in theme: value=theme[element] idleConf.userCfg['highlight'].SetOption(themeName,element,value) @@ -1107,14 +1106,14 @@ def SaveAllChangedConfigs(self): "Save configuration changes to the user config file." idleConf.userCfg['main'].Save() - for configType in self.changedItems.keys(): + for configType in self.changedItems: cfgTypeHasChanges = False - for section in self.changedItems[configType].keys(): + for section in self.changedItems[configType]: if section == 'HelpFiles': #this section gets completely replaced idleConf.userCfg['main'].remove_section('HelpFiles') cfgTypeHasChanges = True - for item in self.changedItems[configType][section].keys(): + for item in self.changedItems[configType][section]: value = self.changedItems[configType][section][item] if self.SetUserValue(configType,section,item,value): cfgTypeHasChanges = True @@ -1128,13 +1127,13 @@ def DeactivateCurrentConfig(self): #Before a config is saved, some cleanup of current #config must be done - remove the previous keybindings - winInstances=self.parent.instance_dict.keys() + winInstances=self.parent.instance_dict for instance in winInstances: instance.RemoveKeybindings() def ActivateConfigChanges(self): "Dynamically apply configuration changes" - winInstances=self.parent.instance_dict.keys() + winInstances = self.parent.instance_dict.keys() for instance in winInstances: instance.ResetColorizer() instance.ResetFont() -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Jul 27 10:34:14 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 27 Jul 2014 10:34:14 +0200 Subject: [Python-checkins] Daily reference leaks (4afe9faeb1f9): sum=273 Message-ID: results for 4afe9faeb1f9 on branch "default" -------------------------------------------- test_asyncio leaked [106, 159, -53] references, sum=212 test_asyncio leaked [29, 46, -15] memory blocks, sum=60 test_collections leaked [0, 0, -2] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 0] references, sum=0 test_site leaked [2, -2, 0] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogyjrXlJ', '-x'] From python-checkins at python.org Sun Jul 27 11:44:25 2014 From: python-checkins at python.org (ronald.oussoren) Date: Sun, 27 Jul 2014 11:44:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP-0447=3A_Start_documenting?= =?utf-8?q?_the_impact_on_introspection?= Message-ID: <3hLfPP6ZZpz7LjP@mail.python.org> http://hg.python.org/peps/rev/2280d6225328 changeset: 5508:2280d6225328 user: Ronald Oussoren date: Sun Jul 27 11:44:17 2014 +0200 summary: PEP-0447: Start documenting the impact on introspection files: pep-0447.txt | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) diff --git a/pep-0447.txt b/pep-0447.txt --- a/pep-0447.txt +++ b/pep-0447.txt @@ -283,6 +283,43 @@ that have a metaclass that overrides ``__getdescriptor__``, because using the cache might not be valid for such classes. +Impact of this PEP on introspection +----------------------------------- + +Use of the method introduced in this PEP can affect introspection of classes +with a metaclass that uses a custom ``__getdescriptor__`` method. This section +lists those changes. + +* ``dir`` might not show all attributes + + As with a custom ``__getattribute__`` method ``dir()`` might not see all + (instance) attributes when using the ``__getdescriptor__()`` method to + dynamicly resolve attributes. + + The solution for that is quite simple: classes using ``__getdescriptor__`` + should also implement ``__dir__`` if they want full support for the builtin + ``dir`` function. + + +* ``inspect.getattr_static`` might not show all attributes + + The function ``inspect.getattr_static`` intentionally does not invoke + ``__getattribute__`` and descriptors to avoid invoking user code during + introspection with this function. The ``__getdescriptor__`` method will also + be ignored and is another way in which the result of ``inspect.getattr_static`` + can be different from that of ``builtin.getattr``. + +* ``inspect.getmembers`` and ``inspect.get_class_attrs`` + + Both of these functions directly access the class __dict__ of classes along + the MRO, and hence can be affected by a custom ``__getdescriptor__`` method. + + **TODO**: I haven't fully worked out what the impact of this is, and if there + are mitigations for those using either updates to these functions, or + additional methods that users should implement to be fully compatible with these + functions. + + Performance impact ------------------ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Jul 27 14:20:46 2014 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 27 Jul 2014 14:20:46 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2320173=3A_Convert_?= =?utf-8?q?sha1=2C_sha256=2C_sha512_and_md5_to_ArgumentClinic=2E?= Message-ID: <3hLjsp5WmPz7LjX@mail.python.org> http://hg.python.org/cpython/rev/5a2ec0a15017 changeset: 91896:5a2ec0a15017 parent: 91894:cdcadbb72241 user: Martin v. L?wis date: Sun Jul 27 14:20:23 2014 +0200 summary: Issue #20173: Convert sha1, sha256, sha512 and md5 to ArgumentClinic. Patch by Vajrasky Kok. files: Misc/NEWS | 3 + Modules/md5module.c | 176 +++++++++++++++--- Modules/sha1module.c | 176 +++++++++++++++--- Modules/sha256module.c | 234 ++++++++++++++++++++----- Modules/sha512module.c | 268 +++++++++++++++++++++++----- 5 files changed, 699 insertions(+), 158 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -110,6 +110,9 @@ Library ------- +- Issue #20173: Convert sha1, sha256, sha512 and md5 to ArgumentClinic. + Patch by Vajrasky Kok. + - Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. repr(socket.socket) already works fine. diff --git a/Modules/md5module.c b/Modules/md5module.c --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -19,6 +19,11 @@ #include "Python.h" #include "hashlib.h" +/*[clinic input] +module _md5 +class MD5Type "MD5object *" "&PyType_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=6e5261719957a912]*/ /* Some useful types */ @@ -332,10 +337,33 @@ /* External methods for a hash object */ -PyDoc_STRVAR(MD5_copy__doc__, "Return a copy of the hash object."); +/*[clinic input] +MD5Type.copy + +Return a copy of the hash object. +[clinic start generated code]*/ + +PyDoc_STRVAR(MD5Type_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy of the hash object."); + +#define MD5TYPE_COPY_METHODDEF \ + {"copy", (PyCFunction)MD5Type_copy, METH_NOARGS, MD5Type_copy__doc__}, static PyObject * -MD5_copy(MD5object *self, PyObject *unused) +MD5Type_copy_impl(MD5object *self); + +static PyObject * +MD5Type_copy(MD5object *self, PyObject *Py_UNUSED(ignored)) +{ + return MD5Type_copy_impl(self); +} + +static PyObject * +MD5Type_copy_impl(MD5object *self) +/*[clinic end generated code: output=3b3a88920b3dc7f4 input=2c09e6d2493f3079]*/ { MD5object *newobj; @@ -351,11 +379,33 @@ return (PyObject *)newobj; } -PyDoc_STRVAR(MD5_digest__doc__, +/*[clinic input] +MD5Type.digest + +Return the digest value as a string of binary data. +[clinic start generated code]*/ + +PyDoc_STRVAR(MD5Type_digest__doc__, +"digest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of binary data."); +#define MD5TYPE_DIGEST_METHODDEF \ + {"digest", (PyCFunction)MD5Type_digest, METH_NOARGS, MD5Type_digest__doc__}, + static PyObject * -MD5_digest(MD5object *self, PyObject *unused) +MD5Type_digest_impl(MD5object *self); + +static PyObject * +MD5Type_digest(MD5object *self, PyObject *Py_UNUSED(ignored)) +{ + return MD5Type_digest_impl(self); +} + +static PyObject * +MD5Type_digest_impl(MD5object *self) +/*[clinic end generated code: output=7a796b28fa89485f input=7b96e65389412a34]*/ { unsigned char digest[MD5_DIGESTSIZE]; struct md5_state temp; @@ -365,11 +415,33 @@ return PyBytes_FromStringAndSize((const char *)digest, MD5_DIGESTSIZE); } -PyDoc_STRVAR(MD5_hexdigest__doc__, +/*[clinic input] +MD5Type.hexdigest + +Return the digest value as a string of hexadecimal digits. +[clinic start generated code]*/ + +PyDoc_STRVAR(MD5Type_hexdigest__doc__, +"hexdigest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of hexadecimal digits."); +#define MD5TYPE_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)MD5Type_hexdigest, METH_NOARGS, MD5Type_hexdigest__doc__}, + static PyObject * -MD5_hexdigest(MD5object *self, PyObject *unused) +MD5Type_hexdigest_impl(MD5object *self); + +static PyObject * +MD5Type_hexdigest(MD5object *self, PyObject *Py_UNUSED(ignored)) +{ + return MD5Type_hexdigest_impl(self); +} + +static PyObject * +MD5Type_hexdigest_impl(MD5object *self) +/*[clinic end generated code: output=daa73609f94f92e1 input=b60b19de644798dd]*/ { unsigned char digest[MD5_DIGESTSIZE]; struct md5_state temp; @@ -401,18 +473,30 @@ return retval; } -PyDoc_STRVAR(MD5_update__doc__, -"Update this hash object's state with the provided string."); +/*[clinic input] +MD5Type.update + + obj: object + / + +Update this hash object's state with the provided string. +[clinic start generated code]*/ + +PyDoc_STRVAR(MD5Type_update__doc__, +"update($self, obj, /)\n" +"--\n" +"\n" +"Update this hash object\'s state with the provided string."); + +#define MD5TYPE_UPDATE_METHODDEF \ + {"update", (PyCFunction)MD5Type_update, METH_O, MD5Type_update__doc__}, static PyObject * -MD5_update(MD5object *self, PyObject *args) +MD5Type_update(MD5object *self, PyObject *obj) +/*[clinic end generated code: output=9d09b6c6cdc6cac3 input=6e1efcd9ecf17032]*/ { - PyObject *obj; Py_buffer buf; - if (!PyArg_ParseTuple(args, "O:update", &obj)) - return NULL; - GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); md5_process(&self->hash_state, buf.buf, buf.len); @@ -423,10 +507,10 @@ } static PyMethodDef MD5_methods[] = { - {"copy", (PyCFunction)MD5_copy, METH_NOARGS, MD5_copy__doc__}, - {"digest", (PyCFunction)MD5_digest, METH_NOARGS, MD5_digest__doc__}, - {"hexdigest", (PyCFunction)MD5_hexdigest, METH_NOARGS, MD5_hexdigest__doc__}, - {"update", (PyCFunction)MD5_update, METH_VARARGS, MD5_update__doc__}, + MD5TYPE_COPY_METHODDEF + MD5TYPE_DIGEST_METHODDEF + MD5TYPE_HEXDIGEST_METHODDEF + MD5TYPE_UPDATE_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -502,27 +586,55 @@ /* The single module-level function: new() */ -PyDoc_STRVAR(MD5_new__doc__, +/*[clinic input] +_md5.md5 + + string: object(c_default="NULL") = b'' + +Return a new MD5 hash object; optionally initialized with a string. +[clinic start generated code]*/ + +PyDoc_STRVAR(_md5_md5__doc__, +"md5($module, /, string=b\'\')\n" +"--\n" +"\n" "Return a new MD5 hash object; optionally initialized with a string."); +#define _MD5_MD5_METHODDEF \ + {"md5", (PyCFunction)_md5_md5, METH_VARARGS|METH_KEYWORDS, _md5_md5__doc__}, + static PyObject * -MD5_new(PyObject *self, PyObject *args, PyObject *kwdict) +_md5_md5_impl(PyModuleDef *module, PyObject *string); + +static PyObject * +_md5_md5(PyModuleDef *module, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"string", NULL}; + PyObject *return_value = NULL; + static char *_keywords[] = {"string", NULL}; + PyObject *string = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:md5", _keywords, + &string)) + goto exit; + return_value = _md5_md5_impl(module, string); + +exit: + return return_value; +} + +static PyObject * +_md5_md5_impl(PyModuleDef *module, PyObject *string) +/*[clinic end generated code: output=1039e912d919880e input=d12ef8f72d684f7b]*/ +{ MD5object *new; - PyObject *data_obj = NULL; Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, - &data_obj)) { - return NULL; - } - - if (data_obj) - GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if (string) + GET_BUFFER_VIEW_OR_ERROUT(string, &buf); if ((new = newMD5object()) == NULL) { - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } @@ -531,11 +643,11 @@ if (PyErr_Occurred()) { Py_DECREF(new); - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } - if (data_obj) { + if (string) { md5_process(&new->hash_state, buf.buf, buf.len); PyBuffer_Release(&buf); } @@ -547,7 +659,7 @@ /* List of functions exported by this module */ static struct PyMethodDef MD5_functions[] = { - {"md5", (PyCFunction)MD5_new, METH_VARARGS|METH_KEYWORDS, MD5_new__doc__}, + _MD5_MD5_METHODDEF {NULL, NULL} /* Sentinel */ }; diff --git a/Modules/sha1module.c b/Modules/sha1module.c --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -19,6 +19,11 @@ #include "Python.h" #include "hashlib.h" +/*[clinic input] +module _sha1 +class SHA1Type "SHA1object *" "&PyType_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3dc9a20d1becb759]*/ /* Some useful types */ @@ -309,10 +314,33 @@ /* External methods for a hash object */ -PyDoc_STRVAR(SHA1_copy__doc__, "Return a copy of the hash object."); +/*[clinic input] +SHA1Type.copy + +Return a copy of the hash object. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA1Type_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy of the hash object."); + +#define SHA1TYPE_COPY_METHODDEF \ + {"copy", (PyCFunction)SHA1Type_copy, METH_NOARGS, SHA1Type_copy__doc__}, static PyObject * -SHA1_copy(SHA1object *self, PyObject *unused) +SHA1Type_copy_impl(SHA1object *self); + +static PyObject * +SHA1Type_copy(SHA1object *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA1Type_copy_impl(self); +} + +static PyObject * +SHA1Type_copy_impl(SHA1object *self) +/*[clinic end generated code: output=1a320e75a7444098 input=b7eae10df6f89b36]*/ { SHA1object *newobj; @@ -323,11 +351,33 @@ return (PyObject *)newobj; } -PyDoc_STRVAR(SHA1_digest__doc__, +/*[clinic input] +SHA1Type.digest + +Return the digest value as a string of binary data. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA1Type_digest__doc__, +"digest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of binary data."); +#define SHA1TYPE_DIGEST_METHODDEF \ + {"digest", (PyCFunction)SHA1Type_digest, METH_NOARGS, SHA1Type_digest__doc__}, + static PyObject * -SHA1_digest(SHA1object *self, PyObject *unused) +SHA1Type_digest_impl(SHA1object *self); + +static PyObject * +SHA1Type_digest(SHA1object *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA1Type_digest_impl(self); +} + +static PyObject * +SHA1Type_digest_impl(SHA1object *self) +/*[clinic end generated code: output=c4920f75228bfbfd input=205d47e1927fd009]*/ { unsigned char digest[SHA1_DIGESTSIZE]; struct sha1_state temp; @@ -337,11 +387,33 @@ return PyBytes_FromStringAndSize((const char *)digest, SHA1_DIGESTSIZE); } -PyDoc_STRVAR(SHA1_hexdigest__doc__, +/*[clinic input] +SHA1Type.hexdigest + +Return the digest value as a string of hexadecimal digits. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA1Type_hexdigest__doc__, +"hexdigest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of hexadecimal digits."); +#define SHA1TYPE_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)SHA1Type_hexdigest, METH_NOARGS, SHA1Type_hexdigest__doc__}, + static PyObject * -SHA1_hexdigest(SHA1object *self, PyObject *unused) +SHA1Type_hexdigest_impl(SHA1object *self); + +static PyObject * +SHA1Type_hexdigest(SHA1object *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA1Type_hexdigest_impl(self); +} + +static PyObject * +SHA1Type_hexdigest_impl(SHA1object *self) +/*[clinic end generated code: output=6e345aac201887b2 input=97691055c0c74ab0]*/ { unsigned char digest[SHA1_DIGESTSIZE]; struct sha1_state temp; @@ -373,18 +445,30 @@ return retval; } -PyDoc_STRVAR(SHA1_update__doc__, -"Update this hash object's state with the provided string."); +/*[clinic input] +SHA1Type.update + + obj: object + / + +Update this hash object's state with the provided string. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA1Type_update__doc__, +"update($self, obj, /)\n" +"--\n" +"\n" +"Update this hash object\'s state with the provided string."); + +#define SHA1TYPE_UPDATE_METHODDEF \ + {"update", (PyCFunction)SHA1Type_update, METH_O, SHA1Type_update__doc__}, static PyObject * -SHA1_update(SHA1object *self, PyObject *args) +SHA1Type_update(SHA1object *self, PyObject *obj) +/*[clinic end generated code: output=ab20a86a25e7d255 input=aad8e07812edbba3]*/ { - PyObject *obj; Py_buffer buf; - if (!PyArg_ParseTuple(args, "O:update", &obj)) - return NULL; - GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); sha1_process(&self->hash_state, buf.buf, buf.len); @@ -395,10 +479,10 @@ } static PyMethodDef SHA1_methods[] = { - {"copy", (PyCFunction)SHA1_copy, METH_NOARGS, SHA1_copy__doc__}, - {"digest", (PyCFunction)SHA1_digest, METH_NOARGS, SHA1_digest__doc__}, - {"hexdigest", (PyCFunction)SHA1_hexdigest, METH_NOARGS, SHA1_hexdigest__doc__}, - {"update", (PyCFunction)SHA1_update, METH_VARARGS, SHA1_update__doc__}, + SHA1TYPE_COPY_METHODDEF + SHA1TYPE_DIGEST_METHODDEF + SHA1TYPE_HEXDIGEST_METHODDEF + SHA1TYPE_UPDATE_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -474,27 +558,55 @@ /* The single module-level function: new() */ -PyDoc_STRVAR(SHA1_new__doc__, +/*[clinic input] +_sha1.sha1 + + string: object(c_default="NULL") = b'' + +Return a new SHA1 hash object; optionally initialized with a string. +[clinic start generated code]*/ + +PyDoc_STRVAR(_sha1_sha1__doc__, +"sha1($module, /, string=b\'\')\n" +"--\n" +"\n" "Return a new SHA1 hash object; optionally initialized with a string."); +#define _SHA1_SHA1_METHODDEF \ + {"sha1", (PyCFunction)_sha1_sha1, METH_VARARGS|METH_KEYWORDS, _sha1_sha1__doc__}, + static PyObject * -SHA1_new(PyObject *self, PyObject *args, PyObject *kwdict) +_sha1_sha1_impl(PyModuleDef *module, PyObject *string); + +static PyObject * +_sha1_sha1(PyModuleDef *module, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"string", NULL}; + PyObject *return_value = NULL; + static char *_keywords[] = {"string", NULL}; + PyObject *string = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:sha1", _keywords, + &string)) + goto exit; + return_value = _sha1_sha1_impl(module, string); + +exit: + return return_value; +} + +static PyObject * +_sha1_sha1_impl(PyModuleDef *module, PyObject *string) +/*[clinic end generated code: output=c9068552f07b8954 input=27ea54281d995ec2]*/ +{ SHA1object *new; - PyObject *data_obj = NULL; Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, - &data_obj)) { - return NULL; - } - - if (data_obj) - GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if (string) + GET_BUFFER_VIEW_OR_ERROUT(string, &buf); if ((new = newSHA1object()) == NULL) { - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } @@ -503,11 +615,11 @@ if (PyErr_Occurred()) { Py_DECREF(new); - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } - if (data_obj) { + if (string) { sha1_process(&new->hash_state, buf.buf, buf.len); PyBuffer_Release(&buf); } @@ -519,7 +631,7 @@ /* List of functions exported by this module */ static struct PyMethodDef SHA1_functions[] = { - {"sha1",(PyCFunction)SHA1_new, METH_VARARGS|METH_KEYWORDS,SHA1_new__doc__}, + _SHA1_SHA1_METHODDEF {NULL, NULL} /* Sentinel */ }; diff --git a/Modules/sha256module.c b/Modules/sha256module.c --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -20,6 +20,11 @@ #include "structmember.h" #include "hashlib.h" +/*[clinic input] +module _sha256 +class SHA256Type "SHAobject *" "&PyType_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=71a39174d4f0a744]*/ /* Some useful types */ @@ -393,10 +398,33 @@ /* External methods for a hash object */ -PyDoc_STRVAR(SHA256_copy__doc__, "Return a copy of the hash object."); +/*[clinic input] +SHA256Type.copy + +Return a copy of the hash object. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA256Type_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy of the hash object."); + +#define SHA256TYPE_COPY_METHODDEF \ + {"copy", (PyCFunction)SHA256Type_copy, METH_NOARGS, SHA256Type_copy__doc__}, static PyObject * -SHA256_copy(SHAobject *self, PyObject *unused) +SHA256Type_copy_impl(SHAobject *self); + +static PyObject * +SHA256Type_copy(SHAobject *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA256Type_copy_impl(self); +} + +static PyObject * +SHA256Type_copy_impl(SHAobject *self) +/*[clinic end generated code: output=f716c39d3f81c27c input=f58840a618d4f2a7]*/ { SHAobject *newobj; @@ -412,11 +440,33 @@ return (PyObject *)newobj; } -PyDoc_STRVAR(SHA256_digest__doc__, +/*[clinic input] +SHA256Type.digest + +Return the digest value as a string of binary data. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA256Type_digest__doc__, +"digest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of binary data."); +#define SHA256TYPE_DIGEST_METHODDEF \ + {"digest", (PyCFunction)SHA256Type_digest, METH_NOARGS, SHA256Type_digest__doc__}, + static PyObject * -SHA256_digest(SHAobject *self, PyObject *unused) +SHA256Type_digest_impl(SHAobject *self); + +static PyObject * +SHA256Type_digest(SHAobject *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA256Type_digest_impl(self); +} + +static PyObject * +SHA256Type_digest_impl(SHAobject *self) +/*[clinic end generated code: output=72d34723d7bb694c input=1fb752e58954157d]*/ { unsigned char digest[SHA_DIGESTSIZE]; SHAobject temp; @@ -426,11 +476,33 @@ return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } -PyDoc_STRVAR(SHA256_hexdigest__doc__, +/*[clinic input] +SHA256Type.hexdigest + +Return the digest value as a string of hexadecimal digits. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA256Type_hexdigest__doc__, +"hexdigest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of hexadecimal digits."); +#define SHA256TYPE_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)SHA256Type_hexdigest, METH_NOARGS, SHA256Type_hexdigest__doc__}, + static PyObject * -SHA256_hexdigest(SHAobject *self, PyObject *unused) +SHA256Type_hexdigest_impl(SHAobject *self); + +static PyObject * +SHA256Type_hexdigest(SHAobject *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA256Type_hexdigest_impl(self); +} + +static PyObject * +SHA256Type_hexdigest_impl(SHAobject *self) +/*[clinic end generated code: output=3687aa6183c7d27f input=0cc4c714693010d1]*/ { unsigned char digest[SHA_DIGESTSIZE]; SHAobject temp; @@ -462,18 +534,30 @@ return retval; } -PyDoc_STRVAR(SHA256_update__doc__, -"Update this hash object's state with the provided string."); +/*[clinic input] +SHA256Type.update + + obj: object + / + +Update this hash object's state with the provided string. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA256Type_update__doc__, +"update($self, obj, /)\n" +"--\n" +"\n" +"Update this hash object\'s state with the provided string."); + +#define SHA256TYPE_UPDATE_METHODDEF \ + {"update", (PyCFunction)SHA256Type_update, METH_O, SHA256Type_update__doc__}, static PyObject * -SHA256_update(SHAobject *self, PyObject *args) +SHA256Type_update(SHAobject *self, PyObject *obj) +/*[clinic end generated code: output=b47f53d7cbeabee4 input=b2d449d5b30f0f5a]*/ { - PyObject *obj; Py_buffer buf; - if (!PyArg_ParseTuple(args, "O:update", &obj)) - return NULL; - GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); sha_update(self, buf.buf, buf.len); @@ -484,10 +568,10 @@ } static PyMethodDef SHA_methods[] = { - {"copy", (PyCFunction)SHA256_copy, METH_NOARGS, SHA256_copy__doc__}, - {"digest", (PyCFunction)SHA256_digest, METH_NOARGS, SHA256_digest__doc__}, - {"hexdigest", (PyCFunction)SHA256_hexdigest, METH_NOARGS, SHA256_hexdigest__doc__}, - {"update", (PyCFunction)SHA256_update, METH_VARARGS, SHA256_update__doc__}, + SHA256TYPE_COPY_METHODDEF + SHA256TYPE_DIGEST_METHODDEF + SHA256TYPE_HEXDIGEST_METHODDEF + SHA256TYPE_UPDATE_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -594,27 +678,55 @@ /* The single module-level function: new() */ -PyDoc_STRVAR(SHA256_new__doc__, +/*[clinic input] +_sha256.sha256 + + string: object(c_default="NULL") = b'' + +Return a new SHA-256 hash object; optionally initialized with a string. +[clinic start generated code]*/ + +PyDoc_STRVAR(_sha256_sha256__doc__, +"sha256($module, /, string=b\'\')\n" +"--\n" +"\n" "Return a new SHA-256 hash object; optionally initialized with a string."); +#define _SHA256_SHA256_METHODDEF \ + {"sha256", (PyCFunction)_sha256_sha256, METH_VARARGS|METH_KEYWORDS, _sha256_sha256__doc__}, + static PyObject * -SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict) +_sha256_sha256_impl(PyModuleDef *module, PyObject *string); + +static PyObject * +_sha256_sha256(PyModuleDef *module, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"string", NULL}; + PyObject *return_value = NULL; + static char *_keywords[] = {"string", NULL}; + PyObject *string = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:sha256", _keywords, + &string)) + goto exit; + return_value = _sha256_sha256_impl(module, string); + +exit: + return return_value; +} + +static PyObject * +_sha256_sha256_impl(PyModuleDef *module, PyObject *string) +/*[clinic end generated code: output=4b1263d1e2fcdb98 input=09cce3fb855056b2]*/ +{ SHAobject *new; - PyObject *data_obj = NULL; Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, - &data_obj)) { - return NULL; - } - - if (data_obj) - GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if (string) + GET_BUFFER_VIEW_OR_ERROUT(string, &buf); if ((new = newSHA256object()) == NULL) { - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } @@ -623,11 +735,11 @@ if (PyErr_Occurred()) { Py_DECREF(new); - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } - if (data_obj) { + if (string) { sha_update(new, buf.buf, buf.len); PyBuffer_Release(&buf); } @@ -635,27 +747,55 @@ return (PyObject *)new; } -PyDoc_STRVAR(SHA224_new__doc__, +/*[clinic input] +_sha256.sha224 + + string: object(c_default="NULL") = b'' + +Return a new SHA-224 hash object; optionally initialized with a string. +[clinic start generated code]*/ + +PyDoc_STRVAR(_sha256_sha224__doc__, +"sha224($module, /, string=b\'\')\n" +"--\n" +"\n" "Return a new SHA-224 hash object; optionally initialized with a string."); +#define _SHA256_SHA224_METHODDEF \ + {"sha224", (PyCFunction)_sha256_sha224, METH_VARARGS|METH_KEYWORDS, _sha256_sha224__doc__}, + static PyObject * -SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict) +_sha256_sha224_impl(PyModuleDef *module, PyObject *string); + +static PyObject * +_sha256_sha224(PyModuleDef *module, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"string", NULL}; + PyObject *return_value = NULL; + static char *_keywords[] = {"string", NULL}; + PyObject *string = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:sha224", _keywords, + &string)) + goto exit; + return_value = _sha256_sha224_impl(module, string); + +exit: + return return_value; +} + +static PyObject * +_sha256_sha224_impl(PyModuleDef *module, PyObject *string) +/*[clinic end generated code: output=4dde0eb1cdaebc06 input=27a04ba24c353a73]*/ +{ SHAobject *new; - PyObject *data_obj = NULL; Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, - &data_obj)) { - return NULL; - } - - if (data_obj) - GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if (string) + GET_BUFFER_VIEW_OR_ERROUT(string, &buf); if ((new = newSHA224object()) == NULL) { - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } @@ -664,11 +804,11 @@ if (PyErr_Occurred()) { Py_DECREF(new); - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } - if (data_obj) { + if (string) { sha_update(new, buf.buf, buf.len); PyBuffer_Release(&buf); } @@ -680,8 +820,8 @@ /* List of functions exported by this module */ static struct PyMethodDef SHA_functions[] = { - {"sha256", (PyCFunction)SHA256_new, METH_VARARGS|METH_KEYWORDS, SHA256_new__doc__}, - {"sha224", (PyCFunction)SHA224_new, METH_VARARGS|METH_KEYWORDS, SHA224_new__doc__}, + _SHA256_SHA256_METHODDEF + _SHA256_SHA224_METHODDEF {NULL, NULL} /* Sentinel */ }; diff --git a/Modules/sha512module.c b/Modules/sha512module.c --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -20,6 +20,12 @@ #include "structmember.h" #include "hashlib.h" +/*[clinic input] +module _sha512 +class SHA512Type "SHAobject *" "&PyType_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=81a3ccde92bcfe8d]*/ + #ifdef PY_LONG_LONG /* If no PY_LONG_LONG, don't compile anything! */ /* Some useful types */ @@ -459,10 +465,33 @@ /* External methods for a hash object */ -PyDoc_STRVAR(SHA512_copy__doc__, "Return a copy of the hash object."); +/*[clinic input] +SHA512Type.copy + +Return a copy of the hash object. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA512Type_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy of the hash object."); + +#define SHA512TYPE_COPY_METHODDEF \ + {"copy", (PyCFunction)SHA512Type_copy, METH_NOARGS, SHA512Type_copy__doc__}, static PyObject * -SHA512_copy(SHAobject *self, PyObject *unused) +SHA512Type_copy_impl(SHAobject *self); + +static PyObject * +SHA512Type_copy(SHAobject *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA512Type_copy_impl(self); +} + +static PyObject * +SHA512Type_copy_impl(SHAobject *self) +/*[clinic end generated code: output=14f8e6ce9c61ece0 input=9f5f31e6c457776a]*/ { SHAobject *newobj; @@ -478,11 +507,33 @@ return (PyObject *)newobj; } -PyDoc_STRVAR(SHA512_digest__doc__, +/*[clinic input] +SHA512Type.digest + +Return the digest value as a string of binary data. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA512Type_digest__doc__, +"digest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of binary data."); +#define SHA512TYPE_DIGEST_METHODDEF \ + {"digest", (PyCFunction)SHA512Type_digest, METH_NOARGS, SHA512Type_digest__doc__}, + static PyObject * -SHA512_digest(SHAobject *self, PyObject *unused) +SHA512Type_digest_impl(SHAobject *self); + +static PyObject * +SHA512Type_digest(SHAobject *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA512Type_digest_impl(self); +} + +static PyObject * +SHA512Type_digest_impl(SHAobject *self) +/*[clinic end generated code: output=be8de024b232977e input=60c2cede9e023018]*/ { unsigned char digest[SHA_DIGESTSIZE]; SHAobject temp; @@ -492,11 +543,33 @@ return PyBytes_FromStringAndSize((const char *)digest, self->digestsize); } -PyDoc_STRVAR(SHA512_hexdigest__doc__, +/*[clinic input] +SHA512Type.hexdigest + +Return the digest value as a string of hexadecimal digits. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA512Type_hexdigest__doc__, +"hexdigest($self, /)\n" +"--\n" +"\n" "Return the digest value as a string of hexadecimal digits."); +#define SHA512TYPE_HEXDIGEST_METHODDEF \ + {"hexdigest", (PyCFunction)SHA512Type_hexdigest, METH_NOARGS, SHA512Type_hexdigest__doc__}, + static PyObject * -SHA512_hexdigest(SHAobject *self, PyObject *unused) +SHA512Type_hexdigest_impl(SHAobject *self); + +static PyObject * +SHA512Type_hexdigest(SHAobject *self, PyObject *Py_UNUSED(ignored)) +{ + return SHA512Type_hexdigest_impl(self); +} + +static PyObject * +SHA512Type_hexdigest_impl(SHAobject *self) +/*[clinic end generated code: output=28a4ab2f9a1781b8 input=498b877b25cbe0a2]*/ { unsigned char digest[SHA_DIGESTSIZE]; SHAobject temp; @@ -528,18 +601,30 @@ return retval; } -PyDoc_STRVAR(SHA512_update__doc__, -"Update this hash object's state with the provided string."); +/*[clinic input] +SHA512Type.update + + obj: object + / + +Update this hash object's state with the provided string. +[clinic start generated code]*/ + +PyDoc_STRVAR(SHA512Type_update__doc__, +"update($self, obj, /)\n" +"--\n" +"\n" +"Update this hash object\'s state with the provided string."); + +#define SHA512TYPE_UPDATE_METHODDEF \ + {"update", (PyCFunction)SHA512Type_update, METH_O, SHA512Type_update__doc__}, static PyObject * -SHA512_update(SHAobject *self, PyObject *args) +SHA512Type_update(SHAobject *self, PyObject *obj) +/*[clinic end generated code: output=6be574cdc3a9c52d input=ded2b46656566283]*/ { - PyObject *obj; Py_buffer buf; - if (!PyArg_ParseTuple(args, "O:update", &obj)) - return NULL; - GET_BUFFER_VIEW_OR_ERROUT(obj, &buf); sha512_update(self, buf.buf, buf.len); @@ -548,12 +633,32 @@ Py_INCREF(Py_None); return Py_None; } +/*[clinic input] +dump buffer +[clinic start generated code]*/ + +#ifndef SHA512TYPE_COPY_METHODDEF + #define SHA512TYPE_COPY_METHODDEF +#endif /* !defined(SHA512TYPE_COPY_METHODDEF) */ + +#ifndef SHA512TYPE_DIGEST_METHODDEF + #define SHA512TYPE_DIGEST_METHODDEF +#endif /* !defined(SHA512TYPE_DIGEST_METHODDEF) */ + +#ifndef SHA512TYPE_HEXDIGEST_METHODDEF + #define SHA512TYPE_HEXDIGEST_METHODDEF +#endif /* !defined(SHA512TYPE_HEXDIGEST_METHODDEF) */ + +#ifndef SHA512TYPE_UPDATE_METHODDEF + #define SHA512TYPE_UPDATE_METHODDEF +#endif /* !defined(SHA512TYPE_UPDATE_METHODDEF) */ +/*[clinic end generated code: output=de713947d31130e9 input=524ce2e021e4eba6]*/ static PyMethodDef SHA_methods[] = { - {"copy", (PyCFunction)SHA512_copy, METH_NOARGS, SHA512_copy__doc__}, - {"digest", (PyCFunction)SHA512_digest, METH_NOARGS, SHA512_digest__doc__}, - {"hexdigest", (PyCFunction)SHA512_hexdigest, METH_NOARGS, SHA512_hexdigest__doc__}, - {"update", (PyCFunction)SHA512_update, METH_VARARGS, SHA512_update__doc__}, + SHA512TYPE_COPY_METHODDEF + SHA512TYPE_DIGEST_METHODDEF + SHA512TYPE_HEXDIGEST_METHODDEF + SHA512TYPE_UPDATE_METHODDEF {NULL, NULL} /* sentinel */ }; @@ -660,27 +765,55 @@ /* The single module-level function: new() */ -PyDoc_STRVAR(SHA512_new__doc__, +/*[clinic input] +_sha512.sha512 + + string: object(c_default="NULL") = b'' + +Return a new SHA-512 hash object; optionally initialized with a string. +[clinic start generated code]*/ + +PyDoc_STRVAR(_sha512_sha512__doc__, +"sha512($module, /, string=b\'\')\n" +"--\n" +"\n" "Return a new SHA-512 hash object; optionally initialized with a string."); +#define _SHA512_SHA512_METHODDEF \ + {"sha512", (PyCFunction)_sha512_sha512, METH_VARARGS|METH_KEYWORDS, _sha512_sha512__doc__}, + static PyObject * -SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict) +_sha512_sha512_impl(PyModuleDef *module, PyObject *string); + +static PyObject * +_sha512_sha512(PyModuleDef *module, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"string", NULL}; + PyObject *return_value = NULL; + static char *_keywords[] = {"string", NULL}; + PyObject *string = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:sha512", _keywords, + &string)) + goto exit; + return_value = _sha512_sha512_impl(module, string); + +exit: + return return_value; +} + +static PyObject * +_sha512_sha512_impl(PyModuleDef *module, PyObject *string) +/*[clinic end generated code: output=9e39b11115f36878 input=e69bad9ae9b6a308]*/ +{ SHAobject *new; - PyObject *data_obj = NULL; Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, - &data_obj)) { - return NULL; - } - - if (data_obj) - GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if (string) + GET_BUFFER_VIEW_OR_ERROUT(string, &buf); if ((new = newSHA512object()) == NULL) { - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } @@ -689,11 +822,11 @@ if (PyErr_Occurred()) { Py_DECREF(new); - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } - if (data_obj) { + if (string) { sha512_update(new, buf.buf, buf.len); PyBuffer_Release(&buf); } @@ -701,27 +834,55 @@ return (PyObject *)new; } -PyDoc_STRVAR(SHA384_new__doc__, +/*[clinic input] +_sha512.sha384 + + string: object(c_default="NULL") = b'' + +Return a new SHA-384 hash object; optionally initialized with a string. +[clinic start generated code]*/ + +PyDoc_STRVAR(_sha512_sha384__doc__, +"sha384($module, /, string=b\'\')\n" +"--\n" +"\n" "Return a new SHA-384 hash object; optionally initialized with a string."); +#define _SHA512_SHA384_METHODDEF \ + {"sha384", (PyCFunction)_sha512_sha384, METH_VARARGS|METH_KEYWORDS, _sha512_sha384__doc__}, + static PyObject * -SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict) +_sha512_sha384_impl(PyModuleDef *module, PyObject *string); + +static PyObject * +_sha512_sha384(PyModuleDef *module, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"string", NULL}; + PyObject *return_value = NULL; + static char *_keywords[] = {"string", NULL}; + PyObject *string = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|O:sha384", _keywords, + &string)) + goto exit; + return_value = _sha512_sha384_impl(module, string); + +exit: + return return_value; +} + +static PyObject * +_sha512_sha384_impl(PyModuleDef *module, PyObject *string) +/*[clinic end generated code: output=397c6fba3525b93a input=c9327788d4ea4545]*/ +{ SHAobject *new; - PyObject *data_obj = NULL; Py_buffer buf; - if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|O:new", kwlist, - &data_obj)) { - return NULL; - } - - if (data_obj) - GET_BUFFER_VIEW_OR_ERROUT(data_obj, &buf); + if (string) + GET_BUFFER_VIEW_OR_ERROUT(string, &buf); if ((new = newSHA384object()) == NULL) { - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } @@ -730,11 +891,11 @@ if (PyErr_Occurred()) { Py_DECREF(new); - if (data_obj) + if (string) PyBuffer_Release(&buf); return NULL; } - if (data_obj) { + if (string) { sha512_update(new, buf.buf, buf.len); PyBuffer_Release(&buf); } @@ -743,11 +904,24 @@ } +/*[clinic input] +dump buffer +[clinic start generated code]*/ + +#ifndef _SHA512_SHA512_METHODDEF + #define _SHA512_SHA512_METHODDEF +#endif /* !defined(_SHA512_SHA512_METHODDEF) */ + +#ifndef _SHA512_SHA384_METHODDEF + #define _SHA512_SHA384_METHODDEF +#endif /* !defined(_SHA512_SHA384_METHODDEF) */ +/*[clinic end generated code: output=69d84aa9445b01d8 input=524ce2e021e4eba6]*/ + /* List of functions exported by this module */ static struct PyMethodDef SHA_functions[] = { - {"sha512", (PyCFunction)SHA512_new, METH_VARARGS|METH_KEYWORDS, SHA512_new__doc__}, - {"sha384", (PyCFunction)SHA384_new, METH_VARARGS|METH_KEYWORDS, SHA384_new__doc__}, + _SHA512_SHA512_METHODDEF + _SHA512_SHA384_METHODDEF {NULL, NULL} /* Sentinel */ }; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 16:12:06 2014 From: python-checkins at python.org (victor.stinner) Date: Sun, 27 Jul 2014 16:12:06 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322082=3A_Fix_a_co?= =?utf-8?q?mpiler_warning_=28function_is_not_a_prototype=29?= Message-ID: <3hLmLG55gkz7LjN@mail.python.org> http://hg.python.org/cpython/rev/c2d3feeb61ed changeset: 91897:c2d3feeb61ed user: Victor Stinner date: Sun Jul 27 16:11:30 2014 +0200 summary: Issue #22082: Fix a compiler warning (function is not a prototype) files: Objects/typeobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -55,7 +55,7 @@ slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds); static void -clear_slotdefs(); +clear_slotdefs(void); /* * finds the beginning of the docstring's introspection signature. @@ -6533,7 +6533,7 @@ } /* Undo init_slotdefs, releasing the interned strings. */ -static void clear_slotdefs() +static void clear_slotdefs(void) { slotdef *p; for (p = slotdefs; p->name; p++) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 16:22:31 2014 From: python-checkins at python.org (larry.hastings) Date: Sun, 27 Jul 2014 16:22:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Argument_Clinic_bugfix=3A_?= =?utf-8?q?Don=27t_let_the_C_preprocessor_=22Monitor=22_see_lines?= Message-ID: <3hLmZH0ptzz7LjP@mail.python.org> http://hg.python.org/cpython/rev/bf63ab43a8ca changeset: 91898:bf63ab43a8ca user: Larry Hastings date: Sun Jul 27 16:22:20 2014 +0200 summary: Argument Clinic bugfix: Don't let the C preprocessor "Monitor" see lines that we are scanning for the output marker. If we don't find it, we will scan them again, so it sees them twice, and it can get confused (like thinking we're still in a comment). files: Tools/clinic/clinic.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -1252,10 +1252,11 @@ match = self.start_re.match(line.lstrip()) return match.group(1) if match else None - def _line(self): + def _line(self, lookahead=False): self.line_number += 1 line = self.input.pop() - self.language.parse_line(line) + if not lookahead: + self.language.parse_line(line) return line def parse_verbatim_block(self): @@ -1311,7 +1312,7 @@ output_add, output_output = text_accumulator() arguments = None while self.input: - line = self._line() + line = self._line(lookahead=True) match = checksum_re.match(line.lstrip()) arguments = match.group(1) if match else None if arguments: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 16:25:23 2014 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 27 Jul 2014 16:25:23 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2320179=3A_Apply_Ar?= =?utf-8?q?gument_Clinic_to_bytes_and_bytearray=2E?= Message-ID: <3hLmdb5pKqz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/4d3d0659b55e changeset: 91899:4d3d0659b55e user: Martin v. L?wis date: Sun Jul 27 16:25:09 2014 +0200 summary: Issue #20179: Apply Argument Clinic to bytes and bytearray. Patch by Tal Einat. files: Include/bytes_methods.h | 4 +- Misc/NEWS | 3 + Objects/bytearrayobject.c | 1524 +++++++++++++++++++----- Objects/bytes_methods.c | 6 +- Objects/bytesobject.c | 976 +++++++++++---- 5 files changed, 1913 insertions(+), 600 deletions(-) diff --git a/Include/bytes_methods.h b/Include/bytes_methods.h --- a/Include/bytes_methods.h +++ b/Include/bytes_methods.h @@ -21,8 +21,8 @@ extern void _Py_bytes_capitalize(char *result, char *s, Py_ssize_t len); extern void _Py_bytes_swapcase(char *result, char *s, Py_ssize_t len); -/* This one gets the raw argument list. */ -extern PyObject* _Py_bytes_maketrans(PyObject *args); +/* The maketrans() static method. */ +extern PyObject* _Py_bytes_maketrans(PyObject *frm, PyObject *to); /* Shared __doc__ strings. */ extern const char _Py_isspace__doc__[]; diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #20179: Apply Argument Clinic to bytes and bytearray. + Patch by Tal Einat. + - Issue #22082: Clear interned strings in slotdefs. - Upgrade Unicode database to Unicode 7.0.0. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -5,6 +5,11 @@ #include "structmember.h" #include "bytes_methods.h" +/*[clinic input] +class bytearray "PyByteArrayObject *" "&PyByteArray_Type" +[clinic start generated code]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=5535b77c37a119e0]*/ + char _PyByteArray_empty_string[] = ""; void @@ -1219,26 +1224,70 @@ return count_obj; } -PyDoc_STRVAR(clear__doc__, -"B.clear() -> None\n\ -\n\ -Remove all items from B."); +/*[clinic input] +bytearray.clear + + self: self(type="PyByteArrayObject *") + +Remove all items from the bytearray. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_clear__doc__, +"clear($self, /)\n" +"--\n" +"\n" +"Remove all items from the bytearray."); + +#define BYTEARRAY_CLEAR_METHODDEF \ + {"clear", (PyCFunction)bytearray_clear, METH_NOARGS, bytearray_clear__doc__}, static PyObject * -bytearray_clear(PyByteArrayObject *self) +bytearray_clear_impl(PyByteArrayObject *self); + +static PyObject * +bytearray_clear(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) +{ + return bytearray_clear_impl(self); +} + +static PyObject * +bytearray_clear_impl(PyByteArrayObject *self) +/*[clinic end generated code: output=5344093031e2f36c input=e524fd330abcdc18]*/ { if (PyByteArray_Resize((PyObject *)self, 0) < 0) return NULL; Py_RETURN_NONE; } -PyDoc_STRVAR(copy__doc__, -"B.copy() -> bytearray\n\ -\n\ -Return a copy of B."); +/*[clinic input] +bytearray.copy + + self: self(type="PyByteArrayObject *") + +Return a copy of B. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_copy__doc__, +"copy($self, /)\n" +"--\n" +"\n" +"Return a copy of B."); + +#define BYTEARRAY_COPY_METHODDEF \ + {"copy", (PyCFunction)bytearray_copy, METH_NOARGS, bytearray_copy__doc__}, static PyObject * -bytearray_copy(PyByteArrayObject *self) +bytearray_copy_impl(PyByteArrayObject *self); + +static PyObject * +bytearray_copy(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) +{ + return bytearray_copy_impl(self); +} + +static PyObject * +bytearray_copy_impl(PyByteArrayObject *self) +/*[clinic end generated code: output=8788ed299f7f2214 input=6d5d2975aa0f33f3]*/ { return PyByteArray_FromStringAndSize(PyByteArray_AS_STRING((PyObject *)self), PyByteArray_GET_SIZE(self)); @@ -1457,36 +1506,85 @@ } -PyDoc_STRVAR(translate__doc__, -"B.translate(table[, deletechars]) -> bytearray\n\ -\n\ -Return a copy of B, where all characters occurring in the\n\ -optional argument deletechars are removed, and the remaining\n\ -characters have been mapped through the given translation\n\ -table, which must be a bytes object of length 256."); +/*[clinic input] +bytearray.translate + + self: self(type="PyByteArrayObject *") + table: object + Translation table, which must be a bytes object of length 256. + [ + deletechars: object + ] + / + +Return a copy with each character mapped by the given translation table. + +All characters occurring in the optional argument deletechars are removed. +The remaining characters are mapped through the given translation table. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_translate__doc__, +"translate(table, [deletechars])\n" +"Return a copy with each character mapped by the given translation table.\n" +"\n" +" table\n" +" Translation table, which must be a bytes object of length 256.\n" +"\n" +"All characters occurring in the optional argument deletechars are removed.\n" +"The remaining characters are mapped through the given translation table."); + +#define BYTEARRAY_TRANSLATE_METHODDEF \ + {"translate", (PyCFunction)bytearray_translate, METH_VARARGS, bytearray_translate__doc__}, + +static PyObject * +bytearray_translate_impl(PyByteArrayObject *self, PyObject *table, int group_right_1, PyObject *deletechars); static PyObject * bytearray_translate(PyByteArrayObject *self, PyObject *args) { + PyObject *return_value = NULL; + PyObject *table; + int group_right_1 = 0; + PyObject *deletechars = NULL; + + switch (PyTuple_GET_SIZE(args)) { + case 1: + if (!PyArg_ParseTuple(args, "O:translate", &table)) + goto exit; + break; + case 2: + if (!PyArg_ParseTuple(args, "OO:translate", &table, &deletechars)) + goto exit; + group_right_1 = 1; + break; + default: + PyErr_SetString(PyExc_TypeError, "bytearray.translate requires 1 to 2 arguments"); + goto exit; + } + return_value = bytearray_translate_impl(self, table, group_right_1, deletechars); + +exit: + return return_value; +} + +static PyObject * +bytearray_translate_impl(PyByteArrayObject *self, PyObject *table, int group_right_1, PyObject *deletechars) +/*[clinic end generated code: output=a709df81d41db4b7 input=b749ad85f4860824]*/ +{ char *input, *output; - const char *table; + const char *table_chars; Py_ssize_t i, c; PyObject *input_obj = (PyObject*)self; const char *output_start; Py_ssize_t inlen; PyObject *result = NULL; int trans_table[256]; - PyObject *tableobj = NULL, *delobj = NULL; Py_buffer vtable, vdel; - if (!PyArg_UnpackTuple(args, "translate", 1, 2, - &tableobj, &delobj)) - return NULL; - - if (tableobj == Py_None) { + if (table == Py_None) { + table_chars = NULL; table = NULL; - tableobj = NULL; - } else if (_getbuffer(tableobj, &vtable) < 0) { + } else if (_getbuffer(table, &vtable) < 0) { return NULL; } else { if (vtable.len != 256) { @@ -1495,12 +1593,12 @@ PyBuffer_Release(&vtable); return NULL; } - table = (const char*)vtable.buf; + table_chars = (const char*)vtable.buf; } - if (delobj != NULL) { - if (_getbuffer(delobj, &vdel) < 0) { - if (tableobj != NULL) + if (deletechars != NULL) { + if (_getbuffer(deletechars, &vdel) < 0) { + if (table != NULL) PyBuffer_Release(&vtable); return NULL; } @@ -1517,21 +1615,21 @@ output_start = output = PyByteArray_AsString(result); input = PyByteArray_AS_STRING(input_obj); - if (vdel.len == 0 && table != NULL) { + if (vdel.len == 0 && table_chars != NULL) { /* If no deletions are required, use faster code */ for (i = inlen; --i >= 0; ) { c = Py_CHARMASK(*input++); - *output++ = table[c]; + *output++ = table_chars[c]; } goto done; } - if (table == NULL) { + if (table_chars == NULL) { for (i = 0; i < 256; i++) trans_table[i] = Py_CHARMASK(i); } else { for (i = 0; i < 256; i++) - trans_table[i] = Py_CHARMASK(table[i]); + trans_table[i] = Py_CHARMASK(table_chars[i]); } for (i = 0; i < vdel.len; i++) @@ -1551,18 +1649,70 @@ } done: - if (tableobj != NULL) + if (table != NULL) PyBuffer_Release(&vtable); - if (delobj != NULL) + if (deletechars != NULL) PyBuffer_Release(&vdel); return result; } +/*[clinic input] + + at staticmethod +bytearray.maketrans + + frm: object + to: object + / + +Return a translation table useable for the bytes or bytearray translate method. + +The returned table will be one where each byte in frm is mapped to the byte at +the same position in to. + +The bytes objects frm and to must be of the same length. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_maketrans__doc__, +"maketrans(frm, to, /)\n" +"--\n" +"\n" +"Return a translation table useable for the bytes or bytearray translate method.\n" +"\n" +"The returned table will be one where each byte in frm is mapped to the byte at\n" +"the same position in to.\n" +"\n" +"The bytes objects frm and to must be of the same length."); + +#define BYTEARRAY_MAKETRANS_METHODDEF \ + {"maketrans", (PyCFunction)bytearray_maketrans, METH_VARARGS|METH_STATIC, bytearray_maketrans__doc__}, + static PyObject * -bytearray_maketrans(PyObject *null, PyObject *args) +bytearray_maketrans_impl(PyObject *frm, PyObject *to); + +static PyObject * +bytearray_maketrans(void *null, PyObject *args) { - return _Py_bytes_maketrans(args); + PyObject *return_value = NULL; + PyObject *frm; + PyObject *to; + + if (!PyArg_UnpackTuple(args, "maketrans", + 2, 2, + &frm, &to)) + goto exit; + return_value = bytearray_maketrans_impl(frm, to); + +exit: + return return_value; +} + +static PyObject * +bytearray_maketrans_impl(PyObject *frm, PyObject *to) +/*[clinic end generated code: output=307752019d9b25b5 input=ea9bdc6b328c15e2]*/ +{ + return _Py_bytes_maketrans(frm, to); } @@ -2053,67 +2203,150 @@ } -PyDoc_STRVAR(replace__doc__, -"B.replace(old, new[, count]) -> bytearray\n\ -\n\ -Return a copy of B with all occurrences of subsection\n\ -old replaced by new. If the optional argument count is\n\ -given, only the first count occurrences are replaced."); +/*[clinic input] +bytearray.replace + + old: object + new: object + count: Py_ssize_t = -1 + Maximum number of occurrences to replace. + -1 (the default value) means replace all occurrences. + / + +Return a copy with all occurrences of substring old replaced by new. + +If the optional argument count is given, only the first count occurrences are +replaced. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_replace__doc__, +"replace($self, old, new, count=-1, /)\n" +"--\n" +"\n" +"Return a copy with all occurrences of substring old replaced by new.\n" +"\n" +" count\n" +" Maximum number of occurrences to replace.\n" +" -1 (the default value) means replace all occurrences.\n" +"\n" +"If the optional argument count is given, only the first count occurrences are\n" +"replaced."); + +#define BYTEARRAY_REPLACE_METHODDEF \ + {"replace", (PyCFunction)bytearray_replace, METH_VARARGS, bytearray_replace__doc__}, + +static PyObject * +bytearray_replace_impl(PyByteArrayObject *self, PyObject *old, PyObject *new, Py_ssize_t count); static PyObject * bytearray_replace(PyByteArrayObject *self, PyObject *args) { + PyObject *return_value = NULL; + PyObject *old; + PyObject *new; Py_ssize_t count = -1; - PyObject *from, *to, *res; - Py_buffer vfrom, vto; - - if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count)) + + if (!PyArg_ParseTuple(args, + "OO|n:replace", + &old, &new, &count)) + goto exit; + return_value = bytearray_replace_impl(self, old, new, count); + +exit: + return return_value; +} + +static PyObject * +bytearray_replace_impl(PyByteArrayObject *self, PyObject *old, PyObject *new, Py_ssize_t count) +/*[clinic end generated code: output=4d2e3c9130da0f96 input=9aaaa123608dfc1f]*/ +{ + PyObject *res; + Py_buffer vold, vnew; + + if (_getbuffer(old, &vold) < 0) return NULL; - - if (_getbuffer(from, &vfrom) < 0) - return NULL; - if (_getbuffer(to, &vto) < 0) { - PyBuffer_Release(&vfrom); + if (_getbuffer(new, &vnew) < 0) { + PyBuffer_Release(&vold); return NULL; } res = (PyObject *)replace((PyByteArrayObject *) self, - vfrom.buf, vfrom.len, - vto.buf, vto.len, count); - - PyBuffer_Release(&vfrom); - PyBuffer_Release(&vto); + vold.buf, vold.len, + vnew.buf, vnew.len, count); + + PyBuffer_Release(&vold); + PyBuffer_Release(&vnew); return res; } -PyDoc_STRVAR(split__doc__, -"B.split(sep=None, maxsplit=-1) -> list of bytearrays\n\ -\n\ -Return a list of the sections in B, using sep as the delimiter.\n\ -If sep is not given, B is split on ASCII whitespace characters\n\ -(space, tab, return, newline, formfeed, vertical tab).\n\ -If maxsplit is given, at most maxsplit splits are done."); +/*[clinic input] +bytearray.split + + sep: object = None + The delimiter according which to split the bytearray. + None (the default value) means split on ASCII whitespace characters + (space, tab, return, newline, formfeed, vertical tab). + maxsplit: Py_ssize_t = -1 + Maximum number of splits to do. + -1 (the default value) means no limit. + +Return a list of the sections in the bytearray, using sep as the delimiter. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_split__doc__, +"split($self, /, sep=None, maxsplit=-1)\n" +"--\n" +"\n" +"Return a list of the sections in the bytearray, using sep as the delimiter.\n" +"\n" +" sep\n" +" The delimiter according which to split the bytearray.\n" +" None (the default value) means split on ASCII whitespace characters\n" +" (space, tab, return, newline, formfeed, vertical tab).\n" +" maxsplit\n" +" Maximum number of splits to do.\n" +" -1 (the default value) means no limit."); + +#define BYTEARRAY_SPLIT_METHODDEF \ + {"split", (PyCFunction)bytearray_split, METH_VARARGS|METH_KEYWORDS, bytearray_split__doc__}, static PyObject * -bytearray_split(PyByteArrayObject *self, PyObject *args, PyObject *kwds) +bytearray_split_impl(PyByteArrayObject *self, PyObject *sep, Py_ssize_t maxsplit); + +static PyObject * +bytearray_split(PyByteArrayObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"sep", "maxsplit", 0}; + PyObject *return_value = NULL; + static char *_keywords[] = {"sep", "maxsplit", NULL}; + PyObject *sep = Py_None; + Py_ssize_t maxsplit = -1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|On:split", _keywords, + &sep, &maxsplit)) + goto exit; + return_value = bytearray_split_impl(self, sep, maxsplit); + +exit: + return return_value; +} + +static PyObject * +bytearray_split_impl(PyByteArrayObject *self, PyObject *sep, Py_ssize_t maxsplit) +/*[clinic end generated code: output=062a3d87d6f918fa input=24f82669f41bf523]*/ +{ Py_ssize_t len = PyByteArray_GET_SIZE(self), n; - Py_ssize_t maxsplit = -1; const char *s = PyByteArray_AS_STRING(self), *sub; - PyObject *list, *subobj = Py_None; + PyObject *list; Py_buffer vsub; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:split", - kwlist, &subobj, &maxsplit)) - return NULL; if (maxsplit < 0) maxsplit = PY_SSIZE_T_MAX; - if (subobj == Py_None) + if (sep == Py_None) return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit); - if (_getbuffer(subobj, &vsub) < 0) + if (_getbuffer(sep, &vsub) < 0) return NULL; sub = vsub.buf; n = vsub.len; @@ -2125,19 +2358,46 @@ return list; } -PyDoc_STRVAR(partition__doc__, -"B.partition(sep) -> (head, sep, tail)\n\ -\n\ -Search for the separator sep in B, and return the part before it,\n\ -the separator itself, and the part after it. If the separator is not\n\ -found, returns B and two empty bytearray objects."); +/*[clinic input] +bytearray.partition + + self: self(type="PyByteArrayObject *") + sep: object + / + +Partition the bytearray into three parts using the given separator. + +This will search for the separator sep in the bytearray. If the separator is +found, returns a 3-tuple containing the part before the separator, the +separator itself, and the part after it. + +If the separator is not found, returns a 3-tuple containing the original +bytearray object and two empty bytearray objects. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_partition__doc__, +"partition($self, sep, /)\n" +"--\n" +"\n" +"Partition the bytearray into three parts using the given separator.\n" +"\n" +"This will search for the separator sep in the bytearray. If the separator is\n" +"found, returns a 3-tuple containing the part before the separator, the\n" +"separator itself, and the part after it.\n" +"\n" +"If the separator is not found, returns a 3-tuple containing the original\n" +"bytearray object and two empty bytearray objects."); + +#define BYTEARRAY_PARTITION_METHODDEF \ + {"partition", (PyCFunction)bytearray_partition, METH_O, bytearray_partition__doc__}, static PyObject * -bytearray_partition(PyByteArrayObject *self, PyObject *sep_obj) +bytearray_partition(PyByteArrayObject *self, PyObject *sep) +/*[clinic end generated code: output=2645138221fe6f4d input=7d7fe37b1696d506]*/ { PyObject *bytesep, *result; - bytesep = PyByteArray_FromObject(sep_obj); + bytesep = PyByteArray_FromObject(sep); if (! bytesep) return NULL; @@ -2152,20 +2412,46 @@ return result; } -PyDoc_STRVAR(rpartition__doc__, -"B.rpartition(sep) -> (head, sep, tail)\n\ -\n\ -Search for the separator sep in B, starting at the end of B,\n\ -and return the part before it, the separator itself, and the\n\ -part after it. If the separator is not found, returns two empty\n\ -bytearray objects and B."); +/*[clinic input] +bytearray.rpartition + + self: self(type="PyByteArrayObject *") + sep: object + / + +Partition the bytes into three parts using the given separator. + +This will search for the separator sep in the bytearray, starting and the end. +If the separator is found, returns a 3-tuple containing the part before the +separator, the separator itself, and the part after it. + +If the separator is not found, returns a 3-tuple containing two empty bytearray +objects and the original bytearray object. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_rpartition__doc__, +"rpartition($self, sep, /)\n" +"--\n" +"\n" +"Partition the bytes into three parts using the given separator.\n" +"\n" +"This will search for the separator sep in the bytearray, starting and the end.\n" +"If the separator is found, returns a 3-tuple containing the part before the\n" +"separator, the separator itself, and the part after it.\n" +"\n" +"If the separator is not found, returns a 3-tuple containing two empty bytearray\n" +"objects and the original bytearray object."); + +#define BYTEARRAY_RPARTITION_METHODDEF \ + {"rpartition", (PyCFunction)bytearray_rpartition, METH_O, bytearray_rpartition__doc__}, static PyObject * -bytearray_rpartition(PyByteArrayObject *self, PyObject *sep_obj) +bytearray_rpartition(PyByteArrayObject *self, PyObject *sep) +/*[clinic end generated code: output=ed13e54605d007de input=9b8cd540c1b75853]*/ { PyObject *bytesep, *result; - bytesep = PyByteArray_FromObject(sep_obj); + bytesep = PyByteArray_FromObject(sep); if (! bytesep) return NULL; @@ -2180,35 +2466,70 @@ return result; } -PyDoc_STRVAR(rsplit__doc__, -"B.rsplit(sep=None, maxsplit=-1) -> list of bytearrays\n\ -\n\ -Return a list of the sections in B, using sep as the delimiter,\n\ -starting at the end of B and working to the front.\n\ -If sep is not given, B is split on ASCII whitespace characters\n\ -(space, tab, return, newline, formfeed, vertical tab).\n\ -If maxsplit is given, at most maxsplit splits are done."); +/*[clinic input] +bytearray.rsplit = bytearray.split + +Return a list of the sections in the bytearray, using sep as the delimiter. + +Splitting is done starting at the end of the bytearray and working to the front. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_rsplit__doc__, +"rsplit($self, /, sep=None, maxsplit=-1)\n" +"--\n" +"\n" +"Return a list of the sections in the bytearray, using sep as the delimiter.\n" +"\n" +" sep\n" +" The delimiter according which to split the bytearray.\n" +" None (the default value) means split on ASCII whitespace characters\n" +" (space, tab, return, newline, formfeed, vertical tab).\n" +" maxsplit\n" +" Maximum number of splits to do.\n" +" -1 (the default value) means no limit.\n" +"\n" +"Splitting is done starting at the end of the bytearray and working to the front."); + +#define BYTEARRAY_RSPLIT_METHODDEF \ + {"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS|METH_KEYWORDS, bytearray_rsplit__doc__}, static PyObject * -bytearray_rsplit(PyByteArrayObject *self, PyObject *args, PyObject *kwds) +bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep, Py_ssize_t maxsplit); + +static PyObject * +bytearray_rsplit(PyByteArrayObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"sep", "maxsplit", 0}; + PyObject *return_value = NULL; + static char *_keywords[] = {"sep", "maxsplit", NULL}; + PyObject *sep = Py_None; + Py_ssize_t maxsplit = -1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|On:rsplit", _keywords, + &sep, &maxsplit)) + goto exit; + return_value = bytearray_rsplit_impl(self, sep, maxsplit); + +exit: + return return_value; +} + +static PyObject * +bytearray_rsplit_impl(PyByteArrayObject *self, PyObject *sep, Py_ssize_t maxsplit) +/*[clinic end generated code: output=affaf9fc2aae8d41 input=a68286e4dd692ffe]*/ +{ Py_ssize_t len = PyByteArray_GET_SIZE(self), n; - Py_ssize_t maxsplit = -1; const char *s = PyByteArray_AS_STRING(self), *sub; - PyObject *list, *subobj = Py_None; + PyObject *list; Py_buffer vsub; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:rsplit", - kwlist, &subobj, &maxsplit)) - return NULL; if (maxsplit < 0) maxsplit = PY_SSIZE_T_MAX; - if (subobj == Py_None) + if (sep == Py_None) return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit); - if (_getbuffer(subobj, &vsub) < 0) + if (_getbuffer(sep, &vsub) < 0) return NULL; sub = vsub.buf; n = vsub.len; @@ -2220,12 +2541,35 @@ return list; } -PyDoc_STRVAR(reverse__doc__, -"B.reverse() -> None\n\ -\n\ -Reverse the order of the values in B in place."); +/*[clinic input] +bytearray.reverse + + self: self(type="PyByteArrayObject *") + +Reverse the order of the values in B in place. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_reverse__doc__, +"reverse($self, /)\n" +"--\n" +"\n" +"Reverse the order of the values in B in place."); + +#define BYTEARRAY_REVERSE_METHODDEF \ + {"reverse", (PyCFunction)bytearray_reverse, METH_NOARGS, bytearray_reverse__doc__}, + static PyObject * -bytearray_reverse(PyByteArrayObject *self, PyObject *unused) +bytearray_reverse_impl(PyByteArrayObject *self); + +static PyObject * +bytearray_reverse(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) +{ + return bytearray_reverse_impl(self); +} + +static PyObject * +bytearray_reverse_impl(PyByteArrayObject *self) +/*[clinic end generated code: output=5d5e5f0bfc67f476 input=7933a499b8597bd1]*/ { char swap, *head, *tail; Py_ssize_t i, j, n = Py_SIZE(self); @@ -2242,57 +2586,69 @@ Py_RETURN_NONE; } -PyDoc_STRVAR(insert__doc__, -"B.insert(index, int) -> None\n\ -\n\ -Insert a single item into the bytearray before the given index."); + +/*[python input] +class bytesvalue_converter(CConverter): + type = 'int' + converter = '_getbytevalue' +[python start generated code]*/ +/*[python end generated code: output=da39a3ee5e6b4b0d input=29c2e7c26c212812]*/ + + +/*[clinic input] +bytearray.insert + + self: self(type="PyByteArrayObject *") + index: Py_ssize_t + The index where the value is to be inserted. + item: bytesvalue + The item to be inserted. + / + +Insert a single item into the bytearray before the given index. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_insert__doc__, +"insert($self, index, item, /)\n" +"--\n" +"\n" +"Insert a single item into the bytearray before the given index.\n" +"\n" +" index\n" +" The index where the value is to be inserted.\n" +" item\n" +" The item to be inserted."); + +#define BYTEARRAY_INSERT_METHODDEF \ + {"insert", (PyCFunction)bytearray_insert, METH_VARARGS, bytearray_insert__doc__}, + +static PyObject * +bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item); + static PyObject * bytearray_insert(PyByteArrayObject *self, PyObject *args) { - PyObject *value; - int ival; - Py_ssize_t where, n = Py_SIZE(self); + PyObject *return_value = NULL; + Py_ssize_t index; + int item; + + if (!PyArg_ParseTuple(args, + "nO&:insert", + &index, _getbytevalue, &item)) + goto exit; + return_value = bytearray_insert_impl(self, index, item); + +exit: + return return_value; +} + +static PyObject * +bytearray_insert_impl(PyByteArrayObject *self, Py_ssize_t index, int item) +/*[clinic end generated code: output=5ec9340d4ad19080 input=833766836ba30e1e]*/ +{ + Py_ssize_t n = Py_SIZE(self); char *buf; - if (!PyArg_ParseTuple(args, "nO:insert", &where, &value)) - return NULL; - - if (n == PY_SSIZE_T_MAX) { - PyErr_SetString(PyExc_OverflowError, - "cannot add more objects to bytearray"); - return NULL; - } - if (!_getbytevalue(value, &ival)) - return NULL; - if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) - return NULL; - buf = PyByteArray_AS_STRING(self); - - if (where < 0) { - where += n; - if (where < 0) - where = 0; - } - if (where > n) - where = n; - memmove(buf + where + 1, buf + where, n - where); - buf[where] = ival; - - Py_RETURN_NONE; -} - -PyDoc_STRVAR(append__doc__, -"B.append(int) -> None\n\ -\n\ -Append a single item to the end of B."); -static PyObject * -bytearray_append(PyByteArrayObject *self, PyObject *arg) -{ - int value; - Py_ssize_t n = Py_SIZE(self); - - if (! _getbytevalue(arg, &value)) - return NULL; if (n == PY_SSIZE_T_MAX) { PyErr_SetString(PyExc_OverflowError, "cannot add more objects to bytearray"); @@ -2300,19 +2656,108 @@ } if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; - - PyByteArray_AS_STRING(self)[n] = value; + buf = PyByteArray_AS_STRING(self); + + if (index < 0) { + index += n; + if (index < 0) + index = 0; + } + if (index > n) + index = n; + memmove(buf + index + 1, buf + index, n - index); + buf[index] = item; Py_RETURN_NONE; } -PyDoc_STRVAR(extend__doc__, -"B.extend(iterable_of_ints) -> None\n\ -\n\ -Append all the elements from the iterator or sequence to the\n\ -end of B."); +/*[clinic input] +bytearray.append + + self: self(type="PyByteArrayObject *") + item: bytesvalue + The item to be appended. + / + +Append a single item to the end of the bytearray. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_append__doc__, +"append($self, item, /)\n" +"--\n" +"\n" +"Append a single item to the end of the bytearray.\n" +"\n" +" item\n" +" The item to be appended."); + +#define BYTEARRAY_APPEND_METHODDEF \ + {"append", (PyCFunction)bytearray_append, METH_VARARGS, bytearray_append__doc__}, + static PyObject * -bytearray_extend(PyByteArrayObject *self, PyObject *arg) +bytearray_append_impl(PyByteArrayObject *self, int item); + +static PyObject * +bytearray_append(PyByteArrayObject *self, PyObject *args) +{ + PyObject *return_value = NULL; + int item; + + if (!PyArg_ParseTuple(args, + "O&:append", + _getbytevalue, &item)) + goto exit; + return_value = bytearray_append_impl(self, item); + +exit: + return return_value; +} + +static PyObject * +bytearray_append_impl(PyByteArrayObject *self, int item) +/*[clinic end generated code: output=b5b3325bb3bbaf85 input=ae56ea87380407cc]*/ +{ + Py_ssize_t n = Py_SIZE(self); + + if (n == PY_SSIZE_T_MAX) { + PyErr_SetString(PyExc_OverflowError, + "cannot add more objects to bytearray"); + return NULL; + } + if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) + return NULL; + + PyByteArray_AS_STRING(self)[n] = item; + + Py_RETURN_NONE; +} + +/*[clinic input] +bytearray.extend + + self: self(type="PyByteArrayObject *") + iterable_of_ints: object + The iterable of items to append. + / + +Append all the items from the iterator or sequence to the end of the bytearray. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_extend__doc__, +"extend($self, iterable_of_ints, /)\n" +"--\n" +"\n" +"Append all the items from the iterator or sequence to the end of the bytearray.\n" +"\n" +" iterable_of_ints\n" +" The iterable of items to append."); + +#define BYTEARRAY_EXTEND_METHODDEF \ + {"extend", (PyCFunction)bytearray_extend, METH_O, bytearray_extend__doc__}, + +static PyObject * +bytearray_extend(PyByteArrayObject *self, PyObject *iterable_of_ints) +/*[clinic end generated code: output=13b0c13ad5110dfb input=ce83a5d75b70d850]*/ { PyObject *it, *item, *bytearray_obj; Py_ssize_t buf_size = 0, len = 0; @@ -2320,19 +2765,19 @@ char *buf; /* bytearray_setslice code only accepts something supporting PEP 3118. */ - if (PyObject_CheckBuffer(arg)) { - if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), arg) == -1) + if (PyObject_CheckBuffer(iterable_of_ints)) { + if (bytearray_setslice(self, Py_SIZE(self), Py_SIZE(self), iterable_of_ints) == -1) return NULL; Py_RETURN_NONE; } - it = PyObject_GetIter(arg); + it = PyObject_GetIter(iterable_of_ints); if (it == NULL) return NULL; /* Try to determine the length of the argument. 32 is arbitrary. */ - buf_size = PyObject_LengthHint(arg, 32); + buf_size = PyObject_LengthHint(iterable_of_ints, 32); if (buf_size == -1) { Py_DECREF(it); return NULL; @@ -2384,29 +2829,70 @@ Py_RETURN_NONE; } -PyDoc_STRVAR(pop__doc__, -"B.pop([index]) -> int\n\ -\n\ -Remove and return a single item from B. If no index\n\ -argument is given, will pop the last value."); +/*[clinic input] +bytearray.pop + + self: self(type="PyByteArrayObject *") + index: Py_ssize_t = -1 + The index from where to remove the item. + -1 (the default value) means remove the last item. + / + +Remove and return a single item from B. + +If no index argument is given, will pop the last item. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_pop__doc__, +"pop($self, index=-1, /)\n" +"--\n" +"\n" +"Remove and return a single item from B.\n" +"\n" +" index\n" +" The index from where to remove the item.\n" +" -1 (the default value) means remove the last item.\n" +"\n" +"If no index argument is given, will pop the last item."); + +#define BYTEARRAY_POP_METHODDEF \ + {"pop", (PyCFunction)bytearray_pop, METH_VARARGS, bytearray_pop__doc__}, + +static PyObject * +bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index); + static PyObject * bytearray_pop(PyByteArrayObject *self, PyObject *args) { + PyObject *return_value = NULL; + Py_ssize_t index = -1; + + if (!PyArg_ParseTuple(args, + "|n:pop", + &index)) + goto exit; + return_value = bytearray_pop_impl(self, index); + +exit: + return return_value; +} + +static PyObject * +bytearray_pop_impl(PyByteArrayObject *self, Py_ssize_t index) +/*[clinic end generated code: output=3b763e548e79af96 input=0797e6c0ca9d5a85]*/ +{ int value; - Py_ssize_t where = -1, n = Py_SIZE(self); + Py_ssize_t n = Py_SIZE(self); char *buf; - if (!PyArg_ParseTuple(args, "|n:pop", &where)) - return NULL; - if (n == 0) { PyErr_SetString(PyExc_IndexError, "pop from empty bytearray"); return NULL; } - if (where < 0) - where += Py_SIZE(self); - if (where < 0 || where >= Py_SIZE(self)) { + if (index < 0) + index += Py_SIZE(self); + if (index < 0 || index >= Py_SIZE(self)) { PyErr_SetString(PyExc_IndexError, "pop index out of range"); return NULL; } @@ -2414,28 +2900,63 @@ return NULL; buf = PyByteArray_AS_STRING(self); - value = buf[where]; - memmove(buf + where, buf + where + 1, n - where); + value = buf[index]; + memmove(buf + index, buf + index + 1, n - index); if (PyByteArray_Resize((PyObject *)self, n - 1) < 0) return NULL; return PyLong_FromLong((unsigned char)value); } -PyDoc_STRVAR(remove__doc__, -"B.remove(int) -> None\n\ -\n\ -Remove the first occurrence of a value in B."); +/*[clinic input] +bytearray.remove + + self: self(type="PyByteArrayObject *") + value: bytesvalue + The value to remove. + / + +Remove the first occurrence of a value in the bytearray. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_remove__doc__, +"remove($self, value, /)\n" +"--\n" +"\n" +"Remove the first occurrence of a value in the bytearray.\n" +"\n" +" value\n" +" The value to remove."); + +#define BYTEARRAY_REMOVE_METHODDEF \ + {"remove", (PyCFunction)bytearray_remove, METH_VARARGS, bytearray_remove__doc__}, + static PyObject * -bytearray_remove(PyByteArrayObject *self, PyObject *arg) +bytearray_remove_impl(PyByteArrayObject *self, int value); + +static PyObject * +bytearray_remove(PyByteArrayObject *self, PyObject *args) { + PyObject *return_value = NULL; int value; + + if (!PyArg_ParseTuple(args, + "O&:remove", + _getbytevalue, &value)) + goto exit; + return_value = bytearray_remove_impl(self, value); + +exit: + return return_value; +} + +static PyObject * +bytearray_remove_impl(PyByteArrayObject *self, int value) +/*[clinic end generated code: output=c71c8bcf4703abfc input=47560b11fd856c24]*/ +{ Py_ssize_t where, n = Py_SIZE(self); char *buf = PyByteArray_AS_STRING(self); - if (! _getbytevalue(arg, &value)) - return NULL; - for (where = 0; where < n; where++) { if (buf[where] == value) break; @@ -2476,129 +2997,270 @@ return i + 1; } -PyDoc_STRVAR(strip__doc__, -"B.strip([bytes]) -> bytearray\n\ -\n\ -Strip leading and trailing bytes contained in the argument\n\ -and return the result as a new bytearray.\n\ -If the argument is omitted, strip ASCII whitespace."); +/*[clinic input] +bytearray.strip + + bytes: object = None + / + +Strip leading and trailing bytes contained in the argument. + +If the argument is omitted or None, strip leading and trailing ASCII whitespace. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_strip__doc__, +"strip($self, bytes=None, /)\n" +"--\n" +"\n" +"Strip leading and trailing bytes contained in the argument.\n" +"\n" +"If the argument is omitted or None, strip leading and trailing ASCII whitespace."); + +#define BYTEARRAY_STRIP_METHODDEF \ + {"strip", (PyCFunction)bytearray_strip, METH_VARARGS, bytearray_strip__doc__}, + +static PyObject * +bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes); + static PyObject * bytearray_strip(PyByteArrayObject *self, PyObject *args) { - Py_ssize_t left, right, mysize, argsize; - char *myptr, *argptr; - PyObject *arg = Py_None; - Py_buffer varg; - if (!PyArg_ParseTuple(args, "|O:strip", &arg)) - return NULL; - if (arg == Py_None) { - argptr = "\t\n\r\f\v "; - argsize = 6; + PyObject *return_value = NULL; + PyObject *bytes = Py_None; + + if (!PyArg_UnpackTuple(args, "strip", + 0, 1, + &bytes)) + goto exit; + return_value = bytearray_strip_impl(self, bytes); + +exit: + return return_value; +} + +static PyObject * +bytearray_strip_impl(PyByteArrayObject *self, PyObject *bytes) +/*[clinic end generated code: output=2e3d3358acc4c235 input=ef7bb59b09c21d62]*/ +{ + Py_ssize_t left, right, mysize, byteslen; + char *myptr, *bytesptr; + Py_buffer vbytes; + + if (bytes == Py_None) { + bytesptr = "\t\n\r\f\v "; + byteslen = 6; } else { - if (_getbuffer(arg, &varg) < 0) + if (_getbuffer(bytes, &vbytes) < 0) return NULL; - argptr = (char *) varg.buf; - argsize = varg.len; + bytesptr = (char *) vbytes.buf; + byteslen = vbytes.len; } myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); - left = lstrip_helper(myptr, mysize, argptr, argsize); + left = lstrip_helper(myptr, mysize, bytesptr, byteslen); if (left == mysize) right = left; else - right = rstrip_helper(myptr, mysize, argptr, argsize); - if (arg != Py_None) - PyBuffer_Release(&varg); + right = rstrip_helper(myptr, mysize, bytesptr, byteslen); + if (bytes != Py_None) + PyBuffer_Release(&vbytes); return PyByteArray_FromStringAndSize(myptr + left, right - left); } -PyDoc_STRVAR(lstrip__doc__, -"B.lstrip([bytes]) -> bytearray\n\ -\n\ -Strip leading bytes contained in the argument\n\ -and return the result as a new bytearray.\n\ -If the argument is omitted, strip leading ASCII whitespace."); +/*[clinic input] +bytearray.lstrip + + bytes: object = None + / + +Strip leading bytes contained in the argument. + +If the argument is omitted or None, strip leading ASCII whitespace. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_lstrip__doc__, +"lstrip($self, bytes=None, /)\n" +"--\n" +"\n" +"Strip leading bytes contained in the argument.\n" +"\n" +"If the argument is omitted or None, strip leading ASCII whitespace."); + +#define BYTEARRAY_LSTRIP_METHODDEF \ + {"lstrip", (PyCFunction)bytearray_lstrip, METH_VARARGS, bytearray_lstrip__doc__}, + +static PyObject * +bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes); + static PyObject * bytearray_lstrip(PyByteArrayObject *self, PyObject *args) { - Py_ssize_t left, right, mysize, argsize; - char *myptr, *argptr; - PyObject *arg = Py_None; - Py_buffer varg; - if (!PyArg_ParseTuple(args, "|O:lstrip", &arg)) - return NULL; - if (arg == Py_None) { - argptr = "\t\n\r\f\v "; - argsize = 6; + PyObject *return_value = NULL; + PyObject *bytes = Py_None; + + if (!PyArg_UnpackTuple(args, "lstrip", + 0, 1, + &bytes)) + goto exit; + return_value = bytearray_lstrip_impl(self, bytes); + +exit: + return return_value; +} + +static PyObject * +bytearray_lstrip_impl(PyByteArrayObject *self, PyObject *bytes) +/*[clinic end generated code: output=2599309808a9ec02 input=80843f975dd7c480]*/ +{ + Py_ssize_t left, right, mysize, byteslen; + char *myptr, *bytesptr; + Py_buffer vbytes; + + if (bytes == Py_None) { + bytesptr = "\t\n\r\f\v "; + byteslen = 6; } else { - if (_getbuffer(arg, &varg) < 0) + if (_getbuffer(bytes, &vbytes) < 0) return NULL; - argptr = (char *) varg.buf; - argsize = varg.len; + bytesptr = (char *) vbytes.buf; + byteslen = vbytes.len; } myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); - left = lstrip_helper(myptr, mysize, argptr, argsize); + left = lstrip_helper(myptr, mysize, bytesptr, byteslen); right = mysize; - if (arg != Py_None) - PyBuffer_Release(&varg); + if (bytes != Py_None) + PyBuffer_Release(&vbytes); return PyByteArray_FromStringAndSize(myptr + left, right - left); } -PyDoc_STRVAR(rstrip__doc__, -"B.rstrip([bytes]) -> bytearray\n\ -\n\ -Strip trailing bytes contained in the argument\n\ -and return the result as a new bytearray.\n\ -If the argument is omitted, strip trailing ASCII whitespace."); +/*[clinic input] +bytearray.rstrip + + bytes: object = None + / + +Strip trailing bytes contained in the argument. + +If the argument is omitted or None, strip trailing ASCII whitespace. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_rstrip__doc__, +"rstrip($self, bytes=None, /)\n" +"--\n" +"\n" +"Strip trailing bytes contained in the argument.\n" +"\n" +"If the argument is omitted or None, strip trailing ASCII whitespace."); + +#define BYTEARRAY_RSTRIP_METHODDEF \ + {"rstrip", (PyCFunction)bytearray_rstrip, METH_VARARGS, bytearray_rstrip__doc__}, + +static PyObject * +bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes); + static PyObject * bytearray_rstrip(PyByteArrayObject *self, PyObject *args) { - Py_ssize_t right, mysize, argsize; - char *myptr, *argptr; - PyObject *arg = Py_None; - Py_buffer varg; - if (!PyArg_ParseTuple(args, "|O:rstrip", &arg)) - return NULL; - if (arg == Py_None) { - argptr = "\t\n\r\f\v "; - argsize = 6; + PyObject *return_value = NULL; + PyObject *bytes = Py_None; + + if (!PyArg_UnpackTuple(args, "rstrip", + 0, 1, + &bytes)) + goto exit; + return_value = bytearray_rstrip_impl(self, bytes); + +exit: + return return_value; +} + +static PyObject * +bytearray_rstrip_impl(PyByteArrayObject *self, PyObject *bytes) +/*[clinic end generated code: output=b5ca6259f4f4f2a3 input=e728b994954cfd91]*/ +{ + Py_ssize_t right, mysize, byteslen; + char *myptr, *bytesptr; + Py_buffer vbytes; + + if (bytes == Py_None) { + bytesptr = "\t\n\r\f\v "; + byteslen = 6; } else { - if (_getbuffer(arg, &varg) < 0) + if (_getbuffer(bytes, &vbytes) < 0) return NULL; - argptr = (char *) varg.buf; - argsize = varg.len; + bytesptr = (char *) vbytes.buf; + byteslen = vbytes.len; } myptr = PyByteArray_AS_STRING(self); mysize = Py_SIZE(self); - right = rstrip_helper(myptr, mysize, argptr, argsize); - if (arg != Py_None) - PyBuffer_Release(&varg); + right = rstrip_helper(myptr, mysize, bytesptr, byteslen); + if (bytes != Py_None) + PyBuffer_Release(&vbytes); return PyByteArray_FromStringAndSize(myptr, right); } -PyDoc_STRVAR(decode_doc, -"B.decode(encoding='utf-8', errors='strict') -> str\n\ -\n\ -Decode B using the codec registered for encoding. Default encoding\n\ -is 'utf-8'. errors may be given to set a different error\n\ -handling scheme. Default is 'strict' meaning that encoding errors raise\n\ -a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\ -as well as any other name registered with codecs.register_error that is\n\ -able to handle UnicodeDecodeErrors."); +/*[clinic input] +bytearray.decode + + encoding: str(c_default="NULL") = 'utf-8' + The encoding with which to decode the bytearray. + errors: str(c_default="NULL") = 'strict' + The error handling scheme to use for the handling of decoding errors. + The default is 'strict' meaning that decoding errors raise a + UnicodeDecodeError. Other possible values are 'ignore' and 'replace' + as well as any other name registered with codecs.register_error that + can handle UnicodeDecodeErrors. + +Decode the bytearray using the codec registered for encoding. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_decode__doc__, +"decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n" +"--\n" +"\n" +"Decode the bytearray using the codec registered for encoding.\n" +"\n" +" encoding\n" +" The encoding with which to decode the bytearray.\n" +" errors\n" +" The error handling scheme to use for the handling of decoding errors.\n" +" The default is \'strict\' meaning that decoding errors raise a\n" +" UnicodeDecodeError. Other possible values are \'ignore\' and \'replace\'\n" +" as well as any other name registered with codecs.register_error that\n" +" can handle UnicodeDecodeErrors."); + +#define BYTEARRAY_DECODE_METHODDEF \ + {"decode", (PyCFunction)bytearray_decode, METH_VARARGS|METH_KEYWORDS, bytearray_decode__doc__}, static PyObject * -bytearray_decode(PyObject *self, PyObject *args, PyObject *kwargs) +bytearray_decode_impl(PyByteArrayObject *self, const char *encoding, const char *errors); + +static PyObject * +bytearray_decode(PyByteArrayObject *self, PyObject *args, PyObject *kwargs) { + PyObject *return_value = NULL; + static char *_keywords[] = {"encoding", "errors", NULL}; const char *encoding = NULL; const char *errors = NULL; - static char *kwlist[] = {"encoding", "errors", 0}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode", kwlist, &encoding, &errors)) - return NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|ss:decode", _keywords, + &encoding, &errors)) + goto exit; + return_value = bytearray_decode_impl(self, encoding, errors); + +exit: + return return_value; +} + +static PyObject * +bytearray_decode_impl(PyByteArrayObject *self, const char *encoding, const char *errors) +/*[clinic end generated code: output=38b83681f1e38a6c input=f28d8f903020257b]*/ +{ if (encoding == NULL) encoding = PyUnicode_GetDefaultEncoding(); return PyUnicode_FromEncodedObject(self, encoding, errors); @@ -2615,48 +3277,92 @@ return PyLong_FromSsize_t(self->ob_alloc); } -PyDoc_STRVAR(join_doc, -"B.join(iterable_of_bytes) -> bytearray\n\ -\n\ -Concatenate any number of bytes/bytearray objects, with B\n\ -in between each pair, and return the result as a new bytearray."); +/*[clinic input] +bytearray.join + + iterable_of_bytes: object + / + +Concatenate any number of bytes/bytearray objects. + +The bytearray whose method is called is inserted in between each pair. + +The result is returned as a new bytearray object. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_join__doc__, +"join($self, iterable_of_bytes, /)\n" +"--\n" +"\n" +"Concatenate any number of bytes/bytearray objects.\n" +"\n" +"The bytearray whose method is called is inserted in between each pair.\n" +"\n" +"The result is returned as a new bytearray object."); + +#define BYTEARRAY_JOIN_METHODDEF \ + {"join", (PyCFunction)bytearray_join, METH_O, bytearray_join__doc__}, static PyObject * -bytearray_join(PyObject *self, PyObject *iterable) +bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes) +/*[clinic end generated code: output=544e7430032dfdf4 input=aba6b1f9b30fcb8e]*/ { - return stringlib_bytes_join(self, iterable); + return stringlib_bytes_join(self, iterable_of_bytes); } -PyDoc_STRVAR(splitlines__doc__, -"B.splitlines([keepends]) -> list of lines\n\ -\n\ -Return a list of the lines in B, breaking at line boundaries.\n\ -Line breaks are not included in the resulting list unless keepends\n\ -is given and true."); - -static PyObject* -bytearray_splitlines(PyObject *self, PyObject *args, PyObject *kwds) +/*[clinic input] +bytearray.splitlines + + keepends: int(py_default="False") = 0 + +Return a list of the lines in the bytearray, breaking at line boundaries. + +Line breaks are not included in the resulting list unless keepends is given and +true. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_splitlines__doc__, +"splitlines($self, /, keepends=False)\n" +"--\n" +"\n" +"Return a list of the lines in the bytearray, breaking at line boundaries.\n" +"\n" +"Line breaks are not included in the resulting list unless keepends is given and\n" +"true."); + +#define BYTEARRAY_SPLITLINES_METHODDEF \ + {"splitlines", (PyCFunction)bytearray_splitlines, METH_VARARGS|METH_KEYWORDS, bytearray_splitlines__doc__}, + +static PyObject * +bytearray_splitlines_impl(PyByteArrayObject *self, int keepends); + +static PyObject * +bytearray_splitlines(PyByteArrayObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"keepends", 0}; + PyObject *return_value = NULL; + static char *_keywords[] = {"keepends", NULL}; int keepends = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines", - kwlist, &keepends)) - return NULL; - + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|i:splitlines", _keywords, + &keepends)) + goto exit; + return_value = bytearray_splitlines_impl(self, keepends); + +exit: + return return_value; +} + +static PyObject * +bytearray_splitlines_impl(PyByteArrayObject *self, int keepends) +/*[clinic end generated code: output=a837fd0512ad46ff input=36f0b25bc792f6c0]*/ +{ return stringlib_splitlines( (PyObject*) self, PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), keepends ); } -PyDoc_STRVAR(fromhex_doc, -"bytearray.fromhex(string) -> bytearray (static method)\n\ -\n\ -Create a bytearray object from a string of hexadecimal numbers.\n\ -Spaces between two numbers are accepted.\n\ -Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef')."); - static int hex_digit_to_int(Py_UCS4 c) { @@ -2673,24 +3379,68 @@ return -1; } +/*[clinic input] + at classmethod +bytearray.fromhex + + cls: self(type="PyObject*") + string: unicode + / + +Create a bytearray object from a string of hexadecimal numbers. + +Spaces between two numbers are accepted. +Example: bytearray.fromhex('B9 01EF') -> bytearray(b'\\xb9\\x01\\xef') +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_fromhex__doc__, +"fromhex($type, string, /)\n" +"--\n" +"\n" +"Create a bytearray object from a string of hexadecimal numbers.\n" +"\n" +"Spaces between two numbers are accepted.\n" +"Example: bytearray.fromhex(\'B9 01EF\') -> bytearray(b\'\\\\xb9\\\\x01\\\\xef\')"); + +#define BYTEARRAY_FROMHEX_METHODDEF \ + {"fromhex", (PyCFunction)bytearray_fromhex, METH_VARARGS|METH_CLASS, bytearray_fromhex__doc__}, + static PyObject * -bytearray_fromhex(PyObject *cls, PyObject *args) +bytearray_fromhex_impl(PyObject*cls, PyObject *string); + +static PyObject * +bytearray_fromhex(PyTypeObject *cls, PyObject *args) { - PyObject *newbytes, *hexobj; + PyObject *return_value = NULL; + PyObject *string; + + if (!PyArg_ParseTuple(args, + "U:fromhex", + &string)) + goto exit; + return_value = bytearray_fromhex_impl((PyObject*)cls, string); + +exit: + return return_value; +} + +static PyObject * +bytearray_fromhex_impl(PyObject*cls, PyObject *string) +/*[clinic end generated code: output=adc3c804a74e56d4 input=907bbd2d34d9367a]*/ +{ + PyObject *newbytes; char *buf; Py_ssize_t hexlen, byteslen, i, j; int top, bot; void *data; unsigned int kind; - if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj)) + assert(PyUnicode_Check(string)); + if (PyUnicode_READY(string)) return NULL; - assert(PyUnicode_Check(hexobj)); - if (PyUnicode_READY(hexobj)) - return NULL; - kind = PyUnicode_KIND(hexobj); - data = PyUnicode_DATA(hexobj); - hexlen = PyUnicode_GET_LENGTH(hexobj); + kind = PyUnicode_KIND(string); + data = PyUnicode_DATA(string); + hexlen = PyUnicode_GET_LENGTH(string); byteslen = hexlen/2; /* This overestimates if there are spaces */ newbytes = PyByteArray_FromStringAndSize(NULL, byteslen); @@ -2758,33 +3508,113 @@ } } -PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); +/*[clinic input] +bytearray.__reduce__ as bytearray_reduce + + self: self(type="PyByteArrayObject *") + +Return state information for pickling. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_reduce__doc__, +"__reduce__($self, /)\n" +"--\n" +"\n" +"Return state information for pickling."); + +#define BYTEARRAY_REDUCE_METHODDEF \ + {"__reduce__", (PyCFunction)bytearray_reduce, METH_NOARGS, bytearray_reduce__doc__}, static PyObject * -bytearray_reduce(PyByteArrayObject *self) +bytearray_reduce_impl(PyByteArrayObject *self); + +static PyObject * +bytearray_reduce(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) +{ + return bytearray_reduce_impl(self); +} + +static PyObject * +bytearray_reduce_impl(PyByteArrayObject *self) +/*[clinic end generated code: output=b1b56fe87bf30fb0 input=fbb07de4d102a03a]*/ { return _common_reduce(self, 2); } -PyDoc_STRVAR(reduce_ex_doc, "Return state information for pickling."); +/*[clinic input] +bytearray.__reduce_ex__ as bytearray_reduce_ex + + self: self(type="PyByteArrayObject *") + proto: int = 0 + / + +Return state information for pickling. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_reduce_ex__doc__, +"__reduce_ex__($self, proto=0, /)\n" +"--\n" +"\n" +"Return state information for pickling."); + +#define BYTEARRAY_REDUCE_EX_METHODDEF \ + {"__reduce_ex__", (PyCFunction)bytearray_reduce_ex, METH_VARARGS, bytearray_reduce_ex__doc__}, + +static PyObject * +bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto); static PyObject * bytearray_reduce_ex(PyByteArrayObject *self, PyObject *args) { + PyObject *return_value = NULL; int proto = 0; - if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto)) - return NULL; - + if (!PyArg_ParseTuple(args, + "|i:__reduce_ex__", + &proto)) + goto exit; + return_value = bytearray_reduce_ex_impl(self, proto); + +exit: + return return_value; +} + +static PyObject * +bytearray_reduce_ex_impl(PyByteArrayObject *self, int proto) +/*[clinic end generated code: output=bbd9afb2f5953dc1 input=0e091a42ca6dbd91]*/ +{ return _common_reduce(self, proto); } -PyDoc_STRVAR(sizeof_doc, -"B.__sizeof__() -> int\n\ - \n\ -Returns the size of B in memory, in bytes"); +/*[clinic input] +bytearray.__sizeof__ as bytearray_sizeof + + self: self(type="PyByteArrayObject *") + +Returns the size of the bytearray object in memory, in bytes. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytearray_sizeof__doc__, +"__sizeof__($self, /)\n" +"--\n" +"\n" +"Returns the size of the bytearray object in memory, in bytes."); + +#define BYTEARRAY_SIZEOF_METHODDEF \ + {"__sizeof__", (PyCFunction)bytearray_sizeof, METH_NOARGS, bytearray_sizeof__doc__}, + static PyObject * -bytearray_sizeof(PyByteArrayObject *self) +bytearray_sizeof_impl(PyByteArrayObject *self); + +static PyObject * +bytearray_sizeof(PyByteArrayObject *self, PyObject *Py_UNUSED(ignored)) +{ + return bytearray_sizeof_impl(self); +} + +static PyObject * +bytearray_sizeof_impl(PyByteArrayObject *self) +/*[clinic end generated code: output=4a2254b0a85630c6 input=6b23d305362b462b]*/ { Py_ssize_t res; @@ -2819,26 +3649,25 @@ static PyMethodDef bytearray_methods[] = { {"__alloc__", (PyCFunction)bytearray_alloc, METH_NOARGS, alloc_doc}, - {"__reduce__", (PyCFunction)bytearray_reduce, METH_NOARGS, reduce_doc}, - {"__reduce_ex__", (PyCFunction)bytearray_reduce_ex, METH_VARARGS, reduce_ex_doc}, - {"__sizeof__", (PyCFunction)bytearray_sizeof, METH_NOARGS, sizeof_doc}, - {"append", (PyCFunction)bytearray_append, METH_O, append__doc__}, + BYTEARRAY_REDUCE_METHODDEF + BYTEARRAY_REDUCE_EX_METHODDEF + BYTEARRAY_SIZEOF_METHODDEF + BYTEARRAY_APPEND_METHODDEF {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS, _Py_capitalize__doc__}, {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__}, - {"clear", (PyCFunction)bytearray_clear, METH_NOARGS, clear__doc__}, - {"copy", (PyCFunction)bytearray_copy, METH_NOARGS, copy__doc__}, + BYTEARRAY_CLEAR_METHODDEF + BYTEARRAY_COPY_METHODDEF {"count", (PyCFunction)bytearray_count, METH_VARARGS, count__doc__}, - {"decode", (PyCFunction)bytearray_decode, METH_VARARGS | METH_KEYWORDS, decode_doc}, + BYTEARRAY_DECODE_METHODDEF {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS, endswith__doc__}, {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, expandtabs__doc__}, - {"extend", (PyCFunction)bytearray_extend, METH_O, extend__doc__}, + BYTEARRAY_EXTEND_METHODDEF {"find", (PyCFunction)bytearray_find, METH_VARARGS, find__doc__}, - {"fromhex", (PyCFunction)bytearray_fromhex, METH_VARARGS|METH_CLASS, - fromhex_doc}, + BYTEARRAY_FROMHEX_METHODDEF {"index", (PyCFunction)bytearray_index, METH_VARARGS, index__doc__}, - {"insert", (PyCFunction)bytearray_insert, METH_VARARGS, insert__doc__}, + BYTEARRAY_INSERT_METHODDEF {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS, @@ -2853,34 +3682,31 @@ _Py_istitle__doc__}, {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS, _Py_isupper__doc__}, - {"join", (PyCFunction)bytearray_join, METH_O, join_doc}, + BYTEARRAY_JOIN_METHODDEF {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__}, {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__}, - {"lstrip", (PyCFunction)bytearray_lstrip, METH_VARARGS, lstrip__doc__}, - {"maketrans", (PyCFunction)bytearray_maketrans, METH_VARARGS|METH_STATIC, - _Py_maketrans__doc__}, - {"partition", (PyCFunction)bytearray_partition, METH_O, partition__doc__}, - {"pop", (PyCFunction)bytearray_pop, METH_VARARGS, pop__doc__}, - {"remove", (PyCFunction)bytearray_remove, METH_O, remove__doc__}, - {"replace", (PyCFunction)bytearray_replace, METH_VARARGS, replace__doc__}, - {"reverse", (PyCFunction)bytearray_reverse, METH_NOARGS, reverse__doc__}, + BYTEARRAY_LSTRIP_METHODDEF + BYTEARRAY_MAKETRANS_METHODDEF + BYTEARRAY_PARTITION_METHODDEF + BYTEARRAY_POP_METHODDEF + BYTEARRAY_REMOVE_METHODDEF + BYTEARRAY_REPLACE_METHODDEF + BYTEARRAY_REVERSE_METHODDEF {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, rfind__doc__}, {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, rindex__doc__}, {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__}, - {"rpartition", (PyCFunction)bytearray_rpartition, METH_O, rpartition__doc__}, - {"rsplit", (PyCFunction)bytearray_rsplit, METH_VARARGS | METH_KEYWORDS, rsplit__doc__}, - {"rstrip", (PyCFunction)bytearray_rstrip, METH_VARARGS, rstrip__doc__}, - {"split", (PyCFunction)bytearray_split, METH_VARARGS | METH_KEYWORDS, split__doc__}, - {"splitlines", (PyCFunction)bytearray_splitlines, - METH_VARARGS | METH_KEYWORDS, splitlines__doc__}, + BYTEARRAY_RPARTITION_METHODDEF + BYTEARRAY_RSPLIT_METHODDEF + BYTEARRAY_RSTRIP_METHODDEF + BYTEARRAY_SPLIT_METHODDEF + BYTEARRAY_SPLITLINES_METHODDEF {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS , startswith__doc__}, - {"strip", (PyCFunction)bytearray_strip, METH_VARARGS, strip__doc__}, + BYTEARRAY_STRIP_METHODDEF {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, _Py_swapcase__doc__}, {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__}, - {"translate", (PyCFunction)bytearray_translate, METH_VARARGS, - translate__doc__}, + BYTEARRAY_TRANSLATE_METHODDEF {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__}, {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__}, {NULL} @@ -3041,7 +3867,7 @@ {"__length_hint__", (PyCFunction)bytearrayiter_length_hint, METH_NOARGS, length_hint_doc}, {"__reduce__", (PyCFunction)bytearrayiter_reduce, METH_NOARGS, - reduce_doc}, + bytearray_reduce__doc__}, {"__setstate__", (PyCFunction)bytearrayiter_setstate, METH_O, setstate_doc}, {NULL, NULL} /* sentinel */ diff --git a/Objects/bytes_methods.c b/Objects/bytes_methods.c --- a/Objects/bytes_methods.c +++ b/Objects/bytes_methods.c @@ -382,9 +382,9 @@ } PyObject * -_Py_bytes_maketrans(PyObject *args) +_Py_bytes_maketrans(PyObject *frm, PyObject *to) { - PyObject *frm, *to, *res = NULL; + PyObject *res = NULL; Py_buffer bfrm, bto; Py_ssize_t i; char *p; @@ -392,8 +392,6 @@ bfrm.len = -1; bto.len = -1; - if (!PyArg_ParseTuple(args, "OO:maketrans", &frm, &to)) - return NULL; if (_getbuffer(frm, &bfrm) < 0) return NULL; if (_getbuffer(to, &bto) < 0) diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -7,6 +7,11 @@ #include "bytes_methods.h" #include +/*[clinic input] +class bytes +[clinic start generated code]*/ +/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ + static Py_ssize_t _getbuffer(PyObject *obj, Py_buffer *view) { @@ -1034,37 +1039,70 @@ #define RIGHTSTRIP 1 #define BOTHSTRIP 2 -/* Arrays indexed by above */ -static const char *stripformat[] = {"|O:lstrip", "|O:rstrip", "|O:strip"}; - -#define STRIPNAME(i) (stripformat[i]+3) - -PyDoc_STRVAR(split__doc__, -"B.split(sep=None, maxsplit=-1) -> list of bytes\n\ -\n\ -Return a list of the sections in B, using sep as the delimiter.\n\ -If sep is not specified or is None, B is split on ASCII whitespace\n\ -characters (space, tab, return, newline, formfeed, vertical tab).\n\ -If maxsplit is given, at most maxsplit splits are done."); +/*[clinic input] +bytes.split + + sep: object = None + The delimiter according which to split the bytes. + None (the default value) means split on ASCII whitespace characters + (space, tab, return, newline, formfeed, vertical tab). + maxsplit: Py_ssize_t = -1 + Maximum number of splits to do. + -1 (the default value) means no limit. + +Return a list of the sections in the bytes, using sep as the delimiter. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_split__doc__, +"split(sep=None, maxsplit=-1)\n" +"Return a list of the sections in the bytes, using sep as the delimiter.\n" +"\n" +" sep\n" +" The delimiter according which to split the bytes.\n" +" None (the default value) means split on ASCII whitespace characters\n" +" (space, tab, return, newline, formfeed, vertical tab).\n" +" maxsplit\n" +" Maximum number of splits to do.\n" +" -1 (the default value) means no limit."); + +#define BYTES_SPLIT_METHODDEF \ + {"split", (PyCFunction)bytes_split, METH_VARARGS|METH_KEYWORDS, bytes_split__doc__}, static PyObject * -bytes_split(PyBytesObject *self, PyObject *args, PyObject *kwds) +bytes_split_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit); + +static PyObject * +bytes_split(PyObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"sep", "maxsplit", 0}; + PyObject *return_value = NULL; + static char *_keywords[] = {"sep", "maxsplit", NULL}; + PyObject *sep = Py_None; + Py_ssize_t maxsplit = -1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|On:split", _keywords, + &sep, &maxsplit)) + goto exit; + return_value = bytes_split_impl(self, sep, maxsplit); + +exit: + return return_value; +} + +static PyObject * +bytes_split_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit) +/*[clinic end generated code: checksum=0c1bf4dba4fc7e03254d9c2f670d8e2682b38785]*/ +{ Py_ssize_t len = PyBytes_GET_SIZE(self), n; - Py_ssize_t maxsplit = -1; const char *s = PyBytes_AS_STRING(self), *sub; Py_buffer vsub; - PyObject *list, *subobj = Py_None; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:split", - kwlist, &subobj, &maxsplit)) - return NULL; + PyObject *list; + if (maxsplit < 0) maxsplit = PY_SSIZE_T_MAX; - if (subobj == Py_None) + if (sep == Py_None) return stringlib_split_whitespace((PyObject*) self, s, len, maxsplit); - if (_getbuffer(subobj, &vsub) < 0) + if (_getbuffer(sep, &vsub) < 0) return NULL; sub = vsub.buf; n = vsub.len; @@ -1074,89 +1112,170 @@ return list; } -PyDoc_STRVAR(partition__doc__, -"B.partition(sep) -> (head, sep, tail)\n\ -\n\ -Search for the separator sep in B, and return the part before it,\n\ -the separator itself, and the part after it. If the separator is not\n\ -found, returns B and two empty bytes objects."); +/*[clinic input] +bytes.partition + + self: self(type="PyBytesObject *") + sep: object + / + +Partition the bytes into three parts using the given separator. + +This will search for the separator sep in the bytes. If the separator is found, +returns a 3-tuple containing the part before the separator, the separator +itself, and the part after it. + +If the separator is not found, returns a 3-tuple containing the original bytes +object and two empty bytes objects. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_partition__doc__, +"partition(sep)\n" +"Partition the bytes into three parts using the given separator.\n" +"\n" +"This will search for the separator sep in the bytes. If the separator is found,\n" +"returns a 3-tuple containing the part before the separator, the separator\n" +"itself, and the part after it.\n" +"\n" +"If the separator is not found, returns a 3-tuple containing the original bytes\n" +"object and two empty bytes objects."); + +#define BYTES_PARTITION_METHODDEF \ + {"partition", (PyCFunction)bytes_partition, METH_O, bytes_partition__doc__}, static PyObject * -bytes_partition(PyBytesObject *self, PyObject *sep_obj) +bytes_partition(PyBytesObject *self, PyObject *sep) +/*[clinic end generated code: checksum=02ddd49338037b02d203b165fb2e48c6eb779983]*/ { - const char *sep; + const char *sep_chars; Py_ssize_t sep_len; - if (PyBytes_Check(sep_obj)) { - sep = PyBytes_AS_STRING(sep_obj); - sep_len = PyBytes_GET_SIZE(sep_obj); + if (PyBytes_Check(sep)) { + sep_chars = PyBytes_AS_STRING(sep); + sep_len = PyBytes_GET_SIZE(sep); } - else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) + else if (PyObject_AsCharBuffer(sep, &sep_chars, &sep_len)) return NULL; return stringlib_partition( (PyObject*) self, PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), - sep_obj, sep, sep_len + sep, sep_chars, sep_len ); } -PyDoc_STRVAR(rpartition__doc__, -"B.rpartition(sep) -> (head, sep, tail)\n\ -\n\ -Search for the separator sep in B, starting at the end of B,\n\ -and return the part before it, the separator itself, and the\n\ -part after it. If the separator is not found, returns two empty\n\ -bytes objects and B."); +/*[clinic input] +bytes.rpartition + + self: self(type="PyBytesObject *") + sep: object + / + +Partition the bytes into three parts using the given separator. + +This will search for the separator sep in the bytes, starting and the end. If +the separator is found, returns a 3-tuple containing the part before the +separator, the separator itself, and the part after it. + +If the separator is not found, returns a 3-tuple containing two empty bytes +objects and the original bytes object. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_rpartition__doc__, +"rpartition(sep)\n" +"Partition the bytes into three parts using the given separator.\n" +"\n" +"This will search for the separator sep in the bytes, starting and the end. If\n" +"the separator is found, returns a 3-tuple containing the part before the\n" +"separator, the separator itself, and the part after it.\n" +"\n" +"If the separator is not found, returns a 3-tuple containing two empty bytes\n" +"objects and the original bytes object."); + +#define BYTES_RPARTITION_METHODDEF \ + {"rpartition", (PyCFunction)bytes_rpartition, METH_O, bytes_rpartition__doc__}, static PyObject * -bytes_rpartition(PyBytesObject *self, PyObject *sep_obj) +bytes_rpartition(PyBytesObject *self, PyObject *sep) +/*[clinic end generated code: checksum=af06be67ab873c2792db9961f504350bc99f126a]*/ { - const char *sep; + const char *sep_chars; Py_ssize_t sep_len; - if (PyBytes_Check(sep_obj)) { - sep = PyBytes_AS_STRING(sep_obj); - sep_len = PyBytes_GET_SIZE(sep_obj); + if (PyBytes_Check(sep)) { + sep_chars = PyBytes_AS_STRING(sep); + sep_len = PyBytes_GET_SIZE(sep); } - else if (PyObject_AsCharBuffer(sep_obj, &sep, &sep_len)) + else if (PyObject_AsCharBuffer(sep, &sep_chars, &sep_len)) return NULL; return stringlib_rpartition( (PyObject*) self, PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), - sep_obj, sep, sep_len + sep, sep_chars, sep_len ); } -PyDoc_STRVAR(rsplit__doc__, -"B.rsplit(sep=None, maxsplit=-1) -> list of bytes\n\ -\n\ -Return a list of the sections in B, using sep as the delimiter,\n\ -starting at the end of B and working to the front.\n\ -If sep is not given, B is split on ASCII whitespace characters\n\ -(space, tab, return, newline, formfeed, vertical tab).\n\ -If maxsplit is given, at most maxsplit splits are done."); - +/*[clinic input] +bytes.rsplit = bytes.split + +Return a list of the sections in the bytes, using sep as the delimiter. + +Splitting is done starting at the end of the bytes and working to the front. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_rsplit__doc__, +"rsplit(sep=None, maxsplit=-1)\n" +"Return a list of the sections in the bytes, using sep as the delimiter.\n" +"\n" +" sep\n" +" The delimiter according which to split the bytes.\n" +" None (the default value) means split on ASCII whitespace characters\n" +" (space, tab, return, newline, formfeed, vertical tab).\n" +" maxsplit\n" +" Maximum number of splits to do.\n" +" -1 (the default value) means no limit.\n" +"\n" +"Splitting is done starting at the end of the bytes and working to the front."); + +#define BYTES_RSPLIT_METHODDEF \ + {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS|METH_KEYWORDS, bytes_rsplit__doc__}, static PyObject * -bytes_rsplit(PyBytesObject *self, PyObject *args, PyObject *kwds) +bytes_rsplit_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit); + +static PyObject * +bytes_rsplit(PyObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"sep", "maxsplit", 0}; + PyObject *return_value = NULL; + static char *_keywords[] = {"sep", "maxsplit", NULL}; + PyObject *sep = Py_None; + Py_ssize_t maxsplit = -1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|On:rsplit", _keywords, + &sep, &maxsplit)) + goto exit; + return_value = bytes_rsplit_impl(self, sep, maxsplit); + +exit: + return return_value; +} + +static PyObject * +bytes_rsplit_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit) +/*[clinic end generated code: checksum=f5bcee1d73b31b9df8821731f4ed3a8d1bc78588]*/ +{ Py_ssize_t len = PyBytes_GET_SIZE(self), n; - Py_ssize_t maxsplit = -1; const char *s = PyBytes_AS_STRING(self), *sub; Py_buffer vsub; - PyObject *list, *subobj = Py_None; - - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|On:rsplit", - kwlist, &subobj, &maxsplit)) - return NULL; + PyObject *list; + if (maxsplit < 0) maxsplit = PY_SSIZE_T_MAX; - if (subobj == Py_None) + if (sep == Py_None) return stringlib_rsplit_whitespace((PyObject*) self, s, len, maxsplit); - if (_getbuffer(subobj, &vsub) < 0) + if (_getbuffer(sep, &vsub) < 0) return NULL; sub = vsub.buf; n = vsub.len; @@ -1167,16 +1286,39 @@ } -PyDoc_STRVAR(join__doc__, -"B.join(iterable_of_bytes) -> bytes\n\ -\n\ -Concatenate any number of bytes objects, with B in between each pair.\n\ -Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'."); +/*[clinic input] +bytes.join + + iterable_of_bytes: object + / + +Concatenate any number of bytes objects. + +The bytes whose method is called is inserted in between each pair. + +The result is returned as a new bytes object. + +Example: b'.'.join([b'ab', b'pq', b'rs']) -> b'ab.pq.rs'. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_join__doc__, +"join(iterable_of_bytes)\n" +"Concatenate any number of bytes objects.\n" +"\n" +"The bytes whose method is called is inserted in between each pair.\n" +"\n" +"The result is returned as a new bytes object.\n" +"\n" +"Example: b\'.\'.join([b\'ab\', b\'pq\', b\'rs\']) -> b\'ab.pq.rs\'."); + +#define BYTES_JOIN_METHODDEF \ + {"join", (PyCFunction)bytes_join, METH_O, bytes_join__doc__}, static PyObject * -bytes_join(PyObject *self, PyObject *iterable) +bytes_join(PyObject *self, PyObject *iterable_of_bytes) +/*[clinic end generated code: checksum=3fa2b5fc3b1494ba4db416303571f4ecd055090b]*/ { - return stringlib_bytes_join(self, iterable); + return stringlib_bytes_join(self, iterable_of_bytes); } PyObject * @@ -1395,62 +1537,153 @@ Py_LOCAL_INLINE(PyObject *) -do_argstrip(PyBytesObject *self, int striptype, PyObject *args) +do_argstrip(PyBytesObject *self, int striptype, PyObject *bytes) { - PyObject *sep = NULL; - - if (!PyArg_ParseTuple(args, stripformat[striptype], &sep)) - return NULL; - - if (sep != NULL && sep != Py_None) { - return do_xstrip(self, striptype, sep); + if (bytes != NULL && bytes != Py_None) { + return do_xstrip(self, striptype, bytes); } return do_strip(self, striptype); } - -PyDoc_STRVAR(strip__doc__, -"B.strip([bytes]) -> bytes\n\ -\n\ -Strip leading and trailing bytes contained in the argument.\n\ -If the argument is omitted, strip leading and trailing ASCII whitespace."); +/*[clinic input] +bytes.strip + + self: self(type="PyBytesObject *") + bytes: object = None + / + +Strip leading and trailing bytes contained in the argument. + +If the argument is omitted or None, strip leading and trailing ASCII whitespace. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_strip__doc__, +"strip(bytes=None)\n" +"Strip leading and trailing bytes contained in the argument.\n" +"\n" +"If the argument is omitted or None, strip leading and trailing ASCII whitespace."); + +#define BYTES_STRIP_METHODDEF \ + {"strip", (PyCFunction)bytes_strip, METH_VARARGS, bytes_strip__doc__}, + static PyObject * -bytes_strip(PyBytesObject *self, PyObject *args) +bytes_strip_impl(PyBytesObject *self, PyObject *bytes); + +static PyObject * +bytes_strip(PyObject *self, PyObject *args) { - if (PyTuple_GET_SIZE(args) == 0) - return do_strip(self, BOTHSTRIP); /* Common case */ - else - return do_argstrip(self, BOTHSTRIP, args); + PyObject *return_value = NULL; + PyObject *bytes = Py_None; + + if (!PyArg_UnpackTuple(args, "strip", + 0, 1, + &bytes)) + goto exit; + return_value = bytes_strip_impl((PyBytesObject *)self, bytes); + +exit: + return return_value; } - -PyDoc_STRVAR(lstrip__doc__, -"B.lstrip([bytes]) -> bytes\n\ -\n\ -Strip leading bytes contained in the argument.\n\ -If the argument is omitted, strip leading ASCII whitespace."); static PyObject * -bytes_lstrip(PyBytesObject *self, PyObject *args) +bytes_strip_impl(PyBytesObject *self, PyObject *bytes) +/*[clinic end generated code: checksum=3c59229e9332a1782987f047d43a9526a3b3c90f]*/ { - if (PyTuple_GET_SIZE(args) == 0) - return do_strip(self, LEFTSTRIP); /* Common case */ - else - return do_argstrip(self, LEFTSTRIP, args); + return do_argstrip(self, BOTHSTRIP, bytes); } - -PyDoc_STRVAR(rstrip__doc__, -"B.rstrip([bytes]) -> bytes\n\ -\n\ -Strip trailing bytes contained in the argument.\n\ -If the argument is omitted, strip trailing ASCII whitespace."); +/*[clinic input] +bytes.lstrip + + self: self(type="PyBytesObject *") + bytes: object = None + / + +Strip leading bytes contained in the argument. + +If the argument is omitted or None, strip leading ASCII whitespace. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_lstrip__doc__, +"lstrip(bytes=None)\n" +"Strip leading bytes contained in the argument.\n" +"\n" +"If the argument is omitted or None, strip leading ASCII whitespace."); + +#define BYTES_LSTRIP_METHODDEF \ + {"lstrip", (PyCFunction)bytes_lstrip, METH_VARARGS, bytes_lstrip__doc__}, + static PyObject * -bytes_rstrip(PyBytesObject *self, PyObject *args) +bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes); + +static PyObject * +bytes_lstrip(PyObject *self, PyObject *args) { - if (PyTuple_GET_SIZE(args) == 0) - return do_strip(self, RIGHTSTRIP); /* Common case */ - else - return do_argstrip(self, RIGHTSTRIP, args); + PyObject *return_value = NULL; + PyObject *bytes = Py_None; + + if (!PyArg_UnpackTuple(args, "lstrip", + 0, 1, + &bytes)) + goto exit; + return_value = bytes_lstrip_impl((PyBytesObject *)self, bytes); + +exit: + return return_value; +} + +static PyObject * +bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes) +/*[clinic end generated code: checksum=34a0a2cae35c06ad984c5657659d4d28ec0e407a]*/ +{ + return do_argstrip(self, LEFTSTRIP, bytes); +} + +/*[clinic input] +bytes.rstrip + + self: self(type="PyBytesObject *") + bytes: object = None + / + +Strip trailing bytes contained in the argument. + +If the argument is omitted or None, strip trailing ASCII whitespace. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_rstrip__doc__, +"rstrip(bytes=None)\n" +"Strip trailing bytes contained in the argument.\n" +"\n" +"If the argument is omitted or None, strip trailing ASCII whitespace."); + +#define BYTES_RSTRIP_METHODDEF \ + {"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, bytes_rstrip__doc__}, + +static PyObject * +bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes); + +static PyObject * +bytes_rstrip(PyObject *self, PyObject *args) +{ + PyObject *return_value = NULL; + PyObject *bytes = Py_None; + + if (!PyArg_UnpackTuple(args, "rstrip", + 0, 1, + &bytes)) + goto exit; + return_value = bytes_rstrip_impl((PyBytesObject *)self, bytes); + +exit: + return return_value; +} + +static PyObject * +bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes) +/*[clinic end generated code: checksum=eeb1b0cff2f4bfbad7324eea81dd9dec2a872ad6]*/ +{ + return do_argstrip(self, RIGHTSTRIP, bytes); } @@ -1502,40 +1735,88 @@ } -PyDoc_STRVAR(translate__doc__, -"B.translate(table[, deletechars]) -> bytes\n\ -\n\ -Return a copy of B, where all characters occurring in the\n\ -optional argument deletechars are removed, and the remaining\n\ -characters have been mapped through the given translation\n\ -table, which must be a bytes object of length 256."); +/*[clinic input] +bytes.translate + + self: self(type="PyBytesObject *") + table: object + Translation table, which must be a bytes object of length 256. + [ + deletechars: object + ] + / + +Return a copy with each character mapped by the given translation table. + +All characters occurring in the optional argument deletechars are removed. +The remaining characters are mapped through the given translation table. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_translate__doc__, +"translate(table, [deletechars])\n" +"Return a copy with each character mapped by the given translation table.\n" +"\n" +" table\n" +" Translation table, which must be a bytes object of length 256.\n" +"\n" +"All characters occurring in the optional argument deletechars are removed.\n" +"The remaining characters are mapped through the given translation table."); + +#define BYTES_TRANSLATE_METHODDEF \ + {"translate", (PyCFunction)bytes_translate, METH_VARARGS, bytes_translate__doc__}, static PyObject * -bytes_translate(PyBytesObject *self, PyObject *args) +bytes_translate_impl(PyBytesObject *self, PyObject *table, int group_right_1, PyObject *deletechars); + +static PyObject * +bytes_translate(PyObject *self, PyObject *args) +{ + PyObject *return_value = NULL; + PyObject *table; + int group_right_1 = 0; + PyObject *deletechars = NULL; + + switch (PyTuple_GET_SIZE(args)) { + case 1: + if (!PyArg_ParseTuple(args, "O:translate", &table)) + return NULL; + break; + case 2: + if (!PyArg_ParseTuple(args, "OO:translate", &table, &deletechars)) + return NULL; + group_right_1 = 1; + break; + default: + PyErr_SetString(PyExc_TypeError, "bytes.translate requires 1 to 2 arguments"); + return NULL; + } + return_value = bytes_translate_impl((PyBytesObject *)self, table, group_right_1, deletechars); + + return return_value; +} + +static PyObject * +bytes_translate_impl(PyBytesObject *self, PyObject *table, int group_right_1, PyObject *deletechars) +/*[clinic end generated code: checksum=5ebfc00fffd8122849d1e02ee784c29a7228f0bb]*/ { char *input, *output; - const char *table; + const char *table_chars; Py_ssize_t i, c, changed = 0; PyObject *input_obj = (PyObject*)self; - const char *output_start, *del_table=NULL; + const char *output_start, *del_table_chars=NULL; Py_ssize_t inlen, tablen, dellen = 0; PyObject *result; int trans_table[256]; - PyObject *tableobj, *delobj = NULL; - - if (!PyArg_UnpackTuple(args, "translate", 1, 2, - &tableobj, &delobj)) - return NULL; - - if (PyBytes_Check(tableobj)) { - table = PyBytes_AS_STRING(tableobj); - tablen = PyBytes_GET_SIZE(tableobj); + + if (PyBytes_Check(table)) { + table_chars = PyBytes_AS_STRING(table); + tablen = PyBytes_GET_SIZE(table); } - else if (tableobj == Py_None) { - table = NULL; + else if (table == Py_None) { + table_chars = NULL; tablen = 256; } - else if (PyObject_AsCharBuffer(tableobj, &table, &tablen)) + else if (PyObject_AsCharBuffer(table, &table_chars, &tablen)) return NULL; if (tablen != 256) { @@ -1544,16 +1825,16 @@ return NULL; } - if (delobj != NULL) { - if (PyBytes_Check(delobj)) { - del_table = PyBytes_AS_STRING(delobj); - dellen = PyBytes_GET_SIZE(delobj); + if (deletechars != NULL) { + if (PyBytes_Check(deletechars)) { + del_table_chars = PyBytes_AS_STRING(deletechars); + dellen = PyBytes_GET_SIZE(deletechars); } - else if (PyObject_AsCharBuffer(delobj, &del_table, &dellen)) + else if (PyObject_AsCharBuffer(deletechars, &del_table_chars, &dellen)) return NULL; } else { - del_table = NULL; + del_table_chars = NULL; dellen = 0; } @@ -1564,11 +1845,11 @@ output_start = output = PyBytes_AsString(result); input = PyBytes_AS_STRING(input_obj); - if (dellen == 0 && table != NULL) { + if (dellen == 0 && table_chars != NULL) { /* If no deletions are required, use faster code */ for (i = inlen; --i >= 0; ) { c = Py_CHARMASK(*input++); - if (Py_CHARMASK((*output++ = table[c])) != c) + if (Py_CHARMASK((*output++ = table_chars[c])) != c) changed = 1; } if (changed || !PyBytes_CheckExact(input_obj)) @@ -1578,16 +1859,16 @@ return input_obj; } - if (table == NULL) { + if (table_chars == NULL) { for (i = 0; i < 256; i++) trans_table[i] = Py_CHARMASK(i); } else { for (i = 0; i < 256; i++) - trans_table[i] = Py_CHARMASK(table[i]); + trans_table[i] = Py_CHARMASK(table_chars[i]); } for (i = 0; i < dellen; i++) - trans_table[(int) Py_CHARMASK(del_table[i])] = -1; + trans_table[(int) Py_CHARMASK(del_table_chars[i])] = -1; for (i = inlen; --i >= 0; ) { c = Py_CHARMASK(*input++); @@ -1608,10 +1889,60 @@ } +/*[clinic input] + + at staticmethod +bytes.maketrans + + frm: object + to: object + / + +Return a translation table useable for the bytes or bytearray translate method. + +The returned table will be one where each byte in frm is mapped to the byte at +the same position in to. + +The bytes objects frm and to must be of the same length. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_maketrans__doc__, +"maketrans(frm, to)\n" +"Return a translation table useable for the bytes or bytearray translate method.\n" +"\n" +"The returned table will be one where each byte in frm is mapped to the byte at\n" +"the same position in to.\n" +"\n" +"The bytes objects frm and to must be of the same length."); + +#define BYTES_MAKETRANS_METHODDEF \ + {"maketrans", (PyCFunction)bytes_maketrans, METH_VARARGS|METH_STATIC, bytes_maketrans__doc__}, + static PyObject * -bytes_maketrans(PyObject *null, PyObject *args) +bytes_maketrans_impl(void *null, PyObject *frm, PyObject *to); + +static PyObject * +bytes_maketrans(void *null, PyObject *args) { - return _Py_bytes_maketrans(args); + PyObject *return_value = NULL; + PyObject *frm; + PyObject *to; + + if (!PyArg_UnpackTuple(args, "maketrans", + 2, 2, + &frm, &to)) + goto exit; + return_value = bytes_maketrans_impl(null, frm, to); + +exit: + return return_value; +} + +static PyObject * +bytes_maketrans_impl(void *null, PyObject *frm, PyObject *to) +/*[clinic end generated code: checksum=79a066bfdc71b55bd4bc8bce540e34a57ac53a8d]*/ +{ + return _Py_bytes_maketrans(frm, to); } /* find and count characters and substrings */ @@ -2106,41 +2437,82 @@ } } -PyDoc_STRVAR(replace__doc__, -"B.replace(old, new[, count]) -> bytes\n\ -\n\ -Return a copy of B with all occurrences of subsection\n\ -old replaced by new. If the optional argument count is\n\ -given, only first count occurances are replaced."); + +/*[clinic input] +bytes.replace + + old: object + new: object + count: Py_ssize_t = -1 + Maximum number of occurrences to replace. + -1 (the default value) means replace all occurrences. + / + +Return a copy with all occurrences of substring old replaced by new. + +If the optional argument count is given, only the first count occurrences are +replaced. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_replace__doc__, +"replace(old, new, count=-1)\n" +"Return a copy with all occurrences of substring old replaced by new.\n" +"\n" +" count\n" +" Maximum number of occurrences to replace.\n" +" -1 (the default value) means replace all occurrences.\n" +"\n" +"If the optional argument count is given, only the first count occurrences are\n" +"replaced."); + +#define BYTES_REPLACE_METHODDEF \ + {"replace", (PyCFunction)bytes_replace, METH_VARARGS, bytes_replace__doc__}, static PyObject * -bytes_replace(PyBytesObject *self, PyObject *args) +bytes_replace_impl(PyObject *self, PyObject *old, PyObject *new, Py_ssize_t count); + +static PyObject * +bytes_replace(PyObject *self, PyObject *args) { + PyObject *return_value = NULL; + PyObject *old; + PyObject *new; Py_ssize_t count = -1; - PyObject *from, *to; - const char *from_s, *to_s; - Py_ssize_t from_len, to_len; - - if (!PyArg_ParseTuple(args, "OO|n:replace", &from, &to, &count)) + + if (!PyArg_ParseTuple(args, + "OO|n:replace", + &old, &new, &count)) + goto exit; + return_value = bytes_replace_impl(self, old, new, count); + +exit: + return return_value; +} + +static PyObject * +bytes_replace_impl(PyObject *self, PyObject *old, PyObject *new, Py_ssize_t count) +/*[clinic end generated code: checksum=a4dfe745baf7f8a8e6d98d3ed6cb838c588c4caa]*/ +{ + const char *old_s, *new_s; + Py_ssize_t old_len, new_len; + + if (PyBytes_Check(old)) { + old_s = PyBytes_AS_STRING(old); + old_len = PyBytes_GET_SIZE(old); + } + else if (PyObject_AsCharBuffer(old, &old_s, &old_len)) return NULL; - if (PyBytes_Check(from)) { - from_s = PyBytes_AS_STRING(from); - from_len = PyBytes_GET_SIZE(from); + if (PyBytes_Check(new)) { + new_s = PyBytes_AS_STRING(new); + new_len = PyBytes_GET_SIZE(new); } - else if (PyObject_AsCharBuffer(from, &from_s, &from_len)) + else if (PyObject_AsCharBuffer(new, &new_s, &new_len)) return NULL; - if (PyBytes_Check(to)) { - to_s = PyBytes_AS_STRING(to); - to_len = PyBytes_GET_SIZE(to); - } - else if (PyObject_AsCharBuffer(to, &to_s, &to_len)) - return NULL; - return (PyObject *)replace((PyBytesObject *) self, - from_s, from_len, - to_s, to_len, count); + old_s, old_len, + new_s, new_len, count); } /** End DALKE **/ @@ -2274,60 +2646,117 @@ } -PyDoc_STRVAR(decode__doc__, -"B.decode(encoding='utf-8', errors='strict') -> str\n\ -\n\ -Decode B using the codec registered for encoding. Default encoding\n\ -is 'utf-8'. errors may be given to set a different error\n\ -handling scheme. Default is 'strict' meaning that encoding errors raise\n\ -a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\ -as well as any other name registerd with codecs.register_error that is\n\ -able to handle UnicodeDecodeErrors."); +/*[clinic input] +bytes.decode + + encoding: str(c_default="NULL") = 'utf-8' + The encoding with which to decode the bytes. + errors: str(c_default="NULL") = 'strict' + The error handling scheme to use for the handling of decoding errors. + The default is 'strict' meaning that decoding errors raise a + UnicodeDecodeError. Other possible values are 'ignore' and 'replace' + as well as any other name registered with codecs.register_error that + can handle UnicodeDecodeErrors. + +Decode the bytes using the codec registered for encoding. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_decode__doc__, +"decode(encoding=\'utf-8\', errors=\'strict\')\n" +"Decode the bytes using the codec registered for encoding.\n" +"\n" +" encoding\n" +" The encoding with which to decode the bytes.\n" +" errors\n" +" The error handling scheme to use for the handling of decoding errors.\n" +" The default is \'strict\' meaning that decoding errors raise a\n" +" UnicodeDecodeError. Other possible values are \'ignore\' and \'replace\'\n" +" as well as any other name registered with codecs.register_error that\n" +" can handle UnicodeDecodeErrors."); + +#define BYTES_DECODE_METHODDEF \ + {"decode", (PyCFunction)bytes_decode, METH_VARARGS|METH_KEYWORDS, bytes_decode__doc__}, + +static PyObject * +bytes_decode_impl(PyObject *self, const char *encoding, const char *errors); static PyObject * bytes_decode(PyObject *self, PyObject *args, PyObject *kwargs) { + PyObject *return_value = NULL; + static char *_keywords[] = {"encoding", "errors", NULL}; const char *encoding = NULL; const char *errors = NULL; - static char *kwlist[] = {"encoding", "errors", 0}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:decode", kwlist, &encoding, &errors)) - return NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|ss:decode", _keywords, + &encoding, &errors)) + goto exit; + return_value = bytes_decode_impl(self, encoding, errors); + +exit: + return return_value; +} + +static PyObject * +bytes_decode_impl(PyObject *self, const char *encoding, const char *errors) +/*[clinic end generated code: checksum=b6efcc4420539a09d08df3aa733696a7119a22c7]*/ +{ return PyUnicode_FromEncodedObject(self, encoding, errors); } -PyDoc_STRVAR(splitlines__doc__, -"B.splitlines([keepends]) -> list of lines\n\ -\n\ -Return a list of the lines in B, breaking at line boundaries.\n\ -Line breaks are not included in the resulting list unless keepends\n\ -is given and true."); - -static PyObject* -bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwds) +/*[clinic input] +bytes.splitlines + + keepends: int(py_default="False") = 0 + +Return a list of the lines in the bytes, breaking at line boundaries. + +Line breaks are not included in the resulting list unless keepends is given and +true. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_splitlines__doc__, +"splitlines(keepends=False)\n" +"Return a list of the lines in the bytes, breaking at line boundaries.\n" +"\n" +"Line breaks are not included in the resulting list unless keepends is given and\n" +"true."); + +#define BYTES_SPLITLINES_METHODDEF \ + {"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS|METH_KEYWORDS, bytes_splitlines__doc__}, + +static PyObject * +bytes_splitlines_impl(PyObject *self, int keepends); + +static PyObject * +bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwargs) { - static char *kwlist[] = {"keepends", 0}; + PyObject *return_value = NULL; + static char *_keywords[] = {"keepends", NULL}; int keepends = 0; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:splitlines", - kwlist, &keepends)) - return NULL; - + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "|i:splitlines", _keywords, + &keepends)) + goto exit; + return_value = bytes_splitlines_impl(self, keepends); + +exit: + return return_value; +} + +static PyObject * +bytes_splitlines_impl(PyObject *self, int keepends) +/*[clinic end generated code: checksum=462dd01b87dcda72c538d8d89a310fcdab58cc8c]*/ +{ return stringlib_splitlines( (PyObject*) self, PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), keepends ); } - -PyDoc_STRVAR(fromhex_doc, -"bytes.fromhex(string) -> bytes\n\ -\n\ -Create a bytes object from a string of hexadecimal numbers.\n\ -Spaces between two numbers are accepted.\n\ -Example: bytes.fromhex('B9 01EF') -> b'\\xb9\\x01\\xef'."); - static int hex_digit_to_int(Py_UCS4 c) { @@ -2344,24 +2773,65 @@ return -1; } +/*[clinic input] + at classmethod +bytes.fromhex + + string: unicode + / + +Create a bytes object from a string of hexadecimal numbers. + +Spaces between two numbers are accepted. +Example: bytes.fromhex('B9 01EF') -> b'\\xb9\\x01\\xef'. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_fromhex__doc__, +"fromhex(string)\n" +"Create a bytes object from a string of hexadecimal numbers.\n" +"\n" +"Spaces between two numbers are accepted.\n" +"Example: bytes.fromhex(\'B9 01EF\') -> b\'\\xb9\\x01\\xef\'."); + +#define BYTES_FROMHEX_METHODDEF \ + {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, bytes_fromhex__doc__}, + static PyObject * -bytes_fromhex(PyObject *cls, PyObject *args) +bytes_fromhex_impl(PyTypeObject *cls, PyObject *string); + +static PyObject * +bytes_fromhex(PyTypeObject *cls, PyObject *args) { - PyObject *newstring, *hexobj; + PyObject *return_value = NULL; + PyObject *string; + + if (!PyArg_ParseTuple(args, + "U:fromhex", + &string)) + goto exit; + return_value = bytes_fromhex_impl(cls, string); + +exit: + return return_value; +} + +static PyObject * +bytes_fromhex_impl(PyTypeObject *cls, PyObject *string) +/*[clinic end generated code: checksum=0b6825075af40e95429328af699b6aae26ecaf94]*/ +{ + PyObject *newstring; char *buf; Py_ssize_t hexlen, byteslen, i, j; int top, bot; void *data; unsigned int kind; - if (!PyArg_ParseTuple(args, "U:fromhex", &hexobj)) + assert(PyUnicode_Check(string)); + if (PyUnicode_READY(string)) return NULL; - assert(PyUnicode_Check(hexobj)); - if (PyUnicode_READY(hexobj)) - return NULL; - kind = PyUnicode_KIND(hexobj); - data = PyUnicode_DATA(hexobj); - hexlen = PyUnicode_GET_LENGTH(hexobj); + kind = PyUnicode_KIND(string); + data = PyUnicode_DATA(string); + hexlen = PyUnicode_GET_LENGTH(string); byteslen = hexlen/2; /* This overestimates if there are spaces */ newstring = PyBytes_FromStringAndSize(NULL, byteslen); @@ -2393,14 +2863,36 @@ return NULL; } -PyDoc_STRVAR(sizeof__doc__, -"B.__sizeof__() -> size of B in memory, in bytes"); +/*[clinic input] +bytes.__sizeof__ as bytes_sizeof + + self: self(type="PyBytesObject *") + +Returns the size of the bytes object in memory, in bytes. +[clinic start generated code]*/ + +PyDoc_STRVAR(bytes_sizeof__doc__, +"__sizeof__()\n" +"Returns the size of the bytes object in memory, in bytes."); + +#define BYTES_SIZEOF_METHODDEF \ + {"__sizeof__", (PyCFunction)bytes_sizeof, METH_NOARGS, bytes_sizeof__doc__}, static PyObject * -bytes_sizeof(PyBytesObject *v) +bytes_sizeof_impl(PyBytesObject *self); + +static PyObject * +bytes_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) +{ + return bytes_sizeof_impl((PyBytesObject *)self); +} + +static PyObject * +bytes_sizeof_impl(PyBytesObject *self) +/*[clinic end generated code: checksum=354ce9f0aa31e0fc76fa4d8ca5df234c8b78f49a]*/ { Py_ssize_t res; - res = PyBytesObject_SIZE + Py_SIZE(v) * Py_TYPE(v)->tp_itemsize; + res = PyBytesObject_SIZE + Py_SIZE(self) * Py_TYPE(self)->tp_itemsize; return PyLong_FromSsize_t(res); } @@ -2419,14 +2911,13 @@ _Py_capitalize__doc__}, {"center", (PyCFunction)stringlib_center, METH_VARARGS, center__doc__}, {"count", (PyCFunction)bytes_count, METH_VARARGS, count__doc__}, - {"decode", (PyCFunction)bytes_decode, METH_VARARGS | METH_KEYWORDS, decode__doc__}, + BYTES_DECODE_METHODDEF {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, endswith__doc__}, {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, expandtabs__doc__}, {"find", (PyCFunction)bytes_find, METH_VARARGS, find__doc__}, - {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, - fromhex_doc}, + BYTES_FROMHEX_METHODDEF {"index", (PyCFunction)bytes_index, METH_VARARGS, index__doc__}, {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, @@ -2442,36 +2933,31 @@ _Py_istitle__doc__}, {"isupper", (PyCFunction)stringlib_isupper, METH_NOARGS, _Py_isupper__doc__}, - {"join", (PyCFunction)bytes_join, METH_O, join__doc__}, + BYTES_JOIN_METHODDEF {"ljust", (PyCFunction)stringlib_ljust, METH_VARARGS, ljust__doc__}, {"lower", (PyCFunction)stringlib_lower, METH_NOARGS, _Py_lower__doc__}, - {"lstrip", (PyCFunction)bytes_lstrip, METH_VARARGS, lstrip__doc__}, - {"maketrans", (PyCFunction)bytes_maketrans, METH_VARARGS|METH_STATIC, - _Py_maketrans__doc__}, - {"partition", (PyCFunction)bytes_partition, METH_O, partition__doc__}, - {"replace", (PyCFunction)bytes_replace, METH_VARARGS, replace__doc__}, + BYTES_LSTRIP_METHODDEF + BYTES_MAKETRANS_METHODDEF + BYTES_PARTITION_METHODDEF + BYTES_REPLACE_METHODDEF {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, rfind__doc__}, {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, rindex__doc__}, {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, rjust__doc__}, - {"rpartition", (PyCFunction)bytes_rpartition, METH_O, - rpartition__doc__}, - {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS | METH_KEYWORDS, rsplit__doc__}, - {"rstrip", (PyCFunction)bytes_rstrip, METH_VARARGS, rstrip__doc__}, - {"split", (PyCFunction)bytes_split, METH_VARARGS | METH_KEYWORDS, split__doc__}, - {"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS | METH_KEYWORDS, - splitlines__doc__}, + BYTES_RPARTITION_METHODDEF + BYTES_RSPLIT_METHODDEF + BYTES_RSTRIP_METHODDEF + BYTES_SPLIT_METHODDEF + BYTES_SPLITLINES_METHODDEF {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS, startswith__doc__}, - {"strip", (PyCFunction)bytes_strip, METH_VARARGS, strip__doc__}, + BYTES_STRIP_METHODDEF {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, _Py_swapcase__doc__}, {"title", (PyCFunction)stringlib_title, METH_NOARGS, _Py_title__doc__}, - {"translate", (PyCFunction)bytes_translate, METH_VARARGS, - translate__doc__}, + BYTES_TRANSLATE_METHODDEF {"upper", (PyCFunction)stringlib_upper, METH_NOARGS, _Py_upper__doc__}, {"zfill", (PyCFunction)stringlib_zfill, METH_VARARGS, zfill__doc__}, - {"__sizeof__", (PyCFunction)bytes_sizeof, METH_NOARGS, - sizeof__doc__}, + BYTES_SIZEOF_METHODDEF {NULL, NULL} /* sentinel */ }; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 17:29:27 2014 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 27 Jul 2014 17:29:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Rerun_AC=2C_silence_pointe?= =?utf-8?q?r_conversion_warnings=2E?= Message-ID: <3hLp3W2jKyz7LjQ@mail.python.org> http://hg.python.org/cpython/rev/c2b1dea9d90f changeset: 91900:c2b1dea9d90f user: Martin v. L?wis date: Sun Jul 27 17:29:17 2014 +0200 summary: Rerun AC, silence pointer conversion warnings. files: Objects/bytearrayobject.c | 4 +- Objects/bytesobject.c | 173 +++++++++++++++---------- 2 files changed, 103 insertions(+), 74 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -3263,7 +3263,7 @@ { if (encoding == NULL) encoding = PyUnicode_GetDefaultEncoding(); - return PyUnicode_FromEncodedObject(self, encoding, errors); + return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors); } PyDoc_STRVAR(alloc_doc, @@ -3307,7 +3307,7 @@ bytearray_join(PyByteArrayObject *self, PyObject *iterable_of_bytes) /*[clinic end generated code: output=544e7430032dfdf4 input=aba6b1f9b30fcb8e]*/ { - return stringlib_bytes_join(self, iterable_of_bytes); + return stringlib_bytes_join((PyObject*)self, iterable_of_bytes); } /*[clinic input] diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -8,9 +8,9 @@ #include /*[clinic input] -class bytes +class bytes "PyBytesObject*" "&PyBytes_Type" [clinic start generated code]*/ -/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ +/*[clinic end generated code: output=da39a3ee5e6b4b0d input=1a1d9102afc1b00c]*/ static Py_ssize_t _getbuffer(PyObject *obj, Py_buffer *view) @@ -1054,7 +1054,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_split__doc__, -"split(sep=None, maxsplit=-1)\n" +"split($self, /, sep=None, maxsplit=-1)\n" +"--\n" +"\n" "Return a list of the sections in the bytes, using sep as the delimiter.\n" "\n" " sep\n" @@ -1069,10 +1071,10 @@ {"split", (PyCFunction)bytes_split, METH_VARARGS|METH_KEYWORDS, bytes_split__doc__}, static PyObject * -bytes_split_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit); +bytes_split_impl(PyBytesObject*self, PyObject *sep, Py_ssize_t maxsplit); static PyObject * -bytes_split(PyObject *self, PyObject *args, PyObject *kwargs) +bytes_split(PyBytesObject*self, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static char *_keywords[] = {"sep", "maxsplit", NULL}; @@ -1090,8 +1092,8 @@ } static PyObject * -bytes_split_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit) -/*[clinic end generated code: checksum=0c1bf4dba4fc7e03254d9c2f670d8e2682b38785]*/ +bytes_split_impl(PyBytesObject*self, PyObject *sep, Py_ssize_t maxsplit) +/*[clinic end generated code: output=c80a47afdd505975 input=8b809b39074abbfa]*/ { Py_ssize_t len = PyBytes_GET_SIZE(self), n; const char *s = PyBytes_AS_STRING(self), *sub; @@ -1130,7 +1132,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_partition__doc__, -"partition(sep)\n" +"partition($self, sep, /)\n" +"--\n" +"\n" "Partition the bytes into three parts using the given separator.\n" "\n" "This will search for the separator sep in the bytes. If the separator is found,\n" @@ -1145,7 +1149,7 @@ static PyObject * bytes_partition(PyBytesObject *self, PyObject *sep) -/*[clinic end generated code: checksum=02ddd49338037b02d203b165fb2e48c6eb779983]*/ +/*[clinic end generated code: output=b41e119c873c08bc input=6c5b9dcc5a9fd62e]*/ { const char *sep_chars; Py_ssize_t sep_len; @@ -1182,7 +1186,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_rpartition__doc__, -"rpartition(sep)\n" +"rpartition($self, sep, /)\n" +"--\n" +"\n" "Partition the bytes into three parts using the given separator.\n" "\n" "This will search for the separator sep in the bytes, starting and the end. If\n" @@ -1197,7 +1203,7 @@ static PyObject * bytes_rpartition(PyBytesObject *self, PyObject *sep) -/*[clinic end generated code: checksum=af06be67ab873c2792db9961f504350bc99f126a]*/ +/*[clinic end generated code: output=3a620803657196ee input=79bc2932e78e5ce0]*/ { const char *sep_chars; Py_ssize_t sep_len; @@ -1225,7 +1231,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_rsplit__doc__, -"rsplit(sep=None, maxsplit=-1)\n" +"rsplit($self, /, sep=None, maxsplit=-1)\n" +"--\n" +"\n" "Return a list of the sections in the bytes, using sep as the delimiter.\n" "\n" " sep\n" @@ -1242,10 +1250,10 @@ {"rsplit", (PyCFunction)bytes_rsplit, METH_VARARGS|METH_KEYWORDS, bytes_rsplit__doc__}, static PyObject * -bytes_rsplit_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit); +bytes_rsplit_impl(PyBytesObject*self, PyObject *sep, Py_ssize_t maxsplit); static PyObject * -bytes_rsplit(PyObject *self, PyObject *args, PyObject *kwargs) +bytes_rsplit(PyBytesObject*self, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static char *_keywords[] = {"sep", "maxsplit", NULL}; @@ -1263,8 +1271,8 @@ } static PyObject * -bytes_rsplit_impl(PyObject *self, PyObject *sep, Py_ssize_t maxsplit) -/*[clinic end generated code: checksum=f5bcee1d73b31b9df8821731f4ed3a8d1bc78588]*/ +bytes_rsplit_impl(PyBytesObject*self, PyObject *sep, Py_ssize_t maxsplit) +/*[clinic end generated code: output=f86feddedbd7b26d input=0f86c9f28f7d7b7b]*/ { Py_ssize_t len = PyBytes_GET_SIZE(self), n; const char *s = PyBytes_AS_STRING(self), *sub; @@ -1302,7 +1310,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_join__doc__, -"join(iterable_of_bytes)\n" +"join($self, iterable_of_bytes, /)\n" +"--\n" +"\n" "Concatenate any number of bytes objects.\n" "\n" "The bytes whose method is called is inserted in between each pair.\n" @@ -1315,10 +1325,10 @@ {"join", (PyCFunction)bytes_join, METH_O, bytes_join__doc__}, static PyObject * -bytes_join(PyObject *self, PyObject *iterable_of_bytes) -/*[clinic end generated code: checksum=3fa2b5fc3b1494ba4db416303571f4ecd055090b]*/ +bytes_join(PyBytesObject*self, PyObject *iterable_of_bytes) +/*[clinic end generated code: output=e541a14a8da97908 input=7fe377b95bd549d2]*/ { - return stringlib_bytes_join(self, iterable_of_bytes); + return stringlib_bytes_join((PyObject*)self, iterable_of_bytes); } PyObject * @@ -1326,7 +1336,7 @@ { assert(sep != NULL && PyBytes_Check(sep)); assert(x != NULL); - return bytes_join(sep, x); + return bytes_join((PyBytesObject*)sep, x); } /* helper macro to fixup start/end slice values */ @@ -1558,7 +1568,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_strip__doc__, -"strip(bytes=None)\n" +"strip($self, bytes=None, /)\n" +"--\n" +"\n" "Strip leading and trailing bytes contained in the argument.\n" "\n" "If the argument is omitted or None, strip leading and trailing ASCII whitespace."); @@ -1570,7 +1582,7 @@ bytes_strip_impl(PyBytesObject *self, PyObject *bytes); static PyObject * -bytes_strip(PyObject *self, PyObject *args) +bytes_strip(PyBytesObject *self, PyObject *args) { PyObject *return_value = NULL; PyObject *bytes = Py_None; @@ -1579,7 +1591,7 @@ 0, 1, &bytes)) goto exit; - return_value = bytes_strip_impl((PyBytesObject *)self, bytes); + return_value = bytes_strip_impl(self, bytes); exit: return return_value; @@ -1587,7 +1599,7 @@ static PyObject * bytes_strip_impl(PyBytesObject *self, PyObject *bytes) -/*[clinic end generated code: checksum=3c59229e9332a1782987f047d43a9526a3b3c90f]*/ +/*[clinic end generated code: output=c8234a599ba5ec35 input=37daa5fad1395d95]*/ { return do_argstrip(self, BOTHSTRIP, bytes); } @@ -1605,7 +1617,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_lstrip__doc__, -"lstrip(bytes=None)\n" +"lstrip($self, bytes=None, /)\n" +"--\n" +"\n" "Strip leading bytes contained in the argument.\n" "\n" "If the argument is omitted or None, strip leading ASCII whitespace."); @@ -1617,7 +1631,7 @@ bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes); static PyObject * -bytes_lstrip(PyObject *self, PyObject *args) +bytes_lstrip(PyBytesObject *self, PyObject *args) { PyObject *return_value = NULL; PyObject *bytes = Py_None; @@ -1626,7 +1640,7 @@ 0, 1, &bytes)) goto exit; - return_value = bytes_lstrip_impl((PyBytesObject *)self, bytes); + return_value = bytes_lstrip_impl(self, bytes); exit: return return_value; @@ -1634,7 +1648,7 @@ static PyObject * bytes_lstrip_impl(PyBytesObject *self, PyObject *bytes) -/*[clinic end generated code: checksum=34a0a2cae35c06ad984c5657659d4d28ec0e407a]*/ +/*[clinic end generated code: output=529e8511ab6f1115 input=88811b09dfbc2988]*/ { return do_argstrip(self, LEFTSTRIP, bytes); } @@ -1652,7 +1666,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_rstrip__doc__, -"rstrip(bytes=None)\n" +"rstrip($self, bytes=None, /)\n" +"--\n" +"\n" "Strip trailing bytes contained in the argument.\n" "\n" "If the argument is omitted or None, strip trailing ASCII whitespace."); @@ -1664,7 +1680,7 @@ bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes); static PyObject * -bytes_rstrip(PyObject *self, PyObject *args) +bytes_rstrip(PyBytesObject *self, PyObject *args) { PyObject *return_value = NULL; PyObject *bytes = Py_None; @@ -1673,7 +1689,7 @@ 0, 1, &bytes)) goto exit; - return_value = bytes_rstrip_impl((PyBytesObject *)self, bytes); + return_value = bytes_rstrip_impl(self, bytes); exit: return return_value; @@ -1681,7 +1697,7 @@ static PyObject * bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes) -/*[clinic end generated code: checksum=eeb1b0cff2f4bfbad7324eea81dd9dec2a872ad6]*/ +/*[clinic end generated code: output=e98730bd133e6593 input=8f93c9cd361f0140]*/ { return do_argstrip(self, RIGHTSTRIP, bytes); } @@ -1769,7 +1785,7 @@ bytes_translate_impl(PyBytesObject *self, PyObject *table, int group_right_1, PyObject *deletechars); static PyObject * -bytes_translate(PyObject *self, PyObject *args) +bytes_translate(PyBytesObject *self, PyObject *args) { PyObject *return_value = NULL; PyObject *table; @@ -1779,25 +1795,26 @@ switch (PyTuple_GET_SIZE(args)) { case 1: if (!PyArg_ParseTuple(args, "O:translate", &table)) - return NULL; + goto exit; break; case 2: if (!PyArg_ParseTuple(args, "OO:translate", &table, &deletechars)) - return NULL; + goto exit; group_right_1 = 1; break; default: PyErr_SetString(PyExc_TypeError, "bytes.translate requires 1 to 2 arguments"); - return NULL; + goto exit; } - return_value = bytes_translate_impl((PyBytesObject *)self, table, group_right_1, deletechars); - + return_value = bytes_translate_impl(self, table, group_right_1, deletechars); + +exit: return return_value; } static PyObject * bytes_translate_impl(PyBytesObject *self, PyObject *table, int group_right_1, PyObject *deletechars) -/*[clinic end generated code: checksum=5ebfc00fffd8122849d1e02ee784c29a7228f0bb]*/ +/*[clinic end generated code: output=f0f29a57f41df5d8 input=a90fad893c3c88d7]*/ { char *input, *output; const char *table_chars; @@ -1907,7 +1924,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_maketrans__doc__, -"maketrans(frm, to)\n" +"maketrans(frm, to, /)\n" +"--\n" +"\n" "Return a translation table useable for the bytes or bytearray translate method.\n" "\n" "The returned table will be one where each byte in frm is mapped to the byte at\n" @@ -1919,7 +1938,7 @@ {"maketrans", (PyCFunction)bytes_maketrans, METH_VARARGS|METH_STATIC, bytes_maketrans__doc__}, static PyObject * -bytes_maketrans_impl(void *null, PyObject *frm, PyObject *to); +bytes_maketrans_impl(PyObject *frm, PyObject *to); static PyObject * bytes_maketrans(void *null, PyObject *args) @@ -1932,15 +1951,15 @@ 2, 2, &frm, &to)) goto exit; - return_value = bytes_maketrans_impl(null, frm, to); + return_value = bytes_maketrans_impl(frm, to); exit: return return_value; } static PyObject * -bytes_maketrans_impl(void *null, PyObject *frm, PyObject *to) -/*[clinic end generated code: checksum=79a066bfdc71b55bd4bc8bce540e34a57ac53a8d]*/ +bytes_maketrans_impl(PyObject *frm, PyObject *to) +/*[clinic end generated code: output=89a3c3556975e466 input=d204f680f85da382]*/ { return _Py_bytes_maketrans(frm, to); } @@ -2455,7 +2474,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_replace__doc__, -"replace(old, new, count=-1)\n" +"replace($self, old, new, count=-1, /)\n" +"--\n" +"\n" "Return a copy with all occurrences of substring old replaced by new.\n" "\n" " count\n" @@ -2469,10 +2490,10 @@ {"replace", (PyCFunction)bytes_replace, METH_VARARGS, bytes_replace__doc__}, static PyObject * -bytes_replace_impl(PyObject *self, PyObject *old, PyObject *new, Py_ssize_t count); +bytes_replace_impl(PyBytesObject*self, PyObject *old, PyObject *new, Py_ssize_t count); static PyObject * -bytes_replace(PyObject *self, PyObject *args) +bytes_replace(PyBytesObject*self, PyObject *args) { PyObject *return_value = NULL; PyObject *old; @@ -2490,8 +2511,8 @@ } static PyObject * -bytes_replace_impl(PyObject *self, PyObject *old, PyObject *new, Py_ssize_t count) -/*[clinic end generated code: checksum=a4dfe745baf7f8a8e6d98d3ed6cb838c588c4caa]*/ +bytes_replace_impl(PyBytesObject*self, PyObject *old, PyObject *new, Py_ssize_t count) +/*[clinic end generated code: output=14ce72f4f9cb91cf input=d3ac254ea50f4ac1]*/ { const char *old_s, *new_s; Py_ssize_t old_len, new_len; @@ -2662,7 +2683,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_decode__doc__, -"decode(encoding=\'utf-8\', errors=\'strict\')\n" +"decode($self, /, encoding=\'utf-8\', errors=\'strict\')\n" +"--\n" +"\n" "Decode the bytes using the codec registered for encoding.\n" "\n" " encoding\n" @@ -2678,10 +2701,10 @@ {"decode", (PyCFunction)bytes_decode, METH_VARARGS|METH_KEYWORDS, bytes_decode__doc__}, static PyObject * -bytes_decode_impl(PyObject *self, const char *encoding, const char *errors); +bytes_decode_impl(PyBytesObject*self, const char *encoding, const char *errors); static PyObject * -bytes_decode(PyObject *self, PyObject *args, PyObject *kwargs) +bytes_decode(PyBytesObject*self, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static char *_keywords[] = {"encoding", "errors", NULL}; @@ -2699,10 +2722,10 @@ } static PyObject * -bytes_decode_impl(PyObject *self, const char *encoding, const char *errors) -/*[clinic end generated code: checksum=b6efcc4420539a09d08df3aa733696a7119a22c7]*/ +bytes_decode_impl(PyBytesObject*self, const char *encoding, const char *errors) +/*[clinic end generated code: output=61a80290bbfce696 input=958174769d2a40ca]*/ { - return PyUnicode_FromEncodedObject(self, encoding, errors); + return PyUnicode_FromEncodedObject((PyObject*)self, encoding, errors); } @@ -2718,7 +2741,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_splitlines__doc__, -"splitlines(keepends=False)\n" +"splitlines($self, /, keepends=False)\n" +"--\n" +"\n" "Return a list of the lines in the bytes, breaking at line boundaries.\n" "\n" "Line breaks are not included in the resulting list unless keepends is given and\n" @@ -2728,10 +2753,10 @@ {"splitlines", (PyCFunction)bytes_splitlines, METH_VARARGS|METH_KEYWORDS, bytes_splitlines__doc__}, static PyObject * -bytes_splitlines_impl(PyObject *self, int keepends); +bytes_splitlines_impl(PyBytesObject*self, int keepends); static PyObject * -bytes_splitlines(PyObject *self, PyObject *args, PyObject *kwargs) +bytes_splitlines(PyBytesObject*self, PyObject *args, PyObject *kwargs) { PyObject *return_value = NULL; static char *_keywords[] = {"keepends", NULL}; @@ -2748,8 +2773,8 @@ } static PyObject * -bytes_splitlines_impl(PyObject *self, int keepends) -/*[clinic end generated code: checksum=462dd01b87dcda72c538d8d89a310fcdab58cc8c]*/ +bytes_splitlines_impl(PyBytesObject*self, int keepends) +/*[clinic end generated code: output=79da057d05d126de input=ddb93e3351080c8c]*/ { return stringlib_splitlines( (PyObject*) self, PyBytes_AS_STRING(self), @@ -2787,20 +2812,22 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_fromhex__doc__, -"fromhex(string)\n" +"fromhex($type, string, /)\n" +"--\n" +"\n" "Create a bytes object from a string of hexadecimal numbers.\n" "\n" "Spaces between two numbers are accepted.\n" -"Example: bytes.fromhex(\'B9 01EF\') -> b\'\\xb9\\x01\\xef\'."); +"Example: bytes.fromhex(\'B9 01EF\') -> b\'\\\\xb9\\\\x01\\\\xef\'."); #define BYTES_FROMHEX_METHODDEF \ {"fromhex", (PyCFunction)bytes_fromhex, METH_VARARGS|METH_CLASS, bytes_fromhex__doc__}, static PyObject * -bytes_fromhex_impl(PyTypeObject *cls, PyObject *string); +bytes_fromhex_impl(PyTypeObject *type, PyObject *string); static PyObject * -bytes_fromhex(PyTypeObject *cls, PyObject *args) +bytes_fromhex(PyTypeObject *type, PyObject *args) { PyObject *return_value = NULL; PyObject *string; @@ -2809,15 +2836,15 @@ "U:fromhex", &string)) goto exit; - return_value = bytes_fromhex_impl(cls, string); + return_value = bytes_fromhex_impl(type, string); exit: return return_value; } static PyObject * -bytes_fromhex_impl(PyTypeObject *cls, PyObject *string) -/*[clinic end generated code: checksum=0b6825075af40e95429328af699b6aae26ecaf94]*/ +bytes_fromhex_impl(PyTypeObject *type, PyObject *string) +/*[clinic end generated code: output=09e6cbef56cbbb65 input=bf4d1c361670acd3]*/ { PyObject *newstring; char *buf; @@ -2872,7 +2899,9 @@ [clinic start generated code]*/ PyDoc_STRVAR(bytes_sizeof__doc__, -"__sizeof__()\n" +"__sizeof__($self, /)\n" +"--\n" +"\n" "Returns the size of the bytes object in memory, in bytes."); #define BYTES_SIZEOF_METHODDEF \ @@ -2882,14 +2911,14 @@ bytes_sizeof_impl(PyBytesObject *self); static PyObject * -bytes_sizeof(PyObject *self, PyObject *Py_UNUSED(ignored)) +bytes_sizeof(PyBytesObject *self, PyObject *Py_UNUSED(ignored)) { - return bytes_sizeof_impl((PyBytesObject *)self); + return bytes_sizeof_impl(self); } static PyObject * bytes_sizeof_impl(PyBytesObject *self) -/*[clinic end generated code: checksum=354ce9f0aa31e0fc76fa4d8ca5df234c8b78f49a]*/ +/*[clinic end generated code: output=44933279343f24ae input=bee4c64bb42078ed]*/ { Py_ssize_t res; res = PyBytesObject_SIZE + Py_SIZE(self) * Py_TYPE(self)->tp_itemsize; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Jul 27 22:23:36 2014 From: python-checkins at python.org (berker.peksag) Date: Sun, 27 Jul 2014 22:23:36 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322076=3A_Minor_gr?= =?utf-8?q?ammar_fix=2E?= Message-ID: <3hLwZw0nfRz7Ljv@mail.python.org> http://hg.python.org/cpython/rev/c0c7da9f0069 changeset: 91901:c0c7da9f0069 user: Berker Peksag date: Sun Jul 27 23:22:34 2014 +0300 summary: Issue #22076: Minor grammar fix. Patch by Martin Matusiak. files: Lib/test/test_csv.py | 6 +++--- Modules/_csv.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py --- a/Lib/test/test_csv.py +++ b/Lib/test/test_csv.py @@ -783,7 +783,7 @@ with self.assertRaises(csv.Error) as cm: mydialect() self.assertEqual(str(cm.exception), - '"quotechar" must be an 1-character string') + '"quotechar" must be a 1-character string') mydialect.quotechar = 4 with self.assertRaises(csv.Error) as cm: @@ -806,13 +806,13 @@ with self.assertRaises(csv.Error) as cm: mydialect() self.assertEqual(str(cm.exception), - '"delimiter" must be an 1-character string') + '"delimiter" must be a 1-character string') mydialect.delimiter = "" with self.assertRaises(csv.Error) as cm: mydialect() self.assertEqual(str(cm.exception), - '"delimiter" must be an 1-character string') + '"delimiter" must be a 1-character string') mydialect.delimiter = b"," with self.assertRaises(csv.Error) as cm: diff --git a/Modules/_csv.c b/Modules/_csv.c --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -248,7 +248,7 @@ len = PyUnicode_GetLength(src); if (len > 1) { PyErr_Format(PyExc_TypeError, - "\"%s\" must be an 1-character string", + "\"%s\" must be a 1-character string", name); return -1; } @@ -432,7 +432,7 @@ goto err; if (self->delimiter == 0) { PyErr_SetString(PyExc_TypeError, - "\"delimiter\" must be an 1-character string"); + "\"delimiter\" must be a 1-character string"); goto err; } if (quotechar == Py_None && quoting == NULL) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 28 00:19:53 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 28 Jul 2014 00:19:53 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbywgdHVs?= =?utf-8?q?ip_issue_196=3A_ProactorIocp=2E=5Fregister=28=29_now_registers_?= =?utf-8?q?the_overlapped?= Message-ID: <3hLz955RFcz7LjP@mail.python.org> http://hg.python.org/cpython/rev/ad291f7e297d changeset: 91902:ad291f7e297d branch: 3.4 parent: 91893:024d5655a20b user: Victor Stinner date: Mon Jul 28 00:18:43 2014 +0200 summary: asyncio, tulip issue 196: ProactorIocp._register() now registers the overlapped in the _cache dictionary, even if we already got the result. We need to keep a reference to the overlapped object, otherwise the memory may be reused and GetQueuedCompletionStatus() may use random bytes and behaves badly. There is still a hack for ConnectNamedPipe(): the overlapped object is not register into _cache if the overlapped object completed directly. Log also an error in debug mode in ProactorIocp._loop() if we get an unexpected event. Add a protection in ProactorIocp.close() to avoid blocking, even if it should not happen. I still don't understand exactly why some the completion of some overlapped objects are not notified. files: Lib/asyncio/windows_events.py | 53 ++++++++++++++++------ 1 files changed, 38 insertions(+), 15 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -369,7 +369,10 @@ ov.getresult() return pipe - return self._register(ov, pipe, finish_accept_pipe) + # FIXME: Tulip issue 196: why to we neeed register=False? + # See also the comment in the _register() method + return self._register(ov, pipe, finish_accept_pipe, + register=False) def connect_pipe(self, address): ov = _overlapped.Overlapped(NULL) @@ -429,17 +432,13 @@ # to avoid sending notifications to completion port of ops # that succeed immediately. - def _register(self, ov, obj, callback, wait_for_post=False): + def _register(self, ov, obj, callback, + wait_for_post=False, register=True): # Return a future which will be set with the result of the # operation when it completes. The future's value is actually # the value returned by callback(). f = _OverlappedFuture(ov, loop=self._loop) - if ov.pending or wait_for_post: - # Register the overlapped operation for later. Note that - # we only store obj to prevent it from being garbage - # collected too early. - self._cache[ov.address] = (f, ov, obj, callback) - else: + if not ov.pending and not wait_for_post: # The operation has completed, so no need to postpone the # work. We cannot take this short cut if we need the # NumberOfBytes, CompletionKey values returned by @@ -450,6 +449,23 @@ f.set_exception(e) else: f.set_result(value) + # Even if GetOverlappedResult() was called, we have to wait for the + # notification of the completion in GetQueuedCompletionStatus(). + # Register the overlapped operation to keep a reference to the + # OVERLAPPED object, otherwise the memory is freed and Windows may + # read uninitialized memory. + # + # For an unknown reason, ConnectNamedPipe() behaves differently: + # the completion is not notified by GetOverlappedResult() if we + # already called GetOverlappedResult(). For this specific case, we + # don't expect notification (register is set to False). + else: + register = True + if register: + # Register the overlapped operation for later. Note that + # we only store obj to prevent it from being garbage + # collected too early. + self._cache[ov.address] = (f, ov, obj, callback) return f def _get_accept_socket(self, family): @@ -476,6 +492,14 @@ try: f, ov, obj, callback = self._cache.pop(address) except KeyError: + if self._loop.get_debug(): + self._loop.call_exception_handler({ + 'message': ('GetQueuedCompletionStatus() returned an ' + 'unexpected event'), + 'status': ('err=%s transferred=%s key=%#x address=%#x' + % (err, transferred, key, address)), + }) + # key is either zero, or it is used to return a pipe # handle which should be closed to avoid a leak. if key not in (0, _overlapped.INVALID_HANDLE_VALUE): @@ -483,15 +507,11 @@ ms = 0 continue - if ov.pending: - # False alarm: the overlapped operation is not completed. - # FIXME: why do we get false alarms? - self._cache[address] = (f, ov, obj, callback) - continue - if obj in self._stopped_serving: f.cancel() - elif not f.cancelled(): + # Don't call the callback if _register() already read the result or + # if the overlapped has been cancelled + elif not f.done(): try: value = callback(transferred, key, ov) except OSError as e: @@ -516,6 +536,9 @@ # queues a task to Windows' thread pool. This cannot # be cancelled, so just forget it. del self._cache[address] + # FIXME: Tulip issue 196: remove this case, it should not happen + elif fut.done() and not fut.cancelled(): + del self._cache[address] else: try: fut.cancel() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Jul 28 00:19:55 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 28 Jul 2014 00:19:55 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=2C_tulip_issue_196=3A_Proactor?= =?utf-8?q?Iocp=2E=5Fregister=28=29_now_registers?= Message-ID: <3hLz9719llz7Lk6@mail.python.org> http://hg.python.org/cpython/rev/8c1438c15ed0 changeset: 91903:8c1438c15ed0 parent: 91901:c0c7da9f0069 parent: 91902:ad291f7e297d user: Victor Stinner date: Mon Jul 28 00:19:36 2014 +0200 summary: (Merge 3.4) asyncio, tulip issue 196: ProactorIocp._register() now registers the overlapped in the _cache dictionary, even if we already got the result. We need to keep a reference to the overlapped object, otherwise the memory may be reused and GetQueuedCompletionStatus() may use random bytes and behaves badly. There is still a hack for ConnectNamedPipe(): the overlapped object is not register into _cache if the overlapped object completed directly. Log also an error in debug mode in ProactorIocp._loop() if we get an unexpected event. Add a protection in ProactorIocp.close() to avoid blocking, even if it should not happen. I still don't understand exactly why some the completion of some overlapped objects are not notified. files: Lib/asyncio/windows_events.py | 53 ++++++++++++++++------ 1 files changed, 38 insertions(+), 15 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -369,7 +369,10 @@ ov.getresult() return pipe - return self._register(ov, pipe, finish_accept_pipe) + # FIXME: Tulip issue 196: why to we neeed register=False? + # See also the comment in the _register() method + return self._register(ov, pipe, finish_accept_pipe, + register=False) def connect_pipe(self, address): ov = _overlapped.Overlapped(NULL) @@ -429,17 +432,13 @@ # to avoid sending notifications to completion port of ops # that succeed immediately. - def _register(self, ov, obj, callback, wait_for_post=False): + def _register(self, ov, obj, callback, + wait_for_post=False, register=True): # Return a future which will be set with the result of the # operation when it completes. The future's value is actually # the value returned by callback(). f = _OverlappedFuture(ov, loop=self._loop) - if ov.pending or wait_for_post: - # Register the overlapped operation for later. Note that - # we only store obj to prevent it from being garbage - # collected too early. - self._cache[ov.address] = (f, ov, obj, callback) - else: + if not ov.pending and not wait_for_post: # The operation has completed, so no need to postpone the # work. We cannot take this short cut if we need the # NumberOfBytes, CompletionKey values returned by @@ -450,6 +449,23 @@ f.set_exception(e) else: f.set_result(value) + # Even if GetOverlappedResult() was called, we have to wait for the + # notification of the completion in GetQueuedCompletionStatus(). + # Register the overlapped operation to keep a reference to the + # OVERLAPPED object, otherwise the memory is freed and Windows may + # read uninitialized memory. + # + # For an unknown reason, ConnectNamedPipe() behaves differently: + # the completion is not notified by GetOverlappedResult() if we + # already called GetOverlappedResult(). For this specific case, we + # don't expect notification (register is set to False). + else: + register = True + if register: + # Register the overlapped operation for later. Note that + # we only store obj to prevent it from being garbage + # collected too early. + self._cache[ov.address] = (f, ov, obj, callback) return f def _get_accept_socket(self, family): @@ -476,6 +492,14 @@ try: f, ov, obj, callback = self._cache.pop(address) except KeyError: + if self._loop.get_debug(): + self._loop.call_exception_handler({ + 'message': ('GetQueuedCompletionStatus() returned an ' + 'unexpected event'), + 'status': ('err=%s transferred=%s key=%#x address=%#x' + % (err, transferred, key, address)), + }) + # key is either zero, or it is used to return a pipe # handle which should be closed to avoid a leak. if key not in (0, _overlapped.INVALID_HANDLE_VALUE): @@ -483,15 +507,11 @@ ms = 0 continue - if ov.pending: - # False alarm: the overlapped operation is not completed. - # FIXME: why do we get false alarms? - self._cache[address] = (f, ov, obj, callback) - continue - if obj in self._stopped_serving: f.cancel() - elif not f.cancelled(): + # Don't call the callback if _register() already read the result or + # if the overlapped has been cancelled + elif not f.done(): try: value = callback(transferred, key, ov) except OSError as e: @@ -516,6 +536,9 @@ # queues a task to Windows' thread pool. This cannot # be cancelled, so just forget it. del self._cache[address] + # FIXME: Tulip issue 196: remove this case, it should not happen + elif fut.done() and not fut.cancelled(): + del self._cache[address] else: try: fut.cancel() -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Jul 28 09:55:31 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 28 Jul 2014 09:55:31 +0200 Subject: [Python-checkins] Daily reference leaks (8c1438c15ed0): sum=-264 Message-ID: results for 8c1438c15ed0 on branch "default" -------------------------------------------- test_asyncio leaked [-106, 106, -212] references, sum=-212 test_asyncio leaked [-30, 32, -61] memory blocks, sum=-59 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [2, -2, 2] references, sum=2 test_site leaked [2, -2, 2] memory blocks, sum=2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog7kO2_Z', '-x'] From python-checkins at python.org Mon Jul 28 12:50:20 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 28 Jul 2014 12:50:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_475=3A_simplify_example?= Message-ID: <3hMHq05F4mz7LjT@mail.python.org> http://hg.python.org/peps/rev/395b68e3f933 changeset: 5509:395b68e3f933 user: Victor Stinner date: Mon Jul 28 12:50:14 2014 +0200 summary: PEP 475: simplify example files: pep-0475.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0475.txt b/pep-0475.txt --- a/pep-0475.txt +++ b/pep-0475.txt @@ -68,7 +68,7 @@ while True: try: - data = file.read() + data = file.read(size) break except InterruptedError: continue -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Jul 28 15:02:44 2014 From: python-checkins at python.org (victor.stinner) Date: Mon, 28 Jul 2014 15:02:44 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_475=3A_another_signal_iss?= =?utf-8?q?ue?= Message-ID: <3hMLlm3348zQrB@mail.python.org> http://hg.python.org/peps/rev/3a589f5bd312 changeset: 5510:3a589f5bd312 user: Victor Stinner date: Mon Jul 28 15:02:38 2014 +0200 summary: PEP 475: another signal issue files: pep-0475.txt | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/pep-0475.txt b/pep-0475.txt --- a/pep-0475.txt +++ b/pep-0475.txt @@ -380,6 +380,8 @@ Open issues: +* `signal.default_int_handler should set signal number on the raised + exception `_ * `expose signalfd(2) in the signal module `_ * `missing return in win32_kill? -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Jul 29 00:07:13 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 00:07:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogRml4IHRlc3RfYnl0?= =?utf-8?q?es_when_sys=2Estdin_is_None=2C_for_example_on_Windows_when_usin?= =?utf-8?q?g?= Message-ID: <3hMZr14hwhz7LkZ@mail.python.org> http://hg.python.org/cpython/rev/a1e01081e731 changeset: 91904:a1e01081e731 branch: 3.4 parent: 91902:ad291f7e297d user: Victor Stinner date: Mon Jul 28 22:07:07 2014 +0200 summary: Fix test_bytes when sys.stdin is None, for example on Windows when using pythonw.exe instead of python.exe files: Lib/test/test_bytes.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) 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 @@ -700,7 +700,7 @@ type2test = bytes def test_buffer_is_readonly(self): - fd = os.dup(sys.stdin.fileno()) + fd = os.open(__file__, os.O_RDONLY) with open(fd, "rb", buffering=0) as f: self.assertRaises(TypeError, f.readinto, b"") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 00:07:14 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 00:07:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE5NjEy?= =?utf-8?q?=3A_subprocess=2Ecommunicate=28=29_now_also_ignores_EINVAL_when?= =?utf-8?q?_using_at?= Message-ID: <3hMZr26Z0jz7Lkw@mail.python.org> http://hg.python.org/cpython/rev/039ac3f01c4e changeset: 91905:039ac3f01c4e branch: 2.7 parent: 91895:bffa0b8a16e8 user: Victor Stinner date: Tue Jul 29 00:04:54 2014 +0200 summary: Issue #19612: subprocess.communicate() now also ignores EINVAL when using at least two pipes. files: Lib/subprocess.py | 10 +++++++++- Misc/NEWS | 3 +++ 2 files changed, 12 insertions(+), 1 deletions(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -1035,7 +1035,15 @@ try: self.stdin.write(input) except IOError as e: - if e.errno != errno.EPIPE: + if e.errno == errno.EPIPE: + # communicate() should ignore broken pipe error + pass + elif (e.errno == errno.EINVAL + and self.poll() is not None): + # Issue #19612: stdin.write() fails with EINVAL + # if the process already exited before the write + pass + else: raise self.stdin.close() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #19612: subprocess.communicate() now also ignores EINVAL when using at + least two pipes. + - Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 00:08:18 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 00:08:18 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Fix_test=5Fbytes_when_sys=2Estdin_is_N?= =?utf-8?q?one=2C_for_example_on_Windows_when?= Message-ID: <3hMZsG6hC5z7LjR@mail.python.org> http://hg.python.org/cpython/rev/ed308c4c72f0 changeset: 91906:ed308c4c72f0 parent: 91903:8c1438c15ed0 parent: 91904:a1e01081e731 user: Victor Stinner date: Tue Jul 29 00:07:56 2014 +0200 summary: (Merge 3.4) Fix test_bytes when sys.stdin is None, for example on Windows when using pythonw.exe instead of python.exe files: Lib/test/test_bytes.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) 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 @@ -700,7 +700,7 @@ type2test = bytes def test_buffer_is_readonly(self): - fd = os.dup(sys.stdin.fileno()) + fd = os.open(__file__, os.O_RDONLY) with open(fd, "rb", buffering=0) as f: self.assertRaises(TypeError, f.readinto, b"") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 00:16:34 2014 From: python-checkins at python.org (richard.oudkerk) Date: Tue, 29 Jul 2014 00:16:34 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNzA0?= =?utf-8?q?=3A_Fix_build_error_for_=5Fmultiprocessing_when_semaphores?= Message-ID: <3hMb2p3G4zz7Lkb@mail.python.org> http://hg.python.org/cpython/rev/f618f6739200 changeset: 91907:f618f6739200 branch: 3.4 parent: 91904:a1e01081e731 user: Richard Oudkerk date: Mon Jul 28 23:01:02 2014 +0100 summary: Issue #21704: Fix build error for _multiprocessing when semaphores are not available. Patch by Arfrever Frehtes Taifersar Arahesis. files: Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_multiprocessing/multiprocessing.c | 2 ++ 3 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -51,6 +51,7 @@ Jon Anglin Heidi Annexstad Ramchandra Apte +Arfrever Frehtes Taifersar Arahesis ?ric Araujo Alicia Arlen Jeffrey Armstrong diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21704: Fix build error for _multiprocessing when semaphores + are not available. Patch by Arfrever Frehtes Taifersar Arahesis. + - Fix repr(_socket.socket) on Windows 64-bit: don't fail with OverflowError on closed socket. repr(socket.socket) already works fine. diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -128,7 +128,9 @@ {"recv", multiprocessing_recv, METH_VARARGS, ""}, {"send", multiprocessing_send, METH_VARARGS, ""}, #endif +#ifndef POSIX_SEMAPHORES_NOT_ENABLED {"sem_unlink", _PyMp_sem_unlink, METH_VARARGS, ""}, +#endif {NULL} }; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 00:16:35 2014 From: python-checkins at python.org (richard.oudkerk) Date: Tue, 29 Jul 2014 00:16:35 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogSXNzdWUgIzIxNzA0OiBNZXJnZS4=?= Message-ID: <3hMb2q4zk2z7LjY@mail.python.org> http://hg.python.org/cpython/rev/a9637b29954d changeset: 91908:a9637b29954d parent: 91906:ed308c4c72f0 parent: 91907:f618f6739200 user: Richard Oudkerk date: Mon Jul 28 23:13:58 2014 +0100 summary: Issue #21704: Merge. files: Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_multiprocessing/multiprocessing.c | 2 ++ 3 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -52,6 +52,7 @@ Jon Anglin Heidi Annexstad Ramchandra Apte +Arfrever Frehtes Taifersar Arahesis ?ric Araujo Alicia Arlen Jeffrey Armstrong diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- Issue #21704: Fix build error for _multiprocessing when semaphores + are not available. Patch by Arfrever Frehtes Taifersar Arahesis. + - Issue #20173: Convert sha1, sha256, sha512 and md5 to ArgumentClinic. Patch by Vajrasky Kok. diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -128,7 +128,9 @@ {"recv", multiprocessing_recv, METH_VARARGS, ""}, {"send", multiprocessing_send, METH_VARARGS, ""}, #endif +#ifndef POSIX_SEMAPHORES_NOT_ENABLED {"sem_unlink", _PyMp_sem_unlink, METH_VARARGS, ""}, +#endif {NULL} }; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 00:46:40 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 00:46:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Fix_sporadic_f?= =?utf-8?q?ailure_of_test=5Fpep277_on_Windows=3A_use_support=2Ermtree=28?= =?utf-8?q?=29_instead_of?= Message-ID: <3hMbjX19X2z7Ljr@mail.python.org> http://hg.python.org/cpython/rev/bc70c1da7faf changeset: 91909:bc70c1da7faf branch: 3.4 parent: 91907:f618f6739200 user: Victor Stinner date: Tue Jul 29 00:40:50 2014 +0200 summary: Fix sporadic failure of test_pep277 on Windows: use support.rmtree() instead of deltree(). files: Lib/test/test_pep277.py | 33 +++++++--------------------- 1 files changed, 9 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py --- a/Lib/test/test_pep277.py +++ b/Lib/test/test_pep277.py @@ -56,17 +56,6 @@ "Unicode-friendly filesystem encoding") -# Destroy directory dirname and all files under it, to one level. -def deltree(dirname): - # Don't hide legitimate errors: if one of these suckers exists, it's - # an error if we can't remove it. - if os.path.exists(dirname): - # must pass unicode to os.listdir() so we get back unicode results. - for fname in os.listdir(str(dirname)): - os.unlink(os.path.join(dirname, fname)) - os.rmdir(dirname) - - class UnicodeFileTests(unittest.TestCase): files = set(filenames) normal_form = None @@ -76,6 +65,8 @@ os.mkdir(support.TESTFN) except FileExistsError: pass + self.addCleanup(support.rmtree, support.TESTFN) + files = set() for name in self.files: name = os.path.join(support.TESTFN, self.norm(name)) @@ -85,9 +76,6 @@ files.add(name) self.files = files - def tearDown(self): - deltree(support.TESTFN) - def norm(self, s): if self.normal_form: return normalize(self.normal_form, s) @@ -200,16 +188,13 @@ def test_main(): - try: - support.run_unittest( - UnicodeFileTests, - UnicodeNFCFileTests, - UnicodeNFDFileTests, - UnicodeNFKCFileTests, - UnicodeNFKDFileTests, - ) - finally: - deltree(support.TESTFN) + support.run_unittest( + UnicodeFileTests, + UnicodeNFCFileTests, + UnicodeNFDFileTests, + UnicodeNFKCFileTests, + UnicodeNFKDFileTests, + ) if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 00:46:41 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 00:46:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Fix_sporadic_failure_of_test=5Fpep277_?= =?utf-8?q?on_Windows=3A_use?= Message-ID: <3hMbjY2X46z7Ljx@mail.python.org> http://hg.python.org/cpython/rev/16ef196886a6 changeset: 91910:16ef196886a6 parent: 91908:a9637b29954d parent: 91909:bc70c1da7faf user: Victor Stinner date: Tue Jul 29 00:45:19 2014 +0200 summary: (Merge 3.4) Fix sporadic failure of test_pep277 on Windows: use support.rmtree() instead of deltree(). files: Lib/test/test_pep277.py | 33 +++++++--------------------- 1 files changed, 9 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py --- a/Lib/test/test_pep277.py +++ b/Lib/test/test_pep277.py @@ -56,17 +56,6 @@ "Unicode-friendly filesystem encoding") -# Destroy directory dirname and all files under it, to one level. -def deltree(dirname): - # Don't hide legitimate errors: if one of these suckers exists, it's - # an error if we can't remove it. - if os.path.exists(dirname): - # must pass unicode to os.listdir() so we get back unicode results. - for fname in os.listdir(str(dirname)): - os.unlink(os.path.join(dirname, fname)) - os.rmdir(dirname) - - class UnicodeFileTests(unittest.TestCase): files = set(filenames) normal_form = None @@ -76,6 +65,8 @@ os.mkdir(support.TESTFN) except FileExistsError: pass + self.addCleanup(support.rmtree, support.TESTFN) + files = set() for name in self.files: name = os.path.join(support.TESTFN, self.norm(name)) @@ -85,9 +76,6 @@ files.add(name) self.files = files - def tearDown(self): - deltree(support.TESTFN) - def norm(self, s): if self.normal_form: return normalize(self.normal_form, s) @@ -200,16 +188,13 @@ def test_main(): - try: - support.run_unittest( - UnicodeFileTests, - UnicodeNFCFileTests, - UnicodeNFDFileTests, - UnicodeNFKCFileTests, - UnicodeNFKDFileTests, - ) - finally: - deltree(support.TESTFN) + support.run_unittest( + UnicodeFileTests, + UnicodeNFCFileTests, + UnicodeNFDFileTests, + UnicodeNFKCFileTests, + UnicodeNFKDFileTests, + ) if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 01:02:00 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 01:02:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzExNDUz?= =?utf-8?q?=2C_=2318174=3A_Fix_leak_of_file_descriptor_in_test=5Fasyncore?= Message-ID: <3hMc3D4BRqz7LkK@mail.python.org> http://hg.python.org/cpython/rev/379aad232000 changeset: 91911:379aad232000 branch: 3.4 parent: 91909:bc70c1da7faf user: Victor Stinner date: Tue Jul 29 01:01:09 2014 +0200 summary: Issue #11453, #18174: Fix leak of file descriptor in test_asyncore 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 @@ -440,6 +440,8 @@ # Issue #11453 fd = os.open(support.TESTFN, os.O_RDONLY) f = asyncore.file_wrapper(fd) + + os.close(fd) with support.check_warnings(('', ResourceWarning)): f = None support.gc_collect() @@ -447,6 +449,8 @@ def test_close_twice(self): fd = os.open(support.TESTFN, os.O_RDONLY) f = asyncore.file_wrapper(fd) + os.close(fd) + f.close() self.assertEqual(f.fd, -1) # calling close twice should not fail -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 01:02:01 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 01:02:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogKE1lcmdlIDMuNCkgSXNzdWUgIzExNDUzLCAjMTgxNzQ6IEZpeCBsZWFr?= =?utf-8?q?_of_file_descriptor_in_test=5Fasyncore?= Message-ID: <3hMc3F5lw5z7LkS@mail.python.org> http://hg.python.org/cpython/rev/0ced2d2325fb changeset: 91912:0ced2d2325fb parent: 91910:16ef196886a6 parent: 91911:379aad232000 user: Victor Stinner date: Tue Jul 29 01:01:43 2014 +0200 summary: (Merge 3.4) Issue #11453, #18174: Fix leak of file descriptor in test_asyncore 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 @@ -417,6 +417,8 @@ # Issue #11453 fd = os.open(support.TESTFN, os.O_RDONLY) f = asyncore.file_wrapper(fd) + + os.close(fd) with support.check_warnings(('', ResourceWarning)): f = None support.gc_collect() @@ -424,6 +426,8 @@ def test_close_twice(self): fd = os.open(support.TESTFN, os.O_RDONLY) f = asyncore.file_wrapper(fd) + os.close(fd) + f.close() self.assertEqual(f.fd, -1) # calling close twice should not fail -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 01:15:56 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 01:15:56 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE4MTc0?= =?utf-8?q?=3A_Fix_leak_of_file_descriptor_in_test=5Ftempfile?= Message-ID: <3hMcMJ5rqkz7Lk8@mail.python.org> http://hg.python.org/cpython/rev/746339776f19 changeset: 91913:746339776f19 branch: 3.4 parent: 91911:379aad232000 user: Victor Stinner date: Tue Jul 29 01:13:39 2014 +0200 summary: Issue #18174: Fix leak of file descriptor in test_tempfile files: Lib/test/test_tempfile.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -762,8 +762,10 @@ def test_no_leak_fd(self): # Issue #21058: don't leak file descriptor when io.open() fails closed = [] + os_close = os.close def close(fd): closed.append(fd) + os_close(fd) with mock.patch('os.close', side_effect=close): with mock.patch('io.open', side_effect=ValueError): @@ -1076,8 +1078,10 @@ def test_no_leak_fd(self): # Issue #21058: don't leak file descriptor when io.open() fails closed = [] + os_close = os.close def close(fd): closed.append(fd) + os_close(fd) with mock.patch('os.close', side_effect=close): with mock.patch('io.open', side_effect=ValueError): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 01:15:58 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 01:15:58 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2318174=3A_Fix_leak_of_file_des?= =?utf-8?q?criptor_in_test=5Ftempfile?= Message-ID: <3hMcML0MnKz7LkB@mail.python.org> http://hg.python.org/cpython/rev/017d701116d5 changeset: 91914:017d701116d5 parent: 91912:0ced2d2325fb parent: 91913:746339776f19 user: Victor Stinner date: Tue Jul 29 01:15:22 2014 +0200 summary: (Merge 3.4) Issue #18174: Fix leak of file descriptor in test_tempfile files: Lib/test/test_tempfile.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -762,8 +762,10 @@ def test_no_leak_fd(self): # Issue #21058: don't leak file descriptor when io.open() fails closed = [] + os_close = os.close def close(fd): closed.append(fd) + os_close(fd) with mock.patch('os.close', side_effect=close): with mock.patch('io.open', side_effect=ValueError): @@ -1076,8 +1078,10 @@ def test_no_leak_fd(self): # Issue #21058: don't leak file descriptor when io.open() fails closed = [] + os_close = os.close def close(fd): closed.append(fd) + os_close(fd) with mock.patch('os.close', side_effect=close): with mock.patch('io.open', side_effect=ValueError): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 04:24:41 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 29 Jul 2014 04:24:41 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE3MTcy?= =?utf-8?q?=3A_Add_the_ability_to_run_turtledemo_from_Idle=2E?= Message-ID: <3hMhY53Vp1z7LkR@mail.python.org> http://hg.python.org/cpython/rev/04dd26ca02f4 changeset: 91915:04dd26ca02f4 branch: 3.4 parent: 91913:746339776f19 user: Terry Jan Reedy date: Mon Jul 28 22:23:59 2014 -0400 summary: Issue #17172: Add the ability to run turtledemo from Idle. Make turtledemo start as active on Mac even when run with subprocess. Patch by Ramchandra Apt, Lita Cho, and Ned Daily. files: Lib/idlelib/Bindings.py | 5 +++++ Lib/idlelib/EditorWindow.py | 9 +++++++++ Lib/turtledemo/__main__.py | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 0 deletions(-) diff --git a/Lib/idlelib/Bindings.py b/Lib/idlelib/Bindings.py --- a/Lib/idlelib/Bindings.py +++ b/Lib/idlelib/Bindings.py @@ -8,6 +8,8 @@ windows. """ +from importlib.util import find_spec + from idlelib.configHandler import idleConf # Warning: menudefs is altered in macosxSupport.overrideRootMenu() @@ -86,4 +88,7 @@ ]), ] +if find_spec('turtledemo'): + menudefs[-1][1].append(('Turtle Demo', '<>')) + default_keydefs = idleConf.GetCurrentKeySet() diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -222,6 +222,7 @@ text.bind("<>", self.flist.close_all_callback) text.bind("<>", self.open_class_browser) text.bind("<>", self.open_path_browser) + text.bind("<>", self.open_turtle_demo) self.set_status_bar() vbar['command'] = text.yview @@ -705,6 +706,14 @@ from idlelib import PathBrowser PathBrowser.PathBrowser(self.flist) + def open_turtle_demo(self, event = None): + import subprocess + + cmd = [sys.executable, + '-c', + 'from turtledemo.__main__ import main; main()'] + p = subprocess.Popen(cmd, shell=False) + def gotoline(self, lineno): if lineno is not None and lineno > 0: self.text.mark_set("insert", "%d.0" % lineno) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -40,6 +40,22 @@ root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) + if sys.platform == 'darwin': + import subprocess + # Make sure we are the currently activated OS X application + # so that our menu bar appears. + p = subprocess.Popen( + [ + 'osascript', + '-e', 'tell application "System Events"', + '-e', 'set frontmost of the first process whose ' + 'unix id is {} to true'.format(os.getpid()), + '-e', 'end tell', + ], + stderr=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + ) + root.grid_rowconfigure(1, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, minsize=90, weight=1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 04:24:42 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 29 Jul 2014 04:24:42 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hMhY657C6z7LkR@mail.python.org> http://hg.python.org/cpython/rev/c015e727b8f0 changeset: 91916:c015e727b8f0 parent: 91914:017d701116d5 parent: 91915:04dd26ca02f4 user: Terry Jan Reedy date: Mon Jul 28 22:24:20 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/Bindings.py | 5 +++++ Lib/idlelib/EditorWindow.py | 9 +++++++++ Lib/turtledemo/__main__.py | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 0 deletions(-) diff --git a/Lib/idlelib/Bindings.py b/Lib/idlelib/Bindings.py --- a/Lib/idlelib/Bindings.py +++ b/Lib/idlelib/Bindings.py @@ -8,6 +8,8 @@ windows. """ +from importlib.util import find_spec + from idlelib.configHandler import idleConf # Warning: menudefs is altered in macosxSupport.overrideRootMenu() @@ -86,4 +88,7 @@ ]), ] +if find_spec('turtledemo'): + menudefs[-1][1].append(('Turtle Demo', '<>')) + default_keydefs = idleConf.GetCurrentKeySet() diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -222,6 +222,7 @@ text.bind("<>", self.flist.close_all_callback) text.bind("<>", self.open_class_browser) text.bind("<>", self.open_path_browser) + text.bind("<>", self.open_turtle_demo) self.set_status_bar() vbar['command'] = text.yview @@ -705,6 +706,14 @@ from idlelib import PathBrowser PathBrowser.PathBrowser(self.flist) + def open_turtle_demo(self, event = None): + import subprocess + + cmd = [sys.executable, + '-c', + 'from turtledemo.__main__ import main; main()'] + p = subprocess.Popen(cmd, shell=False) + def gotoline(self, lineno): if lineno is not None and lineno > 0: self.text.mark_set("insert", "%d.0" % lineno) diff --git a/Lib/turtledemo/__main__.py b/Lib/turtledemo/__main__.py --- a/Lib/turtledemo/__main__.py +++ b/Lib/turtledemo/__main__.py @@ -112,6 +112,22 @@ root.title('Python turtle-graphics examples') root.wm_protocol("WM_DELETE_WINDOW", self._destroy) + if sys.platform == 'darwin': + import subprocess + # Make sure we are the currently activated OS X application + # so that our menu bar appears. + p = subprocess.Popen( + [ + 'osascript', + '-e', 'tell application "System Events"', + '-e', 'set frontmost of the first process whose ' + 'unix id is {} to true'.format(os.getpid()), + '-e', 'end tell', + ], + stderr=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + ) + root.grid_rowconfigure(1, weight=1) root.grid_columnconfigure(0, weight=1) root.grid_columnconfigure(1, minsize=90, weight=1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 04:40:30 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 29 Jul 2014 04:40:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzE3MTcy?= =?utf-8?q?=3A_add_NEWS?= Message-ID: <3hMhvL44x1z7Ljj@mail.python.org> http://hg.python.org/cpython/rev/e344539cda11 changeset: 91917:e344539cda11 branch: 3.4 parent: 91915:04dd26ca02f4 user: Terry Jan Reedy date: Mon Jul 28 22:38:19 2014 -0400 summary: Issue #17172: add NEWS files: Misc/NEWS | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #17172: Make turtledemo start as active on Mac even when run with + subprocess. Patch by Ned Daily and Lita Cho. + - Issue #21704: Fix build error for _multiprocessing when semaphores are not available. Patch by Arfrever Frehtes Taifersar Arahesis. @@ -202,6 +205,10 @@ IDLE ---- +- Issue #17172: Add the ability to run turtledemo from Idle. + Currently, the entry is on the Help menu, but it may move to Run. + Patch by Ramchandra Apt and Lita Cho. + - Issue #21765: Add support for non-ascii identifiers to HyperParser. - Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 04:40:31 2014 From: python-checkins at python.org (terry.reedy) Date: Tue, 29 Jul 2014 04:40:31 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hMhvM5VvQz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/14e2362935ac changeset: 91918:14e2362935ac parent: 91916:c015e727b8f0 parent: 91917:e344539cda11 user: Terry Jan Reedy date: Mon Jul 28 22:40:12 2014 -0400 summary: Merge with 3.4 files: Misc/NEWS | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- Issue #17172: Make turtledemo start as active on Mac even when run with + subprocess. Patch by Ned Daily and Lita Cho. + - Issue #21704: Fix build error for _multiprocessing when semaphores are not available. Patch by Arfrever Frehtes Taifersar Arahesis. @@ -643,6 +646,10 @@ IDLE ---- +- Issue #17172: Add the ability to run turtledemo from Idle. + Currently, the entry is on the Help menu, but it may move to Run. + Patch by Ramchandra Apt and Lita Cho. + - Issue #21765: Add support for non-ascii identifiers to HyperParser. - Issue #21940: Add unittest for WidgetRedirector. Initial patch by Saimadhav -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Jul 29 10:40:15 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 29 Jul 2014 10:40:15 +0200 Subject: [Python-checkins] Daily reference leaks (017d701116d5): sum=1233 Message-ID: results for 017d701116d5 on branch "default" -------------------------------------------- test_asyncio leaked [954, -106, 106] references, sum=954 test_asyncio leaked [270, -28, 32] memory blocks, sum=274 test_collections leaked [0, 2, 0] references, sum=2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [0, 2, -2] references, sum=0 test_site leaked [0, 2, -2] memory blocks, sum=0 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog7lX75z', '-x'] From python-checkins at python.org Tue Jul 29 13:00:39 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 13:00:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogc3lu?= =?utf-8?q?c_with_Tulip?= Message-ID: <3hMw0R42Tkz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/33456fea2805 changeset: 91919:33456fea2805 branch: 3.4 parent: 91917:e344539cda11 user: Victor Stinner date: Tue Jul 29 12:58:23 2014 +0200 summary: asyncio: sync with Tulip * _WaitHandleFuture.cancel() now notify IocpProactor through the overlapped object that the wait was cancelled. * Optimize IocpProactor.wait_for_handle() gets the result if the wait is signaled immediatly. * Enhance representation of Future and Future subclasses - Add "created at filename:lineno" in the representation - Add Future._repr_info() method which can be more easily overriden than Future.__repr__(). It should now be more easy to enhance Future representation without having to modify each subclass. For example, _OverlappedFuture and _WaitHandleFuture get the new "created at" information. - Use reprlib to format Future result, and function arguments when formatting a callback, to limit the length of the representation. * Fix repr(_WaitHandleFuture) * _WaitHandleFuture and _OverlappedFuture: hide frames of internal calls in the source traceback. * Cleanup ProactorIocp._poll(): set the timeout to 0 after the first call to GetQueuedCompletionStatus() * test_locks: close the temporary event loop and check the condition lock * Remove workaround in test_futures, no more needed files: Lib/asyncio/events.py | 15 +- Lib/asyncio/futures.py | 30 +++-- Lib/asyncio/tasks.py | 27 +--- Lib/asyncio/windows_events.py | 82 +++++++++----- Lib/test/test_asyncio/test_futures.py | 17 +- Lib/test/test_asyncio/test_locks.py | 5 +- Lib/test/test_asyncio/test_tasks.py | 6 + 7 files changed, 109 insertions(+), 73 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -10,11 +10,12 @@ import functools import inspect +import reprlib +import socket import subprocess +import sys +import threading import traceback -import threading -import socket -import sys _PY34 = sys.version_info >= (3, 4) @@ -36,8 +37,12 @@ def _format_args(args): - # function formatting ('hello',) as ('hello') - args_repr = repr(args) + """Format function arguments. + + Special case for a single parameter: ('hello',) is formatted as ('hello'). + """ + # use reprlib to limit the length of the output + args_repr = reprlib.repr(args) if len(args) == 1 and args_repr.endswith(',)'): args_repr = args_repr[:-2] + ')' return args_repr diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -7,6 +7,7 @@ import concurrent.futures._base import logging +import reprlib import sys import traceback @@ -175,20 +176,25 @@ format_cb(cb[-1])) return 'cb=[%s]' % cb - def _format_result(self): - if self._state != _FINISHED: - return None - elif self._exception is not None: - return 'exception={!r}'.format(self._exception) - else: - return 'result={!r}'.format(self._result) + def _repr_info(self): + info = [self._state.lower()] + if self._state == _FINISHED: + if self._exception is not None: + info.append('exception={!r}'.format(self._exception)) + else: + # use reprlib to limit the length of the output, especially + # for very long strings + result = reprlib.repr(self._result) + info.append('result={}'.format(result)) + if self._callbacks: + info.append(self._format_callbacks()) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return info def __repr__(self): - info = [self._state.lower()] - if self._state == _FINISHED: - info.append(self._format_result()) - if self._callbacks: - info.append(self._format_callbacks()) + info = self._repr_info() return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) # On Python 3.3 or older, objects with a destructor part of a reference diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -92,30 +92,19 @@ self._loop.call_exception_handler(context) futures.Future.__del__(self) - def __repr__(self): - info = [] + def _repr_info(self): + info = super()._repr_info() + if self._must_cancel: - info.append('cancelling') - else: - info.append(self._state.lower()) + # replace status + info[0] = 'cancelling' coro = coroutines._format_coroutine(self._coro) - info.append('coro=<%s>' % coro) - - if self._source_traceback: - frame = self._source_traceback[-1] - info.append('created at %s:%s' % (frame[0], frame[1])) - - if self._state == futures._FINISHED: - info.append(self._format_result()) - - if self._callbacks: - info.append(self._format_callbacks()) + info.insert(1, 'coro=<%s>' % coro) if self._fut_waiter is not None: - info.append('wait_for=%r' % self._fut_waiter) - - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + info.insert(2, 'wait_for=%r' % self._fut_waiter) + return info def get_stack(self, *, limit=None): """Return the list of stack frames for this task's coroutine. diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -42,16 +42,12 @@ del self._source_traceback[-1] self._ov = ov - def __repr__(self): - info = [self._state.lower()] + def _repr_info(self): + info = super()._repr_info() if self._ov is not None: state = 'pending' if self._ov.pending else 'completed' - info.append('overlapped=<%s, %#x>' % (state, self._ov.address)) - if self._state == futures._FINISHED: - info.append(self._format_result()) - if self._callbacks: - info.append(self._format_callbacks()) - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + info.insert(1, 'overlapped=<%s, %#x>' % (state, self._ov.address)) + return info def _cancel_overlapped(self): if self._ov is None: @@ -85,8 +81,14 @@ class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" - def __init__(self, handle, wait_handle, *, loop=None): + def __init__(self, iocp, ov, handle, wait_handle, *, loop=None): super().__init__(loop=loop) + if self._source_traceback: + del self._source_traceback[-1] + # iocp and ov are only used by cancel() to notify IocpProactor + # that the wait was cancelled + self._iocp = iocp + self._ov = ov self._handle = handle self._wait_handle = wait_handle @@ -95,19 +97,16 @@ return (_winapi.WaitForSingleObject(self._handle, 0) == _winapi.WAIT_OBJECT_0) - def __repr__(self): - info = [self._state.lower()] + def _repr_info(self): + info = super()._repr_info() + info.insert(1, 'handle=%#x' % self._handle) if self._wait_handle: - state = 'pending' if self._poll() else 'completed' - info.append('wait_handle=<%s, %#x>' % (state, self._wait_handle)) - info.append('handle=<%#x>' % self._handle) - if self._state == futures._FINISHED: - info.append(self._format_result()) - if self._callbacks: - info.append(self._format_callbacks()) - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + state = 'signaled' if self._poll() else 'waiting' + info.insert(1, 'wait_handle=<%s, %#x>' + % (state, self._wait_handle)) + return info - def _unregister(self): + def _unregister_wait(self): if self._wait_handle is None: return try: @@ -117,10 +116,25 @@ raise # ERROR_IO_PENDING is not an error, the wait was unregistered self._wait_handle = None + self._iocp = None + self._ov = None def cancel(self): - self._unregister() - return super().cancel() + result = super().cancel() + if self._ov is not None: + # signal the cancellation to the overlapped object + _overlapped.PostQueuedCompletionStatus(self._iocp, True, + 0, self._ov.address) + self._unregister_wait() + return result + + def set_exception(self, exception): + super().set_exception(exception) + self._unregister_wait() + + def set_result(self, result): + super().set_result(result) + self._unregister_wait() class PipeServer(object): @@ -405,7 +419,9 @@ ov = _overlapped.Overlapped(NULL) wh = _overlapped.RegisterWaitWithQueue( handle, self._iocp, ov.address, ms) - f = _WaitHandleFuture(handle, wh, loop=self._loop) + f = _WaitHandleFuture(self._iocp, ov, handle, wh, loop=self._loop) + if f._source_traceback: + del f._source_traceback[-1] def finish_wait_for_handle(trans, key, ov): # Note that this second wait means that we should only use @@ -414,12 +430,17 @@ # or semaphores are not. Also note if the handle is # signalled and then quickly reset, then we may return # False even though we have not timed out. + return f._poll() + + if f._poll(): try: - return f._poll() - finally: - f._unregister() + result = f._poll() + except OSError as exc: + f.set_exception(exc) + else: + f.set_result(result) - self._cache[ov.address] = (f, ov, None, finish_wait_for_handle) + self._cache[ov.address] = (f, ov, 0, finish_wait_for_handle) return f def _register_with_iocp(self, obj): @@ -438,6 +459,8 @@ # operation when it completes. The future's value is actually # the value returned by callback(). f = _OverlappedFuture(ov, loop=self._loop) + if f._source_traceback: + del f._source_traceback[-1] if not ov.pending and not wait_for_post: # The operation has completed, so no need to postpone the # work. We cannot take this short cut if we need the @@ -484,10 +507,13 @@ ms = math.ceil(timeout * 1e3) if ms >= INFINITE: raise ValueError("timeout too big") + while True: status = _overlapped.GetQueuedCompletionStatus(self._iocp, ms) if status is None: return + ms = 0 + err, transferred, key, address = status try: f, ov, obj, callback = self._cache.pop(address) @@ -504,7 +530,6 @@ # handle which should be closed to avoid a leak. if key not in (0, _overlapped.INVALID_HANDLE_VALUE): _winapi.CloseHandle(key) - ms = 0 continue if obj in self._stopped_serving: @@ -520,7 +545,6 @@ else: f.set_result(value) self._results.append(f) - ms = 0 def _stop_serving(self, obj): # obj is a socket or pipe handle. It will be closed in diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -105,6 +105,15 @@ self.assertEqual(next(g), ('C', 42)) # yield 'C', y. def test_future_repr(self): + self.loop.set_debug(True) + f_pending_debug = asyncio.Future(loop=self.loop) + frame = f_pending_debug._source_traceback[-1] + self.assertEqual(repr(f_pending_debug), + '' + % (frame[0], frame[1])) + f_pending_debug.cancel() + + self.loop.set_debug(False) f_pending = asyncio.Future(loop=self.loop) self.assertEqual(repr(f_pending), '') f_pending.cancel() @@ -299,12 +308,6 @@ @mock.patch('asyncio.base_events.logger') def test_future_exception_never_retrieved(self, m_log): - # FIXME: Python issue #21163, other tests may "leak" pending task which - # emit a warning when they are destroyed by the GC - support.gc_collect() - m_log.error.reset_mock() - # --- - self.loop.set_debug(True) def memory_error(): @@ -324,7 +327,7 @@ if sys.version_info >= (3, 4): frame = source_traceback[-1] regex = (r'^Future exception was never retrieved\n' - r'future: \n' + r'future: \n' r'source_traceback: Object created at \(most recent call last\):\n' r' File' r'.*\n' diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -660,10 +660,13 @@ lock = asyncio.Lock(loop=self.loop) cond = asyncio.Condition(lock, loop=self.loop) - self.assertIs(lock._loop, cond._loop) + self.assertIs(cond._lock, lock) + self.assertIs(cond._loop, lock._loop) def test_ambiguous_loops(self): loop = self.new_test_loop() + self.addCleanup(loop.close) + lock = asyncio.Lock(loop=self.loop) with self.assertRaises(ValueError): asyncio.Condition(lock, loop=loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -132,6 +132,8 @@ asyncio.async('ok') def test_task_repr(self): + self.loop.set_debug(False) + @asyncio.coroutine def notmuch(): yield from [] @@ -189,6 +191,8 @@ "" % coro) def test_task_repr_coro_decorator(self): + self.loop.set_debug(False) + @asyncio.coroutine def notmuch(): # notmuch() function doesn't use yield from: it will be wrapped by @@ -252,6 +256,8 @@ self.loop.run_until_complete(t) def test_task_repr_wait_for(self): + self.loop.set_debug(False) + @asyncio.coroutine def wait_for(fut): return (yield from fut) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 13:00:40 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 13:00:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_asyncio=3A_sync_with_Tulip?= Message-ID: <3hMw0S6YRkz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/5c9a74fd632b changeset: 91920:5c9a74fd632b parent: 91918:14e2362935ac parent: 91919:33456fea2805 user: Victor Stinner date: Tue Jul 29 12:58:59 2014 +0200 summary: (Merge 3.4) asyncio: sync with Tulip * _WaitHandleFuture.cancel() now notify IocpProactor through the overlapped object that the wait was cancelled. * Optimize IocpProactor.wait_for_handle() gets the result if the wait is signaled immediatly. * Enhance representation of Future and Future subclasses - Add "created at filename:lineno" in the representation - Add Future._repr_info() method which can be more easily overriden than Future.__repr__(). It should now be more easy to enhance Future representation without having to modify each subclass. For example, _OverlappedFuture and _WaitHandleFuture get the new "created at" information. - Use reprlib to format Future result, and function arguments when formatting a callback, to limit the length of the representation. * Fix repr(_WaitHandleFuture) * _WaitHandleFuture and _OverlappedFuture: hide frames of internal calls in the source traceback. * Cleanup ProactorIocp._poll(): set the timeout to 0 after the first call to GetQueuedCompletionStatus() * test_locks: close the temporary event loop and check the condition lock * Remove workaround in test_futures, no more needed files: Lib/asyncio/events.py | 15 +- Lib/asyncio/futures.py | 30 +++-- Lib/asyncio/tasks.py | 27 +--- Lib/asyncio/windows_events.py | 82 +++++++++----- Lib/test/test_asyncio/test_futures.py | 17 +- Lib/test/test_asyncio/test_locks.py | 5 +- Lib/test/test_asyncio/test_tasks.py | 6 + 7 files changed, 109 insertions(+), 73 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -10,11 +10,12 @@ import functools import inspect +import reprlib +import socket import subprocess +import sys +import threading import traceback -import threading -import socket -import sys _PY34 = sys.version_info >= (3, 4) @@ -36,8 +37,12 @@ def _format_args(args): - # function formatting ('hello',) as ('hello') - args_repr = repr(args) + """Format function arguments. + + Special case for a single parameter: ('hello',) is formatted as ('hello'). + """ + # use reprlib to limit the length of the output + args_repr = reprlib.repr(args) if len(args) == 1 and args_repr.endswith(',)'): args_repr = args_repr[:-2] + ')' return args_repr diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -7,6 +7,7 @@ import concurrent.futures._base import logging +import reprlib import sys import traceback @@ -175,20 +176,25 @@ format_cb(cb[-1])) return 'cb=[%s]' % cb - def _format_result(self): - if self._state != _FINISHED: - return None - elif self._exception is not None: - return 'exception={!r}'.format(self._exception) - else: - return 'result={!r}'.format(self._result) + def _repr_info(self): + info = [self._state.lower()] + if self._state == _FINISHED: + if self._exception is not None: + info.append('exception={!r}'.format(self._exception)) + else: + # use reprlib to limit the length of the output, especially + # for very long strings + result = reprlib.repr(self._result) + info.append('result={}'.format(result)) + if self._callbacks: + info.append(self._format_callbacks()) + if self._source_traceback: + frame = self._source_traceback[-1] + info.append('created at %s:%s' % (frame[0], frame[1])) + return info def __repr__(self): - info = [self._state.lower()] - if self._state == _FINISHED: - info.append(self._format_result()) - if self._callbacks: - info.append(self._format_callbacks()) + info = self._repr_info() return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) # On Python 3.3 or older, objects with a destructor part of a reference diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -92,30 +92,19 @@ self._loop.call_exception_handler(context) futures.Future.__del__(self) - def __repr__(self): - info = [] + def _repr_info(self): + info = super()._repr_info() + if self._must_cancel: - info.append('cancelling') - else: - info.append(self._state.lower()) + # replace status + info[0] = 'cancelling' coro = coroutines._format_coroutine(self._coro) - info.append('coro=<%s>' % coro) - - if self._source_traceback: - frame = self._source_traceback[-1] - info.append('created at %s:%s' % (frame[0], frame[1])) - - if self._state == futures._FINISHED: - info.append(self._format_result()) - - if self._callbacks: - info.append(self._format_callbacks()) + info.insert(1, 'coro=<%s>' % coro) if self._fut_waiter is not None: - info.append('wait_for=%r' % self._fut_waiter) - - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + info.insert(2, 'wait_for=%r' % self._fut_waiter) + return info def get_stack(self, *, limit=None): """Return the list of stack frames for this task's coroutine. diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -42,16 +42,12 @@ del self._source_traceback[-1] self._ov = ov - def __repr__(self): - info = [self._state.lower()] + def _repr_info(self): + info = super()._repr_info() if self._ov is not None: state = 'pending' if self._ov.pending else 'completed' - info.append('overlapped=<%s, %#x>' % (state, self._ov.address)) - if self._state == futures._FINISHED: - info.append(self._format_result()) - if self._callbacks: - info.append(self._format_callbacks()) - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + info.insert(1, 'overlapped=<%s, %#x>' % (state, self._ov.address)) + return info def _cancel_overlapped(self): if self._ov is None: @@ -85,8 +81,14 @@ class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" - def __init__(self, handle, wait_handle, *, loop=None): + def __init__(self, iocp, ov, handle, wait_handle, *, loop=None): super().__init__(loop=loop) + if self._source_traceback: + del self._source_traceback[-1] + # iocp and ov are only used by cancel() to notify IocpProactor + # that the wait was cancelled + self._iocp = iocp + self._ov = ov self._handle = handle self._wait_handle = wait_handle @@ -95,19 +97,16 @@ return (_winapi.WaitForSingleObject(self._handle, 0) == _winapi.WAIT_OBJECT_0) - def __repr__(self): - info = [self._state.lower()] + def _repr_info(self): + info = super()._repr_info() + info.insert(1, 'handle=%#x' % self._handle) if self._wait_handle: - state = 'pending' if self._poll() else 'completed' - info.append('wait_handle=<%s, %#x>' % (state, self._wait_handle)) - info.append('handle=<%#x>' % self._handle) - if self._state == futures._FINISHED: - info.append(self._format_result()) - if self._callbacks: - info.append(self._format_callbacks()) - return '<%s %s>' % (self.__class__.__name__, ' '.join(info)) + state = 'signaled' if self._poll() else 'waiting' + info.insert(1, 'wait_handle=<%s, %#x>' + % (state, self._wait_handle)) + return info - def _unregister(self): + def _unregister_wait(self): if self._wait_handle is None: return try: @@ -117,10 +116,25 @@ raise # ERROR_IO_PENDING is not an error, the wait was unregistered self._wait_handle = None + self._iocp = None + self._ov = None def cancel(self): - self._unregister() - return super().cancel() + result = super().cancel() + if self._ov is not None: + # signal the cancellation to the overlapped object + _overlapped.PostQueuedCompletionStatus(self._iocp, True, + 0, self._ov.address) + self._unregister_wait() + return result + + def set_exception(self, exception): + super().set_exception(exception) + self._unregister_wait() + + def set_result(self, result): + super().set_result(result) + self._unregister_wait() class PipeServer(object): @@ -405,7 +419,9 @@ ov = _overlapped.Overlapped(NULL) wh = _overlapped.RegisterWaitWithQueue( handle, self._iocp, ov.address, ms) - f = _WaitHandleFuture(handle, wh, loop=self._loop) + f = _WaitHandleFuture(self._iocp, ov, handle, wh, loop=self._loop) + if f._source_traceback: + del f._source_traceback[-1] def finish_wait_for_handle(trans, key, ov): # Note that this second wait means that we should only use @@ -414,12 +430,17 @@ # or semaphores are not. Also note if the handle is # signalled and then quickly reset, then we may return # False even though we have not timed out. + return f._poll() + + if f._poll(): try: - return f._poll() - finally: - f._unregister() + result = f._poll() + except OSError as exc: + f.set_exception(exc) + else: + f.set_result(result) - self._cache[ov.address] = (f, ov, None, finish_wait_for_handle) + self._cache[ov.address] = (f, ov, 0, finish_wait_for_handle) return f def _register_with_iocp(self, obj): @@ -438,6 +459,8 @@ # operation when it completes. The future's value is actually # the value returned by callback(). f = _OverlappedFuture(ov, loop=self._loop) + if f._source_traceback: + del f._source_traceback[-1] if not ov.pending and not wait_for_post: # The operation has completed, so no need to postpone the # work. We cannot take this short cut if we need the @@ -484,10 +507,13 @@ ms = math.ceil(timeout * 1e3) if ms >= INFINITE: raise ValueError("timeout too big") + while True: status = _overlapped.GetQueuedCompletionStatus(self._iocp, ms) if status is None: return + ms = 0 + err, transferred, key, address = status try: f, ov, obj, callback = self._cache.pop(address) @@ -504,7 +530,6 @@ # handle which should be closed to avoid a leak. if key not in (0, _overlapped.INVALID_HANDLE_VALUE): _winapi.CloseHandle(key) - ms = 0 continue if obj in self._stopped_serving: @@ -520,7 +545,6 @@ else: f.set_result(value) self._results.append(f) - ms = 0 def _stop_serving(self, obj): # obj is a socket or pipe handle. It will be closed in diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -105,6 +105,15 @@ self.assertEqual(next(g), ('C', 42)) # yield 'C', y. def test_future_repr(self): + self.loop.set_debug(True) + f_pending_debug = asyncio.Future(loop=self.loop) + frame = f_pending_debug._source_traceback[-1] + self.assertEqual(repr(f_pending_debug), + '' + % (frame[0], frame[1])) + f_pending_debug.cancel() + + self.loop.set_debug(False) f_pending = asyncio.Future(loop=self.loop) self.assertEqual(repr(f_pending), '') f_pending.cancel() @@ -299,12 +308,6 @@ @mock.patch('asyncio.base_events.logger') def test_future_exception_never_retrieved(self, m_log): - # FIXME: Python issue #21163, other tests may "leak" pending task which - # emit a warning when they are destroyed by the GC - support.gc_collect() - m_log.error.reset_mock() - # --- - self.loop.set_debug(True) def memory_error(): @@ -324,7 +327,7 @@ if sys.version_info >= (3, 4): frame = source_traceback[-1] regex = (r'^Future exception was never retrieved\n' - r'future: \n' + r'future: \n' r'source_traceback: Object created at \(most recent call last\):\n' r' File' r'.*\n' diff --git a/Lib/test/test_asyncio/test_locks.py b/Lib/test/test_asyncio/test_locks.py --- a/Lib/test/test_asyncio/test_locks.py +++ b/Lib/test/test_asyncio/test_locks.py @@ -660,10 +660,13 @@ lock = asyncio.Lock(loop=self.loop) cond = asyncio.Condition(lock, loop=self.loop) - self.assertIs(lock._loop, cond._loop) + self.assertIs(cond._lock, lock) + self.assertIs(cond._loop, lock._loop) def test_ambiguous_loops(self): loop = self.new_test_loop() + self.addCleanup(loop.close) + lock = asyncio.Lock(loop=self.loop) with self.assertRaises(ValueError): asyncio.Condition(lock, loop=loop) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -132,6 +132,8 @@ asyncio.async('ok') def test_task_repr(self): + self.loop.set_debug(False) + @asyncio.coroutine def notmuch(): yield from [] @@ -189,6 +191,8 @@ "" % coro) def test_task_repr_coro_decorator(self): + self.loop.set_debug(False) + @asyncio.coroutine def notmuch(): # notmuch() function doesn't use yield from: it will be wrapped by @@ -252,6 +256,8 @@ self.loop.run_until_complete(t) def test_task_repr_wait_for(self): + self.loop.set_debug(False) + @asyncio.coroutine def wait_for(fut): return (yield from fut) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 16:36:39 2014 From: python-checkins at python.org (ezio.melotti) Date: Tue, 29 Jul 2014 16:36:39 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogIzIxNzA0OiByZW1v?= =?utf-8?q?ve_duplicate_name_in_Misc/ACKS=2E?= Message-ID: <3hN0ng3gT2z7Lt7@mail.python.org> http://hg.python.org/cpython/rev/1a00be3d79bc changeset: 91921:1a00be3d79bc branch: 3.4 parent: 91919:33456fea2805 user: Ezio Melotti date: Tue Jul 29 17:35:46 2014 +0300 summary: #21704: remove duplicate name in Misc/ACKS. files: Misc/ACKS | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -51,7 +51,6 @@ Jon Anglin Heidi Annexstad Ramchandra Apte -Arfrever Frehtes Taifersar Arahesis ?ric Araujo Alicia Arlen Jeffrey Armstrong -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 16:36:40 2014 From: python-checkins at python.org (ezio.melotti) Date: Tue, 29 Jul 2014 16:36:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?b?KTogIzIxNzA0OiBtZXJnZSB3aXRoIDMuNC4=?= Message-ID: <3hN0nh50gcz7LtP@mail.python.org> http://hg.python.org/cpython/rev/723e0a7c4914 changeset: 91922:723e0a7c4914 parent: 91920:5c9a74fd632b parent: 91921:1a00be3d79bc user: Ezio Melotti date: Tue Jul 29 17:36:20 2014 +0300 summary: #21704: merge with 3.4. files: Misc/ACKS | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -52,7 +52,6 @@ Jon Anglin Heidi Annexstad Ramchandra Apte -Arfrever Frehtes Taifersar Arahesis ?ric Araujo Alicia Arlen Jeffrey Armstrong -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 17:26:00 2014 From: python-checkins at python.org (dirkjan.ochtman) Date: Tue, 29 Jul 2014 17:26:00 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxNTkx?= =?utf-8?q?=3A_Handle_exec_backwards_compatibility_in_the_AST_builder=2E?= Message-ID: <3hN1tc3DCXz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/33fb5600e9a1 changeset: 91923:33fb5600e9a1 branch: 2.7 parent: 91905:039ac3f01c4e user: Dirkjan Ochtman date: Tue Jul 29 17:21:39 2014 +0200 summary: Issue #21591: Handle exec backwards compatibility in the AST builder. Instead of deferring until runtime. This makes sure we hit the right conditions in dealing with unqualified exec statements. Reviewed by Victor Stinner. Test follows in a later commit. files: Misc/NEWS | 3 +++ Python/ast.c | 12 ++++++++++++ Python/ceval.c | 9 --------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #21591: Correctly handle qualified exec statements in tuple form by + moving compatibility layer from run-time to AST transformation. + Library ------- diff --git a/Python/ast.c b/Python/ast.c --- a/Python/ast.c +++ b/Python/ast.c @@ -2679,6 +2679,18 @@ expr1 = ast_for_expr(c, CHILD(n, 1)); if (!expr1) return NULL; + + if (expr1->kind == Tuple_kind && n_children < 4 && + (asdl_seq_LEN(expr1->v.Tuple.elts) == 2 || + asdl_seq_LEN(expr1->v.Tuple.elts) == 3)) { + /* Backwards compatibility: pass exec args as a tuple */ + globals = (expr_ty) asdl_seq_GET(expr1->v.Tuple.elts, 1); + if (asdl_seq_LEN(expr1->v.Tuple.elts) == 3) { + locals = (expr_ty) asdl_seq_GET(expr1->v.Tuple.elts, 2); + } + expr1 = (expr_ty) asdl_seq_GET(expr1->v.Tuple.elts, 0); + } + if (n_children >= 4) { globals = ast_for_expr(c, CHILD(n, 3)); if (!globals) diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4673,18 +4673,9 @@ exec_statement(PyFrameObject *f, PyObject *prog, PyObject *globals, PyObject *locals) { - int n; PyObject *v; int plain = 0; - if (PyTuple_Check(prog) && globals == Py_None && locals == Py_None && - ((n = PyTuple_Size(prog)) == 2 || n == 3)) { - /* Backward compatibility hack */ - globals = PyTuple_GetItem(prog, 1); - if (n == 3) - locals = PyTuple_GetItem(prog, 2); - prog = PyTuple_GetItem(prog, 0); - } if (globals == Py_None) { globals = PyEval_GetGlobals(); if (locals == Py_None) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 17:26:01 2014 From: python-checkins at python.org (dirkjan.ochtman) Date: Tue, 29 Jul 2014 17:26:01 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxNTkx?= =?utf-8?q?=3A_add_test_for_qualified_exec_in_tuple_form=2E?= Message-ID: <3hN1td4vZlz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/6c47c6d2033e changeset: 91924:6c47c6d2033e branch: 2.7 user: Robert Jordens date: Tue Jul 29 17:24:24 2014 +0200 summary: Issue #21591: add test for qualified exec in tuple form. files: Lib/test/test_compile.py | 16 ++++++++++++++++ Misc/ACKS | 1 + 2 files changed, 17 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py --- a/Lib/test/test_compile.py +++ b/Lib/test/test_compile.py @@ -90,6 +90,22 @@ with self.assertRaises(TypeError): exec("a = b + 1", g, l) in g, l + def test_nested_qualified_exec(self): + # Can use qualified exec in nested functions. + code = [""" +def g(): + def f(): + if True: + exec "" in {}, {} + """, """ +def g(): + def f(): + if True: + exec("", {}, {}) + """] + for c in code: + compile(c, "", "exec") + def test_exec_with_general_mapping_for_locals(self): class M: diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -648,6 +648,7 @@ Irmen de Jong Lucas de Jonge Kristj?n Valur J?nsson +Robert Jordens Jens B. Jorgensen John Jorgensen Sijin Joseph -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 22:11:09 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 22:11:09 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_475?= Message-ID: <3hN8Cd2sXxz7LjZ@mail.python.org> http://hg.python.org/peps/rev/2a6de9d30b91 changeset: 5511:2a6de9d30b91 user: Victor Stinner date: Tue Jul 29 22:10:53 2014 +0200 summary: PEP 475 files: pep-0475.txt | 35 +++++++++++++++++++++-------------- 1 files changed, 21 insertions(+), 14 deletions(-) diff --git a/pep-0475.txt b/pep-0475.txt --- a/pep-0475.txt +++ b/pep-0475.txt @@ -36,15 +36,17 @@ * Putting the application in background (ex: press CTRL-z and then type the ``bg`` command) sends the ``SIGCONT`` signal. -Writing a signal handler is difficult, only "signal-safe" functions -can be called. For example, ``printf()`` and ``malloc()`` are not -signal-safe. When a signal is sent to a process calling a system -call, the system call fails with the ``EINTR`` error to give the -program an opportunity to handle the signal without the restriction on -signal safe functions. +Writing a signal handler is difficult, only "async-signal safe" +functions can be called. For example, ``printf()`` and ``malloc()`` +are not async-signal safe. When a signal is sent to a process calling +a system call, the system call can fail with the ``EINTR`` error to +give the program an opportunity to handle the signal without the +restriction on signal safe functions. Depending on the platform, on +the system call and the ``SA_RESTART`` flag, the system call may or +may not fail with ``EINTR``. -If the signal handler was set with the ``SA_RESTART`` flag set, the C -library retries some the system call instead of failing with +If the signal handler was set with the ``SA_RESTART`` flag set, the +kernel retries some the system call instead of failing with ``EINTR``. For example, ``read()`` is retried, whereas ``select()`` is not retried. The Python function ``signal.signal()`` clears the ``SA_RESTART`` flag when setting the signal handler: all system calls @@ -85,9 +87,12 @@ * ``socketserver`` * ``subprocess`` +Other programming languages like Perl, Java and Go already retry +system calls failing with ``EINTR``. -Use Case 1: Don't Bother of Signals ------------------------------------ + +Use Case 1: Don't Bother With Signals +------------------------------------- In most cases, you don't want to be interrupted by signals and you don't expect to get ``InterruptedError`` exceptions. For example, do @@ -192,10 +197,12 @@ with ``InterruptedError`` will hang. The authors of this PEP don't think that such application exist. -If such applications exist, they must be fixed to handle signals -differently, to have a reliable behaviour on all platforms and all -Python versions. For example, use a signal handle which raises an -exception, or use a wakeup file descriptor. +If such applications exist, they are not portable and are subject to +race conditions (deadlock if the signal comes before the system call). +These applications must be fixed to handle signals differently, to +have a reliable behaviour on all platforms and all Python versions. +For example, use a signal handle which raises an exception, or use a +wakeup file descriptor. Applications should not call ``signal.siginterrupt(signum, False)`` anymore, since this call will raise an exception in Python 3.6. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Jul 29 22:38:51 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 22:38:51 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322054=3A_Add_os?= =?utf-8?q?=2Eget=5Fblocking=28=29_and_os=2Eset=5Fblocking=28=29_functions?= =?utf-8?q?_to_get_and?= Message-ID: <3hN8qb6N3sz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/8f0b8ddbb66b changeset: 91925:8f0b8ddbb66b parent: 91922:723e0a7c4914 user: Victor Stinner date: Tue Jul 29 22:32:47 2014 +0200 summary: Issue #22054: Add os.get_blocking() and os.set_blocking() functions to get and set the blocking mode of a file descriptor (False if the O_NONBLOCK flag is set, True otherwise). These functions are not available on Windows. files: Doc/library/os.rst | 23 ++++ Include/fileutils.h | 9 +- Lib/asyncio/unix_events.py | 11 +- Lib/asyncore.py | 6 +- Lib/test/test_asyncio/test_unix_events.py | 12 +- Lib/test/test_io.py | 18 +-- Lib/test/test_os.py | 26 +++++ Lib/test/test_posix.py | 7 +- Lib/test/test_pty.py | 23 ++-- Lib/test/test_signal.py | 10 +- Misc/NEWS | 4 + Modules/posixmodule.c | 54 +++++++++++ Python/fileutils.c | 53 ++++++++++ 13 files changed, 198 insertions(+), 58 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -807,6 +807,17 @@ Availability: Unix. +.. function:: get_blocking(fd) + + Get the blocking mode of the file descriptor: ``False`` if the + :data:`O_NONBLOCK` flag is set, ``True`` if the flag is cleared. + + See also :func:`set_blocking` and :meth:`socket.socket.setblocking`. + + Availability: Unix. + + .. versionadded:: 3.5 + .. function:: isatty(fd) Return ``True`` if the file descriptor *fd* is open and connected to a @@ -1107,6 +1118,18 @@ .. versionadded:: 3.3 +.. function:: set_blocking(fd, blocking) + + Set the blocking mode of the specified file descriptor. Set the + :data:`O_NONBLOCK` flag if blocking is ``False``, clear the flag otherwise. + + See also :func:`get_blocking` and :meth:`socket.socket.setblocking`. + + Availability: Unix. + + .. versionadded:: 3.5 + + .. data:: SF_NODISKIO SF_MNOWAIT SF_SYNC diff --git a/Include/fileutils.h b/Include/fileutils.h --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -70,7 +70,14 @@ int *atomic_flag_works); PyAPI_FUNC(int) _Py_dup(int fd); -#endif + +#ifndef MS_WINDOWS +PyAPI_FUNC(int) _Py_get_blocking(int fd); + +PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); +#endif /* !MS_WINDOWS */ + +#endif /* Py_LIMITED_API */ #ifdef __cplusplus } diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1,7 +1,6 @@ """Selector event loop for Unix with signal handling.""" import errno -import fcntl import os import signal import socket @@ -259,12 +258,6 @@ return server -def _set_nonblocking(fd): - flags = fcntl.fcntl(fd, fcntl.F_GETFL) - flags = flags | os.O_NONBLOCK - fcntl.fcntl(fd, fcntl.F_SETFL, flags) - - class _UnixReadPipeTransport(transports.ReadTransport): max_size = 256 * 1024 # max bytes we read in one event loop iteration @@ -280,7 +273,7 @@ stat.S_ISSOCK(mode) or stat.S_ISCHR(mode)): raise ValueError("Pipe transport is for pipes/sockets only.") - _set_nonblocking(self._fileno) + os.set_blocking(self._fileno, False) self._protocol = protocol self._closing = False self._loop.add_reader(self._fileno, self._read_ready) @@ -373,7 +366,7 @@ stat.S_ISCHR(mode)): raise ValueError("Pipe transport is only for " "pipes, sockets and character devices") - _set_nonblocking(self._fileno) + os.set_blocking(self._fileno, False) self._protocol = protocol self._buffer = [] self._conn_lost = 0 diff --git a/Lib/asyncore.py b/Lib/asyncore.py --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -590,8 +590,6 @@ # Regardless, this is useful for pipes, and stdin/stdout... if os.name == 'posix': - import fcntl - class file_wrapper: # Here we override just enough to make a file # look like a socket for the purposes of asyncore. @@ -642,9 +640,7 @@ pass self.set_file(fd) # set it to non-blocking mode - flags = fcntl.fcntl(fd, fcntl.F_GETFL, 0) - flags = flags | os.O_NONBLOCK - fcntl.fcntl(fd, fcntl.F_SETFL, flags) + os.set_blocking(fd, False) def set_file(self, fd): self.socket = file_wrapper(fd) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -306,9 +306,9 @@ self.pipe = mock.Mock(spec_set=io.RawIOBase) self.pipe.fileno.return_value = 5 - fcntl_patcher = mock.patch('fcntl.fcntl') - fcntl_patcher.start() - self.addCleanup(fcntl_patcher.stop) + blocking_patcher = mock.patch('os.set_blocking') + blocking_patcher.start() + self.addCleanup(blocking_patcher.stop) fstat_patcher = mock.patch('os.fstat') m_fstat = fstat_patcher.start() @@ -469,9 +469,9 @@ self.pipe = mock.Mock(spec_set=io.RawIOBase) self.pipe.fileno.return_value = 5 - fcntl_patcher = mock.patch('fcntl.fcntl') - fcntl_patcher.start() - self.addCleanup(fcntl_patcher.stop) + blocking_patcher = mock.patch('os.set_blocking') + blocking_patcher.start() + self.addCleanup(blocking_patcher.stop) fstat_patcher = mock.patch('os.fstat') m_fstat = fstat_patcher.start() 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 @@ -44,10 +44,6 @@ import threading except ImportError: threading = None -try: - import fcntl -except ImportError: - fcntl = None def _default_chunk_size(): """Get the default TextIOWrapper chunk size""" @@ -3230,26 +3226,20 @@ with self.open(support.TESTFN, **kwargs) as f: self.assertRaises(TypeError, pickle.dumps, f, protocol) - @unittest.skipUnless(fcntl, 'fcntl required for this test') def test_nonblock_pipe_write_bigbuf(self): self._test_nonblock_pipe_write(16*1024) - @unittest.skipUnless(fcntl, 'fcntl required for this test') def test_nonblock_pipe_write_smallbuf(self): self._test_nonblock_pipe_write(1024) - def _set_non_blocking(self, fd): - flags = fcntl.fcntl(fd, fcntl.F_GETFL) - self.assertNotEqual(flags, -1) - res = fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) - self.assertEqual(res, 0) - + @unittest.skipUnless(hasattr(os, 'set_blocking'), + 'os.set_blocking() required for this test') def _test_nonblock_pipe_write(self, bufsize): sent = [] received = [] r, w = os.pipe() - self._set_non_blocking(r) - self._set_non_blocking(w) + os.set_blocking(r, False) + os.set_blocking(w, False) # To exercise all code paths in the C implementation we need # to play with buffer sizes. For instance, if we choose a 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 @@ -1376,6 +1376,16 @@ def test_writev(self): self.check(os.writev, [b'abc']) + def test_inheritable(self): + self.check(os.get_inheritable) + self.check(os.set_inheritable, True) + + @unittest.skipUnless(hasattr(os, 'get_blocking'), + 'needs os.get_blocking() and os.set_blocking()') + def test_blocking(self): + self.check(os.get_blocking) + self.check(os.set_blocking, True) + class LinkTests(unittest.TestCase): def setUp(self): @@ -2591,6 +2601,21 @@ self.assertEqual(os.get_inheritable(slave_fd), False) + at unittest.skipUnless(hasattr(os, 'get_blocking'), + 'needs os.get_blocking() and os.set_blocking()') +class BlockingTests(unittest.TestCase): + def test_blocking(self): + fd = os.open(__file__, os.O_RDONLY) + self.addCleanup(os.close, fd) + self.assertEqual(os.get_blocking(fd), True) + + os.set_blocking(fd, False) + self.assertEqual(os.get_blocking(fd), False) + + os.set_blocking(fd, True) + self.assertEqual(os.get_blocking(fd), True) + + @support.reap_threads def test_main(): support.run_unittest( @@ -2626,6 +2651,7 @@ CPUCountTests, FDInheritanceTests, Win32JunctionTests, + BlockingTests, ) if __name__ == "__main__": 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 @@ -9,7 +9,6 @@ import sys import time import os -import fcntl import platform import pwd import shutil @@ -355,7 +354,7 @@ def test_oscloexec(self): fd = os.open(support.TESTFN, os.O_RDONLY|os.O_CLOEXEC) self.addCleanup(os.close, fd) - self.assertTrue(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC) + self.assertFalse(os.get_inheritable(fd)) @unittest.skipUnless(hasattr(posix, 'O_EXLOCK'), 'test needs posix.O_EXLOCK') @@ -605,8 +604,8 @@ self.addCleanup(os.close, w) self.assertFalse(os.get_inheritable(r)) self.assertFalse(os.get_inheritable(w)) - self.assertTrue(fcntl.fcntl(r, fcntl.F_GETFL) & os.O_NONBLOCK) - self.assertTrue(fcntl.fcntl(w, fcntl.F_GETFL) & os.O_NONBLOCK) + self.assertFalse(os.get_blocking(r)) + self.assertFalse(os.get_blocking(w)) # try reading from an empty pipe: this should fail, not block self.assertRaises(OSError, os.read, r, 1) # try a write big enough to fill-up the pipe: this should either diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -1,7 +1,6 @@ from test.support import verbose, run_unittest, import_module, reap_children -#Skip these tests if either fcntl or termios is not available -fcntl = import_module('fcntl') +# Skip these tests if termios is not available import_module('termios') import errno @@ -84,16 +83,18 @@ # in master_open(), we need to read the EOF. # Ensure the fd is non-blocking in case there's nothing to read. - orig_flags = fcntl.fcntl(master_fd, fcntl.F_GETFL) - fcntl.fcntl(master_fd, fcntl.F_SETFL, orig_flags | os.O_NONBLOCK) + blocking = os.get_blocking(master_fd) try: - s1 = os.read(master_fd, 1024) - self.assertEqual(b'', s1) - except OSError as e: - if e.errno != errno.EAGAIN: - raise - # Restore the original flags. - fcntl.fcntl(master_fd, fcntl.F_SETFL, orig_flags) + os.set_blocking(master_fd, False) + try: + s1 = os.read(master_fd, 1024) + self.assertEqual(b'', s1) + except OSError as e: + if e.errno != errno.EAGAIN: + raise + finally: + # Restore the original flags. + os.set_blocking(master_fd, blocking) debug("Writing to slave_fd") os.write(slave_fd, TEST_STRING_1) 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 @@ -276,7 +276,6 @@ # use a subprocess to have only one thread code = """if 1: import _testcapi - import fcntl import os import signal import struct @@ -299,10 +298,7 @@ signal.signal(signal.SIGALRM, handler) read, write = os.pipe() - for fd in (read, write): - flags = fcntl.fcntl(fd, fcntl.F_GETFL, 0) - flags = flags | os.O_NONBLOCK - fcntl.fcntl(fd, fcntl.F_SETFL, flags) + os.set_blocking(write, False) signal.set_wakeup_fd(write) test() @@ -322,7 +318,6 @@ code = """if 1: import _testcapi import errno - import fcntl import os import signal import sys @@ -333,8 +328,7 @@ signal.signal(signal.SIGALRM, handler) r, w = os.pipe() - flags = fcntl.fcntl(r, fcntl.F_GETFL, 0) - fcntl.fcntl(r, fcntl.F_SETFL, flags | os.O_NONBLOCK) + os.set_blocking(r, False) # Set wakeup_fd a read-only file descriptor to trigger the error signal.set_wakeup_fd(r) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,10 @@ Library ------- +- Issue #22054: Add os.get_blocking() and os.set_blocking() functions to get + and set the blocking mode of a file descriptor (False if the O_NONBLOCK flag + is set, True otherwise). These functions are not available on Windows. + - Issue #17172: Make turtledemo start as active on Mac even when run with subprocess. Patch by Ned Daily and Lita Cho. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -11146,6 +11146,56 @@ #endif /* MS_WINDOWS */ +#ifndef MS_WINDOWS +PyDoc_STRVAR(get_blocking__doc__, + "get_blocking(fd) -> bool\n" \ + "\n" \ + "Get the blocking mode of the file descriptor:\n" \ + "False if the O_NONBLOCK flag is set, True if the flag is cleared."); + +static PyObject* +posix_get_blocking(PyObject *self, PyObject *args) +{ + int fd; + int blocking; + + if (!PyArg_ParseTuple(args, "i:get_blocking", &fd)) + return NULL; + + if (!_PyVerify_fd(fd)) + return posix_error(); + + blocking = _Py_get_blocking(fd); + if (blocking < 0) + return NULL; + return PyBool_FromLong(blocking); +} + +PyDoc_STRVAR(set_blocking__doc__, + "set_blocking(fd, blocking)\n" \ + "\n" \ + "Set the blocking mode of the specified file descriptor.\n" \ + "Set the O_NONBLOCK flag if blocking is False,\n" \ + "clear the O_NONBLOCK flag otherwise."); + +static PyObject* +posix_set_blocking(PyObject *self, PyObject *args) +{ + int fd, blocking; + + if (!PyArg_ParseTuple(args, "ii:set_blocking", &fd, &blocking)) + return NULL; + + if (!_PyVerify_fd(fd)) + return posix_error(); + + if (_Py_set_blocking(fd, blocking) < 0) + return NULL; + Py_RETURN_NONE; +} +#endif /* !MS_WINDOWS */ + + /*[clinic input] dump buffer [clinic start generated code]*/ @@ -11606,6 +11656,10 @@ {"set_handle_inheritable", posix_set_handle_inheritable, METH_VARARGS, set_handle_inheritable__doc__}, #endif +#ifndef MS_WINDOWS + {"get_blocking", posix_get_blocking, METH_VARARGS, get_blocking__doc__}, + {"set_blocking", posix_set_blocking, METH_VARARGS, set_blocking__doc__}, +#endif {NULL, NULL} /* Sentinel */ }; diff --git a/Python/fileutils.c b/Python/fileutils.c --- a/Python/fileutils.c +++ b/Python/fileutils.c @@ -1045,3 +1045,56 @@ return fd; } +#ifndef MS_WINDOWS +/* Get the blocking mode of the file descriptor. + Return 0 if the O_NONBLOCK flag is set, 1 if the flag is cleared, + raise an exception and return -1 on error. */ +int +_Py_get_blocking(int fd) +{ + int flags = fcntl(fd, F_GETFL, 0); + if (flags < 0) { + PyErr_SetFromErrno(PyExc_OSError); + return -1; + } + + return !(flags & O_NONBLOCK); +} + +/* Set the blocking mode of the specified file descriptor. + + Set the O_NONBLOCK flag if blocking is False, clear the O_NONBLOCK flag + otherwise. + + Return 0 on success, raise an exception and return -1 on error. */ +int +_Py_set_blocking(int fd, int blocking) +{ +#if defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO) + int arg = !blocking; + if (ioctl(fd, FIONBIO, &arg) < 0) + goto error; +#else + int flags, res; + + flags = fcntl(fd, F_GETFL, 0); + if (flags < 0) + goto error; + + if (blocking) + flags = flags & (~O_NONBLOCK); + else + flags = flags | O_NONBLOCK; + + res = fcntl(fd, F_SETFL, flags); + if (res < 0) + goto error; +#endif + return 0; + +error: + PyErr_SetFromErrno(PyExc_OSError); + return -1; +} +#endif + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 22:52:27 2014 From: python-checkins at python.org (ned.deily) Date: Tue, 29 Jul 2014 22:52:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=283=2E4=29=3A_Edit_NEWS_entr?= =?utf-8?q?y?= Message-ID: <3hN97H4qMcz7Lkv@mail.python.org> http://hg.python.org/cpython/rev/d4cf32230ed7 changeset: 91926:d4cf32230ed7 branch: 3.4 parent: 91921:1a00be3d79bc user: Ned Deily date: Tue Jul 29 13:49:11 2014 -0700 summary: Edit NEWS entry files: Misc/NEWS | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,9 +27,9 @@ Library ------- -- Issue #17172: Make turtledemo start as active on Mac even when run with - subprocess. Patch by Ned Daily and Lita Cho. - +- Issue #17172: Make turtledemo start as active on OS X even when run with + subprocess. Patch by Lita Cho. + - Issue #21704: Fix build error for _multiprocessing when semaphores are not available. Patch by Arfrever Frehtes Taifersar Arahesis. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 22:52:28 2014 From: python-checkins at python.org (ned.deily) Date: Tue, 29 Jul 2014 22:52:28 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Edit_NEWS_entry?= Message-ID: <3hN97J63grz7LkW@mail.python.org> http://hg.python.org/cpython/rev/129951f3d16f changeset: 91927:129951f3d16f parent: 91925:8f0b8ddbb66b parent: 91926:d4cf32230ed7 user: Ned Deily date: Tue Jul 29 13:51:45 2014 -0700 summary: Edit NEWS entry 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 @@ -117,8 +117,8 @@ and set the blocking mode of a file descriptor (False if the O_NONBLOCK flag is set, True otherwise). These functions are not available on Windows. -- Issue #17172: Make turtledemo start as active on Mac even when run with - subprocess. Patch by Ned Daily and Lita Cho. +- Issue #17172: Make turtledemo start as active on OS X even when run with + subprocess. Patch by Lita Cho. - Issue #21704: Fix build error for _multiprocessing when semaphores are not available. Patch by Arfrever Frehtes Taifersar Arahesis. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 23:11:24 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:11:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogYXN5bmNpbzogVXNl?= =?utf-8?q?_the_new_os=2Eset=5Fblocking=28=29_function_of_Python_3=2E5_if_?= =?utf-8?q?available?= Message-ID: <3hN9Y83ktfz7LjV@mail.python.org> http://hg.python.org/cpython/rev/e5cf8ea793c7 changeset: 91928:e5cf8ea793c7 branch: 3.4 parent: 91926:d4cf32230ed7 user: Victor Stinner date: Tue Jul 29 23:08:00 2014 +0200 summary: asyncio: Use the new os.set_blocking() function of Python 3.5 if available files: Lib/asyncio/unix_events.py | 12 +++++++--- Lib/test/test_asyncio/test_unix_events.py | 12 +++++----- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -259,10 +259,14 @@ return server -def _set_nonblocking(fd): - flags = fcntl.fcntl(fd, fcntl.F_GETFL) - flags = flags | os.O_NONBLOCK - fcntl.fcntl(fd, fcntl.F_SETFL, flags) +if hasattr(os, 'set_blocking'): + def _set_nonblocking(fd): + os.set_blocking(fd, False) +else: + def _set_nonblocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + flags = flags | os.O_NONBLOCK + fcntl.fcntl(fd, fcntl.F_SETFL, flags) class _UnixReadPipeTransport(transports.ReadTransport): diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -306,9 +306,9 @@ self.pipe = mock.Mock(spec_set=io.RawIOBase) self.pipe.fileno.return_value = 5 - fcntl_patcher = mock.patch('fcntl.fcntl') - fcntl_patcher.start() - self.addCleanup(fcntl_patcher.stop) + blocking_patcher = mock.patch('asyncio.unix_events._set_nonblocking') + blocking_patcher.start() + self.addCleanup(blocking_patcher.stop) fstat_patcher = mock.patch('os.fstat') m_fstat = fstat_patcher.start() @@ -469,9 +469,9 @@ self.pipe = mock.Mock(spec_set=io.RawIOBase) self.pipe.fileno.return_value = 5 - fcntl_patcher = mock.patch('fcntl.fcntl') - fcntl_patcher.start() - self.addCleanup(fcntl_patcher.stop) + blocking_patcher = mock.patch('asyncio.unix_events._set_nonblocking') + blocking_patcher.start() + self.addCleanup(blocking_patcher.stop) fstat_patcher = mock.patch('os.fstat') m_fstat = fstat_patcher.start() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 23:11:25 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:11:25 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogQ2xvc2UgIzIyMDYz?= =?utf-8?q?=3A_socket_operations_=28socket=2Crecv=2C_sock=5Fsendall=2C_soc?= =?utf-8?q?k=5Fconnect=2C?= Message-ID: <3hN9Y96ZJBz7LkZ@mail.python.org> http://hg.python.org/cpython/rev/7e70ec207889 changeset: 91929:7e70ec207889 branch: 3.4 user: Victor Stinner date: Tue Jul 29 23:08:17 2014 +0200 summary: Close #22063: socket operations (socket,recv, sock_sendall, sock_connect, sock_accept) now raise an exception in debug mode if sockets are in blocking mode. files: Lib/asyncio/proactor_events.py | 8 +++++++ Lib/asyncio/selector_events.py | 8 +++++++ Lib/test/test_asyncio/test_events.py | 18 ++++++++++++++++ 3 files changed, 34 insertions(+), 0 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -385,12 +385,18 @@ self._selector = None def sock_recv(self, sock, n): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return self._proactor.recv(sock, n) def sock_sendall(self, sock, data): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return self._proactor.send(sock, data) def sock_connect(self, sock, address): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") try: base_events._check_resolved_address(sock, address) except ValueError as err: @@ -401,6 +407,8 @@ return self._proactor.connect(sock, address) def sock_accept(self, sock): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return self._proactor.accept(sock) def _socketpair(self): diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -256,6 +256,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) self._sock_recv(fut, False, sock, n) return fut @@ -292,6 +294,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) if data: self._sock_sendall(fut, False, sock, data) @@ -333,6 +337,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) try: base_events._check_resolved_address(sock, address) @@ -374,6 +380,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) self._sock_accept(fut, False, sock) return fut diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -383,6 +383,24 @@ self.assertEqual(read, data) def _basetest_sock_client_ops(self, httpd, sock): + # in debug mode, socket operations must fail + # if the socket is not in blocking mode + self.loop.set_debug(True) + sock.setblocking(True) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_connect(sock, httpd.address)) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_recv(sock, 1024)) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_accept(sock)) + + # test in non-blocking mode sock.setblocking(False) self.loop.run_until_complete( self.loop.sock_connect(sock, httpd.address)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 23:11:27 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:11:27 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_Python_3=2E4_=28asyncio=29?= Message-ID: <3hN9YC1zqjz7Lkf@mail.python.org> http://hg.python.org/cpython/rev/8967d9a1bc17 changeset: 91930:8967d9a1bc17 parent: 91927:129951f3d16f parent: 91929:7e70ec207889 user: Victor Stinner date: Tue Jul 29 23:09:56 2014 +0200 summary: Merge with Python 3.4 (asyncio) - Close #22063: socket operations (socket,recv, sock_sendall, sock_connect, sock_accept) now raise an exception in debug mode if sockets are in blocking mode. - asyncio: Use the new os.set_blocking() function of Python 3.5 if available files: Lib/asyncio/proactor_events.py | 8 ++++ Lib/asyncio/selector_events.py | 8 ++++ Lib/asyncio/unix_events.py | 14 +++++++- Lib/test/test_asyncio/test_events.py | 18 +++++++++++ Lib/test/test_asyncio/test_unix_events.py | 4 +- 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -385,12 +385,18 @@ self._selector = None def sock_recv(self, sock, n): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return self._proactor.recv(sock, n) def sock_sendall(self, sock, data): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return self._proactor.send(sock, data) def sock_connect(self, sock, address): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") try: base_events._check_resolved_address(sock, address) except ValueError as err: @@ -401,6 +407,8 @@ return self._proactor.connect(sock, address) def sock_accept(self, sock): + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") return self._proactor.accept(sock) def _socketpair(self): diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -256,6 +256,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) self._sock_recv(fut, False, sock, n) return fut @@ -292,6 +294,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) if data: self._sock_sendall(fut, False, sock, data) @@ -333,6 +337,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) try: base_events._check_resolved_address(sock, address) @@ -374,6 +380,8 @@ This method is a coroutine. """ + if self.get_debug() and sock.gettimeout() != 0: + raise ValueError("the socket must be non-blocking") fut = futures.Future(loop=self) self._sock_accept(fut, False, sock) return fut diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -258,6 +258,16 @@ return server +if hasattr(os, 'set_blocking'): + def _set_nonblocking(fd): + os.set_blocking(fd, False) +else: + def _set_nonblocking(fd): + flags = fcntl.fcntl(fd, fcntl.F_GETFL) + flags = flags | os.O_NONBLOCK + fcntl.fcntl(fd, fcntl.F_SETFL, flags) + + class _UnixReadPipeTransport(transports.ReadTransport): max_size = 256 * 1024 # max bytes we read in one event loop iteration @@ -273,7 +283,7 @@ stat.S_ISSOCK(mode) or stat.S_ISCHR(mode)): raise ValueError("Pipe transport is for pipes/sockets only.") - os.set_blocking(self._fileno, False) + _set_nonblocking(self._fileno) self._protocol = protocol self._closing = False self._loop.add_reader(self._fileno, self._read_ready) @@ -366,7 +376,7 @@ stat.S_ISCHR(mode)): raise ValueError("Pipe transport is only for " "pipes, sockets and character devices") - os.set_blocking(self._fileno, False) + _set_nonblocking(self._fileno) self._protocol = protocol self._buffer = [] self._conn_lost = 0 diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -383,6 +383,24 @@ self.assertEqual(read, data) def _basetest_sock_client_ops(self, httpd, sock): + # in debug mode, socket operations must fail + # if the socket is not in blocking mode + self.loop.set_debug(True) + sock.setblocking(True) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_connect(sock, httpd.address)) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n')) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_recv(sock, 1024)) + with self.assertRaises(ValueError): + self.loop.run_until_complete( + self.loop.sock_accept(sock)) + + # test in non-blocking mode sock.setblocking(False) self.loop.run_until_complete( self.loop.sock_connect(sock, httpd.address)) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -306,7 +306,7 @@ self.pipe = mock.Mock(spec_set=io.RawIOBase) self.pipe.fileno.return_value = 5 - blocking_patcher = mock.patch('os.set_blocking') + blocking_patcher = mock.patch('asyncio.unix_events._set_nonblocking') blocking_patcher.start() self.addCleanup(blocking_patcher.stop) @@ -469,7 +469,7 @@ self.pipe = mock.Mock(spec_set=io.RawIOBase) self.pipe.fileno.return_value = 5 - blocking_patcher = mock.patch('os.set_blocking') + blocking_patcher = mock.patch('asyncio.unix_events._set_nonblocking') blocking_patcher.start() self.addCleanup(blocking_patcher.stop) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 23:12:47 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:12:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDYz?= =?utf-8?q?=3A_Mention_in_asyncio_documentation_that_socket_operations_req?= =?utf-8?q?uire?= Message-ID: <3hN9Zl3yPdz7LjR@mail.python.org> http://hg.python.org/cpython/rev/95ceec174baf changeset: 91931:95ceec174baf branch: 3.4 parent: 91929:7e70ec207889 user: Victor Stinner date: Tue Jul 29 23:12:22 2014 +0200 summary: Issue #22063: Mention in asyncio documentation that socket operations require the socket to be non-blocking files: Doc/library/asyncio-eventloop.rst | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -337,6 +337,8 @@ representing the data received. The maximum amount of data to be received at once is specified by *nbytes*. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: @@ -351,6 +353,8 @@ an exception is raised, and there is no way to determine how much data, if any, was successfully processed by the receiving end of the connection. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: @@ -367,6 +371,8 @@ :py:data:`~socket.AF_INET` and :py:data:`~socket.AF_INET6` address families. Use :meth:`getaddrinfo` to resolve the hostname asynchronously. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: @@ -384,6 +390,8 @@ and *address* is the address bound to the socket on the other end of the connection. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 23:12:48 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:12:48 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_=28Merge_3=2E4=29_Issue_=2322063=3A_Mention_in_asyncio_d?= =?utf-8?q?ocumentation_that_socket?= Message-ID: <3hN9Zm5Llnz7LkG@mail.python.org> http://hg.python.org/cpython/rev/741e58bcaa65 changeset: 91932:741e58bcaa65 parent: 91930:8967d9a1bc17 parent: 91931:95ceec174baf user: Victor Stinner date: Tue Jul 29 23:12:34 2014 +0200 summary: (Merge 3.4) Issue #22063: Mention in asyncio documentation that socket operations require the socket to be non-blocking files: Doc/library/asyncio-eventloop.rst | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -337,6 +337,8 @@ representing the data received. The maximum amount of data to be received at once is specified by *nbytes*. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: @@ -351,6 +353,8 @@ an exception is raised, and there is no way to determine how much data, if any, was successfully processed by the receiving end of the connection. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: @@ -367,6 +371,8 @@ :py:data:`~socket.AF_INET` and :py:data:`~socket.AF_INET6` address families. Use :meth:`getaddrinfo` to resolve the hostname asynchronously. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: @@ -384,6 +390,8 @@ and *address* is the address bound to the socket on the other end of the connection. + The socket *sock* must be non-blocking. + This method is a :ref:`coroutine `. .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Jul 29 23:16:11 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:16:11 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?peps=3A_PEP_475=3A_don=27t_deprecate_?= =?utf-8?q?signal=2Esiginterrupt=28=29_anymore?= Message-ID: <3hN9fg3w1Pz7LjV@mail.python.org> http://hg.python.org/peps/rev/13cd761504fd changeset: 5512:13cd761504fd user: Victor Stinner date: Tue Jul 29 23:16:04 2014 +0200 summary: PEP 475: don't deprecate signal.siginterrupt() anymore files: pep-0475.txt | 22 +--------------------- 1 files changed, 1 insertions(+), 21 deletions(-) diff --git a/pep-0475.txt b/pep-0475.txt --- a/pep-0475.txt +++ b/pep-0475.txt @@ -14,7 +14,7 @@ ======== Retry system calls failing with the ``EINTR`` error and recompute -timeout if needed. Deprecate the ``signal.siginterrupt()`` function. +timeout if needed. Rationale @@ -173,23 +173,6 @@ doesn't recompute the timeout yet. -Deprecate siginterrupt() ------------------------- - -The function ``signal.siginterrupt()`` becomes useless with this PEP, -it should be deprecated. When ``signal.siginterrupt(signum, False)`` -is used, some system calls don't fail with ``EINTR`` when a signal is -received. Python cannot call its signal handler and interrupt the -system call. - -The function ``signal.siginterrupt()`` will be deprecated in Python -3.5. - -In Python 3.6, calling ``signal.siginterrupt(signum, False)`` will -raise an exception, whereas ``signal.siginterrupt(signum, True)`` will -only emit the deprecation warning. - - Backward Compatibility ====================== @@ -204,9 +187,6 @@ For example, use a signal handle which raises an exception, or use a wakeup file descriptor. -Applications should not call ``signal.siginterrupt(signum, False)`` -anymore, since this call will raise an exception in Python 3.6. - For applications using event loops, ``signal.set_wakeup_fd()`` is the recommanded option to handle signals. The signal handler writes signal numbers into the file descriptor and the event loop is awaken to read -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Jul 29 23:34:40 2014 From: python-checkins at python.org (victor.stinner) Date: Tue, 29 Jul 2014 23:34:40 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322018=3A_On_Windo?= =?utf-8?q?ws=2C_signal=2Eset=5Fwakeup=5Ffd=28=29_now_also_supports_socket?= =?utf-8?q?s=2E?= Message-ID: <3hNB401Z4dz7Ljc@mail.python.org> http://hg.python.org/cpython/rev/fbd104359ef8 changeset: 91933:fbd104359ef8 user: Victor Stinner date: Tue Jul 29 23:31:34 2014 +0200 summary: Issue #22018: On Windows, signal.set_wakeup_fd() now also supports sockets. A side effect is that Python depends to the WinSock library. files: Doc/c-api/exceptions.rst | 11 +- Doc/library/signal.rst | 3 + Lib/test/test_signal.py | 107 ++++++++++++++ Misc/NEWS | 3 + Modules/signalmodule.c | 183 ++++++++++++++++++++++-- PCbuild/pythoncore.vcxproj | 16 +- 6 files changed, 294 insertions(+), 29 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 @@ -443,13 +443,18 @@ .. c:function:: int PySignal_SetWakeupFd(int fd) - This utility function specifies a file descriptor to which a ``'\0'`` byte will - be written whenever a signal is received. It returns the previous such file - descriptor. The value ``-1`` disables the feature; this is the initial state. + This utility function specifies a file descriptor to which the signal number + is written as a single byte whenever a signal is received. *fd* must be + non-blocking. It returns the previous such file descriptor. + + The value ``-1`` disables the feature; this is the initial state. This is equivalent to :func:`signal.set_wakeup_fd` in Python, but without any error checking. *fd* should be a valid file descriptor. The function should only be called from the main thread. + .. versionchanged:: 3.5 + On Windows, the function now also supports socket handles. + .. c:function:: PyObject* PyErr_NewException(char *name, PyObject *base, PyObject *dict) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -318,6 +318,9 @@ attempting to call it from other threads will cause a :exc:`ValueError` exception to be raised. + .. versionchanged:: 3.5 + On Windows, the function now also supports socket handles. + .. function:: siginterrupt(signalnum, flag) 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 @@ -6,6 +6,7 @@ import pickle import select import signal +import socket import struct import subprocess import traceback @@ -255,6 +256,13 @@ self.assertRaises((ValueError, OSError), signal.set_wakeup_fd, fd) + def test_invalid_socket(self): + sock = socket.socket() + fd = sock.fileno() + sock.close() + self.assertRaises((ValueError, OSError), + signal.set_wakeup_fd, fd) + def test_set_wakeup_fd_result(self): r1, w1 = os.pipe() self.addCleanup(os.close, r1) @@ -268,6 +276,20 @@ self.assertEqual(signal.set_wakeup_fd(-1), w2) self.assertEqual(signal.set_wakeup_fd(-1), -1) + def test_set_wakeup_fd_socket_result(self): + sock1 = socket.socket() + self.addCleanup(sock1.close) + fd1 = sock1.fileno() + + sock2 = socket.socket() + self.addCleanup(sock2.close) + fd2 = sock2.fileno() + + signal.set_wakeup_fd(fd1) + self.assertIs(signal.set_wakeup_fd(fd2), fd1) + self.assertIs(signal.set_wakeup_fd(-1), fd2) + self.assertIs(signal.set_wakeup_fd(-1), -1) + @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class WakeupSignalTests(unittest.TestCase): @@ -435,6 +457,90 @@ """, signal.SIGUSR1, signal.SIGUSR2, ordered=False) + at unittest.skipUnless(hasattr(socket, 'socketpair'), 'need socket.socketpair') +class WakeupSocketSignalTests(unittest.TestCase): + + @unittest.skipIf(_testcapi is None, 'need _testcapi') + def test_socket(self): + # use a subprocess to have only one thread + code = """if 1: + import signal + import socket + import struct + import _testcapi + + signum = signal.SIGINT + signals = (signum,) + + def handler(signum, frame): + pass + + signal.signal(signum, handler) + + read, write = socket.socketpair() + read.setblocking(False) + write.setblocking(False) + signal.set_wakeup_fd(write.fileno()) + + _testcapi.raise_signal(signum) + + data = read.recv(1) + if not data: + raise Exception("no signum written") + raised = struct.unpack('B', data) + if raised != signals: + raise Exception("%r != %r" % (raised, signals)) + + read.close() + write.close() + """ + + assert_python_ok('-c', code) + + @unittest.skipIf(_testcapi is None, 'need _testcapi') + def test_send_error(self): + # Use a subprocess to have only one thread. + if os.name == 'nt': + action = 'send' + else: + action = 'write' + code = """if 1: + import errno + import signal + import socket + import sys + import time + import _testcapi + from test.support import captured_stderr + + signum = signal.SIGINT + + def handler(signum, frame): + pass + + signal.signal(signum, handler) + + read, write = socket.socketpair() + read.setblocking(False) + write.setblocking(False) + + signal.set_wakeup_fd(write.fileno()) + + # Close sockets: send() will fail + read.close() + write.close() + + with captured_stderr() as err: + _testcapi.raise_signal(signum) + + err = err.getvalue() + if ('Exception ignored when trying to {action} to the signal wakeup fd' + not in err): + raise AssertionError(err) + """.format(action=action) + assert_python_ok('-c', code) + + @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class SiginterruptTest(unittest.TestCase): @@ -984,6 +1090,7 @@ try: support.run_unittest(GenericTests, PosixTests, InterProcessSignalTests, WakeupFDTests, WakeupSignalTests, + WakeupSocketSignalTests, SiginterruptTest, ItimerTest, WindowsSignalTests, PendingSignalsTests) finally: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- Issue #22018: On Windows, signal.set_wakeup_fd() now also supports sockets. + A side effect is that Python depends to the WinSock library. + - Issue #22054: Add os.get_blocking() and os.set_blocking() functions to get and set the blocking mode of a file descriptor (False if the O_NONBLOCK flag is set, True otherwise). These functions are not available on Windows. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -7,6 +7,9 @@ #ifndef MS_WINDOWS #include "posixmodule.h" #endif +#ifdef MS_WINDOWS +#include "socketmodule.h" /* needed for SOCKET_T */ +#endif #ifdef MS_WINDOWS #include @@ -87,7 +90,20 @@ PyObject *func; } Handlers[NSIG]; +#ifdef MS_WINDOWS +#define INVALID_FD ((SOCKET_T)-1) + +static volatile struct { + SOCKET_T fd; + int use_send; + int send_err_set; + int send_errno; + int send_win_error; +} wakeup = {INVALID_FD, 0, 0}; +#else +#define INVALID_FD (-1) static volatile sig_atomic_t wakeup_fd = -1; +#endif /* Speed up sigcheck() when none tripped */ static volatile sig_atomic_t is_tripped = 0; @@ -172,7 +188,7 @@ } static int -report_wakeup_error(void *data) +report_wakeup_write_error(void *data) { int save_errno = errno; errno = (int) (Py_intptr_t) data; @@ -184,25 +200,86 @@ return 0; } +#ifdef MS_WINDOWS +static int +report_wakeup_send_error(void* Py_UNUSED(data)) +{ + PyObject *res; + + if (wakeup.send_win_error) { + /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which + recognizes the error codes used by both GetLastError() and + WSAGetLastError */ + res = PyErr_SetExcFromWindowsErr(PyExc_OSError, wakeup.send_win_error); + } + else { + errno = wakeup.send_errno; + res = PyErr_SetFromErrno(PyExc_OSError); + } + + assert(res == NULL); + wakeup.send_err_set = 0; + + PySys_WriteStderr("Exception ignored when trying to send to the " + "signal wakeup fd:\n"); + PyErr_WriteUnraisable(NULL); + + return 0; +} +#endif /* MS_WINDOWS */ + static void trip_signal(int sig_num) { unsigned char byte; - int rc = 0; + int fd; + Py_ssize_t rc; Handlers[sig_num].tripped = 1; - if (wakeup_fd != -1) { + +#ifdef MS_WINDOWS + fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); +#else + fd = wakeup_fd; +#endif + + if (fd != INVALID_FD) { byte = (unsigned char)sig_num; - while ((rc = write(wakeup_fd, &byte, 1)) == -1 && errno == EINTR); - if (rc == -1) - Py_AddPendingCall(report_wakeup_error, (void *) (Py_intptr_t) errno); +#ifdef MS_WINDOWS + if (wakeup.use_send) { + do { + rc = send(fd, &byte, 1, 0); + } while (rc < 0 && errno == EINTR); + + /* we only have a storage for one error in the wakeup structure */ + if (rc < 0 && !wakeup.send_err_set) { + wakeup.send_err_set = 1; + wakeup.send_errno = errno; + wakeup.send_win_error = GetLastError(); + Py_AddPendingCall(report_wakeup_send_error, NULL); + } + } + else +#endif + { + byte = (unsigned char)sig_num; + do { + rc = write(fd, &byte, 1); + } while (rc < 0 && errno == EINTR); + + if (rc < 0) { + Py_AddPendingCall(report_wakeup_write_error, + (void *)(Py_intptr_t)errno); + } + } } - if (is_tripped) - return; - /* Set is_tripped after setting .tripped, as it gets - cleared in PyErr_CheckSignals() before .tripped. */ - is_tripped = 1; - Py_AddPendingCall(checksignals_witharg, NULL); + + if (!is_tripped) { + /* Set is_tripped after setting .tripped, as it gets + cleared in PyErr_CheckSignals() before .tripped. */ + is_tripped = 1; + Py_AddPendingCall(checksignals_witharg, NULL); + } } static void @@ -426,10 +503,29 @@ static PyObject * signal_set_wakeup_fd(PyObject *self, PyObject *args) { - struct stat buf; +#ifdef MS_WINDOWS + PyObject *fdobj; + SOCKET_T fd, old_fd; + int res; + int res_size = sizeof res; + PyObject *mod; + struct stat st; + int is_socket; + + if (!PyArg_ParseTuple(args, "O:set_wakeup_fd", &fdobj)) + return NULL; + + fd = PyLong_AsSocket_t(fdobj); + if (fd == (SOCKET_T)(-1) && PyErr_Occurred()) + return NULL; +#else int fd, old_fd; + struct stat st; + if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd)) return NULL; +#endif + #ifdef WITH_THREAD if (PyThread_get_thread_ident() != main_thread) { PyErr_SetString(PyExc_ValueError, @@ -438,28 +534,72 @@ } #endif +#ifdef MS_WINDOWS + is_socket = 0; + if (fd != INVALID_FD) { + /* Import the _socket module to call WSAStartup() */ + mod = PyImport_ImportModuleNoBlock("_socket"); + if (mod == NULL) + return NULL; + Py_DECREF(mod); + + /* test the socket */ + if (getsockopt(fd, SOL_SOCKET, SO_ERROR, + (char *)&res, &res_size) != 0) { + int err = WSAGetLastError(); + if (err != WSAENOTSOCK) { + PyErr_SetExcFromWindowsErr(PyExc_OSError, err); + return NULL; + } + + if (!_PyVerify_fd(fd)) { + PyErr_SetString(PyExc_ValueError, "invalid fd"); + return NULL; + } + + if (fstat(fd, &st) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } + } + else + is_socket = 1; + } + + old_fd = wakeup.fd; + wakeup.fd = fd; + wakeup.use_send = is_socket; + + if (old_fd != INVALID_FD) + return PyLong_FromSocket_t(old_fd); + else + return PyLong_FromLong(-1); +#else if (fd != -1) { if (!_PyVerify_fd(fd)) { PyErr_SetString(PyExc_ValueError, "invalid fd"); return NULL; } - if (fstat(fd, &buf) != 0) - return PyErr_SetFromErrno(PyExc_OSError); + if (fstat(fd, &st) != 0) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } } old_fd = wakeup_fd; wakeup_fd = fd; return PyLong_FromLong(old_fd); +#endif } PyDoc_STRVAR(set_wakeup_fd_doc, "set_wakeup_fd(fd) -> fd\n\ \n\ -Sets the fd to be written to (with '\\0') when a signal\n\ +Sets the fd to be written to (with the signal number) when a signal\n\ comes in. A library can use this to wakeup select or poll.\n\ -The previous fd is returned.\n\ +The previous fd or -1 is returned.\n\ \n\ The fd must be non-blocking."); @@ -467,10 +607,17 @@ int PySignal_SetWakeupFd(int fd) { - int old_fd = wakeup_fd; + int old_fd; if (fd < 0) fd = -1; + +#ifdef MS_WINDOWS + old_fd = Py_SAFE_DOWNCAST(wakeup.fd, SOCKET_T, int); + wakeup.fd = fd; +#else + old_fd = wakeup_fd; wakeup_fd = fd; +#endif return old_fd; } diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -176,7 +176,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -212,7 +212,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -247,7 +247,7 @@ "$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -285,7 +285,7 @@ "$(SolutionDir)make_buildinfo.exe" Debug "$(IntDir)" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -317,7 +317,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -353,7 +353,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 MachineX64 @@ -386,7 +386,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) $(OutDir)$(PyDllName).dll libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 @@ -422,7 +422,7 @@ "$(SolutionDir)make_buildinfo.exe" Release "$(IntDir)\" - $(IntDir)getbuildinfo.o;%(AdditionalDependencies) + $(IntDir)getbuildinfo.o;ws2_32.lib;%(AdditionalDependencies) libc;%(IgnoreSpecificDefaultLibraries) 0x1e000000 MachineX64 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 00:39:22 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 30 Jul 2014 00:39:22 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDIz?= =?utf-8?q?=3A_Fix_=25S=2C_=25R_and_=25V_formats_of_PyUnicode=5FFromFormat?= =?utf-8?b?KCku?= Message-ID: <3hNCVf6lrHz7LjV@mail.python.org> http://hg.python.org/cpython/rev/263701e0b77e changeset: 91934:263701e0b77e branch: 2.7 parent: 91924:6c47c6d2033e user: Victor Stinner date: Wed Jul 30 00:39:05 2014 +0200 summary: Issue #22023: Fix %S, %R and %V formats of PyUnicode_FromFormat(). files: Lib/test/test_unicode.py | 112 +++++++++++++++++++++++++++ Misc/NEWS | 3 + Objects/unicodeobject.c | 18 ++-- 3 files changed, 124 insertions(+), 9 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 @@ -1659,6 +1659,118 @@ self.assertEqual("%s" % u, u'__unicode__ overridden') self.assertEqual("{}".format(u), '__unicode__ overridden') + # Test PyUnicode_FromFormat() + def test_from_format(self): + test_support.import_module('ctypes') + from ctypes import ( + pythonapi, py_object, sizeof, + c_int, c_long, c_longlong, c_ssize_t, + c_uint, c_ulong, c_ulonglong, c_size_t, c_void_p) + if sys.maxunicode == 0xffff: + name = "PyUnicodeUCS2_FromFormat" + else: + name = "PyUnicodeUCS4_FromFormat" + _PyUnicode_FromFormat = getattr(pythonapi, name) + _PyUnicode_FromFormat.restype = py_object + + def PyUnicode_FromFormat(format, *args): + cargs = tuple( + py_object(arg) if isinstance(arg, unicode) else arg + for arg in args) + return _PyUnicode_FromFormat(format, *cargs) + + def check_format(expected, format, *args): + text = PyUnicode_FromFormat(format, *args) + self.assertEqual(expected, text) + + # ascii format, non-ascii argument + check_format(u'ascii\x7f=unicode\xe9', + b'ascii\x7f=%U', u'unicode\xe9') + + # non-ascii format, ascii argument: ensure that PyUnicode_FromFormatV() + # raises an error + #self.assertRaisesRegex(ValueError, + # '^PyUnicode_FromFormatV\(\) expects an ASCII-encoded format ' + # 'string, got a non-ASCII byte: 0xe9$', + # PyUnicode_FromFormat, b'unicode\xe9=%s', u'ascii') + + # test "%c" + check_format(u'\uabcd', + b'%c', c_int(0xabcd)) + if sys.maxunicode > 0xffff: + check_format(u'\U0010ffff', + b'%c', c_int(0x10ffff)) + with self.assertRaises(OverflowError): + PyUnicode_FromFormat(b'%c', c_int(0x110000)) + # Issue #18183 + if sys.maxunicode > 0xffff: + check_format(u'\U00010000\U00100000', + b'%c%c', c_int(0x10000), c_int(0x100000)) + + # test "%" + check_format(u'%', + b'%') + check_format(u'%', + b'%%') + check_format(u'%s', + b'%%s') + check_format(u'[%]', + b'[%%]') + check_format(u'%abc', + b'%%%s', b'abc') + + # test %S + check_format(u"repr=abc", + b'repr=%S', u'abc') + + # test %R + check_format(u"repr=u'abc'", + b'repr=%R', u'abc') + + # test integer formats (%i, %d, %u) + check_format(u'010', + b'%03i', c_int(10)) + check_format(u'0010', + b'%0.4i', c_int(10)) + check_format(u'-123', + b'%i', c_int(-123)) + + check_format(u'-123', + b'%d', c_int(-123)) + check_format(u'-123', + b'%ld', c_long(-123)) + check_format(u'-123', + b'%zd', c_ssize_t(-123)) + + check_format(u'123', + b'%u', c_uint(123)) + check_format(u'123', + b'%lu', c_ulong(123)) + check_format(u'123', + b'%zu', c_size_t(123)) + + # test long output + PyUnicode_FromFormat(b'%p', c_void_p(-1)) + + # test %V + check_format(u'repr=abc', + b'repr=%V', u'abc', b'xyz') + check_format(u'repr=\xe4\xba\xba\xe6\xb0\x91', + b'repr=%V', None, b'\xe4\xba\xba\xe6\xb0\x91') + check_format(u'repr=abc\xff', + b'repr=%V', None, b'abc\xff') + + # not supported: copy the raw format string. these tests are just here + # to check for crashs and should not be considered as specifications + check_format(u'%s', + b'%1%s', b'abc') + check_format(u'%1abc', + b'%1abc') + check_format(u'%+i', + b'%+i', c_int(10)) + check_format(u'%s', + b'%.%s', b'abc') + @test_support.cpython_only def test_encode_decimal(self): from _testcapi import unicode_encodedecimal diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #22023: Fix ``%S``, ``%R`` and ``%V`` formats of + :c:func:`PyUnicode_FromFormat`. + - Issue #21591: Correctly handle qualified exec statements in tuple form by moving compatibility layer from run-time to AST transformation. diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -690,7 +690,12 @@ *fmt = '\0'; } -#define appendstring(string) {for (copy = string;*copy;) *s++ = *copy++;} +#define appendstring(string) \ + do { \ + for (copy = string;*copy; copy++) { \ + *s++ = (unsigned char)*copy; \ + } \ + } while (0) PyObject * PyUnicode_FromFormatV(const char *format, va_list vargs) @@ -845,7 +850,7 @@ str = PyObject_Str(obj); if (!str) goto fail; - n += PyUnicode_GET_SIZE(str); + n += PyString_GET_SIZE(str); /* Remember the str and switch to the next slot */ *callresult++ = str; break; @@ -1006,15 +1011,10 @@ case 'S': case 'R': { - Py_UNICODE *ucopy; - Py_ssize_t usize; - Py_ssize_t upos; + const char *str = PyString_AS_STRING(*callresult); /* unused, since we already have the result */ (void) va_arg(vargs, PyObject *); - ucopy = PyUnicode_AS_UNICODE(*callresult); - usize = PyUnicode_GET_SIZE(*callresult); - for (upos = 0; upos forget it */ Py_DECREF(*callresult); /* switch to next unicode()/repr() result */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 01:45:47 2014 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 30 Jul 2014 01:45:47 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322003=3A_When_ini?= =?utf-8?q?tialized_from_a_bytes_object=2C_io=2EBytesIO=28=29_now?= Message-ID: <3hNDzH5WHWz7Ljk@mail.python.org> http://hg.python.org/cpython/rev/79a5fbe2c78f changeset: 91935:79a5fbe2c78f parent: 91933:fbd104359ef8 user: Antoine Pitrou date: Tue Jul 29 19:41:11 2014 -0400 summary: Issue #22003: When initialized from a bytes object, io.BytesIO() now defers making a copy until it is mutated, improving performance and memory use on some use cases. Patch by David Wilson. files: Lib/test/test_memoryio.py | 52 ++++++- Misc/ACKS | 1 + Misc/NEWS | 4 + Modules/_io/bytesio.c | 202 +++++++++++++++++++------ 4 files changed, 205 insertions(+), 54 deletions(-) diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py --- a/Lib/test/test_memoryio.py +++ b/Lib/test/test_memoryio.py @@ -9,6 +9,7 @@ import io import _pyio as pyio import pickle +import sys class MemorySeekTestMixin: @@ -711,12 +712,57 @@ @support.cpython_only def test_sizeof(self): - basesize = support.calcobjsize('P2nN2Pn') + basesize = support.calcobjsize('P2nN2PnP') check = self.check_sizeof self.assertEqual(object.__sizeof__(io.BytesIO()), basesize) check(io.BytesIO(), basesize ) - check(io.BytesIO(b'a'), basesize + 1 + 1 ) - check(io.BytesIO(b'a' * 1000), basesize + 1000 + 1 ) + check(io.BytesIO(b'a'), basesize + 1 ) + check(io.BytesIO(b'a' * 1000), basesize + 1000) + + # Various tests of copy-on-write behaviour for BytesIO. + + def _test_cow_mutation(self, mutation): + # Common code for all BytesIO copy-on-write mutation tests. + imm = b' ' * 1024 + old_rc = sys.getrefcount(imm) + memio = self.ioclass(imm) + self.assertEqual(sys.getrefcount(imm), old_rc + 1) + mutation(memio) + self.assertEqual(sys.getrefcount(imm), old_rc) + + @support.cpython_only + def test_cow_truncate(self): + # Ensure truncate causes a copy. + def mutation(memio): + memio.truncate(1) + self._test_cow_mutation(mutation) + + @support.cpython_only + def test_cow_write(self): + # Ensure write that would not cause a resize still results in a copy. + def mutation(memio): + memio.seek(0) + memio.write(b'foo') + self._test_cow_mutation(mutation) + + @support.cpython_only + def test_cow_setstate(self): + # __setstate__ should cause buffer to be released. + memio = self.ioclass(b'foooooo') + state = memio.__getstate__() + def mutation(memio): + memio.__setstate__(state) + self._test_cow_mutation(mutation) + + @support.cpython_only + def test_cow_mutable(self): + # BytesIO should accept only Bytes for copy-on-write sharing, since + # arbitrary buffer-exporting objects like bytearray() aren't guaranteed + # to be immutable. + ba = bytearray(1024) + old_rc = sys.getrefcount(ba) + memio = self.ioclass(ba) + self.assertEqual(sys.getrefcount(ba), old_rc) class CStringIOTest(PyStringIOTest): ioclass = io.StringIO diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1456,6 +1456,7 @@ Carol Willing Steven Willis Frank Willison +David Wilson Geoff Wilson Greg V. Wilson J Derek Wilson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,10 @@ Library ------- +- Issue #22003: When initialized from a bytes object, io.BytesIO() now + defers making a copy until it is mutated, improving performance and + memory use on some use cases. Patch by David Wilson. + - Issue #22018: On Windows, signal.set_wakeup_fd() now also supports sockets. A side effect is that Python depends to the WinSock library. diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c --- a/Modules/_io/bytesio.c +++ b/Modules/_io/bytesio.c @@ -11,6 +11,10 @@ PyObject *dict; PyObject *weakreflist; Py_ssize_t exports; + /** If `initvalue' != NULL, `buf' is a read-only pointer into the PyBytes + * referenced by `initvalue'. It must be copied prior to mutation, and + * released during finalization */ + PyObject *initvalue; } bytesio; typedef struct { @@ -19,11 +23,11 @@ } bytesiobuf; -#define CHECK_CLOSED(self) \ +#define CHECK_CLOSED(self, ret) \ if ((self)->buf == NULL) { \ PyErr_SetString(PyExc_ValueError, \ "I/O operation on closed file."); \ - return NULL; \ + return ret; \ } #define CHECK_EXPORTS(self) \ @@ -33,6 +37,45 @@ return NULL; \ } +/* Ensure we have a buffer suitable for writing, in the case that an initvalue + * object was provided, and we're currently borrowing its buffer. `size' + * indicates the new buffer size allocated as part of unsharing, to avoid a + * redundant reallocation caused by any subsequent mutation. `truncate' + * indicates whether truncation should occur if `size` < self->string_size. + * + * Do nothing if the buffer wasn't shared. Returns 0 on success, or sets an + * exception and returns -1 on failure. Existing state is preserved on failure. + */ +static int +unshare(bytesio *self, size_t preferred_size, int truncate) +{ + if (self->initvalue) { + Py_ssize_t copy_size; + char *new_buf; + + if((! truncate) && preferred_size < self->string_size) { + preferred_size = self->string_size; + } + + new_buf = (char *)PyMem_Malloc(preferred_size); + if (new_buf == NULL) { + PyErr_NoMemory(); + return -1; + } + + copy_size = self->string_size; + if (copy_size > preferred_size) { + copy_size = preferred_size; + } + + memcpy(new_buf, self->buf, copy_size); + Py_CLEAR(self->initvalue); + self->buf = new_buf; + self->buf_size = preferred_size; + self->string_size = (Py_ssize_t) copy_size; + } + return 0; +} /* Internal routine to get a line from the buffer of a BytesIO object. Returns the length between the current position to the @@ -125,11 +168,18 @@ static Py_ssize_t write_bytes(bytesio *self, const char *bytes, Py_ssize_t len) { + size_t desired; + assert(self->buf != NULL); assert(self->pos >= 0); assert(len >= 0); - if ((size_t)self->pos + len > self->buf_size) { + desired = (size_t)self->pos + len; + if (unshare(self, desired, 0) < 0) { + return -1; + } + + if (desired > self->buf_size) { if (resize_buffer(self, (size_t)self->pos + len) < 0) return -1; } @@ -160,6 +210,74 @@ return len; } +/* Release or free any existing buffer, and place the BytesIO in the closed + * state. */ +static void +reset(bytesio *self) +{ + if (self->initvalue) { + Py_CLEAR(self->initvalue); + } else if (self->buf) { + PyMem_Free(self->buf); + } + self->buf = NULL; + self->string_size = 0; + self->pos = 0; +} + +/* Reinitialize with a new heap-allocated buffer of size `size`. Returns 0 on + * success, or sets an exception and returns -1 on failure. Existing state is + * preserved on failure. */ +static int +reinit_private(bytesio *self, Py_ssize_t size) +{ + char *tmp = (char *)PyMem_Malloc(size); + if (tmp == NULL) { + PyErr_NoMemory(); + return -1; + } + reset(self); + self->buf = tmp; + self->buf_size = size; + return 0; +} + +/* Internal version of BytesIO.__init__; resets the object to its initial + * (closed) state before repopulating it, optionally by sharing a PyBytes + * buffer provided by `initvalue'. Returns 0 on success, or sets an exception + * and returns -1 on failure. */ +static int +reinit(bytesio *self, PyObject *initvalue) +{ + CHECK_CLOSED(self, -1); + + if (initvalue == NULL || initvalue == Py_None) { + if (reinit_private(self, 0) < 0) { + return -1; + } + } else if (PyBytes_CheckExact(initvalue)) { + reset(self); + Py_INCREF(initvalue); + self->initvalue = initvalue; + self->buf = PyBytes_AS_STRING(initvalue); + self->buf_size = PyBytes_GET_SIZE(initvalue); + self->string_size = PyBytes_GET_SIZE(initvalue); + } else { + Py_buffer buf; + if (PyObject_GetBuffer(initvalue, &buf, PyBUF_CONTIG_RO) < 0) { + return -1; + } + if (reinit_private(self, buf.len) < 0) { + PyBuffer_Release(&buf); + return -1; + } + memcpy(self->buf, buf.buf, buf.len); + self->string_size = buf.len; + PyBuffer_Release(&buf); + } + return 0; +} + static PyObject * bytesio_get_closed(bytesio *self) { @@ -184,7 +302,7 @@ static PyObject * return_not_closed(bytesio *self) { - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); Py_RETURN_TRUE; } @@ -194,7 +312,7 @@ static PyObject * bytesio_flush(bytesio *self) { - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); Py_RETURN_NONE; } @@ -210,7 +328,7 @@ bytesiobuf *buf; PyObject *view; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); buf = (bytesiobuf *) type->tp_alloc(type, 0); if (buf == NULL) @@ -230,7 +348,7 @@ static PyObject * bytesio_getvalue(bytesio *self) { - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); return PyBytes_FromStringAndSize(self->buf, self->string_size); } @@ -243,7 +361,7 @@ static PyObject * bytesio_isatty(bytesio *self) { - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); Py_RETURN_FALSE; } @@ -253,7 +371,7 @@ static PyObject * bytesio_tell(bytesio *self) { - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); return PyLong_FromSsize_t(self->pos); } @@ -270,7 +388,7 @@ char *output; PyObject *arg = Py_None; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); if (!PyArg_ParseTuple(args, "|O:read", &arg)) return NULL; @@ -339,7 +457,7 @@ char *output; PyObject *arg = Py_None; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); if (!PyArg_ParseTuple(args, "|O:readline", &arg)) return NULL; @@ -385,7 +503,7 @@ char *output; PyObject *arg = Py_None; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); if (!PyArg_ParseTuple(args, "|O:readlines", &arg)) return NULL; @@ -442,7 +560,7 @@ void *raw_buffer; Py_ssize_t len, n; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); if (PyObject_AsWriteBuffer(buffer, &raw_buffer, &len) == -1) return NULL; @@ -475,7 +593,7 @@ Py_ssize_t size; PyObject *arg = Py_None; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); CHECK_EXPORTS(self); if (!PyArg_ParseTuple(args, "|O:truncate", &arg)) @@ -502,6 +620,10 @@ return NULL; } + if (unshare(self, size, 1) < 0) { + return NULL; + } + if (size < self->string_size) { self->string_size = size; if (resize_buffer(self, size) < 0) @@ -517,7 +639,7 @@ char *next; Py_ssize_t n; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); n = get_line(self, &next); @@ -542,7 +664,7 @@ Py_ssize_t pos; int mode = 0; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); if (!PyArg_ParseTuple(args, "n|i:seek", &pos, &mode)) return NULL; @@ -597,7 +719,7 @@ Py_buffer buf; PyObject *result = NULL; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); CHECK_EXPORTS(self); if (PyObject_GetBuffer(obj, &buf, PyBUF_CONTIG_RO) < 0) @@ -625,7 +747,7 @@ PyObject *it, *item; PyObject *ret; - CHECK_CLOSED(self); + CHECK_CLOSED(self, NULL); it = PyObject_GetIter(v); if (it == NULL) @@ -655,10 +777,7 @@ static PyObject * bytesio_close(bytesio *self) { - if (self->buf != NULL) { - PyMem_Free(self->buf); - self->buf = NULL; - } + reset(self); Py_RETURN_NONE; } @@ -706,11 +825,11 @@ static PyObject * bytesio_setstate(bytesio *self, PyObject *state) { - PyObject *result; PyObject *position_obj; PyObject *dict; Py_ssize_t pos; + CHECK_EXPORTS(self); assert(state != NULL); /* We allow the state tuple to be longer than 3, because we may need @@ -722,18 +841,13 @@ Py_TYPE(self)->tp_name, Py_TYPE(state)->tp_name); return NULL; } - CHECK_EXPORTS(self); - /* Reset the object to its default state. This is only needed to handle - the case of repeated calls to __setstate__. */ - self->string_size = 0; - self->pos = 0; - /* Set the value of the internal buffer. If state[0] does not support the - buffer protocol, bytesio_write will raise the appropriate TypeError. */ - result = bytesio_write(self, PyTuple_GET_ITEM(state, 0)); - if (result == NULL) + /* Reset the object to its default state and set the value of the internal + * buffer. If state[0] does not support the buffer protocol, reinit() will + * raise the appropriate TypeError. */ + if (reinit(self, PyTuple_GET_ITEM(state, 0)) < 0) { return NULL; - Py_DECREF(result); + } /* Set carefully the position value. Alternatively, we could use the seek method instead of modifying self->pos directly to better protect the @@ -788,10 +902,9 @@ "deallocated BytesIO object has exported buffers"); PyErr_Print(); } - if (self->buf != NULL) { - PyMem_Free(self->buf); - self->buf = NULL; - } + + reset(self); + Py_CLEAR(self->dict); if (self->weakreflist != NULL) PyObject_ClearWeakRefs((PyObject *) self); @@ -830,20 +943,7 @@ &initvalue)) return -1; - /* In case, __init__ is called multiple times. */ - self->string_size = 0; - self->pos = 0; - - if (initvalue && initvalue != Py_None) { - PyObject *res; - res = bytesio_write(self, initvalue); - if (res == NULL) - return -1; - Py_DECREF(res); - self->pos = 0; - } - - return 0; + return reinit(self, initvalue); } static PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 10:02:15 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 30 Jul 2014 10:02:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxOTUx?= =?utf-8?q?=3A_Temporary_skip_crashing_test=5Fuser=5Fcommand_on_AIX=2E?= Message-ID: <3hNS071XZLz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/7de64def6565 changeset: 91936:7de64def6565 branch: 2.7 parent: 91934:263701e0b77e user: Serhiy Storchaka date: Wed Jul 30 10:58:34 2014 +0300 summary: Issue #21951: Temporary skip crashing test_user_command on AIX. files: Lib/test/test_tcl.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -426,6 +426,7 @@ self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') + @unittest.skipIf(sys.platform.startswith("aix"), 'Issue #21951: crashes on AIX') def test_user_command(self): result = [] def testfunc(arg): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 10:02:16 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 30 Jul 2014 10:02:16 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxOTUx?= =?utf-8?q?=3A_Temporary_skip_crashing_test=5Fuser=5Fcommand_on_AIX=2E?= Message-ID: <3hNS082tzSz7Ljn@mail.python.org> http://hg.python.org/cpython/rev/31f4cb1fede9 changeset: 91937:31f4cb1fede9 branch: 3.4 parent: 91931:95ceec174baf user: Serhiy Storchaka date: Wed Jul 30 10:59:46 2014 +0300 summary: Issue #21951: Temporary skip crashing test_user_command on AIX. files: Lib/test/test_tcl.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -412,6 +412,7 @@ self.assertEqual(passValue((1, '2', (3.4,))), (1, '2', (3.4,)) if self.wantobjects else '1 2 3.4') + @unittest.skipIf(sys.platform.startswith("aix"), 'Issue #21951: crashes on AIX') def test_user_command(self): result = None def testfunc(arg): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 10:02:17 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 30 Jul 2014 10:02:17 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321951=3A_Temporary_skip_crashing_test=5Fuser=5F?= =?utf-8?q?command_on_AIX=2E?= Message-ID: <3hNS094KTqz7Lk0@mail.python.org> http://hg.python.org/cpython/rev/de32cd419174 changeset: 91938:de32cd419174 parent: 91935:79a5fbe2c78f parent: 91937:31f4cb1fede9 user: Serhiy Storchaka date: Wed Jul 30 11:00:45 2014 +0300 summary: Issue #21951: Temporary skip crashing test_user_command on AIX. files: Lib/test/test_tcl.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -414,6 +414,7 @@ self.assertEqual(passValue(['a', ['b', 'c']]), ('a', ('b', 'c')) if self.wantobjects else 'a {b c}') + @unittest.skipIf(sys.platform.startswith("aix"), 'Issue #21951: crashes on AIX') def test_user_command(self): result = None def testfunc(arg): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 10:07:24 2014 From: python-checkins at python.org (victor.stinner) Date: Wed, 30 Jul 2014 10:07:24 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322018=3A_Fix_test?= =?utf-8?q?=5Fsignal=3A_use_assertEqual=28=29_not_assertIs=28=29?= Message-ID: <3hNS645kHdz7Ljl@mail.python.org> http://hg.python.org/cpython/rev/963214896b22 changeset: 91939:963214896b22 user: Victor Stinner date: Wed Jul 30 10:03:03 2014 +0200 summary: Issue #22018: Fix test_signal: use assertEqual() not assertIs() files: Lib/test/test_signal.py | 6 +++--- 1 files changed, 3 insertions(+), 3 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 @@ -286,9 +286,9 @@ fd2 = sock2.fileno() signal.set_wakeup_fd(fd1) - self.assertIs(signal.set_wakeup_fd(fd2), fd1) - self.assertIs(signal.set_wakeup_fd(-1), fd2) - self.assertIs(signal.set_wakeup_fd(-1), -1) + self.assertEqual(signal.set_wakeup_fd(fd2), fd1) + self.assertEqual(signal.set_wakeup_fd(-1), fd2) + self.assertEqual(signal.set_wakeup_fd(-1), -1) @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Jul 30 10:58:19 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 30 Jul 2014 10:58:19 +0200 Subject: [Python-checkins] Daily reference leaks (79a5fbe2c78f): sum=271 Message-ID: results for 79a5fbe2c78f on branch "default" -------------------------------------------- test_asyncio leaked [-53, 0, 265] references, sum=212 test_asyncio leaked [-15, 2, 75] memory blocks, sum=62 test_collections leaked [-2, 0, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 test_site leaked [-2, 0, 0] references, sum=-2 test_site leaked [-2, 0, 0] memory blocks, sum=-2 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogbuHSKV', '-x'] From python-checkins at python.org Wed Jul 30 17:34:19 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 30 Jul 2014 17:34:19 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIxNTgw?= =?utf-8?q?=3A_Now_Tkinter_correctly_handles_bytes_arguments_passed_to_Tk?= =?utf-8?q?=2E?= Message-ID: <3hNf1l1fwdz7Ljd@mail.python.org> http://hg.python.org/cpython/rev/9474f2971855 changeset: 91940:9474f2971855 branch: 3.4 parent: 91937:31f4cb1fede9 user: Serhiy Storchaka date: Wed Jul 30 18:33:13 2014 +0300 summary: Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk. In particular this allows to initialize images from binary data. files: Lib/test/test_tcl.py | 24 ++++++--- Lib/tkinter/test/test_tkinter/test_images.py | 5 -- Misc/NEWS | 3 + Modules/_tkinter.c | 4 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -389,8 +389,12 @@ self.assertEqual(passValue('str\x00ing'), 'str\x00ing') self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd') self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') - self.assertEqual(passValue(b'str\x00ing'), 'str\x00ing') - self.assertEqual(passValue(b'str\xc0\x80ing'), 'str\x00ing') + self.assertEqual(passValue(b'str\x00ing'), + b'str\x00ing' if self.wantobjects else 'str\x00ing') + self.assertEqual(passValue(b'str\xc0\x80ing'), + b'str\xc0\x80ing' if self.wantobjects else 'str\xc0\x80ing') + self.assertEqual(passValue(b'str\xbding'), + b'str\xbding' if self.wantobjects else 'str\xbding') for i in (0, 1, -1, 2**31-1, -2**31): self.assertEqual(passValue(i), i if self.wantobjects else str(i)) for f in (0.0, 1.0, -1.0, 1/3, @@ -438,12 +442,14 @@ check('string\xbd', 'string\xbd') check('string\u20ac', 'string\u20ac') check(b'string', 'string') - check(b'string\xe2\x82\xac', 'string\u20ac') + check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') + check(b'string\xbd', 'string\xbd') check('str\x00ing', 'str\x00ing') check('str\x00ing\xbd', 'str\x00ing\xbd') check('str\x00ing\u20ac', 'str\x00ing\u20ac') - check(b'str\xc0\x80ing', 'str\x00ing') - check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac') + check(b'str\x00ing', 'str\x00ing') + check(b'str\xc0\x80ing', 'str\xc0\x80ing') + check(b'str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac') for i in (0, 1, -1, 2**31-1, -2**31): check(i, str(i)) for f in (0.0, 1.0, -1.0): @@ -488,9 +494,9 @@ if tcl_version >= (8, 5): if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): # Before 8.5.5 dicts were converted to lists through string - expected = ('12', '\u20ac', '\u20ac', '3.4') + expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') else: - expected = (12, '\u20ac', '\u20ac', (3.4,)) + expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) testcases += [ (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), expected), @@ -535,9 +541,9 @@ if tcl_version >= (8, 5): if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): # Before 8.5.5 dicts were converted to lists through string - expected = ('12', '\u20ac', '\u20ac', '3.4') + expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') else: - expected = (12, '\u20ac', '\u20ac', (3.4,)) + expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) testcases += [ (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), expected), diff --git a/Lib/tkinter/test/test_tkinter/test_images.py b/Lib/tkinter/test/test_tkinter/test_images.py --- a/Lib/tkinter/test/test_tkinter/test_images.py +++ b/Lib/tkinter/test/test_tkinter/test_images.py @@ -161,21 +161,18 @@ def test_create_from_ppm_file(self): self.check_create_from_file('ppm') - @unittest.skip('issue #21580') def test_create_from_ppm_data(self): self.check_create_from_data('ppm') def test_create_from_pgm_file(self): self.check_create_from_file('pgm') - @unittest.skip('issue #21580') def test_create_from_pgm_data(self): self.check_create_from_data('pgm') def test_create_from_gif_file(self): self.check_create_from_file('gif') - @unittest.skip('issue #21580') def test_create_from_gif_data(self): self.check_create_from_data('gif') @@ -183,12 +180,10 @@ def test_create_from_png_file(self): self.check_create_from_file('png') - @unittest.skip('issue #21580') @requires_tcl(8, 6) def test_create_from_png_data(self): self.check_create_from_data('png') - @unittest.skip('issue #21580') def test_configure_data(self): image = tkinter.PhotoImage('::img::test', master=self.root) self.assertEqual(image['data'], '') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -27,6 +27,9 @@ Library ------- +- Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk. + In particular this allows to initialize images from binary data. + - Issue #17172: Make turtledemo start as active on OS X even when run with subprocess. Patch by Lita Cho. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -881,8 +881,8 @@ int overflow; if (PyBytes_Check(value)) - return Tcl_NewStringObj(PyBytes_AS_STRING(value), - PyBytes_GET_SIZE(value)); + return Tcl_NewByteArrayObj((unsigned char *)PyBytes_AS_STRING(value), + PyBytes_GET_SIZE(value)); else if (PyBool_Check(value)) return Tcl_NewBooleanObj(PyObject_IsTrue(value)); else if (PyLong_CheckExact(value) && -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 17:34:20 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 30 Jul 2014 17:34:20 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Issue_=2321580=3A_Now_Tkinter_correctly_handles_bytes_ar?= =?utf-8?q?guments_passed_to_Tk=2E?= Message-ID: <3hNf1m48TTz7Lk4@mail.python.org> http://hg.python.org/cpython/rev/b9d249316f29 changeset: 91941:b9d249316f29 parent: 91939:963214896b22 parent: 91940:9474f2971855 user: Serhiy Storchaka date: Wed Jul 30 18:34:01 2014 +0300 summary: Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk. In particular this allows to initialize images from binary data. files: Lib/test/test_tcl.py | 24 ++++++--- Lib/tkinter/test/test_tkinter/test_images.py | 5 -- Misc/NEWS | 3 + Modules/_tkinter.c | 4 +- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_tcl.py b/Lib/test/test_tcl.py --- a/Lib/test/test_tcl.py +++ b/Lib/test/test_tcl.py @@ -389,8 +389,12 @@ self.assertEqual(passValue('str\x00ing'), 'str\x00ing') self.assertEqual(passValue('str\x00ing\xbd'), 'str\x00ing\xbd') self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac') - self.assertEqual(passValue(b'str\x00ing'), 'str\x00ing') - self.assertEqual(passValue(b'str\xc0\x80ing'), 'str\x00ing') + self.assertEqual(passValue(b'str\x00ing'), + b'str\x00ing' if self.wantobjects else 'str\x00ing') + self.assertEqual(passValue(b'str\xc0\x80ing'), + b'str\xc0\x80ing' if self.wantobjects else 'str\xc0\x80ing') + self.assertEqual(passValue(b'str\xbding'), + b'str\xbding' if self.wantobjects else 'str\xbding') for i in (0, 1, -1, 2**31-1, -2**31): self.assertEqual(passValue(i), i if self.wantobjects else str(i)) for f in (0.0, 1.0, -1.0, 1/3, @@ -440,12 +444,14 @@ check('string\xbd', 'string\xbd') check('string\u20ac', 'string\u20ac') check(b'string', 'string') - check(b'string\xe2\x82\xac', 'string\u20ac') + check(b'string\xe2\x82\xac', 'string\xe2\x82\xac') + check(b'string\xbd', 'string\xbd') check('str\x00ing', 'str\x00ing') check('str\x00ing\xbd', 'str\x00ing\xbd') check('str\x00ing\u20ac', 'str\x00ing\u20ac') - check(b'str\xc0\x80ing', 'str\x00ing') - check(b'str\xc0\x80ing\xe2\x82\xac', 'str\x00ing\u20ac') + check(b'str\x00ing', 'str\x00ing') + check(b'str\xc0\x80ing', 'str\xc0\x80ing') + check(b'str\xc0\x80ing\xe2\x82\xac', 'str\xc0\x80ing\xe2\x82\xac') for i in (0, 1, -1, 2**31-1, -2**31): check(i, str(i)) for f in (0.0, 1.0, -1.0): @@ -493,9 +499,9 @@ if tcl_version >= (8, 5): if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): # Before 8.5.5 dicts were converted to lists through string - expected = ('12', '\u20ac', '\u20ac', '3.4') + expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') else: - expected = (12, '\u20ac', '\u20ac', (3.4,)) + expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) testcases += [ (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), expected), @@ -543,9 +549,9 @@ if tcl_version >= (8, 5): if not self.wantobjects or get_tk_patchlevel() < (8, 5, 5): # Before 8.5.5 dicts were converted to lists through string - expected = ('12', '\u20ac', '\u20ac', '3.4') + expected = ('12', '\u20ac', '\xe2\x82\xac', '3.4') else: - expected = (12, '\u20ac', '\u20ac', (3.4,)) + expected = (12, '\u20ac', b'\xe2\x82\xac', (3.4,)) testcases += [ (call('dict', 'create', 12, '\u20ac', b'\xe2\x82\xac', (3.4,)), expected), diff --git a/Lib/tkinter/test/test_tkinter/test_images.py b/Lib/tkinter/test/test_tkinter/test_images.py --- a/Lib/tkinter/test/test_tkinter/test_images.py +++ b/Lib/tkinter/test/test_tkinter/test_images.py @@ -161,21 +161,18 @@ def test_create_from_ppm_file(self): self.check_create_from_file('ppm') - @unittest.skip('issue #21580') def test_create_from_ppm_data(self): self.check_create_from_data('ppm') def test_create_from_pgm_file(self): self.check_create_from_file('pgm') - @unittest.skip('issue #21580') def test_create_from_pgm_data(self): self.check_create_from_data('pgm') def test_create_from_gif_file(self): self.check_create_from_file('gif') - @unittest.skip('issue #21580') def test_create_from_gif_data(self): self.check_create_from_data('gif') @@ -183,12 +180,10 @@ def test_create_from_png_file(self): self.check_create_from_file('png') - @unittest.skip('issue #21580') @requires_tcl(8, 6) def test_create_from_png_data(self): self.check_create_from_data('png') - @unittest.skip('issue #21580') def test_configure_data(self): image = tkinter.PhotoImage('::img::test', master=self.root) self.assertEqual(image['data'], '') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk. + In particular this allows to initialize images from binary data. + - Issue #22003: When initialized from a bytes object, io.BytesIO() now defers making a copy until it is mutated, improving performance and memory use on some use cases. Patch by David Wilson. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -901,8 +901,8 @@ int overflow; if (PyBytes_Check(value)) - return Tcl_NewStringObj(PyBytes_AS_STRING(value), - PyBytes_GET_SIZE(value)); + return Tcl_NewByteArrayObj((unsigned char *)PyBytes_AS_STRING(value), + PyBytes_GET_SIZE(value)); else if (PyBool_Check(value)) return Tcl_NewBooleanObj(PyObject_IsTrue(value)); else if (PyLong_CheckExact(value) && -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Jul 30 18:19:30 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Wed, 30 Jul 2014 18:19:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Issue_=2322085=3A_Dropped_?= =?utf-8?q?support_of_Tk_8=2E3_in_Tkinter=2E?= Message-ID: <3hNg1t56gfz7Ljp@mail.python.org> http://hg.python.org/cpython/rev/1aa6ac23340d changeset: 91942:1aa6ac23340d user: Serhiy Storchaka date: Wed Jul 30 19:19:21 2014 +0300 summary: Issue #22085: Dropped support of Tk 8.3 in Tkinter. files: Lib/tkinter/__init__.py | 9 ++--- Misc/NEWS | 2 + Modules/_tkinter.c | 39 +++++++++------------------- 3 files changed, 19 insertions(+), 31 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -245,7 +245,7 @@ Return the name of the callback. """ cbname = self._master._register(callback) - self._tk.call("trace", "variable", self._name, mode, cbname) + self._tk.call("trace", "add", "variable", self._name, mode, cbname) return cbname trace = trace_variable def trace_vdelete(self, mode, cbname): @@ -254,12 +254,12 @@ MODE is one of "r", "w", "u" for read, write, undefine. CBNAME is the name of the callback returned from trace_variable or trace. """ - self._tk.call("trace", "vdelete", self._name, mode, cbname) + self._tk.call("trace", "remove", "variable", self._name, mode, cbname) self._master.deletecommand(cbname) def trace_vinfo(self): """Return all trace callback information.""" return [self._tk.split(x) for x in self._tk.splitlist( - self._tk.call("trace", "vinfo", self._name))] + self._tk.call("trace", "info", "variable", self._name))] def __eq__(self, other): """Comparison for equality (==). @@ -3789,8 +3789,7 @@ def _test(): root = Tk() text = "This is Tcl/Tk version %s" % TclVersion - if TclVersion >= 8.1: - text += "\nThis should be a cedilla: \xe7" + text += "\nThis should be a cedilla: \xe7" label = Label(root, text=text) label.pack() test = Button(root, text="Click me!", diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,8 @@ Library ------- +- Issue #22085: Dropped support of Tk 8.3 in Tkinter. + - Issue #21580: Now Tkinter correctly handles bytes arguments passed to Tk. In particular this allows to initialize images from binary data. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -9,8 +9,8 @@ /* TCL/TK VERSION INFO: - Only Tcl/Tk 8.3.1 and later are supported. Older versions are not - supported. Use Python 2.6 or older if you cannot upgrade your + Only Tcl/Tk 8.4 and later are supported. Older versions are not + supported. Use Python 3.4 or older if you cannot upgrade your Tcl/Tk libraries. */ @@ -36,13 +36,6 @@ #define CHECK_SIZE(size, elemsize) \ ((size_t)(size) <= Py_MAX((size_t)INT_MAX, UINT_MAX / (size_t)(elemsize))) -/* Starting with Tcl 8.4, many APIs offer const-correctness. Unfortunately, - making _tkinter correct for this API means to break earlier - versions. USE_COMPAT_CONST allows to make _tkinter work with both 8.4 and - earlier versions. Once Tcl releases before 8.4 don't need to be supported - anymore, this should go. */ -#define USE_COMPAT_CONST - /* If Tcl is compiled for threads, we must also define TCL_THREAD. We define it always; if Tcl is not threaded, the thread functions in Tcl are empty. */ @@ -58,15 +51,8 @@ #include "tkinter.h" -/* For Tcl 8.2 and 8.3, CONST* is not defined (except on Cygwin). */ -#ifndef CONST84_RETURN -#define CONST84_RETURN -#undef CONST -#define CONST -#endif - -#if TK_VERSION_HEX < 0x08030102 -#error "Tk older than 8.3.1 not supported" +#if TK_VERSION_HEX < 0x08040002 +#error "Tk older than 8.4 not supported" #endif #if !(defined(MS_WINDOWS) || defined(__CYGWIN__)) @@ -376,10 +362,10 @@ static PyObject * -Split(char *list) +Split(const char *list) { int argc; - char **argv; + const char **argv; PyObject *v; if (list == NULL) { @@ -481,7 +467,7 @@ } else if (PyUnicode_Check(arg)) { int argc; - char **argv; + const char **argv; char *list = PyUnicode_AsUTF8(arg); if (list == NULL || @@ -496,7 +482,7 @@ } else if (PyBytes_Check(arg)) { int argc; - char **argv; + const char **argv; char *list = PyBytes_AsString(arg); if (Tcl_SplitList((Tcl_Interp *)NULL, list, &argc, &argv) != TCL_OK) { @@ -563,8 +549,9 @@ static void DisableEventHook(void); /* Forward */ static TkappObject * -Tkapp_New(char *screenName, char *className, - int interactive, int wantobjects, int wantTk, int sync, char *use) +Tkapp_New(const char *screenName, const char *className, + int interactive, int wantobjects, int wantTk, int sync, + const char *use) { TkappObject *v; char *argv0; @@ -1857,7 +1844,7 @@ { char *list; int argc; - char **argv; + const char **argv; PyObject *arg, *v; int i; @@ -1984,7 +1971,7 @@ * function or method. */ static int -PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) +PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[]) { PythonCmd_ClientData *data = (PythonCmd_ClientData *)clientData; PyObject *func, *arg, *res; -- Repository URL: http://hg.python.org/cpython From zachary.ware+pydev at gmail.com Wed Jul 30 22:11:51 2014 From: zachary.ware+pydev at gmail.com (Zachary Ware) Date: Wed, 30 Jul 2014 15:11:51 -0500 Subject: [Python-checkins] cpython: Issue #22003: When initialized from a bytes object, io.BytesIO() now In-Reply-To: <3hNDzH5WHWz7Ljk@mail.python.org> References: <3hNDzH5WHWz7Ljk@mail.python.org> Message-ID: I'd like to point out a couple of compiler warnings on Windows: On Tue, Jul 29, 2014 at 6:45 PM, antoine.pitrou wrote: > diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c > --- a/Modules/_io/bytesio.c > +++ b/Modules/_io/bytesio.c > @@ -33,6 +37,45 @@ > return NULL; \ > } > > +/* Ensure we have a buffer suitable for writing, in the case that an initvalue > + * object was provided, and we're currently borrowing its buffer. `size' > + * indicates the new buffer size allocated as part of unsharing, to avoid a > + * redundant reallocation caused by any subsequent mutation. `truncate' > + * indicates whether truncation should occur if `size` < self->string_size. > + * > + * Do nothing if the buffer wasn't shared. Returns 0 on success, or sets an > + * exception and returns -1 on failure. Existing state is preserved on failure. > + */ > +static int > +unshare(bytesio *self, size_t preferred_size, int truncate) > +{ > + if (self->initvalue) { > + Py_ssize_t copy_size; > + char *new_buf; > + > + if((! truncate) && preferred_size < self->string_size) { ..\Modules\_io\bytesio.c(56): warning C4018: '<' : signed/unsigned mismatch > + preferred_size = self->string_size; > + } > + > + new_buf = (char *)PyMem_Malloc(preferred_size); > + if (new_buf == NULL) { > + PyErr_NoMemory(); > + return -1; > + } > + > + copy_size = self->string_size; > + if (copy_size > preferred_size) { ..\Modules\_io\bytesio.c(67): warning C4018: '>' : signed/unsigned mismatch > + copy_size = preferred_size; > + } > + > + memcpy(new_buf, self->buf, copy_size); > + Py_CLEAR(self->initvalue); > + self->buf = new_buf; > + self->buf_size = preferred_size; > + self->string_size = (Py_ssize_t) copy_size; > + } > + return 0; > +} > > /* Internal routine to get a line from the buffer of a BytesIO > object. Returns the length between the current position to the -- Zach From python-checkins at python.org Thu Jul 31 01:25:12 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 31 Jul 2014 01:25:12 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIyMDY4?= =?utf-8?q?=3A_Don=27t_create_self_reference_cycles_in_idlelib=2EConfigDia?= =?utf-8?q?log=2E?= Message-ID: <3hNrT44653z7Ljd@mail.python.org> http://hg.python.org/cpython/rev/6b7f189daa62 changeset: 91943:6b7f189daa62 branch: 2.7 parent: 91936:7de64def6565 user: Terry Jan Reedy date: Wed Jul 30 19:24:26 2014 -0400 summary: Issue #22068: Don't create self reference cycles in idlelib.ConfigDialog. In 2.7, these become leaks and cause test_gc to fail. files: Lib/idlelib/configDialog.py | 67 ++++++++++++++---------- 1 files changed, 38 insertions(+), 29 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -28,6 +28,7 @@ _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) + self.parent = parent self.wm_withdraw() self.configure(borderwidth=5) @@ -59,7 +60,6 @@ self.transient(parent) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Cancel) - self.parent = parent self.tabPages.focus_set() #key bindings for this dialog #self.bind('',self.Cancel) #dismiss dialog, no save @@ -110,12 +110,13 @@ self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH) def CreatePageFontTab(self): - #tkVars - self.fontSize=StringVar(self) - self.fontBold=BooleanVar(self) - self.fontName=StringVar(self) - self.spaceNum=IntVar(self) - self.editFont=tkFont.Font(self,('courier',10,'normal')) + parent = self.parent + self.fontSize = StringVar(parent) + self.fontBold = BooleanVar(parent) + self.fontName = StringVar(parent) + self.spaceNum = IntVar(parent) + self.editFont = tkFont.Font(parent,('courier',10,'normal')) + ##widget creation #body frame frame=self.tabPages.pages['Fonts/Tabs'].frame @@ -151,6 +152,7 @@ self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum, orient='horizontal', tickinterval=2, from_=2, to=16) + #widget packing #body frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -173,13 +175,15 @@ return frame def CreatePageHighlight(self): - self.builtinTheme=StringVar(self) - self.customTheme=StringVar(self) - self.fgHilite=BooleanVar(self) - self.colour=StringVar(self) - self.fontName=StringVar(self) - self.themeIsBuiltin=BooleanVar(self) - self.highlightTarget=StringVar(self) + parent = self.parent + self.builtinTheme = StringVar(parent) + self.customTheme = StringVar(parent) + self.fgHilite = BooleanVar(parent) + self.colour = StringVar(parent) + self.fontName = StringVar(parent) + self.themeIsBuiltin = BooleanVar(parent) + self.highlightTarget = StringVar(parent) + ##widget creation #body frame frame=self.tabPages.pages['Highlighting'].frame @@ -238,6 +242,7 @@ self.customTheme,None,command=None) self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme', command=self.DeleteCustomTheme) + ##widget packing #body frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -262,12 +267,13 @@ return frame def CreatePageKeys(self): - #tkVars - self.bindingTarget=StringVar(self) - self.builtinKeys=StringVar(self) - self.customKeys=StringVar(self) - self.keysAreBuiltin=BooleanVar(self) - self.keyBinding=StringVar(self) + parent = self.parent + self.bindingTarget = StringVar(parent) + self.builtinKeys = StringVar(parent) + self.customKeys = StringVar(parent) + self.keysAreBuiltin = BooleanVar(parent) + self.keyBinding = StringVar(parent) + ##widget creation #body frame frame=self.tabPages.pages['Keys'].frame @@ -305,6 +311,7 @@ command=self.DeleteCustomKeys) buttonSaveCustomKeys=Button(frames[1], text='Save as New Custom Key Set',command=self.SaveAsNewKeySet) + ##widget packing #body frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -331,15 +338,16 @@ return frame def CreatePageGeneral(self): - #tkVars - self.winWidth=StringVar(self) - self.winHeight=StringVar(self) - self.paraWidth=StringVar(self) - self.startupEdit=IntVar(self) - self.autoSave=IntVar(self) - self.encoding=StringVar(self) - self.userHelpBrowser=BooleanVar(self) - self.helpBrowser=StringVar(self) + parent = self.parent + self.winWidth = StringVar(parent) + self.winHeight = StringVar(parent) + self.paraWidth = StringVar(parent) + self.startupEdit = IntVar(parent) + self.autoSave = IntVar(parent) + self.encoding = StringVar(parent) + self.userHelpBrowser = BooleanVar(parent) + self.helpBrowser = StringVar(parent) + #widget creation #body frame=self.tabPages.pages['General'].frame @@ -402,6 +410,7 @@ width=8,command=self.HelpListItemAdd) self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove', state=DISABLED,width=8,command=self.HelpListItemRemove) + #widget packing #body frameRun.pack(side=TOP,padx=5,pady=5,fill=X) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 31 01:25:13 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 31 Jul 2014 01:25:13 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMy40KTogSXNzdWUgIzIyMDY4?= =?utf-8?q?=3A_Don=27t_create_self_reference_cycles_in_idlelib=2EConfigDia?= =?utf-8?q?log=2E?= Message-ID: <3hNrT570wMz7Ljt@mail.python.org> http://hg.python.org/cpython/rev/1927f47a1838 changeset: 91944:1927f47a1838 branch: 3.4 parent: 91940:9474f2971855 user: Terry Jan Reedy date: Wed Jul 30 19:24:32 2014 -0400 summary: Issue #22068: Don't create self reference cycles in idlelib.ConfigDialog. files: Lib/idlelib/configDialog.py | 67 ++++++++++++++---------- 1 files changed, 38 insertions(+), 29 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -30,6 +30,7 @@ _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) + self.parent = parent self.wm_withdraw() self.configure(borderwidth=5) @@ -61,7 +62,6 @@ self.transient(parent) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Cancel) - self.parent = parent self.tabPages.focus_set() #key bindings for this dialog #self.bind('',self.Cancel) #dismiss dialog, no save @@ -112,12 +112,13 @@ self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH) def CreatePageFontTab(self): - #tkVars - self.fontSize=StringVar(self) - self.fontBold=BooleanVar(self) - self.fontName=StringVar(self) - self.spaceNum=IntVar(self) - self.editFont=tkFont.Font(self,('courier',10,'normal')) + parent = self.parent + self.fontSize = StringVar(parent) + self.fontBold = BooleanVar(parent) + self.fontName = StringVar(parent) + self.spaceNum = IntVar(parent) + self.editFont = tkFont.Font(parent,('courier',10,'normal')) + ##widget creation #body frame frame=self.tabPages.pages['Fonts/Tabs'].frame @@ -153,6 +154,7 @@ self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum, orient='horizontal', tickinterval=2, from_=2, to=16) + #widget packing #body frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -175,13 +177,15 @@ return frame def CreatePageHighlight(self): - self.builtinTheme=StringVar(self) - self.customTheme=StringVar(self) - self.fgHilite=BooleanVar(self) - self.colour=StringVar(self) - self.fontName=StringVar(self) - self.themeIsBuiltin=BooleanVar(self) - self.highlightTarget=StringVar(self) + parent = self.parent + self.builtinTheme = StringVar(parent) + self.customTheme = StringVar(parent) + self.fgHilite = BooleanVar(parent) + self.colour = StringVar(parent) + self.fontName = StringVar(parent) + self.themeIsBuiltin = BooleanVar(parent) + self.highlightTarget = StringVar(parent) + ##widget creation #body frame frame=self.tabPages.pages['Highlighting'].frame @@ -240,6 +244,7 @@ self.customTheme,None,command=None) self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme', command=self.DeleteCustomTheme) + ##widget packing #body frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -264,12 +269,13 @@ return frame def CreatePageKeys(self): - #tkVars - self.bindingTarget=StringVar(self) - self.builtinKeys=StringVar(self) - self.customKeys=StringVar(self) - self.keysAreBuiltin=BooleanVar(self) - self.keyBinding=StringVar(self) + parent = self.parent + self.bindingTarget = StringVar(parent) + self.builtinKeys = StringVar(parent) + self.customKeys = StringVar(parent) + self.keysAreBuiltin = BooleanVar(parent) + self.keyBinding = StringVar(parent) + ##widget creation #body frame frame=self.tabPages.pages['Keys'].frame @@ -307,6 +313,7 @@ command=self.DeleteCustomKeys) buttonSaveCustomKeys=Button(frames[1], text='Save as New Custom Key Set',command=self.SaveAsNewKeySet) + ##widget packing #body frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -333,15 +340,16 @@ return frame def CreatePageGeneral(self): - #tkVars - self.winWidth=StringVar(self) - self.winHeight=StringVar(self) - self.paraWidth=StringVar(self) - self.startupEdit=IntVar(self) - self.autoSave=IntVar(self) - self.encoding=StringVar(self) - self.userHelpBrowser=BooleanVar(self) - self.helpBrowser=StringVar(self) + parent = self.parent + self.winWidth = StringVar(parent) + self.winHeight = StringVar(parent) + self.paraWidth = StringVar(parent) + self.startupEdit = IntVar(parent) + self.autoSave = IntVar(parent) + self.encoding = StringVar(parent) + self.userHelpBrowser = BooleanVar(parent) + self.helpBrowser = StringVar(parent) + #widget creation #body frame=self.tabPages.pages['General'].frame @@ -395,6 +403,7 @@ width=8,command=self.HelpListItemAdd) self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove', state=DISABLED,width=8,command=self.HelpListItemRemove) + #widget packing #body frameRun.pack(side=TOP,padx=5,pady=5,fill=X) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 31 01:25:15 2014 From: python-checkins at python.org (terry.reedy) Date: Thu, 31 Jul 2014 01:25:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython_=28merge_3=2E4_-=3E_default?= =?utf-8?q?=29=3A_Merge_with_3=2E4?= Message-ID: <3hNrT72mCMz7LkH@mail.python.org> http://hg.python.org/cpython/rev/0243f7da89cb changeset: 91945:0243f7da89cb parent: 91942:1aa6ac23340d parent: 91944:1927f47a1838 user: Terry Jan Reedy date: Wed Jul 30 19:24:47 2014 -0400 summary: Merge with 3.4 files: Lib/idlelib/configDialog.py | 67 ++++++++++++++---------- 1 files changed, 38 insertions(+), 29 deletions(-) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -30,6 +30,7 @@ _utest - bool, don't wait_window when running unittest """ Toplevel.__init__(self, parent) + self.parent = parent self.wm_withdraw() self.configure(borderwidth=5) @@ -61,7 +62,6 @@ self.transient(parent) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Cancel) - self.parent = parent self.tabPages.focus_set() #key bindings for this dialog #self.bind('',self.Cancel) #dismiss dialog, no save @@ -112,12 +112,13 @@ self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH) def CreatePageFontTab(self): - #tkVars - self.fontSize=StringVar(self) - self.fontBold=BooleanVar(self) - self.fontName=StringVar(self) - self.spaceNum=IntVar(self) - self.editFont=tkFont.Font(self,('courier',10,'normal')) + parent = self.parent + self.fontSize = StringVar(parent) + self.fontBold = BooleanVar(parent) + self.fontName = StringVar(parent) + self.spaceNum = IntVar(parent) + self.editFont = tkFont.Font(parent,('courier',10,'normal')) + ##widget creation #body frame frame=self.tabPages.pages['Fonts/Tabs'].frame @@ -153,6 +154,7 @@ self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum, orient='horizontal', tickinterval=2, from_=2, to=16) + #widget packing #body frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -175,13 +177,15 @@ return frame def CreatePageHighlight(self): - self.builtinTheme=StringVar(self) - self.customTheme=StringVar(self) - self.fgHilite=BooleanVar(self) - self.colour=StringVar(self) - self.fontName=StringVar(self) - self.themeIsBuiltin=BooleanVar(self) - self.highlightTarget=StringVar(self) + parent = self.parent + self.builtinTheme = StringVar(parent) + self.customTheme = StringVar(parent) + self.fgHilite = BooleanVar(parent) + self.colour = StringVar(parent) + self.fontName = StringVar(parent) + self.themeIsBuiltin = BooleanVar(parent) + self.highlightTarget = StringVar(parent) + ##widget creation #body frame frame=self.tabPages.pages['Highlighting'].frame @@ -240,6 +244,7 @@ self.customTheme,None,command=None) self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme', command=self.DeleteCustomTheme) + ##widget packing #body frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -264,12 +269,13 @@ return frame def CreatePageKeys(self): - #tkVars - self.bindingTarget=StringVar(self) - self.builtinKeys=StringVar(self) - self.customKeys=StringVar(self) - self.keysAreBuiltin=BooleanVar(self) - self.keyBinding=StringVar(self) + parent = self.parent + self.bindingTarget = StringVar(parent) + self.builtinKeys = StringVar(parent) + self.customKeys = StringVar(parent) + self.keysAreBuiltin = BooleanVar(parent) + self.keyBinding = StringVar(parent) + ##widget creation #body frame frame=self.tabPages.pages['Keys'].frame @@ -307,6 +313,7 @@ command=self.DeleteCustomKeys) buttonSaveCustomKeys=Button(frames[1], text='Save as New Custom Key Set',command=self.SaveAsNewKeySet) + ##widget packing #body frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH) @@ -333,15 +340,16 @@ return frame def CreatePageGeneral(self): - #tkVars - self.winWidth=StringVar(self) - self.winHeight=StringVar(self) - self.paraWidth=StringVar(self) - self.startupEdit=IntVar(self) - self.autoSave=IntVar(self) - self.encoding=StringVar(self) - self.userHelpBrowser=BooleanVar(self) - self.helpBrowser=StringVar(self) + parent = self.parent + self.winWidth = StringVar(parent) + self.winHeight = StringVar(parent) + self.paraWidth = StringVar(parent) + self.startupEdit = IntVar(parent) + self.autoSave = IntVar(parent) + self.encoding = StringVar(parent) + self.userHelpBrowser = BooleanVar(parent) + self.helpBrowser = StringVar(parent) + #widget creation #body frame=self.tabPages.pages['General'].frame @@ -395,6 +403,7 @@ width=8,command=self.HelpListItemAdd) self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove', state=DISABLED,width=8,command=self.HelpListItemRemove) + #widget packing #body frameRun.pack(side=TOP,padx=5,pady=5,fill=X) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 31 06:57:14 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 31 Jul 2014 06:57:14 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_Back_out_of_changes_to_Tki?= =?utf-8?q?nter_variables_trace_commands_=28issue_=2322085=29=2E?= Message-ID: <3hNzrB37VZz7Ljg@mail.python.org> http://hg.python.org/cpython/rev/9f333c06915f changeset: 91946:9f333c06915f user: Serhiy Storchaka date: Thu Jul 31 07:46:08 2014 +0300 summary: Back out of changes to Tkinter variables trace commands (issue #22085). files: Lib/tkinter/__init__.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -245,7 +245,7 @@ Return the name of the callback. """ cbname = self._master._register(callback) - self._tk.call("trace", "add", "variable", self._name, mode, cbname) + self._tk.call("trace", "variable", self._name, mode, cbname) return cbname trace = trace_variable def trace_vdelete(self, mode, cbname): @@ -254,12 +254,12 @@ MODE is one of "r", "w", "u" for read, write, undefine. CBNAME is the name of the callback returned from trace_variable or trace. """ - self._tk.call("trace", "remove", "variable", self._name, mode, cbname) + self._tk.call("trace", "vdelete", self._name, mode, cbname) self._master.deletecommand(cbname) def trace_vinfo(self): """Return all trace callback information.""" return [self._tk.split(x) for x in self._tk.splitlist( - self._tk.call("trace", "info", "variable", self._name))] + self._tk.call("trace", "vinfo", self._name))] def __eq__(self, other): """Comparison for equality (==). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Jul 31 06:57:15 2014 From: python-checkins at python.org (serhiy.storchaka) Date: Thu, 31 Jul 2014 06:57:15 +0200 (CEST) Subject: [Python-checkins] =?utf-8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzIxNTgw?= =?utf-8?q?=3A_Now_Tkinter_correctly_handles_binary_=22data=22_and_=22mask?= =?utf-8?q?data=22?= Message-ID: <3hNzrC69jJz7LkC@mail.python.org> http://hg.python.org/cpython/rev/818989a48e96 changeset: 91947:818989a48e96 branch: 2.7 parent: 91943:6b7f189daa62 user: Serhiy Storchaka date: Thu Jul 31 07:48:14 2014 +0300 summary: Issue #21580: Now Tkinter correctly handles binary "data" and "maskdata" configure options of tkinter.PhotoImage. Added private Tkapp method _createbytearray(). files: Lib/lib-tk/Tkinter.py | 4 + Lib/lib-tk/test/test_tkinter/test_images.py | 11 +-- Misc/NEWS | 3 + Modules/_tkinter.c | 28 ++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py --- a/Lib/lib-tk/Tkinter.py +++ b/Lib/lib-tk/Tkinter.py @@ -3282,6 +3282,8 @@ for k, v in cnf.items(): if hasattr(v, '__call__'): v = self._register(v) + elif k in ('data', 'maskdata'): + v = self.tk._createbytearray(v) options = options + ('-'+k, v) self.tk.call(('image', 'create', imgtype, name,) + options) self.name = name @@ -3305,6 +3307,8 @@ if k[-1] == '_': k = k[:-1] if hasattr(v, '__call__'): v = self._register(v) + elif k in ('data', 'maskdata'): + v = self.tk._createbytearray(v) res = res + ('-'+k, v) self.tk.call((self.name, 'config') + res) config = configure diff --git a/Lib/lib-tk/test/test_tkinter/test_images.py b/Lib/lib-tk/test/test_tkinter/test_images.py --- a/Lib/lib-tk/test/test_tkinter/test_images.py +++ b/Lib/lib-tk/test/test_tkinter/test_images.py @@ -151,7 +151,8 @@ self.assertEqual(image.type(), 'photo') self.assertEqual(image.width(), 16) self.assertEqual(image.height(), 16) - self.assertEqual(image['data'], data) + self.assertEqual(image['data'], data if self.wantobjects + else data.decode('latin1')) self.assertEqual(image['file'], '') self.assertIn('::img::test', self.root.image_names()) del image @@ -160,21 +161,18 @@ def test_create_from_ppm_file(self): self.check_create_from_file('ppm') - @unittest.skip('issue #21580') def test_create_from_ppm_data(self): self.check_create_from_data('ppm') def test_create_from_pgm_file(self): self.check_create_from_file('pgm') - @unittest.skip('issue #21580') def test_create_from_pgm_data(self): self.check_create_from_data('pgm') def test_create_from_gif_file(self): self.check_create_from_file('gif') - @unittest.skip('issue #21580') def test_create_from_gif_data(self): self.check_create_from_data('gif') @@ -182,19 +180,18 @@ def test_create_from_png_file(self): self.check_create_from_file('png') - @unittest.skip('issue #21580') @requires_tcl(8, 6) def test_create_from_png_data(self): self.check_create_from_data('png') - @unittest.skip('issue #21580') def test_configure_data(self): image = tkinter.PhotoImage('::img::test', master=self.root) self.assertEqual(image['data'], '') with open(self.testfile, 'rb') as f: data = f.read() image.configure(data=data) - self.assertEqual(image['data'], data) + self.assertEqual(image['data'], data if self.wantobjects + else data.decode('latin1')) self.assertEqual(image.width(), 16) self.assertEqual(image.height(), 16) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -19,6 +19,9 @@ Library ------- +- Issue #21580: Now Tkinter correctly handles binary "data" and "maskdata" + configure options of tkinter.PhotoImage. + - Issue #19612: subprocess.communicate() now also ignores EINVAL when using at least two pipes. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -2939,6 +2939,33 @@ return Py_None; } +/* Convert Python string or any buffer compatible object to Tcl byte-array + * object. Use it to pass binary data (e.g. image's data) to Tcl/Tk commands. + */ +static PyObject * +Tkapp_CreateByteArray(PyObject *self, PyObject *args) +{ + Py_buffer view; + Tcl_Obj* obj; + PyObject *res = NULL; + + if (!PyArg_ParseTuple(args, "s*:_createbytearray", &view)) + return NULL; + + if (view.len >= INT_MAX) { + PyErr_SetString(PyExc_OverflowError, "string is too long"); + return NULL; + } + obj = Tcl_NewByteArrayObj(view.buf, (int)view.len); + if (obj == NULL) { + PyBuffer_Release(&view); + return Tkinter_Error(self); + } + res = newPyTclObject(obj); + PyBuffer_Release(&view); + return res; +} + /**** Tkapp Method List ****/ @@ -2981,6 +3008,7 @@ {"quit", Tkapp_Quit, METH_VARARGS}, {"interpaddr", Tkapp_InterpAddr, METH_VARARGS}, {"loadtk", Tkapp_TkInit, METH_NOARGS}, + {"_createbytearray", Tkapp_CreateByteArray, METH_VARARGS}, {NULL, NULL} }; -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Jul 31 09:58:02 2014 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 31 Jul 2014 09:58:02 +0200 Subject: [Python-checkins] Daily reference leaks (0243f7da89cb): sum=-65 Message-ID: results for 0243f7da89cb on branch "default" -------------------------------------------- test_asyncio leaked [53, -106, 0] references, sum=-53 test_asyncio leaked [15, -30, 2] memory blocks, sum=-13 test_collections leaked [-2, 0, 0] references, sum=-2 test_functools leaked [0, 0, 3] memory blocks, sum=3 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog81CSg3', '-x'] From python-checkins at python.org Thu Jul 31 13:09:30 2014 From: python-checkins at python.org (victor.stinner) Date: Thu, 31 Jul 2014 13:09:30 +0200 (CEST) Subject: [Python-checkins] =?utf-8?q?cpython=3A_timemodule=2Ec=3A_Replace_?= =?utf-8?q?PyExc=5FIOError_with_PyExc=5FOSError?= Message-ID: <3hP85k16bWz7LjZ@mail.python.org> http://hg.python.org/cpython/rev/e49efa892efb changeset: 91948:e49efa892efb parent: 91946:9f333c06915f user: Victor Stinner date: Thu Jul 31 13:07:17 2014 +0200 summary: timemodule.c: Replace PyExc_IOError with PyExc_OSError files: Modules/timemodule.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -169,7 +169,7 @@ ret = clock_gettime((clockid_t)clk_id, &tp); if (ret != 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); @@ -200,7 +200,7 @@ ret = clock_settime((clockid_t)clk_id, &tp); if (ret != 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_RETURN_NONE; @@ -223,7 +223,7 @@ ret = clock_getres((clockid_t)clk_id, &tp); if (ret != 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -1591,7 +1591,7 @@ else #endif { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return -1; } } @@ -1625,7 +1625,7 @@ if (rc == WAIT_OBJECT_0) { Py_BLOCK_THREADS errno = EINTR; - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return -1; } } -- Repository URL: http://hg.python.org/cpython