diff --git a/wxPython/MANIFEST.in b/wxPython/MANIFEST.in index 2f1074b3fd..9aca4dbe5b 100644 --- a/wxPython/MANIFEST.in +++ b/wxPython/MANIFEST.in @@ -5,6 +5,9 @@ include licence/*.txt include b include b.bat +include SWIG/* +exclude SWIG/CVS/* + include demo/*.py include demo/bitmaps/*.bmp include demo/bitmaps/*.ico @@ -22,6 +25,16 @@ include demo/data/*.i include demo/data/*.h include demo/data/*.py +include samples/doodle/*.txt +include samples/doodle/*.py +include samples/doodle/sample.ddl +include samples/stxview/*.txt +include samples/stxview/*.py +include samples/stxview/*.stx +include samples/stxview/StructuredText/*.py +include samples/wxProject/*.txt +include samples/wxProject/*.py + include wxPython/lib/*.py include wxPython/lib/*.txt include wxPython/lib/editor/*.py @@ -29,7 +42,6 @@ include wxPython/lib/editor/*.txt exclude wxPython/* exclude tests -exclude SWIG include src/*.i include src/*.py diff --git a/wxPython/samples/doodle/doodle.py b/wxPython/samples/doodle/doodle.py new file mode 100644 index 0000000000..7756834b09 --- /dev/null +++ b/wxPython/samples/doodle/doodle.py @@ -0,0 +1,212 @@ +# doodle.py + +""" +This module contains the DoodleWindow class which is a window that you +can do simple drawings upon. +""" + + +from wxPython.wx import * + +#---------------------------------------------------------------------- + +class DoodleWindow(wxWindow): + menuColours = { 100 : 'Black', + 101 : 'Yellow', + 102 : 'Red', + 103 : 'Green', + 104 : 'Blue', + 105 : 'Purple', + 106 : 'Brown', + 107 : 'Aquamarine', + 108 : 'Forest Green', + 109 : 'Light Blue', + 110 : 'Goldenrod', + 111 : 'Cyan', + 112 : 'Orange', + 113 : 'Navy', + 114 : 'Dark Grey', + 115 : 'Light Grey', + } + maxThickness = 16 + + + def __init__(self, parent, ID): + wxWindow.__init__(self, parent, ID) + self.SetBackgroundColour(wxWHITE) + self.listeners = [] + self.thickness = 1 + self.SetColour("Black") + self.lines = [] + self.x = self.y = 0 + self.MakeMenu() + + # hook some mouse events + EVT_LEFT_DOWN(self, self.OnLeftDown) + EVT_LEFT_UP(self, self.OnLeftUp) + EVT_RIGHT_UP(self, self.OnRightUp) + EVT_MOTION(self, self.OnMotion) + + # and the refresh event + EVT_PAINT(self, self.OnPaint) + + + def __del__(self): + self.menu.Destroy() + + + def SetColour(self, colour): + """Set a new colour and make a matching pen""" + self.colour = colour + self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID) + self.Notify() + + + def SetThickness(self, num): + """Set a new line thickness and make a matching pen""" + self.thickness = num + self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID) + self.Notify() + + + def GetLinesData(self): + return self.lines[:] + + + def SetLinesData(self, lines): + self.lines = lines[:] + self.Refresh() + + + def MakeMenu(self): + """Make a menu that can be popped up later""" + menu = wxMenu() + keys = self.menuColours.keys() + keys.sort() + for k in keys: + text = self.menuColours[k] + menu.Append(k, text, checkable=true) + EVT_MENU_RANGE(self, 100, 200, self.OnMenuSetColour) + EVT_UPDATE_UI_RANGE(self, 100, 200, self.OnCheckMenuColours) + menu.Break() + + for x in range(1, self.maxThickness+1): + menu.Append(x, str(x), checkable=true) + EVT_MENU_RANGE(self, 1, self.maxThickness, self.OnMenuSetThickness) + EVT_UPDATE_UI_RANGE(self, 1, self.maxThickness, self.OnCheckMenuThickness) + self.menu = menu + + + # These two event handlers are called before the menu is displayed + # to determine which items should be checked. + def OnCheckMenuColours(self, event): + text = self.menuColours[event.GetId()] + if text == self.colour: + event.Check(true) + else: + event.Check(false) + def OnCheckMenuThickness(self, event): + if event.GetId() == self.thickness: + event.Check(true) + else: + event.Check(false) + + + def OnLeftDown(self, event): + """called when the left mouse button is pressed""" + self.curLine = [] + self.x, self.y = event.GetPositionTuple() + self.CaptureMouse() + + + def OnLeftUp(self, event): + """called when the left mouse button is released""" + self.lines.append( (self.colour, self.thickness, self.curLine) ) + self.curLine = [] + self.ReleaseMouse() + + + def OnRightUp(self, event): + """called when the right mouse button is released, will popup the menu""" + pt = event.GetPosition() + self.PopupMenu(self.menu, pt) + + + + def OnMotion(self, event): + """ + Called when the mouse is in motion. If the left button is + dragging then draw a line from the last event position to the + current one. Save the coordinants for redraws. + """ + if event.Dragging() and event.LeftIsDown(): + dc = wxClientDC(self) + dc.BeginDrawing() + dc.SetPen(self.pen) + pos = event.GetPositionTuple() + coords = (self.x, self.y) + pos + self.curLine.append(coords) + dc.DrawLine(self.x, self.y, pos[0], pos[1]) + self.x, self.y = pos + dc.EndDrawing() + + + def OnPaint(self, event): + """ + Called when the window is exposed. Redraws all the lines that have + been drawn already. + """ + dc = wxPaintDC(self) + dc.BeginDrawing() + for colour, thickness, line in self.lines: + pen = wxPen(wxNamedColour(colour), thickness, wxSOLID) + dc.SetPen(pen) + for coords in line: + apply(dc.DrawLine, coords) + dc.EndDrawing() + + + # Event handlers for the popup menu, uses the event ID to determine + # the colour or the thickness to set. + def OnMenuSetColour(self, event): + self.SetColour(self.menuColours[event.GetId()]) + + def OnMenuSetThickness(self, event): + self.SetThickness(event.GetId()) + + + # Observer pattern. Listeners are registered and then notified + # whenever doodle settings change. + def AddListener(self, listener): + self.listeners.append(listener) + + def Notify(self): + for other in self.listeners: + other.Update(self.colour, self.thickness) + + +#---------------------------------------------------------------------- + +class DoodleFrame(wxFrame): + def __init__(self, parent): + wxFrame.__init__(self, parent, -1, "Doodle Frame", size=(800,600)) + self.doodle = DoodleWindow(self, -1) + + +#---------------------------------------------------------------------- + + +class DoodleApp(wxApp): + def OnInit(self): + frame = DoodleFrame(None) + frame.Show(true) + self.SetTopWindow(frame) + return true + + +#---------------------------------------------------------------------- + +if __name__ == '__main__': + app = DoodleApp(0) + app.MainLoop() + diff --git a/wxPython/samples/doodle/sample.ddl b/wxPython/samples/doodle/sample.ddl new file mode 100644 index 0000000000..c8b52a1147 --- /dev/null +++ b/wxPython/samples/doodle/sample.ddl @@ -0,0 +1,41771 @@ +(lp1 +(S'Red' +p2 +I1 +(lp3 +(I44 +I16 +I43 +I16 +ta(I43 +I16 +I42 +I16 +ta(I42 +I16 +I41 +I17 +ta(I41 +I17 +I39 +I19 +ta(I39 +I19 +I37 +I22 +ta(I37 +I22 +I35 +I25 +ta(I35 +I25 +I34 +I29 +ta(I34 +I29 +I33 +I35 +ta(I33 +I35 +I33 +I39 +ta(I33 +I39 +I33 +I45 +ta(I33 +I45 +I33 +I50 +ta(I33 +I50 +I33 +I56 +ta(I33 +I56 +I35 +I60 +ta(I35 +I60 +I38 +I65 +ta(I38 +I65 +I41 +I69 +ta(I41 +I69 +I45 +I72 +ta(I45 +I72 +I51 +I75 +ta(I51 +I75 +I56 +I77 +ta(I56 +I77 +I72 +I80 +ta(I72 +I80 +I88 +I81 +ta(I88 +I81 +I104 +I81 +ta(I104 +I81 +I122 +I81 +ta(I122 +I81 +I138 +I80 +ta(I138 +I80 +I152 +I78 +ta(I152 +I78 +I157 +I75 +ta(I157 +I75 +I160 +I72 +ta(I160 +I72 +I163 +I67 +ta(I163 +I67 +I165 +I62 +ta(I165 +I62 +I166 +I56 +ta(I166 +I56 +I166 +I50 +ta(I166 +I50 +I164 +I45 +ta(I164 +I45 +I162 +I39 +ta(I162 +I39 +I158 +I33 +ta(I158 +I33 +I154 +I30 +ta(I154 +I30 +I149 +I26 +ta(I149 +I26 +I144 +I23 +ta(I144 +I23 +I140 +I21 +ta(I140 +I21 +I136 +I20 +ta(I136 +I20 +I133 +I20 +ta(I133 +I20 +I130 +I20 +ta(I130 +I20 +I128 +I22 +ta(I128 +I22 +I126 +I25 +ta(I126 +I25 +I124 +I28 +ta(I124 +I28 +I122 +I34 +ta(I122 +I34 +I121 +I39 +ta(I121 +I39 +I120 +I45 +ta(I120 +I45 +I120 +I51 +ta(I120 +I51 +I120 +I69 +ta(I120 +I69 +I120 +I83 +ta(I120 +I83 +I121 +I97 +ta(I121 +I97 +I122 +I113 +ta(I122 +I113 +I125 +I127 +ta(I125 +I127 +I128 +I132 +ta(I128 +I132 +I134 +I138 +ta(I134 +I138 +I139 +I141 +ta(I139 +I141 +I145 +I144 +ta(I145 +I144 +I151 +I146 +ta(I151 +I146 +I167 +I147 +ta(I167 +I147 +I172 +I147 +ta(I172 +I147 +I186 +I145 +ta(I186 +I145 +I191 +I142 +ta(I191 +I142 +I196 +I139 +ta(I196 +I139 +I199 +I134 +ta(I199 +I134 +I202 +I120 +ta(I202 +I120 +I204 +I106 +ta(I204 +I106 +I204 +I100 +ta(I204 +I100 +I204 +I86 +ta(I204 +I86 +I204 +I80 +ta(I204 +I80 +I202 +I74 +ta(I202 +I74 +I198 +I58 +ta(I198 +I58 +I195 +I54 +ta(I195 +I54 +I191 +I48 +ta(I191 +I48 +I186 +I43 +ta(I186 +I43 +I181 +I39 +ta(I181 +I39 +I175 +I36 +ta(I175 +I36 +I170 +I35 +ta(I170 +I35 +I166 +I34 +ta(I166 +I34 +I162 +I34 +ta(I162 +I34 +I159 +I36 +ta(I159 +I36 +I157 +I40 +ta(I157 +I40 +I155 +I44 +ta(I155 +I44 +I154 +I50 +ta(I154 +I50 +I153 +I55 +ta(I153 +I55 +I153 +I61 +ta(I153 +I61 +I155 +I66 +ta(I155 +I66 +I157 +I71 +ta(I157 +I71 +I160 +I77 +ta(I160 +I77 +I163 +I81 +ta(I163 +I81 +I168 +I85 +ta(I168 +I85 +I174 +I89 +ta(I174 +I89 +I188 +I91 +ta(I188 +I91 +I208 +I93 +ta(I208 +I93 +I224 +I95 +ta(I224 +I95 +I242 +I95 +ta(I242 +I95 +I258 +I95 +ta(I258 +I95 +I278 +I92 +ta(I278 +I92 +I298 +I88 +ta(I298 +I88 +I304 +I84 +ta(I304 +I84 +I310 +I80 +ta(I310 +I80 +I315 +I75 +ta(I315 +I75 +I318 +I70 +ta(I318 +I70 +I319 +I64 +ta(I319 +I64 +I319 +I59 +ta(I319 +I59 +I317 +I54 +ta(I317 +I54 +I314 +I40 +ta(I314 +I40 +I310 +I37 +ta(I310 +I37 +I306 +I33 +ta(I306 +I33 +I301 +I30 +ta(I301 +I30 +I296 +I27 +ta(I296 +I27 +I292 +I26 +ta(I292 +I26 +I288 +I25 +ta(I288 +I25 +I285 +I25 +ta(I285 +I25 +I282 +I25 +ta(I282 +I25 +I279 +I27 +ta(I279 +I27 +I278 +I30 +ta(I278 +I30 +I276 +I35 +ta(I276 +I35 +I275 +I41 +ta(I275 +I41 +I275 +I46 +ta(I275 +I46 +I275 +I52 +ta(I275 +I52 +I276 +I57 +ta(I276 +I57 +I278 +I63 +ta(I278 +I63 +I281 +I68 +ta(I281 +I68 +I284 +I72 +ta(I284 +I72 +I288 +I76 +ta(I288 +I76 +I302 +I79 +ta(I302 +I79 +I307 +I82 +ta(I307 +I82 +I321 +I83 +ta(I321 +I83 +I337 +I84 +ta(I337 +I84 +I351 +I83 +ta(I351 +I83 +I367 +I81 +ta(I367 +I81 +I381 +I79 +ta(I381 +I79 +I386 +I75 +ta(I386 +I75 +I391 +I72 +ta(I391 +I72 +I394 +I67 +ta(I394 +I67 +I397 +I62 +ta(I397 +I62 +I398 +I48 +ta(I398 +I48 +I399 +I44 +ta(I399 +I44 +I398 +I38 +ta(I398 +I38 +I394 +I32 +ta(I394 +I32 +I390 +I29 +ta(I390 +I29 +I385 +I24 +ta(I385 +I24 +I371 +I20 +ta(I371 +I20 +I366 +I17 +ta(I366 +I17 +I360 +I15 +ta(I360 +I15 +I354 +I13 +ta(I354 +I13 +I340 +I11 +ta(I340 +I11 +I336 +I11 +ta(I336 +I11 +I332 +I11 +ta(I332 +I11 +I327 +I12 +ta(I327 +I12 +I324 +I14 +ta(I324 +I14 +I321 +I18 +ta(I321 +I18 +I320 +I24 +ta(I320 +I24 +I318 +I29 +ta(I318 +I29 +I318 +I35 +ta(I318 +I35 +I318 +I51 +ta(I318 +I51 +I318 +I57 +ta(I318 +I57 +I319 +I73 +ta(I319 +I73 +I321 +I79 +ta(I321 +I79 +I323 +I84 +ta(I323 +I84 +I327 +I89 +ta(I327 +I89 +I331 +I93 +ta(I331 +I93 +I335 +I96 +ta(I335 +I96 +I340 +I98 +ta(I340 +I98 +I354 +I99 +ta(I354 +I99 +I368 +I98 +ta(I368 +I98 +I384 +I97 +ta(I384 +I97 +I398 +I94 +ta(I398 +I94 +I403 +I89 +ta(I403 +I89 +I408 +I85 +ta(I408 +I85 +I409 +I80 +ta(I409 +I80 +I410 +I74 +ta(I410 +I74 +I410 +I69 +ta(I410 +I69 +I408 +I64 +ta(I408 +I64 +I404 +I59 +ta(I404 +I59 +I400 +I54 +ta(I400 +I54 +I386 +I49 +ta(I386 +I49 +I380 +I46 +ta(I380 +I46 +I366 +I42 +ta(I366 +I42 +I362 +I40 +ta(I362 +I40 +I357 +I37 +ta(I357 +I37 +I352 +I36 +ta(I352 +I36 +I349 +I36 +ta(I349 +I36 +I347 +I36 +ta(I347 +I36 +I346 +I36 +ta(I346 +I36 +I345 +I38 +ta(I345 +I38 +I345 +I42 +ta(I345 +I42 +I345 +I47 +ta(I345 +I47 +I345 +I52 +ta(I345 +I52 +I346 +I58 +ta(I346 +I58 +I348 +I64 +ta(I348 +I64 +I351 +I69 +ta(I351 +I69 +I355 +I75 +ta(I355 +I75 +I361 +I79 +ta(I361 +I79 +I366 +I83 +ta(I366 +I83 +I384 +I87 +ta(I384 +I87 +I400 +I89 +ta(I400 +I89 +I416 +I91 +ta(I416 +I91 +I436 +I91 +ta(I436 +I91 +I456 +I91 +ta(I456 +I91 +I476 +I90 +ta(I476 +I90 +I494 +I87 +ta(I494 +I87 +I512 +I83 +ta(I512 +I83 +I518 +I79 +ta(I518 +I79 +I534 +I74 +ta(I534 +I74 +I537 +I69 +ta(I537 +I69 +I539 +I63 +ta(I539 +I63 +I540 +I58 +ta(I540 +I58 +I540 +I52 +ta(I540 +I52 +I537 +I48 +ta(I537 +I48 +I533 +I42 +ta(I533 +I42 +I528 +I37 +ta(I528 +I37 +I512 +I32 +ta(I512 +I32 +I498 +I29 +ta(I498 +I29 +I492 +I27 +ta(I492 +I27 +I488 +I26 +ta(I488 +I26 +I484 +I26 +ta(I484 +I26 +I480 +I27 +ta(I480 +I27 +I476 +I31 +ta(I476 +I31 +I473 +I36 +ta(I473 +I36 +I472 +I41 +ta(I472 +I41 +I471 +I47 +ta(I471 +I47 +I471 +I61 +ta(I471 +I61 +I471 +I75 +ta(I471 +I75 +I474 +I79 +ta(I474 +I79 +I477 +I85 +ta(I477 +I85 +I480 +I89 +ta(I480 +I89 +I486 +I93 +ta(I486 +I93 +I502 +I96 +ta(I502 +I96 +I516 +I98 +ta(I516 +I98 +I534 +I99 +ta(I534 +I99 +I552 +I99 +ta(I552 +I99 +I570 +I98 +ta(I570 +I98 +I590 +I96 +ta(I590 +I96 +I608 +I93 +ta(I608 +I93 +I626 +I89 +ta(I626 +I89 +I642 +I85 +ta(I642 +I85 +I646 +I80 +ta(I646 +I80 +I649 +I75 +ta(I649 +I75 +I651 +I69 +ta(I651 +I69 +I651 +I65 +ta(I651 +I65 +I650 +I60 +ta(I650 +I60 +I646 +I55 +ta(I646 +I55 +I632 +I50 +ta(I632 +I50 +I626 +I46 +ta(I626 +I46 +I620 +I43 +ta(I620 +I43 +I606 +I41 +ta(I606 +I41 +I592 +I39 +ta(I592 +I39 +I578 +I37 +ta(I578 +I37 +I572 +I36 +ta(I572 +I36 +I568 +I36 +ta(I568 +I36 +I564 +I36 +ta(I564 +I36 +I561 +I39 +ta(I561 +I39 +I559 +I42 +ta(I559 +I42 +I558 +I46 +ta(I558 +I46 +I557 +I51 +ta(I557 +I51 +I557 +I56 +ta(I557 +I56 +I559 +I62 +ta(I559 +I62 +I561 +I67 +ta(I561 +I67 +I564 +I73 +ta(I564 +I73 +I570 +I78 +ta(I570 +I78 +I574 +I83 +ta(I574 +I83 +I579 +I85 +ta(I579 +I85 +I593 +I90 +ta(I593 +I90 +I609 +I92 +ta(I609 +I92 +I623 +I93 +ta(I623 +I93 +I641 +I94 +ta(I641 +I94 +I659 +I94 +ta(I659 +I94 +I673 +I93 +ta(I673 +I93 +I689 +I91 +ta(I689 +I91 +I693 +I87 +ta(I693 +I87 +I698 +I83 +ta(I698 +I83 +I700 +I79 +ta(I700 +I79 +I703 +I74 +ta(I703 +I74 +I703 +I68 +ta(I703 +I68 +I703 +I63 +ta(I703 +I63 +I700 +I58 +ta(I700 +I58 +I696 +I53 +ta(I696 +I53 +I692 +I48 +ta(I692 +I48 +I678 +I44 +ta(I678 +I44 +I672 +I41 +ta(I672 +I41 +I668 +I39 +ta(I668 +I39 +I662 +I37 +ta(I662 +I37 +I657 +I37 +ta(I657 +I37 +I652 +I37 +ta(I652 +I37 +I647 +I37 +ta(I647 +I37 +I643 +I39 +ta(I643 +I39 +I639 +I43 +ta(I639 +I43 +I635 +I47 +ta(I635 +I47 +I633 +I53 +ta(I633 +I53 +I631 +I59 +ta(I631 +I59 +I630 +I65 +ta(I630 +I65 +I629 +I83 +ta(I629 +I83 +I629 +I99 +ta(I629 +I99 +I629 +I105 +ta(I629 +I105 +I630 +I111 +ta(I630 +I111 +I631 +I117 +ta(I631 +I117 +I633 +I122 +ta(I633 +I122 +I636 +I125 +ta(I636 +I125 +I641 +I128 +ta(I641 +I128 +I646 +I131 +ta(I646 +I131 +I652 +I133 +ta(I652 +I133 +I656 +I133 +ta(I656 +I133 +I662 +I133 +ta(I662 +I133 +I666 +I132 +ta(I666 +I132 +I670 +I130 +ta(I670 +I130 +I673 +I128 +ta(I673 +I128 +I675 +I124 +ta(I675 +I124 +I676 +I121 +ta(I676 +I121 +I676 +I117 +ta(I676 +I117 +I675 +I114 +ta(I675 +I114 +I672 +I110 +ta(I672 +I110 +I668 +I106 +ta(I668 +I106 +I662 +I103 +ta(I662 +I103 +I656 +I100 +ta(I656 +I100 +I642 +I98 +ta(I642 +I98 +I636 +I97 +ta(I636 +I97 +I630 +I97 +ta(I630 +I97 +I616 +I96 +ta(I616 +I96 +I611 +I97 +ta(I611 +I97 +I605 +I99 +ta(I605 +I99 +I601 +I102 +ta(I601 +I102 +I596 +I107 +ta(I596 +I107 +I593 +I112 +ta(I593 +I112 +I590 +I118 +ta(I590 +I118 +I589 +I123 +ta(I589 +I123 +I589 +I128 +ta(I589 +I128 +I589 +I133 +ta(I589 +I133 +I590 +I139 +ta(I590 +I139 +I592 +I144 +ta(I592 +I144 +I596 +I147 +ta(I596 +I147 +I600 +I152 +ta(I600 +I152 +I604 +I155 +ta(I604 +I155 +I610 +I158 +ta(I610 +I158 +I616 +I160 +ta(I616 +I160 +I622 +I161 +ta(I622 +I161 +I640 +I161 +ta(I640 +I161 +I645 +I161 +ta(I645 +I161 +I651 +I161 +ta(I651 +I161 +I655 +I159 +ta(I655 +I159 +I659 +I156 +ta(I659 +I156 +I662 +I153 +ta(I662 +I153 +I663 +I150 +ta(I663 +I150 +I663 +I146 +ta(I663 +I146 +I662 +I141 +ta(I662 +I141 +I659 +I136 +ta(I659 +I136 +I655 +I130 +ta(I655 +I130 +I650 +I125 +ta(I650 +I125 +I644 +I120 +ta(I644 +I120 +I638 +I116 +ta(I638 +I116 +I633 +I111 +ta(I633 +I111 +I617 +I107 +ta(I617 +I107 +I601 +I103 +ta(I601 +I103 +I595 +I101 +ta(I595 +I101 +I575 +I99 +ta(I575 +I99 +I559 +I99 +ta(I559 +I99 +I553 +I99 +ta(I553 +I99 +I547 +I103 +ta(I547 +I103 +I543 +I107 +ta(I543 +I107 +I539 +I121 +ta(I539 +I121 +I537 +I127 +ta(I537 +I127 +I535 +I143 +ta(I535 +I143 +I534 +I157 +ta(I534 +I157 +I533 +I173 +ta(I533 +I173 +I533 +I178 +ta(I533 +I178 +I535 +I183 +ta(I535 +I183 +I537 +I188 +ta(I537 +I188 +I540 +I191 +ta(I540 +I191 +I543 +I195 +ta(I543 +I195 +I547 +I196 +ta(I547 +I196 +I551 +I198 +ta(I551 +I198 +I556 +I198 +ta(I556 +I198 +I562 +I198 +ta(I562 +I198 +I568 +I196 +ta(I568 +I196 +I573 +I194 +ta(I573 +I194 +I579 +I190 +ta(I579 +I190 +I582 +I187 +ta(I582 +I187 +I585 +I182 +ta(I585 +I182 +I587 +I177 +ta(I587 +I177 +I587 +I172 +ta(I587 +I172 +I586 +I158 +ta(I586 +I158 +I582 +I154 +ta(I582 +I154 +I578 +I149 +ta(I578 +I149 +I564 +I135 +ta(I564 +I135 +I550 +I131 +ta(I550 +I131 +I536 +I128 +ta(I536 +I128 +I520 +I125 +ta(I520 +I125 +I502 +I122 +ta(I502 +I122 +I484 +I119 +ta(I484 +I119 +I464 +I117 +ta(I464 +I117 +I442 +I116 +ta(I442 +I116 +I424 +I116 +ta(I424 +I116 +I404 +I117 +ta(I404 +I117 +I388 +I120 +ta(I388 +I120 +I382 +I124 +ta(I382 +I124 +I378 +I130 +ta(I378 +I130 +I375 +I136 +ta(I375 +I136 +I373 +I142 +ta(I373 +I142 +I372 +I156 +ta(I372 +I156 +I372 +I161 +ta(I372 +I161 +I374 +I167 +ta(I374 +I167 +I376 +I172 +ta(I376 +I172 +I379 +I177 +ta(I379 +I177 +I383 +I180 +ta(I383 +I180 +I387 +I183 +ta(I387 +I183 +I391 +I185 +ta(I391 +I185 +I395 +I187 +ta(I395 +I187 +I399 +I187 +ta(I399 +I187 +I403 +I187 +ta(I403 +I187 +I407 +I186 +ta(I407 +I186 +I411 +I184 +ta(I411 +I184 +I415 +I180 +ta(I415 +I180 +I418 +I177 +ta(I418 +I177 +I420 +I172 +ta(I420 +I172 +I420 +I167 +ta(I420 +I167 +I420 +I161 +ta(I420 +I161 +I418 +I147 +ta(I418 +I147 +I414 +I141 +ta(I414 +I141 +I410 +I136 +ta(I410 +I136 +I396 +I122 +ta(I396 +I122 +I392 +I118 +ta(I392 +I118 +I386 +I104 +ta(I386 +I104 +I370 +I100 +ta(I370 +I100 +I364 +I97 +ta(I364 +I97 +I350 +I94 +ta(I350 +I94 +I334 +I91 +ta(I334 +I91 +I318 +I90 +ta(I318 +I90 +I312 +I90 +ta(I312 +I90 +I308 +I92 +ta(I308 +I92 +I304 +I96 +ta(I304 +I96 +I301 +I101 +ta(I301 +I101 +I299 +I106 +ta(I299 +I106 +I298 +I122 +ta(I298 +I122 +I298 +I127 +ta(I298 +I127 +I298 +I133 +ta(I298 +I133 +I300 +I139 +ta(I300 +I139 +I303 +I144 +ta(I303 +I144 +I305 +I149 +ta(I305 +I149 +I309 +I154 +ta(I309 +I154 +I313 +I157 +ta(I313 +I157 +I318 +I160 +ta(I318 +I160 +I332 +I162 +ta(I332 +I162 +I346 +I163 +ta(I346 +I163 +I352 +I163 +ta(I352 +I163 +I366 +I163 +ta(I366 +I163 +I372 +I161 +ta(I372 +I161 +I377 +I158 +ta(I377 +I158 +I379 +I154 +ta(I379 +I154 +I382 +I150 +ta(I382 +I150 +I382 +I145 +ta(I382 +I145 +I382 +I140 +ta(I382 +I140 +I379 +I126 +ta(I379 +I126 +I376 +I121 +ta(I376 +I121 +I372 +I115 +ta(I372 +I115 +I368 +I111 +ta(I368 +I111 +I362 +I106 +ta(I362 +I106 +I348 +I102 +ta(I348 +I102 +I342 +I98 +ta(I342 +I98 +I328 +I96 +ta(I328 +I96 +I322 +I94 +ta(I322 +I94 +I317 +I94 +ta(I317 +I94 +I312 +I94 +ta(I312 +I94 +I307 +I97 +ta(I307 +I97 +I302 +I100 +ta(I302 +I100 +I299 +I105 +ta(I299 +I105 +I296 +I119 +ta(I296 +I119 +I294 +I125 +ta(I294 +I125 +I294 +I139 +ta(I294 +I139 +I294 +I153 +ta(I294 +I153 +I294 +I167 +ta(I294 +I167 +I297 +I181 +ta(I297 +I181 +I301 +I195 +ta(I301 +I195 +I306 +I201 +ta(I306 +I201 +I312 +I205 +ta(I312 +I205 +I318 +I207 +ta(I318 +I207 +I336 +I210 +ta(I336 +I210 +I354 +I210 +ta(I354 +I210 +I372 +I210 +ta(I372 +I210 +I392 +I209 +ta(I392 +I209 +I408 +I206 +ta(I408 +I206 +I414 +I202 +ta(I414 +I202 +I419 +I197 +ta(I419 +I197 +I420 +I193 +ta(I420 +I193 +I421 +I187 +ta(I421 +I187 +I420 +I181 +ta(I420 +I181 +I416 +I175 +ta(I416 +I175 +I411 +I170 +ta(I411 +I170 +I395 +I164 +ta(I395 +I164 +I379 +I160 +ta(I379 +I160 +I361 +I154 +ta(I361 +I154 +I343 +I151 +ta(I343 +I151 +I319 +I147 +ta(I319 +I147 +I299 +I144 +ta(I299 +I144 +I279 +I142 +ta(I279 +I142 +I257 +I141 +ta(I257 +I141 +I241 +I141 +ta(I241 +I141 +I227 +I141 +ta(I227 +I141 +I222 +I143 +ta(I222 +I143 +I218 +I147 +ta(I218 +I147 +I215 +I152 +ta(I215 +I152 +I214 +I157 +ta(I214 +I157 +I213 +I171 +ta(I213 +I171 +I213 +I177 +ta(I213 +I177 +I213 +I183 +ta(I213 +I183 +I214 +I197 +ta(I214 +I197 +I216 +I202 +ta(I216 +I202 +I219 +I208 +ta(I219 +I208 +I223 +I213 +ta(I223 +I213 +I229 +I217 +ta(I229 +I217 +I243 +I220 +ta(I243 +I220 +I263 +I222 +ta(I263 +I222 +I281 +I223 +ta(I281 +I223 +I301 +I223 +ta(I301 +I223 +I319 +I222 +ta(I319 +I222 +I333 +I219 +ta(I333 +I219 +I338 +I215 +ta(I338 +I215 +I340 +I210 +ta(I340 +I210 +I341 +I204 +ta(I341 +I204 +I341 +I198 +ta(I341 +I198 +I339 +I184 +ta(I339 +I184 +I334 +I178 +ta(I334 +I178 +I329 +I173 +ta(I329 +I173 +I313 +I159 +ta(I313 +I159 +I295 +I154 +ta(I295 +I154 +I277 +I140 +ta(I277 +I140 +I261 +I138 +ta(I261 +I138 +I243 +I134 +ta(I243 +I134 +I223 +I131 +ta(I223 +I131 +I203 +I128 +ta(I203 +I128 +I187 +I126 +ta(I187 +I126 +I171 +I126 +ta(I171 +I126 +I167 +I126 +ta(I167 +I126 +I161 +I127 +ta(I161 +I127 +I157 +I131 +ta(I157 +I131 +I155 +I137 +ta(I155 +I137 +I153 +I151 +ta(I153 +I151 +I151 +I167 +ta(I151 +I167 +I151 +I181 +ta(I151 +I181 +I151 +I197 +ta(I151 +I197 +I151 +I211 +ta(I151 +I211 +I153 +I217 +ta(I153 +I217 +I155 +I222 +ta(I155 +I222 +I158 +I226 +ta(I158 +I226 +I161 +I229 +ta(I161 +I229 +I165 +I232 +ta(I165 +I232 +I171 +I232 +ta(I171 +I232 +I176 +I232 +ta(I176 +I232 +I182 +I230 +ta(I182 +I230 +I187 +I227 +ta(I187 +I227 +I192 +I222 +ta(I192 +I222 +I195 +I218 +ta(I195 +I218 +I197 +I212 +ta(I197 +I212 +I198 +I206 +ta(I198 +I206 +I198 +I201 +ta(I198 +I201 +I197 +I187 +ta(I197 +I187 +I195 +I173 +ta(I195 +I173 +I191 +I168 +ta(I191 +I168 +I187 +I163 +ta(I187 +I163 +I182 +I149 +ta(I182 +I149 +I176 +I145 +ta(I176 +I145 +I162 +I141 +ta(I162 +I141 +I156 +I137 +ta(I156 +I137 +I140 +I133 +ta(I140 +I133 +I124 +I131 +ta(I124 +I131 +I108 +I130 +ta(I108 +I130 +I94 +I130 +ta(I94 +I130 +I80 +I131 +ta(I80 +I131 +I76 +I134 +ta(I76 +I134 +I71 +I137 +ta(I71 +I137 +I66 +I143 +ta(I66 +I143 +I62 +I149 +ta(I62 +I149 +I59 +I155 +ta(I59 +I155 +I57 +I171 +ta(I57 +I171 +I56 +I185 +ta(I56 +I185 +I55 +I199 +ta(I55 +I199 +I55 +I215 +ta(I55 +I215 +I55 +I229 +ta(I55 +I229 +I57 +I234 +ta(I57 +I234 +I59 +I240 +ta(I59 +I240 +I63 +I244 +ta(I63 +I244 +I67 +I247 +ta(I67 +I247 +I71 +I249 +ta(I71 +I249 +I87 +I251 +ta(I87 +I251 +I92 +I251 +ta(I92 +I251 +I98 +I250 +ta(I98 +I250 +I102 +I248 +ta(I102 +I248 +I106 +I244 +ta(I106 +I244 +I110 +I239 +ta(I110 +I239 +I112 +I233 +ta(I112 +I233 +I113 +I227 +ta(I113 +I227 +I113 +I221 +ta(I113 +I221 +I113 +I215 +ta(I113 +I215 +I112 +I201 +ta(I112 +I201 +I109 +I195 +ta(I109 +I195 +I107 +I189 +ta(I107 +I189 +I103 +I183 +ta(I103 +I183 +I99 +I179 +ta(I99 +I179 +I95 +I175 +ta(I95 +I175 +I90 +I171 +ta(I90 +I171 +I84 +I169 +ta(I84 +I169 +I78 +I168 +ta(I78 +I168 +I74 +I167 +ta(I74 +I167 +I69 +I167 +ta(I69 +I167 +I65 +I169 +ta(I65 +I169 +I62 +I172 +ta(I62 +I172 +I58 +I178 +ta(I58 +I178 +I55 +I184 +ta(I55 +I184 +I52 +I189 +ta(I52 +I189 +I48 +I209 +ta(I48 +I209 +I46 +I227 +ta(I46 +I227 +I43 +I243 +ta(I43 +I243 +I41 +I259 +ta(I41 +I259 +I38 +I277 +ta(I38 +I277 +I38 +I295 +ta(I38 +I295 +I38 +I311 +ta(I38 +I311 +I39 +I317 +ta(I39 +I317 +I42 +I323 +ta(I42 +I323 +I46 +I327 +ta(I46 +I327 +I52 +I330 +ta(I52 +I330 +I58 +I332 +ta(I58 +I332 +I63 +I333 +ta(I63 +I333 +I77 +I333 +ta(I77 +I333 +I82 +I331 +ta(I82 +I331 +I87 +I329 +ta(I87 +I329 +I91 +I325 +ta(I91 +I325 +I95 +I320 +ta(I95 +I320 +I99 +I315 +ta(I99 +I315 +I102 +I309 +ta(I102 +I309 +I104 +I304 +ta(I104 +I304 +I105 +I298 +ta(I105 +I298 +I105 +I293 +ta(I105 +I293 +I103 +I288 +ta(I103 +I288 +I101 +I283 +ta(I101 +I283 +I97 +I278 +ta(I97 +I278 +I92 +I275 +ta(I92 +I275 +I88 +I272 +ta(I88 +I272 +I84 +I271 +ta(I84 +I271 +I80 +I270 +ta(I80 +I270 +I76 +I271 +ta(I76 +I271 +I72 +I273 +ta(I72 +I273 +I68 +I275 +ta(I68 +I275 +I65 +I278 +ta(I65 +I278 +I61 +I282 +ta(I61 +I282 +I59 +I286 +ta(I59 +I286 +I57 +I292 +ta(I57 +I292 +I56 +I297 +ta(I56 +I297 +I56 +I302 +ta(I56 +I302 +I58 +I308 +ta(I58 +I308 +I60 +I314 +ta(I60 +I314 +I63 +I319 +ta(I63 +I319 +I67 +I324 +ta(I67 +I324 +I73 +I328 +ta(I73 +I328 +I78 +I332 +ta(I78 +I332 +I84 +I334 +ta(I84 +I334 +I89 +I336 +ta(I89 +I336 +I105 +I337 +ta(I105 +I337 +I119 +I337 +ta(I119 +I337 +I135 +I335 +ta(I135 +I335 +I153 +I331 +ta(I153 +I331 +I169 +I327 +ta(I169 +I327 +I174 +I322 +ta(I174 +I322 +I180 +I316 +ta(I180 +I316 +I183 +I302 +ta(I183 +I302 +I186 +I296 +ta(I186 +I296 +I187 +I282 +ta(I187 +I282 +I187 +I266 +ta(I187 +I266 +I185 +I252 +ta(I185 +I252 +I182 +I238 +ta(I182 +I238 +I178 +I224 +ta(I178 +I224 +I173 +I220 +ta(I173 +I220 +I159 +I206 +ta(I159 +I206 +I153 +I203 +ta(I153 +I203 +I149 +I201 +ta(I149 +I201 +I144 +I199 +ta(I144 +I199 +I140 +I199 +ta(I140 +I199 +I137 +I200 +ta(I137 +I200 +I135 +I202 +ta(I135 +I202 +I133 +I208 +ta(I133 +I208 +I132 +I213 +ta(I132 +I213 +I131 +I218 +ta(I131 +I218 +I131 +I234 +ta(I131 +I234 +I131 +I250 +ta(I131 +I250 +I133 +I264 +ta(I133 +I264 +I135 +I268 +ta(I135 +I268 +I138 +I274 +ta(I138 +I274 +I143 +I279 +ta(I143 +I279 +I148 +I283 +ta(I148 +I283 +I154 +I287 +ta(I154 +I287 +I160 +I290 +ta(I160 +I290 +I178 +I291 +ta(I178 +I291 +I194 +I292 +ta(I194 +I292 +I210 +I292 +ta(I210 +I292 +I224 +I290 +ta(I224 +I290 +I230 +I288 +ta(I230 +I288 +I236 +I284 +ta(I236 +I284 +I241 +I280 +ta(I241 +I280 +I245 +I276 +ta(I245 +I276 +I249 +I271 +ta(I249 +I271 +I251 +I257 +ta(I251 +I257 +I252 +I252 +ta(I252 +I252 +I252 +I238 +ta(I252 +I238 +I251 +I232 +ta(I251 +I232 +I248 +I218 +ta(I248 +I218 +I244 +I212 +ta(I244 +I212 +I240 +I207 +ta(I240 +I207 +I226 +I193 +ta(I226 +I193 +I221 +I189 +ta(I221 +I189 +I207 +I186 +ta(I207 +I186 +I203 +I183 +ta(I203 +I183 +I198 +I182 +ta(I198 +I182 +I194 +I182 +ta(I194 +I182 +I191 +I182 +ta(I191 +I182 +I189 +I184 +ta(I189 +I184 +I187 +I187 +ta(I187 +I187 +I186 +I193 +ta(I186 +I193 +I186 +I199 +ta(I186 +I199 +I186 +I215 +ta(I186 +I215 +I187 +I231 +ta(I187 +I231 +I188 +I247 +ta(I188 +I247 +I189 +I263 +ta(I189 +I263 +I192 +I279 +ta(I192 +I279 +I194 +I284 +ta(I194 +I284 +I197 +I290 +ta(I197 +I290 +I203 +I296 +ta(I203 +I296 +I208 +I299 +ta(I208 +I299 +I214 +I302 +ta(I214 +I302 +I230 +I303 +ta(I230 +I303 +I246 +I304 +ta(I246 +I304 +I262 +I304 +ta(I262 +I304 +I278 +I301 +ta(I278 +I301 +I294 +I298 +ta(I294 +I298 +I308 +I293 +ta(I308 +I293 +I313 +I287 +ta(I313 +I287 +I316 +I282 +ta(I316 +I282 +I319 +I268 +ta(I319 +I268 +I321 +I254 +ta(I321 +I254 +I322 +I240 +ta(I322 +I240 +I322 +I226 +ta(I322 +I226 +I319 +I212 +ta(I319 +I212 +I315 +I198 +ta(I315 +I198 +I311 +I194 +ta(I311 +I194 +I306 +I180 +ta(I306 +I180 +I300 +I177 +ta(I300 +I177 +I286 +I175 +ta(I286 +I175 +I282 +I174 +ta(I282 +I174 +I276 +I174 +ta(I276 +I174 +I272 +I174 +ta(I272 +I174 +I268 +I176 +ta(I268 +I176 +I265 +I181 +ta(I265 +I181 +I263 +I187 +ta(I263 +I187 +I262 +I192 +ta(I262 +I192 +I261 +I198 +ta(I261 +I198 +I261 +I212 +ta(I261 +I212 +I261 +I226 +ta(I261 +I226 +I262 +I244 +ta(I262 +I244 +I264 +I258 +ta(I264 +I258 +I268 +I274 +ta(I268 +I274 +I273 +I280 +ta(I273 +I280 +I279 +I296 +ta(I279 +I296 +I285 +I301 +ta(I285 +I301 +I301 +I306 +ta(I301 +I306 +I317 +I309 +ta(I317 +I309 +I333 +I311 +ta(I333 +I311 +I351 +I311 +ta(I351 +I311 +I369 +I311 +ta(I369 +I311 +I387 +I310 +ta(I387 +I310 +I401 +I306 +ta(I401 +I306 +I406 +I303 +ta(I406 +I303 +I411 +I299 +ta(I411 +I299 +I415 +I294 +ta(I415 +I294 +I419 +I280 +ta(I419 +I280 +I421 +I275 +ta(I421 +I275 +I421 +I261 +ta(I421 +I261 +I421 +I255 +ta(I421 +I255 +I416 +I241 +ta(I416 +I241 +I411 +I235 +ta(I411 +I235 +I397 +I231 +ta(I397 +I231 +I391 +I227 +ta(I391 +I227 +I385 +I224 +ta(I385 +I224 +I371 +I222 +ta(I371 +I222 +I365 +I221 +ta(I365 +I221 +I361 +I221 +ta(I361 +I221 +I358 +I221 +ta(I358 +I221 +I356 +I223 +ta(I356 +I223 +I354 +I227 +ta(I354 +I227 +I353 +I233 +ta(I353 +I233 +I353 +I238 +ta(I353 +I238 +I353 +I252 +ta(I353 +I252 +I353 +I268 +ta(I353 +I268 +I355 +I282 +ta(I355 +I282 +I358 +I298 +ta(I358 +I298 +I362 +I312 +ta(I362 +I312 +I365 +I326 +ta(I365 +I326 +I371 +I330 +ta(I371 +I330 +I376 +I333 +ta(I376 +I333 +I382 +I336 +ta(I382 +I336 +I388 +I338 +ta(I388 +I338 +I394 +I338 +ta(I394 +I338 +I408 +I337 +ta(I408 +I337 +I424 +I334 +ta(I424 +I334 +I429 +I331 +ta(I429 +I331 +I435 +I317 +ta(I435 +I317 +I441 +I313 +ta(I441 +I313 +I445 +I299 +ta(I445 +I299 +I448 +I293 +ta(I448 +I293 +I450 +I287 +ta(I450 +I287 +I451 +I273 +ta(I451 +I273 +I451 +I257 +ta(I451 +I257 +I449 +I243 +ta(I449 +I243 +I446 +I229 +ta(I446 +I229 +I442 +I223 +ta(I442 +I223 +I437 +I218 +ta(I437 +I218 +I432 +I213 +ta(I432 +I213 +I418 +I209 +ta(I418 +I209 +I414 +I206 +ta(I414 +I206 +I409 +I204 +ta(I409 +I204 +I405 +I203 +ta(I405 +I203 +I402 +I203 +ta(I402 +I203 +I399 +I203 +ta(I399 +I203 +I396 +I206 +ta(I396 +I206 +I393 +I212 +ta(I393 +I212 +I391 +I217 +ta(I391 +I217 +I390 +I223 +ta(I390 +I223 +I389 +I229 +ta(I389 +I229 +I389 +I247 +ta(I389 +I247 +I389 +I261 +ta(I389 +I261 +I391 +I277 +ta(I391 +I277 +I393 +I282 +ta(I393 +I282 +I396 +I287 +ta(I396 +I287 +I401 +I292 +ta(I401 +I292 +I406 +I295 +ta(I406 +I295 +I412 +I297 +ta(I412 +I297 +I418 +I299 +ta(I418 +I299 +I434 +I299 +ta(I434 +I299 +I450 +I297 +ta(I450 +I297 +I464 +I294 +ta(I464 +I294 +I470 +I290 +ta(I470 +I290 +I476 +I286 +ta(I476 +I286 +I481 +I280 +ta(I481 +I280 +I485 +I266 +ta(I485 +I266 +I488 +I260 +ta(I488 +I260 +I490 +I254 +ta(I490 +I254 +I490 +I238 +ta(I490 +I238 +I490 +I224 +ta(I490 +I224 +I489 +I208 +ta(I489 +I208 +I486 +I202 +ta(I486 +I202 +I483 +I196 +ta(I483 +I196 +I479 +I191 +ta(I479 +I191 +I474 +I185 +ta(I474 +I185 +I468 +I182 +ta(I468 +I182 +I462 +I178 +ta(I462 +I178 +I456 +I176 +ta(I456 +I176 +I452 +I175 +ta(I452 +I175 +I447 +I175 +ta(I447 +I175 +I444 +I175 +ta(I444 +I175 +I441 +I178 +ta(I441 +I178 +I439 +I181 +ta(I439 +I181 +I438 +I186 +ta(I438 +I186 +I437 +I200 +ta(I437 +I200 +I437 +I214 +ta(I437 +I214 +I439 +I230 +ta(I439 +I230 +I441 +I244 +ta(I441 +I244 +I444 +I260 +ta(I444 +I260 +I447 +I276 +ta(I447 +I276 +I452 +I281 +ta(I452 +I281 +I455 +I286 +ta(I455 +I286 +I460 +I289 +ta(I460 +I289 +I466 +I291 +ta(I466 +I291 +I470 +I292 +ta(I470 +I292 +I476 +I292 +ta(I476 +I292 +I481 +I292 +ta(I481 +I292 +I486 +I289 +ta(I486 +I289 +I491 +I285 +ta(I491 +I285 +I495 +I280 +ta(I495 +I280 +I499 +I266 +ta(I499 +I266 +I503 +I260 +ta(I503 +I260 +I505 +I254 +ta(I505 +I254 +I506 +I248 +ta(I506 +I248 +I506 +I234 +ta(I506 +I234 +I506 +I220 +ta(I506 +I220 +I506 +I206 +ta(I506 +I206 +I503 +I200 +ta(I503 +I200 +I500 +I194 +ta(I500 +I194 +I496 +I190 +ta(I496 +I190 +I492 +I185 +ta(I492 +I185 +I487 +I180 +ta(I487 +I180 +I483 +I177 +ta(I483 +I177 +I480 +I174 +ta(I480 +I174 +I476 +I172 +ta(I476 +I172 +I473 +I172 +ta(I473 +I172 +I471 +I172 +ta(I471 +I172 +I469 +I172 +ta(I469 +I172 +I467 +I173 +ta(I467 +I173 +I466 +I176 +ta(I466 +I176 +I465 +I179 +ta(I465 +I179 +I464 +I193 +ta(I464 +I193 +I464 +I199 +ta(I464 +I199 +I464 +I205 +ta(I464 +I205 +I464 +I225 +ta(I464 +I225 +I464 +I241 +ta(I464 +I241 +I464 +I257 +ta(I464 +I257 +I464 +I273 +ta(I464 +I273 +I466 +I287 +ta(I466 +I287 +I468 +I301 +ta(I468 +I301 +I472 +I306 +ta(I472 +I306 +I476 +I311 +ta(I476 +I311 +I482 +I314 +ta(I482 +I314 +I487 +I316 +ta(I487 +I316 +I493 +I318 +ta(I493 +I318 +I511 +I318 +ta(I511 +I318 +I525 +I318 +ta(I525 +I318 +I541 +I316 +ta(I541 +I316 +I561 +I311 +ta(I561 +I311 +I577 +I305 +ta(I577 +I305 +I595 +I299 +ta(I595 +I299 +I600 +I293 +ta(I600 +I293 +I605 +I279 +ta(I605 +I279 +I608 +I265 +ta(I608 +I265 +I611 +I249 +ta(I611 +I249 +I612 +I233 +ta(I612 +I233 +I612 +I219 +ta(I612 +I219 +I610 +I205 +ta(I610 +I205 +I607 +I200 +ta(I607 +I200 +I603 +I196 +ta(I603 +I196 +I598 +I192 +ta(I598 +I192 +I594 +I190 +ta(I594 +I190 +I590 +I189 +ta(I590 +I189 +I587 +I189 +ta(I587 +I189 +I585 +I189 +ta(I585 +I189 +I582 +I191 +ta(I582 +I191 +I580 +I193 +ta(I580 +I193 +I577 +I197 +ta(I577 +I197 +I575 +I201 +ta(I575 +I201 +I573 +I207 +ta(I573 +I207 +I571 +I213 +ta(I571 +I213 +I571 +I227 +ta(I571 +I227 +I571 +I241 +ta(I571 +I241 +I572 +I255 +ta(I572 +I255 +I574 +I273 +ta(I574 +I273 +I577 +I277 +ta(I577 +I277 +I581 +I281 +ta(I581 +I281 +I587 +I285 +ta(I587 +I285 +I593 +I288 +ta(I593 +I288 +I599 +I289 +ta(I599 +I289 +I615 +I289 +ta(I615 +I289 +I629 +I288 +ta(I629 +I288 +I634 +I285 +ta(I634 +I285 +I648 +I281 +ta(I648 +I281 +I654 +I276 +ta(I654 +I276 +I659 +I270 +ta(I659 +I270 +I662 +I254 +ta(I662 +I254 +I665 +I240 +ta(I665 +I240 +I667 +I226 +ta(I667 +I226 +I668 +I210 +ta(I668 +I210 +I668 +I194 +ta(I668 +I194 +I667 +I180 +ta(I667 +I180 +I664 +I166 +ta(I664 +I166 +I659 +I152 +ta(I659 +I152 +I645 +I147 +ta(I645 +I147 +I639 +I142 +ta(I639 +I142 +I623 +I138 +ta(I623 +I138 +I607 +I134 +ta(I607 +I134 +I593 +I133 +ta(I593 +I133 +I587 +I133 +ta(I587 +I133 +I583 +I133 +ta(I583 +I133 +I579 +I134 +ta(I579 +I134 +I577 +I136 +ta(I577 +I136 +I575 +I140 +ta(I575 +I140 +I573 +I145 +ta(I573 +I145 +I573 +I149 +ta(I573 +I149 +I573 +I163 +ta(I573 +I163 +I575 +I177 +ta(I575 +I177 +I577 +I191 +ta(I577 +I191 +I580 +I197 +ta(I580 +I197 +I584 +I213 +ta(I584 +I213 +I588 +I218 +ta(I588 +I218 +I594 +I223 +ta(I594 +I223 +I599 +I227 +ta(I599 +I227 +I605 +I231 +ta(I605 +I231 +I610 +I233 +ta(I610 +I233 +I624 +I234 +ta(I624 +I234 +I629 +I234 +ta(I629 +I234 +I635 +I233 +ta(I635 +I233 +I641 +I230 +ta(I641 +I230 +I644 +I227 +ta(I644 +I227 +I649 +I222 +ta(I649 +I222 +I652 +I216 +ta(I652 +I216 +I654 +I210 +ta(I654 +I210 +I655 +I204 +ta(I655 +I204 +I655 +I190 +ta(I655 +I190 +I653 +I184 +ta(I653 +I184 +I651 +I179 +ta(I651 +I179 +I647 +I173 +ta(I647 +I173 +I642 +I169 +ta(I642 +I169 +I638 +I165 +ta(I638 +I165 +I635 +I163 +ta(I635 +I163 +I631 +I161 +ta(I631 +I161 +I628 +I160 +ta(I628 +I160 +I625 +I160 +ta(I625 +I160 +I622 +I161 +ta(I622 +I161 +I618 +I164 +ta(I618 +I164 +I614 +I169 +ta(I614 +I169 +I611 +I187 +ta(I611 +I187 +I607 +I203 +ta(I607 +I203 +I605 +I217 +ta(I605 +I217 +I603 +I235 +ta(I603 +I235 +I602 +I257 +ta(I602 +I257 +I602 +I275 +ta(I602 +I275 +I602 +I291 +ta(I602 +I291 +I605 +I309 +ta(I605 +I309 +I608 +I323 +ta(I608 +I323 +I612 +I329 +ta(I612 +I329 +I616 +I335 +ta(I616 +I335 +I621 +I339 +ta(I621 +I339 +I635 +I343 +ta(I635 +I343 +I641 +I347 +ta(I641 +I347 +I657 +I350 +ta(I657 +I350 +I662 +I351 +ta(I662 +I351 +I678 +I351 +ta(I678 +I351 +I692 +I351 +ta(I692 +I351 +I696 +I349 +ta(I696 +I349 +I702 +I346 +ta(I702 +I346 +I705 +I343 +ta(I705 +I343 +I708 +I339 +ta(I708 +I339 +I710 +I336 +ta(I710 +I336 +I710 +I332 +ta(I710 +I332 +I709 +I327 +ta(I709 +I327 +I707 +I323 +ta(I707 +I323 +I703 +I319 +ta(I703 +I319 +I699 +I317 +ta(I699 +I317 +I694 +I315 +ta(I694 +I315 +I680 +I313 +ta(I680 +I313 +I676 +I313 +ta(I676 +I313 +I672 +I313 +ta(I672 +I313 +I667 +I315 +ta(I667 +I315 +I663 +I318 +ta(I663 +I318 +I658 +I323 +ta(I658 +I323 +I653 +I327 +ta(I653 +I327 +I648 +I333 +ta(I648 +I333 +I644 +I339 +ta(I644 +I339 +I641 +I344 +ta(I641 +I344 +I639 +I350 +ta(I639 +I350 +I638 +I355 +ta(I638 +I355 +I637 +I360 +ta(I637 +I360 +I637 +I365 +ta(I637 +I365 +I639 +I369 +ta(I639 +I369 +I641 +I372 +ta(I641 +I372 +I644 +I374 +ta(I644 +I374 +I647 +I376 +ta(I647 +I376 +I650 +I377 +ta(I650 +I377 +I653 +I378 +ta(I653 +I378 +I656 +I378 +ta(I656 +I378 +I660 +I378 +ta(I660 +I378 +I664 +I376 +ta(I664 +I376 +I667 +I374 +ta(I667 +I374 +I671 +I371 +ta(I671 +I371 +I675 +I368 +ta(I675 +I368 +I679 +I364 +ta(I679 +I364 +I682 +I359 +ta(I682 +I359 +I684 +I355 +ta(I684 +I355 +I685 +I350 +ta(I685 +I350 +I685 +I344 +ta(I685 +I344 +I685 +I340 +ta(I685 +I340 +I683 +I334 +ta(I683 +I334 +I680 +I328 +ta(I680 +I328 +I676 +I322 +ta(I676 +I322 +I671 +I318 +ta(I671 +I318 +I666 +I313 +ta(I666 +I313 +I660 +I309 +ta(I660 +I309 +I644 +I306 +ta(I644 +I306 +I638 +I303 +ta(I638 +I303 +I632 +I302 +ta(I632 +I302 +I626 +I301 +ta(I626 +I301 +I612 +I302 +ta(I612 +I302 +I606 +I304 +ta(I606 +I304 +I602 +I308 +ta(I602 +I308 +I597 +I322 +ta(I597 +I322 +I593 +I328 +ta(I593 +I328 +I590 +I344 +ta(I590 +I344 +I588 +I360 +ta(I588 +I360 +I588 +I376 +ta(I588 +I376 +I587 +I392 +ta(I587 +I392 +I588 +I397 +ta(I588 +I397 +I589 +I411 +ta(I589 +I411 +I592 +I417 +ta(I592 +I417 +I595 +I421 +ta(I595 +I421 +I599 +I424 +ta(I599 +I424 +I604 +I427 +ta(I604 +I427 +I608 +I428 +ta(I608 +I428 +I612 +I429 +ta(I612 +I429 +I616 +I429 +ta(I616 +I429 +I621 +I428 +ta(I621 +I428 +I625 +I427 +ta(I625 +I427 +I628 +I424 +ta(I628 +I424 +I630 +I421 +ta(I630 +I421 +I632 +I417 +ta(I632 +I417 +I632 +I413 +ta(I632 +I413 +I632 +I409 +ta(I632 +I409 +I630 +I403 +ta(I630 +I403 +I627 +I389 +ta(I627 +I389 +I621 +I375 +ta(I621 +I375 +I607 +I369 +ta(I607 +I369 +I593 +I363 +ta(I593 +I363 +I577 +I359 +ta(I577 +I359 +I559 +I354 +ta(I559 +I354 +I543 +I350 +ta(I543 +I350 +I529 +I346 +ta(I529 +I346 +I513 +I343 +ta(I513 +I343 +I499 +I341 +ta(I499 +I341 +I485 +I340 +ta(I485 +I340 +I469 +I340 +ta(I469 +I340 +I464 +I341 +ta(I464 +I341 +I450 +I345 +ta(I450 +I345 +I446 +I350 +ta(I446 +I350 +I443 +I356 +ta(I443 +I356 +I440 +I362 +ta(I440 +I362 +I439 +I378 +ta(I439 +I378 +I439 +I392 +ta(I439 +I392 +I439 +I398 +ta(I439 +I398 +I439 +I404 +ta(I439 +I404 +I439 +I420 +ta(I439 +I420 +I441 +I424 +ta(I441 +I424 +I443 +I429 +ta(I443 +I429 +I445 +I432 +ta(I445 +I432 +I448 +I436 +ta(I448 +I436 +I451 +I438 +ta(I451 +I438 +I455 +I440 +ta(I455 +I440 +I459 +I440 +ta(I459 +I440 +I464 +I440 +ta(I464 +I440 +I468 +I439 +ta(I468 +I439 +I473 +I436 +ta(I473 +I436 +I478 +I433 +ta(I478 +I433 +I481 +I429 +ta(I481 +I429 +I485 +I424 +ta(I485 +I424 +I488 +I410 +ta(I488 +I410 +I489 +I405 +ta(I489 +I405 +I490 +I391 +ta(I490 +I391 +I489 +I385 +ta(I489 +I385 +I487 +I379 +ta(I487 +I379 +I485 +I374 +ta(I485 +I374 +I482 +I368 +ta(I482 +I368 +I478 +I363 +ta(I478 +I363 +I473 +I357 +ta(I473 +I357 +I467 +I354 +ta(I467 +I354 +I461 +I350 +ta(I461 +I350 +I456 +I347 +ta(I456 +I347 +I440 +I344 +ta(I440 +I344 +I434 +I343 +ta(I434 +I343 +I420 +I343 +ta(I420 +I343 +I406 +I344 +ta(I406 +I344 +I400 +I347 +ta(I400 +I347 +I395 +I353 +ta(I395 +I353 +I392 +I367 +ta(I392 +I367 +I388 +I381 +ta(I388 +I381 +I385 +I397 +ta(I385 +I397 +I383 +I411 +ta(I383 +I411 +I382 +I427 +ta(I382 +I427 +I381 +I432 +ta(I381 +I432 +I381 +I448 +ta(I381 +I448 +I381 +I453 +ta(I381 +I453 +I383 +I456 +ta(I383 +I456 +I386 +I460 +ta(I386 +I460 +I390 +I462 +ta(I390 +I462 +I396 +I464 +ta(I396 +I464 +I400 +I464 +ta(I400 +I464 +I406 +I464 +ta(I406 +I464 +I412 +I462 +ta(I412 +I462 +I428 +I460 +ta(I428 +I460 +I433 +I457 +ta(I433 +I457 +I439 +I453 +ta(I439 +I453 +I445 +I448 +ta(I445 +I448 +I448 +I443 +ta(I448 +I443 +I450 +I437 +ta(I450 +I437 +I450 +I431 +ta(I450 +I431 +I450 +I425 +ta(I450 +I425 +I447 +I420 +ta(I447 +I420 +I443 +I415 +ta(I443 +I415 +I438 +I401 +ta(I438 +I401 +I424 +I397 +ta(I424 +I397 +I410 +I392 +ta(I410 +I392 +I392 +I388 +ta(I392 +I388 +I374 +I385 +ta(I374 +I385 +I352 +I382 +ta(I352 +I382 +I330 +I379 +ta(I330 +I379 +I308 +I376 +ta(I308 +I376 +I288 +I375 +ta(I288 +I375 +I268 +I375 +ta(I268 +I375 +I250 +I375 +ta(I250 +I375 +I230 +I378 +ta(I230 +I378 +I224 +I381 +ta(I224 +I381 +I218 +I387 +ta(I218 +I387 +I215 +I392 +ta(I215 +I392 +I212 +I398 +ta(I212 +I398 +I211 +I416 +ta(I211 +I416 +I210 +I422 +ta(I210 +I422 +I211 +I438 +ta(I211 +I438 +I213 +I443 +ta(I213 +I443 +I215 +I449 +ta(I215 +I449 +I220 +I454 +ta(I220 +I454 +I223 +I457 +ta(I223 +I457 +I228 +I460 +ta(I228 +I460 +I232 +I462 +ta(I232 +I462 +I238 +I463 +ta(I238 +I463 +I244 +I463 +ta(I244 +I463 +I249 +I463 +ta(I249 +I463 +I254 +I460 +ta(I254 +I460 +I258 +I457 +ta(I258 +I457 +I262 +I453 +ta(I262 +I453 +I267 +I447 +ta(I267 +I447 +I268 +I433 +ta(I268 +I433 +I269 +I427 +ta(I269 +I427 +I269 +I413 +ta(I269 +I413 +I268 +I407 +ta(I268 +I407 +I266 +I391 +ta(I266 +I391 +I264 +I377 +ta(I264 +I377 +I261 +I371 +ta(I261 +I371 +I258 +I365 +ta(I258 +I365 +I255 +I359 +ta(I255 +I359 +I250 +I354 +ta(I250 +I354 +I246 +I349 +ta(I246 +I349 +I241 +I345 +ta(I241 +I345 +I236 +I341 +ta(I236 +I341 +I232 +I340 +ta(I232 +I340 +I227 +I340 +ta(I227 +I340 +I224 +I340 +ta(I224 +I340 +I220 +I343 +ta(I220 +I343 +I217 +I348 +ta(I217 +I348 +I215 +I362 +ta(I215 +I362 +I213 +I376 +ta(I213 +I376 +I213 +I392 +ta(I213 +I392 +I212 +I406 +ta(I212 +I406 +I212 +I422 +ta(I212 +I422 +I213 +I428 +ta(I213 +I428 +I216 +I442 +ta(I216 +I442 +I219 +I447 +ta(I219 +I447 +I223 +I452 +ta(I223 +I452 +I229 +I455 +ta(I229 +I455 +I235 +I458 +ta(I235 +I458 +I249 +I460 +ta(I249 +I460 +I265 +I461 +ta(I265 +I461 +I281 +I461 +ta(I281 +I461 +I299 +I458 +ta(I299 +I458 +I315 +I455 +ta(I315 +I455 +I331 +I451 +ta(I331 +I451 +I337 +I446 +ta(I337 +I446 +I341 +I441 +ta(I341 +I441 +I343 +I435 +ta(I343 +I435 +I345 +I421 +ta(I345 +I421 +I345 +I415 +ta(I345 +I415 +I345 +I399 +ta(I345 +I399 +I342 +I383 +ta(I342 +I383 +I339 +I369 +ta(I339 +I369 +I335 +I363 +ta(I335 +I363 +I329 +I358 +ta(I329 +I358 +I315 +I353 +ta(I315 +I353 +I309 +I349 +ta(I309 +I349 +I295 +I345 +ta(I295 +I345 +I281 +I342 +ta(I281 +I342 +I267 +I340 +ta(I267 +I340 +I261 +I339 +ta(I261 +I339 +I257 +I339 +ta(I257 +I339 +I253 +I341 +ta(I253 +I341 +I250 +I344 +ta(I250 +I344 +I248 +I349 +ta(I248 +I349 +I246 +I355 +ta(I246 +I355 +I246 +I361 +ta(I246 +I361 +I246 +I377 +ta(I246 +I377 +I246 +I393 +ta(I246 +I393 +I248 +I398 +ta(I248 +I398 +I252 +I416 +ta(I252 +I416 +I258 +I421 +ta(I258 +I421 +I263 +I426 +ta(I263 +I426 +I279 +I429 +ta(I279 +I429 +I295 +I432 +ta(I295 +I432 +I309 +I433 +ta(I309 +I433 +I325 +I433 +ta(I325 +I433 +I343 +I430 +ta(I343 +I430 +I359 +I426 +ta(I359 +I426 +I364 +I421 +ta(I364 +I421 +I369 +I407 +ta(I369 +I407 +I371 +I393 +ta(I371 +I393 +I373 +I379 +ta(I373 +I379 +I374 +I363 +ta(I374 +I363 +I372 +I349 +ta(I372 +I349 +I368 +I335 +ta(I368 +I335 +I362 +I319 +ta(I362 +I319 +I356 +I305 +ta(I356 +I305 +I350 +I299 +ta(I350 +I299 +I336 +I295 +ta(I336 +I295 +I320 +I290 +ta(I320 +I290 +I304 +I286 +ta(I304 +I286 +I290 +I283 +ta(I290 +I283 +I272 +I279 +ta(I272 +I279 +I258 +I278 +ta(I258 +I278 +I244 +I276 +ta(I244 +I276 +I239 +I276 +ta(I239 +I276 +I236 +I276 +ta(I236 +I276 +I233 +I278 +ta(I233 +I278 +I231 +I281 +ta(I231 +I281 +I229 +I286 +ta(I229 +I286 +I228 +I300 +ta(I228 +I300 +I228 +I306 +ta(I228 +I306 +I228 +I324 +ta(I228 +I324 +I228 +I340 +ta(I228 +I340 +I228 +I356 +ta(I228 +I356 +I228 +I374 +ta(I228 +I374 +I229 +I392 +ta(I229 +I392 +I231 +I408 +ta(I231 +I408 +I233 +I422 +ta(I233 +I422 +I236 +I428 +ta(I236 +I428 +I239 +I433 +ta(I239 +I433 +I243 +I435 +ta(I243 +I435 +I246 +I436 +ta(I246 +I436 +I250 +I437 +ta(I250 +I437 +I253 +I437 +ta(I253 +I437 +I256 +I434 +ta(I256 +I434 +I258 +I430 +ta(I258 +I430 +I260 +I416 +ta(I260 +I416 +I262 +I402 +ta(I262 +I402 +I262 +I386 +ta(I262 +I386 +I262 +I370 +ta(I262 +I370 +I261 +I356 +ta(I261 +I356 +I258 +I338 +ta(I258 +I338 +I255 +I324 +ta(I255 +I324 +I251 +I310 +ta(I251 +I310 +I246 +I305 +ta(I246 +I305 +I232 +I291 +ta(I232 +I291 +I226 +I288 +ta(I226 +I288 +I212 +I285 +ta(I212 +I285 +I206 +I283 +ta(I206 +I283 +I200 +I282 +ta(I200 +I282 +I186 +I282 +ta(I186 +I282 +I181 +I284 +ta(I181 +I284 +I176 +I287 +ta(I176 +I287 +I170 +I293 +ta(I170 +I293 +I166 +I299 +ta(I166 +I299 +I162 +I315 +ta(I162 +I315 +I159 +I331 +ta(I159 +I331 +I156 +I351 +ta(I156 +I351 +I153 +I371 +ta(I153 +I371 +I152 +I389 +ta(I152 +I389 +I152 +I409 +ta(I152 +I409 +I152 +I427 +ta(I152 +I427 +I153 +I433 +ta(I153 +I433 +I156 +I438 +ta(I156 +I438 +I159 +I441 +ta(I159 +I441 +I163 +I444 +ta(I163 +I444 +I166 +I446 +ta(I166 +I446 +I170 +I447 +ta(I170 +I447 +I174 +I447 +ta(I174 +I447 +I179 +I445 +ta(I179 +I445 +I182 +I441 +ta(I182 +I441 +I186 +I436 +ta(I186 +I436 +I190 +I422 +ta(I190 +I422 +I195 +I416 +ta(I195 +I416 +I199 +I402 +ta(I199 +I402 +I201 +I396 +ta(I201 +I396 +I202 +I382 +ta(I202 +I382 +I202 +I368 +ta(I202 +I368 +I202 +I354 +ta(I202 +I354 +I200 +I340 +ta(I200 +I340 +I197 +I334 +ta(I197 +I334 +I193 +I328 +ta(I193 +I328 +I179 +I323 +ta(I179 +I323 +I173 +I318 +ta(I173 +I318 +I167 +I314 +ta(I167 +I314 +I153 +I312 +ta(I153 +I312 +I147 +I310 +ta(I147 +I310 +I141 +I310 +ta(I141 +I310 +I137 +I310 +ta(I137 +I310 +I131 +I313 +ta(I131 +I313 +I126 +I317 +ta(I126 +I317 +I123 +I323 +ta(I123 +I323 +I120 +I341 +ta(I120 +I341 +I117 +I359 +ta(I117 +I359 +I115 +I377 +ta(I115 +I377 +I114 +I395 +ta(I114 +I395 +I112 +I417 +ta(I112 +I417 +I111 +I435 +ta(I111 +I435 +I111 +I453 +ta(I111 +I453 +I111 +I469 +ta(I111 +I469 +I112 +I475 +ta(I112 +I475 +I114 +I480 +ta(I114 +I480 +I116 +I483 +ta(I116 +I483 +I119 +I485 +ta(I119 +I485 +I123 +I487 +ta(I123 +I487 +I127 +I487 +ta(I127 +I487 +I133 +I486 +ta(I133 +I486 +I139 +I483 +ta(I139 +I483 +I144 +I480 +ta(I144 +I480 +I149 +I476 +ta(I149 +I476 +I153 +I470 +ta(I153 +I470 +I156 +I464 +ta(I156 +I464 +I158 +I458 +ta(I158 +I458 +I160 +I452 +ta(I160 +I452 +I160 +I446 +ta(I160 +I446 +I159 +I432 +ta(I159 +I432 +I157 +I418 +ta(I157 +I418 +I154 +I412 +ta(I154 +I412 +I149 +I406 +ta(I149 +I406 +I144 +I402 +ta(I144 +I402 +I130 +I397 +ta(I130 +I397 +I124 +I393 +ta(I124 +I393 +I110 +I390 +ta(I110 +I390 +I94 +I387 +ta(I94 +I387 +I90 +I386 +ta(I90 +I386 +I86 +I386 +ta(I86 +I386 +I81 +I386 +ta(I81 +I386 +I77 +I388 +ta(I77 +I388 +I73 +I392 +ta(I73 +I392 +I69 +I396 +ta(I69 +I396 +I65 +I402 +ta(I65 +I402 +I62 +I416 +ta(I62 +I416 +I60 +I422 +ta(I60 +I422 +I58 +I440 +ta(I58 +I440 +I57 +I456 +ta(I57 +I456 +I57 +I474 +ta(I57 +I474 +I57 +I492 +ta(I57 +I492 +I59 +I508 +ta(I59 +I508 +I61 +I522 +ta(I61 +I522 +I64 +I527 +ta(I64 +I527 +I67 +I530 +ta(I67 +I530 +I70 +I533 +ta(I70 +I533 +I75 +I535 +ta(I75 +I535 +I80 +I535 +ta(I80 +I535 +I85 +I534 +ta(I85 +I534 +I90 +I531 +ta(I90 +I531 +I95 +I526 +ta(I95 +I526 +I98 +I520 +ta(I98 +I520 +I101 +I506 +ta(I101 +I506 +I102 +I492 +ta(I102 +I492 +I104 +I476 +ta(I104 +I476 +I104 +I460 +ta(I104 +I460 +I104 +I442 +ta(I104 +I442 +I102 +I426 +ta(I102 +I426 +I99 +I408 +ta(I99 +I408 +I96 +I394 +ta(I96 +I394 +I92 +I380 +ta(I92 +I380 +I88 +I376 +ta(I88 +I376 +I83 +I371 +ta(I83 +I371 +I78 +I367 +ta(I78 +I367 +I73 +I363 +ta(I73 +I363 +I68 +I360 +ta(I68 +I360 +I63 +I358 +ta(I63 +I358 +I59 +I357 +ta(I59 +I357 +I56 +I357 +ta(I56 +I357 +I53 +I359 +ta(I53 +I359 +I50 +I363 +ta(I50 +I363 +I49 +I369 +ta(I49 +I369 +I47 +I375 +ta(I47 +I375 +I46 +I393 +ta(I46 +I393 +I45 +I407 +ta(I45 +I407 +I44 +I421 +ta(I44 +I421 +I44 +I439 +ta(I44 +I439 +I44 +I455 +ta(I44 +I455 +I44 +I469 +ta(I44 +I469 +I44 +I474 +ta(I44 +I474 +I45 +I480 +ta(I45 +I480 +I46 +I483 +ta(I46 +I483 +I49 +I487 +ta(I49 +I487 +I52 +I490 +ta(I52 +I490 +I55 +I493 +ta(I55 +I493 +I59 +I494 +ta(I59 +I494 +I63 +I494 +ta(I63 +I494 +I67 +I493 +ta(I67 +I493 +I73 +I490 +ta(I73 +I490 +I78 +I487 +ta(I78 +I487 +I81 +I483 +ta(I81 +I483 +I85 +I478 +ta(I85 +I478 +I89 +I464 +ta(I89 +I464 +I91 +I458 +ta(I91 +I458 +I92 +I452 +ta(I92 +I452 +I92 +I438 +ta(I92 +I438 +I92 +I424 +ta(I92 +I424 +I90 +I410 +ta(I90 +I410 +I87 +I396 +ta(I87 +I396 +I83 +I390 +ta(I83 +I390 +I79 +I385 +ta(I79 +I385 +I75 +I381 +ta(I75 +I381 +I70 +I378 +ta(I70 +I378 +I64 +I376 +ta(I64 +I376 +I59 +I375 +ta(I59 +I375 +I53 +I375 +ta(I53 +I375 +I50 +I376 +ta(I50 +I376 +I45 +I380 +ta(I45 +I380 +I40 +I386 +ta(I40 +I386 +I36 +I392 +ta(I36 +I392 +I33 +I408 +ta(I33 +I408 +I30 +I426 +ta(I30 +I426 +I28 +I442 +ta(I28 +I442 +I28 +I460 +ta(I28 +I460 +I27 +I476 +ta(I27 +I476 +I27 +I496 +ta(I27 +I496 +I27 +I512 +ta(I27 +I512 +I28 +I526 +ta(I28 +I526 +I31 +I531 +ta(I31 +I531 +I35 +I537 +ta(I35 +I537 +I49 +I540 +ta(I49 +I540 +I63 +I543 +ta(I63 +I543 +I79 +I544 +ta(I79 +I544 +I99 +I545 +ta(I99 +I545 +I123 +I545 +ta(I123 +I545 +I145 +I544 +ta(I145 +I544 +I167 +I542 +ta(I167 +I542 +I189 +I539 +ta(I189 +I539 +I205 +I536 +ta(I205 +I536 +I221 +I531 +ta(I221 +I531 +I225 +I527 +ta(I225 +I527 +I229 +I521 +ta(I229 +I521 +I231 +I507 +ta(I231 +I507 +I233 +I501 +ta(I233 +I501 +I233 +I495 +ta(I233 +I495 +I232 +I490 +ta(I232 +I490 +I229 +I476 +ta(I229 +I476 +I225 +I470 +ta(I225 +I470 +I219 +I464 +ta(I219 +I464 +I214 +I460 +ta(I214 +I460 +I209 +I456 +ta(I209 +I456 +I204 +I452 +ta(I204 +I452 +I199 +I449 +ta(I199 +I449 +I194 +I448 +ta(I194 +I448 +I190 +I447 +ta(I190 +I447 +I187 +I447 +ta(I187 +I447 +I183 +I448 +ta(I183 +I448 +I180 +I451 +ta(I180 +I451 +I177 +I457 +ta(I177 +I457 +I175 +I462 +ta(I175 +I462 +I174 +I468 +ta(I174 +I468 +I172 +I486 +ta(I172 +I486 +I171 +I500 +ta(I171 +I500 +I171 +I516 +ta(I171 +I516 +I171 +I532 +ta(I171 +I532 +I171 +I546 +ta(I171 +I546 +I172 +I560 +ta(I172 +I560 +I174 +I576 +ta(I174 +I576 +I177 +I580 +ta(I177 +I580 +I181 +I585 +ta(I181 +I585 +I187 +I589 +ta(I187 +I589 +I193 +I591 +ta(I193 +I591 +I211 +I593 +ta(I211 +I593 +I229 +I593 +ta(I229 +I593 +I245 +I593 +ta(I245 +I593 +I261 +I592 +ta(I261 +I592 +I279 +I588 +ta(I279 +I588 +I284 +I584 +ta(I284 +I584 +I290 +I579 +ta(I290 +I579 +I294 +I565 +ta(I294 +I565 +I298 +I551 +ta(I298 +I551 +I300 +I537 +ta(I300 +I537 +I302 +I521 +ta(I302 +I521 +I302 +I505 +ta(I302 +I505 +I302 +I491 +ta(I302 +I491 +I299 +I475 +ta(I299 +I475 +I296 +I469 +ta(I296 +I469 +I282 +I455 +ta(I282 +I455 +I278 +I451 +ta(I278 +I451 +I264 +I447 +ta(I264 +I447 +I250 +I444 +ta(I250 +I444 +I236 +I441 +ta(I236 +I441 +I230 +I439 +ta(I230 +I439 +I224 +I439 +ta(I224 +I439 +I220 +I441 +ta(I220 +I441 +I217 +I445 +ta(I217 +I445 +I214 +I449 +ta(I214 +I449 +I212 +I463 +ta(I212 +I463 +I211 +I469 +ta(I211 +I469 +I211 +I487 +ta(I211 +I487 +I212 +I501 +ta(I212 +I501 +I213 +I515 +ta(I213 +I515 +I216 +I521 +ta(I216 +I521 +I219 +I526 +ta(I219 +I526 +I223 +I531 +ta(I223 +I531 +I227 +I534 +ta(I227 +I534 +I241 +I537 +ta(I241 +I537 +I247 +I540 +ta(I247 +I540 +I263 +I540 +ta(I263 +I540 +I281 +I540 +ta(I281 +I540 +I299 +I538 +ta(I299 +I538 +I315 +I535 +ta(I315 +I535 +I331 +I532 +ta(I331 +I532 +I337 +I528 +ta(I337 +I528 +I343 +I523 +ta(I343 +I523 +I348 +I518 +ta(I348 +I518 +I350 +I512 +ta(I350 +I512 +I351 +I506 +ta(I351 +I506 +I351 +I502 +ta(I351 +I502 +I350 +I488 +ta(I350 +I488 +I346 +I483 +ta(I346 +I483 +I343 +I477 +ta(I343 +I477 +I337 +I472 +ta(I337 +I472 +I332 +I467 +ta(I332 +I467 +I326 +I463 +ta(I326 +I463 +I320 +I461 +ta(I320 +I461 +I304 +I458 +ta(I304 +I458 +I290 +I458 +ta(I290 +I458 +I284 +I458 +ta(I284 +I458 +I279 +I461 +ta(I279 +I461 +I274 +I464 +ta(I274 +I464 +I270 +I470 +ta(I270 +I470 +I267 +I476 +ta(I267 +I476 +I265 +I482 +ta(I265 +I482 +I264 +I500 +ta(I264 +I500 +I264 +I514 +ta(I264 +I514 +I266 +I528 +ta(I266 +I528 +I268 +I533 +ta(I268 +I533 +I272 +I547 +ta(I272 +I547 +I277 +I552 +ta(I277 +I552 +I282 +I556 +ta(I282 +I556 +I298 +I561 +ta(I298 +I561 +I314 +I565 +ta(I314 +I565 +I330 +I568 +ta(I330 +I568 +I346 +I570 +ta(I346 +I570 +I366 +I571 +ta(I366 +I571 +I388 +I571 +ta(I388 +I571 +I408 +I569 +ta(I408 +I569 +I428 +I566 +ta(I428 +I566 +I448 +I562 +ta(I448 +I562 +I464 +I558 +ta(I464 +I558 +I478 +I544 +ta(I478 +I544 +I483 +I538 +ta(I483 +I538 +I485 +I524 +ta(I485 +I524 +I486 +I510 +ta(I486 +I510 +I486 +I494 +ta(I486 +I494 +I484 +I480 +ta(I484 +I480 +I480 +I464 +ta(I480 +I464 +I476 +I450 +ta(I476 +I450 +I471 +I445 +ta(I471 +I445 +I457 +I439 +ta(I457 +I439 +I443 +I435 +ta(I443 +I435 +I429 +I432 +ta(I429 +I432 +I413 +I429 +ta(I413 +I429 +I395 +I428 +ta(I395 +I428 +I377 +I428 +ta(I377 +I428 +I359 +I429 +ta(I359 +I429 +I345 +I432 +ta(I345 +I432 +I339 +I437 +ta(I339 +I437 +I336 +I442 +ta(I336 +I442 +I333 +I456 +ta(I333 +I456 +I331 +I462 +ta(I331 +I462 +I331 +I480 +ta(I331 +I480 +I331 +I496 +ta(I331 +I496 +I332 +I510 +ta(I332 +I510 +I334 +I524 +ta(I334 +I524 +I337 +I529 +ta(I337 +I529 +I343 +I533 +ta(I343 +I533 +I349 +I537 +ta(I349 +I537 +I355 +I542 +ta(I355 +I542 +I369 +I542 +ta(I369 +I542 +I389 +I543 +ta(I389 +I543 +I405 +I544 +ta(I405 +I544 +I423 +I543 +ta(I423 +I543 +I439 +I541 +ta(I439 +I541 +I457 +I538 +ta(I457 +I538 +I463 +I534 +ta(I463 +I534 +I477 +I531 +ta(I477 +I531 +I481 +I517 +ta(I481 +I517 +I484 +I514 +ta(I484 +I514 +I486 +I509 +ta(I486 +I509 +I486 +I495 +ta(I486 +I495 +I486 +I490 +ta(I486 +I490 +I485 +I484 +ta(I485 +I484 +I482 +I478 +ta(I482 +I478 +I479 +I473 +ta(I479 +I473 +I475 +I469 +ta(I475 +I469 +I471 +I465 +ta(I471 +I465 +I465 +I461 +ta(I465 +I461 +I451 +I457 +ta(I451 +I457 +I445 +I454 +ta(I445 +I454 +I431 +I452 +ta(I431 +I452 +I425 +I452 +ta(I425 +I452 +I411 +I452 +ta(I411 +I452 +I395 +I452 +ta(I395 +I452 +I389 +I455 +ta(I389 +I455 +I383 +I459 +ta(I383 +I459 +I380 +I464 +ta(I380 +I464 +I378 +I480 +ta(I378 +I480 +I377 +I496 +ta(I377 +I496 +I377 +I512 +ta(I377 +I512 +I378 +I528 +ta(I378 +I528 +I381 +I542 +ta(I381 +I542 +I384 +I558 +ta(I384 +I558 +I388 +I563 +ta(I388 +I563 +I394 +I568 +ta(I394 +I568 +I400 +I573 +ta(I400 +I573 +I416 +I576 +ta(I416 +I576 +I434 +I579 +ta(I434 +I579 +I452 +I580 +ta(I452 +I580 +I474 +I580 +ta(I474 +I580 +I494 +I579 +ta(I494 +I579 +I516 +I577 +ta(I516 +I577 +I538 +I574 +ta(I538 +I574 +I560 +I570 +ta(I560 +I570 +I578 +I565 +ta(I578 +I565 +I594 +I560 +ta(I594 +I560 +I598 +I554 +ta(I598 +I554 +I601 +I548 +ta(I601 +I548 +I602 +I542 +ta(I602 +I542 +I602 +I536 +ta(I602 +I536 +I600 +I530 +ta(I600 +I530 +I596 +I524 +ta(I596 +I524 +I590 +I519 +ta(I590 +I519 +I576 +I513 +ta(I576 +I513 +I562 +I508 +ta(I562 +I508 +I544 +I504 +ta(I544 +I504 +I530 +I501 +ta(I530 +I501 +I524 +I498 +ta(I524 +I498 +I510 +I495 +ta(I510 +I495 +I505 +I494 +ta(I505 +I494 +I501 +I494 +ta(I501 +I494 +I498 +I494 +ta(I498 +I494 +I495 +I495 +ta(I495 +I495 +I493 +I498 +ta(I493 +I498 +I492 +I502 +ta(I492 +I502 +I492 +I508 +ta(I492 +I508 +I492 +I513 +ta(I492 +I513 +I492 +I529 +ta(I492 +I529 +I494 +I534 +ta(I494 +I534 +I497 +I548 +ta(I497 +I548 +I500 +I554 +ta(I500 +I554 +I504 +I568 +ta(I504 +I568 +I508 +I571 +ta(I508 +I571 +I514 +I576 +ta(I514 +I576 +I520 +I579 +ta(I520 +I579 +I538 +I582 +ta(I538 +I582 +I552 +I584 +ta(I552 +I584 +I568 +I585 +ta(I568 +I585 +I588 +I585 +ta(I588 +I585 +I608 +I585 +ta(I608 +I585 +I624 +I583 +ta(I624 +I583 +I640 +I581 +ta(I640 +I581 +I654 +I577 +ta(I654 +I577 +I659 +I572 +ta(I659 +I572 +I661 +I568 +ta(I661 +I568 +I663 +I554 +ta(I663 +I554 +I664 +I548 +ta(I664 +I548 +I664 +I543 +ta(I664 +I543 +I661 +I529 +ta(I661 +I529 +I658 +I524 +ta(I658 +I524 +I654 +I518 +ta(I654 +I518 +I649 +I512 +ta(I649 +I512 +I644 +I507 +ta(I644 +I507 +I630 +I503 +ta(I630 +I503 +I624 +I498 +ta(I624 +I498 +I608 +I494 +ta(I608 +I494 +I594 +I490 +ta(I594 +I490 +I578 +I487 +ta(I578 +I487 +I562 +I485 +ta(I562 +I485 +I556 +I485 +ta(I556 +I485 +I552 +I485 +ta(I552 +I485 +I548 +I487 +ta(I548 +I487 +I546 +I489 +ta(I546 +I489 +I545 +I494 +ta(I545 +I494 +I544 +I498 +ta(I544 +I498 +I545 +I512 +ta(I545 +I512 +I547 +I517 +ta(I547 +I517 +I550 +I523 +ta(I550 +I523 +I554 +I537 +ta(I554 +I537 +I559 +I542 +ta(I559 +I542 +I565 +I548 +ta(I565 +I548 +I581 +I554 +ta(I581 +I554 +I586 +I558 +ta(I586 +I558 +I604 +I562 +ta(I604 +I562 +I624 +I565 +ta(I624 +I565 +I642 +I567 +ta(I642 +I567 +I658 +I568 +ta(I658 +I568 +I678 +I568 +ta(I678 +I568 +I694 +I567 +ta(I694 +I567 +I710 +I564 +ta(I710 +I564 +I715 +I561 +ta(I715 +I561 +I719 +I556 +ta(I719 +I556 +I721 +I551 +ta(I721 +I551 +I721 +I547 +ta(I721 +I547 +I721 +I533 +ta(I721 +I533 +I718 +I528 +ta(I718 +I528 +I713 +I514 +ta(I713 +I514 +I697 +I508 +ta(I697 +I508 +I683 +I502 +ta(I683 +I502 +I667 +I498 +ta(I667 +I498 +I653 +I495 +ta(I653 +I495 +I637 +I490 +ta(I637 +I490 +I631 +I487 +ta(I631 +I487 +I615 +I484 +ta(I615 +I484 +I610 +I482 +ta(I610 +I482 +I605 +I482 +ta(I605 +I482 +I601 +I482 +ta(I601 +I482 +I598 +I483 +ta(I598 +I483 +I596 +I486 +ta(I596 +I486 +I596 +I491 +ta(I596 +I491 +I596 +I496 +ta(I596 +I496 +I597 +I502 +ta(I597 +I502 +I600 +I508 +ta(I600 +I508 +I604 +I514 +ta(I604 +I514 +I610 +I528 +ta(I610 +I528 +I614 +I532 +ta(I614 +I532 +I620 +I536 +ta(I620 +I536 +I634 +I540 +ta(I634 +I540 +I640 +I542 +ta(I640 +I542 +I646 +I543 +ta(I646 +I543 +I651 +I543 +ta(I651 +I543 +I656 +I542 +ta(I656 +I542 +I661 +I540 +ta(I661 +I540 +I666 +I537 +ta(I666 +I537 +I672 +I533 +ta(I672 +I533 +I676 +I529 +ta(I676 +I529 +I680 +I515 +ta(I680 +I515 +I683 +I509 +ta(I683 +I509 +I684 +I504 +ta(I684 +I504 +I685 +I490 +ta(I685 +I490 +I685 +I476 +ta(I685 +I476 +I682 +I470 +ta(I682 +I470 +I679 +I464 +ta(I679 +I464 +I673 +I459 +ta(I673 +I459 +I668 +I454 +ta(I668 +I454 +I652 +I448 +ta(I652 +I448 +I638 +I442 +ta(I638 +I442 +I622 +I438 +ta(I622 +I438 +I608 +I433 +ta(I608 +I433 +I603 +I429 +ta(I603 +I429 +I597 +I425 +ta(I597 +I425 +I593 +I422 +ta(I593 +I422 +I588 +I419 +ta(I588 +I419 +I583 +I418 +ta(I583 +I418 +I578 +I417 +ta(I578 +I417 +I574 +I417 +ta(I574 +I417 +I571 +I418 +ta(I571 +I418 +I568 +I422 +ta(I568 +I422 +I566 +I428 +ta(I566 +I428 +I565 +I434 +ta(I565 +I434 +I565 +I450 +ta(I565 +I450 +I564 +I464 +ta(I564 +I464 +I564 +I480 +ta(I564 +I480 +I566 +I498 +ta(I566 +I498 +I568 +I512 +ta(I568 +I512 +I570 +I516 +ta(I570 +I516 +I573 +I520 +ta(I573 +I520 +I577 +I523 +ta(I577 +I523 +I583 +I526 +ta(I583 +I526 +I588 +I526 +ta(I588 +I526 +I602 +I527 +ta(I602 +I527 +I616 +I526 +ta(I616 +I526 +I632 +I523 +ta(I632 +I523 +I637 +I520 +ta(I637 +I520 +I653 +I515 +ta(I653 +I515 +I658 +I501 +ta(I658 +I501 +I661 +I495 +ta(I661 +I495 +I664 +I481 +ta(I664 +I481 +I665 +I467 +ta(I665 +I467 +I665 +I453 +ta(I665 +I453 +I665 +I439 +ta(I665 +I439 +I662 +I433 +ta(I662 +I433 +I659 +I427 +ta(I659 +I427 +I654 +I423 +ta(I654 +I423 +I649 +I419 +ta(I649 +I419 +I633 +I415 +ta(I633 +I415 +I627 +I412 +ta(I627 +I412 +I613 +I410 +ta(I613 +I410 +I607 +I408 +ta(I607 +I408 +I589 +I406 +ta(I589 +I406 +I573 +I405 +ta(I573 +I405 +I557 +I405 +ta(I557 +I405 +I541 +I405 +ta(I541 +I405 +I527 +I407 +ta(I527 +I407 +I521 +I410 +ta(I521 +I410 +I517 +I415 +ta(I517 +I415 +I513 +I421 +ta(I513 +I421 +I510 +I427 +ta(I510 +I427 +I508 +I447 +ta(I508 +I447 +I508 +I463 +ta(I508 +I463 +I508 +I479 +ta(I508 +I479 +I509 +I493 +ta(I509 +I493 +I511 +I507 +ta(I511 +I507 +I514 +I521 +ta(I514 +I521 +I518 +I526 +ta(I518 +I526 +I524 +I530 +ta(I524 +I530 +I530 +I533 +ta(I530 +I533 +I536 +I535 +ta(I536 +I535 +I552 +I536 +ta(I552 +I536 +I566 +I536 +ta(I566 +I536 +I572 +I532 +ta(I572 +I532 +I577 +I528 +ta(I577 +I528 +I582 +I523 +ta(I582 +I523 +I585 +I509 +ta(I585 +I509 +I588 +I503 +ta(I588 +I503 +I590 +I487 +ta(I590 +I487 +I591 +I473 +ta(I591 +I473 +I591 +I459 +ta(I591 +I459 +I591 +I445 +ta(I591 +I445 +I588 +I429 +ta(I588 +I429 +I584 +I415 +ta(I584 +I415 +I580 +I410 +ta(I580 +I410 +I566 +I405 +ta(I566 +I405 +I552 +I401 +ta(I552 +I401 +I546 +I398 +ta(I546 +I398 +I532 +I395 +ta(I532 +I395 +I518 +I393 +ta(I518 +I393 +I504 +I391 +ta(I504 +I391 +I490 +I389 +ta(I490 +I389 +I476 +I388 +ta(I476 +I388 +I470 +I387 +ta(I470 +I387 +I465 +I387 +ta(I465 +I387 +I461 +I387 +ta(I461 +I387 +I458 +I388 +ta(I458 +I388 +I456 +I392 +ta(I456 +I392 +I456 +I396 +ta(I456 +I396 +I456 +I401 +ta(I456 +I401 +I456 +I407 +ta(I456 +I407 +I458 +I413 +ta(I458 +I413 +I460 +I419 +ta(I460 +I419 +I464 +I425 +ta(I464 +I425 +I467 +I439 +ta(I467 +I439 +I471 +I443 +ta(I471 +I443 +I475 +I448 +ta(I475 +I448 +I479 +I452 +ta(I479 +I452 +I493 +I456 +ta(I493 +I456 +I498 +I458 +ta(I498 +I458 +I503 +I459 +ta(I503 +I459 +I509 +I459 +ta(I509 +I459 +I523 +I458 +ta(I523 +I458 +I539 +I455 +ta(I539 +I455 +I553 +I451 +ta(I553 +I451 +I558 +I446 +ta(I558 +I446 +I564 +I441 +ta(I564 +I441 +I570 +I423 +ta(I570 +I423 +I573 +I407 +ta(I573 +I407 +I576 +I391 +ta(I576 +I391 +I579 +I377 +ta(I579 +I377 +I581 +I359 +ta(I581 +I359 +I581 +I345 +ta(I581 +I345 +I581 +I331 +ta(I581 +I331 +I580 +I326 +ta(I580 +I326 +I579 +I321 +ta(I579 +I321 +I576 +I316 +ta(I576 +I316 +I573 +I311 +ta(I573 +I311 +I569 +I307 +ta(I569 +I307 +I565 +I304 +ta(I565 +I304 +I561 +I302 +ta(I561 +I302 +I557 +I301 +ta(I557 +I301 +I555 +I301 +ta(I555 +I301 +I553 +I301 +ta(I553 +I301 +I552 +I303 +ta(I552 +I303 +I551 +I306 +ta(I551 +I306 +I549 +I312 +ta(I549 +I312 +I547 +I315 +ta(I547 +I315 +I545 +I321 +ta(I545 +I321 +I544 +I325 +ta(I544 +I325 +I542 +I331 +ta(I542 +I331 +I541 +I337 +ta(I541 +I337 +I539 +I353 +ta(I539 +I353 +I539 +I369 +ta(I539 +I369 +I539 +I374 +ta(I539 +I374 +I541 +I392 +ta(I541 +I392 +I544 +I406 +ta(I544 +I406 +I547 +I410 +ta(I547 +I410 +I553 +I415 +ta(I553 +I415 +I567 +I419 +ta(I567 +I419 +I581 +I421 +ta(I581 +I421 +I595 +I422 +ta(I595 +I422 +I611 +I422 +ta(I611 +I422 +I625 +I422 +ta(I625 +I422 +I639 +I420 +ta(I639 +I420 +I645 +I416 +ta(I645 +I416 +I663 +I411 +ta(I663 +I411 +I668 +I397 +ta(I668 +I397 +I671 +I383 +ta(I671 +I383 +I674 +I377 +ta(I674 +I377 +I675 +I361 +ta(I675 +I361 +I675 +I347 +ta(I675 +I347 +I674 +I331 +ta(I674 +I331 +I671 +I317 +ta(I671 +I317 +I666 +I303 +ta(I666 +I303 +I661 +I298 +ta(I661 +I298 +I647 +I293 +ta(I647 +I293 +I641 +I289 +ta(I641 +I289 +I635 +I286 +ta(I635 +I286 +I621 +I283 +ta(I621 +I283 +I605 +I281 +ta(I605 +I281 +I587 +I280 +ta(I587 +I280 +I569 +I279 +ta(I569 +I279 +I551 +I279 +ta(I551 +I279 +I535 +I281 +ta(I535 +I281 +I521 +I283 +ta(I521 +I283 +I517 +I285 +ta(I517 +I285 +I513 +I288 +ta(I513 +I288 +I510 +I292 +ta(I510 +I292 +I508 +I297 +ta(I508 +I297 +I506 +I311 +ta(I506 +I311 +I506 +I317 +ta(I506 +I317 +I506 +I333 +ta(I506 +I333 +I506 +I347 +ta(I506 +I347 +I509 +I363 +ta(I509 +I363 +I512 +I377 +ta(I512 +I377 +I516 +I383 +ta(I516 +I383 +I520 +I388 +ta(I520 +I388 +I526 +I393 +ta(I526 +I393 +I532 +I396 +ta(I532 +I396 +I535 +I397 +ta(I535 +I397 +I549 +I398 +ta(I549 +I398 +I554 +I398 +ta(I554 +I398 +I559 +I396 +ta(I559 +I396 +I563 +I392 +ta(I563 +I392 +I567 +I386 +ta(I567 +I386 +I569 +I381 +ta(I569 +I381 +I571 +I375 +ta(I571 +I375 +I571 +I359 +ta(I571 +I359 +I571 +I343 +ta(I571 +I343 +I568 +I329 +ta(I568 +I329 +I564 +I313 +ta(I564 +I313 +I560 +I307 +ta(I560 +I307 +I546 +I301 +ta(I546 +I301 +I540 +I297 +ta(I540 +I297 +I524 +I293 +ta(I524 +I293 +I508 +I290 +ta(I508 +I290 +I490 +I288 +ta(I490 +I288 +I474 +I286 +ta(I474 +I286 +I458 +I285 +ta(I458 +I285 +I442 +I285 +ta(I442 +I285 +I428 +I285 +ta(I428 +I285 +I414 +I286 +ta(I414 +I286 +I398 +I287 +ta(I398 +I287 +I384 +I289 +ta(I384 +I289 +I370 +I292 +ta(I370 +I292 +I364 +I296 +ta(I364 +I296 +I359 +I302 +ta(I359 +I302 +I355 +I308 +ta(I355 +I308 +I350 +I326 +ta(I350 +I326 +I347 +I340 +ta(I347 +I340 +I344 +I358 +ta(I344 +I358 +I342 +I376 +ta(I342 +I376 +I342 +I394 +ta(I342 +I394 +I342 +I410 +ta(I342 +I410 +I344 +I415 +ta(I344 +I415 +I346 +I420 +ta(I346 +I420 +I350 +I423 +ta(I350 +I423 +I354 +I426 +ta(I354 +I426 +I359 +I427 +ta(I359 +I427 +I364 +I427 +ta(I364 +I427 +I368 +I427 +ta(I368 +I427 +I374 +I424 +ta(I374 +I424 +I377 +I421 +ta(I377 +I421 +I382 +I416 +ta(I382 +I416 +I384 +I412 +ta(I384 +I412 +I387 +I398 +ta(I387 +I398 +I388 +I394 +ta(I388 +I394 +I390 +I380 +ta(I390 +I380 +I390 +I375 +ta(I390 +I375 +I389 +I369 +ta(I389 +I369 +I387 +I364 +ta(I387 +I364 +I384 +I358 +ta(I384 +I358 +I379 +I353 +ta(I379 +I353 +I365 +I348 +ta(I365 +I348 +I360 +I345 +ta(I360 +I345 +I346 +I342 +ta(I346 +I342 +I340 +I340 +ta(I340 +I340 +I335 +I338 +ta(I335 +I338 +I321 +I337 +ta(I321 +I337 +I315 +I336 +ta(I315 +I336 +I309 +I336 +ta(I309 +I336 +I305 +I336 +ta(I305 +I336 +I300 +I337 +ta(I300 +I337 +I297 +I339 +ta(I297 +I339 +I294 +I341 +ta(I294 +I341 +I291 +I345 +ta(I291 +I345 +I289 +I359 +ta(I289 +I359 +I288 +I364 +ta(I288 +I364 +I287 +I380 +ta(I287 +I380 +I287 +I394 +ta(I287 +I394 +I287 +I410 +ta(I287 +I410 +I287 +I424 +ta(I287 +I424 +I289 +I442 +ta(I289 +I442 +I291 +I447 +ta(I291 +I447 +I293 +I453 +ta(I293 +I453 +I298 +I457 +ta(I298 +I457 +I301 +I461 +ta(I301 +I461 +I307 +I464 +ta(I307 +I464 +I312 +I465 +ta(I312 +I465 +I317 +I465 +ta(I317 +I465 +I323 +I464 +ta(I323 +I464 +I328 +I461 +ta(I328 +I461 +I333 +I457 +ta(I333 +I457 +I337 +I452 +ta(I337 +I452 +I341 +I447 +ta(I341 +I447 +I343 +I431 +ta(I343 +I431 +I345 +I417 +ta(I345 +I417 +I345 +I411 +ta(I345 +I411 +I344 +I405 +ta(I344 +I405 +I342 +I400 +ta(I342 +I400 +I339 +I395 +ta(I339 +I395 +I334 +I390 +ta(I334 +I390 +I329 +I385 +ta(I329 +I385 +I323 +I382 +ta(I323 +I382 +I317 +I379 +ta(I317 +I379 +I312 +I377 +ta(I312 +I377 +I308 +I375 +ta(I308 +I375 +I303 +I374 +ta(I303 +I374 +I300 +I373 +ta(I300 +I373 +I298 +I372 +ta(I298 +I372 +I298 +I371 +ta(I298 +I371 +I298 +I369 +ta(I298 +I369 +I297 +I368 +ta(I297 +I368 +I297 +I367 +ta(I297 +I367 +I297 +I366 +ta(I297 +I366 +I297 +I365 +ta(I297 +I365 +I296 +I364 +ta(I296 +I364 +I294 +I362 +ta(I294 +I362 +I291 +I360 +ta(I291 +I360 +I287 +I358 +ta(I287 +I358 +I281 +I355 +ta(I281 +I355 +I275 +I353 +ta(I275 +I353 +I261 +I351 +ta(I261 +I351 +I245 +I349 +ta(I245 +I349 +I231 +I348 +ta(I231 +I348 +I225 +I347 +ta(I225 +I347 +I211 +I347 +ta(I211 +I347 +I205 +I349 +ta(I205 +I349 +I191 +I352 +ta(I191 +I352 +I177 +I356 +ta(I177 +I356 +I172 +I362 +ta(I172 +I362 +I156 +I368 +ta(I156 +I368 +I151 +I374 +ta(I151 +I374 +I148 +I380 +ta(I148 +I380 +I145 +I386 +ta(I145 +I386 +I145 +I392 +ta(I145 +I392 +I145 +I406 +ta(I145 +I406 +I148 +I412 +ta(I148 +I412 +I152 +I418 +ta(I152 +I418 +I156 +I423 +ta(I156 +I423 +I170 +I426 +ta(I170 +I426 +I188 +I429 +ta(I188 +I429 +I204 +I431 +ta(I204 +I431 +I220 +I431 +ta(I220 +I431 +I236 +I430 +ta(I236 +I430 +I242 +I427 +ta(I242 +I427 +I258 +I422 +ta(I258 +I422 +I262 +I408 +ta(I262 +I408 +I266 +I392 +ta(I266 +I392 +I268 +I376 +ta(I268 +I376 +I269 +I358 +ta(I269 +I358 +I269 +I340 +ta(I269 +I340 +I268 +I320 +ta(I268 +I320 +I265 +I302 +ta(I265 +I302 +I262 +I296 +ta(I262 +I296 +I257 +I280 +ta(I257 +I280 +I252 +I275 +ta(I252 +I275 +I247 +I270 +ta(I247 +I270 +I233 +I266 +ta(I233 +I266 +I228 +I263 +ta(I228 +I263 +I214 +I260 +ta(I214 +I260 +I208 +I259 +ta(I208 +I259 +I194 +I258 +ta(I194 +I258 +I180 +I258 +ta(I180 +I258 +I164 +I258 +ta(I164 +I258 +I148 +I261 +ta(I148 +I261 +I132 +I263 +ta(I132 +I263 +I116 +I266 +ta(I116 +I266 +I112 +I270 +ta(I112 +I270 +I107 +I275 +ta(I107 +I275 +I104 +I281 +ta(I104 +I281 +I102 +I286 +ta(I102 +I286 +I102 +I300 +ta(I102 +I300 +I102 +I306 +ta(I102 +I306 +I102 +I320 +ta(I102 +I320 +I103 +I338 +ta(I103 +I338 +I104 +I343 +ta(I104 +I343 +I107 +I349 +ta(I107 +I349 +I109 +I354 +ta(I109 +I354 +I112 +I356 +ta(I112 +I356 +I116 +I359 +ta(I116 +I359 +I120 +I360 +ta(I120 +I360 +I126 +I360 +ta(I126 +I360 +I129 +I358 +ta(I129 +I358 +I133 +I355 +ta(I133 +I355 +I137 +I351 +ta(I137 +I351 +I141 +I337 +ta(I141 +I337 +I144 +I323 +ta(I144 +I323 +I147 +I307 +ta(I147 +I307 +I149 +I293 +ta(I149 +I293 +I149 +I279 +ta(I149 +I279 +I149 +I265 +ta(I149 +I265 +I149 +I249 +ta(I149 +I249 +I146 +I235 +ta(I146 +I235 +I143 +I230 +ta(I143 +I230 +I140 +I226 +ta(I140 +I226 +I136 +I222 +ta(I136 +I222 +I132 +I219 +ta(I132 +I219 +I127 +I216 +ta(I127 +I216 +I121 +I214 +ta(I121 +I214 +I115 +I212 +ta(I115 +I212 +I101 +I211 +ta(I101 +I211 +I95 +I211 +ta(I95 +I211 +I89 +I211 +ta(I89 +I211 +I83 +I212 +ta(I83 +I212 +I78 +I215 +ta(I78 +I215 +I64 +I218 +ta(I64 +I218 +I61 +I224 +ta(I61 +I224 +I57 +I229 +ta(I57 +I229 +I54 +I235 +ta(I54 +I235 +I52 +I241 +ta(I52 +I241 +I50 +I259 +ta(I50 +I259 +I50 +I273 +ta(I50 +I273 +I49 +I289 +ta(I49 +I289 +I49 +I294 +ta(I49 +I294 +I49 +I308 +ta(I49 +I308 +I51 +I313 +ta(I51 +I313 +I53 +I317 +ta(I53 +I317 +I57 +I319 +ta(I57 +I319 +I63 +I320 +ta(I63 +I320 +I68 +I320 +ta(I68 +I320 +I86 +I319 +ta(I86 +I319 +I100 +I315 +ta(I100 +I315 +I105 +I310 +ta(I105 +I310 +I110 +I294 +ta(I110 +I294 +I113 +I288 +ta(I113 +I288 +I116 +I272 +ta(I116 +I272 +I119 +I254 +ta(I119 +I254 +I119 +I240 +ta(I119 +I240 +I120 +I224 +ta(I120 +I224 +I119 +I210 +ta(I119 +I210 +I116 +I194 +ta(I116 +I194 +I113 +I190 +ta(I113 +I190 +I110 +I186 +ta(I110 +I186 +I106 +I181 +ta(I106 +I181 +I103 +I178 +ta(I103 +I178 +I99 +I175 +ta(I99 +I175 +I95 +I172 +ta(I95 +I172 +I92 +I170 +ta(I92 +I170 +I88 +I169 +ta(I88 +I169 +I85 +I168 +ta(I85 +I168 +I81 +I167 +ta(I81 +I167 +I78 +I167 +ta(I78 +I167 +I74 +I167 +ta(I74 +I167 +I71 +I168 +ta(I71 +I168 +I68 +I170 +ta(I68 +I170 +I66 +I173 +ta(I66 +I173 +I64 +I177 +ta(I64 +I177 +I64 +I181 +ta(I64 +I181 +I64 +I187 +ta(I64 +I187 +I64 +I193 +ta(I64 +I193 +I65 +I199 +ta(I65 +I199 +I67 +I205 +ta(I67 +I205 +I71 +I211 +ta(I71 +I211 +I75 +I217 +ta(I75 +I217 +I81 +I222 +ta(I81 +I222 +I86 +I225 +ta(I86 +I225 +I92 +I229 +ta(I92 +I229 +I98 +I232 +ta(I98 +I232 +I112 +I235 +ta(I112 +I235 +I118 +I236 +ta(I118 +I236 +I123 +I236 +ta(I123 +I236 +I126 +I235 +ta(I126 +I235 +I126 +I234 +ta(I126 +I234 +I140 +I232 +ta(I140 +I232 +I140 +I214 +ta(I140 +I214 +I141 +I200 +ta(I141 +I200 +I142 +I194 +ta(I142 +I194 +I144 +I180 +ta(I144 +I180 +I146 +I166 +ta(I146 +I166 +I148 +I150 +ta(I148 +I150 +I148 +I136 +ta(I148 +I136 +I148 +I120 +ta(I148 +I120 +I148 +I104 +ta(I148 +I104 +I147 +I88 +ta(I147 +I88 +I145 +I72 +ta(I145 +I72 +I143 +I58 +ta(I143 +I58 +I140 +I52 +ta(I140 +I52 +I136 +I46 +ta(I136 +I46 +I131 +I41 +ta(I131 +I41 +I125 +I37 +ta(I125 +I37 +I121 +I35 +ta(I121 +I35 +I116 +I34 +ta(I116 +I34 +I112 +I33 +ta(I112 +I33 +I108 +I34 +ta(I108 +I34 +I105 +I36 +ta(I105 +I36 +I101 +I40 +ta(I101 +I40 +I98 +I45 +ta(I98 +I45 +I97 +I59 +ta(I97 +I59 +I95 +I65 +ta(I95 +I65 +I94 +I79 +ta(I94 +I79 +I93 +I93 +ta(I93 +I93 +I93 +I99 +ta(I93 +I99 +I93 +I113 +ta(I93 +I113 +I94 +I118 +ta(I94 +I118 +I96 +I122 +ta(I96 +I122 +I99 +I125 +ta(I99 +I125 +I102 +I129 +ta(I102 +I129 +I106 +I130 +ta(I106 +I130 +I110 +I131 +ta(I110 +I131 +I115 +I131 +ta(I115 +I131 +I119 +I131 +ta(I119 +I131 +I125 +I130 +ta(I125 +I130 +I129 +I127 +ta(I129 +I127 +I133 +I124 +ta(I133 +I124 +I136 +I120 +ta(I136 +I120 +I139 +I115 +ta(I139 +I115 +I141 +I110 +ta(I141 +I110 +I141 +I104 +ta(I141 +I104 +I141 +I90 +ta(I141 +I90 +I139 +I85 +ta(I139 +I85 +I136 +I79 +ta(I136 +I79 +I133 +I74 +ta(I133 +I74 +I128 +I69 +ta(I128 +I69 +I112 +I66 +ta(I112 +I66 +I98 +I63 +ta(I98 +I63 +I82 +I60 +ta(I82 +I60 +I66 +I59 +ta(I66 +I59 +I52 +I59 +ta(I52 +I59 +I46 +I59 +ta(I46 +I59 +I41 +I62 +ta(I41 +I62 +I35 +I65 +ta(I35 +I65 +I31 +I70 +ta(I31 +I70 +I26 +I75 +ta(I26 +I75 +I23 +I81 +ta(I23 +I81 +I20 +I97 +ta(I20 +I97 +I19 +I113 +ta(I19 +I113 +I19 +I127 +ta(I19 +I127 +I20 +I141 +ta(I20 +I141 +I23 +I146 +ta(I23 +I146 +I27 +I151 +ta(I27 +I151 +I33 +I156 +ta(I33 +I156 +I39 +I159 +ta(I39 +I159 +I44 +I161 +ta(I44 +I161 +I50 +I162 +ta(I50 +I162 +I56 +I162 +ta(I56 +I162 +I70 +I161 +ta(I70 +I161 +I74 +I159 +ta(I74 +I159 +I79 +I155 +ta(I79 +I155 +I82 +I150 +ta(I82 +I150 +I85 +I145 +ta(I85 +I145 +I86 +I131 +ta(I86 +I131 +I86 +I125 +ta(I86 +I125 +I86 +I109 +ta(I86 +I109 +I86 +I103 +ta(I86 +I103 +I83 +I89 +ta(I83 +I89 +I81 +I75 +ta(I81 +I75 +I77 +I69 +ta(I77 +I69 +I73 +I64 +ta(I73 +I64 +I69 +I50 +ta(I69 +I50 +I64 +I47 +ta(I64 +I47 +I60 +I43 +ta(I60 +I43 +I54 +I40 +ta(I54 +I40 +I49 +I38 +ta(I49 +I38 +I45 +I37 +ta(I45 +I37 +I41 +I37 +ta(I41 +I37 +I38 +I39 +ta(I38 +I39 +I35 +I42 +ta(I35 +I42 +I32 +I47 +ta(I32 +I47 +I30 +I53 +ta(I30 +I53 +I28 +I67 +ta(I28 +I67 +I27 +I81 +ta(I27 +I81 +I26 +I99 +ta(I26 +I99 +I26 +I113 +ta(I26 +I113 +I26 +I127 +ta(I26 +I127 +I27 +I133 +ta(I27 +I133 +I29 +I139 +ta(I29 +I139 +I32 +I145 +ta(I32 +I145 +I37 +I148 +ta(I37 +I148 +I42 +I151 +ta(I42 +I151 +I47 +I153 +ta(I47 +I153 +I53 +I153 +ta(I53 +I153 +I69 +I153 +ta(I69 +I153 +I75 +I150 +ta(I75 +I150 +I93 +I145 +ta(I93 +I145 +I98 +I140 +ta(I98 +I140 +I104 +I126 +ta(I104 +I126 +I109 +I112 +ta(I109 +I112 +I112 +I96 +ta(I112 +I96 +I115 +I80 +ta(I115 +I80 +I116 +I64 +ta(I116 +I64 +I116 +I48 +ta(I116 +I48 +I116 +I34 +ta(I116 +I34 +I114 +I28 +ta(I114 +I28 +I110 +I12 +ta(I110 +I12 +I105 +I8 +ta(I105 +I8 +I100 +I3 +ta(I100 +I3 +I94 +I0 +ta(I94 +I0 +I89 +I-2 +ta(I89 +I-2 +I85 +I-3 +ta(I85 +I-3 +I82 +I-3 +ta(I82 +I-3 +I80 +I0 +ta(I80 +I0 +I78 +I4 +ta(I78 +I4 +I78 +I10 +ta(I78 +I10 +I78 +I16 +ta(I78 +I16 +I80 +I36 +ta(I80 +I36 +I83 +I50 +ta(I83 +I50 +I87 +I66 +ta(I87 +I66 +I101 +I82 +ta(I101 +I82 +I117 +I96 +ta(I117 +I96 +I131 +I101 +ta(I131 +I101 +I153 +I105 +ta(I153 +I105 +I173 +I108 +ta(I173 +I108 +I193 +I110 +ta(I193 +I110 +I217 +I112 +ta(I217 +I112 +I237 +I112 +ta(I237 +I112 +I257 +I111 +ta(I257 +I111 +I277 +I108 +ta(I277 +I108 +I295 +I104 +ta(I295 +I104 +I309 +I99 +ta(I309 +I99 +I314 +I94 +ta(I314 +I94 +I317 +I88 +ta(I317 +I88 +I319 +I74 +ta(I319 +I74 +I320 +I68 +ta(I320 +I68 +I319 +I64 +ta(I319 +I64 +I316 +I59 +ta(I316 +I59 +I312 +I55 +ta(I312 +I55 +I296 +I50 +ta(I296 +I50 +I282 +I47 +ta(I282 +I47 +I268 +I44 +ta(I268 +I44 +I264 +I43 +ta(I264 +I43 +I259 +I42 +ta(I259 +I42 +I255 +I42 +ta(I255 +I42 +I253 +I42 +ta(I253 +I42 +I251 +I45 +ta(I251 +I45 +I250 +I48 +ta(I250 +I48 +I248 +I53 +ta(I248 +I53 +I246 +I59 +ta(I246 +I59 +I245 +I65 +ta(I245 +I65 +I245 +I79 +ta(I245 +I79 +I245 +I97 +ta(I245 +I97 +I245 +I102 +ta(I245 +I102 +I247 +I116 +ta(I247 +I116 +I249 +I130 +ta(I249 +I130 +I251 +I135 +ta(I251 +I135 +I254 +I141 +ta(I254 +I141 +I257 +I145 +ta(I257 +I145 +I261 +I148 +ta(I261 +I148 +I264 +I150 +ta(I264 +I150 +I268 +I152 +ta(I268 +I152 +I272 +I152 +ta(I272 +I152 +I275 +I151 +ta(I275 +I151 +I279 +I149 +ta(I279 +I149 +I284 +I144 +ta(I284 +I144 +I286 +I140 +ta(I286 +I140 +I289 +I126 +ta(I289 +I126 +I291 +I112 +ta(I291 +I112 +I292 +I106 +ta(I292 +I106 +I292 +I92 +ta(I292 +I92 +I291 +I78 +ta(I291 +I78 +I287 +I64 +ta(I287 +I64 +I283 +I58 +ta(I283 +I58 +I278 +I53 +ta(I278 +I53 +I273 +I48 +ta(I273 +I48 +I257 +I44 +ta(I257 +I44 +I251 +I41 +ta(I251 +I41 +I237 +I38 +ta(I237 +I38 +I223 +I36 +ta(I223 +I36 +I217 +I35 +ta(I217 +I35 +I212 +I35 +ta(I212 +I35 +I208 +I35 +ta(I208 +I35 +I204 +I37 +ta(I204 +I37 +I201 +I41 +ta(I201 +I41 +I199 +I45 +ta(I199 +I45 +I197 +I51 +ta(I197 +I51 +I196 +I57 +ta(I196 +I57 +I196 +I75 +ta(I196 +I75 +I196 +I91 +ta(I196 +I91 +I197 +I105 +ta(I197 +I105 +I201 +I123 +ta(I201 +I123 +I205 +I137 +ta(I205 +I137 +I211 +I153 +ta(I211 +I153 +I216 +I157 +ta(I216 +I157 +I222 +I162 +ta(I222 +I162 +I228 +I165 +ta(I228 +I165 +I234 +I166 +ta(I234 +I166 +I240 +I166 +ta(I240 +I166 +I245 +I165 +ta(I245 +I165 +I251 +I162 +ta(I251 +I162 +I256 +I157 +ta(I256 +I157 +I261 +I143 +ta(I261 +I143 +I263 +I137 +ta(I263 +I137 +I266 +I123 +ta(I266 +I123 +I268 +I107 +ta(I268 +I107 +I268 +I91 +ta(I268 +I91 +I267 +I75 +ta(I267 +I75 +I264 +I59 +ta(I264 +I59 +I261 +I53 +ta(I261 +I53 +I257 +I47 +ta(I257 +I47 +I251 +I41 +ta(I251 +I41 +I246 +I36 +ta(I246 +I36 +I232 +I32 +ta(I232 +I32 +I226 +I28 +ta(I226 +I28 +I220 +I25 +ta(I220 +I25 +I217 +I22 +ta(I217 +I22 +I213 +I20 +ta(I213 +I20 +I210 +I20 +ta(I210 +I20 +I208 +I20 +ta(I208 +I20 +I206 +I22 +ta(I206 +I22 +I204 +I26 +ta(I204 +I26 +I204 +I32 +ta(I204 +I32 +I204 +I48 +ta(I204 +I48 +I204 +I64 +ta(I204 +I64 +I207 +I82 +ta(I207 +I82 +I210 +I100 +ta(I210 +I100 +I214 +I118 +ta(I214 +I118 +I220 +I134 +ta(I220 +I134 +I224 +I140 +ta(I224 +I140 +I230 +I145 +ta(I230 +I145 +I250 +I159 +ta(I250 +I159 +I264 +I161 +ta(I264 +I161 +I282 +I165 +ta(I282 +I165 +I302 +I167 +ta(I302 +I167 +I324 +I168 +ta(I324 +I168 +I346 +I169 +ta(I346 +I169 +I368 +I169 +ta(I368 +I169 +I386 +I166 +ta(I386 +I166 +I404 +I163 +ta(I404 +I163 +I422 +I158 +ta(I422 +I158 +I436 +I153 +ta(I436 +I153 +I441 +I147 +ta(I441 +I147 +I445 +I131 +ta(I445 +I131 +I447 +I117 +ta(I447 +I117 +I447 +I101 +ta(I447 +I101 +I446 +I87 +ta(I446 +I87 +I443 +I73 +ta(I443 +I73 +I438 +I68 +ta(I438 +I68 +I424 +I62 +ta(I424 +I62 +I410 +I57 +ta(I410 +I57 +I396 +I52 +ta(I396 +I52 +I390 +I49 +ta(I390 +I49 +I384 +I47 +ta(I384 +I47 +I368 +I46 +ta(I368 +I46 +I362 +I46 +ta(I362 +I46 +I356 +I48 +ta(I356 +I48 +I352 +I50 +ta(I352 +I50 +I348 +I55 +ta(I348 +I55 +I344 +I61 +ta(I344 +I61 +I341 +I67 +ta(I341 +I67 +I339 +I83 +ta(I339 +I83 +I339 +I99 +ta(I339 +I99 +I339 +I105 +ta(I339 +I105 +I340 +I121 +ta(I340 +I121 +I342 +I135 +ta(I342 +I135 +I347 +I141 +ta(I347 +I141 +I352 +I147 +ta(I352 +I147 +I357 +I152 +ta(I357 +I152 +I363 +I155 +ta(I363 +I155 +I379 +I158 +ta(I379 +I158 +I393 +I160 +ta(I393 +I160 +I409 +I161 +ta(I409 +I161 +I425 +I161 +ta(I425 +I161 +I441 +I160 +ta(I441 +I160 +I455 +I156 +ta(I455 +I156 +I461 +I151 +ta(I461 +I151 +I466 +I146 +ta(I466 +I146 +I470 +I130 +ta(I470 +I130 +I474 +I124 +ta(I474 +I124 +I477 +I108 +ta(I477 +I108 +I478 +I102 +ta(I478 +I102 +I479 +I86 +ta(I479 +I86 +I479 +I72 +ta(I479 +I72 +I478 +I66 +ta(I478 +I66 +I475 +I61 +ta(I475 +I61 +I471 +I56 +ta(I471 +I56 +I457 +I51 +ta(I457 +I51 +I443 +I48 +ta(I443 +I48 +I427 +I44 +ta(I427 +I44 +I413 +I43 +ta(I413 +I43 +I407 +I42 +ta(I407 +I42 +I402 +I42 +ta(I402 +I42 +I397 +I43 +ta(I397 +I43 +I393 +I46 +ta(I393 +I46 +I390 +I51 +ta(I390 +I51 +I387 +I57 +ta(I387 +I57 +I385 +I62 +ta(I385 +I62 +I383 +I76 +ta(I383 +I76 +I381 +I92 +ta(I381 +I92 +I380 +I106 +ta(I380 +I106 +I379 +I122 +ta(I379 +I122 +I379 +I138 +ta(I379 +I138 +I380 +I144 +ta(I380 +I144 +I382 +I150 +ta(I382 +I150 +I386 +I156 +ta(I386 +I156 +I390 +I160 +ta(I390 +I160 +I396 +I163 +ta(I396 +I163 +I412 +I166 +ta(I412 +I166 +I426 +I166 +ta(I426 +I166 +I444 +I166 +ta(I444 +I166 +I462 +I165 +ta(I462 +I165 +I480 +I162 +ta(I480 +I162 +I496 +I159 +ta(I496 +I159 +I510 +I155 +ta(I510 +I155 +I516 +I149 +ta(I516 +I149 +I521 +I135 +ta(I521 +I135 +I523 +I129 +ta(I523 +I129 +I524 +I123 +ta(I524 +I123 +I524 +I109 +ta(I524 +I109 +I523 +I95 +ta(I523 +I95 +I520 +I79 +ta(I520 +I79 +I517 +I73 +ta(I517 +I73 +I513 +I67 +ta(I513 +I67 +I497 +I63 +ta(I497 +I63 +I483 +I58 +ta(I483 +I58 +I469 +I55 +ta(I469 +I55 +I453 +I52 +ta(I453 +I52 +I433 +I50 +ta(I433 +I50 +I415 +I49 +ta(I415 +I49 +I397 +I49 +ta(I397 +I49 +I381 +I49 +ta(I381 +I49 +I375 +I51 +ta(I375 +I51 +I371 +I55 +ta(I371 +I55 +I368 +I59 +ta(I368 +I59 +I368 +I65 +ta(I368 +I65 +I368 +I79 +ta(I368 +I79 +I368 +I85 +ta(I368 +I85 +I370 +I99 +ta(I370 +I99 +I374 +I117 +ta(I374 +I117 +I378 +I123 +ta(I378 +I123 +I383 +I137 +ta(I383 +I137 +I389 +I141 +ta(I389 +I141 +I395 +I146 +ta(I395 +I146 +I411 +I150 +ta(I411 +I150 +I431 +I153 +ta(I431 +I153 +I449 +I155 +ta(I449 +I155 +I467 +I156 +ta(I467 +I156 +I487 +I157 +ta(I487 +I157 +I507 +I157 +ta(I507 +I157 +I527 +I156 +ta(I527 +I156 +I541 +I154 +ta(I541 +I154 +I557 +I150 +ta(I557 +I150 +I561 +I145 +ta(I561 +I145 +I565 +I131 +ta(I565 +I131 +I569 +I125 +ta(I569 +I125 +I571 +I111 +ta(I571 +I111 +I573 +I105 +ta(I573 +I105 +I573 +I89 +ta(I573 +I89 +I572 +I83 +ta(I572 +I83 +I569 +I77 +ta(I569 +I77 +I564 +I72 +ta(I564 +I72 +I550 +I67 +ta(I550 +I67 +I536 +I62 +ta(I536 +I62 +I518 +I59 +ta(I518 +I59 +I502 +I57 +ta(I502 +I57 +I482 +I56 +ta(I482 +I56 +I462 +I55 +ta(I462 +I55 +I444 +I55 +ta(I444 +I55 +I428 +I57 +ta(I428 +I57 +I414 +I59 +ta(I414 +I59 +I409 +I63 +ta(I409 +I63 +I405 +I67 +ta(I405 +I67 +I402 +I73 +ta(I402 +I73 +I401 +I79 +ta(I401 +I79 +I401 +I85 +ta(I401 +I85 +I402 +I90 +ta(I402 +I90 +I404 +I96 +ta(I404 +I96 +I409 +I102 +ta(I409 +I102 +I414 +I107 +ta(I414 +I107 +I428 +I113 +ta(I428 +I113 +I444 +I116 +ta(I444 +I116 +I460 +I120 +ta(I460 +I120 +I476 +I122 +ta(I476 +I122 +I498 +I124 +ta(I498 +I124 +I518 +I124 +ta(I518 +I124 +I536 +I124 +ta(I536 +I124 +I554 +I122 +ta(I554 +I122 +I574 +I118 +ta(I574 +I118 +I590 +I114 +ta(I590 +I114 +I595 +I110 +ta(I595 +I110 +I601 +I104 +ta(I601 +I104 +I604 +I90 +ta(I604 +I90 +I606 +I84 +ta(I606 +I84 +I608 +I78 +ta(I608 +I78 +I608 +I72 +ta(I608 +I72 +I608 +I58 +ta(I608 +I58 +I605 +I52 +ta(I605 +I52 +I601 +I48 +ta(I601 +I48 +I596 +I43 +ta(I596 +I43 +I582 +I39 +ta(I582 +I39 +I568 +I36 +ta(I568 +I36 +I552 +I34 +ta(I552 +I34 +I534 +I32 +ta(I534 +I32 +I518 +I32 +ta(I518 +I32 +I500 +I31 +ta(I500 +I31 +I480 +I31 +ta(I480 +I31 +I462 +I31 +ta(I462 +I31 +I444 +I32 +ta(I444 +I32 +I430 +I35 +ta(I430 +I35 +I426 +I37 +ta(I426 +I37 +I423 +I40 +ta(I423 +I40 +I421 +I44 +ta(I421 +I44 +I420 +I58 +ta(I420 +I58 +I420 +I63 +ta(I420 +I63 +I421 +I69 +ta(I421 +I69 +I424 +I75 +ta(I424 +I75 +I428 +I93 +ta(I428 +I93 +I431 +I98 +ta(I431 +I98 +I437 +I104 +ta(I437 +I104 +I443 +I120 +ta(I443 +I120 +I449 +I124 +ta(I449 +I124 +I465 +I130 +ta(I465 +I130 +I481 +I133 +ta(I481 +I133 +I497 +I137 +ta(I497 +I137 +I515 +I139 +ta(I515 +I139 +I533 +I140 +ta(I533 +I140 +I555 +I140 +ta(I555 +I140 +I575 +I139 +ta(I575 +I139 +I593 +I137 +ta(I593 +I137 +I611 +I133 +ta(I611 +I133 +I627 +I129 +ta(I627 +I129 +I633 +I124 +ta(I633 +I124 +I638 +I110 +ta(I638 +I110 +I641 +I105 +ta(I641 +I105 +I644 +I89 +ta(I644 +I89 +I646 +I75 +ta(I646 +I75 +I646 +I69 +ta(I646 +I69 +I646 +I64 +ta(I646 +I64 +I643 +I50 +ta(I643 +I50 +I639 +I45 +ta(I639 +I45 +I625 +I41 +ta(I625 +I41 +I611 +I37 +ta(I611 +I37 +I593 +I33 +ta(I593 +I33 +I575 +I31 +ta(I575 +I31 +I557 +I30 +ta(I557 +I30 +I539 +I30 +ta(I539 +I30 +I525 +I30 +ta(I525 +I30 +I519 +I32 +ta(I519 +I32 +I514 +I36 +ta(I514 +I36 +I510 +I40 +ta(I510 +I40 +I507 +I54 +ta(I507 +I54 +I506 +I68 +ta(I506 +I68 +I507 +I73 +ta(I507 +I73 +I509 +I79 +ta(I509 +I79 +I513 +I93 +ta(I513 +I93 +I518 +I98 +ta(I518 +I98 +I523 +I103 +ta(I523 +I103 +I539 +I108 +ta(I539 +I108 +I555 +I111 +ta(I555 +I111 +I569 +I116 +ta(I569 +I116 +I589 +I120 +ta(I589 +I120 +I607 +I123 +ta(I607 +I123 +I625 +I126 +ta(I625 +I126 +I643 +I127 +ta(I643 +I127 +I663 +I128 +ta(I663 +I128 +I683 +I128 +ta(I683 +I128 +I701 +I126 +ta(I701 +I126 +I717 +I123 +ta(I717 +I123 +I723 +I119 +ta(I723 +I119 +I728 +I115 +ta(I728 +I115 +I730 +I111 +ta(I730 +I111 +I732 +I106 +ta(I732 +I106 +I732 +I92 +ta(I732 +I92 +I732 +I88 +ta(I732 +I88 +I728 +I74 +ta(I728 +I74 +I725 +I69 +ta(I725 +I69 +I719 +I64 +ta(I719 +I64 +I705 +I60 +ta(I705 +I60 +I689 +I55 +ta(I689 +I55 +I675 +I52 +ta(I675 +I52 +I659 +I50 +ta(I659 +I50 +I643 +I49 +ta(I643 +I49 +I629 +I49 +ta(I629 +I49 +I613 +I49 +ta(I613 +I49 +I595 +I52 +ta(I595 +I52 +I579 +I56 +ta(I579 +I56 +I573 +I62 +ta(I573 +I62 +I568 +I67 +ta(I568 +I67 +I564 +I83 +ta(I564 +I83 +I562 +I97 +ta(I562 +I97 +I560 +I113 +ta(I560 +I113 +I560 +I127 +ta(I560 +I127 +I560 +I141 +ta(I560 +I141 +I562 +I155 +ta(I562 +I155 +I565 +I169 +ta(I565 +I169 +I568 +I185 +ta(I568 +I185 +I573 +I199 +ta(I573 +I199 +I578 +I213 +ta(I578 +I213 +I584 +I218 +ta(I584 +I218 +I598 +I222 +ta(I598 +I222 +I614 +I225 +ta(I614 +I225 +I632 +I229 +ta(I632 +I229 +I648 +I231 +ta(I648 +I231 +I662 +I231 +ta(I662 +I231 +I676 +I230 +ta(I676 +I230 +I681 +I228 +ta(I681 +I228 +I684 +I225 +ta(I684 +I225 +I688 +I220 +ta(I688 +I220 +I689 +I215 +ta(I689 +I215 +I690 +I199 +ta(I690 +I199 +I690 +I185 +ta(I690 +I185 +I688 +I171 +ta(I688 +I171 +I685 +I155 +ta(I685 +I155 +I679 +I141 +ta(I679 +I141 +I674 +I135 +ta(I674 +I135 +I658 +I129 +ta(I658 +I129 +I644 +I125 +ta(I644 +I125 +I630 +I121 +ta(I630 +I121 +I616 +I119 +ta(I616 +I119 +I600 +I117 +ta(I600 +I117 +I584 +I116 +ta(I584 +I116 +I578 +I116 +ta(I578 +I116 +I564 +I119 +ta(I564 +I119 +I550 +I123 +ta(I550 +I123 +I545 +I128 +ta(I545 +I128 +I541 +I133 +ta(I541 +I133 +I537 +I147 +ta(I537 +I147 +I533 +I163 +ta(I533 +I163 +I531 +I179 +ta(I531 +I179 +I530 +I197 +ta(I530 +I197 +I530 +I213 +ta(I530 +I213 +I532 +I227 +ta(I532 +I227 +I536 +I241 +ta(I536 +I241 +I542 +I255 +ta(I542 +I255 +I547 +I259 +ta(I547 +I259 +I553 +I262 +ta(I553 +I262 +I567 +I264 +ta(I567 +I264 +I573 +I265 +ta(I573 +I265 +I589 +I266 +ta(I589 +I266 +I593 +I266 +ta(I593 +I266 +I607 +I264 +ta(I607 +I264 +I612 +I260 +ta(I612 +I260 +I615 +I256 +ta(I615 +I256 +I619 +I242 +ta(I619 +I242 +I622 +I237 +ta(I622 +I237 +I623 +I231 +ta(I623 +I231 +I622 +I215 +ta(I622 +I215 +I620 +I201 +ta(I620 +I201 +I615 +I185 +ta(I615 +I185 +I599 +I169 +ta(I599 +I169 +I585 +I163 +ta(I585 +I163 +I569 +I157 +ta(I569 +I157 +I547 +I152 +ta(I547 +I152 +I531 +I149 +ta(I531 +I149 +I513 +I146 +ta(I513 +I146 +I499 +I146 +ta(I499 +I146 +I485 +I146 +ta(I485 +I146 +I471 +I149 +ta(I471 +I149 +I465 +I152 +ta(I465 +I152 +I451 +I158 +ta(I451 +I158 +I445 +I163 +ta(I445 +I163 +I442 +I168 +ta(I442 +I168 +I437 +I182 +ta(I437 +I182 +I434 +I188 +ta(I434 +I188 +I432 +I202 +ta(I432 +I202 +I431 +I220 +ta(I431 +I220 +I431 +I234 +ta(I431 +I234 +I432 +I239 +ta(I432 +I239 +I435 +I245 +ta(I435 +I245 +I439 +I251 +ta(I439 +I251 +I443 +I254 +ta(I443 +I254 +I449 +I258 +ta(I449 +I258 +I463 +I261 +ta(I463 +I261 +I469 +I262 +ta(I469 +I262 +I475 +I262 +ta(I475 +I262 +I493 +I261 +ta(I493 +I261 +I511 +I259 +ta(I511 +I259 +I525 +I255 +ta(I525 +I255 +I539 +I250 +ta(I539 +I250 +I542 +I244 +ta(I542 +I244 +I545 +I238 +ta(I545 +I238 +I546 +I224 +ta(I546 +I224 +I545 +I208 +ta(I545 +I208 +I542 +I190 +ta(I542 +I190 +I538 +I174 +ta(I538 +I174 +I522 +I158 +ta(I522 +I158 +I504 +I144 +ta(I504 +I144 +I486 +I130 +ta(I486 +I130 +I466 +I126 +ta(I466 +I126 +I448 +I122 +ta(I448 +I122 +I430 +I119 +ta(I430 +I119 +I410 +I117 +ta(I410 +I117 +I394 +I116 +ta(I394 +I116 +I376 +I116 +ta(I376 +I116 +I358 +I117 +ta(I358 +I117 +I340 +I120 +ta(I340 +I120 +I326 +I123 +ta(I326 +I123 +I321 +I129 +ta(I321 +I129 +I316 +I135 +ta(I316 +I135 +I313 +I141 +ta(I313 +I141 +I312 +I157 +ta(I312 +I157 +I312 +I171 +ta(I312 +I171 +I312 +I185 +ta(I312 +I185 +I313 +I199 +ta(I313 +I199 +I315 +I213 +ta(I315 +I213 +I318 +I219 +ta(I318 +I219 +I323 +I225 +ta(I323 +I225 +I326 +I230 +ta(I326 +I230 +I332 +I233 +ta(I332 +I233 +I338 +I237 +ta(I338 +I237 +I343 +I239 +ta(I343 +I239 +I361 +I240 +ta(I361 +I240 +I375 +I241 +ta(I375 +I241 +I389 +I240 +ta(I389 +I240 +I395 +I237 +ta(I395 +I237 +I409 +I233 +ta(I409 +I233 +I412 +I230 +ta(I412 +I230 +I415 +I225 +ta(I415 +I225 +I416 +I220 +ta(I416 +I220 +I416 +I215 +ta(I416 +I215 +I415 +I210 +ta(I415 +I210 +I411 +I196 +ta(I411 +I196 +I405 +I192 +ta(I405 +I192 +I387 +I188 +ta(I387 +I188 +I371 +I184 +ta(I371 +I184 +I351 +I180 +ta(I351 +I180 +I333 +I178 +ta(I333 +I178 +I315 +I176 +ta(I315 +I176 +I299 +I175 +ta(I299 +I175 +I283 +I175 +ta(I283 +I175 +I269 +I176 +ta(I269 +I176 +I253 +I178 +ta(I253 +I178 +I239 +I181 +ta(I239 +I181 +I235 +I185 +ta(I235 +I185 +I231 +I199 +ta(I231 +I199 +I228 +I204 +ta(I228 +I204 +I226 +I210 +ta(I226 +I210 +I225 +I226 +ta(I225 +I226 +I226 +I231 +ta(I226 +I231 +I228 +I249 +ta(I228 +I249 +I232 +I255 +ta(I232 +I255 +I236 +I269 +ta(I236 +I269 +I241 +I274 +ta(I241 +I274 +I247 +I280 +ta(I247 +I280 +I261 +I283 +ta(I261 +I283 +I275 +I286 +ta(I275 +I286 +I291 +I288 +ta(I291 +I288 +I309 +I289 +ta(I309 +I289 +I325 +I289 +ta(I325 +I289 +I339 +I288 +ta(I339 +I288 +I357 +I285 +ta(I357 +I285 +I373 +I280 +ta(I373 +I280 +I377 +I276 +ta(I377 +I276 +I382 +I271 +ta(I382 +I271 +I384 +I257 +ta(I384 +I257 +I385 +I252 +ta(I385 +I252 +I384 +I248 +ta(I384 +I248 +I382 +I242 +ta(I382 +I242 +I378 +I237 +ta(I378 +I237 +I372 +I234 +ta(I372 +I234 +I356 +I230 +ta(I356 +I230 +I340 +I228 +ta(I340 +I228 +I322 +I226 +ta(I322 +I226 +I304 +I226 +ta(I304 +I226 +I288 +I226 +ta(I288 +I226 +I282 +I227 +ta(I282 +I227 +I276 +I230 +ta(I276 +I230 +I273 +I233 +ta(I273 +I233 +I270 +I237 +ta(I270 +I237 +I269 +I243 +ta(I269 +I243 +I269 +I249 +ta(I269 +I249 +I270 +I254 +ta(I270 +I254 +I274 +I259 +ta(I274 +I259 +I279 +I263 +ta(I279 +I263 +I285 +I266 +ta(I285 +I266 +I301 +I270 +ta(I301 +I270 +I317 +I272 +ta(I317 +I272 +I339 +I275 +ta(I339 +I275 +I361 +I277 +ta(I361 +I277 +I383 +I277 +ta(I383 +I277 +I409 +I277 +ta(I409 +I277 +I433 +I276 +ta(I433 +I276 +I457 +I273 +ta(I457 +I273 +I481 +I268 +ta(I481 +I268 +I501 +I263 +ta(I501 +I263 +I517 +I249 +ta(I517 +I249 +I531 +I235 +ta(I531 +I235 +I533 +I221 +ta(I533 +I221 +I535 +I207 +ta(I535 +I207 +I535 +I191 +ta(I535 +I191 +I533 +I177 +ta(I533 +I177 +I528 +I171 +ta(I528 +I171 +I523 +I167 +ta(I523 +I167 +I507 +I162 +ta(I507 +I162 +I493 +I159 +ta(I493 +I159 +I487 +I157 +ta(I487 +I157 +I481 +I156 +ta(I481 +I156 +I476 +I156 +ta(I476 +I156 +I472 +I157 +ta(I472 +I157 +I469 +I159 +ta(I469 +I159 +I466 +I162 +ta(I466 +I162 +I464 +I166 +ta(I464 +I166 +I463 +I172 +ta(I463 +I172 +I463 +I177 +ta(I463 +I177 +I463 +I183 +ta(I463 +I183 +I463 +I188 +ta(I463 +I188 +I464 +I194 +ta(I464 +I194 +I466 +I200 +ta(I466 +I200 +I469 +I206 +ta(I469 +I206 +I473 +I211 +ta(I473 +I211 +I477 +I216 +ta(I477 +I216 +I483 +I221 +ta(I483 +I221 +I489 +I224 +ta(I489 +I224 +I494 +I227 +ta(I494 +I227 +I510 +I230 +ta(I510 +I230 +I526 +I231 +ta(I526 +I231 +I544 +I231 +ta(I544 +I231 +I560 +I231 +ta(I560 +I231 +I578 +I229 +ta(I578 +I229 +I592 +I226 +ta(I592 +I226 +I606 +I222 +ta(I606 +I222 +I611 +I218 +ta(I611 +I218 +I615 +I213 +ta(I615 +I213 +I617 +I208 +ta(I617 +I208 +I620 +I202 +ta(I620 +I202 +I621 +I196 +ta(I621 +I196 +I621 +I191 +ta(I621 +I191 +I620 +I186 +ta(I620 +I186 +I617 +I181 +ta(I617 +I181 +I613 +I176 +ta(I613 +I176 +I609 +I172 +ta(I609 +I172 +I605 +I169 +ta(I605 +I169 +I587 +I165 +ta(I587 +I165 +I571 +I162 +ta(I571 +I162 +I553 +I160 +ta(I553 +I160 +I535 +I159 +ta(I535 +I159 +I519 +I159 +ta(I519 +I159 +I503 +I161 +ta(I503 +I161 +I498 +I164 +ta(I498 +I164 +I494 +I168 +ta(I494 +I168 +I491 +I174 +ta(I491 +I174 +I489 +I179 +ta(I489 +I179 +I489 +I184 +ta(I489 +I184 +I489 +I190 +ta(I489 +I190 +I491 +I206 +ta(I491 +I206 +I494 +I210 +ta(I494 +I210 +I500 +I216 +ta(I500 +I216 +I505 +I221 +ta(I505 +I221 +I511 +I225 +ta(I511 +I225 +I529 +I231 +ta(I529 +I231 +I545 +I234 +ta(I545 +I234 +I563 +I238 +ta(I563 +I238 +I581 +I242 +ta(I581 +I242 +I599 +I244 +ta(I599 +I244 +I615 +I246 +ta(I615 +I246 +I631 +I247 +ta(I631 +I247 +I645 +I247 +ta(I645 +I247 +I659 +I247 +ta(I659 +I247 +I664 +I246 +ta(I664 +I246 +I669 +I243 +ta(I669 +I243 +I672 +I240 +ta(I672 +I240 +I674 +I237 +ta(I674 +I237 +I676 +I234 +ta(I676 +I234 +I677 +I229 +ta(I677 +I229 +I677 +I225 +ta(I677 +I225 +I675 +I220 +ta(I675 +I220 +I672 +I216 +ta(I672 +I216 +I667 +I211 +ta(I667 +I211 +I663 +I207 +ta(I663 +I207 +I658 +I205 +ta(I658 +I205 +I654 +I202 +ta(I654 +I202 +I649 +I200 +ta(I649 +I200 +I644 +I199 +ta(I644 +I199 +I640 +I198 +ta(I640 +I198 +I635 +I198 +ta(I635 +I198 +I630 +I200 +ta(I630 +I200 +I626 +I202 +ta(I626 +I202 +I623 +I205 +ta(I623 +I205 +I619 +I219 +ta(I619 +I219 +I617 +I224 +ta(I617 +I224 +I615 +I238 +ta(I615 +I238 +I614 +I254 +ta(I614 +I254 +I614 +I259 +ta(I614 +I259 +I614 +I261 +ta(I614 +I261 +I614 +I262 +ta(I614 +I262 +I617 +I280 +ta(I617 +I280 +I617 +I281 +ta(I617 +I281 +I616 +I282 +ta(I616 +I282 +I617 +I282 +ta(I617 +I282 +I641 +I286 +ta(I641 +I286 +I655 +I288 +ta(I655 +I288 +I669 +I288 +ta(I669 +I288 +I673 +I288 +ta(I673 +I288 +I677 +I286 +ta(I677 +I286 +I678 +I283 +ta(I678 +I283 +I678 +I279 +ta(I678 +I279 +I678 +I275 +ta(I678 +I275 +I677 +I271 +ta(I677 +I271 +I675 +I268 +ta(I675 +I268 +I670 +I254 +ta(I670 +I254 +I669 +I254 +ta(I669 +I254 +I664 +I250 +ta(I664 +I250 +I659 +I248 +ta(I659 +I248 +I645 +I245 +ta(I645 +I245 +I631 +I241 +ta(I631 +I241 +I617 +I239 +ta(I617 +I239 +I611 +I238 +ta(I611 +I238 +I608 +I238 +ta(I608 +I238 +I604 +I239 +ta(I604 +I239 +I601 +I242 +ta(I601 +I242 +I600 +I245 +ta(I600 +I245 +I600 +I247 +ta(I600 +I247 +I600 +I251 +ta(I600 +I251 +I600 +I256 +ta(I600 +I256 +I600 +I259 +ta(I600 +I259 +I600 +I263 +ta(I600 +I263 +I600 +I266 +ta(I600 +I266 +I600 +I270 +ta(I600 +I270 +I600 +I273 +ta(I600 +I273 +I600 +I277 +ta(I600 +I277 +I600 +I280 +ta(I600 +I280 +I601 +I283 +ta(I601 +I283 +I603 +I286 +ta(I603 +I286 +I606 +I289 +ta(I606 +I289 +I610 +I291 +ta(I610 +I291 +I615 +I292 +ta(I615 +I292 +I621 +I293 +ta(I621 +I293 +I625 +I293 +ta(I625 +I293 +I630 +I292 +ta(I630 +I292 +I634 +I289 +ta(I634 +I289 +I637 +I286 +ta(I637 +I286 +I640 +I282 +ta(I640 +I282 +I641 +I277 +ta(I641 +I277 +I641 +I271 +ta(I641 +I271 +I640 +I267 +ta(I640 +I267 +I637 +I261 +ta(I637 +I261 +I633 +I256 +ta(I633 +I256 +I619 +I250 +ta(I619 +I250 +I603 +I246 +ta(I603 +I246 +I579 +I240 +ta(I579 +I240 +I551 +I236 +ta(I551 +I236 +I519 +I233 +ta(I519 +I233 +I487 +I230 +ta(I487 +I230 +I457 +I230 +ta(I457 +I230 +I429 +I230 +ta(I429 +I230 +I401 +I233 +ta(I401 +I233 +I377 +I236 +ta(I377 +I236 +I353 +I241 +ta(I353 +I241 +I331 +I247 +ta(I331 +I247 +I311 +I263 +ta(I311 +I263 +I297 +I268 +ta(I297 +I268 +I292 +I288 +ta(I292 +I288 +I290 +I306 +ta(I290 +I306 +I289 +I324 +ta(I289 +I324 +I291 +I342 +ta(I291 +I342 +I296 +I362 +ta(I296 +I362 +I301 +I376 +ta(I301 +I376 +I319 +I392 +ta(I319 +I392 +I337 +I397 +ta(I337 +I397 +I355 +I401 +ta(I355 +I401 +I373 +I405 +ta(I373 +I405 +I391 +I408 +ta(I391 +I408 +I409 +I408 +ta(I409 +I408 +I423 +I409 +ta(I423 +I409 +I427 +I407 +ta(I427 +I407 +I430 +I404 +ta(I430 +I404 +I432 +I400 +ta(I432 +I400 +I433 +I395 +ta(I433 +I395 +I432 +I381 +ta(I432 +I381 +I430 +I375 +ta(I430 +I375 +I426 +I369 +ta(I426 +I369 +I422 +I353 +ta(I422 +I353 +I408 +I339 +ta(I408 +I339 +I402 +I333 +ta(I402 +I333 +I388 +I319 +ta(I388 +I319 +I372 +I313 +ta(I372 +I313 +I356 +I299 +ta(I356 +I299 +I338 +I295 +ta(I338 +I295 +I322 +I291 +ta(I322 +I291 +I306 +I287 +ta(I306 +I287 +I286 +I284 +ta(I286 +I284 +I270 +I283 +ta(I270 +I283 +I256 +I283 +ta(I256 +I283 +I251 +I285 +ta(I251 +I285 +I246 +I289 +ta(I246 +I289 +I243 +I295 +ta(I243 +I295 +I240 +I300 +ta(I240 +I300 +I238 +I314 +ta(I238 +I314 +I238 +I330 +ta(I238 +I330 +I238 +I335 +ta(I238 +I335 +I238 +I341 +ta(I238 +I341 +I241 +I347 +ta(I241 +I347 +I244 +I351 +ta(I244 +I351 +I249 +I354 +ta(I249 +I354 +I254 +I357 +ta(I254 +I357 +I268 +I359 +ta(I268 +I359 +I284 +I360 +ta(I284 +I360 +I304 +I360 +ta(I304 +I360 +I326 +I360 +ta(I326 +I360 +I348 +I359 +ta(I348 +I359 +I370 +I357 +ta(I370 +I357 +I390 +I353 +ta(I390 +I353 +I408 +I350 +ta(I408 +I350 +I422 +I346 +ta(I422 +I346 +I427 +I341 +ta(I427 +I341 +I428 +I336 +ta(I428 +I336 +I429 +I331 +ta(I429 +I331 +I428 +I326 +ta(I428 +I326 +I425 +I321 +ta(I425 +I321 +I421 +I316 +ta(I421 +I316 +I415 +I311 +ta(I415 +I311 +I409 +I309 +ta(I409 +I309 +I391 +I305 +ta(I391 +I305 +I375 +I303 +ta(I375 +I303 +I361 +I302 +ta(I361 +I302 +I347 +I301 +ta(I347 +I301 +I333 +I301 +ta(I333 +I301 +I329 +I301 +ta(I329 +I301 +I325 +I304 +ta(I325 +I304 +I323 +I307 +ta(I323 +I307 +I322 +I311 +ta(I322 +I311 +I322 +I316 +ta(I322 +I316 +I325 +I322 +ta(I325 +I322 +I329 +I327 +ta(I329 +I327 +I335 +I332 +ta(I335 +I332 +I353 +I336 +ta(I353 +I336 +I371 +I340 +ta(I371 +I340 +I395 +I344 +ta(I395 +I344 +I419 +I347 +ta(I419 +I347 +I445 +I349 +ta(I445 +I349 +I473 +I350 +ta(I473 +I350 +I501 +I352 +ta(I501 +I352 +I527 +I352 +ta(I527 +I352 +I551 +I352 +ta(I551 +I352 +I571 +I351 +ta(I571 +I351 +I577 +I349 +ta(I577 +I349 +I581 +I346 +ta(I581 +I346 +I583 +I343 +ta(I583 +I343 +I585 +I340 +ta(I585 +I340 +I585 +I336 +ta(I585 +I336 +I583 +I332 +ta(I583 +I332 +I579 +I328 +ta(I579 +I328 +I573 +I323 +ta(I573 +I323 +I557 +I320 +ta(I557 +I320 +I539 +I317 +ta(I539 +I317 +I523 +I314 +ta(I523 +I314 +I503 +I312 +ta(I503 +I312 +I487 +I310 +ta(I487 +I310 +I469 +I309 +ta(I469 +I309 +I463 +I309 +ta(I463 +I309 +I458 +I309 +ta(I458 +I309 +I453 +I309 +ta(I453 +I309 +I451 +I312 +ta(I451 +I312 +I449 +I315 +ta(I449 +I315 +I449 +I318 +ta(I449 +I318 +I449 +I323 +ta(I449 +I323 +I452 +I337 +ta(I452 +I337 +I455 +I342 +ta(I455 +I342 +I461 +I348 +ta(I461 +I348 +I465 +I354 +ta(I465 +I354 +I468 +I359 +ta(I468 +I359 +I473 +I364 +ta(I473 +I364 +I477 +I367 +ta(I477 +I367 +I483 +I370 +ta(I483 +I370 +I487 +I371 +ta(I487 +I371 +I491 +I372 +ta(I491 +I372 +I496 +I371 +ta(I496 +I371 +I501 +I370 +ta(I501 +I370 +I505 +I367 +ta(I505 +I367 +I509 +I363 +ta(I509 +I363 +I512 +I358 +ta(I512 +I358 +I514 +I352 +ta(I514 +I352 +I515 +I347 +ta(I515 +I347 +I514 +I333 +ta(I514 +I333 +I512 +I327 +ta(I512 +I327 +I508 +I321 +ta(I508 +I321 +I503 +I307 +ta(I503 +I307 +I487 +I302 +ta(I487 +I302 +I473 +I297 +ta(I473 +I297 +I449 +I292 +ta(I449 +I292 +I425 +I287 +ta(I425 +I287 +I401 +I285 +ta(I401 +I285 +I375 +I282 +ta(I375 +I282 +I351 +I281 +ta(I351 +I281 +I327 +I281 +ta(I327 +I281 +I303 +I281 +ta(I303 +I281 +I283 +I283 +ta(I283 +I283 +I263 +I287 +ta(I263 +I287 +I245 +I293 +ta(I245 +I293 +I240 +I298 +ta(I240 +I298 +I235 +I304 +ta(I235 +I304 +I233 +I322 +ta(I233 +I322 +I231 +I336 +ta(I231 +I336 +I232 +I342 +ta(I232 +I342 +I233 +I358 +ta(I233 +I358 +I236 +I374 +ta(I236 +I374 +I239 +I388 +ta(I239 +I388 +I244 +I404 +ta(I244 +I404 +I250 +I418 +ta(I250 +I418 +I255 +I423 +ta(I255 +I423 +I269 +I428 +ta(I269 +I428 +I275 +I431 +ta(I275 +I431 +I289 +I433 +ta(I289 +I433 +I295 +I434 +ta(I295 +I434 +I300 +I434 +ta(I300 +I434 +I306 +I432 +ta(I306 +I432 +I309 +I429 +ta(I309 +I429 +I313 +I425 +ta(I313 +I425 +I316 +I420 +ta(I316 +I420 +I318 +I415 +ta(I318 +I415 +I319 +I409 +ta(I319 +I409 +I319 +I395 +ta(I319 +I395 +I318 +I389 +ta(I318 +I389 +I316 +I383 +ta(I316 +I383 +I311 +I369 +ta(I311 +I369 +I306 +I355 +ta(I306 +I355 +I292 +I349 +ta(I292 +I349 +I276 +I335 +ta(I276 +I335 +I260 +I329 +ta(I260 +I329 +I242 +I324 +ta(I242 +I324 +I226 +I319 +ta(I226 +I319 +I208 +I315 +ta(I208 +I315 +I190 +I312 +ta(I190 +I312 +I172 +I309 +ta(I172 +I309 +I152 +I306 +ta(I152 +I306 +I134 +I306 +ta(I134 +I306 +I116 +I306 +ta(I116 +I306 +I96 +I307 +ta(I96 +I307 +I76 +I310 +ta(I76 +I310 +I60 +I316 +ta(I60 +I316 +I55 +I321 +ta(I55 +I321 +I50 +I337 +ta(I50 +I337 +I47 +I353 +ta(I47 +I353 +I45 +I369 +ta(I45 +I369 +I45 +I387 +ta(I45 +I387 +I46 +I403 +ta(I46 +I403 +I49 +I409 +ta(I49 +I409 +I54 +I423 +ta(I54 +I423 +I60 +I429 +ta(I60 +I429 +I66 +I432 +ta(I66 +I432 +I84 +I434 +ta(I84 +I434 +I102 +I435 +ta(I102 +I435 +I122 +I436 +ta(I122 +I436 +I142 +I436 +ta(I142 +I436 +I162 +I434 +ta(I162 +I434 +I180 +I431 +ta(I180 +I431 +I194 +I427 +ta(I194 +I427 +I198 +I423 +ta(I198 +I423 +I201 +I417 +ta(I201 +I417 +I201 +I403 +ta(I201 +I403 +I200 +I389 +ta(I200 +I389 +I197 +I383 +ta(I197 +I383 +I192 +I377 +ta(I192 +I377 +I178 +I361 +ta(I178 +I361 +I164 +I347 +ta(I164 +I347 +I148 +I341 +ta(I148 +I341 +I132 +I337 +ta(I132 +I337 +I112 +I331 +ta(I112 +I331 +I96 +I327 +ta(I96 +I327 +I80 +I324 +ta(I80 +I324 +I66 +I322 +ta(I66 +I322 +I50 +I321 +ta(I50 +I321 +I44 +I321 +ta(I44 +I321 +I38 +I321 +ta(I38 +I321 +I33 +I322 +ta(I33 +I322 +I29 +I324 +ta(I29 +I324 +I26 +I328 +ta(I26 +I328 +I23 +I333 +ta(I23 +I333 +I21 +I337 +ta(I21 +I337 +I21 +I351 +ta(I21 +I351 +I21 +I365 +ta(I21 +I365 +I22 +I379 +ta(I22 +I379 +I25 +I393 +ta(I25 +I393 +I28 +I411 +ta(I28 +I411 +I32 +I416 +ta(I32 +I416 +I37 +I421 +ta(I37 +I421 +I40 +I424 +ta(I40 +I424 +I45 +I426 +ta(I45 +I426 +I51 +I428 +ta(I51 +I428 +I57 +I427 +ta(I57 +I427 +I73 +I424 +ta(I73 +I424 +I87 +I419 +ta(I87 +I419 +I93 +I405 +ta(I93 +I405 +I99 +I389 +ta(I99 +I389 +I102 +I373 +ta(I102 +I373 +I104 +I357 +ta(I104 +I357 +I105 +I335 +ta(I105 +I335 +I105 +I319 +ta(I105 +I319 +I103 +I303 +ta(I103 +I303 +I100 +I287 +ta(I100 +I287 +I96 +I273 +ta(I96 +I273 +I91 +I268 +ta(I91 +I268 +I77 +I254 +ta(I77 +I254 +I71 +I251 +ta(I71 +I251 +I66 +I247 +ta(I66 +I247 +I60 +I244 +ta(I60 +I244 +I46 +I241 +ta(I46 +I241 +I42 +I239 +ta(I42 +I239 +I37 +I238 +ta(I37 +I238 +I33 +I238 +ta(I33 +I238 +I28 +I240 +ta(I28 +I240 +I24 +I246 +ta(I24 +I246 +I21 +I252 +ta(I21 +I252 +I19 +I268 +ta(I19 +I268 +I17 +I284 +ta(I17 +I284 +I17 +I302 +ta(I17 +I302 +I17 +I316 +ta(I17 +I316 +I18 +I321 +ta(I18 +I321 +I21 +I326 +ta(I21 +I326 +I25 +I330 +ta(I25 +I330 +I30 +I332 +ta(I30 +I332 +I36 +I333 +ta(I36 +I333 +I52 +I333 +ta(I52 +I333 +I66 +I332 +ta(I66 +I332 +I72 +I328 +ta(I72 +I328 +I88 +I324 +ta(I88 +I324 +I94 +I310 +ta(I94 +I310 +I110 +I304 +ta(I110 +I304 +I113 +I290 +ta(I113 +I290 +I118 +I274 +ta(I118 +I274 +I122 +I256 +ta(I122 +I256 +I124 +I240 +ta(I124 +I240 +I125 +I222 +ta(I125 +I222 +I125 +I208 +ta(I125 +I208 +I125 +I203 +ta(I125 +I203 +I123 +I197 +ta(I123 +I197 +I120 +I183 +ta(I120 +I183 +I116 +I178 +ta(I116 +I178 +I112 +I175 +ta(I112 +I175 +I108 +I170 +ta(I108 +I170 +I103 +I166 +ta(I103 +I166 +I97 +I164 +ta(I97 +I164 +I92 +I162 +ta(I92 +I162 +I89 +I161 +ta(I89 +I161 +I85 +I160 +ta(I85 +I160 +I82 +I160 +ta(I82 +I160 +I80 +I160 +ta(I80 +I160 +I78 +I162 +ta(I78 +I162 +I76 +I165 +ta(I76 +I165 +I74 +I169 +ta(I74 +I169 +I71 +I183 +ta(I71 +I183 +I70 +I188 +ta(I70 +I188 +I67 +I206 +ta(I67 +I206 +I65 +I224 +ta(I65 +I224 +I64 +I240 +ta(I64 +I240 +I63 +I260 +ta(I63 +I260 +I62 +I274 +ta(I62 +I274 +I62 +I288 +ta(I62 +I288 +I62 +I293 +ta(I62 +I293 +I63 +I297 +ta(I63 +I297 +I66 +I300 +ta(I66 +I300 +I68 +I301 +ta(I68 +I301 +I71 +I301 +ta(I71 +I301 +I74 +I301 +ta(I74 +I301 +I77 +I298 +ta(I77 +I298 +I81 +I293 +ta(I81 +I293 +I84 +I287 +ta(I84 +I287 +I87 +I273 +ta(I87 +I273 +I91 +I257 +ta(I91 +I257 +I93 +I239 +ta(I93 +I239 +I95 +I223 +ta(I95 +I223 +I96 +I203 +ta(I96 +I203 +I96 +I187 +ta(I96 +I187 +I96 +I171 +ta(I96 +I171 +I94 +I157 +ta(I94 +I157 +I91 +I152 +ta(I91 +I152 +I88 +I148 +ta(I88 +I148 +I84 +I144 +ta(I84 +I144 +I80 +I142 +ta(I80 +I142 +I75 +I139 +ta(I75 +I139 +I70 +I139 +ta(I70 +I139 +I54 +I139 +ta(I54 +I139 +I48 +I139 +ta(I48 +I139 +I42 +I141 +ta(I42 +I141 +I36 +I144 +ta(I36 +I144 +I32 +I150 +ta(I32 +I150 +I29 +I155 +ta(I29 +I155 +I26 +I161 +ta(I26 +I161 +I23 +I166 +ta(I23 +I166 +I22 +I172 +ta(I22 +I172 +I22 +I177 +ta(I22 +I177 +I21 +I183 +ta(I21 +I183 +I21 +I189 +ta(I21 +I189 +I21 +I194 +ta(I21 +I194 +I23 +I198 +ta(I23 +I198 +I25 +I202 +ta(I25 +I202 +I27 +I206 +ta(I27 +I206 +I30 +I208 +ta(I30 +I208 +I34 +I210 +ta(I34 +I210 +I37 +I211 +ta(I37 +I211 +I40 +I211 +ta(I40 +I211 +I44 +I209 +ta(I44 +I209 +I48 +I206 +ta(I48 +I206 +I52 +I201 +ta(I52 +I201 +I55 +I187 +ta(I55 +I187 +I58 +I181 +ta(I58 +I181 +I61 +I167 +ta(I61 +I167 +I63 +I151 +ta(I63 +I151 +I65 +I137 +ta(I65 +I137 +I65 +I123 +ta(I65 +I123 +I65 +I117 +ta(I65 +I117 +I64 +I112 +ta(I64 +I112 +I62 +I108 +ta(I62 +I108 +I59 +I105 +ta(I59 +I105 +I57 +I103 +ta(I57 +I103 +I54 +I102 +ta(I54 +I102 +I51 +I101 +ta(I51 +I101 +I47 +I101 +ta(I47 +I101 +I43 +I101 +ta(I43 +I101 +I39 +I102 +ta(I39 +I102 +I34 +I104 +ta(I34 +I104 +I29 +I108 +ta(I29 +I108 +I25 +I111 +ta(I25 +I111 +I20 +I116 +ta(I20 +I116 +I16 +I130 +ta(I16 +I130 +I13 +I146 +ta(I13 +I146 +I9 +I162 +ta(I9 +I162 +I7 +I178 +ta(I7 +I178 +I6 +I192 +ta(I6 +I192 +I5 +I198 +ta(I5 +I198 +I5 +I212 +ta(I5 +I212 +I6 +I217 +ta(I6 +I217 +I9 +I223 +ta(I9 +I223 +I13 +I226 +ta(I13 +I226 +I19 +I229 +ta(I19 +I229 +I24 +I231 +ta(I24 +I231 +I30 +I232 +ta(I30 +I232 +I44 +I232 +ta(I44 +I232 +I62 +I231 +ta(I62 +I231 +I76 +I228 +ta(I76 +I228 +I82 +I224 +ta(I82 +I224 +I96 +I219 +ta(I96 +I219 +I110 +I203 +ta(I110 +I203 +I115 +I187 +ta(I115 +I187 +I118 +I171 +ta(I118 +I171 +I120 +I153 +ta(I120 +I153 +I121 +I133 +ta(I121 +I133 +I121 +I115 +ta(I121 +I115 +I119 +I99 +ta(I119 +I99 +I116 +I93 +ta(I116 +I93 +I112 +I89 +ta(I112 +I89 +I108 +I87 +ta(I108 +I87 +I103 +I84 +ta(I103 +I84 +I97 +I83 +ta(I97 +I83 +I83 +I82 +ta(I83 +I82 +I65 +I82 +ta(I65 +I82 +I47 +I82 +ta(I47 +I82 +I29 +I82 +ta(I29 +I82 +I9 +I85 +ta(I9 +I85 +I-9 +I89 +ta(I-9 +I89 +I-15 +I93 +ta(I-15 +I93 +I-18 +I97 +ta(I-18 +I97 +I-21 +I111 +ta(I-21 +I111 +I-22 +I117 +ta(I-22 +I117 +I-23 +I135 +ta(I-23 +I135 +I-23 +I141 +ta(I-23 +I141 +I-22 +I157 +ta(I-22 +I157 +I-19 +I171 +ta(I-19 +I171 +I-15 +I187 +ta(I-15 +I187 +I-1 +I203 +ta(I-1 +I203 +I5 +I217 +ta(I5 +I217 +I21 +I221 +ta(I21 +I221 +I39 +I224 +ta(I39 +I224 +I59 +I228 +ta(I59 +I228 +I81 +I229 +ta(I81 +I229 +I105 +I230 +ta(I105 +I230 +I125 +I230 +ta(I125 +I230 +I145 +I227 +ta(I145 +I227 +I167 +I221 +ta(I167 +I221 +I183 +I207 +ta(I183 +I207 +I189 +I201 +ta(I189 +I201 +I203 +I185 +ta(I203 +I185 +I209 +I169 +ta(I209 +I169 +I212 +I151 +ta(I212 +I151 +I216 +I135 +ta(I216 +I135 +I217 +I121 +ta(I217 +I121 +I217 +I115 +ta(I217 +I115 +I215 +I109 +ta(I215 +I109 +I211 +I105 +ta(I211 +I105 +I197 +I102 +ta(I197 +I102 +I191 +I101 +ta(I191 +I101 +I175 +I99 +ta(I175 +I99 +I157 +I99 +ta(I157 +I99 +I137 +I99 +ta(I137 +I99 +I119 +I99 +ta(I119 +I99 +I101 +I102 +ta(I101 +I102 +I97 +I104 +ta(I97 +I104 +I93 +I107 +ta(I93 +I107 +I91 +I112 +ta(I91 +I112 +I90 +I117 +ta(I90 +I117 +I90 +I131 +ta(I90 +I131 +I91 +I145 +ta(I91 +I145 +I94 +I151 +ta(I94 +I151 +I99 +I169 +ta(I99 +I169 +I113 +I175 +ta(I113 +I175 +I131 +I191 +ta(I131 +I191 +I149 +I197 +ta(I149 +I197 +I169 +I202 +ta(I169 +I202 +I195 +I207 +ta(I195 +I207 +I221 +I209 +ta(I221 +I209 +I247 +I211 +ta(I247 +I211 +I277 +I211 +ta(I277 +I211 +I311 +I210 +ta(I311 +I210 +I339 +I208 +ta(I339 +I208 +I367 +I203 +ta(I367 +I203 +I393 +I187 +ta(I393 +I187 +I413 +I173 +ta(I413 +I173 +I418 +I155 +ta(I418 +I155 +I422 +I135 +ta(I422 +I135 +I423 +I115 +ta(I423 +I115 +I423 +I97 +ta(I423 +I97 +I419 +I77 +ta(I419 +I77 +I414 +I71 +ta(I414 +I71 +I398 +I66 +ta(I398 +I66 +I380 +I61 +ta(I380 +I61 +I362 +I57 +ta(I362 +I57 +I342 +I55 +ta(I342 +I55 +I320 +I53 +ta(I320 +I53 +I296 +I51 +ta(I296 +I51 +I276 +I50 +ta(I276 +I50 +I254 +I50 +ta(I254 +I50 +I234 +I50 +ta(I234 +I50 +I216 +I50 +ta(I216 +I50 +I210 +I52 +ta(I210 +I52 +I206 +I54 +ta(I206 +I54 +I202 +I56 +ta(I202 +I56 +I200 +I60 +ta(I200 +I60 +I200 +I64 +ta(I200 +I64 +I200 +I69 +ta(I200 +I69 +I201 +I75 +ta(I201 +I75 +I204 +I80 +ta(I204 +I80 +I208 +I86 +ta(I208 +I86 +I213 +I100 +ta(I213 +I100 +I219 +I106 +ta(I219 +I106 +I225 +I112 +ta(I225 +I112 +I230 +I116 +ta(I230 +I116 +I244 +I120 +ta(I244 +I120 +I260 +I123 +ta(I260 +I123 +I278 +I126 +ta(I278 +I126 +I284 +I127 +ta(I284 +I127 +I300 +I127 +ta(I300 +I127 +I316 +I125 +ta(I316 +I125 +I322 +I121 +ta(I322 +I121 +I327 +I117 +ta(I327 +I117 +I333 +I101 +ta(I333 +I101 +I335 +I95 +ta(I335 +I95 +I337 +I89 +ta(I337 +I89 +I338 +I75 +ta(I338 +I75 +I337 +I69 +ta(I337 +I69 +I335 +I63 +ta(I335 +I63 +I332 +I59 +ta(I332 +I59 +I328 +I56 +ta(I328 +I56 +I314 +I53 +ta(I314 +I53 +I300 +I52 +ta(I300 +I52 +I286 +I52 +ta(I286 +I52 +I270 +I52 +ta(I270 +I52 +I256 +I54 +ta(I256 +I54 +I240 +I57 +ta(I240 +I57 +I235 +I62 +ta(I235 +I62 +I230 +I67 +ta(I230 +I67 +I226 +I81 +ta(I226 +I81 +I223 +I95 +ta(I223 +I95 +I221 +I111 +ta(I221 +I111 +I219 +I129 +ta(I219 +I129 +I219 +I147 +ta(I219 +I147 +I219 +I163 +ta(I219 +I163 +I221 +I179 +ta(I221 +I179 +I226 +I193 +ta(I226 +I193 +I231 +I207 +ta(I231 +I207 +I237 +I221 +ta(I237 +I221 +I257 +I226 +ta(I257 +I226 +I277 +I231 +ta(I277 +I231 +I295 +I234 +ta(I295 +I234 +I315 +I237 +ta(I315 +I237 +I329 +I238 +ta(I329 +I238 +I335 +I238 +ta(I335 +I238 +I339 +I237 +ta(I339 +I237 +I342 +I235 +ta(I342 +I235 +I344 +I232 +ta(I344 +I232 +I344 +I228 +ta(I344 +I228 +I342 +I223 +ta(I342 +I223 +I338 +I218 +ta(I338 +I218 +I332 +I213 +ta(I332 +I213 +I312 +I209 +ta(I312 +I209 +I292 +I205 +ta(I292 +I205 +I272 +I204 +ta(I272 +I204 +I252 +I204 +ta(I252 +I204 +I234 +I205 +ta(I234 +I205 +I218 +I208 +ta(I218 +I208 +I202 +I212 +ta(I202 +I212 +I198 +I218 +ta(I198 +I218 +I195 +I224 +ta(I195 +I224 +I194 +I229 +ta(I194 +I229 +I194 +I235 +ta(I194 +I235 +I196 +I249 +ta(I196 +I249 +I201 +I254 +ta(I201 +I254 +I215 +I268 +ta(I215 +I268 +I231 +I273 +ta(I231 +I273 +I249 +I278 +ta(I249 +I278 +I269 +I284 +ta(I269 +I284 +I289 +I289 +ta(I289 +I289 +I309 +I295 +ta(I309 +I295 +I325 +I300 +ta(I325 +I300 +I341 +I306 +ta(I341 +I306 +I357 +I309 +ta(I357 +I309 +I371 +I313 +ta(I371 +I313 +I374 +I317 +ta(I374 +I317 +I377 +I319 +ta(I377 +I319 +I380 +I321 +ta(I380 +I321 +I382 +I322 +ta(I382 +I322 +I382 +I323 +ta(I382 +I323 +I383 +I323 +ta(I383 +I323 +I384 +I322 +ta(I384 +I322 +I385 +I322 +ta(I385 +I322 +I386 +I321 +ta(I386 +I321 +I387 +I321 +ta(I387 +I321 +I388 +I320 +ta(I388 +I320 +I389 +I320 +ta(I389 +I320 +I390 +I319 +ta(I390 +I319 +I391 +I319 +ta(I391 +I319 +I392 +I318 +ta(I392 +I318 +I393 +I318 +ta(I393 +I318 +I395 +I318 +ta(I395 +I318 +I397 +I318 +ta(I397 +I318 +I399 +I320 +ta(I399 +I320 +I400 +I323 +ta(I400 +I323 +I403 +I326 +ta(I403 +I326 +I405 +I331 +ta(I405 +I331 +I407 +I337 +ta(I407 +I337 +I409 +I342 +ta(I409 +I342 +I413 +I347 +ta(I413 +I347 +I417 +I351 +ta(I417 +I351 +I420 +I354 +ta(I420 +I354 +I423 +I357 +ta(I423 +I357 +I426 +I359 +ta(I426 +I359 +I427 +I360 +ta(I427 +I360 +I425 +I357 +ta(I425 +I357 +I419 +I351 +ta(I419 +I351 +I403 +I346 +ta(I403 +I346 +I387 +I341 +ta(I387 +I341 +I367 +I337 +ta(I367 +I337 +I349 +I334 +ta(I349 +I334 +I331 +I333 +ta(I331 +I333 +I315 +I332 +ta(I315 +I332 +I299 +I333 +ta(I299 +I333 +I283 +I336 +ta(I283 +I336 +I267 +I340 +ta(I267 +I340 +I253 +I343 +ta(I253 +I343 +I239 +I349 +ta(I239 +I349 +I235 +I353 +ta(I235 +I353 +I232 +I359 +ta(I232 +I359 +I231 +I363 +ta(I231 +I363 +I231 +I369 +ta(I231 +I369 +I232 +I374 +ta(I232 +I374 +I235 +I379 +ta(I235 +I379 +I241 +I385 +ta(I241 +I385 +I246 +I399 +ta(I246 +I399 +I252 +I404 +ta(I252 +I404 +I266 +I410 +ta(I266 +I410 +I280 +I414 +ta(I280 +I414 +I298 +I418 +ta(I298 +I418 +I312 +I420 +ta(I312 +I420 +I328 +I421 +ta(I328 +I421 +I344 +I420 +ta(I344 +I420 +I349 +I418 +ta(I349 +I418 +I355 +I414 +ta(I355 +I414 +I360 +I409 +ta(I360 +I409 +I361 +I403 +ta(I361 +I403 +I362 +I398 +ta(I362 +I398 +I363 +I382 +ta(I363 +I382 +I361 +I368 +ta(I361 +I368 +I358 +I352 +ta(I358 +I352 +I342 +I334 +ta(I342 +I334 +I326 +I320 +ta(I326 +I320 +I310 +I314 +ta(I310 +I314 +I288 +I309 +ta(I288 +I309 +I266 +I306 +ta(I266 +I306 +I244 +I304 +ta(I244 +I304 +I222 +I303 +ta(I222 +I303 +I200 +I304 +ta(I200 +I304 +I182 +I309 +ta(I182 +I309 +I176 +I313 +ta(I176 +I313 +I171 +I319 +ta(I171 +I319 +I167 +I335 +ta(I167 +I335 +I165 +I349 +ta(I165 +I349 +I165 +I367 +ta(I165 +I367 +I165 +I383 +ta(I165 +I383 +I167 +I397 +ta(I167 +I397 +I170 +I411 +ta(I170 +I411 +I175 +I417 +ta(I175 +I417 +I189 +I423 +ta(I189 +I423 +I207 +I426 +ta(I207 +I426 +I223 +I430 +ta(I223 +I430 +I239 +I433 +ta(I239 +I433 +I253 +I434 +ta(I253 +I434 +I259 +I435 +ta(I259 +I435 +I265 +I435 +ta(I265 +I435 +I268 +I435 +ta(I268 +I435 +I271 +I433 +ta(I271 +I433 +I273 +I430 +ta(I273 +I430 +I274 +I427 +ta(I274 +I427 +I274 +I423 +ta(I274 +I423 +I271 +I419 +ta(I271 +I419 +I268 +I415 +ta(I268 +I415 +I263 +I410 +ta(I263 +I410 +I245 +I404 +ta(I245 +I404 +I229 +I399 +ta(I229 +I399 +I213 +I395 +ta(I213 +I395 +I195 +I392 +ta(I195 +I392 +I179 +I389 +ta(I179 +I389 +I163 +I388 +ta(I163 +I388 +I147 +I388 +ta(I147 +I388 +I131 +I389 +ta(I131 +I389 +I125 +I391 +ta(I125 +I391 +I111 +I397 +ta(I111 +I397 +I106 +I403 +ta(I106 +I403 +I103 +I419 +ta(I103 +I419 +I99 +I437 +ta(I99 +I437 +I98 +I455 +ta(I98 +I455 +I98 +I473 +ta(I98 +I473 +I98 +I487 +ta(I98 +I487 +I101 +I503 +ta(I101 +I503 +I105 +I517 +ta(I105 +I517 +I110 +I521 +ta(I110 +I521 +I114 +I525 +ta(I114 +I525 +I120 +I528 +ta(I120 +I528 +I126 +I531 +ta(I126 +I531 +I132 +I534 +ta(I132 +I534 +I146 +I536 +ta(I146 +I536 +I162 +I536 +ta(I162 +I536 +I176 +I536 +ta(I176 +I536 +I190 +I535 +ta(I190 +I535 +I204 +I533 +ta(I204 +I533 +I210 +I529 +ta(I210 +I529 +I215 +I525 +ta(I215 +I525 +I217 +I522 +ta(I217 +I522 +I219 +I518 +ta(I219 +I518 +I219 +I513 +ta(I219 +I513 +I218 +I509 +ta(I218 +I509 +I214 +I505 +ta(I214 +I505 +I209 +I500 +ta(I209 +I500 +I193 +I495 +ta(I193 +I495 +I177 +I491 +ta(I177 +I491 +I161 +I488 +ta(I161 +I488 +I145 +I486 +ta(I145 +I486 +I131 +I483 +ta(I131 +I483 +I125 +I481 +ta(I125 +I481 +I120 +I479 +ta(I120 +I479 +I115 +I478 +ta(I115 +I478 +I110 +I477 +ta(I110 +I477 +I106 +I477 +ta(I106 +I477 +I103 +I477 +ta(I103 +I477 +I101 +I478 +ta(I101 +I478 +I98 +I480 +ta(I98 +I480 +I97 +I483 +ta(I97 +I483 +I95 +I487 +ta(I95 +I487 +I94 +I491 +ta(I94 +I491 +I93 +I497 +ta(I93 +I497 +I93 +I502 +ta(I93 +I502 +I93 +I508 +ta(I93 +I508 +I94 +I514 +ta(I94 +I514 +I96 +I520 +ta(I96 +I520 +I99 +I526 +ta(I99 +I526 +I103 +I530 +ta(I103 +I530 +I107 +I534 +ta(I107 +I534 +I113 +I537 +ta(I113 +I537 +I117 +I539 +ta(I117 +I539 +I131 +I540 +ta(I131 +I540 +I145 +I540 +ta(I145 +I540 +I161 +I539 +ta(I161 +I539 +I175 +I536 +ta(I175 +I536 +I181 +I533 +ta(I181 +I533 +I199 +I528 +ta(I199 +I528 +I203 +I523 +ta(I203 +I523 +I208 +I509 +ta(I208 +I509 +I211 +I504 +ta(I211 +I504 +I211 +I498 +ta(I211 +I498 +I211 +I484 +ta(I211 +I484 +I209 +I470 +ta(I209 +I470 +I204 +I456 +ta(I204 +I456 +I188 +I440 +ta(I188 +I440 +I174 +I434 +ta(I174 +I434 +I158 +I429 +ta(I158 +I429 +I142 +I425 +ta(I142 +I425 +I136 +I421 +ta(I136 +I421 +I131 +I418 +ta(I131 +I418 +I127 +I417 +ta(I127 +I417 +I125 +I417 +ta(I125 +I417 +I123 +I418 +ta(I123 +I418 +I123 +I421 +ta(I123 +I421 +I123 +I426 +ta(I123 +I426 +I124 +I432 +ta(I124 +I432 +I126 +I438 +ta(I126 +I438 +I130 +I452 +ta(I130 +I452 +I134 +I466 +ta(I134 +I466 +I140 +I484 +ta(I140 +I484 +I146 +I500 +ta(I146 +I500 +I152 +I514 +ta(I152 +I514 +I166 +I519 +ta(I166 +I519 +I186 +I525 +ta(I186 +I525 +I202 +I528 +ta(I202 +I528 +I222 +I531 +ta(I222 +I531 +I242 +I533 +ta(I242 +I533 +I266 +I534 +ta(I266 +I534 +I286 +I534 +ta(I286 +I534 +I306 +I532 +ta(I306 +I532 +I326 +I529 +ta(I326 +I529 +I340 +I525 +ta(I340 +I525 +I345 +I520 +ta(I345 +I520 +I351 +I514 +ta(I351 +I514 +I355 +I498 +ta(I355 +I498 +I359 +I482 +ta(I359 +I482 +I362 +I466 +ta(I362 +I466 +I363 +I448 +ta(I363 +I448 +I363 +I434 +ta(I363 +I434 +I361 +I418 +ta(I361 +I418 +I357 +I404 +ta(I357 +I404 +I343 +I398 +ta(I343 +I398 +I337 +I392 +ta(I337 +I392 +I323 +I389 +ta(I323 +I389 +I317 +I386 +ta(I317 +I386 +I303 +I385 +ta(I303 +I385 +I297 +I385 +ta(I297 +I385 +I294 +I388 +ta(I294 +I388 +I291 +I392 +ta(I291 +I392 +I289 +I398 +ta(I289 +I398 +I288 +I414 +ta(I288 +I414 +I288 +I420 +ta(I288 +I420 +I290 +I440 +ta(I290 +I440 +I292 +I456 +ta(I292 +I456 +I297 +I472 +ta(I297 +I472 +I303 +I488 +ta(I303 +I488 +I309 +I493 +ta(I309 +I493 +I329 +I499 +ta(I329 +I499 +I347 +I502 +ta(I347 +I502 +I367 +I505 +ta(I367 +I505 +I393 +I506 +ta(I393 +I506 +I409 +I507 +ta(I409 +I507 +I433 +I507 +ta(I433 +I507 +I457 +I505 +ta(I457 +I505 +I475 +I501 +ta(I475 +I501 +I478 +I501 +ta(I478 +I501 +I478 +I500 +ta(I478 +I500 +I492 +I495 +ta(I492 +I495 +I495 +I490 +ta(I495 +I490 +I498 +I476 +ta(I498 +I476 +I499 +I473 +ta(I499 +I473 +I499 +I467 +ta(I499 +I467 +I497 +I451 +ta(I497 +I451 +I494 +I437 +ta(I494 +I437 +I490 +I431 +ta(I490 +I431 +I485 +I426 +ta(I485 +I426 +I471 +I412 +ta(I471 +I412 +I466 +I409 +ta(I466 +I409 +I460 +I405 +ta(I460 +I405 +I454 +I403 +ta(I454 +I403 +I449 +I402 +ta(I449 +I402 +I445 +I402 +ta(I445 +I402 +I429 +I404 +ta(I429 +I404 +I425 +I410 +ta(I425 +I410 +I421 +I415 +ta(I421 +I415 +I417 +I433 +ta(I417 +I433 +I415 +I449 +ta(I415 +I449 +I414 +I465 +ta(I414 +I465 +I414 +I481 +ta(I414 +I481 +I414 +I487 +ta(I414 +I487 +I417 +I501 +ta(I417 +I501 +I420 +I517 +ta(I420 +I517 +I422 +I519 +ta(I422 +I519 +I427 +I524 +ta(I427 +I524 +I430 +I525 +ta(I430 +I525 +I436 +I529 +ta(I436 +I529 +I452 +I533 +ta(I452 +I533 +I470 +I535 +ta(I470 +I535 +I488 +I536 +ta(I488 +I536 +I494 +I536 +ta(I494 +I536 +I495 +I536 +ta(I495 +I536 +I495 +I535 +ta(I495 +I535 +I499 +I519 +ta(I499 +I519 +I499 +I513 +ta(I499 +I513 +I499 +I512 +ta(I499 +I512 +I499 +I511 +ta(I499 +I511 +I485 +I505 +ta(I485 +I505 +I481 +I503 +ta(I481 +I503 +I479 +I502 +ta(I479 +I502 +I463 +I499 +ta(I463 +I499 +I447 +I498 +ta(I447 +I498 +I441 +I498 +ta(I441 +I498 +I427 +I498 +ta(I427 +I498 +I422 +I500 +ta(I422 +I500 +I417 +I506 +ta(I417 +I506 +I414 +I510 +ta(I414 +I510 +I412 +I516 +ta(I412 +I516 +I411 +I532 +ta(I411 +I532 +I411 +I538 +ta(I411 +I538 +I413 +I552 +ta(I413 +I552 +I417 +I557 +ta(I417 +I557 +I422 +I562 +ta(I422 +I562 +I425 +I564 +ta(I425 +I564 +I426 +I566 +ta(I426 +I566 +I444 +I569 +ta(I444 +I569 +I464 +I572 +ta(I464 +I572 +I469 +I573 +ta(I469 +I573 +I472 +I568 +ta(I472 +I568 +I473 +I554 +ta(I473 +I554 +I474 +I553 +ta(I474 +I553 +I474 +I551 +ta(I474 +I551 +I476 +I565 +ta(I476 +I565 +I475 +I563 +ta(I475 +I563 +I459 +I560 +ta(I459 +I560 +I455 +I558 +ta(I455 +I558 +I453 +I558 +ta(I453 +I558 +I431 +I557 +ta(I431 +I557 +I417 +I557 +ta(I417 +I557 +I411 +I558 +ta(I411 +I558 +I407 +I562 +ta(I407 +I562 +I403 +I566 +ta(I403 +I566 +I401 +I571 +ta(I401 +I571 +I400 +I576 +ta(I400 +I576 +I401 +I582 +ta(I401 +I582 +I403 +I588 +ta(I403 +I588 +I406 +I604 +ta(I406 +I604 +I422 +I610 +ta(I422 +I610 +I428 +I616 +ta(I428 +I616 +I442 +I616 +ta(I442 +I616 +I466 +I614 +ta(I466 +I614 +I468 +I614 +ta(I468 +I614 +I465 +I610 +ta(I465 +I610 +I464 +I607 +ta(I464 +I607 +I464 +I603 +ta(I464 +I603 +I466 +I589 +ta(I466 +I589 +I468 +I573 +ta(I468 +I573 +I470 +I555 +ta(I470 +I555 +I472 +I533 +ta(I472 +I533 +I473 +I509 +ta(I473 +I509 +I473 +I483 +ta(I473 +I483 +I473 +I459 +ta(I473 +I459 +I471 +I435 +ta(I471 +I435 +I471 +I419 +ta(I471 +I419 +I472 +I413 +ta(I472 +I413 +I476 +I408 +ta(I476 +I408 +I482 +I405 +ta(I482 +I405 +I488 +I404 +ta(I488 +I404 +I504 +I404 +ta(I504 +I404 +I522 +I404 +ta(I522 +I404 +I542 +I406 +ta(I542 +I406 +I562 +I409 +ta(I562 +I409 +I584 +I412 +ta(I584 +I412 +I604 +I416 +ta(I604 +I416 +I622 +I421 +ta(I622 +I421 +I638 +I427 +ta(I638 +I427 +I644 +I433 +ta(I644 +I433 +I650 +I439 +ta(I650 +I439 +I655 +I453 +ta(I655 +I453 +I657 +I467 +ta(I657 +I467 +I659 +I473 +ta(I659 +I473 +I659 +I479 +ta(I659 +I479 +I656 +I483 +ta(I656 +I483 +I650 +I488 +ta(I650 +I488 +I636 +I490 +ta(I636 +I490 +I618 +I492 +ta(I618 +I492 +I596 +I493 +ta(I596 +I493 +I576 +I493 +ta(I576 +I493 +I558 +I492 +ta(I558 +I492 +I542 +I489 +ta(I542 +I489 +I538 +I485 +ta(I538 +I485 +I536 +I481 +ta(I536 +I481 +I534 +I475 +ta(I534 +I475 +I533 +I459 +ta(I533 +I459 +I533 +I443 +ta(I533 +I443 +I534 +I425 +ta(I534 +I425 +I537 +I409 +ta(I537 +I409 +I542 +I393 +ta(I542 +I393 +I556 +I379 +ta(I556 +I379 +I574 +I365 +ta(I574 +I365 +I590 +I361 +ta(I590 +I361 +I606 +I358 +ta(I606 +I358 +I624 +I356 +ta(I624 +I356 +I640 +I355 +ta(I640 +I355 +I656 +I356 +ta(I656 +I356 +I670 +I359 +ta(I670 +I359 +I684 +I365 +ta(I684 +I365 +I698 +I371 +ta(I698 +I371 +I714 +I391 +ta(I714 +I391 +I718 +I405 +ta(I718 +I405 +I723 +I425 +ta(I723 +I425 +I727 +I449 +ta(I727 +I449 +I730 +I469 +ta(I730 +I469 +I730 +I489 +ta(I730 +I489 +I730 +I507 +ta(I730 +I507 +I727 +I523 +ta(I727 +I523 +I722 +I537 +ta(I722 +I537 +I704 +I542 +ta(I704 +I542 +I686 +I546 +ta(I686 +I546 +I666 +I548 +ta(I666 +I548 +I644 +I548 +ta(I644 +I548 +I624 +I548 +ta(I624 +I548 +I602 +I546 +ta(I602 +I546 +I582 +I543 +ta(I582 +I543 +I566 +I539 +ta(I566 +I539 +I550 +I525 +ta(I550 +I525 +I545 +I519 +ta(I545 +I519 +I542 +I513 +ta(I542 +I513 +I539 +I495 +ta(I539 +I495 +I537 +I479 +ta(I537 +I479 +I537 +I463 +ta(I537 +I463 +I539 +I445 +ta(I539 +I445 +I542 +I429 +ta(I542 +I429 +I548 +I423 +ta(I548 +I423 +I566 +I417 +ta(I566 +I417 +I582 +I414 +ta(I582 +I414 +I602 +I411 +ta(I602 +I411 +I624 +I411 +ta(I624 +I411 +I644 +I412 +ta(I644 +I412 +I664 +I416 +ta(I664 +I416 +I682 +I420 +ta(I682 +I420 +I688 +I434 +ta(I688 +I434 +I693 +I440 +ta(I693 +I440 +I696 +I456 +ta(I696 +I456 +I699 +I474 +ta(I699 +I474 +I701 +I490 +ta(I701 +I490 +I701 +I506 +ta(I701 +I506 +I701 +I512 +ta(I701 +I512 +I698 +I518 +ta(I698 +I518 +I695 +I524 +ta(I695 +I524 +I690 +I529 +ta(I690 +I529 +I684 +I532 +ta(I684 +I532 +I680 +I535 +ta(I680 +I535 +I666 +I536 +ta(I666 +I536 +I660 +I536 +ta(I660 +I536 +I646 +I535 +ta(I646 +I535 +I640 +I531 +ta(I640 +I531 +I635 +I526 +ta(I635 +I526 +I621 +I510 +ta(I621 +I510 +I618 +I494 +ta(I618 +I494 +I615 +I478 +ta(I615 +I478 +I612 +I458 +ta(I612 +I458 +I612 +I438 +ta(I612 +I438 +I612 +I416 +ta(I612 +I416 +I613 +I392 +ta(I613 +I392 +I615 +I370 +ta(I615 +I370 +I618 +I350 +ta(I618 +I350 +I632 +I328 +ta(I632 +I328 +I646 +I312 +ta(I646 +I312 +I651 +I306 +ta(I651 +I306 +I669 +I302 +ta(I669 +I302 +I674 +I299 +ta(I674 +I299 +I692 +I299 +ta(I692 +I299 +I697 +I300 +ta(I697 +I300 +I701 +I302 +ta(I701 +I302 +I705 +I307 +ta(I705 +I307 +I709 +I311 +ta(I709 +I311 +I711 +I317 +ta(I711 +I317 +I714 +I323 +ta(I714 +I323 +I714 +I329 +ta(I714 +I329 +I714 +I343 +ta(I714 +I343 +I714 +I349 +ta(I714 +I349 +I711 +I355 +ta(I711 +I355 +I707 +I360 +ta(I707 +I360 +I702 +I363 +ta(I702 +I363 +I697 +I366 +ta(I697 +I366 +I683 +I367 +ta(I683 +I367 +I669 +I368 +ta(I669 +I368 +I655 +I366 +ta(I655 +I366 +I639 +I363 +ta(I639 +I363 +I623 +I359 +ta(I623 +I359 +I609 +I354 +ta(I609 +I354 +I603 +I340 +ta(I603 +I340 +I597 +I324 +ta(I597 +I324 +I595 +I310 +ta(I595 +I310 +I592 +I292 +ta(I592 +I292 +I590 +I272 +ta(I590 +I272 +I590 +I252 +ta(I590 +I252 +I590 +I234 +ta(I590 +I234 +I591 +I214 +ta(I591 +I214 +I594 +I198 +ta(I594 +I198 +I598 +I182 +ta(I598 +I182 +I602 +I176 +ta(I602 +I176 +I616 +I171 +ta(I616 +I171 +I621 +I167 +ta(I621 +I167 +I627 +I165 +ta(I627 +I165 +I633 +I164 +ta(I633 +I164 +I636 +I164 +ta(I636 +I164 +I640 +I168 +ta(I640 +I168 +I642 +I173 +ta(I642 +I173 +I644 +I187 +ta(I644 +I187 +I644 +I193 +ta(I644 +I193 +I644 +I211 +ta(I644 +I211 +I642 +I227 +ta(I642 +I227 +I637 +I243 +ta(I637 +I243 +I633 +I257 +ta(I633 +I257 +I628 +I271 +ta(I628 +I271 +I623 +I287 +ta(I623 +I287 +I618 +I291 +ta(I618 +I291 +I613 +I296 +ta(I613 +I296 +I607 +I299 +ta(I607 +I299 +I601 +I301 +ta(I601 +I301 +I597 +I302 +ta(I597 +I302 +I591 +I302 +ta(I591 +I302 +I585 +I298 +ta(I585 +I298 +I579 +I294 +ta(I579 +I294 +I573 +I289 +ta(I573 +I289 +I568 +I275 +ta(I568 +I275 +I563 +I259 +ta(I563 +I259 +I560 +I243 +ta(I560 +I243 +I558 +I227 +ta(I558 +I227 +I557 +I211 +ta(I557 +I211 +I558 +I193 +ta(I558 +I193 +I561 +I177 +ta(I561 +I177 +I565 +I161 +ta(I565 +I161 +I579 +I147 +ta(I579 +I147 +I585 +I142 +ta(I585 +I142 +I603 +I138 +ta(I603 +I138 +I617 +I135 +ta(I617 +I135 +I633 +I134 +ta(I633 +I134 +I639 +I134 +ta(I639 +I134 +I653 +I136 +ta(I653 +I136 +I658 +I139 +ta(I658 +I139 +I662 +I145 +ta(I662 +I145 +I666 +I151 +ta(I666 +I151 +I669 +I165 +ta(I669 +I165 +I670 +I171 +ta(I670 +I171 +I670 +I189 +ta(I670 +I189 +I670 +I205 +ta(I670 +I205 +I667 +I221 +ta(I667 +I221 +I663 +I227 +ta(I663 +I227 +I657 +I243 +ta(I657 +I243 +I652 +I249 +ta(I652 +I249 +I636 +I254 +ta(I636 +I254 +I618 +I257 +ta(I618 +I257 +I600 +I259 +ta(I600 +I259 +I580 +I260 +ta(I580 +I260 +I560 +I260 +ta(I560 +I260 +I538 +I256 +ta(I538 +I256 +I520 +I252 +ta(I520 +I252 +I504 +I248 +ta(I504 +I248 +I490 +I234 +ta(I490 +I234 +I487 +I229 +ta(I487 +I229 +I484 +I224 +ta(I484 +I224 +I482 +I210 +ta(I482 +I210 +I481 +I204 +ta(I481 +I204 +I481 +I198 +ta(I481 +I198 +I481 +I193 +ta(I481 +I193 +I485 +I188 +ta(I485 +I188 +I489 +I184 +ta(I489 +I184 +I503 +I181 +ta(I503 +I181 +I519 +I180 +ta(I519 +I180 +I539 +I179 +ta(I539 +I179 +I557 +I181 +ta(I557 +I181 +I579 +I185 +ta(I579 +I185 +I599 +I189 +ta(I599 +I189 +I617 +I195 +ta(I617 +I195 +I623 +I201 +ta(I623 +I201 +I628 +I207 +ta(I628 +I207 +I631 +I223 +ta(I631 +I223 +I632 +I239 +ta(I632 +I239 +I632 +I257 +ta(I632 +I257 +I629 +I275 +ta(I629 +I275 +I625 +I295 +ta(I625 +I295 +I609 +I315 +ta(I609 +I315 +I595 +I333 +ta(I595 +I333 +I577 +I351 +ta(I577 +I351 +I561 +I365 +ta(I561 +I365 +I541 +I370 +ta(I541 +I370 +I523 +I374 +ta(I523 +I374 +I505 +I376 +ta(I505 +I376 +I481 +I378 +ta(I481 +I378 +I461 +I378 +ta(I461 +I378 +I441 +I377 +ta(I441 +I377 +I423 +I374 +ta(I423 +I374 +I409 +I369 +ta(I409 +I369 +I404 +I364 +ta(I404 +I364 +I400 +I358 +ta(I400 +I358 +I398 +I344 +ta(I398 +I344 +I397 +I330 +ta(I397 +I330 +I397 +I316 +ta(I397 +I316 +I398 +I300 +ta(I398 +I300 +I402 +I294 +ta(I402 +I294 +I408 +I290 +ta(I408 +I290 +I414 +I285 +ta(I414 +I285 +I428 +I281 +ta(I428 +I281 +I442 +I278 +ta(I442 +I278 +I458 +I276 +ta(I458 +I276 +I472 +I275 +ta(I472 +I275 +I477 +I275 +ta(I477 +I275 +I483 +I278 +ta(I483 +I278 +I488 +I283 +ta(I488 +I283 +I492 +I288 +ta(I492 +I288 +I495 +I304 +ta(I495 +I304 +I497 +I310 +ta(I497 +I310 +I497 +I326 +ta(I497 +I326 +I498 +I342 +ta(I498 +I342 +I498 +I358 +ta(I498 +I358 +I496 +I374 +ta(I496 +I374 +I494 +I379 +ta(I494 +I379 +I490 +I393 +ta(I490 +I393 +I485 +I397 +ta(I485 +I397 +I480 +I401 +ta(I480 +I401 +I466 +I404 +ta(I466 +I404 +I450 +I405 +ta(I450 +I405 +I434 +I405 +ta(I434 +I405 +I416 +I403 +ta(I416 +I403 +I396 +I399 +ta(I396 +I399 +I380 +I394 +ta(I380 +I394 +I364 +I380 +ta(I364 +I380 +I350 +I364 +ta(I350 +I364 +I345 +I350 +ta(I345 +I350 +I340 +I332 +ta(I340 +I332 +I335 +I314 +ta(I335 +I314 +I332 +I294 +ta(I332 +I294 +I330 +I274 +ta(I330 +I274 +I329 +I254 +ta(I329 +I254 +I329 +I236 +ta(I329 +I236 +I334 +I220 +ta(I334 +I220 +I339 +I206 +ta(I339 +I206 +I355 +I201 +ta(I355 +I201 +I369 +I197 +ta(I369 +I197 +I385 +I195 +ta(I385 +I195 +I407 +I192 +ta(I407 +I192 +I427 +I192 +ta(I427 +I192 +I449 +I193 +ta(I449 +I193 +I469 +I197 +ta(I469 +I197 +I489 +I211 +ta(I489 +I211 +I503 +I225 +ta(I503 +I225 +I506 +I241 +ta(I506 +I241 +I510 +I263 +ta(I510 +I263 +I511 +I281 +ta(I511 +I281 +I511 +I299 +ta(I511 +I299 +I509 +I319 +ta(I509 +I319 +I506 +I339 +ta(I506 +I339 +I492 +I353 +ta(I492 +I353 +I478 +I359 +ta(I478 +I359 +I464 +I363 +ta(I464 +I363 +I450 +I365 +ta(I450 +I365 +I430 +I367 +ta(I430 +I367 +I410 +I367 +ta(I410 +I367 +I386 +I365 +ta(I386 +I365 +I360 +I361 +ta(I360 +I361 +I336 +I355 +ta(I336 +I355 +I312 +I341 +ta(I312 +I341 +I296 +I335 +ta(I296 +I335 +I278 +I315 +ta(I278 +I315 +I274 +I299 +ta(I274 +I299 +I270 +I279 +ta(I270 +I279 +I268 +I261 +ta(I268 +I261 +I268 +I243 +ta(I268 +I243 +I270 +I225 +ta(I270 +I225 +I275 +I211 +ta(I275 +I211 +I289 +I195 +ta(I289 +I195 +I307 +I190 +ta(I307 +I190 +I327 +I184 +ta(I327 +I184 +I351 +I180 +ta(I351 +I180 +I373 +I177 +ta(I373 +I177 +I395 +I176 +ta(I395 +I176 +I419 +I176 +ta(I419 +I176 +I437 +I177 +ta(I437 +I177 +I453 +I180 +ta(I453 +I180 +I457 +I185 +ta(I457 +I185 +I460 +I191 +ta(I460 +I191 +I461 +I205 +ta(I461 +I205 +I461 +I221 +ta(I461 +I221 +I458 +I243 +ta(I458 +I243 +I454 +I261 +ta(I454 +I261 +I448 +I281 +ta(I448 +I281 +I434 +I299 +ta(I434 +I299 +I418 +I317 +ta(I418 +I317 +I412 +I322 +ta(I412 +I322 +I406 +I328 +ta(I406 +I328 +I400 +I331 +ta(I400 +I331 +I386 +I333 +ta(I386 +I333 +I381 +I333 +ta(I381 +I333 +I376 +I331 +ta(I376 +I331 +I362 +I327 +ta(I362 +I327 +I346 +I311 +ta(I346 +I311 +I342 +I297 +ta(I342 +I297 +I336 +I279 +ta(I336 +I279 +I332 +I263 +ta(I332 +I263 +I329 +I245 +ta(I329 +I245 +I327 +I240 +ta(I327 +I240 +I326 +I236 +ta(I326 +I236 +I325 +I232 +ta(I325 +I232 +I324 +I229 +ta(I324 +I229 +I324 +I228 +ta(I324 +I228 +I323 +I227 +tatp4 +a(S'Green' +p5 +I1 +(lp6 +(I100 +I31 +I101 +I31 +ta(I101 +I31 +I106 +I30 +ta(I106 +I30 +I120 +I30 +ta(I120 +I30 +I136 +I29 +ta(I136 +I29 +I156 +I29 +ta(I156 +I29 +I176 +I29 +ta(I176 +I29 +I200 +I29 +ta(I200 +I29 +I222 +I29 +ta(I222 +I29 +I244 +I29 +ta(I244 +I29 +I266 +I31 +ta(I266 +I31 +I284 +I32 +ta(I284 +I32 +I300 +I32 +ta(I300 +I32 +I305 +I33 +ta(I305 +I33 +I307 +I33 +ta(I307 +I33 +I307 +I34 +ta(I307 +I34 +I305 +I34 +ta(I305 +I34 +I287 +I34 +ta(I287 +I34 +I267 +I34 +ta(I267 +I34 +I243 +I34 +ta(I243 +I34 +I211 +I36 +ta(I211 +I36 +I183 +I37 +ta(I183 +I37 +I157 +I38 +ta(I157 +I38 +I131 +I40 +ta(I131 +I40 +I109 +I42 +ta(I109 +I42 +I89 +I43 +ta(I89 +I43 +I71 +I44 +ta(I71 +I44 +I65 +I45 +ta(I65 +I45 +I61 +I47 +ta(I61 +I47 +I59 +I48 +ta(I59 +I48 +I58 +I49 +ta(I58 +I49 +I58 +I50 +ta(I58 +I50 +I60 +I52 +ta(I60 +I52 +I64 +I53 +ta(I64 +I53 +I69 +I54 +ta(I69 +I54 +I87 +I54 +ta(I87 +I54 +I103 +I54 +ta(I103 +I54 +I123 +I54 +ta(I123 +I54 +I149 +I54 +ta(I149 +I54 +I173 +I54 +ta(I173 +I54 +I197 +I53 +ta(I197 +I53 +I219 +I52 +ta(I219 +I52 +I239 +I51 +ta(I239 +I51 +I245 +I50 +ta(I245 +I50 +I249 +I49 +ta(I249 +I49 +I247 +I49 +ta(I247 +I49 +I223 +I49 +ta(I223 +I49 +I201 +I49 +ta(I201 +I49 +I179 +I49 +ta(I179 +I49 +I155 +I51 +ta(I155 +I51 +I131 +I53 +ta(I131 +I53 +I107 +I54 +ta(I107 +I54 +I89 +I56 +ta(I89 +I56 +I71 +I58 +ta(I71 +I58 +I57 +I60 +ta(I57 +I60 +I53 +I62 +ta(I53 +I62 +I51 +I63 +ta(I51 +I63 +I51 +I64 +ta(I51 +I64 +I51 +I65 +ta(I51 +I65 +I52 +I66 +ta(I52 +I66 +I55 +I67 +ta(I55 +I67 +I61 +I67 +ta(I61 +I67 +I67 +I68 +ta(I67 +I68 +I83 +I69 +ta(I83 +I69 +I103 +I70 +ta(I103 +I70 +I125 +I70 +ta(I125 +I70 +I149 +I70 +ta(I149 +I70 +I177 +I70 +ta(I177 +I70 +I205 +I70 +ta(I205 +I70 +I229 +I70 +ta(I229 +I70 +I253 +I70 +ta(I253 +I70 +I257 +I70 +ta(I257 +I70 +I258 +I70 +ta(I258 +I70 +I255 +I70 +ta(I255 +I70 +I237 +I71 +ta(I237 +I71 +I217 +I73 +ta(I217 +I73 +I195 +I74 +ta(I195 +I74 +I165 +I76 +ta(I165 +I76 +I139 +I78 +ta(I139 +I78 +I111 +I79 +ta(I111 +I79 +I83 +I81 +ta(I83 +I81 +I57 +I84 +ta(I57 +I84 +I39 +I86 +ta(I39 +I86 +I25 +I87 +ta(I25 +I87 +I24 +I88 +ta(I24 +I88 +I24 +I89 +ta(I24 +I89 +I25 +I90 +ta(I25 +I90 +I30 +I91 +ta(I30 +I91 +I46 +I92 +ta(I46 +I92 +I66 +I93 +ta(I66 +I93 +I92 +I94 +ta(I92 +I94 +I118 +I94 +ta(I118 +I94 +I148 +I94 +ta(I148 +I94 +I178 +I94 +ta(I178 +I94 +I206 +I94 +ta(I206 +I94 +I230 +I95 +ta(I230 +I95 +I246 +I96 +ta(I246 +I96 +I250 +I97 +ta(I250 +I97 +I251 +I98 +ta(I251 +I98 +I250 +I99 +ta(I250 +I99 +I245 +I101 +ta(I245 +I101 +I229 +I102 +ta(I229 +I102 +I211 +I103 +ta(I211 +I103 +I187 +I105 +ta(I187 +I105 +I163 +I106 +ta(I163 +I106 +I139 +I109 +ta(I139 +I109 +I117 +I112 +ta(I117 +I112 +I99 +I115 +ta(I99 +I115 +I85 +I117 +ta(I85 +I117 +I81 +I120 +ta(I81 +I120 +I77 +I123 +ta(I77 +I123 +I76 +I125 +ta(I76 +I125 +I76 +I127 +ta(I76 +I127 +I79 +I130 +ta(I79 +I130 +I83 +I132 +ta(I83 +I132 +I97 +I135 +ta(I97 +I135 +I113 +I137 +ta(I113 +I137 +I131 +I137 +ta(I131 +I137 +I151 +I137 +ta(I151 +I137 +I175 +I137 +ta(I175 +I137 +I201 +I137 +ta(I201 +I137 +I229 +I137 +ta(I229 +I137 +I255 +I137 +ta(I255 +I137 +I283 +I137 +ta(I283 +I137 +I307 +I137 +ta(I307 +I137 +I312 +I137 +ta(I312 +I137 +I314 +I137 +ta(I314 +I137 +I311 +I137 +ta(I311 +I137 +I293 +I137 +ta(I293 +I137 +I271 +I137 +ta(I271 +I137 +I247 +I137 +ta(I247 +I137 +I217 +I138 +ta(I217 +I138 +I185 +I140 +ta(I185 +I140 +I155 +I142 +ta(I155 +I142 +I129 +I143 +ta(I129 +I143 +I107 +I146 +ta(I107 +I146 +I87 +I149 +ta(I87 +I149 +I82 +I151 +ta(I82 +I151 +I79 +I153 +ta(I79 +I153 +I79 +I154 +ta(I79 +I154 +I80 +I155 +ta(I80 +I155 +I84 +I156 +ta(I84 +I156 +I90 +I156 +ta(I90 +I156 +I112 +I156 +ta(I112 +I156 +I132 +I156 +ta(I132 +I156 +I156 +I154 +ta(I156 +I154 +I180 +I152 +ta(I180 +I152 +I202 +I151 +ta(I202 +I151 +I220 +I150 +ta(I220 +I150 +I234 +I149 +ta(I234 +I149 +I240 +I148 +ta(I240 +I148 +I243 +I148 +ta(I243 +I148 +I244 +I148 +ta(I244 +I148 +I243 +I148 +ta(I243 +I148 +I237 +I149 +ta(I237 +I149 +I219 +I150 +ta(I219 +I150 +I199 +I151 +ta(I199 +I151 +I173 +I153 +ta(I173 +I153 +I149 +I154 +ta(I149 +I154 +I125 +I156 +ta(I125 +I156 +I105 +I159 +ta(I105 +I159 +I89 +I161 +ta(I89 +I161 +I86 +I163 +ta(I86 +I163 +I84 +I165 +ta(I84 +I165 +I84 +I167 +ta(I84 +I167 +I85 +I168 +ta(I85 +I168 +I89 +I171 +ta(I89 +I171 +I95 +I173 +ta(I95 +I173 +I111 +I175 +ta(I111 +I175 +I129 +I177 +ta(I129 +I177 +I149 +I178 +ta(I149 +I178 +I175 +I179 +ta(I175 +I179 +I199 +I180 +ta(I199 +I180 +I225 +I182 +ta(I225 +I182 +I251 +I183 +ta(I251 +I183 +I269 +I184 +ta(I269 +I184 +I274 +I185 +ta(I274 +I185 +I275 +I186 +ta(I275 +I186 +I274 +I186 +ta(I274 +I186 +I269 +I186 +ta(I269 +I186 +I251 +I186 +ta(I251 +I186 +I229 +I186 +ta(I229 +I186 +I201 +I187 +ta(I201 +I187 +I167 +I188 +ta(I167 +I188 +I137 +I191 +ta(I137 +I191 +I107 +I192 +ta(I107 +I192 +I77 +I194 +ta(I77 +I194 +I55 +I197 +ta(I55 +I197 +I41 +I199 +ta(I41 +I199 +I36 +I201 +ta(I36 +I201 +I35 +I202 +ta(I35 +I202 +I37 +I203 +ta(I37 +I203 +I42 +I204 +ta(I42 +I204 +I48 +I204 +ta(I48 +I204 +I64 +I204 +ta(I64 +I204 +I86 +I204 +ta(I86 +I204 +I110 +I204 +ta(I110 +I204 +I136 +I204 +ta(I136 +I204 +I164 +I204 +ta(I164 +I204 +I188 +I204 +ta(I188 +I204 +I208 +I204 +ta(I208 +I204 +I213 +I204 +ta(I213 +I204 +I214 +I204 +ta(I214 +I204 +I211 +I204 +ta(I211 +I204 +I197 +I205 +ta(I197 +I205 +I179 +I205 +ta(I179 +I205 +I155 +I206 +ta(I155 +I206 +I125 +I207 +ta(I125 +I207 +I95 +I207 +ta(I95 +I207 +I69 +I209 +ta(I69 +I209 +I41 +I211 +ta(I41 +I211 +I23 +I212 +ta(I23 +I212 +I9 +I215 +ta(I9 +I215 +I6 +I216 +ta(I6 +I216 +I4 +I218 +ta(I4 +I218 +I5 +I219 +ta(I5 +I219 +I11 +I219 +ta(I11 +I219 +I27 +I220 +ta(I27 +I220 +I47 +I221 +ta(I47 +I221 +I75 +I221 +ta(I75 +I221 +I105 +I221 +ta(I105 +I221 +I137 +I221 +ta(I137 +I221 +I169 +I221 +ta(I169 +I221 +I195 +I221 +ta(I195 +I221 +I219 +I221 +ta(I219 +I221 +I225 +I222 +ta(I225 +I222 +I229 +I223 +ta(I229 +I223 +I227 +I223 +ta(I227 +I223 +I211 +I224 +ta(I211 +I224 +I191 +I225 +ta(I191 +I225 +I163 +I226 +ta(I163 +I226 +I135 +I226 +ta(I135 +I226 +I105 +I228 +ta(I105 +I228 +I73 +I230 +ta(I73 +I230 +I49 +I232 +ta(I49 +I232 +I31 +I234 +ta(I31 +I234 +I26 +I237 +ta(I26 +I237 +I23 +I238 +ta(I23 +I238 +I23 +I240 +ta(I23 +I240 +I24 +I241 +ta(I24 +I241 +I29 +I243 +ta(I29 +I243 +I47 +I244 +ta(I47 +I244 +I69 +I245 +ta(I69 +I245 +I93 +I246 +ta(I93 +I246 +I119 +I246 +ta(I119 +I246 +I147 +I246 +ta(I147 +I246 +I175 +I246 +ta(I175 +I246 +I199 +I246 +ta(I199 +I246 +I217 +I246 +ta(I217 +I246 +I222 +I247 +ta(I222 +I247 +I219 +I247 +ta(I219 +I247 +I201 +I248 +ta(I201 +I248 +I181 +I249 +ta(I181 +I249 +I157 +I251 +ta(I157 +I251 +I127 +I252 +ta(I127 +I252 +I97 +I254 +ta(I97 +I254 +I67 +I256 +ta(I67 +I256 +I45 +I258 +ta(I45 +I258 +I27 +I260 +ta(I27 +I260 +I24 +I262 +ta(I24 +I262 +I24 +I263 +ta(I24 +I263 +I24 +I264 +ta(I24 +I264 +I26 +I266 +ta(I26 +I266 +I30 +I267 +ta(I30 +I267 +I50 +I269 +ta(I50 +I269 +I68 +I270 +ta(I68 +I270 +I92 +I272 +ta(I92 +I272 +I118 +I273 +ta(I118 +I273 +I144 +I274 +ta(I144 +I274 +I170 +I275 +ta(I170 +I275 +I196 +I277 +ta(I196 +I277 +I220 +I278 +ta(I220 +I278 +I226 +I280 +ta(I226 +I280 +I228 +I280 +ta(I228 +I280 +I228 +I281 +ta(I228 +I281 +I227 +I281 +ta(I227 +I281 +I223 +I281 +ta(I223 +I281 +I205 +I281 +ta(I205 +I281 +I181 +I281 +ta(I181 +I281 +I153 +I282 +ta(I153 +I282 +I125 +I284 +ta(I125 +I284 +I105 +I285 +ta(I105 +I285 +I91 +I286 +ta(I91 +I286 +I87 +I287 +ta(I87 +I287 +I85 +I288 +ta(I85 +I288 +I87 +I289 +ta(I87 +I289 +I101 +I289 +ta(I101 +I289 +I117 +I288 +ta(I117 +I288 +I137 +I287 +ta(I137 +I287 +I159 +I285 +ta(I159 +I285 +I183 +I284 +ta(I183 +I284 +I203 +I283 +ta(I203 +I283 +I219 +I282 +ta(I219 +I282 +I222 +I281 +ta(I222 +I281 +I218 +I281 +ta(I218 +I281 +I196 +I282 +ta(I196 +I282 +I176 +I284 +ta(I176 +I284 +I146 +I287 +ta(I146 +I287 +I118 +I289 +ta(I118 +I289 +I92 +I293 +ta(I92 +I293 +I66 +I297 +ta(I66 +I297 +I50 +I300 +ta(I50 +I300 +I36 +I303 +ta(I36 +I303 +I33 +I306 +ta(I33 +I306 +I32 +I308 +ta(I32 +I308 +I33 +I310 +ta(I33 +I310 +I36 +I312 +ta(I36 +I312 +I50 +I314 +ta(I50 +I314 +I66 +I315 +ta(I66 +I315 +I88 +I316 +ta(I88 +I316 +I114 +I316 +ta(I114 +I316 +I140 +I316 +ta(I140 +I316 +I168 +I316 +ta(I168 +I316 +I196 +I316 +ta(I196 +I316 +I220 +I316 +ta(I220 +I316 +I238 +I316 +ta(I238 +I316 +I243 +I316 +ta(I243 +I316 +I242 +I316 +ta(I242 +I316 +I239 +I316 +ta(I239 +I316 +I223 +I317 +ta(I223 +I317 +I203 +I318 +ta(I203 +I318 +I177 +I318 +ta(I177 +I318 +I143 +I318 +ta(I143 +I318 +I111 +I319 +ta(I111 +I319 +I79 +I321 +ta(I79 +I321 +I51 +I323 +ta(I51 +I323 +I31 +I324 +ta(I31 +I324 +I15 +I327 +ta(I15 +I327 +I12 +I329 +ta(I12 +I329 +I11 +I331 +ta(I11 +I331 +I11 +I332 +ta(I11 +I332 +I14 +I334 +ta(I14 +I334 +I20 +I336 +ta(I20 +I336 +I36 +I338 +ta(I36 +I338 +I56 +I339 +ta(I56 +I339 +I82 +I340 +ta(I82 +I340 +I110 +I340 +ta(I110 +I340 +I142 +I340 +ta(I142 +I340 +I174 +I340 +ta(I174 +I340 +I204 +I340 +ta(I204 +I340 +I230 +I340 +ta(I230 +I340 +I254 +I340 +ta(I254 +I340 +I258 +I340 +ta(I258 +I340 +I257 +I340 +ta(I257 +I340 +I254 +I339 +ta(I254 +I339 +I238 +I337 +ta(I238 +I337 +I214 +I336 +ta(I214 +I336 +I178 +I335 +ta(I178 +I335 +I142 +I335 +ta(I142 +I335 +I108 +I335 +ta(I108 +I335 +I78 +I335 +ta(I78 +I335 +I50 +I336 +ta(I50 +I336 +I34 +I338 +ta(I34 +I338 +I30 +I340 +ta(I30 +I340 +I29 +I341 +ta(I29 +I341 +I30 +I342 +ta(I30 +I342 +I34 +I343 +ta(I34 +I343 +I50 +I345 +ta(I50 +I345 +I72 +I345 +ta(I72 +I345 +I96 +I345 +ta(I96 +I345 +I132 +I345 +ta(I132 +I345 +I168 +I345 +ta(I168 +I345 +I202 +I345 +ta(I202 +I345 +I230 +I345 +ta(I230 +I345 +I252 +I345 +ta(I252 +I345 +I258 +I345 +ta(I258 +I345 +I258 +I344 +ta(I258 +I344 +I256 +I344 +ta(I256 +I344 +I240 +I343 +ta(I240 +I343 +I220 +I343 +ta(I220 +I343 +I192 +I343 +ta(I192 +I343 +I160 +I343 +ta(I160 +I343 +I122 +I343 +ta(I122 +I343 +I86 +I344 +ta(I86 +I344 +I54 +I346 +ta(I54 +I346 +I26 +I349 +ta(I26 +I349 +I4 +I352 +ta(I4 +I352 +I0 +I355 +ta(I0 +I355 +I-1 +I358 +ta(I-1 +I358 +I2 +I361 +ta(I2 +I361 +I18 +I363 +ta(I18 +I363 +I40 +I364 +ta(I40 +I364 +I70 +I366 +ta(I70 +I366 +I106 +I367 +ta(I106 +I367 +I140 +I368 +ta(I140 +I368 +I172 +I368 +ta(I172 +I368 +I202 +I368 +ta(I202 +I368 +I222 +I368 +ta(I222 +I368 +I227 +I368 +ta(I227 +I368 +I228 +I369 +ta(I228 +I369 +I227 +I369 +ta(I227 +I369 +I225 +I370 +ta(I225 +I370 +I220 +I371 +ta(I220 +I371 +I206 +I373 +ta(I206 +I373 +I192 +I373 +ta(I192 +I373 +I186 +I374 +ta(I186 +I374 +I183 +I374 +ta(I183 +I374 +I182 +I374 +ta(I182 +I374 +I162 +I372 +ta(I162 +I372 +I138 +I366 +ta(I138 +I366 +I114 +I364 +ta(I114 +I364 +I92 +I364 +ta(I92 +I364 +I68 +I364 +ta(I68 +I364 +I50 +I364 +ta(I50 +I364 +I30 +I364 +ta(I30 +I364 +I8 +I364 +ta(I8 +I364 +I-8 +I365 +ta(I-8 +I365 +I-26 +I367 +ta(I-26 +I367 +I-32 +I370 +ta(I-32 +I370 +I-37 +I374 +ta(I-37 +I374 +I-40 +I378 +ta(I-40 +I378 +I-41 +I381 +ta(I-41 +I381 +I-41 +I385 +ta(I-41 +I385 +I-39 +I388 +ta(I-39 +I388 +I-35 +I391 +ta(I-35 +I391 +I-19 +I393 +ta(I-19 +I393 +I-3 +I394 +ta(I-3 +I394 +I19 +I395 +ta(I19 +I395 +I47 +I396 +ta(I47 +I396 +I79 +I396 +ta(I79 +I396 +I109 +I396 +ta(I109 +I396 +I141 +I396 +ta(I141 +I396 +I169 +I393 +ta(I169 +I393 +I195 +I392 +ta(I195 +I392 +I213 +I390 +ta(I213 +I390 +I217 +I389 +ta(I217 +I389 +I218 +I388 +ta(I218 +I388 +I218 +I387 +ta(I218 +I387 +I215 +I386 +ta(I215 +I386 +I201 +I386 +ta(I201 +I386 +I181 +I386 +ta(I181 +I386 +I153 +I386 +ta(I153 +I386 +I123 +I387 +ta(I123 +I387 +I91 +I389 +ta(I91 +I389 +I63 +I392 +ta(I63 +I392 +I39 +I395 +ta(I39 +I395 +I17 +I398 +ta(I17 +I398 +I3 +I401 +ta(I3 +I401 +I-3 +I404 +ta(I-3 +I404 +I-6 +I407 +ta(I-6 +I407 +I-7 +I410 +ta(I-7 +I410 +I-6 +I412 +ta(I-6 +I412 +I-1 +I415 +ta(I-1 +I415 +I13 +I417 +ta(I13 +I417 +I35 +I419 +ta(I35 +I419 +I59 +I420 +ta(I59 +I420 +I83 +I421 +ta(I83 +I421 +I111 +I422 +ta(I111 +I422 +I137 +I422 +ta(I137 +I422 +I161 +I422 +ta(I161 +I422 +I185 +I424 +ta(I185 +I424 +I191 +I425 +ta(I191 +I425 +I196 +I427 +ta(I196 +I427 +I197 +I429 +ta(I197 +I429 +I197 +I430 +ta(I197 +I430 +I195 +I431 +ta(I195 +I431 +I191 +I432 +ta(I191 +I432 +I173 +I434 +ta(I173 +I434 +I153 +I436 +ta(I153 +I436 +I129 +I438 +ta(I129 +I438 +I101 +I440 +ta(I101 +I440 +I71 +I441 +ta(I71 +I441 +I43 +I444 +ta(I43 +I444 +I19 +I447 +ta(I19 +I447 +I1 +I451 +ta(I1 +I451 +I-13 +I455 +ta(I-13 +I455 +I-16 +I460 +ta(I-16 +I460 +I-17 +I463 +ta(I-17 +I463 +I-17 +I466 +ta(I-17 +I466 +I-14 +I469 +ta(I-14 +I469 +I0 +I471 +ta(I0 +I471 +I16 +I473 +ta(I16 +I473 +I38 +I474 +ta(I38 +I474 +I60 +I474 +ta(I60 +I474 +I86 +I474 +ta(I86 +I474 +I110 +I472 +ta(I110 +I472 +I134 +I471 +ta(I134 +I471 +I154 +I470 +ta(I154 +I470 +I172 +I468 +ta(I172 +I468 +I177 +I467 +ta(I177 +I467 +I181 +I467 +ta(I181 +I467 +I182 +I467 +ta(I182 +I467 +I181 +I467 +ta(I181 +I467 +I178 +I467 +ta(I178 +I467 +I173 +I467 +ta(I173 +I467 +I155 +I468 +ta(I155 +I468 +I133 +I469 +ta(I133 +I469 +I115 +I470 +ta(I115 +I470 +I95 +I472 +ta(I95 +I472 +I79 +I474 +ta(I79 +I474 +I65 +I476 +ta(I65 +I476 +I60 +I478 +ta(I60 +I478 +I57 +I480 +ta(I57 +I480 +I55 +I482 +ta(I55 +I482 +I55 +I483 +ta(I55 +I483 +I55 +I484 +ta(I55 +I484 +I57 +I485 +ta(I57 +I485 +I60 +I486 +ta(I60 +I486 +I74 +I486 +ta(I74 +I486 +I94 +I486 +ta(I94 +I486 +I114 +I485 +ta(I114 +I485 +I138 +I483 +ta(I138 +I483 +I166 +I482 +ta(I166 +I482 +I194 +I480 +ta(I194 +I480 +I218 +I478 +ta(I218 +I478 +I240 +I477 +ta(I240 +I477 +I245 +I476 +ta(I245 +I476 +I247 +I475 +ta(I247 +I475 +I247 +I474 +ta(I247 +I474 +I245 +I473 +ta(I245 +I473 +I231 +I471 +ta(I231 +I471 +I209 +I470 +ta(I209 +I470 +I181 +I468 +ta(I181 +I468 +I149 +I468 +ta(I149 +I468 +I115 +I468 +ta(I115 +I468 +I81 +I468 +ta(I81 +I468 +I55 +I469 +ta(I55 +I469 +I35 +I471 +ta(I35 +I471 +I29 +I473 +ta(I29 +I473 +I27 +I474 +ta(I27 +I474 +I27 +I475 +ta(I27 +I475 +I28 +I476 +ta(I28 +I476 +I32 +I477 +ta(I32 +I477 +I38 +I478 +ta(I38 +I478 +I56 +I479 +ta(I56 +I479 +I80 +I480 +ta(I80 +I480 +I104 +I480 +ta(I104 +I480 +I128 +I480 +ta(I128 +I480 +I158 +I480 +ta(I158 +I480 +I184 +I480 +ta(I184 +I480 +I208 +I481 +ta(I208 +I481 +I228 +I483 +ta(I228 +I483 +I234 +I484 +ta(I234 +I484 +I240 +I485 +ta(I240 +I485 +I241 +I486 +ta(I241 +I486 +I239 +I487 +ta(I239 +I487 +I223 +I488 +ta(I223 +I488 +I203 +I489 +ta(I203 +I489 +I173 +I491 +ta(I173 +I491 +I141 +I492 +ta(I141 +I492 +I105 +I492 +ta(I105 +I492 +I73 +I492 +ta(I73 +I492 +I47 +I494 +ta(I47 +I494 +I31 +I495 +ta(I31 +I495 +I27 +I497 +ta(I27 +I497 +I25 +I498 +ta(I25 +I498 +I26 +I499 +ta(I26 +I499 +I30 +I500 +ta(I30 +I500 +I36 +I501 +ta(I36 +I501 +I56 +I501 +ta(I56 +I501 +I80 +I501 +ta(I80 +I501 +I104 +I501 +ta(I104 +I501 +I130 +I501 +ta(I130 +I501 +I156 +I501 +ta(I156 +I501 +I182 +I501 +ta(I182 +I501 +I208 +I501 +ta(I208 +I501 +I228 +I501 +ta(I228 +I501 +I244 +I502 +ta(I244 +I502 +I246 +I502 +ta(I246 +I502 +I244 +I502 +ta(I244 +I502 +I230 +I503 +ta(I230 +I503 +I212 +I505 +ta(I212 +I505 +I188 +I506 +ta(I188 +I506 +I160 +I508 +ta(I160 +I508 +I132 +I510 +ta(I132 +I510 +I106 +I511 +ta(I106 +I511 +I78 +I515 +ta(I78 +I515 +I58 +I518 +ta(I58 +I518 +I44 +I521 +ta(I44 +I521 +I40 +I524 +ta(I40 +I524 +I38 +I527 +ta(I38 +I527 +I37 +I530 +ta(I37 +I530 +I39 +I531 +ta(I39 +I531 +I41 +I533 +ta(I41 +I533 +I47 +I534 +ta(I47 +I534 +I61 +I535 +ta(I61 +I535 +I77 +I535 +ta(I77 +I535 +I97 +I535 +ta(I97 +I535 +I119 +I535 +ta(I119 +I535 +I141 +I535 +ta(I141 +I535 +I163 +I535 +ta(I163 +I535 +I187 +I535 +ta(I187 +I535 +I207 +I535 +ta(I207 +I535 +I225 +I535 +ta(I225 +I535 +I231 +I535 +ta(I231 +I535 +I234 +I535 +ta(I234 +I535 +I235 +I535 +ta(I235 +I535 +I232 +I535 +ta(I232 +I535 +I216 +I535 +ta(I216 +I535 +I196 +I535 +ta(I196 +I535 +I174 +I536 +ta(I174 +I536 +I150 +I536 +ta(I150 +I536 +I120 +I536 +ta(I120 +I536 +I90 +I538 +ta(I90 +I538 +I64 +I539 +ta(I64 +I539 +I42 +I541 +ta(I42 +I541 +I24 +I542 +ta(I24 +I542 +I22 +I543 +ta(I22 +I543 +I21 +I543 +ta(I21 +I543 +I23 +I543 +ta(I23 +I543 +I27 +I543 +ta(I27 +I543 +I47 +I543 +ta(I47 +I543 +I67 +I543 +ta(I67 +I543 +I91 +I543 +ta(I91 +I543 +I123 +I543 +ta(I123 +I543 +I153 +I543 +ta(I153 +I543 +I187 +I543 +ta(I187 +I543 +I217 +I543 +ta(I217 +I543 +I247 +I543 +ta(I247 +I543 +I281 +I543 +ta(I281 +I543 +I311 +I544 +ta(I311 +I544 +I341 +I544 +ta(I341 +I544 +I373 +I544 +ta(I373 +I544 +I401 +I544 +ta(I401 +I544 +I427 +I544 +ta(I427 +I544 +I451 +I544 +ta(I451 +I544 +I471 +I544 +ta(I471 +I544 +I487 +I543 +ta(I487 +I543 +I491 +I542 +ta(I491 +I542 +I493 +I542 +ta(I493 +I542 +I491 +I541 +ta(I491 +I541 +I477 +I538 +ta(I477 +I538 +I461 +I536 +ta(I461 +I536 +I437 +I534 +ta(I437 +I534 +I405 +I533 +ta(I405 +I533 +I373 +I532 +ta(I373 +I532 +I339 +I532 +ta(I339 +I532 +I309 +I532 +ta(I309 +I532 +I279 +I532 +ta(I279 +I532 +I257 +I532 +ta(I257 +I532 +I251 +I533 +ta(I251 +I533 +I249 +I533 +ta(I249 +I533 +I248 +I533 +ta(I248 +I533 +I250 +I533 +ta(I250 +I533 +I254 +I535 +ta(I254 +I535 +I260 +I536 +ta(I260 +I536 +I278 +I536 +ta(I278 +I536 +I300 +I537 +ta(I300 +I537 +I324 +I537 +ta(I324 +I537 +I348 +I537 +ta(I348 +I537 +I374 +I537 +ta(I374 +I537 +I398 +I537 +ta(I398 +I537 +I420 +I536 +ta(I420 +I536 +I444 +I535 +ta(I444 +I535 +I466 +I535 +ta(I466 +I535 +I486 +I535 +ta(I486 +I535 +I504 +I535 +ta(I504 +I535 +I510 +I535 +ta(I510 +I535 +I513 +I535 +ta(I513 +I535 +I514 +I535 +ta(I514 +I535 +I511 +I535 +ta(I511 +I535 +I493 +I534 +ta(I493 +I534 +I467 +I533 +ta(I467 +I533 +I435 +I532 +ta(I435 +I532 +I399 +I532 +ta(I399 +I532 +I355 +I531 +ta(I355 +I531 +I307 +I530 +ta(I307 +I530 +I269 +I530 +ta(I269 +I530 +I237 +I530 +ta(I237 +I530 +I209 +I530 +ta(I209 +I530 +I191 +I530 +ta(I191 +I530 +I186 +I530 +ta(I186 +I530 +I184 +I530 +ta(I184 +I530 +I187 +I529 +ta(I187 +I529 +I201 +I529 +ta(I201 +I529 +I221 +I527 +ta(I221 +I527 +I243 +I526 +ta(I243 +I526 +I269 +I524 +ta(I269 +I524 +I305 +I523 +ta(I305 +I523 +I333 +I521 +ta(I333 +I521 +I363 +I519 +ta(I363 +I519 +I393 +I517 +ta(I393 +I517 +I417 +I516 +ta(I417 +I516 +I439 +I515 +ta(I439 +I515 +I444 +I514 +ta(I444 +I514 +I445 +I513 +ta(I445 +I513 +I442 +I513 +ta(I442 +I513 +I422 +I512 +ta(I422 +I512 +I398 +I512 +ta(I398 +I512 +I370 +I512 +ta(I370 +I512 +I334 +I511 +ta(I334 +I511 +I296 +I511 +ta(I296 +I511 +I266 +I511 +ta(I266 +I511 +I236 +I511 +ta(I236 +I511 +I216 +I511 +ta(I216 +I511 +I211 +I510 +ta(I211 +I510 +I208 +I509 +ta(I208 +I509 +I208 +I508 +ta(I208 +I508 +I210 +I507 +ta(I210 +I507 +I224 +I505 +ta(I224 +I505 +I244 +I502 +ta(I244 +I502 +I268 +I500 +ta(I268 +I500 +I304 +I497 +ta(I304 +I497 +I346 +I495 +ta(I346 +I495 +I388 +I492 +ta(I388 +I492 +I428 +I490 +ta(I428 +I490 +I466 +I487 +ta(I466 +I487 +I492 +I485 +ta(I492 +I485 +I512 +I484 +ta(I512 +I484 +I516 +I482 +ta(I516 +I482 +I516 +I481 +ta(I516 +I481 +I513 +I479 +ta(I513 +I479 +I499 +I476 +ta(I499 +I476 +I475 +I475 +ta(I475 +I475 +I445 +I474 +ta(I445 +I474 +I403 +I473 +ta(I403 +I473 +I357 +I472 +ta(I357 +I472 +I313 +I471 +ta(I313 +I471 +I269 +I471 +ta(I269 +I471 +I235 +I471 +ta(I235 +I471 +I207 +I471 +ta(I207 +I471 +I191 +I471 +ta(I191 +I471 +I189 +I471 +ta(I189 +I471 +I194 +I471 +ta(I194 +I471 +I214 +I470 +ta(I214 +I470 +I240 +I468 +ta(I240 +I468 +I274 +I466 +ta(I274 +I466 +I316 +I463 +ta(I316 +I463 +I354 +I461 +ta(I354 +I461 +I396 +I459 +ta(I396 +I459 +I434 +I457 +ta(I434 +I457 +I462 +I456 +ta(I462 +I456 +I478 +I455 +ta(I478 +I455 +I498 +I454 +ta(I498 +I454 +I502 +I453 +ta(I502 +I453 +I499 +I452 +ta(I499 +I452 +I477 +I451 +ta(I477 +I451 +I451 +I451 +ta(I451 +I451 +I447 +I451 +ta(I447 +I451 +I415 +I450 +ta(I415 +I450 +I375 +I449 +ta(I375 +I449 +I339 +I449 +ta(I339 +I449 +I307 +I449 +ta(I307 +I449 +I281 +I449 +ta(I281 +I449 +I267 +I449 +ta(I267 +I449 +I266 +I448 +ta(I266 +I448 +I267 +I448 +ta(I267 +I448 +I273 +I446 +ta(I273 +I446 +I291 +I444 +ta(I291 +I444 +I315 +I440 +ta(I315 +I440 +I349 +I436 +ta(I349 +I436 +I385 +I432 +ta(I385 +I432 +I425 +I427 +ta(I425 +I427 +I459 +I423 +ta(I459 +I423 +I493 +I419 +ta(I493 +I419 +I519 +I416 +ta(I519 +I416 +I543 +I414 +ta(I543 +I414 +I548 +I413 +ta(I548 +I413 +I548 +I412 +ta(I548 +I412 +I547 +I412 +ta(I547 +I412 +I531 +I410 +ta(I531 +I410 +I511 +I410 +ta(I511 +I410 +I483 +I410 +ta(I483 +I410 +I449 +I410 +ta(I449 +I410 +I419 +I410 +ta(I419 +I410 +I381 +I410 +ta(I381 +I410 +I345 +I410 +ta(I345 +I410 +I317 +I410 +ta(I317 +I410 +I297 +I410 +ta(I297 +I410 +I292 +I410 +ta(I292 +I410 +I294 +I410 +ta(I294 +I410 +I308 +I409 +ta(I308 +I409 +I332 +I406 +ta(I332 +I406 +I356 +I404 +ta(I356 +I404 +I384 +I402 +ta(I384 +I402 +I418 +I400 +ta(I418 +I400 +I446 +I398 +ta(I446 +I398 +I472 +I396 +ta(I472 +I396 +I496 +I394 +ta(I496 +I394 +I512 +I391 +ta(I512 +I391 +I514 +I390 +ta(I514 +I390 +I514 +I389 +ta(I514 +I389 +I511 +I387 +ta(I511 +I387 +I497 +I385 +ta(I497 +I385 +I477 +I384 +ta(I477 +I384 +I445 +I384 +ta(I445 +I384 +I409 +I384 +ta(I409 +I384 +I375 +I384 +ta(I375 +I384 +I335 +I384 +ta(I335 +I384 +I297 +I384 +ta(I297 +I384 +I269 +I384 +ta(I269 +I384 +I243 +I384 +ta(I243 +I384 +I229 +I384 +ta(I229 +I384 +I226 +I382 +ta(I226 +I382 +I228 +I381 +ta(I228 +I381 +I244 +I378 +ta(I244 +I378 +I266 +I375 +ta(I266 +I375 +I292 +I372 +ta(I292 +I372 +I326 +I367 +ta(I326 +I367 +I362 +I364 +ta(I362 +I364 +I400 +I359 +ta(I400 +I359 +I434 +I356 +ta(I434 +I356 +I464 +I353 +ta(I464 +I353 +I494 +I349 +ta(I494 +I349 +I516 +I347 +ta(I516 +I347 +I521 +I346 +ta(I521 +I346 +I522 +I345 +ta(I522 +I345 +I521 +I345 +ta(I521 +I345 +I516 +I344 +ta(I516 +I344 +I498 +I344 +ta(I498 +I344 +I472 +I345 +ta(I472 +I345 +I438 +I346 +ta(I438 +I346 +I398 +I347 +ta(I398 +I347 +I356 +I348 +ta(I356 +I348 +I322 +I350 +ta(I322 +I350 +I288 +I352 +ta(I288 +I352 +I262 +I353 +ta(I262 +I353 +I240 +I355 +ta(I240 +I355 +I236 +I355 +ta(I236 +I355 +I235 +I356 +ta(I235 +I356 +I236 +I356 +ta(I236 +I356 +I242 +I356 +ta(I242 +I356 +I260 +I355 +ta(I260 +I355 +I286 +I353 +ta(I286 +I353 +I312 +I349 +ta(I312 +I349 +I348 +I347 +ta(I348 +I347 +I380 +I345 +ta(I380 +I345 +I420 +I342 +ta(I420 +I342 +I454 +I340 +ta(I454 +I340 +I486 +I338 +ta(I486 +I338 +I512 +I334 +ta(I512 +I334 +I534 +I332 +ta(I534 +I332 +I539 +I330 +ta(I539 +I330 +I541 +I329 +ta(I541 +I329 +I538 +I328 +ta(I538 +I328 +I516 +I328 +ta(I516 +I328 +I494 +I328 +ta(I494 +I328 +I464 +I328 +ta(I464 +I328 +I426 +I328 +ta(I426 +I328 +I392 +I328 +ta(I392 +I328 +I360 +I328 +ta(I360 +I328 +I330 +I328 +ta(I330 +I328 +I306 +I328 +ta(I306 +I328 +I292 +I328 +ta(I292 +I328 +I290 +I327 +ta(I290 +I327 +I290 +I326 +ta(I290 +I326 +I291 +I326 +ta(I291 +I326 +I296 +I324 +ta(I296 +I324 +I314 +I321 +ta(I314 +I321 +I334 +I318 +ta(I334 +I318 +I360 +I315 +ta(I360 +I315 +I388 +I311 +ta(I388 +I311 +I416 +I308 +ta(I416 +I308 +I444 +I304 +ta(I444 +I304 +I472 +I301 +ta(I472 +I301 +I496 +I298 +ta(I496 +I298 +I516 +I295 +ta(I516 +I295 +I520 +I293 +ta(I520 +I293 +I522 +I291 +ta(I522 +I291 +I522 +I290 +ta(I522 +I290 +I519 +I288 +ta(I519 +I288 +I503 +I286 +ta(I503 +I286 +I483 +I285 +ta(I483 +I285 +I457 +I285 +ta(I457 +I285 +I425 +I285 +ta(I425 +I285 +I385 +I285 +ta(I385 +I285 +I353 +I285 +ta(I353 +I285 +I317 +I287 +ta(I317 +I287 +I289 +I288 +ta(I289 +I288 +I267 +I290 +ta(I267 +I290 +I263 +I291 +ta(I263 +I291 +I262 +I291 +ta(I262 +I291 +I266 +I291 +ta(I266 +I291 +I286 +I290 +ta(I286 +I290 +I308 +I288 +ta(I308 +I288 +I334 +I286 +ta(I334 +I286 +I368 +I284 +ta(I368 +I284 +I406 +I281 +ta(I406 +I281 +I438 +I279 +ta(I438 +I279 +I470 +I277 +ta(I470 +I277 +I496 +I275 +ta(I496 +I275 +I512 +I274 +ta(I512 +I274 +I515 +I272 +ta(I515 +I272 +I515 +I271 +ta(I515 +I271 +I513 +I270 +ta(I513 +I270 +I499 +I269 +ta(I499 +I269 +I477 +I267 +ta(I477 +I267 +I451 +I266 +ta(I451 +I266 +I423 +I266 +ta(I423 +I266 +I389 +I266 +ta(I389 +I266 +I355 +I266 +ta(I355 +I266 +I327 +I266 +ta(I327 +I266 +I305 +I265 +ta(I305 +I265 +I299 +I263 +ta(I299 +I263 +I298 +I262 +ta(I298 +I262 +I298 +I261 +ta(I298 +I261 +I301 +I258 +ta(I301 +I258 +I307 +I254 +ta(I307 +I254 +I329 +I249 +ta(I329 +I249 +I351 +I244 +ta(I351 +I244 +I375 +I239 +ta(I375 +I239 +I401 +I233 +ta(I401 +I233 +I431 +I228 +ta(I431 +I228 +I457 +I214 +ta(I457 +I214 +I477 +I211 +ta(I477 +I211 +I495 +I206 +ta(I495 +I206 +I499 +I202 +ta(I499 +I202 +I500 +I199 +ta(I500 +I199 +I500 +I196 +ta(I500 +I196 +I497 +I194 +ta(I497 +I194 +I483 +I193 +ta(I483 +I193 +I467 +I191 +ta(I467 +I191 +I445 +I191 +ta(I445 +I191 +I419 +I191 +ta(I419 +I191 +I395 +I192 +ta(I395 +I192 +I369 +I194 +ta(I369 +I194 +I347 +I195 +ta(I347 +I195 +I329 +I196 +ta(I329 +I196 +I324 +I197 +ta(I324 +I197 +I320 +I198 +ta(I320 +I198 +I323 +I198 +ta(I323 +I198 +I343 +I195 +ta(I343 +I195 +I361 +I193 +ta(I361 +I193 +I379 +I190 +ta(I379 +I190 +I397 +I187 +ta(I397 +I187 +I417 +I185 +ta(I417 +I185 +I435 +I182 +ta(I435 +I182 +I451 +I180 +ta(I451 +I180 +I456 +I178 +ta(I456 +I178 +I458 +I177 +ta(I458 +I177 +I459 +I176 +ta(I459 +I176 +I458 +I176 +ta(I458 +I176 +I454 +I176 +ta(I454 +I176 +I438 +I177 +ta(I438 +I177 +I418 +I178 +ta(I418 +I178 +I396 +I181 +ta(I396 +I181 +I372 +I185 +ta(I372 +I185 +I344 +I188 +ta(I344 +I188 +I318 +I192 +ta(I318 +I192 +I294 +I195 +ta(I294 +I195 +I276 +I198 +ta(I276 +I198 +I272 +I200 +ta(I272 +I200 +I271 +I201 +ta(I271 +I201 +I274 +I201 +ta(I274 +I201 +I290 +I199 +ta(I290 +I199 +I310 +I196 +ta(I310 +I196 +I332 +I193 +ta(I332 +I193 +I352 +I190 +ta(I352 +I190 +I376 +I187 +ta(I376 +I187 +I396 +I185 +ta(I396 +I185 +I412 +I182 +ta(I412 +I182 +I428 +I181 +ta(I428 +I181 +I429 +I180 +ta(I429 +I180 +I430 +I180 +ta(I430 +I180 +I428 +I180 +ta(I428 +I180 +I414 +I180 +ta(I414 +I180 +I396 +I182 +ta(I396 +I182 +I372 +I185 +ta(I372 +I185 +I346 +I188 +ta(I346 +I188 +I316 +I192 +ta(I316 +I192 +I290 +I194 +ta(I290 +I194 +I268 +I197 +ta(I268 +I197 +I250 +I200 +ta(I250 +I200 +I236 +I202 +ta(I236 +I202 +I231 +I203 +ta(I231 +I203 +I228 +I204 +ta(I228 +I204 +I226 +I204 +ta(I226 +I204 +I228 +I204 +ta(I228 +I204 +I234 +I202 +ta(I234 +I202 +I250 +I200 +ta(I250 +I200 +I270 +I197 +ta(I270 +I197 +I296 +I193 +ta(I296 +I193 +I324 +I189 +ta(I324 +I189 +I356 +I185 +ta(I356 +I185 +I392 +I181 +ta(I392 +I181 +I420 +I177 +ta(I420 +I177 +I446 +I175 +ta(I446 +I175 +I468 +I174 +ta(I468 +I174 +I471 +I174 +ta(I471 +I174 +I472 +I174 +ta(I472 +I174 +I471 +I174 +ta(I471 +I174 +I466 +I178 +ta(I466 +I178 +I448 +I181 +ta(I448 +I181 +I420 +I185 +ta(I420 +I185 +I390 +I189 +ta(I390 +I189 +I354 +I194 +ta(I354 +I194 +I318 +I197 +ta(I318 +I197 +I276 +I199 +ta(I276 +I199 +I246 +I201 +ta(I246 +I201 +I216 +I203 +ta(I216 +I203 +I190 +I204 +ta(I190 +I204 +I172 +I205 +ta(I172 +I205 +I166 +I206 +ta(I166 +I206 +I164 +I206 +ta(I164 +I206 +I164 +I207 +ta(I164 +I207 +I168 +I207 +ta(I168 +I207 +I188 +I207 +ta(I188 +I207 +I208 +I208 +ta(I208 +I208 +I232 +I208 +ta(I232 +I208 +I262 +I208 +ta(I262 +I208 +I294 +I209 +ta(I294 +I209 +I328 +I210 +ta(I328 +I210 +I358 +I212 +ta(I358 +I212 +I392 +I215 +ta(I392 +I215 +I424 +I217 +ta(I424 +I217 +I454 +I220 +ta(I454 +I220 +I478 +I223 +ta(I478 +I223 +I484 +I227 +ta(I484 +I227 +I485 +I229 +ta(I485 +I229 +I484 +I232 +ta(I484 +I232 +I478 +I235 +ta(I478 +I235 +I458 +I240 +ta(I458 +I240 +I426 +I244 +ta(I426 +I244 +I390 +I248 +ta(I390 +I248 +I352 +I253 +ta(I352 +I253 +I308 +I258 +ta(I308 +I258 +I276 +I261 +ta(I276 +I261 +I250 +I264 +ta(I250 +I264 +I226 +I268 +ta(I226 +I268 +I212 +I270 +ta(I212 +I270 +I208 +I272 +ta(I208 +I272 +I207 +I273 +ta(I207 +I273 +I206 +I273 +ta(I206 +I273 +I207 +I274 +ta(I207 +I274 +I213 +I274 +ta(I213 +I274 +I231 +I272 +ta(I231 +I272 +I255 +I269 +ta(I255 +I269 +I281 +I266 +ta(I281 +I266 +I309 +I263 +ta(I309 +I263 +I343 +I259 +ta(I343 +I259 +I373 +I255 +ta(I373 +I255 +I403 +I252 +ta(I403 +I252 +I429 +I248 +ta(I429 +I248 +I451 +I246 +ta(I451 +I246 +I467 +I243 +ta(I467 +I243 +I471 +I241 +ta(I471 +I241 +I469 +I240 +ta(I469 +I240 +I453 +I240 +ta(I453 +I240 +I433 +I240 +ta(I433 +I240 +I405 +I240 +ta(I405 +I240 +I375 +I242 +ta(I375 +I242 +I337 +I244 +ta(I337 +I244 +I305 +I246 +ta(I305 +I246 +I269 +I247 +ta(I269 +I247 +I239 +I249 +ta(I239 +I249 +I213 +I249 +ta(I213 +I249 +I189 +I249 +ta(I189 +I249 +I175 +I250 +ta(I175 +I250 +I173 +I251 +ta(I173 +I251 +I174 +I251 +ta(I174 +I251 +I188 +I247 +ta(I188 +I247 +I210 +I244 +ta(I210 +I244 +I238 +I239 +ta(I238 +I239 +I272 +I233 +ta(I272 +I233 +I304 +I230 +ta(I304 +I230 +I342 +I216 +ta(I342 +I216 +I380 +I202 +ta(I380 +I202 +I410 +I188 +ta(I410 +I188 +I440 +I174 +ta(I440 +I174 +I464 +I168 +ta(I464 +I168 +I480 +I164 +ta(I480 +I164 +I484 +I160 +ta(I484 +I160 +I484 +I158 +ta(I484 +I158 +I482 +I156 +ta(I482 +I156 +I468 +I154 +ta(I468 +I154 +I446 +I152 +ta(I446 +I152 +I418 +I152 +ta(I418 +I152 +I384 +I152 +ta(I384 +I152 +I340 +I152 +ta(I340 +I152 +I300 +I153 +ta(I300 +I153 +I268 +I155 +ta(I268 +I155 +I238 +I157 +ta(I238 +I157 +I220 +I158 +ta(I220 +I158 +I218 +I158 +ta(I218 +I158 +I219 +I158 +ta(I219 +I158 +I235 +I157 +ta(I235 +I157 +I255 +I154 +ta(I255 +I154 +I281 +I151 +ta(I281 +I151 +I313 +I147 +ta(I313 +I147 +I345 +I144 +ta(I345 +I144 +I377 +I140 +ta(I377 +I140 +I407 +I137 +ta(I407 +I137 +I431 +I134 +ta(I431 +I134 +I449 +I132 +ta(I449 +I132 +I451 +I131 +ta(I451 +I131 +I452 +I131 +ta(I452 +I131 +I449 +I131 +ta(I449 +I131 +I431 +I131 +ta(I431 +I131 +I407 +I132 +ta(I407 +I132 +I379 +I134 +ta(I379 +I134 +I347 +I135 +ta(I347 +I135 +I315 +I138 +ta(I315 +I138 +I281 +I140 +ta(I281 +I140 +I257 +I141 +ta(I257 +I141 +I237 +I142 +ta(I237 +I142 +I232 +I143 +ta(I232 +I143 +I231 +I143 +ta(I231 +I143 +I234 +I143 +ta(I234 +I143 +I256 +I139 +ta(I256 +I139 +I278 +I134 +ta(I278 +I134 +I306 +I120 +ta(I306 +I120 +I348 +I106 +ta(I348 +I106 +I384 +I100 +ta(I384 +I100 +I422 +I95 +ta(I422 +I95 +I448 +I91 +ta(I448 +I91 +I468 +I88 +ta(I468 +I88 +I473 +I85 +ta(I473 +I85 +I475 +I83 +ta(I475 +I83 +I474 +I82 +ta(I474 +I82 +I456 +I82 +ta(I456 +I82 +I434 +I84 +ta(I434 +I84 +I406 +I86 +ta(I406 +I86 +I372 +I87 +ta(I372 +I87 +I340 +I89 +ta(I340 +I89 +I310 +I91 +ta(I310 +I91 +I280 +I93 +ta(I280 +I93 +I260 +I95 +ta(I260 +I95 +I257 +I95 +ta(I257 +I95 +I260 +I95 +ta(I260 +I95 +I282 +I92 +ta(I282 +I92 +I302 +I89 +ta(I302 +I89 +I326 +I86 +ta(I326 +I86 +I350 +I82 +ta(I350 +I82 +I378 +I76 +ta(I378 +I76 +I402 +I72 +ta(I402 +I72 +I426 +I68 +ta(I426 +I68 +I448 +I64 +ta(I448 +I64 +I453 +I62 +ta(I453 +I62 +I456 +I60 +ta(I456 +I60 +I457 +I60 +ta(I457 +I60 +I453 +I60 +ta(I453 +I60 +I435 +I60 +ta(I435 +I60 +I417 +I60 +ta(I417 +I60 +I397 +I60 +ta(I397 +I60 +I377 +I60 +ta(I377 +I60 +I361 +I60 +ta(I361 +I60 +I355 +I61 +ta(I355 +I61 +I352 +I61 +ta(I352 +I61 +I350 +I62 +ta(I350 +I62 +I353 +I62 +ta(I353 +I62 +I371 +I59 +ta(I371 +I59 +I387 +I57 +ta(I387 +I57 +I405 +I53 +ta(I405 +I53 +I425 +I49 +ta(I425 +I49 +I443 +I44 +ta(I443 +I44 +I463 +I40 +ta(I463 +I40 +I483 +I35 +ta(I483 +I35 +I501 +I31 +ta(I501 +I31 +I515 +I28 +ta(I515 +I28 +I518 +I25 +ta(I518 +I25 +I521 +I24 +ta(I521 +I24 +I521 +I23 +ta(I521 +I23 +I517 +I22 +ta(I517 +I22 +I501 +I22 +ta(I501 +I22 +I483 +I23 +ta(I483 +I23 +I455 +I25 +ta(I455 +I25 +I427 +I27 +ta(I427 +I27 +I395 +I31 +ta(I395 +I31 +I363 +I35 +ta(I363 +I35 +I339 +I38 +ta(I339 +I38 +I321 +I40 +ta(I321 +I40 +I316 +I41 +ta(I316 +I41 +I315 +I42 +ta(I315 +I42 +I317 +I40 +ta(I317 +I40 +I333 +I36 +ta(I333 +I36 +I353 +I33 +ta(I353 +I33 +I373 +I30 +ta(I373 +I30 +I397 +I27 +ta(I397 +I27 +I421 +I23 +ta(I421 +I23 +I449 +I20 +ta(I449 +I20 +I477 +I18 +ta(I477 +I18 +I507 +I16 +ta(I507 +I16 +I543 +I14 +ta(I543 +I14 +I571 +I13 +ta(I571 +I13 +I601 +I11 +ta(I601 +I11 +I629 +I10 +ta(I629 +I10 +I649 +I10 +ta(I649 +I10 +I665 +I10 +ta(I665 +I10 +I667 +I11 +ta(I667 +I11 +I668 +I12 +ta(I668 +I12 +I667 +I13 +ta(I667 +I13 +I664 +I15 +ta(I664 +I15 +I650 +I19 +ta(I650 +I19 +I628 +I23 +ta(I628 +I23 +I604 +I29 +ta(I604 +I29 +I576 +I35 +ta(I576 +I35 +I548 +I40 +ta(I548 +I40 +I520 +I46 +ta(I520 +I46 +I492 +I51 +ta(I492 +I51 +I462 +I65 +ta(I462 +I65 +I434 +I71 +ta(I434 +I71 +I406 +I77 +ta(I406 +I77 +I380 +I81 +ta(I380 +I81 +I362 +I84 +ta(I362 +I84 +I357 +I87 +ta(I357 +I87 +I355 +I88 +ta(I355 +I88 +I361 +I88 +ta(I361 +I88 +I381 +I88 +ta(I381 +I88 +I403 +I85 +ta(I403 +I85 +I433 +I82 +ta(I433 +I82 +I467 +I78 +ta(I467 +I78 +I511 +I73 +ta(I511 +I73 +I549 +I68 +ta(I549 +I68 +I583 +I65 +ta(I583 +I65 +I619 +I60 +ta(I619 +I60 +I649 +I57 +ta(I649 +I57 +I673 +I55 +ta(I673 +I55 +I691 +I54 +ta(I691 +I54 +I692 +I53 +ta(I692 +I53 +I693 +I53 +ta(I693 +I53 +I692 +I53 +ta(I692 +I53 +I687 +I54 +ta(I687 +I54 +I671 +I56 +ta(I671 +I56 +I645 +I60 +ta(I645 +I60 +I613 +I63 +ta(I613 +I63 +I579 +I68 +ta(I579 +I68 +I549 +I71 +ta(I549 +I71 +I515 +I75 +ta(I515 +I75 +I489 +I79 +ta(I489 +I79 +I469 +I82 +ta(I469 +I82 +I455 +I84 +ta(I455 +I84 +I455 +I85 +ta(I455 +I85 +I459 +I85 +ta(I459 +I85 +I475 +I84 +ta(I475 +I84 +I499 +I81 +ta(I499 +I81 +I529 +I78 +ta(I529 +I78 +I571 +I74 +ta(I571 +I74 +I611 +I70 +ta(I611 +I70 +I649 +I66 +ta(I649 +I66 +I681 +I63 +ta(I681 +I63 +I707 +I59 +ta(I707 +I59 +I729 +I58 +ta(I729 +I58 +I733 +I57 +ta(I733 +I57 +I732 +I57 +ta(I732 +I57 +I726 +I57 +ta(I726 +I57 +I706 +I60 +ta(I706 +I60 +I680 +I63 +ta(I680 +I63 +I648 +I67 +ta(I648 +I67 +I608 +I71 +ta(I608 +I71 +I568 +I76 +ta(I568 +I76 +I536 +I79 +ta(I536 +I79 +I504 +I83 +ta(I504 +I83 +I482 +I87 +ta(I482 +I87 +I476 +I89 +ta(I476 +I89 +I475 +I90 +ta(I475 +I90 +I474 +I90 +ta(I474 +I90 +I477 +I90 +ta(I477 +I90 +I493 +I88 +ta(I493 +I88 +I517 +I86 +ta(I517 +I86 +I545 +I82 +ta(I545 +I82 +I577 +I79 +ta(I577 +I79 +I615 +I77 +ta(I615 +I77 +I645 +I75 +ta(I645 +I75 +I675 +I73 +ta(I675 +I73 +I701 +I72 +ta(I701 +I72 +I719 +I71 +ta(I719 +I71 +I721 +I71 +ta(I721 +I71 +I722 +I71 +ta(I722 +I71 +I720 +I72 +ta(I720 +I72 +I706 +I74 +ta(I706 +I74 +I686 +I77 +ta(I686 +I77 +I658 +I82 +ta(I658 +I82 +I624 +I87 +ta(I624 +I87 +I586 +I92 +ta(I586 +I92 +I552 +I96 +ta(I552 +I96 +I524 +I102 +ta(I524 +I102 +I498 +I108 +ta(I498 +I108 +I480 +I113 +ta(I480 +I113 +I476 +I116 +ta(I476 +I116 +I475 +I118 +ta(I475 +I118 +I474 +I120 +ta(I474 +I120 +I477 +I121 +ta(I477 +I121 +I483 +I121 +ta(I483 +I121 +I503 +I121 +ta(I503 +I121 +I525 +I120 +ta(I525 +I120 +I549 +I118 +ta(I549 +I118 +I575 +I116 +ta(I575 +I116 +I603 +I115 +ta(I603 +I115 +I629 +I113 +ta(I629 +I113 +I653 +I113 +ta(I653 +I113 +I671 +I113 +ta(I671 +I113 +I676 +I113 +ta(I676 +I113 +I677 +I114 +ta(I677 +I114 +I677 +I115 +ta(I677 +I115 +I675 +I118 +ta(I675 +I118 +I671 +I121 +ta(I671 +I121 +I651 +I125 +ta(I651 +I125 +I629 +I131 +ta(I629 +I131 +I599 +I136 +ta(I599 +I136 +I567 +I150 +ta(I567 +I150 +I533 +I156 +ta(I533 +I156 +I505 +I161 +ta(I505 +I161 +I479 +I167 +ta(I479 +I167 +I463 +I173 +ta(I463 +I173 +I460 +I175 +ta(I460 +I175 +I459 +I177 +ta(I459 +I177 +I459 +I178 +ta(I459 +I178 +I462 +I179 +ta(I462 +I179 +I476 +I180 +ta(I476 +I180 +I492 +I178 +ta(I492 +I178 +I516 +I177 +ta(I516 +I177 +I540 +I174 +ta(I540 +I174 +I568 +I171 +ta(I568 +I171 +I598 +I167 +ta(I598 +I167 +I626 +I163 +ta(I626 +I163 +I652 +I160 +ta(I652 +I160 +I678 +I157 +ta(I678 +I157 +I694 +I156 +ta(I694 +I156 +I697 +I155 +ta(I697 +I155 +I695 +I155 +ta(I695 +I155 +I675 +I155 +ta(I675 +I155 +I653 +I157 +ta(I653 +I157 +I625 +I160 +ta(I625 +I160 +I591 +I164 +ta(I591 +I164 +I553 +I168 +ta(I553 +I168 +I521 +I172 +ta(I521 +I172 +I491 +I177 +ta(I491 +I177 +I467 +I180 +ta(I467 +I180 +I453 +I184 +ta(I453 +I184 +I449 +I187 +ta(I449 +I187 +I449 +I188 +ta(I449 +I188 +I449 +I190 +ta(I449 +I190 +I455 +I190 +ta(I455 +I190 +I471 +I190 +ta(I471 +I190 +I495 +I189 +ta(I495 +I189 +I521 +I186 +ta(I521 +I186 +I551 +I184 +ta(I551 +I184 +I589 +I182 +ta(I589 +I182 +I617 +I180 +ta(I617 +I180 +I647 +I178 +ta(I647 +I178 +I673 +I177 +ta(I673 +I177 +I693 +I176 +ta(I693 +I176 +I696 +I176 +ta(I696 +I176 +I691 +I176 +ta(I691 +I176 +I669 +I180 +ta(I669 +I180 +I641 +I183 +ta(I641 +I183 +I607 +I187 +ta(I607 +I187 +I571 +I190 +ta(I571 +I190 +I529 +I194 +ta(I529 +I194 +I491 +I200 +ta(I491 +I200 +I461 +I203 +ta(I461 +I203 +I445 +I206 +ta(I445 +I206 +I442 +I209 +ta(I442 +I209 +I442 +I211 +ta(I442 +I211 +I443 +I212 +ta(I443 +I212 +I447 +I214 +ta(I447 +I214 +I465 +I215 +ta(I465 +I215 +I483 +I216 +ta(I483 +I216 +I507 +I216 +ta(I507 +I216 +I535 +I216 +ta(I535 +I216 +I565 +I216 +ta(I565 +I216 +I599 +I216 +ta(I599 +I216 +I625 +I216 +ta(I625 +I216 +I649 +I217 +ta(I649 +I217 +I667 +I219 +ta(I667 +I219 +I673 +I220 +ta(I673 +I220 +I676 +I222 +ta(I676 +I222 +I676 +I223 +ta(I676 +I223 +I674 +I224 +ta(I674 +I224 +I670 +I226 +ta(I670 +I226 +I650 +I229 +ta(I650 +I229 +I624 +I232 +ta(I624 +I232 +I592 +I235 +ta(I592 +I235 +I556 +I239 +ta(I556 +I239 +I518 +I243 +ta(I518 +I243 +I486 +I247 +ta(I486 +I247 +I462 +I250 +ta(I462 +I250 +I446 +I253 +ta(I446 +I253 +I443 +I255 +ta(I443 +I255 +I442 +I256 +ta(I442 +I256 +I443 +I257 +ta(I443 +I257 +I457 +I257 +ta(I457 +I257 +I475 +I257 +ta(I475 +I257 +I497 +I257 +ta(I497 +I257 +I523 +I257 +ta(I523 +I257 +I551 +I257 +ta(I551 +I257 +I583 +I257 +ta(I583 +I257 +I607 +I257 +ta(I607 +I257 +I629 +I256 +ta(I629 +I256 +I635 +I256 +ta(I635 +I256 +I637 +I256 +ta(I637 +I256 +I633 +I257 +ta(I633 +I257 +I615 +I259 +ta(I615 +I259 +I593 +I261 +ta(I593 +I261 +I561 +I265 +ta(I561 +I265 +I525 +I268 +ta(I525 +I268 +I493 +I271 +ta(I493 +I271 +I457 +I276 +ta(I457 +I276 +I431 +I280 +ta(I431 +I280 +I411 +I283 +ta(I411 +I283 +I397 +I287 +ta(I397 +I287 +I394 +I290 +ta(I394 +I290 +I394 +I292 +ta(I394 +I292 +I395 +I294 +ta(I395 +I294 +I399 +I295 +ta(I399 +I295 +I417 +I296 +ta(I417 +I296 +I437 +I297 +ta(I437 +I297 +I463 +I297 +ta(I463 +I297 +I491 +I297 +ta(I491 +I297 +I521 +I296 +ta(I521 +I296 +I553 +I295 +ta(I553 +I295 +I577 +I293 +ta(I577 +I293 +I597 +I292 +ta(I597 +I292 +I602 +I291 +ta(I602 +I291 +I605 +I291 +ta(I605 +I291 +I603 +I291 +ta(I603 +I291 +I589 +I291 +ta(I589 +I291 +I575 +I291 +ta(I575 +I291 +I555 +I293 +ta(I555 +I293 +I529 +I294 +ta(I529 +I294 +I501 +I296 +ta(I501 +I296 +I475 +I300 +ta(I475 +I300 +I459 +I303 +ta(I459 +I303 +I453 +I305 +ta(I453 +I305 +I452 +I307 +ta(I452 +I307 +I452 +I309 +ta(I452 +I309 +I453 +I312 +ta(I453 +I312 +I459 +I314 +ta(I459 +I314 +I475 +I315 +ta(I475 +I315 +I497 +I315 +ta(I497 +I315 +I523 +I315 +ta(I523 +I315 +I557 +I315 +ta(I557 +I315 +I591 +I315 +ta(I591 +I315 +I619 +I315 +ta(I619 +I315 +I645 +I315 +ta(I645 +I315 +I663 +I315 +ta(I663 +I315 +I666 +I315 +ta(I666 +I315 +I663 +I314 +ta(I663 +I314 +I658 +I314 +ta(I658 +I314 +I656 +I314 +ta(I656 +I314 +I630 +I314 +ta(I630 +I314 +I604 +I314 +ta(I604 +I314 +I556 +I314 +ta(I556 +I314 +I512 +I315 +ta(I512 +I315 +I478 +I317 +ta(I478 +I317 +I446 +I319 +ta(I446 +I319 +I424 +I321 +ta(I424 +I321 +I420 +I323 +ta(I420 +I323 +I424 +I324 +ta(I424 +I324 +I446 +I325 +ta(I446 +I325 +I470 +I325 +ta(I470 +I325 +I510 +I323 +ta(I510 +I323 +I552 +I321 +ta(I552 +I321 +I596 +I318 +ta(I596 +I318 +I646 +I316 +ta(I646 +I316 +I676 +I314 +ta(I676 +I314 +I694 +I314 +ta(I694 +I314 +I708 +I313 +ta(I708 +I313 +I706 +I313 +ta(I706 +I313 +I688 +I314 +ta(I688 +I314 +I674 +I315 +ta(I674 +I315 +I673 +I314 +ta(I673 +I314 +I631 +I314 +ta(I631 +I314 +I597 +I317 +ta(I597 +I317 +I563 +I321 +ta(I563 +I321 +I541 +I324 +ta(I541 +I324 +I535 +I327 +ta(I535 +I327 +I533 +I330 +ta(I533 +I330 +I533 +I332 +ta(I533 +I332 +I536 +I335 +ta(I536 +I335 +I541 +I337 +ta(I541 +I337 +I559 +I339 +ta(I559 +I339 +I583 +I340 +ta(I583 +I340 +I609 +I340 +ta(I609 +I340 +I641 +I340 +ta(I641 +I340 +I673 +I342 +ta(I673 +I342 +I697 +I344 +ta(I697 +I344 +I721 +I345 +ta(I721 +I345 +I727 +I346 +ta(I727 +I346 +I728 +I347 +ta(I728 +I347 +I729 +I348 +ta(I729 +I348 +I727 +I349 +ta(I727 +I349 +I724 +I351 +ta(I724 +I351 +I718 +I354 +ta(I718 +I354 +I712 +I357 +ta(I712 +I357 +I696 +I361 +ta(I696 +I361 +I682 +I364 +ta(I682 +I364 +I666 +I368 +ta(I666 +I368 +I661 +I371 +ta(I661 +I371 +I656 +I375 +ta(I656 +I375 +I653 +I378 +ta(I653 +I378 +I650 +I381 +ta(I650 +I381 +I649 +I382 +ta(I649 +I382 +I649 +I383 +ta(I649 +I383 +I650 +I383 +ta(I650 +I383 +I649 +I383 +ta(I649 +I383 +I621 +I383 +ta(I621 +I383 +I601 +I380 +ta(I601 +I380 +I587 +I379 +ta(I587 +I379 +I582 +I378 +ta(I582 +I378 +I576 +I377 +ta(I576 +I377 +I571 +I377 +ta(I571 +I377 +I557 +I377 +ta(I557 +I377 +I541 +I377 +ta(I541 +I377 +I517 +I378 +ta(I517 +I378 +I493 +I379 +ta(I493 +I379 +I473 +I381 +ta(I473 +I381 +I449 +I384 +ta(I449 +I384 +I435 +I387 +ta(I435 +I387 +I431 +I390 +ta(I431 +I390 +I428 +I393 +ta(I428 +I393 +I427 +I396 +ta(I427 +I396 +I427 +I398 +ta(I427 +I398 +I428 +I399 +ta(I428 +I399 +I432 +I400 +ta(I432 +I400 +I450 +I400 +ta(I450 +I400 +I468 +I400 +ta(I468 +I400 +I492 +I398 +ta(I492 +I398 +I518 +I396 +ta(I518 +I396 +I544 +I395 +ta(I544 +I395 +I574 +I393 +ta(I574 +I393 +I602 +I391 +ta(I602 +I391 +I626 +I390 +ta(I626 +I390 +I648 +I388 +ta(I648 +I388 +I662 +I387 +ta(I662 +I387 +I666 +I386 +ta(I666 +I386 +I668 +I386 +ta(I668 +I386 +I667 +I386 +ta(I667 +I386 +I663 +I385 +ta(I663 +I385 +I647 +I384 +ta(I647 +I384 +I627 +I383 +ta(I627 +I383 +I605 +I383 +ta(I605 +I383 +I573 +I383 +ta(I573 +I383 +I541 +I383 +ta(I541 +I383 +I511 +I383 +ta(I511 +I383 +I481 +I383 +ta(I481 +I383 +I455 +I383 +ta(I455 +I383 +I441 +I383 +ta(I441 +I383 +I440 +I383 +ta(I440 +I383 +I440 +I382 +ta(I440 +I382 +I442 +I381 +ta(I442 +I381 +I448 +I379 +ta(I448 +I379 +I468 +I375 +ta(I468 +I375 +I488 +I371 +ta(I488 +I371 +I512 +I366 +ta(I512 +I366 +I538 +I362 +ta(I538 +I362 +I568 +I358 +ta(I568 +I358 +I596 +I355 +ta(I596 +I355 +I624 +I352 +ta(I624 +I352 +I650 +I349 +ta(I650 +I349 +I670 +I347 +ta(I670 +I347 +I684 +I347 +ta(I684 +I347 +I686 +I346 +ta(I686 +I346 +I683 +I346 +ta(I683 +I346 +I667 +I347 +ta(I667 +I347 +I647 +I350 +ta(I647 +I350 +I619 +I353 +ta(I619 +I353 +I589 +I357 +ta(I589 +I357 +I557 +I361 +ta(I557 +I361 +I529 +I365 +ta(I529 +I365 +I501 +I379 +ta(I501 +I379 +I481 +I384 +ta(I481 +I384 +I475 +I387 +ta(I475 +I387 +I472 +I392 +ta(I472 +I392 +I471 +I395 +ta(I471 +I395 +I472 +I397 +ta(I472 +I397 +I478 +I398 +ta(I478 +I398 +I498 +I399 +ta(I498 +I399 +I518 +I399 +ta(I518 +I399 +I544 +I397 +ta(I544 +I397 +I574 +I396 +ta(I574 +I396 +I604 +I394 +ta(I604 +I394 +I634 +I393 +ta(I634 +I393 +I662 +I392 +ta(I662 +I392 +I686 +I392 +ta(I686 +I392 +I704 +I392 +ta(I704 +I392 +I707 +I393 +ta(I707 +I393 +I707 +I394 +ta(I707 +I394 +I706 +I396 +ta(I706 +I396 +I692 +I399 +ta(I692 +I399 +I674 +I403 +ta(I674 +I403 +I650 +I406 +ta(I650 +I406 +I618 +I410 +ta(I618 +I410 +I586 +I413 +ta(I586 +I413 +I554 +I417 +ta(I554 +I417 +I528 +I420 +ta(I528 +I420 +I506 +I424 +ta(I506 +I424 +I502 +I427 +ta(I502 +I427 +I499 +I429 +ta(I499 +I429 +I499 +I431 +ta(I499 +I431 +I502 +I433 +ta(I502 +I433 +I508 +I435 +ta(I508 +I435 +I526 +I436 +ta(I526 +I436 +I546 +I436 +ta(I546 +I436 +I570 +I436 +ta(I570 +I436 +I598 +I436 +ta(I598 +I436 +I624 +I436 +ta(I624 +I436 +I650 +I436 +ta(I650 +I436 +I672 +I436 +ta(I672 +I436 +I677 +I436 +ta(I677 +I436 +I678 +I436 +ta(I678 +I436 +I677 +I437 +ta(I677 +I437 +I674 +I438 +ta(I674 +I438 +I660 +I439 +ta(I660 +I439 +I642 +I440 +ta(I642 +I440 +I612 +I442 +ta(I612 +I442 +I580 +I444 +ta(I580 +I444 +I548 +I446 +ta(I548 +I446 +I516 +I448 +ta(I516 +I448 +I488 +I450 +ta(I488 +I450 +I466 +I453 +ta(I466 +I453 +I460 +I455 +ta(I460 +I455 +I459 +I456 +ta(I459 +I456 +I459 +I457 +ta(I459 +I457 +I463 +I458 +ta(I463 +I458 +I483 +I458 +ta(I483 +I458 +I505 +I458 +ta(I505 +I458 +I531 +I458 +ta(I531 +I458 +I561 +I456 +ta(I561 +I456 +I597 +I456 +ta(I597 +I456 +I625 +I456 +ta(I625 +I456 +I651 +I456 +ta(I651 +I456 +I675 +I456 +ta(I675 +I456 +I689 +I457 +ta(I689 +I457 +I693 +I458 +ta(I693 +I458 +I692 +I459 +ta(I692 +I459 +I688 +I461 +ta(I688 +I461 +I670 +I464 +ta(I670 +I464 +I646 +I467 +ta(I646 +I467 +I620 +I471 +ta(I620 +I471 +I586 +I476 +ta(I586 +I476 +I554 +I478 +ta(I554 +I478 +I522 +I483 +ta(I522 +I483 +I492 +I487 +ta(I492 +I487 +I468 +I491 +ta(I468 +I491 +I462 +I495 +ta(I462 +I495 +I460 +I499 +ta(I460 +I499 +I460 +I501 +ta(I460 +I501 +I465 +I502 +ta(I465 +I502 +I483 +I504 +ta(I483 +I504 +I509 +I505 +ta(I509 +I505 +I539 +I505 +ta(I539 +I505 +I577 +I505 +ta(I577 +I505 +I621 +I505 +ta(I621 +I505 +I663 +I504 +ta(I663 +I504 +I691 +I504 +ta(I691 +I504 +I729 +I504 +ta(I729 +I504 +I743 +I504 +ta(I743 +I504 +I742 +I504 +ta(I742 +I504 +I736 +I504 +ta(I736 +I504 +I702 +I505 +ta(I702 +I505 +I684 +I504 +ta(I684 +I504 +I654 +I504 +ta(I654 +I504 +I616 +I506 +ta(I616 +I506 +I582 +I508 +ta(I582 +I508 +I550 +I510 +ta(I550 +I510 +I526 +I514 +ta(I526 +I514 +I520 +I516 +ta(I520 +I516 +I519 +I518 +ta(I519 +I518 +I520 +I519 +ta(I520 +I519 +I534 +I520 +ta(I534 +I520 +I552 +I520 +ta(I552 +I520 +I578 +I520 +ta(I578 +I520 +I608 +I520 +ta(I608 +I520 +I638 +I518 +ta(I638 +I518 +I672 +I516 +ta(I672 +I516 +I700 +I515 +ta(I700 +I515 +I724 +I515 +ta(I724 +I515 +I742 +I515 +ta(I742 +I515 +I746 +I515 +ta(I746 +I515 +I743 +I516 +ta(I743 +I516 +I723 +I518 +ta(I723 +I518 +I701 +I520 +ta(I701 +I520 +I671 +I521 +ta(I671 +I521 +I641 +I523 +ta(I641 +I523 +I609 +I525 +ta(I609 +I525 +I579 +I527 +ta(I579 +I527 +I557 +I529 +ta(I557 +I529 +I552 +I531 +ta(I552 +I531 +I550 +I533 +ta(I550 +I533 +I551 +I535 +ta(I551 +I535 +I556 +I537 +ta(I556 +I537 +I576 +I539 +ta(I576 +I539 +I602 +I542 +ta(I602 +I542 +I630 +I543 +ta(I630 +I543 +I666 +I543 +ta(I666 +I543 +I700 +I543 +ta(I700 +I543 +I730 +I542 +ta(I730 +I542 +I756 +I540 +ta(I756 +I540 +I774 +I539 +ta(I774 +I539 +I776 +I538 +ta(I776 +I538 +I772 +I538 +ta(I772 +I538 +I748 +I539 +ta(I748 +I539 +I724 +I541 +ta(I724 +I541 +I698 +I544 +ta(I698 +I544 +I672 +I547 +ta(I672 +I547 +I650 +I551 +ta(I650 +I551 +I632 +I554 +ta(I632 +I554 +I626 +I556 +ta(I626 +I556 +I623 +I557 +ta(I623 +I557 +I620 +I559 +ta(I620 +I559 +I618 +I560 +ta(I618 +I560 +I617 +I560 +ta(I617 +I560 +I618 +I560 +ta(I618 +I560 +I617 +I559 +ta(I617 +I559 +I614 +I554 +tatp7 +a(S'Cyan' +p8 +I1 +(lp9 +(I18 +I19 +I18 +I20 +ta(I18 +I20 +I17 +I24 +ta(I17 +I24 +I17 +I28 +ta(I17 +I28 +I17 +I42 +ta(I17 +I42 +I16 +I48 +ta(I16 +I48 +I16 +I62 +ta(I16 +I62 +I16 +I80 +ta(I16 +I80 +I16 +I100 +ta(I16 +I100 +I16 +I122 +ta(I16 +I122 +I16 +I146 +ta(I16 +I146 +I16 +I170 +ta(I16 +I170 +I17 +I196 +ta(I17 +I196 +I19 +I222 +ta(I19 +I222 +I20 +I248 +ta(I20 +I248 +I23 +I266 +ta(I23 +I266 +I25 +I271 +ta(I25 +I271 +I27 +I273 +ta(I27 +I273 +I28 +I269 +ta(I28 +I269 +I29 +I247 +ta(I29 +I247 +I30 +I227 +ta(I30 +I227 +I31 +I201 +ta(I31 +I201 +I31 +I173 +ta(I31 +I173 +I31 +I147 +ta(I31 +I147 +I31 +I119 +ta(I31 +I119 +I31 +I89 +ta(I31 +I89 +I31 +I63 +ta(I31 +I63 +I31 +I35 +ta(I31 +I35 +I31 +I11 +ta(I31 +I11 +I31 +I-11 +ta(I31 +I-11 +I30 +I-29 +ta(I30 +I-29 +I29 +I-43 +ta(I29 +I-43 +I28 +I-46 +ta(I28 +I-46 +I27 +I-47 +ta(I27 +I-47 +I27 +I-42 +ta(I27 +I-42 +I27 +I-24 +ta(I27 +I-24 +I29 +I-6 +ta(I29 +I-6 +I30 +I12 +ta(I30 +I12 +I32 +I32 +ta(I32 +I32 +I33 +I56 +ta(I33 +I56 +I34 +I78 +ta(I34 +I78 +I36 +I98 +ta(I36 +I98 +I37 +I120 +ta(I37 +I120 +I39 +I138 +ta(I39 +I138 +I42 +I156 +ta(I42 +I156 +I45 +I172 +ta(I45 +I172 +I48 +I177 +ta(I48 +I177 +I51 +I180 +ta(I51 +I180 +I53 +I181 +ta(I53 +I181 +I55 +I181 +ta(I55 +I181 +I56 +I180 +ta(I56 +I180 +I57 +I175 +ta(I57 +I175 +I59 +I161 +ta(I59 +I161 +I60 +I147 +ta(I60 +I147 +I61 +I131 +ta(I61 +I131 +I61 +I113 +ta(I61 +I113 +I61 +I93 +ta(I61 +I93 +I61 +I73 +ta(I61 +I73 +I61 +I51 +ta(I61 +I51 +I61 +I27 +ta(I61 +I27 +I61 +I7 +ta(I61 +I7 +I61 +I-15 +ta(I61 +I-15 +I61 +I-31 +ta(I61 +I-31 +I61 +I-36 +ta(I61 +I-36 +I61 +I-40 +ta(I61 +I-40 +I62 +I-42 +ta(I62 +I-42 +I62 +I-38 +ta(I62 +I-38 +I62 +I-16 +ta(I62 +I-16 +I62 +I4 +ta(I62 +I4 +I63 +I26 +ta(I63 +I26 +I65 +I52 +ta(I65 +I52 +I66 +I78 +ta(I66 +I78 +I68 +I104 +ta(I68 +I104 +I69 +I134 +ta(I69 +I134 +I70 +I160 +ta(I70 +I160 +I72 +I186 +ta(I72 +I186 +I74 +I208 +ta(I74 +I208 +I77 +I224 +ta(I77 +I224 +I80 +I228 +ta(I80 +I228 +I83 +I230 +ta(I83 +I230 +I85 +I230 +ta(I85 +I230 +I88 +I229 +ta(I88 +I229 +I91 +I224 +ta(I91 +I224 +I94 +I206 +ta(I94 +I206 +I97 +I190 +ta(I97 +I190 +I99 +I168 +ta(I99 +I168 +I101 +I146 +ta(I101 +I146 +I102 +I122 +ta(I102 +I122 +I102 +I98 +ta(I102 +I98 +I102 +I72 +ta(I102 +I72 +I101 +I48 +ta(I101 +I48 +I99 +I26 +ta(I99 +I26 +I98 +I6 +ta(I98 +I6 +I97 +I-8 +ta(I97 +I-8 +I96 +I-12 +ta(I96 +I-12 +I96 +I-14 +ta(I96 +I-14 +I96 +I-10 +ta(I96 +I-10 +I96 +I12 +ta(I96 +I12 +I97 +I32 +ta(I97 +I32 +I97 +I56 +ta(I97 +I56 +I99 +I82 +ta(I99 +I82 +I99 +I108 +ta(I99 +I108 +I99 +I136 +ta(I99 +I136 +I99 +I166 +ta(I99 +I166 +I99 +I192 +ta(I99 +I192 +I100 +I218 +ta(I100 +I218 +I102 +I244 +ta(I102 +I244 +I105 +I262 +ta(I105 +I262 +I108 +I267 +ta(I108 +I267 +I113 +I271 +ta(I113 +I271 +I117 +I273 +ta(I117 +I273 +I121 +I273 +ta(I121 +I273 +I125 +I270 +ta(I125 +I270 +I128 +I266 +ta(I128 +I266 +I132 +I248 +ta(I132 +I248 +I135 +I232 +ta(I135 +I232 +I137 +I210 +ta(I137 +I210 +I140 +I186 +ta(I140 +I186 +I141 +I162 +ta(I141 +I162 +I142 +I132 +ta(I142 +I132 +I142 +I106 +ta(I142 +I106 +I142 +I80 +ta(I142 +I80 +I140 +I54 +ta(I140 +I54 +I138 +I34 +ta(I138 +I34 +I137 +I18 +ta(I137 +I18 +I137 +I12 +ta(I137 +I12 +I136 +I9 +ta(I136 +I9 +I136 +I10 +ta(I136 +I10 +I136 +I32 +ta(I136 +I32 +I137 +I50 +ta(I137 +I50 +I139 +I74 +ta(I139 +I74 +I140 +I100 +ta(I140 +I100 +I142 +I124 +ta(I142 +I124 +I143 +I152 +ta(I143 +I152 +I145 +I180 +ta(I145 +I180 +I146 +I208 +ta(I146 +I208 +I147 +I234 +ta(I147 +I234 +I149 +I258 +ta(I149 +I258 +I151 +I276 +ta(I151 +I276 +I153 +I280 +ta(I153 +I280 +I156 +I283 +ta(I156 +I283 +I157 +I283 +ta(I157 +I283 +I158 +I283 +ta(I158 +I283 +I161 +I279 +ta(I161 +I279 +I162 +I263 +ta(I162 +I263 +I165 +I247 +ta(I165 +I247 +I168 +I225 +ta(I168 +I225 +I171 +I201 +ta(I171 +I201 +I174 +I177 +ta(I174 +I177 +I177 +I153 +ta(I177 +I153 +I178 +I125 +ta(I178 +I125 +I179 +I99 +ta(I179 +I99 +I180 +I75 +ta(I180 +I75 +I180 +I53 +ta(I180 +I53 +I179 +I33 +ta(I179 +I33 +I178 +I17 +ta(I178 +I17 +I177 +I13 +ta(I177 +I13 +I176 +I10 +ta(I176 +I10 +I175 +I10 +ta(I175 +I10 +I175 +I12 +ta(I175 +I12 +I175 +I34 +ta(I175 +I34 +I175 +I52 +ta(I175 +I52 +I175 +I76 +ta(I175 +I76 +I175 +I100 +ta(I175 +I100 +I175 +I126 +ta(I175 +I126 +I174 +I156 +ta(I174 +I156 +I173 +I184 +ta(I173 +I184 +I173 +I208 +ta(I173 +I208 +I173 +I232 +ta(I173 +I232 +I173 +I252 +ta(I173 +I252 +I174 +I258 +ta(I174 +I258 +I176 +I262 +ta(I176 +I262 +I177 +I263 +ta(I177 +I263 +I179 +I263 +ta(I179 +I263 +I180 +I261 +ta(I180 +I261 +I182 +I245 +ta(I182 +I245 +I184 +I229 +ta(I184 +I229 +I186 +I207 +ta(I186 +I207 +I187 +I183 +ta(I187 +I183 +I188 +I155 +ta(I188 +I155 +I189 +I129 +ta(I189 +I129 +I190 +I99 +ta(I190 +I99 +I191 +I73 +ta(I191 +I73 +I192 +I49 +ta(I192 +I49 +I193 +I27 +ta(I193 +I27 +I193 +I5 +ta(I193 +I5 +I193 +I-11 +ta(I193 +I-11 +I193 +I-16 +ta(I193 +I-16 +I193 +I-20 +ta(I193 +I-20 +I193 +I-21 +ta(I193 +I-21 +I193 +I-20 +ta(I193 +I-20 +I193 +I0 +ta(I193 +I0 +I193 +I18 +ta(I193 +I18 +I194 +I42 +ta(I194 +I42 +I195 +I66 +ta(I195 +I66 +I197 +I94 +ta(I197 +I94 +I199 +I122 +ta(I199 +I122 +I200 +I148 +ta(I200 +I148 +I203 +I178 +ta(I203 +I178 +I204 +I206 +ta(I204 +I206 +I206 +I230 +ta(I206 +I230 +I209 +I256 +ta(I209 +I256 +I212 +I274 +ta(I212 +I274 +I216 +I290 +ta(I216 +I290 +I220 +I292 +ta(I220 +I292 +I223 +I293 +ta(I223 +I293 +I225 +I293 +ta(I225 +I293 +I227 +I291 +ta(I227 +I291 +I229 +I277 +ta(I229 +I277 +I231 +I259 +ta(I231 +I259 +I234 +I237 +ta(I234 +I237 +I236 +I215 +ta(I236 +I215 +I238 +I185 +ta(I238 +I185 +I240 +I157 +ta(I240 +I157 +I242 +I129 +ta(I242 +I129 +I243 +I103 +ta(I243 +I103 +I245 +I73 +ta(I245 +I73 +I246 +I49 +ta(I246 +I49 +I246 +I29 +ta(I246 +I29 +I246 +I13 +ta(I246 +I13 +I245 +I9 +ta(I245 +I9 +I244 +I6 +ta(I244 +I6 +I243 +I12 +ta(I243 +I12 +I243 +I36 +ta(I243 +I36 +I243 +I60 +ta(I243 +I60 +I243 +I84 +ta(I243 +I84 +I243 +I112 +ta(I243 +I112 +I243 +I140 +ta(I243 +I140 +I243 +I172 +ta(I243 +I172 +I243 +I202 +ta(I243 +I202 +I244 +I230 +ta(I244 +I230 +I245 +I258 +ta(I245 +I258 +I246 +I282 +ta(I246 +I282 +I246 +I300 +ta(I246 +I300 +I248 +I303 +ta(I248 +I303 +I250 +I305 +ta(I250 +I305 +I251 +I305 +ta(I251 +I305 +I252 +I304 +ta(I252 +I304 +I255 +I290 +ta(I255 +I290 +I257 +I286 +ta(I257 +I286 +I260 +I266 +ta(I260 +I266 +I264 +I246 +ta(I264 +I246 +I267 +I224 +ta(I267 +I224 +I268 +I204 +ta(I268 +I204 +I269 +I180 +ta(I269 +I180 +I270 +I160 +ta(I270 +I160 +I270 +I140 +ta(I270 +I140 +I270 +I118 +ta(I270 +I118 +I270 +I100 +ta(I270 +I100 +I269 +I84 +ta(I269 +I84 +I268 +I70 +ta(I268 +I70 +I267 +I66 +ta(I267 +I66 +I266 +I63 +ta(I266 +I63 +I266 +I62 +ta(I266 +I62 +I266 +I67 +ta(I266 +I67 +I266 +I85 +ta(I266 +I85 +I268 +I105 +ta(I268 +I105 +I269 +I129 +ta(I269 +I129 +I271 +I155 +ta(I271 +I155 +I272 +I185 +ta(I272 +I185 +I274 +I213 +ta(I274 +I213 +I274 +I239 +ta(I274 +I239 +I276 +I267 +ta(I276 +I267 +I278 +I291 +ta(I278 +I291 +I280 +I311 +ta(I280 +I311 +I282 +I316 +ta(I282 +I316 +I284 +I319 +ta(I284 +I319 +I286 +I321 +ta(I286 +I321 +I288 +I321 +ta(I288 +I321 +I289 +I320 +ta(I289 +I320 +I290 +I302 +ta(I290 +I302 +I291 +I282 +ta(I291 +I282 +I292 +I281 +ta(I292 +I281 +I291 +I281 +ta(I291 +I281 +I291 +I259 +ta(I291 +I259 +I292 +I233 +ta(I292 +I233 +I291 +I209 +ta(I291 +I209 +I290 +I189 +ta(I290 +I189 +I288 +I169 +ta(I288 +I169 +I287 +I163 +ta(I287 +I163 +I287 +I160 +ta(I287 +I160 +I287 +I158 +ta(I287 +I158 +I287 +I159 +ta(I287 +I159 +I287 +I175 +ta(I287 +I175 +I289 +I193 +ta(I289 +I193 +I292 +I215 +ta(I292 +I215 +I295 +I241 +ta(I295 +I241 +I298 +I269 +ta(I298 +I269 +I302 +I299 +ta(I302 +I299 +I303 +I313 +ta(I303 +I313 +I306 +I337 +ta(I306 +I337 +I307 +I339 +ta(I307 +I339 +I308 +I353 +ta(I308 +I353 +I311 +I367 +ta(I311 +I367 +I310 +I369 +ta(I310 +I369 +I311 +I372 +ta(I311 +I372 +I312 +I368 +ta(I312 +I368 +I312 +I366 +ta(I312 +I366 +I313 +I365 +ta(I313 +I365 +I312 +I335 +ta(I312 +I335 +I310 +I301 +ta(I310 +I301 +I310 +I287 +ta(I310 +I287 +I310 +I261 +ta(I310 +I261 +I309 +I233 +ta(I309 +I233 +I307 +I207 +ta(I307 +I207 +I306 +I185 +ta(I306 +I185 +I305 +I167 +ta(I305 +I167 +I304 +I153 +ta(I304 +I153 +I303 +I149 +ta(I303 +I149 +I303 +I147 +ta(I303 +I147 +I304 +I149 +ta(I304 +I149 +I306 +I171 +ta(I306 +I171 +I309 +I193 +ta(I309 +I193 +I312 +I217 +ta(I312 +I217 +I316 +I243 +ta(I316 +I243 +I320 +I271 +ta(I320 +I271 +I323 +I301 +ta(I323 +I301 +I327 +I329 +ta(I327 +I329 +I330 +I353 +ta(I330 +I353 +I333 +I379 +ta(I333 +I379 +I336 +I395 +ta(I336 +I395 +I340 +I411 +ta(I340 +I411 +I343 +I414 +ta(I343 +I414 +I345 +I415 +ta(I345 +I415 +I346 +I416 +ta(I346 +I416 +I347 +I414 +ta(I347 +I414 +I348 +I408 +ta(I348 +I408 +I348 +I406 +ta(I348 +I406 +I349 +I388 +ta(I349 +I388 +I349 +I384 +ta(I349 +I384 +I349 +I352 +ta(I349 +I352 +I349 +I324 +ta(I349 +I324 +I349 +I294 +ta(I349 +I294 +I373 +I294 +ta(I373 +I294 +I393 +I314 +ta(I393 +I314 +I457 +I360 +ta(I457 +I360 +I513 +I404 +ta(I513 +I404 +I591 +I432 +ta(I591 +I432 +I665 +I448 +ta(I665 +I448 +I664 +I474 +ta(I664 +I474 +I586 +I512 +ta(I586 +I512 +I508 +I556 +ta(I508 +I556 +I410 +I616 +ta(I410 +I616 +I316 +I678 +ta(I316 +I678 +I220 +I740 +ta(I220 +I740 +I158 +I804 +ta(I158 +I804 +I90 +I853 +ta(I90 +I853 +I40 +I853 +ta(I40 +I853 +I-16 +I853 +ta(I-16 +I853 +I-66 +I853 +ta(I-66 +I853 +I-96 +I852 +ta(I-96 +I852 +I-130 +I853 +ta(I-130 +I853 +I-154 +I775 +ta(I-154 +I775 +I-180 +I703 +ta(I-180 +I703 +I-196 +I755 +ta(I-196 +I755 +I-194 +I773 +ta(I-194 +I773 +I-192 +I776 +ta(I-192 +I776 +I-191 +I777 +ta(I-191 +I777 +I-190 +I776 +ta(I-190 +I776 +I-190 +I770 +ta(I-190 +I770 +I-190 +I750 +ta(I-190 +I750 +I-190 +I724 +ta(I-190 +I724 +I-191 +I694 +ta(I-191 +I694 +I-191 +I662 +ta(I-191 +I662 +I-191 +I628 +ta(I-191 +I628 +I-191 +I596 +ta(I-191 +I596 +I-193 +I568 +ta(I-193 +I568 +I-196 +I544 +ta(I-196 +I544 +I-201 +I524 +ta(I-201 +I524 +I-206 +I508 +ta(I-206 +I508 +I-212 +I506 +ta(I-212 +I506 +I-213 +I506 +tatp10 +a(g8 +I1 +(lp11 +(I288 +I12 +I288 +I16 +ta(I288 +I16 +I288 +I19 +ta(I288 +I19 +I289 +I23 +ta(I289 +I23 +I290 +I28 +ta(I290 +I28 +I290 +I34 +ta(I290 +I34 +I291 +I48 +ta(I291 +I48 +I291 +I66 +ta(I291 +I66 +I291 +I84 +ta(I291 +I84 +I291 +I106 +ta(I291 +I106 +I291 +I130 +ta(I291 +I130 +I291 +I154 +ta(I291 +I154 +I291 +I182 +ta(I291 +I182 +I291 +I208 +ta(I291 +I208 +I292 +I236 +ta(I292 +I236 +I292 +I262 +ta(I292 +I262 +I293 +I284 +ta(I293 +I284 +I293 +I300 +ta(I293 +I300 +I295 +I306 +ta(I295 +I306 +I295 +I309 +ta(I295 +I309 +I296 +I310 +ta(I296 +I310 +I297 +I310 +ta(I297 +I310 +I298 +I294 +ta(I298 +I294 +I298 +I274 +ta(I298 +I274 +I298 +I248 +ta(I298 +I248 +I298 +I220 +ta(I298 +I220 +I298 +I188 +ta(I298 +I188 +I298 +I148 +ta(I298 +I148 +I298 +I116 +ta(I298 +I116 +I298 +I82 +ta(I298 +I82 +I298 +I46 +ta(I298 +I46 +I298 +I10 +ta(I298 +I10 +I298 +I-20 +ta(I298 +I-20 +I298 +I-50 +ta(I298 +I-50 +I300 +I-76 +ta(I300 +I-76 +I302 +I-94 +ta(I302 +I-94 +I303 +I-110 +ta(I303 +I-110 +I304 +I-113 +ta(I304 +I-113 +I305 +I-113 +ta(I305 +I-113 +I305 +I-112 +ta(I305 +I-112 +I305 +I-92 +ta(I305 +I-92 +I308 +I-74 +ta(I308 +I-74 +I310 +I-48 +ta(I310 +I-48 +I312 +I-24 +ta(I312 +I-24 +I313 +I2 +ta(I313 +I2 +I315 +I30 +ta(I315 +I30 +I317 +I60 +ta(I317 +I60 +I319 +I84 +ta(I319 +I84 +I322 +I108 +ta(I322 +I108 +I326 +I134 +ta(I326 +I134 +I329 +I150 +ta(I329 +I150 +I332 +I166 +ta(I332 +I166 +I336 +I172 +ta(I336 +I172 +I339 +I176 +ta(I339 +I176 +I343 +I177 +ta(I343 +I177 +I345 +I178 +ta(I345 +I178 +I346 +I179 +ta(I346 +I179 +I347 +I179 +ta(I347 +I179 +I347 +I176 +ta(I347 +I176 +I348 +I171 +ta(I348 +I171 +I348 +I157 +ta(I348 +I157 +I348 +I141 +ta(I348 +I141 +I348 +I119 +ta(I348 +I119 +I349 +I97 +ta(I349 +I97 +I351 +I71 +ta(I351 +I71 +I353 +I41 +ta(I353 +I41 +I355 +I9 +ta(I355 +I9 +I358 +I-21 +ta(I358 +I-21 +I362 +I-51 +ta(I362 +I-51 +I365 +I-79 +ta(I365 +I-79 +I368 +I-101 +ta(I368 +I-101 +I371 +I-117 +ta(I371 +I-117 +I373 +I-121 +ta(I373 +I-121 +I373 +I-122 +ta(I373 +I-122 +I373 +I-121 +ta(I373 +I-121 +I374 +I-101 +ta(I374 +I-101 +I375 +I-81 +ta(I375 +I-81 +I375 +I-57 +ta(I375 +I-57 +I375 +I-33 +ta(I375 +I-33 +I375 +I-7 +ta(I375 +I-7 +I375 +I23 +ta(I375 +I23 +I375 +I51 +ta(I375 +I51 +I375 +I81 +ta(I375 +I81 +I375 +I109 +ta(I375 +I109 +I375 +I137 +ta(I375 +I137 +I375 +I163 +ta(I375 +I163 +I375 +I183 +ta(I375 +I183 +I376 +I199 +ta(I376 +I199 +I377 +I202 +ta(I377 +I202 +I379 +I203 +ta(I379 +I203 +I380 +I203 +ta(I380 +I203 +I381 +I200 +ta(I381 +I200 +I383 +I184 +ta(I383 +I184 +I383 +I170 +ta(I383 +I170 +I384 +I154 +ta(I384 +I154 +I386 +I130 +ta(I386 +I130 +I387 +I108 +ta(I387 +I108 +I388 +I84 +ta(I388 +I84 +I390 +I58 +ta(I390 +I58 +I391 +I32 +ta(I391 +I32 +I393 +I8 +ta(I393 +I8 +I395 +I-12 +ta(I395 +I-12 +I396 +I-30 +ta(I396 +I-30 +I397 +I-36 +ta(I397 +I-36 +I397 +I-39 +ta(I397 +I-39 +I397 +I-34 +ta(I397 +I-34 +I397 +I-10 +ta(I397 +I-10 +I397 +I12 +ta(I397 +I12 +I397 +I32 +ta(I397 +I32 +I397 +I58 +ta(I397 +I58 +I397 +I84 +ta(I397 +I84 +I397 +I110 +ta(I397 +I110 +I397 +I140 +ta(I397 +I140 +I397 +I166 +ta(I397 +I166 +I397 +I190 +ta(I397 +I190 +I398 +I216 +ta(I398 +I216 +I399 +I236 +ta(I399 +I236 +I400 +I252 +ta(I400 +I252 +I402 +I268 +ta(I402 +I268 +I404 +I270 +ta(I404 +I270 +I405 +I272 +ta(I405 +I272 +I406 +I272 +ta(I406 +I272 +I407 +I269 +ta(I407 +I269 +I408 +I263 +ta(I408 +I263 +I409 +I247 +ta(I409 +I247 +I412 +I229 +ta(I412 +I229 +I414 +I205 +ta(I414 +I205 +I418 +I181 +ta(I418 +I181 +I421 +I155 +ta(I421 +I155 +I424 +I129 +ta(I424 +I129 +I427 +I101 +ta(I427 +I101 +I429 +I71 +ta(I429 +I71 +I432 +I47 +ta(I432 +I47 +I434 +I25 +ta(I434 +I25 +I437 +I5 +ta(I437 +I5 +I439 +I-9 +ta(I439 +I-9 +I440 +I-13 +ta(I440 +I-13 +I441 +I-15 +ta(I441 +I-15 +I441 +I-11 +ta(I441 +I-11 +I441 +I15 +ta(I441 +I15 +I441 +I35 +ta(I441 +I35 +I441 +I59 +ta(I441 +I59 +I441 +I89 +ta(I441 +I89 +I441 +I117 +ta(I441 +I117 +I441 +I145 +ta(I441 +I145 +I442 +I173 +ta(I442 +I173 +I443 +I199 +ta(I443 +I199 +I445 +I225 +ta(I445 +I225 +I447 +I247 +ta(I447 +I247 +I448 +I253 +ta(I448 +I253 +I450 +I256 +ta(I450 +I256 +I452 +I258 +ta(I452 +I258 +I453 +I258 +ta(I453 +I258 +I455 +I252 +ta(I455 +I252 +I457 +I234 +ta(I457 +I234 +I458 +I214 +ta(I458 +I214 +I461 +I190 +ta(I461 +I190 +I463 +I160 +ta(I463 +I160 +I464 +I130 +ta(I464 +I130 +I466 +I98 +ta(I466 +I98 +I468 +I64 +ta(I468 +I64 +I470 +I34 +ta(I470 +I34 +I471 +I8 +ta(I471 +I8 +I472 +I-18 +ta(I472 +I-18 +I473 +I-42 +ta(I473 +I-42 +I474 +I-62 +ta(I474 +I-62 +I475 +I-76 +ta(I475 +I-76 +I476 +I-80 +ta(I476 +I-80 +I476 +I-82 +ta(I476 +I-82 +I476 +I-77 +ta(I476 +I-77 +I476 +I-55 +ta(I476 +I-55 +I478 +I-33 +ta(I478 +I-33 +I480 +I-9 +ta(I480 +I-9 +I481 +I17 +ta(I481 +I17 +I483 +I45 +ta(I483 +I45 +I485 +I73 +ta(I485 +I73 +I488 +I99 +ta(I488 +I99 +I491 +I123 +ta(I491 +I123 +I494 +I145 +ta(I494 +I145 +I500 +I163 +ta(I500 +I163 +I503 +I177 +ta(I503 +I177 +I507 +I181 +ta(I507 +I181 +I511 +I183 +ta(I511 +I183 +I515 +I185 +ta(I515 +I185 +I519 +I185 +ta(I519 +I185 +I521 +I184 +ta(I521 +I184 +I524 +I180 +ta(I524 +I180 +I526 +I176 +ta(I526 +I176 +I528 +I158 +ta(I528 +I158 +I530 +I140 +ta(I530 +I140 +I531 +I120 +ta(I531 +I120 +I531 +I94 +ta(I531 +I94 +I531 +I66 +ta(I531 +I66 +I531 +I38 +ta(I531 +I38 +I531 +I10 +ta(I531 +I10 +I532 +I-16 +ta(I532 +I-16 +I534 +I-42 +ta(I534 +I-42 +I536 +I-64 +ta(I536 +I-64 +I537 +I-78 +ta(I537 +I-78 +I538 +I-84 +ta(I538 +I-84 +I539 +I-86 +ta(I539 +I-86 +I539 +I-82 +ta(I539 +I-82 +I540 +I-58 +ta(I540 +I-58 +I541 +I-36 +ta(I541 +I-36 +I543 +I-12 +ta(I543 +I-12 +I544 +I16 +ta(I544 +I16 +I546 +I44 +ta(I546 +I44 +I548 +I70 +ta(I548 +I70 +I549 +I96 +ta(I549 +I96 +I551 +I122 +ta(I551 +I122 +I554 +I144 +ta(I554 +I144 +I557 +I162 +ta(I557 +I162 +I560 +I178 +ta(I560 +I178 +I562 +I182 +ta(I562 +I182 +I565 +I185 +ta(I565 +I185 +I566 +I187 +ta(I566 +I187 +I568 +I187 +ta(I568 +I187 +I569 +I186 +ta(I569 +I186 +I570 +I181 +ta(I570 +I181 +I571 +I167 +ta(I571 +I167 +I573 +I151 +ta(I573 +I151 +I574 +I131 +ta(I574 +I131 +I575 +I109 +ta(I575 +I109 +I576 +I89 +ta(I576 +I89 +I578 +I65 +ta(I578 +I65 +I579 +I43 +ta(I579 +I43 +I581 +I23 +ta(I581 +I23 +I582 +I3 +ta(I582 +I3 +I583 +I-13 +ta(I583 +I-13 +I584 +I-18 +ta(I584 +I-18 +I585 +I-23 +ta(I585 +I-23 +I585 +I-24 +ta(I585 +I-24 +I585 +I-18 +ta(I585 +I-18 +I585 +I6 +ta(I585 +I6 +I586 +I26 +ta(I586 +I26 +I587 +I48 +ta(I587 +I48 +I588 +I74 +ta(I588 +I74 +I589 +I98 +ta(I589 +I98 +I590 +I122 +ta(I590 +I122 +I592 +I148 +ta(I592 +I148 +I594 +I170 +ta(I594 +I170 +I595 +I190 +ta(I595 +I190 +I596 +I210 +ta(I596 +I210 +I597 +I224 +ta(I597 +I224 +I599 +I228 +ta(I599 +I228 +I600 +I230 +ta(I600 +I230 +I601 +I230 +ta(I601 +I230 +I602 +I228 +ta(I602 +I228 +I603 +I212 +ta(I603 +I212 +I605 +I198 +ta(I605 +I198 +I608 +I178 +ta(I608 +I178 +I609 +I158 +ta(I609 +I158 +I610 +I134 +ta(I610 +I134 +I612 +I110 +ta(I612 +I110 +I613 +I84 +ta(I613 +I84 +I615 +I60 +ta(I615 +I60 +I615 +I34 +ta(I615 +I34 +I615 +I14 +ta(I615 +I14 +I615 +I-4 +ta(I615 +I-4 +I615 +I-18 +ta(I615 +I-18 +I615 +I-23 +ta(I615 +I-23 +I615 +I-25 +ta(I615 +I-25 +I615 +I-24 +ta(I615 +I-24 +I615 +I-6 +ta(I615 +I-6 +I615 +I8 +ta(I615 +I8 +I615 +I28 +ta(I615 +I28 +I615 +I50 +ta(I615 +I50 +I616 +I74 +ta(I616 +I74 +I616 +I100 +ta(I616 +I100 +I616 +I124 +ta(I616 +I124 +I618 +I144 +ta(I618 +I144 +I619 +I164 +ta(I619 +I164 +I620 +I182 +ta(I620 +I182 +I622 +I196 +ta(I622 +I196 +I623 +I201 +ta(I623 +I201 +I624 +I204 +ta(I624 +I204 +I624 +I206 +ta(I624 +I206 +I625 +I206 +ta(I625 +I206 +I626 +I206 +ta(I626 +I206 +I627 +I201 +ta(I627 +I201 +I628 +I187 +ta(I628 +I187 +I629 +I171 +ta(I629 +I171 +I629 +I151 +ta(I629 +I151 +I630 +I129 +ta(I630 +I129 +I631 +I109 +ta(I631 +I109 +I632 +I83 +ta(I632 +I83 +I632 +I57 +ta(I632 +I57 +I632 +I35 +ta(I632 +I35 +I633 +I11 +ta(I633 +I11 +I634 +I-9 +ta(I634 +I-9 +I635 +I-25 +ta(I635 +I-25 +I636 +I-30 +ta(I636 +I-30 +I637 +I-33 +ta(I637 +I-33 +I637 +I-35 +ta(I637 +I-35 +I637 +I-32 +ta(I637 +I-32 +I638 +I-14 +ta(I638 +I-14 +I639 +I4 +ta(I639 +I4 +I642 +I24 +ta(I642 +I24 +I645 +I48 +ta(I645 +I48 +I648 +I70 +ta(I648 +I70 +I651 +I92 +ta(I651 +I92 +I653 +I114 +ta(I653 +I114 +I656 +I132 +ta(I656 +I132 +I659 +I150 +ta(I659 +I150 +I662 +I164 +ta(I662 +I164 +I664 +I169 +ta(I664 +I169 +I667 +I173 +ta(I667 +I173 +I669 +I175 +ta(I669 +I175 +I670 +I175 +ta(I670 +I175 +I671 +I175 +ta(I671 +I175 +I671 +I169 +ta(I671 +I169 +I671 +I163 +ta(I671 +I163 +I671 +I147 +ta(I671 +I147 +I670 +I129 +ta(I670 +I129 +I669 +I111 +ta(I669 +I111 +I669 +I91 +ta(I669 +I91 +I669 +I67 +ta(I669 +I67 +I669 +I49 +ta(I669 +I49 +I670 +I27 +ta(I670 +I27 +I671 +I7 +ta(I671 +I7 +I671 +I-13 +ta(I671 +I-13 +I672 +I-27 +ta(I672 +I-27 +I673 +I-32 +ta(I673 +I-32 +I673 +I-35 +ta(I673 +I-35 +I673 +I-30 +ta(I673 +I-30 +I674 +I-14 +ta(I674 +I-14 +I675 +I6 +ta(I675 +I6 +I676 +I22 +ta(I676 +I22 +I677 +I42 +ta(I677 +I42 +I679 +I64 +ta(I679 +I64 +I681 +I84 +ta(I681 +I84 +I683 +I106 +ta(I683 +I106 +I685 +I126 +ta(I685 +I126 +I688 +I148 +ta(I688 +I148 +I691 +I168 +ta(I691 +I168 +I694 +I182 +ta(I694 +I182 +I695 +I187 +ta(I695 +I187 +I696 +I190 +ta(I696 +I190 +I697 +I192 +ta(I697 +I192 +I697 +I193 +ta(I697 +I193 +I697 +I192 +ta(I697 +I192 +I695 +I190 +ta(I695 +I190 +I695 +I189 +tatp12 +a(g8 +I1 +(lp13 +(I683 +I229 +I682 +I233 +ta(I682 +I233 +I682 +I239 +ta(I682 +I239 +I681 +I245 +ta(I681 +I245 +I681 +I251 +ta(I681 +I251 +I681 +I257 +ta(I681 +I257 +I681 +I273 +ta(I681 +I273 +I681 +I289 +ta(I681 +I289 +I681 +I307 +ta(I681 +I307 +I681 +I327 +ta(I681 +I327 +I681 +I345 +ta(I681 +I345 +I683 +I365 +ta(I683 +I365 +I684 +I389 +ta(I684 +I389 +I685 +I409 +ta(I685 +I409 +I686 +I431 +ta(I686 +I431 +I688 +I447 +ta(I688 +I447 +I689 +I452 +ta(I689 +I452 +I690 +I457 +ta(I690 +I457 +I690 +I459 +ta(I690 +I459 +I691 +I459 +ta(I691 +I459 +I691 +I456 +ta(I691 +I456 +I691 +I436 +ta(I691 +I436 +I691 +I418 +ta(I691 +I418 +I690 +I394 +ta(I690 +I394 +I688 +I370 +ta(I688 +I370 +I687 +I342 +ta(I687 +I342 +I687 +I314 +ta(I687 +I314 +I687 +I284 +ta(I687 +I284 +I687 +I254 +ta(I687 +I254 +I688 +I226 +ta(I688 +I226 +I690 +I202 +ta(I690 +I202 +I691 +I180 +ta(I691 +I180 +I692 +I160 +ta(I692 +I160 +I692 +I146 +ta(I692 +I146 +I692 +I143 +ta(I692 +I143 +I692 +I141 +ta(I692 +I141 +I692 +I146 +ta(I692 +I146 +I692 +I166 +ta(I692 +I166 +I692 +I184 +ta(I692 +I184 +I692 +I204 +ta(I692 +I204 +I692 +I226 +ta(I692 +I226 +I692 +I250 +ta(I692 +I250 +I692 +I274 +ta(I692 +I274 +I692 +I298 +ta(I692 +I298 +I692 +I322 +ta(I692 +I322 +I692 +I342 +ta(I692 +I342 +I692 +I360 +ta(I692 +I360 +I692 +I378 +ta(I692 +I378 +I692 +I382 +ta(I692 +I382 +I692 +I386 +ta(I692 +I386 +I692 +I388 +ta(I692 +I388 +I692 +I387 +ta(I692 +I387 +I692 +I369 +ta(I692 +I369 +I691 +I353 +ta(I691 +I353 +I689 +I333 +ta(I689 +I333 +I688 +I311 +ta(I688 +I311 +I686 +I287 +ta(I686 +I287 +I683 +I263 +ta(I683 +I263 +I682 +I241 +ta(I682 +I241 +I680 +I221 +ta(I680 +I221 +I678 +I201 +ta(I678 +I201 +I676 +I183 +ta(I676 +I183 +I674 +I177 +ta(I674 +I177 +I672 +I173 +ta(I672 +I173 +I671 +I171 +ta(I671 +I171 +I670 +I176 +ta(I670 +I176 +I668 +I198 +ta(I668 +I198 +I668 +I216 +ta(I668 +I216 +I667 +I240 +ta(I667 +I240 +I665 +I264 +ta(I665 +I264 +I664 +I288 +ta(I664 +I288 +I662 +I312 +ta(I662 +I312 +I660 +I338 +ta(I660 +I338 +I659 +I360 +ta(I659 +I360 +I656 +I382 +ta(I656 +I382 +I655 +I400 +ta(I655 +I400 +I654 +I416 +ta(I654 +I416 +I653 +I421 +ta(I653 +I421 +I653 +I423 +ta(I653 +I423 +I654 +I418 +ta(I654 +I418 +I655 +I394 +ta(I655 +I394 +I655 +I378 +ta(I655 +I378 +I655 +I356 +ta(I655 +I356 +I654 +I332 +ta(I654 +I332 +I652 +I308 +ta(I652 +I308 +I649 +I282 +ta(I649 +I282 +I647 +I260 +ta(I647 +I260 +I644 +I238 +ta(I644 +I238 +I641 +I220 +ta(I641 +I220 +I638 +I202 +ta(I638 +I202 +I636 +I196 +ta(I636 +I196 +I635 +I193 +ta(I635 +I193 +I634 +I191 +ta(I634 +I191 +I633 +I191 +ta(I633 +I191 +I632 +I196 +ta(I632 +I196 +I631 +I216 +ta(I631 +I216 +I630 +I234 +ta(I630 +I234 +I629 +I254 +ta(I629 +I254 +I627 +I280 +ta(I627 +I280 +I625 +I304 +ta(I625 +I304 +I624 +I330 +ta(I624 +I330 +I622 +I354 +ta(I622 +I354 +I621 +I376 +ta(I621 +I376 +I620 +I394 +ta(I620 +I394 +I618 +I412 +ta(I618 +I412 +I618 +I416 +ta(I618 +I416 +I618 +I420 +ta(I618 +I420 +I618 +I422 +ta(I618 +I422 +I618 +I418 +ta(I618 +I418 +I618 +I396 +ta(I618 +I396 +I618 +I378 +ta(I618 +I378 +I618 +I356 +ta(I618 +I356 +I618 +I332 +ta(I618 +I332 +I618 +I306 +ta(I618 +I306 +I618 +I282 +ta(I618 +I282 +I617 +I258 +ta(I617 +I258 +I615 +I238 +ta(I615 +I238 +I614 +I220 +ta(I614 +I220 +I613 +I214 +ta(I613 +I214 +I612 +I210 +ta(I612 +I210 +I611 +I209 +ta(I611 +I209 +I609 +I212 +ta(I609 +I212 +I608 +I230 +ta(I608 +I230 +I605 +I248 +ta(I605 +I248 +I603 +I266 +ta(I603 +I266 +I600 +I288 +ta(I600 +I288 +I597 +I310 +ta(I597 +I310 +I595 +I330 +ta(I595 +I330 +I592 +I354 +ta(I592 +I354 +I589 +I374 +ta(I589 +I374 +I588 +I394 +ta(I588 +I394 +I587 +I412 +ta(I587 +I412 +I586 +I417 +ta(I586 +I417 +I586 +I420 +ta(I586 +I420 +I586 +I419 +ta(I586 +I419 +I586 +I399 +ta(I586 +I399 +I586 +I383 +ta(I586 +I383 +I585 +I365 +ta(I585 +I365 +I583 +I345 +ta(I583 +I345 +I582 +I321 +ta(I582 +I321 +I580 +I299 +ta(I580 +I299 +I578 +I279 +ta(I578 +I279 +I574 +I257 +ta(I574 +I257 +I571 +I237 +ta(I571 +I237 +I567 +I219 +ta(I567 +I219 +I563 +I203 +ta(I563 +I203 +I559 +I198 +ta(I559 +I198 +I555 +I193 +ta(I555 +I193 +I552 +I191 +ta(I552 +I191 +I551 +I191 +ta(I551 +I191 +I550 +I196 +ta(I550 +I196 +I548 +I216 +ta(I548 +I216 +I547 +I232 +ta(I547 +I232 +I547 +I254 +ta(I547 +I254 +I547 +I278 +ta(I547 +I278 +I547 +I302 +ta(I547 +I302 +I547 +I326 +ta(I547 +I326 +I547 +I350 +ta(I547 +I350 +I547 +I374 +ta(I547 +I374 +I547 +I394 +ta(I547 +I394 +I547 +I412 +ta(I547 +I412 +I547 +I426 +ta(I547 +I426 +I547 +I429 +ta(I547 +I429 +I548 +I432 +ta(I548 +I432 +I548 +I433 +ta(I548 +I433 +I549 +I433 +ta(I549 +I433 +I550 +I431 +ta(I550 +I431 +I550 +I426 +ta(I550 +I426 +I550 +I412 +ta(I550 +I412 +I550 +I396 +ta(I550 +I396 +I550 +I378 +ta(I550 +I378 +I549 +I358 +ta(I549 +I358 +I548 +I334 +ta(I548 +I334 +I547 +I308 +ta(I547 +I308 +I546 +I284 +ta(I546 +I284 +I546 +I260 +ta(I546 +I260 +I545 +I236 +ta(I545 +I236 +I543 +I216 +ta(I543 +I216 +I542 +I200 +ta(I542 +I200 +I541 +I196 +ta(I541 +I196 +I541 +I192 +ta(I541 +I192 +I540 +I191 +ta(I540 +I191 +I539 +I197 +ta(I539 +I197 +I538 +I215 +ta(I538 +I215 +I537 +I235 +ta(I537 +I235 +I536 +I257 +ta(I536 +I257 +I534 +I281 +ta(I534 +I281 +I532 +I307 +ta(I532 +I307 +I531 +I331 +ta(I531 +I331 +I529 +I355 +ta(I529 +I355 +I527 +I375 +ta(I527 +I375 +I524 +I391 +ta(I524 +I391 +I523 +I396 +ta(I523 +I396 +I522 +I399 +ta(I522 +I399 +I522 +I400 +ta(I522 +I400 +I523 +I396 +ta(I523 +I396 +I523 +I380 +ta(I523 +I380 +I522 +I374 +ta(I522 +I374 +I520 +I358 +ta(I520 +I358 +I518 +I342 +ta(I518 +I342 +I515 +I324 +ta(I515 +I324 +I512 +I306 +ta(I512 +I306 +I508 +I286 +ta(I508 +I286 +I504 +I268 +ta(I504 +I268 +I500 +I250 +ta(I500 +I250 +I494 +I232 +ta(I494 +I232 +I491 +I216 +ta(I491 +I216 +I488 +I210 +ta(I488 +I210 +I484 +I205 +ta(I484 +I205 +I482 +I202 +ta(I482 +I202 +I481 +I201 +ta(I481 +I201 +I480 +I202 +ta(I480 +I202 +I479 +I208 +ta(I479 +I208 +I478 +I228 +ta(I478 +I228 +I477 +I244 +ta(I477 +I244 +I475 +I264 +ta(I475 +I264 +I472 +I288 +ta(I472 +I288 +I469 +I314 +ta(I469 +I314 +I466 +I338 +ta(I466 +I338 +I462 +I362 +ta(I462 +I362 +I458 +I388 +ta(I458 +I388 +I455 +I412 +ta(I455 +I412 +I452 +I430 +ta(I452 +I430 +I450 +I446 +ta(I450 +I446 +I448 +I450 +ta(I448 +I450 +I447 +I452 +ta(I447 +I452 +I447 +I451 +ta(I447 +I451 +I447 +I445 +ta(I447 +I445 +I447 +I429 +ta(I447 +I429 +I447 +I415 +ta(I447 +I415 +I448 +I397 +ta(I448 +I397 +I449 +I377 +ta(I449 +I377 +I451 +I357 +ta(I451 +I357 +I452 +I337 +ta(I452 +I337 +I453 +I317 +ta(I453 +I317 +I454 +I297 +ta(I454 +I297 +I454 +I279 +ta(I454 +I279 +I454 +I263 +ta(I454 +I263 +I453 +I247 +ta(I453 +I247 +I453 +I244 +ta(I453 +I244 +I452 +I242 +ta(I452 +I242 +I452 +I241 +ta(I452 +I241 +I450 +I246 +ta(I450 +I246 +I448 +I262 +ta(I448 +I262 +I446 +I282 +ta(I446 +I282 +I444 +I302 +ta(I444 +I302 +I440 +I326 +ta(I440 +I326 +I437 +I350 +ta(I437 +I350 +I434 +I374 +ta(I434 +I374 +I430 +I400 +ta(I430 +I400 +I427 +I420 +ta(I427 +I420 +I425 +I434 +ta(I425 +I434 +I422 +I440 +ta(I422 +I440 +I421 +I444 +ta(I421 +I444 +I420 +I446 +ta(I420 +I446 +I420 +I447 +ta(I420 +I447 +I421 +I445 +ta(I421 +I445 +I421 +I439 +ta(I421 +I439 +I421 +I425 +ta(I421 +I425 +I421 +I407 +ta(I421 +I407 +I420 +I387 +ta(I420 +I387 +I419 +I367 +ta(I419 +I367 +I417 +I343 +ta(I417 +I343 +I416 +I323 +ta(I416 +I323 +I415 +I301 +ta(I415 +I301 +I413 +I279 +ta(I413 +I279 +I411 +I261 +ta(I411 +I261 +I408 +I245 +ta(I408 +I245 +I405 +I229 +ta(I405 +I229 +I402 +I223 +ta(I402 +I223 +I398 +I219 +ta(I398 +I219 +I395 +I215 +ta(I395 +I215 +I392 +I214 +ta(I392 +I214 +I390 +I213 +ta(I390 +I213 +I387 +I214 +ta(I387 +I214 +I384 +I219 +ta(I384 +I219 +I379 +I225 +ta(I379 +I225 +I375 +I245 +ta(I375 +I245 +I369 +I267 +ta(I369 +I267 +I365 +I289 +ta(I365 +I289 +I351 +I313 +ta(I351 +I313 +I346 +I339 +ta(I346 +I339 +I342 +I363 +ta(I342 +I363 +I337 +I385 +ta(I337 +I385 +I333 +I405 +ta(I333 +I405 +I329 +I423 +ta(I329 +I423 +I327 +I428 +ta(I327 +I428 +I326 +I432 +ta(I326 +I432 +I326 +I433 +ta(I326 +I433 +I326 +I434 +ta(I326 +I434 +I327 +I432 +ta(I327 +I432 +I329 +I426 +ta(I329 +I426 +I331 +I410 +ta(I331 +I410 +I334 +I396 +ta(I334 +I396 +I336 +I376 +ta(I336 +I376 +I339 +I356 +ta(I339 +I356 +I342 +I334 +ta(I342 +I334 +I345 +I312 +ta(I345 +I312 +I347 +I292 +ta(I347 +I292 +I348 +I272 +ta(I348 +I272 +I349 +I252 +ta(I349 +I252 +I349 +I236 +ta(I349 +I236 +I349 +I220 +ta(I349 +I220 +I349 +I214 +ta(I349 +I214 +I349 +I211 +ta(I349 +I211 +I348 +I210 +ta(I348 +I210 +I348 +I211 +ta(I348 +I211 +I347 +I229 +ta(I347 +I229 +I346 +I247 +ta(I346 +I247 +I345 +I265 +ta(I345 +I265 +I343 +I287 +ta(I343 +I287 +I342 +I313 +ta(I342 +I313 +I340 +I337 +ta(I340 +I337 +I338 +I361 +ta(I338 +I361 +I336 +I383 +ta(I336 +I383 +I333 +I403 +ta(I333 +I403 +I332 +I419 +ta(I332 +I419 +I331 +I424 +ta(I331 +I424 +I331 +I427 +ta(I331 +I427 +I331 +I429 +ta(I331 +I429 +I332 +I427 +ta(I332 +I427 +I333 +I411 +ta(I333 +I411 +I335 +I395 +ta(I335 +I395 +I336 +I377 +ta(I336 +I377 +I337 +I359 +ta(I337 +I359 +I337 +I335 +ta(I337 +I335 +I337 +I315 +ta(I337 +I315 +I337 +I293 +ta(I337 +I293 +I336 +I269 +ta(I336 +I269 +I335 +I251 +ta(I335 +I251 +I333 +I231 +ta(I333 +I231 +I332 +I217 +ta(I332 +I217 +I330 +I203 +ta(I330 +I203 +I329 +I199 +ta(I329 +I199 +I328 +I196 +ta(I328 +I196 +I327 +I195 +ta(I327 +I195 +I325 +I199 +ta(I325 +I199 +I323 +I219 +ta(I323 +I219 +I321 +I235 +ta(I321 +I235 +I318 +I257 +ta(I318 +I257 +I315 +I281 +ta(I315 +I281 +I312 +I305 +ta(I312 +I305 +I309 +I329 +ta(I309 +I329 +I306 +I355 +ta(I306 +I355 +I304 +I379 +ta(I304 +I379 +I303 +I399 +ta(I303 +I399 +I302 +I415 +ta(I302 +I415 +I302 +I429 +ta(I302 +I429 +I302 +I432 +ta(I302 +I432 +I302 +I434 +ta(I302 +I434 +I302 +I435 +ta(I302 +I435 +I302 +I434 +ta(I302 +I434 +I302 +I428 +ta(I302 +I428 +I302 +I414 +ta(I302 +I414 +I302 +I400 +ta(I302 +I400 +I302 +I382 +ta(I302 +I382 +I302 +I364 +ta(I302 +I364 +I302 +I344 +ta(I302 +I344 +I302 +I322 +ta(I302 +I322 +I302 +I302 +ta(I302 +I302 +I302 +I284 +ta(I302 +I284 +I302 +I266 +ta(I302 +I266 +I302 +I250 +ta(I302 +I250 +I301 +I236 +ta(I301 +I236 +I300 +I231 +ta(I300 +I231 +I299 +I227 +ta(I299 +I227 +I298 +I226 +ta(I298 +I226 +I298 +I225 +ta(I298 +I225 +I296 +I231 +ta(I296 +I231 +I294 +I245 +ta(I294 +I245 +I291 +I265 +ta(I291 +I265 +I289 +I285 +ta(I289 +I285 +I285 +I307 +ta(I285 +I307 +I282 +I327 +ta(I282 +I327 +I278 +I349 +ta(I278 +I349 +I274 +I369 +ta(I274 +I369 +I270 +I385 +ta(I270 +I385 +I268 +I390 +ta(I268 +I390 +I266 +I393 +ta(I266 +I393 +I265 +I395 +ta(I265 +I395 +I265 +I396 +ta(I265 +I396 +I266 +I395 +ta(I266 +I395 +I267 +I390 +ta(I267 +I390 +I267 +I376 +ta(I267 +I376 +I267 +I362 +ta(I267 +I362 +I267 +I344 +ta(I267 +I344 +I267 +I328 +ta(I267 +I328 +I266 +I310 +ta(I266 +I310 +I265 +I294 +ta(I265 +I294 +I264 +I276 +ta(I264 +I276 +I262 +I260 +ta(I262 +I260 +I260 +I246 +ta(I260 +I246 +I257 +I232 +ta(I257 +I232 +I256 +I228 +ta(I256 +I228 +I254 +I224 +ta(I254 +I224 +I252 +I220 +ta(I252 +I220 +I250 +I218 +ta(I250 +I218 +I249 +I218 +ta(I249 +I218 +I247 +I221 +ta(I247 +I221 +I245 +I226 +ta(I245 +I226 +I242 +I240 +ta(I242 +I240 +I238 +I256 +ta(I238 +I256 +I235 +I272 +ta(I235 +I272 +I231 +I288 +ta(I231 +I288 +I227 +I308 +ta(I227 +I308 +I222 +I326 +ta(I222 +I326 +I218 +I344 +ta(I218 +I344 +I214 +I364 +ta(I214 +I364 +I211 +I382 +ta(I211 +I382 +I209 +I388 +ta(I209 +I388 +I207 +I404 +ta(I207 +I404 +I206 +I407 +ta(I206 +I407 +I206 +I409 +ta(I206 +I409 +I206 +I410 +ta(I206 +I410 +I207 +I411 +ta(I207 +I411 +I209 +I409 +ta(I209 +I409 +I212 +I404 +ta(I212 +I404 +I215 +I398 +ta(I215 +I398 +I218 +I384 +ta(I218 +I384 +I222 +I366 +ta(I222 +I366 +I226 +I350 +ta(I226 +I350 +I230 +I330 +ta(I230 +I330 +I233 +I312 +ta(I233 +I312 +I235 +I292 +ta(I235 +I292 +I236 +I276 +ta(I236 +I276 +I237 +I260 +ta(I237 +I260 +I237 +I254 +ta(I237 +I254 +I237 +I251 +ta(I237 +I251 +I236 +I248 +ta(I236 +I248 +I235 +I248 +ta(I235 +I248 +I234 +I249 +ta(I234 +I249 +I232 +I267 +ta(I232 +I267 +I230 +I285 +ta(I230 +I285 +I227 +I305 +ta(I227 +I305 +I224 +I327 +ta(I224 +I327 +I221 +I349 +ta(I221 +I349 +I218 +I369 +ta(I218 +I369 +I215 +I387 +ta(I215 +I387 +I212 +I403 +ta(I212 +I403 +I211 +I408 +ta(I211 +I408 +I209 +I413 +ta(I209 +I413 +I208 +I415 +ta(I208 +I415 +I208 +I417 +ta(I208 +I417 +I208 +I415 +ta(I208 +I415 +I208 +I409 +ta(I208 +I409 +I208 +I404 +ta(I208 +I404 +I208 +I390 +ta(I208 +I390 +I208 +I374 +ta(I208 +I374 +I208 +I358 +ta(I208 +I358 +I208 +I340 +ta(I208 +I340 +I208 +I320 +ta(I208 +I320 +I208 +I302 +ta(I208 +I302 +I207 +I286 +ta(I207 +I286 +I206 +I270 +ta(I206 +I270 +I205 +I256 +ta(I205 +I256 +I204 +I251 +ta(I204 +I251 +I202 +I246 +ta(I202 +I246 +I201 +I243 +ta(I201 +I243 +I200 +I241 +ta(I200 +I241 +I197 +I246 +ta(I197 +I246 +I193 +I260 +ta(I193 +I260 +I190 +I278 +ta(I190 +I278 +I186 +I296 +ta(I186 +I296 +I182 +I312 +ta(I182 +I312 +I178 +I332 +ta(I178 +I332 +I173 +I352 +ta(I173 +I352 +I169 +I370 +ta(I169 +I370 +I165 +I386 +ta(I165 +I386 +I162 +I392 +ta(I162 +I392 +I159 +I398 +ta(I159 +I398 +I157 +I402 +ta(I157 +I402 +I157 +I404 +ta(I157 +I404 +I159 +I401 +ta(I159 +I401 +I161 +I387 +ta(I161 +I387 +I164 +I381 +ta(I164 +I381 +I165 +I367 +ta(I165 +I367 +I166 +I353 +ta(I166 +I353 +I167 +I339 +ta(I167 +I339 +I168 +I321 +ta(I168 +I321 +I169 +I305 +ta(I169 +I305 +I170 +I291 +ta(I170 +I291 +I171 +I275 +ta(I171 +I275 +I171 +I261 +ta(I171 +I261 +I171 +I255 +ta(I171 +I255 +I170 +I251 +ta(I170 +I251 +I170 +I248 +ta(I170 +I248 +I169 +I246 +ta(I169 +I246 +I168 +I246 +ta(I168 +I246 +I167 +I249 +ta(I167 +I249 +I164 +I263 +ta(I164 +I263 +I162 +I279 +ta(I162 +I279 +I160 +I297 +ta(I160 +I297 +I156 +I317 +ta(I156 +I317 +I153 +I339 +ta(I153 +I339 +I150 +I361 +ta(I150 +I361 +I145 +I381 +ta(I145 +I381 +I141 +I401 +ta(I141 +I401 +I137 +I419 +ta(I137 +I419 +I134 +I433 +ta(I134 +I433 +I133 +I438 +ta(I133 +I438 +I133 +I441 +ta(I133 +I441 +I133 +I443 +ta(I133 +I443 +I134 +I443 +ta(I134 +I443 +I135 +I443 +ta(I135 +I443 +I136 +I441 +ta(I136 +I441 +I138 +I436 +ta(I138 +I436 +I140 +I422 +ta(I140 +I422 +I141 +I416 +ta(I141 +I416 +I142 +I402 +ta(I142 +I402 +I143 +I384 +ta(I143 +I384 +I144 +I366 +ta(I144 +I366 +I144 +I346 +ta(I144 +I346 +I144 +I324 +ta(I144 +I324 +I143 +I306 +ta(I143 +I306 +I142 +I288 +ta(I142 +I288 +I141 +I272 +ta(I141 +I272 +I139 +I256 +ta(I139 +I256 +I138 +I252 +ta(I138 +I252 +I135 +I247 +ta(I135 +I247 +I134 +I245 +ta(I134 +I245 +I133 +I244 +ta(I133 +I244 +I131 +I246 +ta(I131 +I246 +I128 +I262 +ta(I128 +I262 +I125 +I280 +ta(I125 +I280 +I121 +I300 +ta(I121 +I300 +I117 +I322 +ta(I117 +I322 +I111 +I344 +ta(I111 +I344 +I107 +I368 +ta(I107 +I368 +I102 +I390 +ta(I102 +I390 +I98 +I408 +ta(I98 +I408 +I95 +I426 +ta(I95 +I426 +I93 +I431 +ta(I93 +I431 +I92 +I434 +ta(I92 +I434 +I92 +I435 +ta(I92 +I435 +I92 +I434 +ta(I92 +I434 +I94 +I428 +ta(I94 +I428 +I96 +I414 +ta(I96 +I414 +I98 +I400 +ta(I98 +I400 +I100 +I384 +ta(I100 +I384 +I101 +I368 +ta(I101 +I368 +I102 +I352 +ta(I102 +I352 +I103 +I336 +ta(I103 +I336 +I104 +I322 +ta(I104 +I322 +I104 +I316 +ta(I104 +I316 +I104 +I310 +ta(I104 +I310 +I104 +I306 +ta(I104 +I306 +I103 +I302 +ta(I103 +I302 +I102 +I298 +ta(I102 +I298 +I101 +I295 +ta(I101 +I295 +I101 +I292 +ta(I101 +I292 +I100 +I292 +ta(I100 +I292 +I99 +I294 +ta(I99 +I294 +I98 +I308 +ta(I98 +I308 +I95 +I326 +ta(I95 +I326 +I93 +I344 +ta(I93 +I344 +I90 +I366 +ta(I90 +I366 +I87 +I386 +ta(I87 +I386 +I83 +I410 +ta(I83 +I410 +I79 +I430 +ta(I79 +I430 +I75 +I448 +ta(I75 +I448 +I71 +I454 +ta(I71 +I454 +I68 +I460 +ta(I68 +I460 +I67 +I462 +ta(I67 +I462 +I66 +I463 +ta(I66 +I463 +I66 +I459 +ta(I66 +I459 +I67 +I443 +ta(I67 +I443 +I67 +I429 +ta(I67 +I429 +I67 +I415 +ta(I67 +I415 +I67 +I397 +ta(I67 +I397 +I66 +I377 +ta(I66 +I377 +I65 +I357 +ta(I65 +I357 +I63 +I337 +ta(I63 +I337 +I62 +I319 +ta(I62 +I319 +I61 +I301 +ta(I61 +I301 +I60 +I285 +ta(I60 +I285 +I57 +I269 +ta(I57 +I269 +I55 +I263 +ta(I55 +I263 +I53 +I257 +ta(I53 +I257 +I50 +I253 +ta(I50 +I253 +I48 +I248 +ta(I48 +I248 +I45 +I245 +ta(I45 +I245 +I43 +I243 +ta(I43 +I243 +I40 +I243 +ta(I40 +I243 +I38 +I243 +ta(I38 +I243 +I34 +I247 +ta(I34 +I247 +I29 +I253 +ta(I29 +I253 +I25 +I259 +ta(I25 +I259 +I23 +I265 +ta(I23 +I265 +I22 +I287 +ta(I22 +I287 +I22 +I305 +ta(I22 +I305 +I22 +I323 +ta(I22 +I323 +I22 +I339 +ta(I22 +I339 +I22 +I345 +ta(I22 +I345 +I22 +I350 +ta(I22 +I350 +I23 +I354 +ta(I23 +I354 +I23 +I357 +ta(I23 +I357 +I23 +I358 +ta(I23 +I358 +I24 +I355 +ta(I24 +I355 +I24 +I349 +ta(I24 +I349 +I25 +I333 +ta(I25 +I333 +I25 +I317 +ta(I25 +I317 +I26 +I299 +ta(I26 +I299 +I27 +I281 +ta(I27 +I281 +I28 +I261 +ta(I28 +I261 +I29 +I243 +ta(I29 +I243 +I30 +I227 +ta(I30 +I227 +I30 +I221 +ta(I30 +I221 +I30 +I217 +ta(I30 +I217 +I30 +I214 +ta(I30 +I214 +I29 +I211 +ta(I29 +I211 +I29 +I210 +ta(I29 +I210 +I28 +I210 +ta(I28 +I210 +I27 +I213 +ta(I27 +I213 +I26 +I217 +ta(I26 +I217 +I25 +I235 +ta(I25 +I235 +I24 +I251 +ta(I24 +I251 +I23 +I271 +ta(I23 +I271 +I22 +I289 +ta(I22 +I289 +I22 +I311 +ta(I22 +I311 +I22 +I333 +ta(I22 +I333 +I22 +I351 +ta(I22 +I351 +I22 +I369 +ta(I22 +I369 +I22 +I385 +ta(I22 +I385 +I23 +I391 +ta(I23 +I391 +I23 +I397 +ta(I23 +I397 +I24 +I400 +ta(I24 +I400 +I24 +I403 +ta(I24 +I403 +I24 +I404 +ta(I24 +I404 +I25 +I405 +ta(I25 +I405 +I26 +I405 +ta(I26 +I405 +I27 +I405 +ta(I27 +I405 +I26 +I405 +ta(I26 +I405 +I23 +I403 +ta(I23 +I403 +I19 +I402 +ta(I19 +I402 +I20 +I403 +tatp14 +a(g8 +I1 +(lp15 +(I15 +I424 +I15 +I425 +ta(I15 +I425 +I15 +I429 +ta(I15 +I429 +I15 +I432 +ta(I15 +I432 +I15 +I437 +ta(I15 +I437 +I16 +I451 +ta(I16 +I451 +I17 +I457 +ta(I17 +I457 +I17 +I463 +ta(I17 +I463 +I18 +I469 +ta(I18 +I469 +I18 +I475 +ta(I18 +I475 +I18 +I495 +ta(I18 +I495 +I18 +I511 +ta(I18 +I511 +I18 +I531 +ta(I18 +I531 +I18 +I555 +ta(I18 +I555 +I18 +I577 +ta(I18 +I577 +I18 +I599 +ta(I18 +I599 +I18 +I619 +ta(I18 +I619 +I18 +I635 +ta(I18 +I635 +I18 +I639 +ta(I18 +I639 +I19 +I641 +ta(I19 +I641 +I19 +I642 +ta(I19 +I642 +I20 +I639 +ta(I20 +I639 +I22 +I617 +ta(I22 +I617 +I23 +I595 +ta(I23 +I595 +I24 +I569 +ta(I24 +I569 +I26 +I541 +ta(I26 +I541 +I28 +I513 +ta(I28 +I513 +I30 +I487 +ta(I30 +I487 +I31 +I457 +ta(I31 +I457 +I33 +I433 +ta(I33 +I433 +I34 +I411 +ta(I34 +I411 +I34 +I391 +ta(I34 +I391 +I34 +I377 +ta(I34 +I377 +I34 +I372 +ta(I34 +I372 +I34 +I370 +ta(I34 +I370 +I34 +I369 +ta(I34 +I369 +I34 +I373 +ta(I34 +I373 +I34 +I389 +ta(I34 +I389 +I34 +I407 +ta(I34 +I407 +I35 +I427 +ta(I35 +I427 +I35 +I447 +ta(I35 +I447 +I35 +I469 +ta(I35 +I469 +I35 +I493 +ta(I35 +I493 +I35 +I515 +ta(I35 +I515 +I35 +I535 +ta(I35 +I535 +I35 +I553 +ta(I35 +I553 +I37 +I567 +ta(I37 +I567 +I37 +I570 +ta(I37 +I570 +I38 +I573 +ta(I38 +I573 +I39 +I573 +ta(I39 +I573 +I40 +I573 +ta(I40 +I573 +I40 +I568 +ta(I40 +I568 +I40 +I554 +ta(I40 +I554 +I40 +I538 +ta(I40 +I538 +I40 +I520 +ta(I40 +I520 +I40 +I500 +ta(I40 +I500 +I40 +I478 +ta(I40 +I478 +I40 +I456 +ta(I40 +I456 +I42 +I430 +ta(I42 +I430 +I42 +I406 +ta(I42 +I406 +I43 +I386 +ta(I43 +I386 +I45 +I368 +ta(I45 +I368 +I46 +I352 +ta(I46 +I352 +I46 +I347 +ta(I46 +I347 +I46 +I344 +ta(I46 +I344 +I46 +I342 +ta(I46 +I342 +I46 +I348 +ta(I46 +I348 +I46 +I370 +ta(I46 +I370 +I46 +I392 +ta(I46 +I392 +I47 +I416 +ta(I47 +I416 +I47 +I440 +ta(I47 +I440 +I47 +I466 +ta(I47 +I466 +I47 +I490 +ta(I47 +I490 +I47 +I514 +ta(I47 +I514 +I47 +I534 +ta(I47 +I534 +I47 +I554 +ta(I47 +I554 +I48 +I560 +ta(I48 +I560 +I49 +I564 +ta(I49 +I564 +I51 +I566 +ta(I51 +I566 +I52 +I567 +ta(I52 +I567 +I53 +I567 +ta(I53 +I567 +I54 +I565 +ta(I54 +I565 +I56 +I549 +ta(I56 +I549 +I58 +I533 +ta(I58 +I533 +I59 +I515 +ta(I59 +I515 +I60 +I493 +ta(I60 +I493 +I61 +I471 +ta(I61 +I471 +I63 +I449 +ta(I63 +I449 +I66 +I427 +ta(I66 +I427 +I68 +I407 +ta(I68 +I407 +I70 +I387 +ta(I70 +I387 +I72 +I369 +ta(I72 +I369 +I73 +I363 +ta(I73 +I363 +I73 +I361 +ta(I73 +I361 +I74 +I359 +ta(I74 +I359 +I74 +I361 +ta(I74 +I361 +I74 +I381 +ta(I74 +I381 +I75 +I397 +ta(I75 +I397 +I75 +I417 +ta(I75 +I417 +I76 +I441 +ta(I76 +I441 +I78 +I461 +ta(I78 +I461 +I79 +I483 +ta(I79 +I483 +I81 +I503 +ta(I81 +I503 +I82 +I525 +ta(I82 +I525 +I83 +I543 +ta(I83 +I543 +I84 +I559 +ta(I84 +I559 +I86 +I564 +ta(I86 +I564 +I88 +I569 +ta(I88 +I569 +I90 +I571 +ta(I90 +I571 +I91 +I572 +ta(I91 +I572 +I92 +I568 +ta(I92 +I568 +I95 +I552 +ta(I95 +I552 +I97 +I538 +ta(I97 +I538 +I99 +I520 +ta(I99 +I520 +I101 +I504 +ta(I101 +I504 +I103 +I486 +ta(I103 +I486 +I106 +I466 +ta(I106 +I466 +I109 +I446 +ta(I109 +I446 +I112 +I432 +ta(I112 +I432 +I114 +I414 +ta(I114 +I414 +I116 +I408 +ta(I116 +I408 +I118 +I403 +ta(I118 +I403 +I119 +I400 +ta(I119 +I400 +I119 +I398 +ta(I119 +I398 +I119 +I399 +ta(I119 +I399 +I119 +I415 +ta(I119 +I415 +I119 +I429 +ta(I119 +I429 +I121 +I447 +ta(I121 +I447 +I122 +I469 +ta(I122 +I469 +I123 +I487 +ta(I123 +I487 +I125 +I509 +ta(I125 +I509 +I126 +I531 +ta(I126 +I531 +I127 +I547 +ta(I127 +I547 +I128 +I561 +ta(I128 +I561 +I129 +I565 +ta(I129 +I565 +I130 +I568 +ta(I130 +I568 +I131 +I570 +ta(I131 +I570 +I132 +I570 +ta(I132 +I570 +I133 +I568 +ta(I133 +I568 +I135 +I563 +ta(I135 +I563 +I137 +I549 +ta(I137 +I549 +I139 +I533 +ta(I139 +I533 +I141 +I517 +ta(I141 +I517 +I142 +I495 +ta(I142 +I495 +I143 +I477 +ta(I143 +I477 +I145 +I455 +ta(I145 +I455 +I146 +I433 +ta(I146 +I433 +I148 +I415 +ta(I148 +I415 +I149 +I397 +ta(I149 +I397 +I150 +I379 +ta(I150 +I379 +I152 +I365 +ta(I152 +I365 +I154 +I361 +ta(I154 +I361 +I155 +I358 +ta(I155 +I358 +I155 +I356 +ta(I155 +I356 +I155 +I358 +ta(I155 +I358 +I155 +I374 +ta(I155 +I374 +I155 +I390 +ta(I155 +I390 +I156 +I410 +ta(I156 +I410 +I156 +I430 +ta(I156 +I430 +I156 +I454 +ta(I156 +I454 +I156 +I476 +ta(I156 +I476 +I156 +I498 +ta(I156 +I498 +I156 +I518 +ta(I156 +I518 +I156 +I540 +ta(I156 +I540 +I158 +I558 +ta(I158 +I558 +I159 +I572 +ta(I159 +I572 +I160 +I576 +ta(I160 +I576 +I162 +I578 +ta(I162 +I578 +I163 +I579 +ta(I163 +I579 +I164 +I579 +ta(I164 +I579 +I165 +I578 +ta(I165 +I578 +I167 +I564 +ta(I167 +I564 +I169 +I558 +ta(I169 +I558 +I172 +I538 +ta(I172 +I538 +I174 +I520 +ta(I174 +I520 +I177 +I498 +ta(I177 +I498 +I180 +I476 +ta(I180 +I476 +I182 +I454 +ta(I182 +I454 +I185 +I432 +ta(I185 +I432 +I188 +I414 +ta(I188 +I414 +I191 +I394 +ta(I191 +I394 +I193 +I378 +ta(I193 +I378 +I194 +I362 +ta(I194 +I362 +I195 +I348 +ta(I195 +I348 +I196 +I343 +ta(I196 +I343 +I196 +I340 +ta(I196 +I340 +I196 +I338 +ta(I196 +I338 +I197 +I338 +ta(I197 +I338 +I198 +I356 +ta(I198 +I356 +I199 +I372 +ta(I199 +I372 +I200 +I390 +ta(I200 +I390 +I201 +I414 +ta(I201 +I414 +I203 +I436 +ta(I203 +I436 +I204 +I460 +ta(I204 +I460 +I204 +I486 +ta(I204 +I486 +I205 +I508 +ta(I205 +I508 +I206 +I528 +ta(I206 +I528 +I207 +I548 +ta(I207 +I548 +I209 +I554 +ta(I209 +I554 +I211 +I558 +ta(I211 +I558 +I212 +I560 +ta(I212 +I560 +I212 +I561 +ta(I212 +I561 +I213 +I561 +ta(I213 +I561 +I213 +I558 +ta(I213 +I558 +I215 +I553 +ta(I215 +I553 +I216 +I539 +ta(I216 +I539 +I217 +I523 +ta(I217 +I523 +I218 +I501 +ta(I218 +I501 +I219 +I483 +ta(I219 +I483 +I221 +I461 +ta(I221 +I461 +I224 +I439 +ta(I224 +I439 +I227 +I417 +ta(I227 +I417 +I228 +I397 +ta(I228 +I397 +I229 +I377 +ta(I229 +I377 +I230 +I361 +ta(I230 +I361 +I231 +I347 +ta(I231 +I347 +I232 +I342 +ta(I232 +I342 +I232 +I338 +ta(I232 +I338 +I232 +I337 +ta(I232 +I337 +I233 +I337 +ta(I233 +I337 +I233 +I342 +ta(I233 +I342 +I233 +I356 +ta(I233 +I356 +I233 +I372 +ta(I233 +I372 +I233 +I394 +ta(I233 +I394 +I233 +I416 +ta(I233 +I416 +I233 +I438 +ta(I233 +I438 +I233 +I462 +ta(I233 +I462 +I233 +I484 +ta(I233 +I484 +I233 +I504 +ta(I233 +I504 +I233 +I526 +ta(I233 +I526 +I233 +I540 +ta(I233 +I540 +I233 +I545 +ta(I233 +I545 +I234 +I548 +ta(I234 +I548 +I235 +I551 +ta(I235 +I551 +I236 +I551 +ta(I236 +I551 +I237 +I549 +ta(I237 +I549 +I238 +I543 +ta(I238 +I543 +I240 +I529 +ta(I240 +I529 +I242 +I513 +ta(I242 +I513 +I245 +I495 +ta(I245 +I495 +I247 +I477 +ta(I247 +I477 +I250 +I457 +ta(I250 +I457 +I252 +I439 +ta(I252 +I439 +I255 +I417 +ta(I255 +I417 +I258 +I399 +ta(I258 +I399 +I261 +I381 +ta(I261 +I381 +I263 +I365 +ta(I263 +I365 +I265 +I351 +ta(I265 +I351 +I266 +I347 +ta(I266 +I347 +I267 +I343 +ta(I267 +I343 +I267 +I342 +ta(I267 +I342 +I267 +I348 +ta(I267 +I348 +I268 +I368 +ta(I268 +I368 +I269 +I384 +ta(I269 +I384 +I271 +I404 +ta(I271 +I404 +I272 +I424 +ta(I272 +I424 +I273 +I442 +ta(I273 +I442 +I274 +I462 +ta(I274 +I462 +I274 +I482 +ta(I274 +I482 +I274 +I498 +ta(I274 +I498 +I276 +I514 +ta(I276 +I514 +I277 +I520 +ta(I277 +I520 +I277 +I525 +ta(I277 +I525 +I279 +I527 +ta(I279 +I527 +I279 +I529 +ta(I279 +I529 +I280 +I528 +ta(I280 +I528 +I281 +I512 +ta(I281 +I512 +I282 +I498 +ta(I282 +I498 +I283 +I482 +ta(I283 +I482 +I284 +I460 +ta(I284 +I460 +I286 +I438 +ta(I286 +I438 +I287 +I416 +ta(I287 +I416 +I289 +I394 +ta(I289 +I394 +I290 +I372 +ta(I290 +I372 +I291 +I354 +ta(I291 +I354 +I292 +I336 +ta(I292 +I336 +I292 +I330 +ta(I292 +I330 +I292 +I327 +ta(I292 +I327 +I292 +I324 +ta(I292 +I324 +I292 +I323 +ta(I292 +I323 +I291 +I329 +ta(I291 +I329 +I291 +I343 +ta(I291 +I343 +I291 +I359 +ta(I291 +I359 +I291 +I381 +ta(I291 +I381 +I293 +I401 +ta(I293 +I401 +I294 +I423 +ta(I294 +I423 +I294 +I449 +ta(I294 +I449 +I294 +I473 +ta(I294 +I473 +I294 +I497 +ta(I294 +I497 +I295 +I517 +ta(I295 +I517 +I296 +I539 +ta(I296 +I539 +I297 +I553 +ta(I297 +I553 +I299 +I557 +ta(I299 +I557 +I301 +I559 +ta(I301 +I559 +I302 +I560 +ta(I302 +I560 +I303 +I560 +ta(I303 +I560 +I304 +I558 +ta(I304 +I558 +I306 +I552 +ta(I306 +I552 +I308 +I538 +ta(I308 +I538 +I310 +I520 +ta(I310 +I520 +I312 +I502 +ta(I312 +I502 +I314 +I484 +ta(I314 +I484 +I316 +I466 +ta(I316 +I466 +I318 +I446 +ta(I318 +I446 +I320 +I426 +ta(I320 +I426 +I321 +I406 +ta(I321 +I406 +I322 +I390 +ta(I322 +I390 +I322 +I374 +ta(I322 +I374 +I322 +I360 +ta(I322 +I360 +I322 +I357 +ta(I322 +I357 +I322 +I355 +ta(I322 +I355 +I322 +I354 +ta(I322 +I354 +I322 +I355 +ta(I322 +I355 +I322 +I361 +ta(I322 +I361 +I323 +I367 +ta(I323 +I367 +I323 +I383 +ta(I323 +I383 +I324 +I399 +ta(I324 +I399 +I325 +I415 +ta(I325 +I415 +I325 +I433 +ta(I325 +I433 +I326 +I453 +ta(I326 +I453 +I327 +I473 +ta(I327 +I473 +I328 +I493 +ta(I328 +I493 +I330 +I513 +ta(I330 +I513 +I331 +I529 +ta(I331 +I529 +I333 +I534 +ta(I333 +I534 +I335 +I538 +ta(I335 +I538 +I336 +I541 +ta(I336 +I541 +I337 +I541 +ta(I337 +I541 +I338 +I541 +ta(I338 +I541 +I339 +I540 +ta(I339 +I540 +I340 +I535 +ta(I340 +I535 +I342 +I521 +ta(I342 +I521 +I344 +I507 +ta(I344 +I507 +I346 +I491 +ta(I346 +I491 +I349 +I471 +ta(I349 +I471 +I351 +I453 +ta(I351 +I453 +I353 +I435 +ta(I353 +I435 +I356 +I413 +ta(I356 +I413 +I358 +I395 +ta(I358 +I395 +I359 +I379 +ta(I359 +I379 +I360 +I365 +ta(I360 +I365 +I360 +I351 +ta(I360 +I351 +I361 +I348 +ta(I361 +I348 +I361 +I345 +ta(I361 +I345 +I361 +I349 +ta(I361 +I349 +I361 +I371 +ta(I361 +I371 +I362 +I387 +ta(I362 +I387 +I363 +I407 +ta(I363 +I407 +I365 +I427 +ta(I365 +I427 +I366 +I447 +ta(I366 +I447 +I366 +I463 +ta(I366 +I463 +I368 +I485 +ta(I368 +I485 +I369 +I503 +ta(I369 +I503 +I371 +I519 +ta(I371 +I519 +I374 +I537 +ta(I374 +I537 +I377 +I543 +ta(I377 +I543 +I380 +I548 +ta(I380 +I548 +I383 +I551 +ta(I383 +I551 +I385 +I553 +ta(I385 +I553 +I386 +I553 +ta(I386 +I553 +I387 +I553 +ta(I387 +I553 +I389 +I549 +ta(I389 +I549 +I391 +I544 +ta(I391 +I544 +I394 +I530 +ta(I394 +I530 +I398 +I514 +ta(I398 +I514 +I401 +I498 +ta(I401 +I498 +I405 +I480 +ta(I405 +I480 +I409 +I458 +ta(I409 +I458 +I412 +I440 +ta(I412 +I440 +I414 +I422 +ta(I414 +I422 +I417 +I400 +ta(I417 +I400 +I418 +I384 +ta(I418 +I384 +I419 +I368 +ta(I419 +I368 +I419 +I362 +ta(I419 +I362 +I419 +I359 +ta(I419 +I359 +I419 +I356 +ta(I419 +I356 +I420 +I359 +ta(I420 +I359 +I421 +I379 +ta(I421 +I379 +I421 +I395 +ta(I421 +I395 +I422 +I415 +ta(I422 +I415 +I423 +I435 +ta(I423 +I435 +I425 +I455 +ta(I425 +I455 +I426 +I473 +ta(I426 +I473 +I427 +I491 +ta(I427 +I491 +I429 +I507 +ta(I429 +I507 +I432 +I512 +ta(I432 +I512 +I434 +I518 +ta(I434 +I518 +I436 +I522 +ta(I436 +I522 +I439 +I526 +ta(I439 +I526 +I441 +I530 +ta(I441 +I530 +I443 +I533 +ta(I443 +I533 +I446 +I537 +ta(I446 +I537 +I447 +I539 +ta(I447 +I539 +I449 +I542 +ta(I449 +I542 +I450 +I543 +ta(I450 +I543 +I450 +I544 +ta(I450 +I544 +I450 +I543 +ta(I450 +I543 +I450 +I539 +ta(I450 +I539 +I450 +I536 +ta(I450 +I536 +I450 +I533 +ta(I450 +I533 +I450 +I529 +ta(I450 +I529 +I450 +I526 +ta(I450 +I526 +I450 +I523 +tatp16 +a(g8 +I1 +(lp17 +(I463 +I513 +I462 +I499 +ta(I462 +I499 +I461 +I493 +ta(I461 +I493 +I460 +I487 +ta(I460 +I487 +I460 +I481 +ta(I460 +I481 +I459 +I467 +ta(I459 +I467 +I459 +I453 +ta(I459 +I453 +I459 +I447 +ta(I459 +I447 +I459 +I441 +ta(I459 +I441 +I459 +I435 +ta(I459 +I435 +I459 +I430 +ta(I459 +I430 +I459 +I426 +ta(I459 +I426 +I459 +I423 +ta(I459 +I423 +I459 +I420 +ta(I459 +I420 +I459 +I419 +ta(I459 +I419 +I459 +I421 +ta(I459 +I421 +I459 +I435 +ta(I459 +I435 +I460 +I449 +ta(I460 +I449 +I461 +I467 +ta(I461 +I467 +I462 +I483 +ta(I462 +I483 +I463 +I503 +ta(I463 +I503 +I464 +I523 +ta(I464 +I523 +I464 +I543 +ta(I464 +I543 +I464 +I563 +ta(I464 +I563 +I464 +I583 +ta(I464 +I583 +I464 +I599 +ta(I464 +I599 +I464 +I615 +ta(I464 +I615 +I464 +I621 +ta(I464 +I621 +I464 +I626 +ta(I464 +I626 +I464 +I629 +ta(I464 +I629 +I464 +I630 +ta(I464 +I630 +I464 +I628 +ta(I464 +I628 +I464 +I608 +ta(I464 +I608 +I464 +I592 +ta(I464 +I592 +I463 +I572 +ta(I463 +I572 +I463 +I546 +ta(I463 +I546 +I463 +I518 +ta(I463 +I518 +I464 +I492 +ta(I464 +I492 +I466 +I464 +ta(I466 +I464 +I468 +I438 +ta(I468 +I438 +I471 +I414 +ta(I471 +I414 +I474 +I392 +ta(I474 +I392 +I477 +I376 +ta(I477 +I376 +I479 +I370 +ta(I479 +I370 +I481 +I367 +ta(I481 +I367 +I482 +I365 +ta(I482 +I365 +I483 +I366 +ta(I483 +I366 +I485 +I382 +ta(I485 +I382 +I487 +I396 +ta(I487 +I396 +I490 +I414 +ta(I490 +I414 +I493 +I432 +ta(I493 +I432 +I495 +I446 +ta(I495 +I446 +I498 +I466 +ta(I498 +I466 +I501 +I486 +ta(I501 +I486 +I504 +I502 +ta(I504 +I502 +I506 +I518 +ta(I506 +I518 +I508 +I534 +ta(I508 +I534 +I510 +I548 +ta(I510 +I548 +I511 +I551 +ta(I511 +I551 +I512 +I553 +ta(I512 +I553 +I513 +I554 +ta(I513 +I554 +I514 +I554 +ta(I514 +I554 +I515 +I551 +ta(I515 +I551 +I515 +I537 +ta(I515 +I537 +I516 +I531 +ta(I516 +I531 +I518 +I511 +ta(I518 +I511 +I519 +I493 +ta(I519 +I493 +I521 +I473 +ta(I521 +I473 +I524 +I453 +ta(I524 +I453 +I527 +I431 +ta(I527 +I431 +I530 +I413 +ta(I530 +I413 +I533 +I395 +ta(I533 +I395 +I535 +I381 +ta(I535 +I381 +I537 +I376 +ta(I537 +I376 +I538 +I372 +ta(I538 +I372 +I539 +I370 +ta(I539 +I370 +I539 +I369 +ta(I539 +I369 +I539 +I372 +ta(I539 +I372 +I539 +I386 +ta(I539 +I386 +I540 +I402 +ta(I540 +I402 +I541 +I418 +ta(I541 +I418 +I541 +I438 +ta(I541 +I438 +I541 +I460 +ta(I541 +I460 +I541 +I484 +ta(I541 +I484 +I541 +I506 +ta(I541 +I506 +I541 +I526 +ta(I541 +I526 +I541 +I548 +ta(I541 +I548 +I541 +I566 +ta(I541 +I566 +I541 +I580 +ta(I541 +I580 +I543 +I585 +ta(I543 +I585 +I544 +I588 +ta(I544 +I588 +I544 +I590 +ta(I544 +I590 +I545 +I590 +ta(I545 +I590 +I546 +I590 +ta(I546 +I590 +I547 +I588 +ta(I547 +I588 +I549 +I582 +ta(I549 +I582 +I551 +I568 +ta(I551 +I568 +I554 +I554 +ta(I554 +I554 +I556 +I534 +ta(I556 +I534 +I559 +I510 +ta(I559 +I510 +I562 +I490 +ta(I562 +I490 +I565 +I468 +ta(I565 +I468 +I568 +I446 +ta(I568 +I446 +I570 +I428 +ta(I570 +I428 +I572 +I410 +ta(I572 +I410 +I574 +I396 +ta(I574 +I396 +I576 +I392 +ta(I576 +I392 +I577 +I388 +ta(I577 +I388 +I577 +I387 +ta(I577 +I387 +I577 +I388 +ta(I577 +I388 +I578 +I394 +ta(I578 +I394 +I578 +I408 +ta(I578 +I408 +I578 +I424 +ta(I578 +I424 +I578 +I440 +ta(I578 +I440 +I578 +I460 +ta(I578 +I460 +I578 +I478 +ta(I578 +I478 +I580 +I496 +ta(I580 +I496 +I581 +I516 +ta(I581 +I516 +I582 +I530 +ta(I582 +I530 +I584 +I535 +ta(I584 +I535 +I587 +I539 +ta(I587 +I539 +I589 +I542 +ta(I589 +I542 +I590 +I543 +ta(I590 +I543 +I591 +I543 +ta(I591 +I543 +I593 +I540 +ta(I593 +I540 +I595 +I534 +ta(I595 +I534 +I599 +I520 +ta(I599 +I520 +I602 +I504 +ta(I602 +I504 +I605 +I488 +ta(I605 +I488 +I608 +I470 +ta(I608 +I470 +I611 +I452 +ta(I611 +I452 +I614 +I436 +ta(I614 +I436 +I616 +I422 +ta(I616 +I422 +I618 +I408 +ta(I618 +I408 +I620 +I404 +ta(I620 +I404 +I620 +I400 +ta(I620 +I400 +I621 +I397 +ta(I621 +I397 +I621 +I396 +ta(I621 +I396 +I621 +I400 +ta(I621 +I400 +I621 +I414 +ta(I621 +I414 +I621 +I430 +ta(I621 +I430 +I622 +I446 +ta(I622 +I446 +I623 +I464 +ta(I623 +I464 +I624 +I484 +ta(I624 +I484 +I625 +I504 +ta(I625 +I504 +I626 +I520 +ta(I626 +I520 +I628 +I538 +ta(I628 +I538 +I629 +I544 +ta(I629 +I544 +I630 +I550 +ta(I630 +I550 +I632 +I552 +ta(I632 +I552 +I634 +I555 +ta(I634 +I555 +I635 +I555 +ta(I635 +I555 +I637 +I555 +ta(I637 +I555 +I640 +I552 +ta(I640 +I552 +I643 +I548 +ta(I643 +I548 +I647 +I542 +ta(I647 +I542 +I652 +I524 +ta(I652 +I524 +I655 +I508 +ta(I655 +I508 +I658 +I490 +ta(I658 +I490 +I661 +I472 +ta(I661 +I472 +I663 +I456 +ta(I663 +I456 +I664 +I438 +ta(I664 +I438 +I665 +I422 +ta(I665 +I422 +I666 +I416 +ta(I666 +I416 +I667 +I412 +ta(I667 +I412 +I667 +I409 +ta(I667 +I409 +I667 +I408 +ta(I667 +I408 +I668 +I409 +ta(I668 +I409 +I668 +I414 +ta(I668 +I414 +I668 +I420 +ta(I668 +I420 +I669 +I426 +ta(I669 +I426 +I670 +I442 +ta(I670 +I442 +I671 +I458 +ta(I671 +I458 +I672 +I476 +ta(I672 +I476 +I673 +I490 +ta(I673 +I490 +I674 +I504 +ta(I674 +I504 +I676 +I509 +ta(I676 +I509 +I678 +I515 +ta(I678 +I515 +I681 +I520 +ta(I681 +I520 +I683 +I523 +ta(I683 +I523 +I687 +I526 +ta(I687 +I526 +I689 +I526 +ta(I689 +I526 +I690 +I526 +ta(I690 +I526 +I691 +I526 +ta(I691 +I526 +I692 +I522 +ta(I692 +I522 +I693 +I519 +ta(I693 +I519 +I693 +I514 +ta(I693 +I514 +I694 +I500 +ta(I694 +I500 +I695 +I494 +ta(I695 +I494 +I696 +I480 +ta(I696 +I480 +I696 +I474 +ta(I696 +I474 +I697 +I469 +ta(I697 +I469 +I697 +I463 +ta(I697 +I463 +I698 +I460 +ta(I698 +I460 +I698 +I456 +ta(I698 +I456 +I698 +I453 +ta(I698 +I453 +I698 +I450 +ta(I698 +I450 +I698 +I453 +ta(I698 +I453 +I699 +I467 +ta(I699 +I467 +I700 +I473 +ta(I700 +I473 +I701 +I479 +ta(I701 +I479 +I701 +I485 +ta(I701 +I485 +I702 +I490 +ta(I702 +I490 +I703 +I496 +ta(I703 +I496 +I703 +I501 +ta(I703 +I501 +I703 +I505 +ta(I703 +I505 +I704 +I508 +ta(I704 +I508 +I704 +I511 +ta(I704 +I511 +I704 +I514 +ta(I704 +I514 +I705 +I515 +ta(I705 +I515 +I705 +I516 +ta(I705 +I516 +I705 +I517 +ta(I705 +I517 +I706 +I517 +tatp18 +a(S'Purple' +p19 +I16 +(lp20 +(I56 +I145 +I57 +I145 +ta(I57 +I145 +I58 +I145 +ta(I58 +I145 +I59 +I145 +ta(I59 +I145 +I60 +I145 +ta(I60 +I145 +I61 +I145 +ta(I61 +I145 +I62 +I145 +ta(I62 +I145 +I63 +I144 +ta(I63 +I144 +I64 +I144 +ta(I64 +I144 +I65 +I144 +ta(I65 +I144 +I67 +I144 +ta(I67 +I144 +I68 +I144 +ta(I68 +I144 +I69 +I143 +ta(I69 +I143 +I70 +I143 +ta(I70 +I143 +I71 +I143 +ta(I71 +I143 +I73 +I142 +ta(I73 +I142 +I74 +I142 +ta(I74 +I142 +I75 +I141 +ta(I75 +I141 +I76 +I141 +ta(I76 +I141 +I77 +I140 +ta(I77 +I140 +I77 +I139 +ta(I77 +I139 +I78 +I139 +ta(I78 +I139 +I79 +I139 +ta(I79 +I139 +I79 +I138 +ta(I79 +I138 +I80 +I138 +ta(I80 +I138 +I81 +I138 +ta(I81 +I138 +I82 +I137 +ta(I82 +I137 +I83 +I137 +ta(I83 +I137 +I83 +I136 +ta(I83 +I136 +I84 +I136 +ta(I84 +I136 +I85 +I137 +ta(I85 +I137 +I85 +I138 +ta(I85 +I138 +I85 +I139 +ta(I85 +I139 +I85 +I141 +ta(I85 +I141 +I85 +I142 +ta(I85 +I142 +I85 +I143 +ta(I85 +I143 +I85 +I145 +ta(I85 +I145 +I85 +I146 +ta(I85 +I146 +I85 +I147 +ta(I85 +I147 +I86 +I149 +ta(I86 +I149 +I86 +I151 +ta(I86 +I151 +I86 +I152 +ta(I86 +I152 +I86 +I153 +ta(I86 +I153 +I87 +I154 +ta(I87 +I154 +I87 +I155 +ta(I87 +I155 +I87 +I156 +ta(I87 +I156 +I87 +I157 +ta(I87 +I157 +I87 +I159 +ta(I87 +I159 +I87 +I160 +ta(I87 +I160 +I87 +I161 +ta(I87 +I161 +I87 +I162 +ta(I87 +I162 +I87 +I163 +ta(I87 +I163 +I88 +I164 +ta(I88 +I164 +I88 +I165 +ta(I88 +I165 +I88 +I167 +ta(I88 +I167 +I88 +I168 +ta(I88 +I168 +I88 +I170 +ta(I88 +I170 +I88 +I171 +ta(I88 +I171 +I88 +I172 +ta(I88 +I172 +I88 +I173 +ta(I88 +I173 +I88 +I174 +ta(I88 +I174 +I88 +I175 +ta(I88 +I175 +I88 +I176 +ta(I88 +I176 +I88 +I177 +ta(I88 +I177 +I88 +I178 +ta(I88 +I178 +I88 +I179 +ta(I88 +I179 +I88 +I181 +ta(I88 +I181 +I88 +I182 +ta(I88 +I182 +I88 +I184 +ta(I88 +I184 +I88 +I186 +ta(I88 +I186 +I89 +I187 +ta(I89 +I187 +I89 +I188 +ta(I89 +I188 +I89 +I190 +ta(I89 +I190 +I89 +I191 +ta(I89 +I191 +I90 +I191 +ta(I90 +I191 +I90 +I192 +ta(I90 +I192 +I91 +I193 +ta(I91 +I193 +I91 +I194 +ta(I91 +I194 +I92 +I195 +ta(I92 +I195 +I93 +I196 +ta(I93 +I196 +I94 +I197 +ta(I94 +I197 +I95 +I198 +ta(I95 +I198 +I96 +I199 +ta(I96 +I199 +I97 +I199 +ta(I97 +I199 +I97 +I200 +ta(I97 +I200 +I98 +I201 +ta(I98 +I201 +I99 +I201 +ta(I99 +I201 +I99 +I202 +ta(I99 +I202 +I100 +I202 +ta(I100 +I202 +I101 +I202 +ta(I101 +I202 +I102 +I202 +ta(I102 +I202 +I103 +I202 +ta(I103 +I202 +I104 +I202 +ta(I104 +I202 +I106 +I202 +ta(I106 +I202 +I107 +I201 +ta(I107 +I201 +I108 +I200 +ta(I108 +I200 +I109 +I200 +ta(I109 +I200 +I110 +I199 +ta(I110 +I199 +I111 +I199 +ta(I111 +I199 +I112 +I198 +ta(I112 +I198 +I114 +I196 +ta(I114 +I196 +I114 +I195 +ta(I114 +I195 +I115 +I194 +ta(I115 +I194 +I116 +I193 +ta(I116 +I193 +I117 +I192 +ta(I117 +I192 +I117 +I190 +ta(I117 +I190 +I118 +I189 +ta(I118 +I189 +I119 +I188 +ta(I119 +I188 +I120 +I187 +ta(I120 +I187 +I120 +I185 +ta(I120 +I185 +I121 +I184 +ta(I121 +I184 +I122 +I183 +ta(I122 +I183 +I122 +I182 +ta(I122 +I182 +I122 +I180 +ta(I122 +I180 +I122 +I179 +ta(I122 +I179 +I122 +I178 +ta(I122 +I178 +I122 +I177 +ta(I122 +I177 +I122 +I176 +ta(I122 +I176 +I122 +I175 +ta(I122 +I175 +I122 +I174 +ta(I122 +I174 +I122 +I173 +ta(I122 +I173 +I122 +I172 +ta(I122 +I172 +I122 +I171 +ta(I122 +I171 +I122 +I172 +ta(I122 +I172 +I122 +I173 +ta(I122 +I173 +I123 +I174 +ta(I123 +I174 +I123 +I175 +ta(I123 +I175 +I124 +I177 +ta(I124 +I177 +I125 +I178 +ta(I125 +I178 +I125 +I180 +ta(I125 +I180 +I126 +I181 +ta(I126 +I181 +I126 +I182 +ta(I126 +I182 +I126 +I183 +ta(I126 +I183 +I127 +I184 +ta(I127 +I184 +I127 +I185 +ta(I127 +I185 +I127 +I186 +ta(I127 +I186 +I128 +I187 +ta(I128 +I187 +I129 +I188 +ta(I129 +I188 +I130 +I189 +ta(I130 +I189 +I131 +I190 +ta(I131 +I190 +I132 +I190 +ta(I132 +I190 +I133 +I191 +ta(I133 +I191 +I134 +I191 +ta(I134 +I191 +I135 +I192 +ta(I135 +I192 +I136 +I192 +ta(I136 +I192 +I137 +I192 +ta(I137 +I192 +I138 +I192 +ta(I138 +I192 +I139 +I192 +ta(I139 +I192 +I140 +I192 +ta(I140 +I192 +I141 +I192 +ta(I141 +I192 +I143 +I192 +ta(I143 +I192 +I144 +I191 +ta(I144 +I191 +I145 +I191 +ta(I145 +I191 +I146 +I191 +ta(I146 +I191 +I147 +I191 +ta(I147 +I191 +I148 +I190 +ta(I148 +I190 +I149 +I190 +ta(I149 +I190 +I150 +I189 +ta(I150 +I189 +I151 +I188 +ta(I151 +I188 +I152 +I188 +ta(I152 +I188 +I153 +I188 +ta(I153 +I188 +I153 +I187 +ta(I153 +I187 +I153 +I186 +ta(I153 +I186 +I154 +I186 +ta(I154 +I186 +I154 +I185 +ta(I154 +I185 +I155 +I184 +ta(I155 +I184 +I155 +I182 +ta(I155 +I182 +I156 +I181 +ta(I156 +I181 +I157 +I180 +ta(I157 +I180 +I157 +I179 +ta(I157 +I179 +I158 +I178 +ta(I158 +I178 +I158 +I177 +ta(I158 +I177 +I158 +I175 +ta(I158 +I175 +I159 +I175 +ta(I159 +I175 +I159 +I174 +ta(I159 +I174 +I159 +I173 +ta(I159 +I173 +I160 +I172 +ta(I160 +I172 +I160 +I170 +ta(I160 +I170 +I160 +I168 +ta(I160 +I168 +I161 +I167 +ta(I161 +I167 +I161 +I166 +ta(I161 +I166 +I161 +I164 +ta(I161 +I164 +I162 +I163 +ta(I162 +I163 +I162 +I161 +ta(I162 +I161 +I162 +I160 +ta(I162 +I160 +I162 +I159 +ta(I162 +I159 +I162 +I158 +ta(I162 +I158 +I162 +I157 +ta(I162 +I157 +I162 +I155 +ta(I162 +I155 +I162 +I154 +ta(I162 +I154 +I162 +I153 +ta(I162 +I153 +I162 +I152 +ta(I162 +I152 +I162 +I151 +ta(I162 +I151 +I162 +I150 +ta(I162 +I150 +I162 +I149 +ta(I162 +I149 +I162 +I148 +ta(I162 +I148 +I162 +I147 +ta(I162 +I147 +I161 +I146 +ta(I161 +I146 +I161 +I145 +ta(I161 +I145 +I160 +I144 +ta(I160 +I144 +I160 +I143 +ta(I160 +I143 +I160 +I142 +ta(I160 +I142 +I159 +I141 +ta(I159 +I141 +I159 +I140 +ta(I159 +I140 +I158 +I139 +ta(I158 +I139 +I158 +I138 +ta(I158 +I138 +I157 +I138 +ta(I157 +I138 +I157 +I137 +ta(I157 +I137 +I156 +I136 +ta(I156 +I136 +I156 +I135 +ta(I156 +I135 +I155 +I135 +ta(I155 +I135 +I155 +I134 +ta(I155 +I134 +I154 +I134 +ta(I154 +I134 +I154 +I133 +ta(I154 +I133 +I153 +I132 +ta(I153 +I132 +I153 +I131 +ta(I153 +I131 +I152 +I131 +ta(I152 +I131 +I152 +I130 +ta(I152 +I130 +I151 +I130 +ta(I151 +I130 +I151 +I129 +tatp21 +a(g19 +I16 +(lp22 +(I185 +I125 +I186 +I126 +ta(I186 +I126 +I188 +I127 +ta(I188 +I127 +I189 +I128 +ta(I189 +I128 +I190 +I129 +ta(I190 +I129 +I191 +I130 +ta(I191 +I130 +I192 +I131 +ta(I192 +I131 +I194 +I132 +ta(I194 +I132 +I195 +I134 +ta(I195 +I134 +I196 +I135 +ta(I196 +I135 +I198 +I136 +ta(I198 +I136 +I199 +I138 +ta(I199 +I138 +I200 +I139 +ta(I200 +I139 +I201 +I139 +ta(I201 +I139 +I203 +I141 +ta(I203 +I141 +I204 +I141 +ta(I204 +I141 +I204 +I142 +ta(I204 +I142 +I205 +I143 +ta(I205 +I143 +I206 +I144 +ta(I206 +I144 +I207 +I145 +ta(I207 +I145 +I208 +I146 +ta(I208 +I146 +I209 +I147 +ta(I209 +I147 +I210 +I148 +ta(I210 +I148 +I211 +I149 +ta(I211 +I149 +I212 +I150 +ta(I212 +I150 +I213 +I151 +ta(I213 +I151 +I214 +I152 +ta(I214 +I152 +I215 +I153 +ta(I215 +I153 +I215 +I154 +ta(I215 +I154 +I216 +I155 +ta(I216 +I155 +I218 +I156 +ta(I218 +I156 +I219 +I157 +ta(I219 +I157 +I220 +I159 +ta(I220 +I159 +I221 +I160 +ta(I221 +I160 +I222 +I162 +ta(I222 +I162 +I223 +I164 +ta(I223 +I164 +I224 +I166 +ta(I224 +I166 +I226 +I168 +ta(I226 +I168 +I227 +I170 +ta(I227 +I170 +I228 +I171 +ta(I228 +I171 +I229 +I173 +ta(I229 +I173 +I230 +I174 +ta(I230 +I174 +I230 +I175 +ta(I230 +I175 +I231 +I176 +ta(I231 +I176 +I231 +I177 +ta(I231 +I177 +I232 +I177 +ta(I232 +I177 +I233 +I178 +ta(I233 +I178 +I233 +I180 +ta(I233 +I180 +I234 +I180 +ta(I234 +I180 +I235 +I181 +ta(I235 +I181 +I235 +I182 +ta(I235 +I182 +I236 +I183 +ta(I236 +I183 +I237 +I184 +ta(I237 +I184 +I237 +I185 +ta(I237 +I185 +I238 +I186 +ta(I238 +I186 +I238 +I187 +ta(I238 +I187 +I239 +I187 +ta(I239 +I187 +I239 +I188 +ta(I239 +I188 +I240 +I188 +ta(I240 +I188 +I240 +I189 +ta(I240 +I189 +I241 +I190 +ta(I241 +I190 +I241 +I191 +ta(I241 +I191 +I242 +I192 +ta(I242 +I192 +I243 +I193 +ta(I243 +I193 +I243 +I194 +ta(I243 +I194 +I244 +I194 +tatp23 +a(g19 +I16 +(lp24 +(I236 +I127 +I236 +I128 +ta(I236 +I128 +I236 +I129 +ta(I236 +I129 +I236 +I130 +ta(I236 +I130 +I235 +I131 +ta(I235 +I131 +I234 +I132 +ta(I234 +I132 +I233 +I134 +ta(I233 +I134 +I233 +I135 +ta(I233 +I135 +I232 +I136 +ta(I232 +I136 +I231 +I138 +ta(I231 +I138 +I230 +I139 +ta(I230 +I139 +I229 +I141 +ta(I229 +I141 +I228 +I142 +ta(I228 +I142 +I226 +I144 +ta(I226 +I144 +I225 +I146 +ta(I225 +I146 +I224 +I147 +ta(I224 +I147 +I223 +I149 +ta(I223 +I149 +I222 +I150 +ta(I222 +I150 +I222 +I151 +ta(I222 +I151 +I220 +I153 +ta(I220 +I153 +I220 +I154 +ta(I220 +I154 +I219 +I155 +ta(I219 +I155 +I218 +I156 +ta(I218 +I156 +I217 +I157 +ta(I217 +I157 +I216 +I159 +ta(I216 +I159 +I215 +I160 +ta(I215 +I160 +I214 +I161 +ta(I214 +I161 +I213 +I162 +ta(I213 +I162 +I213 +I163 +ta(I213 +I163 +I212 +I165 +ta(I212 +I165 +I211 +I166 +ta(I211 +I166 +I211 +I167 +ta(I211 +I167 +I209 +I168 +ta(I209 +I168 +I208 +I170 +ta(I208 +I170 +I208 +I171 +ta(I208 +I171 +I207 +I172 +ta(I207 +I172 +I206 +I173 +ta(I206 +I173 +I205 +I174 +ta(I205 +I174 +I205 +I175 +ta(I205 +I175 +I204 +I176 +ta(I204 +I176 +I204 +I177 +ta(I204 +I177 +I203 +I178 +ta(I203 +I178 +I203 +I179 +ta(I203 +I179 +I202 +I181 +ta(I202 +I181 +I201 +I181 +ta(I201 +I181 +I201 +I182 +ta(I201 +I182 +I201 +I183 +ta(I201 +I183 +I200 +I184 +ta(I200 +I184 +I200 +I185 +ta(I200 +I185 +I199 +I185 +ta(I199 +I185 +I199 +I186 +ta(I199 +I186 +I199 +I187 +ta(I199 +I187 +I199 +I188 +ta(I199 +I188 +I198 +I188 +ta(I198 +I188 +I198 +I189 +ta(I198 +I189 +I198 +I190 +ta(I198 +I190 +I197 +I190 +ta(I197 +I190 +I197 +I191 +ta(I197 +I191 +I197 +I192 +tatp25 +a(g19 +I16 +(lp26 +(I261 +I48 +I262 +I48 +ta(I262 +I48 +I262 +I51 +ta(I262 +I51 +I263 +I53 +ta(I263 +I53 +I263 +I55 +ta(I263 +I55 +I263 +I57 +ta(I263 +I57 +I264 +I60 +ta(I264 +I60 +I264 +I62 +ta(I264 +I62 +I264 +I65 +ta(I264 +I65 +I264 +I68 +ta(I264 +I68 +I265 +I71 +ta(I265 +I71 +I265 +I74 +ta(I265 +I74 +I266 +I77 +ta(I266 +I77 +I266 +I80 +ta(I266 +I80 +I267 +I84 +ta(I267 +I84 +I267 +I86 +ta(I267 +I86 +I267 +I89 +ta(I267 +I89 +I268 +I92 +ta(I268 +I92 +I268 +I95 +ta(I268 +I95 +I268 +I97 +ta(I268 +I97 +I269 +I101 +ta(I269 +I101 +I269 +I104 +ta(I269 +I104 +I269 +I107 +ta(I269 +I107 +I269 +I110 +ta(I269 +I110 +I270 +I113 +ta(I270 +I113 +I270 +I116 +ta(I270 +I116 +I271 +I119 +ta(I271 +I119 +I271 +I121 +ta(I271 +I121 +I271 +I123 +ta(I271 +I123 +I272 +I124 +ta(I272 +I124 +I272 +I125 +ta(I272 +I125 +I272 +I126 +ta(I272 +I126 +I273 +I127 +ta(I273 +I127 +I274 +I128 +ta(I274 +I128 +I274 +I130 +ta(I274 +I130 +I275 +I131 +ta(I275 +I131 +I275 +I133 +ta(I275 +I133 +I275 +I135 +ta(I275 +I135 +I276 +I137 +ta(I276 +I137 +I276 +I138 +ta(I276 +I138 +I276 +I140 +ta(I276 +I140 +I276 +I142 +ta(I276 +I142 +I276 +I144 +ta(I276 +I144 +I276 +I145 +ta(I276 +I145 +I276 +I146 +ta(I276 +I146 +I277 +I148 +ta(I277 +I148 +I277 +I150 +ta(I277 +I150 +I277 +I152 +ta(I277 +I152 +I278 +I154 +ta(I278 +I154 +I278 +I155 +ta(I278 +I155 +I278 +I157 +ta(I278 +I157 +I279 +I159 +ta(I279 +I159 +I280 +I162 +ta(I280 +I162 +I280 +I164 +ta(I280 +I164 +I280 +I165 +ta(I280 +I165 +I280 +I168 +ta(I280 +I168 +I280 +I169 +ta(I280 +I169 +I280 +I171 +ta(I280 +I171 +I280 +I173 +ta(I280 +I173 +I280 +I175 +ta(I280 +I175 +I280 +I177 +ta(I280 +I177 +I280 +I179 +ta(I280 +I179 +I280 +I180 +ta(I280 +I180 +I280 +I182 +ta(I280 +I182 +I280 +I183 +ta(I280 +I183 +I280 +I184 +ta(I280 +I184 +I280 +I185 +ta(I280 +I185 +I280 +I186 +ta(I280 +I186 +I280 +I187 +ta(I280 +I187 +I280 +I188 +ta(I280 +I188 +I280 +I189 +ta(I280 +I189 +I280 +I190 +ta(I280 +I190 +I280 +I191 +ta(I280 +I191 +I281 +I192 +ta(I281 +I192 +I281 +I193 +tatp27 +a(g19 +I16 +(lp28 +(I256 +I46 +I257 +I46 +ta(I257 +I46 +I259 +I45 +ta(I259 +I45 +I262 +I44 +ta(I262 +I44 +I265 +I43 +ta(I265 +I43 +I268 +I42 +ta(I268 +I42 +I271 +I40 +ta(I271 +I40 +I275 +I39 +ta(I275 +I39 +I278 +I38 +ta(I278 +I38 +I281 +I37 +ta(I281 +I37 +I284 +I36 +ta(I284 +I36 +I287 +I36 +ta(I287 +I36 +I288 +I35 +ta(I288 +I35 +I290 +I35 +ta(I290 +I35 +I291 +I35 +ta(I291 +I35 +I292 +I35 +ta(I292 +I35 +I294 +I35 +ta(I294 +I35 +I295 +I35 +ta(I295 +I35 +I296 +I35 +ta(I296 +I35 +I297 +I36 +ta(I297 +I36 +I298 +I36 +ta(I298 +I36 +I299 +I36 +ta(I299 +I36 +I300 +I36 +ta(I300 +I36 +I301 +I37 +ta(I301 +I37 +I303 +I38 +ta(I303 +I38 +I304 +I38 +ta(I304 +I38 +I306 +I39 +ta(I306 +I39 +I307 +I39 +ta(I307 +I39 +I309 +I40 +ta(I309 +I40 +I310 +I41 +ta(I310 +I41 +I312 +I42 +ta(I312 +I42 +I314 +I42 +ta(I314 +I42 +I316 +I43 +ta(I316 +I43 +I317 +I44 +ta(I317 +I44 +I319 +I45 +ta(I319 +I45 +I320 +I46 +ta(I320 +I46 +I321 +I47 +ta(I321 +I47 +I322 +I48 +ta(I322 +I48 +I323 +I49 +ta(I323 +I49 +I324 +I50 +ta(I324 +I50 +I325 +I51 +ta(I325 +I51 +I326 +I51 +ta(I326 +I51 +I328 +I52 +ta(I328 +I52 +I329 +I52 +ta(I329 +I52 +I329 +I53 +ta(I329 +I53 +I330 +I54 +ta(I330 +I54 +I331 +I55 +ta(I331 +I55 +I332 +I56 +ta(I332 +I56 +I333 +I57 +ta(I333 +I57 +I334 +I59 +ta(I334 +I59 +I335 +I60 +ta(I335 +I60 +I336 +I61 +ta(I336 +I61 +I338 +I63 +ta(I338 +I63 +I339 +I64 +ta(I339 +I64 +I340 +I66 +ta(I340 +I66 +I341 +I67 +ta(I341 +I67 +I342 +I69 +ta(I342 +I69 +I342 +I70 +ta(I342 +I70 +I343 +I71 +ta(I343 +I71 +I344 +I73 +ta(I344 +I73 +I345 +I73 +ta(I345 +I73 +I345 +I75 +ta(I345 +I75 +I346 +I75 +ta(I346 +I75 +I346 +I76 +ta(I346 +I76 +I346 +I77 +ta(I346 +I77 +I347 +I77 +ta(I347 +I77 +I347 +I78 +ta(I347 +I78 +I347 +I79 +ta(I347 +I79 +I347 +I80 +ta(I347 +I80 +I347 +I81 +ta(I347 +I81 +I347 +I83 +ta(I347 +I83 +I347 +I84 +ta(I347 +I84 +I347 +I85 +ta(I347 +I85 +I347 +I87 +ta(I347 +I87 +I347 +I89 +ta(I347 +I89 +I347 +I91 +ta(I347 +I91 +I346 +I92 +ta(I346 +I92 +I345 +I94 +ta(I345 +I94 +I344 +I96 +ta(I344 +I96 +I343 +I98 +ta(I343 +I98 +I342 +I99 +ta(I342 +I99 +I342 +I100 +ta(I342 +I100 +I341 +I102 +ta(I341 +I102 +I340 +I103 +ta(I340 +I103 +I339 +I104 +ta(I339 +I104 +I338 +I105 +ta(I338 +I105 +I338 +I106 +ta(I338 +I106 +I336 +I108 +ta(I336 +I108 +I335 +I109 +ta(I335 +I109 +I333 +I111 +ta(I333 +I111 +I332 +I112 +ta(I332 +I112 +I331 +I113 +ta(I331 +I113 +I330 +I114 +ta(I330 +I114 +I329 +I115 +ta(I329 +I115 +I328 +I115 +ta(I328 +I115 +I328 +I116 +ta(I328 +I116 +I327 +I116 +ta(I327 +I116 +I326 +I117 +ta(I326 +I117 +I324 +I117 +ta(I324 +I117 +I323 +I118 +ta(I323 +I118 +I321 +I119 +ta(I321 +I119 +I319 +I120 +ta(I319 +I120 +I317 +I121 +ta(I317 +I121 +I315 +I122 +ta(I315 +I122 +I313 +I123 +ta(I313 +I123 +I311 +I124 +ta(I311 +I124 +I309 +I124 +ta(I309 +I124 +I307 +I125 +ta(I307 +I125 +I305 +I126 +ta(I305 +I126 +I304 +I126 +ta(I304 +I126 +I303 +I127 +ta(I303 +I127 +I301 +I127 +ta(I301 +I127 +I300 +I128 +ta(I300 +I128 +I299 +I128 +ta(I299 +I128 +I298 +I128 +ta(I298 +I128 +I297 +I128 +ta(I297 +I128 +I296 +I128 +ta(I296 +I128 +I295 +I128 +ta(I295 +I128 +I293 +I128 +ta(I293 +I128 +I292 +I128 +ta(I292 +I128 +I291 +I128 +ta(I291 +I128 +I290 +I128 +ta(I290 +I128 +I289 +I129 +ta(I289 +I129 +I288 +I129 +ta(I288 +I129 +I287 +I129 +ta(I287 +I129 +I286 +I129 +ta(I286 +I129 +I285 +I129 +ta(I285 +I129 +I284 +I129 +tatp29 +a(g19 +I16 +(lp30 +(I354 +I127 +I355 +I128 +ta(I355 +I128 +I355 +I130 +ta(I355 +I130 +I355 +I131 +ta(I355 +I131 +I355 +I133 +ta(I355 +I133 +I355 +I134 +ta(I355 +I134 +I356 +I136 +ta(I356 +I136 +I356 +I139 +ta(I356 +I139 +I356 +I141 +ta(I356 +I141 +I357 +I143 +ta(I357 +I143 +I357 +I145 +ta(I357 +I145 +I357 +I148 +ta(I357 +I148 +I358 +I150 +ta(I358 +I150 +I359 +I152 +ta(I359 +I152 +I359 +I154 +ta(I359 +I154 +I360 +I156 +ta(I360 +I156 +I361 +I158 +ta(I361 +I158 +I361 +I159 +ta(I361 +I159 +I361 +I161 +ta(I361 +I161 +I362 +I163 +ta(I362 +I163 +I362 +I164 +ta(I362 +I164 +I363 +I165 +ta(I363 +I165 +I364 +I166 +ta(I364 +I166 +I364 +I168 +ta(I364 +I168 +I365 +I168 +ta(I365 +I168 +I366 +I169 +ta(I366 +I169 +I367 +I170 +ta(I367 +I170 +I368 +I170 +ta(I368 +I170 +I368 +I171 +ta(I368 +I171 +I369 +I171 +ta(I369 +I171 +I370 +I173 +ta(I370 +I173 +I370 +I174 +ta(I370 +I174 +I371 +I175 +ta(I371 +I175 +I373 +I176 +ta(I373 +I176 +I374 +I177 +ta(I374 +I177 +I375 +I178 +ta(I375 +I178 +I377 +I179 +ta(I377 +I179 +I378 +I180 +ta(I378 +I180 +I379 +I180 +ta(I379 +I180 +I380 +I181 +ta(I380 +I181 +I381 +I182 +ta(I381 +I182 +I382 +I182 +ta(I382 +I182 +I384 +I182 +ta(I384 +I182 +I385 +I183 +ta(I385 +I183 +I386 +I183 +ta(I386 +I183 +I388 +I183 +ta(I388 +I183 +I389 +I183 +ta(I389 +I183 +I390 +I183 +ta(I390 +I183 +I391 +I183 +ta(I391 +I183 +I392 +I182 +ta(I392 +I182 +I393 +I181 +ta(I393 +I181 +I393 +I180 +ta(I393 +I180 +I394 +I179 +ta(I394 +I179 +I395 +I177 +ta(I395 +I177 +I396 +I176 +ta(I396 +I176 +I397 +I175 +ta(I397 +I175 +I398 +I174 +ta(I398 +I174 +I399 +I174 +ta(I399 +I174 +I399 +I173 +ta(I399 +I173 +I399 +I172 +ta(I399 +I172 +I400 +I171 +ta(I400 +I171 +I400 +I169 +ta(I400 +I169 +I400 +I167 +ta(I400 +I167 +I400 +I166 +ta(I400 +I166 +I401 +I165 +ta(I401 +I165 +I401 +I163 +ta(I401 +I163 +I402 +I162 +ta(I402 +I162 +I402 +I161 +ta(I402 +I161 +I403 +I160 +ta(I403 +I160 +I403 +I159 +ta(I403 +I159 +I403 +I158 +ta(I403 +I158 +I403 +I157 +ta(I403 +I157 +I404 +I156 +ta(I404 +I156 +I404 +I154 +ta(I404 +I154 +I404 +I153 +ta(I404 +I153 +I404 +I151 +ta(I404 +I151 +I405 +I150 +ta(I405 +I150 +I405 +I149 +ta(I405 +I149 +I405 +I146 +ta(I405 +I146 +I405 +I145 +ta(I405 +I145 +I405 +I143 +ta(I405 +I143 +I405 +I142 +ta(I405 +I142 +I405 +I140 +ta(I405 +I140 +I405 +I139 +ta(I405 +I139 +I405 +I138 +ta(I405 +I138 +I405 +I137 +ta(I405 +I137 +I405 +I136 +ta(I405 +I136 +I405 +I135 +ta(I405 +I135 +I405 +I136 +ta(I405 +I136 +I406 +I139 +ta(I406 +I139 +I407 +I141 +ta(I407 +I141 +I408 +I144 +ta(I408 +I144 +I409 +I147 +ta(I409 +I147 +I409 +I149 +ta(I409 +I149 +I410 +I152 +ta(I410 +I152 +I411 +I154 +ta(I411 +I154 +I412 +I156 +ta(I412 +I156 +I412 +I158 +ta(I412 +I158 +I413 +I160 +ta(I413 +I160 +I414 +I161 +ta(I414 +I161 +I415 +I162 +ta(I415 +I162 +I415 +I164 +ta(I415 +I164 +I416 +I165 +ta(I416 +I165 +I417 +I167 +ta(I417 +I167 +I417 +I169 +ta(I417 +I169 +I418 +I171 +ta(I418 +I171 +I418 +I172 +ta(I418 +I172 +I418 +I174 +ta(I418 +I174 +I419 +I176 +ta(I419 +I176 +I419 +I177 +ta(I419 +I177 +I420 +I179 +ta(I420 +I179 +I420 +I180 +ta(I420 +I180 +I421 +I182 +ta(I421 +I182 +I422 +I184 +ta(I422 +I184 +I422 +I185 +ta(I422 +I185 +I422 +I188 +ta(I422 +I188 +I423 +I189 +ta(I423 +I189 +I423 +I191 +ta(I423 +I191 +I423 +I193 +ta(I423 +I193 +I423 +I195 +ta(I423 +I195 +I423 +I197 +ta(I423 +I197 +I423 +I199 +ta(I423 +I199 +I424 +I201 +ta(I424 +I201 +I424 +I203 +ta(I424 +I203 +I424 +I205 +ta(I424 +I205 +I425 +I207 +ta(I425 +I207 +I425 +I209 +ta(I425 +I209 +I425 +I211 +ta(I425 +I211 +I425 +I213 +ta(I425 +I213 +I426 +I215 +ta(I426 +I215 +I426 +I217 +ta(I426 +I217 +I426 +I219 +ta(I426 +I219 +I426 +I221 +ta(I426 +I221 +I426 +I223 +ta(I426 +I223 +I426 +I225 +ta(I426 +I225 +I426 +I226 +ta(I426 +I226 +I426 +I229 +ta(I426 +I229 +I426 +I230 +ta(I426 +I230 +I426 +I232 +ta(I426 +I232 +I427 +I234 +ta(I427 +I234 +I427 +I237 +ta(I427 +I237 +I427 +I239 +ta(I427 +I239 +I427 +I241 +ta(I427 +I241 +I427 +I243 +ta(I427 +I243 +I427 +I245 +ta(I427 +I245 +I426 +I248 +ta(I426 +I248 +I426 +I250 +ta(I426 +I250 +I425 +I252 +ta(I425 +I252 +I424 +I254 +ta(I424 +I254 +I424 +I256 +ta(I424 +I256 +I424 +I257 +ta(I424 +I257 +I423 +I258 +ta(I423 +I258 +I422 +I259 +ta(I422 +I259 +I422 +I261 +ta(I422 +I261 +I421 +I262 +ta(I421 +I262 +I420 +I263 +ta(I420 +I263 +I419 +I265 +ta(I419 +I265 +I418 +I267 +ta(I418 +I267 +I416 +I268 +ta(I416 +I268 +I413 +I270 +ta(I413 +I270 +I411 +I272 +ta(I411 +I272 +I408 +I274 +ta(I408 +I274 +I406 +I275 +ta(I406 +I275 +I404 +I276 +ta(I404 +I276 +I402 +I278 +ta(I402 +I278 +I400 +I279 +ta(I400 +I279 +I398 +I280 +ta(I398 +I280 +I396 +I280 +ta(I396 +I280 +I394 +I280 +ta(I394 +I280 +I392 +I281 +ta(I392 +I281 +I390 +I281 +ta(I390 +I281 +I387 +I281 +ta(I387 +I281 +I385 +I281 +ta(I385 +I281 +I382 +I281 +ta(I382 +I281 +I379 +I280 +ta(I379 +I280 +I376 +I280 +ta(I376 +I280 +I372 +I279 +ta(I372 +I279 +I367 +I279 +ta(I367 +I279 +I362 +I279 +ta(I362 +I279 +I358 +I279 +ta(I358 +I279 +I354 +I279 +ta(I354 +I279 +I350 +I279 +ta(I350 +I279 +I348 +I278 +ta(I348 +I278 +I345 +I278 +ta(I345 +I278 +I343 +I277 +ta(I343 +I277 +I341 +I277 +ta(I341 +I277 +I340 +I276 +ta(I340 +I276 +I338 +I275 +ta(I338 +I275 +I337 +I274 +ta(I337 +I274 +I336 +I274 +ta(I336 +I274 +I335 +I273 +ta(I335 +I273 +I334 +I273 +ta(I334 +I273 +I334 +I272 +ta(I334 +I272 +I333 +I272 +ta(I333 +I272 +I333 +I271 +tatp31 +a(g19 +I16 +(lp32 +(I428 +I79 +I428 +I80 +ta(I428 +I80 +I429 +I81 +ta(I429 +I81 +I430 +I83 +ta(I430 +I83 +I430 +I85 +ta(I430 +I85 +I431 +I87 +ta(I431 +I87 +I431 +I89 +ta(I431 +I89 +I431 +I91 +ta(I431 +I91 +I432 +I93 +ta(I432 +I93 +I432 +I96 +ta(I432 +I96 +I432 +I98 +ta(I432 +I98 +I432 +I101 +ta(I432 +I101 +I433 +I104 +ta(I433 +I104 +I433 +I107 +ta(I433 +I107 +I434 +I109 +ta(I434 +I109 +I434 +I112 +ta(I434 +I112 +I434 +I115 +ta(I434 +I115 +I435 +I117 +ta(I435 +I117 +I435 +I121 +ta(I435 +I121 +I435 +I124 +ta(I435 +I124 +I435 +I126 +ta(I435 +I126 +I436 +I128 +ta(I436 +I128 +I436 +I131 +ta(I436 +I131 +I437 +I133 +ta(I437 +I133 +I438 +I135 +ta(I438 +I135 +I438 +I137 +ta(I438 +I137 +I439 +I139 +ta(I439 +I139 +I440 +I140 +ta(I440 +I140 +I441 +I142 +ta(I441 +I142 +I441 +I144 +ta(I441 +I144 +I442 +I146 +ta(I442 +I146 +I443 +I148 +ta(I443 +I148 +I443 +I149 +ta(I443 +I149 +I443 +I152 +ta(I443 +I152 +I444 +I154 +ta(I444 +I154 +I445 +I156 +ta(I445 +I156 +I445 +I158 +ta(I445 +I158 +I446 +I160 +ta(I446 +I160 +I446 +I162 +ta(I446 +I162 +I447 +I163 +ta(I447 +I163 +I447 +I164 +ta(I447 +I164 +I448 +I165 +ta(I448 +I165 +I448 +I166 +ta(I448 +I166 +I448 +I167 +ta(I448 +I167 +I449 +I167 +ta(I449 +I167 +I449 +I168 +ta(I449 +I168 +I450 +I168 +ta(I450 +I168 +I451 +I169 +ta(I451 +I169 +I452 +I169 +ta(I452 +I169 +I453 +I170 +ta(I453 +I170 +I455 +I170 +ta(I455 +I170 +I456 +I171 +ta(I456 +I171 +I457 +I172 +ta(I457 +I172 +I459 +I172 +ta(I459 +I172 +I460 +I172 +ta(I460 +I172 +I461 +I173 +ta(I461 +I173 +I462 +I173 +ta(I462 +I173 +I463 +I173 +ta(I463 +I173 +I465 +I173 +ta(I465 +I173 +I466 +I174 +ta(I466 +I174 +I467 +I174 +ta(I467 +I174 +I469 +I174 +tatp33 +a(g19 +I16 +(lp34 +(I421 +I106 +I422 +I106 +ta(I422 +I106 +I423 +I106 +ta(I423 +I106 +I424 +I106 +ta(I424 +I106 +I425 +I106 +ta(I425 +I106 +I427 +I107 +ta(I427 +I107 +I428 +I107 +ta(I428 +I107 +I430 +I107 +ta(I430 +I107 +I433 +I107 +ta(I433 +I107 +I435 +I107 +ta(I435 +I107 +I437 +I107 +ta(I437 +I107 +I439 +I107 +ta(I439 +I107 +I441 +I107 +ta(I441 +I107 +I442 +I107 +ta(I442 +I107 +I443 +I107 +ta(I443 +I107 +I444 +I107 +ta(I444 +I107 +I445 +I107 +ta(I445 +I107 +I446 +I107 +ta(I446 +I107 +I447 +I107 +ta(I447 +I107 +I447 +I106 +ta(I447 +I106 +I448 +I106 +ta(I448 +I106 +I449 +I106 +ta(I449 +I106 +I450 +I106 +ta(I450 +I106 +I451 +I106 +ta(I451 +I106 +I452 +I106 +ta(I452 +I106 +I453 +I107 +ta(I453 +I107 +I454 +I107 +tatp35 +a(g19 +I16 +(lp36 +(I459 +I49 +I460 +I49 +ta(I460 +I49 +I462 +I51 +ta(I462 +I51 +I463 +I53 +ta(I463 +I53 +I464 +I55 +ta(I464 +I55 +I466 +I58 +ta(I466 +I58 +I468 +I60 +ta(I468 +I60 +I469 +I64 +ta(I469 +I64 +I471 +I66 +ta(I471 +I66 +I472 +I69 +ta(I472 +I69 +I473 +I72 +ta(I473 +I72 +I474 +I74 +ta(I474 +I74 +I475 +I77 +ta(I475 +I77 +I477 +I80 +ta(I477 +I80 +I478 +I83 +ta(I478 +I83 +I478 +I85 +ta(I478 +I85 +I479 +I88 +ta(I479 +I88 +I480 +I91 +ta(I480 +I91 +I481 +I94 +ta(I481 +I94 +I481 +I97 +ta(I481 +I97 +I482 +I99 +ta(I482 +I99 +I482 +I101 +ta(I482 +I101 +I483 +I103 +ta(I483 +I103 +I483 +I105 +ta(I483 +I105 +I483 +I106 +ta(I483 +I106 +I483 +I109 +ta(I483 +I109 +I484 +I111 +ta(I484 +I111 +I484 +I113 +ta(I484 +I113 +I485 +I115 +ta(I485 +I115 +I486 +I117 +ta(I486 +I117 +I486 +I119 +ta(I486 +I119 +I487 +I122 +ta(I487 +I122 +I488 +I124 +ta(I488 +I124 +I488 +I126 +ta(I488 +I126 +I489 +I128 +ta(I489 +I128 +I489 +I130 +ta(I489 +I130 +I490 +I132 +ta(I490 +I132 +I490 +I134 +ta(I490 +I134 +I491 +I136 +ta(I491 +I136 +I492 +I138 +ta(I492 +I138 +I492 +I140 +ta(I492 +I140 +I493 +I143 +ta(I493 +I143 +I494 +I145 +ta(I494 +I145 +I495 +I148 +ta(I495 +I148 +I495 +I150 +ta(I495 +I150 +I496 +I152 +ta(I496 +I152 +I496 +I153 +ta(I496 +I153 +I497 +I154 +ta(I497 +I154 +I497 +I155 +ta(I497 +I155 +I497 +I157 +ta(I497 +I157 +I498 +I158 +ta(I498 +I158 +I498 +I159 +ta(I498 +I159 +I498 +I160 +ta(I498 +I160 +I499 +I161 +ta(I499 +I161 +I499 +I162 +ta(I499 +I162 +I499 +I163 +ta(I499 +I163 +I499 +I164 +ta(I499 +I164 +I500 +I165 +ta(I500 +I165 +I500 +I166 +ta(I500 +I166 +I500 +I167 +tatp37 +a(g19 +I16 +(lp38 +(I489 +I116 +I488 +I115 +ta(I488 +I115 +I488 +I114 +ta(I488 +I114 +I488 +I113 +ta(I488 +I113 +I488 +I112 +ta(I488 +I112 +I488 +I111 +ta(I488 +I111 +I488 +I110 +ta(I488 +I110 +I488 +I109 +ta(I488 +I109 +I489 +I108 +ta(I489 +I108 +I489 +I107 +ta(I489 +I107 +I491 +I105 +ta(I491 +I105 +I491 +I104 +ta(I491 +I104 +I492 +I103 +ta(I492 +I103 +I492 +I102 +ta(I492 +I102 +I493 +I102 +ta(I493 +I102 +I493 +I101 +ta(I493 +I101 +I494 +I101 +ta(I494 +I101 +I495 +I100 +ta(I495 +I100 +I496 +I99 +ta(I496 +I99 +I497 +I99 +ta(I497 +I99 +I498 +I98 +ta(I498 +I98 +I499 +I98 +ta(I499 +I98 +I500 +I98 +ta(I500 +I98 +I501 +I97 +ta(I501 +I97 +I502 +I97 +ta(I502 +I97 +I504 +I97 +ta(I504 +I97 +I505 +I97 +ta(I505 +I97 +I507 +I97 +ta(I507 +I97 +I509 +I97 +ta(I509 +I97 +I511 +I97 +ta(I511 +I97 +I513 +I97 +ta(I513 +I97 +I514 +I98 +ta(I514 +I98 +I516 +I98 +ta(I516 +I98 +I517 +I98 +ta(I517 +I98 +I518 +I98 +ta(I518 +I98 +I519 +I99 +ta(I519 +I99 +I520 +I99 +ta(I520 +I99 +I521 +I100 +ta(I521 +I100 +I522 +I101 +ta(I522 +I101 +I523 +I102 +ta(I523 +I102 +I524 +I103 +ta(I524 +I103 +I525 +I104 +ta(I525 +I104 +I526 +I104 +ta(I526 +I104 +I527 +I105 +ta(I527 +I105 +I527 +I106 +ta(I527 +I106 +I528 +I107 +ta(I528 +I107 +I529 +I108 +ta(I529 +I108 +I530 +I109 +ta(I530 +I109 +I530 +I110 +ta(I530 +I110 +I531 +I111 +ta(I531 +I111 +I532 +I112 +ta(I532 +I112 +I533 +I113 +ta(I533 +I113 +I534 +I115 +ta(I534 +I115 +I535 +I116 +ta(I535 +I116 +I536 +I118 +ta(I536 +I118 +I538 +I120 +ta(I538 +I120 +I539 +I122 +ta(I539 +I122 +I540 +I124 +ta(I540 +I124 +I541 +I125 +ta(I541 +I125 +I542 +I127 +ta(I542 +I127 +I543 +I129 +ta(I543 +I129 +I544 +I130 +ta(I544 +I130 +I544 +I132 +ta(I544 +I132 +I545 +I134 +ta(I545 +I134 +I545 +I135 +ta(I545 +I135 +I546 +I136 +ta(I546 +I136 +I546 +I137 +ta(I546 +I137 +I546 +I138 +ta(I546 +I138 +I546 +I140 +ta(I546 +I140 +I547 +I142 +ta(I547 +I142 +I547 +I143 +ta(I547 +I143 +I547 +I144 +ta(I547 +I144 +I548 +I146 +ta(I548 +I146 +I548 +I147 +ta(I548 +I147 +I549 +I148 +ta(I549 +I148 +I549 +I149 +ta(I549 +I149 +I549 +I150 +ta(I549 +I150 +I550 +I151 +ta(I550 +I151 +I550 +I152 +ta(I550 +I152 +I550 +I154 +ta(I550 +I154 +I550 +I155 +ta(I550 +I155 +I550 +I156 +ta(I550 +I156 +I550 +I157 +ta(I550 +I157 +I551 +I159 +ta(I551 +I159 +I551 +I161 +ta(I551 +I161 +I551 +I163 +ta(I551 +I163 +I552 +I165 +ta(I552 +I165 +I552 +I166 +ta(I552 +I166 +I552 +I167 +ta(I552 +I167 +I553 +I168 +ta(I553 +I168 +I553 +I169 +ta(I553 +I169 +I553 +I170 +ta(I553 +I170 +I554 +I170 +tatp39 +a(g19 +I16 +(lp40 +(I572 +I101 +I572 +I100 +ta(I572 +I100 +I571 +I100 +ta(I571 +I100 +I571 +I99 +ta(I571 +I99 +I570 +I99 +ta(I570 +I99 +I570 +I98 +ta(I570 +I98 +I569 +I98 +ta(I569 +I98 +I568 +I97 +ta(I568 +I97 +I567 +I97 +ta(I567 +I97 +I566 +I97 +ta(I566 +I97 +I565 +I97 +ta(I565 +I97 +I564 +I98 +ta(I564 +I98 +I563 +I99 +ta(I563 +I99 +I562 +I100 +ta(I562 +I100 +I561 +I102 +ta(I561 +I102 +I560 +I104 +ta(I560 +I104 +I559 +I106 +ta(I559 +I106 +I558 +I109 +ta(I558 +I109 +I557 +I111 +ta(I557 +I111 +I557 +I114 +ta(I557 +I114 +I556 +I117 +ta(I556 +I117 +I555 +I119 +ta(I555 +I119 +I555 +I122 +ta(I555 +I122 +I554 +I125 +ta(I554 +I125 +I554 +I127 +ta(I554 +I127 +I554 +I129 +ta(I554 +I129 +I554 +I131 +ta(I554 +I131 +I554 +I132 +ta(I554 +I132 +I554 +I134 +ta(I554 +I134 +I554 +I136 +ta(I554 +I136 +I555 +I138 +ta(I555 +I138 +I555 +I140 +ta(I555 +I140 +I556 +I142 +ta(I556 +I142 +I557 +I144 +ta(I557 +I144 +I558 +I145 +ta(I558 +I145 +I559 +I147 +ta(I559 +I147 +I559 +I148 +ta(I559 +I148 +I559 +I149 +ta(I559 +I149 +I560 +I149 +ta(I560 +I149 +I560 +I150 +ta(I560 +I150 +I561 +I151 +ta(I561 +I151 +I562 +I151 +ta(I562 +I151 +I563 +I152 +ta(I563 +I152 +I565 +I152 +ta(I565 +I152 +I566 +I153 +ta(I566 +I153 +I568 +I154 +ta(I568 +I154 +I570 +I154 +ta(I570 +I154 +I572 +I155 +ta(I572 +I155 +I573 +I155 +ta(I573 +I155 +I575 +I155 +ta(I575 +I155 +I576 +I156 +ta(I576 +I156 +I578 +I156 +ta(I578 +I156 +I579 +I156 +ta(I579 +I156 +I581 +I156 +ta(I581 +I156 +I583 +I156 +ta(I583 +I156 +I585 +I156 +ta(I585 +I156 +I587 +I156 +ta(I587 +I156 +I588 +I156 +ta(I588 +I156 +I590 +I156 +ta(I590 +I156 +I591 +I156 +ta(I591 +I156 +I592 +I156 +ta(I592 +I156 +I593 +I155 +ta(I593 +I155 +I595 +I154 +ta(I595 +I154 +I596 +I153 +ta(I596 +I153 +I597 +I151 +ta(I597 +I151 +I598 +I150 +ta(I598 +I150 +I599 +I148 +ta(I599 +I148 +I599 +I146 +ta(I599 +I146 +I600 +I145 +ta(I600 +I145 +I601 +I143 +ta(I601 +I143 +I601 +I141 +ta(I601 +I141 +I601 +I140 +ta(I601 +I140 +I602 +I138 +ta(I602 +I138 +I602 +I136 +ta(I602 +I136 +I602 +I135 +ta(I602 +I135 +I602 +I133 +ta(I602 +I133 +I602 +I131 +ta(I602 +I131 +I602 +I128 +ta(I602 +I128 +I602 +I126 +ta(I602 +I126 +I602 +I125 +ta(I602 +I125 +I601 +I123 +ta(I601 +I123 +I601 +I121 +ta(I601 +I121 +I601 +I119 +ta(I601 +I119 +I600 +I118 +ta(I600 +I118 +I599 +I117 +ta(I599 +I117 +I598 +I115 +ta(I598 +I115 +I598 +I114 +ta(I598 +I114 +I597 +I113 +ta(I597 +I113 +I596 +I112 +ta(I596 +I112 +I595 +I110 +ta(I595 +I110 +I594 +I109 +ta(I594 +I109 +I593 +I108 +ta(I593 +I108 +I592 +I107 +ta(I592 +I107 +I591 +I107 +ta(I591 +I107 +I591 +I106 +ta(I591 +I106 +I590 +I106 +ta(I590 +I106 +I589 +I105 +ta(I589 +I105 +I587 +I104 +ta(I587 +I104 +I585 +I104 +ta(I585 +I104 +I582 +I104 +ta(I582 +I104 +I580 +I103 +ta(I580 +I103 +I578 +I103 +ta(I578 +I103 +I576 +I102 +ta(I576 +I102 +I575 +I102 +ta(I575 +I102 +I573 +I101 +ta(I573 +I101 +I572 +I101 +ta(I572 +I101 +I571 +I100 +ta(I571 +I100 +I570 +I100 +ta(I570 +I100 +I569 +I99 +ta(I569 +I99 +I568 +I99 +ta(I568 +I99 +I567 +I98 +ta(I567 +I98 +I566 +I98 +tatp41 +a(g19 +I16 +(lp42 +(I617 +I84 +I618 +I85 +ta(I618 +I85 +I619 +I87 +ta(I619 +I87 +I619 +I88 +ta(I619 +I88 +I620 +I91 +ta(I620 +I91 +I620 +I93 +ta(I620 +I93 +I621 +I95 +ta(I621 +I95 +I622 +I98 +ta(I622 +I98 +I623 +I101 +ta(I623 +I101 +I623 +I103 +ta(I623 +I103 +I624 +I105 +ta(I624 +I105 +I624 +I107 +ta(I624 +I107 +I625 +I109 +ta(I625 +I109 +I625 +I111 +ta(I625 +I111 +I625 +I112 +ta(I625 +I112 +I625 +I114 +ta(I625 +I114 +I625 +I116 +ta(I625 +I116 +I626 +I118 +ta(I626 +I118 +I626 +I120 +ta(I626 +I120 +I626 +I123 +ta(I626 +I123 +I626 +I125 +ta(I626 +I125 +I627 +I126 +ta(I627 +I126 +I627 +I128 +ta(I627 +I128 +I627 +I129 +ta(I627 +I129 +I627 +I131 +ta(I627 +I131 +I627 +I132 +ta(I627 +I132 +I628 +I134 +ta(I628 +I134 +I628 +I135 +ta(I628 +I135 +I628 +I136 +ta(I628 +I136 +I628 +I138 +ta(I628 +I138 +I628 +I139 +ta(I628 +I139 +I628 +I140 +ta(I628 +I140 +I629 +I141 +ta(I629 +I141 +I629 +I142 +ta(I629 +I142 +I629 +I143 +ta(I629 +I143 +I629 +I144 +ta(I629 +I144 +I629 +I145 +ta(I629 +I145 +I629 +I146 +ta(I629 +I146 +I629 +I147 +ta(I629 +I147 +I629 +I148 +ta(I629 +I148 +I629 +I149 +ta(I629 +I149 +I630 +I150 +ta(I630 +I150 +I630 +I151 +ta(I630 +I151 +I630 +I152 +ta(I630 +I152 +I630 +I153 +ta(I630 +I153 +I631 +I153 +ta(I631 +I153 +I631 +I154 +ta(I631 +I154 +I631 +I155 +ta(I631 +I155 +I631 +I156 +ta(I631 +I156 +I631 +I157 +ta(I631 +I157 +I631 +I158 +ta(I631 +I158 +I631 +I159 +ta(I631 +I159 +I631 +I160 +ta(I631 +I160 +I631 +I161 +ta(I631 +I161 +I631 +I162 +tatp43 +a(g19 +I16 +(lp44 +(I622 +I91 +I622 +I90 +ta(I622 +I90 +I622 +I89 +ta(I622 +I89 +I623 +I88 +ta(I623 +I88 +I624 +I87 +ta(I624 +I87 +I625 +I86 +ta(I625 +I86 +I625 +I85 +ta(I625 +I85 +I626 +I84 +ta(I626 +I84 +I627 +I83 +ta(I627 +I83 +I627 +I82 +ta(I627 +I82 +I628 +I82 +ta(I628 +I82 +I629 +I81 +ta(I629 +I81 +I629 +I80 +ta(I629 +I80 +I630 +I80 +ta(I630 +I80 +I631 +I80 +ta(I631 +I80 +I631 +I79 +ta(I631 +I79 +I632 +I79 +ta(I632 +I79 +I633 +I78 +ta(I633 +I78 +I634 +I78 +ta(I634 +I78 +I635 +I77 +ta(I635 +I77 +I637 +I77 +ta(I637 +I77 +I638 +I77 +ta(I638 +I77 +I639 +I76 +ta(I639 +I76 +I640 +I76 +ta(I640 +I76 +I641 +I76 +ta(I641 +I76 +I642 +I76 +ta(I642 +I76 +I643 +I76 +ta(I643 +I76 +I644 +I76 +ta(I644 +I76 +I645 +I76 +ta(I645 +I76 +I647 +I76 +ta(I647 +I76 +I648 +I77 +ta(I648 +I77 +I649 +I77 +ta(I649 +I77 +I650 +I77 +ta(I650 +I77 +I651 +I78 +ta(I651 +I78 +I652 +I79 +ta(I652 +I79 +I653 +I79 +ta(I653 +I79 +I654 +I80 +ta(I654 +I80 +I655 +I81 +ta(I655 +I81 +I656 +I82 +ta(I656 +I82 +I656 +I83 +ta(I656 +I83 +I657 +I83 +ta(I657 +I83 +I659 +I85 +ta(I659 +I85 +I660 +I86 +ta(I660 +I86 +I661 +I87 +ta(I661 +I87 +I661 +I88 +ta(I661 +I88 +I662 +I89 +ta(I662 +I89 +I662 +I91 +ta(I662 +I91 +I663 +I92 +ta(I663 +I92 +I664 +I94 +ta(I664 +I94 +I664 +I95 +ta(I664 +I95 +I665 +I97 +ta(I665 +I97 +I666 +I99 +ta(I666 +I99 +I667 +I100 +ta(I667 +I100 +I667 +I102 +ta(I667 +I102 +I668 +I103 +ta(I668 +I103 +I668 +I105 +ta(I668 +I105 +I669 +I106 +ta(I669 +I106 +I669 +I107 +ta(I669 +I107 +I670 +I109 +ta(I670 +I109 +I670 +I110 +ta(I670 +I110 +I671 +I112 +ta(I671 +I112 +I672 +I114 +ta(I672 +I114 +I672 +I115 +ta(I672 +I115 +I673 +I117 +ta(I673 +I117 +I673 +I118 +ta(I673 +I118 +I674 +I120 +ta(I674 +I120 +I674 +I121 +ta(I674 +I121 +I674 +I122 +ta(I674 +I122 +I675 +I124 +ta(I675 +I124 +I675 +I125 +ta(I675 +I125 +I675 +I126 +ta(I675 +I126 +I675 +I127 +ta(I675 +I127 +I676 +I127 +ta(I676 +I127 +I676 +I128 +ta(I676 +I128 +I676 +I129 +ta(I676 +I129 +I677 +I130 +ta(I677 +I130 +I677 +I131 +ta(I677 +I131 +I677 +I133 +ta(I677 +I133 +I678 +I134 +ta(I678 +I134 +I678 +I135 +ta(I678 +I135 +I678 +I137 +ta(I678 +I137 +I679 +I138 +ta(I679 +I138 +I679 +I139 +ta(I679 +I139 +I679 +I141 +ta(I679 +I141 +I680 +I142 +ta(I680 +I142 +I680 +I143 +ta(I680 +I143 +I680 +I144 +ta(I680 +I144 +I681 +I145 +ta(I681 +I145 +I681 +I147 +ta(I681 +I147 +I682 +I148 +ta(I682 +I148 +I682 +I149 +ta(I682 +I149 +I682 +I150 +ta(I682 +I150 +I682 +I151 +ta(I682 +I151 +I682 +I152 +ta(I682 +I152 +I683 +I153 +ta(I683 +I153 +I683 +I154 +ta(I683 +I154 +I683 +I155 +ta(I683 +I155 +I683 +I156 +ta(I683 +I156 +I683 +I157 +tatp45 +a(S'Navy' +p46 +I16 +(lp47 +(I119 +I334 +I119 +I335 +ta(I119 +I335 +I121 +I339 +ta(I121 +I339 +I122 +I341 +ta(I122 +I341 +I123 +I343 +ta(I123 +I343 +I123 +I345 +ta(I123 +I345 +I124 +I348 +ta(I124 +I348 +I125 +I351 +ta(I125 +I351 +I125 +I354 +ta(I125 +I354 +I126 +I357 +ta(I126 +I357 +I127 +I359 +ta(I127 +I359 +I128 +I362 +ta(I128 +I362 +I128 +I365 +ta(I128 +I365 +I129 +I367 +ta(I129 +I367 +I130 +I370 +ta(I130 +I370 +I131 +I373 +ta(I131 +I373 +I132 +I376 +ta(I132 +I376 +I133 +I380 +ta(I133 +I380 +I134 +I384 +ta(I134 +I384 +I134 +I387 +ta(I134 +I387 +I136 +I392 +ta(I136 +I392 +I136 +I396 +ta(I136 +I396 +I137 +I400 +ta(I137 +I400 +I137 +I405 +ta(I137 +I405 +I138 +I409 +ta(I138 +I409 +I139 +I414 +ta(I139 +I414 +I140 +I416 +ta(I140 +I416 +I140 +I419 +ta(I140 +I419 +I140 +I422 +ta(I140 +I422 +I140 +I424 +ta(I140 +I424 +I140 +I427 +ta(I140 +I427 +I141 +I430 +ta(I141 +I430 +I142 +I432 +ta(I142 +I432 +I142 +I435 +ta(I142 +I435 +I142 +I438 +ta(I142 +I438 +I143 +I440 +ta(I143 +I440 +I143 +I443 +ta(I143 +I443 +I144 +I445 +ta(I144 +I445 +I144 +I447 +ta(I144 +I447 +I144 +I448 +ta(I144 +I448 +I144 +I450 +ta(I144 +I450 +I144 +I452 +ta(I144 +I452 +I144 +I454 +ta(I144 +I454 +I144 +I456 +ta(I144 +I456 +I144 +I457 +ta(I144 +I457 +I144 +I459 +ta(I144 +I459 +I144 +I461 +ta(I144 +I461 +I144 +I463 +ta(I144 +I463 +I145 +I465 +ta(I145 +I465 +I145 +I466 +ta(I145 +I466 +I145 +I467 +ta(I145 +I467 +I145 +I468 +ta(I145 +I468 +I146 +I470 +ta(I146 +I470 +I146 +I471 +ta(I146 +I471 +I146 +I473 +ta(I146 +I473 +I146 +I474 +ta(I146 +I474 +I146 +I475 +ta(I146 +I475 +I146 +I476 +ta(I146 +I476 +I146 +I477 +ta(I146 +I477 +I146 +I478 +ta(I146 +I478 +I146 +I479 +ta(I146 +I479 +I146 +I480 +ta(I146 +I480 +I147 +I481 +ta(I147 +I481 +I147 +I482 +ta(I147 +I482 +I148 +I484 +ta(I148 +I484 +I148 +I485 +ta(I148 +I485 +I149 +I487 +ta(I149 +I487 +I149 +I489 +ta(I149 +I489 +I149 +I491 +ta(I149 +I491 +I149 +I494 +ta(I149 +I494 +I149 +I495 +ta(I149 +I495 +I149 +I497 +ta(I149 +I497 +I149 +I499 +ta(I149 +I499 +I149 +I500 +ta(I149 +I500 +I148 +I502 +ta(I148 +I502 +I148 +I503 +ta(I148 +I503 +I148 +I505 +ta(I148 +I505 +I148 +I506 +ta(I148 +I506 +I148 +I508 +ta(I148 +I508 +I148 +I509 +ta(I148 +I509 +I148 +I510 +ta(I148 +I510 +I149 +I511 +ta(I149 +I511 +I149 +I512 +ta(I149 +I512 +I148 +I512 +ta(I148 +I512 +I148 +I511 +ta(I148 +I511 +I149 +I508 +tatp48 +a(g46 +I16 +(lp49 +(I126 +I336 +I127 +I336 +ta(I127 +I336 +I128 +I335 +ta(I128 +I335 +I130 +I334 +ta(I130 +I334 +I132 +I332 +ta(I132 +I332 +I134 +I331 +ta(I134 +I331 +I137 +I330 +ta(I137 +I330 +I141 +I329 +ta(I141 +I329 +I145 +I328 +ta(I145 +I328 +I149 +I327 +ta(I149 +I327 +I163 +I325 +ta(I163 +I325 +I168 +I323 +ta(I168 +I323 +I173 +I321 +ta(I173 +I321 +I177 +I320 +ta(I177 +I320 +I180 +I319 +ta(I180 +I319 +I183 +I318 +ta(I183 +I318 +I186 +I318 +ta(I186 +I318 +I188 +I317 +ta(I188 +I317 +I191 +I316 +ta(I191 +I316 +I194 +I316 +ta(I194 +I316 +I197 +I315 +ta(I197 +I315 +I200 +I315 +ta(I200 +I315 +I202 +I315 +ta(I202 +I315 +I204 +I315 +ta(I204 +I315 +I206 +I315 +ta(I206 +I315 +I208 +I316 +ta(I208 +I316 +I210 +I316 +ta(I210 +I316 +I212 +I316 +ta(I212 +I316 +I213 +I317 +ta(I213 +I317 +I214 +I317 +ta(I214 +I317 +I216 +I318 +ta(I216 +I318 +I218 +I319 +ta(I218 +I319 +I220 +I320 +ta(I220 +I320 +I223 +I321 +ta(I223 +I321 +I226 +I322 +ta(I226 +I322 +I227 +I323 +ta(I227 +I323 +I229 +I324 +ta(I229 +I324 +I229 +I325 +ta(I229 +I325 +I230 +I325 +ta(I230 +I325 +I230 +I326 +ta(I230 +I326 +I230 +I327 +ta(I230 +I327 +I231 +I329 +ta(I231 +I329 +I231 +I331 +ta(I231 +I331 +I232 +I333 +ta(I232 +I333 +I232 +I334 +ta(I232 +I334 +I233 +I336 +ta(I233 +I336 +I233 +I338 +ta(I233 +I338 +I234 +I340 +ta(I234 +I340 +I234 +I341 +ta(I234 +I341 +I234 +I342 +ta(I234 +I342 +I234 +I344 +ta(I234 +I344 +I234 +I345 +ta(I234 +I345 +I234 +I347 +ta(I234 +I347 +I233 +I349 +ta(I233 +I349 +I233 +I351 +ta(I233 +I351 +I233 +I352 +ta(I233 +I352 +I232 +I354 +ta(I232 +I354 +I231 +I356 +ta(I231 +I356 +I230 +I357 +ta(I230 +I357 +I229 +I359 +ta(I229 +I359 +I226 +I360 +ta(I226 +I360 +I225 +I362 +ta(I225 +I362 +I223 +I364 +ta(I223 +I364 +I221 +I366 +ta(I221 +I366 +I220 +I367 +ta(I220 +I367 +I219 +I368 +ta(I219 +I368 +I217 +I370 +ta(I217 +I370 +I216 +I371 +ta(I216 +I371 +I215 +I373 +ta(I215 +I373 +I214 +I374 +ta(I214 +I374 +I212 +I376 +ta(I212 +I376 +I211 +I377 +ta(I211 +I377 +I209 +I378 +ta(I209 +I378 +I208 +I380 +ta(I208 +I380 +I206 +I381 +ta(I206 +I381 +I205 +I383 +ta(I205 +I383 +I203 +I384 +ta(I203 +I384 +I201 +I385 +ta(I201 +I385 +I200 +I386 +ta(I200 +I386 +I198 +I387 +ta(I198 +I387 +I197 +I388 +ta(I197 +I388 +I195 +I389 +ta(I195 +I389 +I193 +I390 +ta(I193 +I390 +I191 +I391 +ta(I191 +I391 +I189 +I392 +ta(I189 +I392 +I187 +I393 +ta(I187 +I393 +I185 +I394 +ta(I185 +I394 +I183 +I395 +ta(I183 +I395 +I181 +I396 +ta(I181 +I396 +I179 +I397 +ta(I179 +I397 +I177 +I398 +ta(I177 +I398 +I175 +I399 +ta(I175 +I399 +I174 +I400 +ta(I174 +I400 +I172 +I400 +ta(I172 +I400 +I171 +I401 +ta(I171 +I401 +I170 +I402 +ta(I170 +I402 +I169 +I403 +ta(I169 +I403 +I168 +I403 +ta(I168 +I403 +I167 +I404 +ta(I167 +I404 +I166 +I404 +ta(I166 +I404 +I165 +I404 +ta(I165 +I404 +I164 +I405 +ta(I164 +I405 +I163 +I405 +ta(I163 +I405 +I162 +I405 +ta(I162 +I405 +I161 +I406 +ta(I161 +I406 +I160 +I406 +ta(I160 +I406 +I159 +I407 +ta(I159 +I407 +I158 +I407 +ta(I158 +I407 +I157 +I407 +ta(I157 +I407 +I156 +I408 +ta(I156 +I408 +I155 +I408 +ta(I155 +I408 +I155 +I409 +ta(I155 +I409 +I154 +I409 +ta(I154 +I409 +I153 +I409 +ta(I153 +I409 +I152 +I410 +ta(I152 +I410 +I151 +I410 +ta(I151 +I410 +I150 +I410 +ta(I150 +I410 +I149 +I410 +ta(I149 +I410 +I148 +I410 +ta(I148 +I410 +I149 +I410 +ta(I149 +I410 +I150 +I410 +ta(I150 +I410 +I151 +I410 +ta(I151 +I410 +I152 +I410 +ta(I152 +I410 +I155 +I411 +ta(I155 +I411 +I157 +I411 +ta(I157 +I411 +I160 +I411 +ta(I160 +I411 +I163 +I412 +ta(I163 +I412 +I165 +I412 +ta(I165 +I412 +I168 +I412 +ta(I168 +I412 +I169 +I412 +ta(I169 +I412 +I171 +I412 +ta(I171 +I412 +I172 +I412 +ta(I172 +I412 +I172 +I413 +ta(I172 +I413 +I173 +I413 +ta(I173 +I413 +I174 +I414 +ta(I174 +I414 +I175 +I415 +ta(I175 +I415 +I176 +I416 +ta(I176 +I416 +I178 +I418 +ta(I178 +I418 +I180 +I419 +ta(I180 +I419 +I182 +I420 +ta(I182 +I420 +I184 +I422 +ta(I184 +I422 +I186 +I423 +ta(I186 +I423 +I187 +I423 +ta(I187 +I423 +I188 +I424 +ta(I188 +I424 +I189 +I425 +ta(I189 +I425 +I190 +I426 +ta(I190 +I426 +I191 +I427 +ta(I191 +I427 +I192 +I428 +ta(I192 +I428 +I193 +I429 +ta(I193 +I429 +I195 +I431 +ta(I195 +I431 +I197 +I432 +ta(I197 +I432 +I199 +I434 +ta(I199 +I434 +I201 +I436 +ta(I201 +I436 +I204 +I438 +ta(I204 +I438 +I206 +I440 +ta(I206 +I440 +I208 +I442 +ta(I208 +I442 +I211 +I444 +ta(I211 +I444 +I213 +I446 +ta(I213 +I446 +I215 +I448 +ta(I215 +I448 +I217 +I449 +ta(I217 +I449 +I218 +I451 +ta(I218 +I451 +I220 +I453 +ta(I220 +I453 +I222 +I455 +ta(I222 +I455 +I225 +I457 +ta(I225 +I457 +I227 +I459 +ta(I227 +I459 +I229 +I462 +ta(I229 +I462 +I231 +I464 +ta(I231 +I464 +I233 +I466 +ta(I233 +I466 +I235 +I468 +ta(I235 +I468 +I237 +I470 +ta(I237 +I470 +I239 +I472 +ta(I239 +I472 +I241 +I474 +ta(I241 +I474 +I243 +I476 +ta(I243 +I476 +I244 +I477 +ta(I244 +I477 +I245 +I478 +ta(I245 +I478 +I246 +I480 +ta(I246 +I480 +I247 +I481 +ta(I247 +I481 +I249 +I482 +ta(I249 +I482 +I250 +I483 +ta(I250 +I483 +I251 +I485 +ta(I251 +I485 +I253 +I486 +ta(I253 +I486 +I254 +I488 +ta(I254 +I488 +I256 +I489 +ta(I256 +I489 +I257 +I489 +ta(I257 +I489 +I257 +I490 +ta(I257 +I490 +I258 +I491 +ta(I258 +I491 +I259 +I491 +ta(I259 +I491 +I259 +I492 +ta(I259 +I492 +I260 +I492 +ta(I260 +I492 +I260 +I493 +ta(I260 +I493 +I261 +I493 +ta(I261 +I493 +I262 +I494 +ta(I262 +I494 +I263 +I494 +ta(I263 +I494 +I264 +I495 +ta(I264 +I495 +I265 +I495 +ta(I265 +I495 +I266 +I496 +ta(I266 +I496 +I266 +I497 +ta(I266 +I497 +I267 +I497 +ta(I267 +I497 +I268 +I498 +ta(I268 +I498 +I269 +I499 +ta(I269 +I499 +I270 +I500 +ta(I270 +I500 +I271 +I501 +ta(I271 +I501 +I272 +I502 +ta(I272 +I502 +I272 +I503 +ta(I272 +I503 +I273 +I504 +ta(I273 +I504 +I274 +I504 +ta(I274 +I504 +I275 +I505 +ta(I275 +I505 +I276 +I506 +ta(I276 +I506 +I277 +I507 +ta(I277 +I507 +I278 +I507 +ta(I278 +I507 +I278 +I508 +ta(I278 +I508 +I278 +I507 +ta(I278 +I507 +I278 +I506 +tatp50 +a(g46 +I16 +(lp51 +(I311 +I319 +I310 +I320 +ta(I310 +I320 +I308 +I321 +ta(I308 +I321 +I307 +I322 +ta(I307 +I322 +I306 +I323 +ta(I306 +I323 +I305 +I325 +ta(I305 +I325 +I305 +I327 +ta(I305 +I327 +I304 +I328 +ta(I304 +I328 +I303 +I330 +ta(I303 +I330 +I303 +I332 +ta(I303 +I332 +I302 +I334 +ta(I302 +I334 +I301 +I337 +ta(I301 +I337 +I300 +I339 +ta(I300 +I339 +I300 +I341 +ta(I300 +I341 +I299 +I343 +ta(I299 +I343 +I299 +I347 +ta(I299 +I347 +I298 +I350 +ta(I298 +I350 +I298 +I353 +ta(I298 +I353 +I297 +I356 +ta(I297 +I356 +I297 +I359 +ta(I297 +I359 +I297 +I362 +ta(I297 +I362 +I296 +I365 +ta(I296 +I365 +I296 +I368 +ta(I296 +I368 +I296 +I371 +ta(I296 +I371 +I295 +I375 +ta(I295 +I375 +I295 +I378 +ta(I295 +I378 +I295 +I382 +ta(I295 +I382 +I295 +I385 +ta(I295 +I385 +I295 +I389 +ta(I295 +I389 +I295 +I392 +ta(I295 +I392 +I295 +I396 +ta(I295 +I396 +I296 +I399 +ta(I296 +I399 +I296 +I403 +ta(I296 +I403 +I296 +I406 +ta(I296 +I406 +I296 +I410 +ta(I296 +I410 +I296 +I414 +ta(I296 +I414 +I296 +I417 +ta(I296 +I417 +I296 +I421 +ta(I296 +I421 +I297 +I425 +ta(I297 +I425 +I297 +I429 +ta(I297 +I429 +I298 +I433 +ta(I298 +I433 +I298 +I436 +ta(I298 +I436 +I299 +I441 +ta(I299 +I441 +I300 +I444 +ta(I300 +I444 +I301 +I447 +ta(I301 +I447 +I302 +I451 +ta(I302 +I451 +I303 +I454 +ta(I303 +I454 +I304 +I456 +ta(I304 +I456 +I305 +I459 +ta(I305 +I459 +I306 +I462 +ta(I306 +I462 +I307 +I465 +ta(I307 +I465 +I308 +I468 +ta(I308 +I468 +I309 +I470 +ta(I309 +I470 +I310 +I472 +ta(I310 +I472 +I311 +I475 +ta(I311 +I475 +I312 +I477 +ta(I312 +I477 +I313 +I479 +ta(I313 +I479 +I314 +I481 +ta(I314 +I481 +I315 +I483 +ta(I315 +I483 +I317 +I485 +ta(I317 +I485 +I318 +I487 +ta(I318 +I487 +I319 +I488 +ta(I319 +I488 +I320 +I489 +ta(I320 +I489 +I321 +I491 +ta(I321 +I491 +I322 +I492 +ta(I322 +I492 +I323 +I493 +ta(I323 +I493 +I324 +I494 +ta(I324 +I494 +I326 +I496 +ta(I326 +I496 +I328 +I497 +ta(I328 +I497 +I329 +I499 +ta(I329 +I499 +I330 +I500 +ta(I330 +I500 +I332 +I501 +ta(I332 +I501 +I333 +I502 +ta(I333 +I502 +I335 +I503 +ta(I335 +I503 +I336 +I503 +ta(I336 +I503 +I338 +I503 +ta(I338 +I503 +I340 +I503 +ta(I340 +I503 +I342 +I503 +ta(I342 +I503 +I345 +I503 +ta(I345 +I503 +I347 +I503 +ta(I347 +I503 +I351 +I503 +ta(I351 +I503 +I353 +I503 +ta(I353 +I503 +I356 +I502 +ta(I356 +I502 +I360 +I501 +ta(I360 +I501 +I363 +I500 +ta(I363 +I500 +I366 +I498 +ta(I366 +I498 +I369 +I496 +ta(I369 +I496 +I371 +I494 +ta(I371 +I494 +I372 +I493 +ta(I372 +I493 +I374 +I491 +ta(I374 +I491 +I374 +I489 +ta(I374 +I489 +I375 +I487 +ta(I375 +I487 +I376 +I485 +ta(I376 +I485 +I377 +I483 +ta(I377 +I483 +I377 +I480 +ta(I377 +I480 +I378 +I478 +ta(I378 +I478 +I379 +I475 +ta(I379 +I475 +I379 +I471 +ta(I379 +I471 +I379 +I468 +ta(I379 +I468 +I379 +I465 +ta(I379 +I465 +I379 +I462 +ta(I379 +I462 +I379 +I460 +ta(I379 +I460 +I379 +I457 +ta(I379 +I457 +I379 +I453 +ta(I379 +I453 +I379 +I450 +ta(I379 +I450 +I378 +I446 +ta(I378 +I446 +I378 +I443 +ta(I378 +I443 +I377 +I439 +ta(I377 +I439 +I377 +I435 +ta(I377 +I435 +I376 +I431 +ta(I376 +I431 +I375 +I426 +ta(I375 +I426 +I375 +I422 +ta(I375 +I422 +I373 +I419 +ta(I373 +I419 +I372 +I416 +ta(I372 +I416 +I371 +I412 +ta(I371 +I412 +I370 +I409 +ta(I370 +I409 +I369 +I407 +ta(I369 +I407 +I368 +I405 +ta(I368 +I405 +I367 +I402 +ta(I367 +I402 +I366 +I399 +ta(I366 +I399 +I365 +I397 +ta(I365 +I397 +I364 +I394 +ta(I364 +I394 +I362 +I391 +ta(I362 +I391 +I361 +I388 +ta(I361 +I388 +I360 +I386 +ta(I360 +I386 +I359 +I384 +ta(I359 +I384 +I358 +I382 +ta(I358 +I382 +I358 +I381 +ta(I358 +I381 +I356 +I380 +ta(I356 +I380 +I356 +I379 +ta(I356 +I379 +I355 +I378 +ta(I355 +I378 +I355 +I377 +ta(I355 +I377 +I354 +I376 +ta(I354 +I376 +I353 +I374 +ta(I353 +I374 +I352 +I372 +ta(I352 +I372 +I351 +I370 +ta(I351 +I370 +I350 +I369 +ta(I350 +I369 +I348 +I367 +ta(I348 +I367 +I347 +I365 +ta(I347 +I365 +I346 +I364 +ta(I346 +I364 +I345 +I362 +ta(I345 +I362 +I344 +I360 +ta(I344 +I360 +I343 +I359 +ta(I343 +I359 +I342 +I358 +ta(I342 +I358 +I342 +I357 +ta(I342 +I357 +I340 +I355 +ta(I340 +I355 +I340 +I354 +ta(I340 +I354 +I339 +I353 +ta(I339 +I353 +I339 +I351 +ta(I339 +I351 +I338 +I350 +ta(I338 +I350 +I337 +I349 +ta(I337 +I349 +I337 +I348 +ta(I337 +I348 +I336 +I347 +ta(I336 +I347 +I336 +I346 +ta(I336 +I346 +I335 +I345 +ta(I335 +I345 +I334 +I344 +ta(I334 +I344 +I334 +I343 +ta(I334 +I343 +I333 +I342 +ta(I333 +I342 +I332 +I340 +ta(I332 +I340 +I332 +I339 +ta(I332 +I339 +I331 +I338 +ta(I331 +I338 +I330 +I337 +ta(I330 +I337 +I330 +I336 +ta(I330 +I336 +I329 +I336 +ta(I329 +I336 +I329 +I335 +ta(I329 +I335 +I329 +I334 +ta(I329 +I334 +I328 +I334 +ta(I328 +I334 +I328 +I333 +ta(I328 +I333 +I328 +I332 +ta(I328 +I332 +I327 +I332 +ta(I327 +I332 +I327 +I331 +ta(I327 +I331 +I326 +I331 +ta(I326 +I331 +I326 +I330 +ta(I326 +I330 +I326 +I329 +ta(I326 +I329 +I325 +I329 +ta(I325 +I329 +I324 +I328 +ta(I324 +I328 +I324 +I327 +ta(I324 +I327 +I323 +I326 +ta(I323 +I326 +I322 +I325 +ta(I322 +I325 +I321 +I324 +ta(I321 +I324 +I321 +I323 +ta(I321 +I323 +I320 +I323 +ta(I320 +I323 +I320 +I322 +ta(I320 +I322 +I319 +I321 +ta(I319 +I321 +I318 +I320 +ta(I318 +I320 +I317 +I319 +ta(I317 +I319 +I317 +I318 +ta(I317 +I318 +I316 +I318 +ta(I316 +I318 +I316 +I317 +ta(I316 +I317 +I315 +I316 +ta(I315 +I316 +I314 +I315 +ta(I314 +I315 +I314 +I314 +ta(I314 +I314 +I313 +I313 +ta(I313 +I313 +I313 +I312 +ta(I313 +I312 +I312 +I312 +ta(I312 +I312 +I312 +I311 +ta(I312 +I311 +I312 +I310 +ta(I312 +I310 +I311 +I310 +tatp52 +a(g46 +I16 +(lp53 +(I434 +I311 +I433 +I311 +ta(I433 +I311 +I432 +I311 +ta(I432 +I311 +I431 +I311 +ta(I431 +I311 +I430 +I310 +ta(I430 +I310 +I429 +I310 +ta(I429 +I310 +I428 +I310 +ta(I428 +I310 +I427 +I309 +ta(I427 +I309 +I426 +I309 +ta(I426 +I309 +I424 +I309 +ta(I424 +I309 +I423 +I309 +ta(I423 +I309 +I421 +I309 +ta(I421 +I309 +I419 +I309 +ta(I419 +I309 +I418 +I308 +ta(I418 +I308 +I417 +I308 +ta(I417 +I308 +I416 +I308 +ta(I416 +I308 +I415 +I308 +ta(I415 +I308 +I414 +I308 +ta(I414 +I308 +I413 +I308 +ta(I413 +I308 +I411 +I308 +ta(I411 +I308 +I410 +I309 +ta(I410 +I309 +I409 +I310 +ta(I409 +I310 +I408 +I311 +ta(I408 +I311 +I407 +I312 +ta(I407 +I312 +I406 +I312 +ta(I406 +I312 +I405 +I313 +ta(I405 +I313 +I404 +I315 +ta(I404 +I315 +I403 +I315 +ta(I403 +I315 +I402 +I317 +ta(I402 +I317 +I401 +I318 +ta(I401 +I318 +I400 +I319 +ta(I400 +I319 +I399 +I320 +ta(I399 +I320 +I398 +I322 +ta(I398 +I322 +I397 +I323 +ta(I397 +I323 +I397 +I325 +ta(I397 +I325 +I396 +I326 +ta(I396 +I326 +I394 +I328 +ta(I394 +I328 +I393 +I330 +ta(I393 +I330 +I392 +I332 +ta(I392 +I332 +I390 +I334 +ta(I390 +I334 +I389 +I336 +ta(I389 +I336 +I388 +I338 +ta(I388 +I338 +I387 +I339 +ta(I387 +I339 +I386 +I341 +ta(I386 +I341 +I384 +I343 +ta(I384 +I343 +I384 +I345 +ta(I384 +I345 +I383 +I347 +ta(I383 +I347 +I382 +I349 +ta(I382 +I349 +I381 +I351 +ta(I381 +I351 +I381 +I353 +ta(I381 +I353 +I380 +I356 +ta(I380 +I356 +I380 +I359 +ta(I380 +I359 +I379 +I361 +ta(I379 +I361 +I379 +I364 +ta(I379 +I364 +I379 +I367 +ta(I379 +I367 +I378 +I370 +ta(I378 +I370 +I378 +I374 +ta(I378 +I374 +I378 +I377 +ta(I378 +I377 +I378 +I380 +ta(I378 +I380 +I378 +I384 +ta(I378 +I384 +I378 +I387 +ta(I378 +I387 +I378 +I391 +ta(I378 +I391 +I379 +I395 +ta(I379 +I395 +I379 +I398 +ta(I379 +I398 +I380 +I401 +ta(I380 +I401 +I381 +I404 +ta(I381 +I404 +I382 +I407 +ta(I382 +I407 +I383 +I410 +ta(I383 +I410 +I383 +I412 +ta(I383 +I412 +I384 +I415 +ta(I384 +I415 +I386 +I418 +ta(I386 +I418 +I387 +I421 +ta(I387 +I421 +I388 +I424 +ta(I388 +I424 +I388 +I426 +ta(I388 +I426 +I389 +I429 +ta(I389 +I429 +I390 +I431 +ta(I390 +I431 +I390 +I434 +ta(I390 +I434 +I391 +I436 +ta(I391 +I436 +I392 +I438 +ta(I392 +I438 +I393 +I440 +ta(I393 +I440 +I393 +I442 +ta(I393 +I442 +I394 +I444 +ta(I394 +I444 +I395 +I445 +ta(I395 +I445 +I396 +I447 +ta(I396 +I447 +I397 +I449 +ta(I397 +I449 +I398 +I451 +ta(I398 +I451 +I399 +I453 +ta(I399 +I453 +I400 +I455 +ta(I400 +I455 +I401 +I456 +ta(I401 +I456 +I402 +I458 +ta(I402 +I458 +I403 +I460 +ta(I403 +I460 +I404 +I462 +ta(I404 +I462 +I405 +I463 +ta(I405 +I463 +I406 +I465 +ta(I406 +I465 +I407 +I467 +ta(I407 +I467 +I409 +I468 +ta(I409 +I468 +I410 +I470 +ta(I410 +I470 +I412 +I472 +ta(I412 +I472 +I414 +I474 +ta(I414 +I474 +I415 +I475 +ta(I415 +I475 +I416 +I476 +ta(I416 +I476 +I418 +I477 +ta(I418 +I477 +I419 +I478 +ta(I419 +I478 +I420 +I478 +ta(I420 +I478 +I421 +I479 +ta(I421 +I479 +I422 +I479 +ta(I422 +I479 +I423 +I479 +ta(I423 +I479 +I424 +I479 +ta(I424 +I479 +I425 +I479 +ta(I425 +I479 +I426 +I479 +ta(I426 +I479 +I428 +I479 +ta(I428 +I479 +I430 +I480 +ta(I430 +I480 +I431 +I480 +ta(I431 +I480 +I434 +I480 +ta(I434 +I480 +I436 +I480 +ta(I436 +I480 +I438 +I480 +ta(I438 +I480 +I441 +I480 +ta(I441 +I480 +I443 +I480 +ta(I443 +I480 +I446 +I480 +ta(I446 +I480 +I448 +I480 +ta(I448 +I480 +I450 +I480 +ta(I450 +I480 +I452 +I480 +ta(I452 +I480 +I454 +I480 +ta(I454 +I480 +I455 +I480 +ta(I455 +I480 +I457 +I480 +ta(I457 +I480 +I459 +I479 +ta(I459 +I479 +I460 +I478 +ta(I460 +I478 +I462 +I477 +ta(I462 +I477 +I464 +I476 +ta(I464 +I476 +I465 +I475 +ta(I465 +I475 +I466 +I474 +ta(I466 +I474 +I467 +I473 +ta(I467 +I473 +I468 +I472 +ta(I468 +I472 +I468 +I471 +ta(I468 +I471 +I469 +I470 +ta(I469 +I470 +I470 +I469 +ta(I470 +I469 +I471 +I468 +ta(I471 +I468 +I471 +I467 +ta(I471 +I467 +I472 +I466 +ta(I472 +I466 +I473 +I465 +ta(I473 +I465 +I474 +I464 +ta(I474 +I464 +I474 +I462 +ta(I474 +I462 +I475 +I461 +ta(I475 +I461 +I476 +I460 +ta(I476 +I460 +I477 +I459 +ta(I477 +I459 +I478 +I457 +ta(I478 +I457 +I479 +I456 +ta(I479 +I456 +I479 +I455 +ta(I479 +I455 +I479 +I454 +ta(I479 +I454 +I480 +I453 +ta(I480 +I453 +I480 +I452 +ta(I480 +I452 +I480 +I451 +ta(I480 +I451 +I480 +I450 +tatp54 +a(g46 +I16 +(lp55 +(I478 +I295 +I479 +I297 +ta(I479 +I297 +I481 +I301 +ta(I481 +I301 +I482 +I304 +ta(I482 +I304 +I484 +I307 +ta(I484 +I307 +I486 +I310 +ta(I486 +I310 +I488 +I314 +ta(I488 +I314 +I490 +I317 +ta(I490 +I317 +I491 +I321 +ta(I491 +I321 +I493 +I326 +ta(I493 +I326 +I495 +I329 +ta(I495 +I329 +I496 +I333 +ta(I496 +I333 +I498 +I336 +ta(I498 +I336 +I499 +I340 +ta(I499 +I340 +I501 +I344 +ta(I501 +I344 +I502 +I347 +ta(I502 +I347 +I504 +I351 +ta(I504 +I351 +I506 +I355 +ta(I506 +I355 +I507 +I359 +ta(I507 +I359 +I509 +I362 +ta(I509 +I362 +I510 +I366 +ta(I510 +I366 +I512 +I370 +ta(I512 +I370 +I514 +I373 +ta(I514 +I373 +I515 +I377 +ta(I515 +I377 +I517 +I380 +ta(I517 +I380 +I518 +I383 +ta(I518 +I383 +I519 +I386 +ta(I519 +I386 +I520 +I388 +ta(I520 +I388 +I521 +I391 +ta(I521 +I391 +I522 +I393 +ta(I522 +I393 +I522 +I395 +ta(I522 +I395 +I522 +I397 +ta(I522 +I397 +I523 +I400 +ta(I523 +I400 +I524 +I403 +ta(I524 +I403 +I525 +I405 +ta(I525 +I405 +I526 +I408 +ta(I526 +I408 +I526 +I411 +ta(I526 +I411 +I527 +I413 +ta(I527 +I413 +I528 +I415 +ta(I528 +I415 +I528 +I417 +ta(I528 +I417 +I529 +I420 +ta(I529 +I420 +I529 +I421 +ta(I529 +I421 +I529 +I423 +ta(I529 +I423 +I529 +I425 +ta(I529 +I425 +I529 +I426 +ta(I529 +I426 +I530 +I428 +ta(I530 +I428 +I530 +I430 +ta(I530 +I430 +I530 +I433 +ta(I530 +I433 +I531 +I435 +ta(I531 +I435 +I531 +I438 +ta(I531 +I438 +I531 +I440 +ta(I531 +I440 +I531 +I443 +ta(I531 +I443 +I532 +I445 +ta(I532 +I445 +I532 +I447 +ta(I532 +I447 +I532 +I450 +ta(I532 +I450 +I532 +I452 +ta(I532 +I452 +I533 +I453 +ta(I533 +I453 +I533 +I455 +ta(I533 +I455 +I533 +I457 +ta(I533 +I457 +I533 +I459 +ta(I533 +I459 +I534 +I460 +ta(I534 +I460 +I534 +I462 +ta(I534 +I462 +I534 +I464 +ta(I534 +I464 +I534 +I466 +ta(I534 +I466 +I534 +I468 +ta(I534 +I468 +I535 +I470 +ta(I535 +I470 +I535 +I472 +ta(I535 +I472 +I535 +I474 +ta(I535 +I474 +I535 +I476 +ta(I535 +I476 +I535 +I477 +ta(I535 +I477 +I535 +I478 +ta(I535 +I478 +I536 +I478 +ta(I536 +I478 +I536 +I479 +ta(I536 +I479 +I536 +I480 +ta(I536 +I480 +I536 +I481 +ta(I536 +I481 +I536 +I482 +ta(I536 +I482 +I537 +I483 +ta(I537 +I483 +I537 +I484 +tatp56 +a(g46 +I16 +(lp57 +(I540 +I307 +I539 +I308 +ta(I539 +I308 +I539 +I310 +ta(I539 +I310 +I539 +I311 +ta(I539 +I311 +I538 +I313 +ta(I538 +I313 +I538 +I315 +ta(I538 +I315 +I538 +I317 +ta(I538 +I317 +I537 +I320 +ta(I537 +I320 +I537 +I322 +ta(I537 +I322 +I535 +I326 +ta(I535 +I326 +I535 +I329 +ta(I535 +I329 +I534 +I332 +ta(I534 +I332 +I533 +I335 +ta(I533 +I335 +I532 +I338 +ta(I532 +I338 +I531 +I341 +ta(I531 +I341 +I530 +I344 +ta(I530 +I344 +I529 +I347 +ta(I529 +I347 +I528 +I349 +ta(I528 +I349 +I527 +I351 +ta(I527 +I351 +I526 +I354 +ta(I526 +I354 +I525 +I356 +ta(I525 +I356 +I524 +I358 +ta(I524 +I358 +I523 +I361 +ta(I523 +I361 +I522 +I363 +ta(I522 +I363 +I521 +I366 +ta(I521 +I366 +I520 +I368 +ta(I520 +I368 +I519 +I371 +ta(I519 +I371 +I518 +I373 +ta(I518 +I373 +I517 +I375 +ta(I517 +I375 +I516 +I377 +ta(I516 +I377 +I516 +I378 +ta(I516 +I378 +I516 +I379 +ta(I516 +I379 +I515 +I380 +ta(I515 +I380 +I515 +I381 +ta(I515 +I381 +I514 +I383 +ta(I514 +I383 +I514 +I384 +ta(I514 +I384 +I514 +I385 +ta(I514 +I385 +I514 +I387 +ta(I514 +I387 +I514 +I389 +ta(I514 +I389 +I514 +I390 +ta(I514 +I390 +I514 +I391 +ta(I514 +I391 +I514 +I392 +ta(I514 +I392 +I514 +I393 +ta(I514 +I393 +I515 +I393 +ta(I515 +I393 +I516 +I394 +ta(I516 +I394 +I517 +I394 +ta(I517 +I394 +I519 +I395 +ta(I519 +I395 +I521 +I396 +ta(I521 +I396 +I524 +I397 +ta(I524 +I397 +I527 +I398 +ta(I527 +I398 +I529 +I399 +ta(I529 +I399 +I532 +I399 +ta(I532 +I399 +I534 +I400 +ta(I534 +I400 +I536 +I401 +ta(I536 +I401 +I539 +I401 +ta(I539 +I401 +I541 +I402 +ta(I541 +I402 +I543 +I403 +ta(I543 +I403 +I544 +I404 +ta(I544 +I404 +I547 +I405 +ta(I547 +I405 +I549 +I406 +ta(I549 +I406 +I551 +I407 +ta(I551 +I407 +I554 +I408 +ta(I554 +I408 +I555 +I409 +ta(I555 +I409 +I557 +I410 +ta(I557 +I410 +I559 +I412 +ta(I559 +I412 +I561 +I413 +ta(I561 +I413 +I563 +I414 +ta(I563 +I414 +I565 +I416 +ta(I565 +I416 +I566 +I417 +ta(I566 +I417 +I568 +I418 +ta(I568 +I418 +I569 +I420 +ta(I569 +I420 +I570 +I421 +ta(I570 +I421 +I572 +I423 +ta(I572 +I423 +I574 +I425 +ta(I574 +I425 +I576 +I427 +ta(I576 +I427 +I577 +I429 +ta(I577 +I429 +I579 +I432 +ta(I579 +I432 +I581 +I434 +ta(I581 +I434 +I582 +I436 +ta(I582 +I436 +I583 +I438 +ta(I583 +I438 +I585 +I441 +ta(I585 +I441 +I586 +I442 +ta(I586 +I442 +I587 +I445 +ta(I587 +I445 +I589 +I447 +ta(I589 +I447 +I590 +I449 +ta(I590 +I449 +I591 +I451 +ta(I591 +I451 +I593 +I453 +ta(I593 +I453 +I594 +I456 +ta(I594 +I456 +I596 +I458 +ta(I596 +I458 +I597 +I460 +ta(I597 +I460 +I599 +I462 +ta(I599 +I462 +I600 +I464 +ta(I600 +I464 +I601 +I465 +ta(I601 +I465 +I602 +I467 +ta(I602 +I467 +I603 +I468 +ta(I603 +I468 +I604 +I470 +ta(I604 +I470 +I605 +I472 +ta(I605 +I472 +I606 +I474 +ta(I606 +I474 +I608 +I475 +ta(I608 +I475 +I609 +I477 +ta(I609 +I477 +I609 +I478 +ta(I609 +I478 +I610 +I478 +ta(I610 +I478 +I610 +I479 +ta(I610 +I479 +I611 +I480 +ta(I611 +I480 +I612 +I480 +ta(I612 +I480 +I612 +I481 +ta(I612 +I481 +I613 +I482 +ta(I613 +I482 +I613 +I483 +ta(I613 +I483 +I614 +I485 +ta(I614 +I485 +I614 +I486 +ta(I614 +I486 +I615 +I488 +ta(I615 +I488 +I615 +I489 +ta(I615 +I489 +I615 +I488 +ta(I615 +I488 +I614 +I487 +ta(I614 +I487 +I614 +I486 +ta(I614 +I486 +I614 +I485 +tatp58 +a(g46 +I16 +(lp59 +(I638 +I294 +I637 +I294 +ta(I637 +I294 +I634 +I294 +ta(I634 +I294 +I632 +I295 +ta(I632 +I295 +I630 +I295 +ta(I630 +I295 +I628 +I296 +ta(I628 +I296 +I626 +I297 +ta(I626 +I297 +I624 +I297 +ta(I624 +I297 +I621 +I299 +ta(I621 +I299 +I619 +I300 +ta(I619 +I300 +I617 +I301 +ta(I617 +I301 +I615 +I303 +ta(I615 +I303 +I613 +I304 +ta(I613 +I304 +I611 +I306 +ta(I611 +I306 +I609 +I307 +ta(I609 +I307 +I607 +I309 +ta(I607 +I309 +I606 +I311 +ta(I606 +I311 +I604 +I312 +ta(I604 +I312 +I602 +I314 +ta(I602 +I314 +I600 +I316 +ta(I600 +I316 +I598 +I318 +ta(I598 +I318 +I597 +I319 +ta(I597 +I319 +I596 +I321 +ta(I596 +I321 +I596 +I322 +ta(I596 +I322 +I595 +I324 +ta(I595 +I324 +I594 +I326 +ta(I594 +I326 +I594 +I327 +ta(I594 +I327 +I593 +I329 +ta(I593 +I329 +I592 +I331 +ta(I592 +I331 +I592 +I333 +ta(I592 +I333 +I591 +I335 +ta(I591 +I335 +I591 +I337 +ta(I591 +I337 +I590 +I339 +ta(I590 +I339 +I590 +I341 +ta(I590 +I341 +I590 +I343 +ta(I590 +I343 +I590 +I345 +ta(I590 +I345 +I590 +I347 +ta(I590 +I347 +I590 +I349 +ta(I590 +I349 +I590 +I352 +ta(I590 +I352 +I590 +I354 +ta(I590 +I354 +I590 +I356 +ta(I590 +I356 +I590 +I358 +ta(I590 +I358 +I591 +I361 +ta(I591 +I361 +I592 +I363 +ta(I592 +I363 +I593 +I364 +ta(I593 +I364 +I594 +I365 +ta(I594 +I365 +I594 +I366 +ta(I594 +I366 +I595 +I367 +ta(I595 +I367 +I596 +I368 +ta(I596 +I368 +I597 +I369 +ta(I597 +I369 +I598 +I370 +ta(I598 +I370 +I599 +I370 +ta(I599 +I370 +I600 +I371 +ta(I600 +I371 +I601 +I372 +ta(I601 +I372 +I602 +I373 +ta(I602 +I373 +I604 +I373 +ta(I604 +I373 +I605 +I374 +ta(I605 +I374 +I607 +I374 +ta(I607 +I374 +I609 +I374 +ta(I609 +I374 +I610 +I374 +ta(I610 +I374 +I611 +I374 +ta(I611 +I374 +I612 +I375 +ta(I612 +I375 +I613 +I375 +ta(I613 +I375 +I614 +I376 +ta(I614 +I376 +I615 +I376 +ta(I615 +I376 +I616 +I377 +ta(I616 +I377 +I618 +I377 +ta(I618 +I377 +I620 +I378 +ta(I620 +I378 +I622 +I378 +ta(I622 +I378 +I624 +I379 +ta(I624 +I379 +I625 +I379 +ta(I625 +I379 +I627 +I380 +ta(I627 +I380 +I628 +I380 +ta(I628 +I380 +I629 +I381 +ta(I629 +I381 +I630 +I381 +ta(I630 +I381 +I630 +I382 +ta(I630 +I382 +I631 +I382 +ta(I631 +I382 +I632 +I383 +ta(I632 +I383 +I633 +I383 +ta(I633 +I383 +I634 +I384 +ta(I634 +I384 +I635 +I385 +ta(I635 +I385 +I637 +I386 +ta(I637 +I386 +I639 +I387 +ta(I639 +I387 +I641 +I388 +ta(I641 +I388 +I642 +I389 +ta(I642 +I389 +I643 +I390 +ta(I643 +I390 +I644 +I391 +ta(I644 +I391 +I645 +I392 +ta(I645 +I392 +I646 +I392 +ta(I646 +I392 +I646 +I393 +ta(I646 +I393 +I648 +I393 +ta(I648 +I393 +I649 +I394 +ta(I649 +I394 +I650 +I395 +ta(I650 +I395 +I650 +I396 +ta(I650 +I396 +I651 +I397 +ta(I651 +I397 +I652 +I398 +ta(I652 +I398 +I654 +I400 +ta(I654 +I400 +I655 +I401 +ta(I655 +I401 +I656 +I402 +ta(I656 +I402 +I657 +I403 +ta(I657 +I403 +I658 +I404 +ta(I658 +I404 +I658 +I405 +ta(I658 +I405 +I659 +I406 +ta(I659 +I406 +I660 +I406 +ta(I660 +I406 +I661 +I407 +ta(I661 +I407 +I662 +I408 +ta(I662 +I408 +I663 +I409 +ta(I663 +I409 +I664 +I410 +ta(I664 +I410 +I665 +I412 +ta(I665 +I412 +I667 +I413 +ta(I667 +I413 +I668 +I415 +ta(I668 +I415 +I669 +I417 +ta(I669 +I417 +I671 +I418 +ta(I671 +I418 +I672 +I420 +ta(I672 +I420 +I672 +I422 +ta(I672 +I422 +I673 +I423 +ta(I673 +I423 +I674 +I424 +ta(I674 +I424 +I674 +I426 +ta(I674 +I426 +I675 +I428 +ta(I675 +I428 +I675 +I429 +ta(I675 +I429 +I676 +I431 +ta(I676 +I431 +I676 +I432 +ta(I676 +I432 +I677 +I434 +ta(I677 +I434 +I678 +I435 +ta(I678 +I435 +I678 +I437 +ta(I678 +I437 +I678 +I438 +ta(I678 +I438 +I678 +I439 +ta(I678 +I439 +I678 +I440 +ta(I678 +I440 +I678 +I441 +ta(I678 +I441 +I678 +I443 +ta(I678 +I443 +I677 +I445 +ta(I677 +I445 +I677 +I446 +ta(I677 +I446 +I676 +I448 +ta(I676 +I448 +I676 +I450 +ta(I676 +I450 +I676 +I451 +ta(I676 +I451 +I675 +I453 +ta(I675 +I453 +I675 +I454 +ta(I675 +I454 +I674 +I456 +ta(I674 +I456 +I673 +I457 +ta(I673 +I457 +I673 +I459 +ta(I673 +I459 +I672 +I460 +ta(I672 +I460 +I671 +I461 +ta(I671 +I461 +I670 +I462 +ta(I670 +I462 +I669 +I463 +ta(I669 +I463 +I668 +I465 +ta(I668 +I465 +I668 +I466 +ta(I668 +I466 +I667 +I467 +ta(I667 +I467 +I666 +I469 +ta(I666 +I469 +I665 +I471 +ta(I665 +I471 +I664 +I472 +ta(I664 +I472 +I664 +I473 +ta(I664 +I473 +I663 +I474 +ta(I663 +I474 +I662 +I475 +ta(I662 +I475 +I661 +I476 +ta(I661 +I476 +I661 +I477 +ta(I661 +I477 +I660 +I478 +ta(I660 +I478 +I660 +I479 +ta(I660 +I479 +I659 +I480 +ta(I659 +I480 +I659 +I481 +ta(I659 +I481 +I658 +I481 +ta(I658 +I481 +I657 +I482 +ta(I657 +I482 +I657 +I483 +ta(I657 +I483 +I656 +I484 +ta(I656 +I484 +I656 +I485 +ta(I656 +I485 +I655 +I486 +ta(I655 +I486 +I655 +I487 +ta(I655 +I487 +I654 +I487 +tatp60 +a(g46 +I16 +(lp61 +(I655 +I481 +I655 +I482 +ta(I655 +I482 +I654 +I482 +ta(I654 +I482 +I654 +I483 +ta(I654 +I483 +I654 +I484 +ta(I654 +I484 +I653 +I484 +ta(I653 +I484 +I653 +I485 +ta(I653 +I485 +I652 +I485 +ta(I652 +I485 +I652 +I486 +ta(I652 +I486 +I651 +I486 +ta(I651 +I486 +I651 +I487 +ta(I651 +I487 +I650 +I487 +ta(I650 +I487 +I650 +I488 +ta(I650 +I488 +I649 +I488 +ta(I649 +I488 +I648 +I488 +ta(I648 +I488 +I647 +I489 +ta(I647 +I489 +I646 +I489 +ta(I646 +I489 +I645 +I489 +ta(I645 +I489 +I644 +I489 +ta(I644 +I489 +I643 +I490 +ta(I643 +I490 +I642 +I490 +ta(I642 +I490 +I641 +I490 +ta(I641 +I490 +I640 +I490 +ta(I640 +I490 +I639 +I490 +ta(I639 +I490 +I638 +I490 +ta(I638 +I490 +I637 +I490 +ta(I637 +I490 +I636 +I490 +ta(I636 +I490 +I635 +I489 +ta(I635 +I489 +I634 +I489 +ta(I634 +I489 +I633 +I489 +ta(I633 +I489 +I632 +I488 +ta(I632 +I488 +I631 +I488 +ta(I631 +I488 +I631 +I487 +ta(I631 +I487 +I630 +I487 +ta(I630 +I487 +I629 +I486 +ta(I629 +I486 +I628 +I485 +ta(I628 +I485 +I627 +I485 +ta(I627 +I485 +I627 +I484 +ta(I627 +I484 +I626 +I484 +ta(I626 +I484 +I626 +I483 +ta(I626 +I483 +I625 +I482 +ta(I625 +I482 +I624 +I481 +ta(I624 +I481 +I624 +I480 +ta(I624 +I480 +I623 +I480 +tatp62 +a(g46 +I16 +(lp63 +(I675 +I273 +I676 +I273 +ta(I676 +I273 +I677 +I273 +ta(I677 +I273 +I677 +I275 +ta(I677 +I275 +I678 +I276 +ta(I678 +I276 +I679 +I278 +ta(I679 +I278 +I681 +I281 +ta(I681 +I281 +I682 +I284 +ta(I682 +I284 +I683 +I287 +ta(I683 +I287 +I684 +I290 +ta(I684 +I290 +I685 +I293 +ta(I685 +I293 +I687 +I296 +ta(I687 +I296 +I688 +I299 +ta(I688 +I299 +I689 +I301 +ta(I689 +I301 +I690 +I303 +ta(I690 +I303 +I691 +I306 +ta(I691 +I306 +I691 +I309 +ta(I691 +I309 +I692 +I312 +ta(I692 +I312 +I693 +I315 +ta(I693 +I315 +I694 +I318 +ta(I694 +I318 +I694 +I322 +ta(I694 +I322 +I696 +I325 +ta(I696 +I325 +I696 +I328 +ta(I696 +I328 +I697 +I332 +ta(I697 +I332 +I698 +I334 +ta(I698 +I334 +I699 +I336 +ta(I699 +I336 +I699 +I338 +ta(I699 +I338 +I700 +I340 +ta(I700 +I340 +I700 +I342 +ta(I700 +I342 +I700 +I344 +ta(I700 +I344 +I700 +I346 +ta(I700 +I346 +I701 +I348 +ta(I701 +I348 +I701 +I350 +ta(I701 +I350 +I701 +I352 +ta(I701 +I352 +I701 +I354 +ta(I701 +I354 +I701 +I356 +ta(I701 +I356 +I702 +I357 +ta(I702 +I357 +I702 +I359 +ta(I702 +I359 +I702 +I361 +ta(I702 +I361 +I702 +I363 +ta(I702 +I363 +I703 +I365 +ta(I703 +I365 +I703 +I367 +ta(I703 +I367 +I703 +I369 +ta(I703 +I369 +I704 +I371 +ta(I704 +I371 +I704 +I373 +ta(I704 +I373 +I704 +I376 +ta(I704 +I376 +I704 +I378 +ta(I704 +I378 +I705 +I380 +ta(I705 +I380 +I705 +I382 +ta(I705 +I382 +I705 +I385 +ta(I705 +I385 +I705 +I387 +ta(I705 +I387 +I706 +I389 +ta(I706 +I389 +I706 +I391 +ta(I706 +I391 +I706 +I392 +ta(I706 +I392 +I706 +I394 +ta(I706 +I394 +I706 +I396 +ta(I706 +I396 +I707 +I397 +ta(I707 +I397 +I707 +I398 +ta(I707 +I398 +I707 +I400 +ta(I707 +I400 +I708 +I401 +ta(I708 +I401 +I708 +I402 +ta(I708 +I402 +I708 +I403 +ta(I708 +I403 +I708 +I404 +ta(I708 +I404 +I708 +I405 +ta(I708 +I405 +I709 +I406 +ta(I709 +I406 +I709 +I407 +ta(I709 +I407 +I709 +I408 +ta(I709 +I408 +I709 +I409 +ta(I709 +I409 +I710 +I410 +ta(I710 +I410 +I710 +I411 +tatp64 +a(g46 +I16 +(lp65 +(I703 +I403 +I703 +I404 +ta(I703 +I404 +I704 +I404 +ta(I704 +I404 +I704 +I405 +ta(I704 +I405 +I704 +I406 +ta(I704 +I406 +I705 +I406 +ta(I705 +I406 +I705 +I407 +ta(I705 +I407 +I705 +I408 +ta(I705 +I408 +I705 +I409 +ta(I705 +I409 +I706 +I409 +ta(I706 +I409 +I706 +I410 +ta(I706 +I410 +I706 +I411 +ta(I706 +I411 +I706 +I412 +ta(I706 +I412 +I707 +I413 +ta(I707 +I413 +I707 +I414 +ta(I707 +I414 +I707 +I415 +ta(I707 +I415 +I707 +I416 +ta(I707 +I416 +I707 +I417 +ta(I707 +I417 +I707 +I418 +ta(I707 +I418 +I707 +I419 +ta(I707 +I419 +I707 +I420 +ta(I707 +I420 +I707 +I421 +ta(I707 +I421 +I707 +I422 +ta(I707 +I422 +I707 +I423 +ta(I707 +I423 +I707 +I424 +ta(I707 +I424 +I707 +I425 +ta(I707 +I425 +I707 +I426 +ta(I707 +I426 +I707 +I427 +ta(I707 +I427 +I707 +I428 +ta(I707 +I428 +I707 +I429 +ta(I707 +I429 +I706 +I430 +ta(I706 +I430 +I706 +I431 +ta(I706 +I431 +I706 +I432 +ta(I706 +I432 +I706 +I433 +ta(I706 +I433 +I705 +I434 +ta(I705 +I434 +I705 +I435 +ta(I705 +I435 +I705 +I436 +ta(I705 +I436 +I704 +I437 +ta(I704 +I437 +I704 +I438 +ta(I704 +I438 +I704 +I439 +ta(I704 +I439 +I704 +I440 +ta(I704 +I440 +I703 +I440 +ta(I703 +I440 +I703 +I441 +ta(I703 +I441 +I703 +I442 +ta(I703 +I442 +I703 +I443 +ta(I703 +I443 +I702 +I443 +ta(I702 +I443 +I702 +I444 +ta(I702 +I444 +I702 +I445 +ta(I702 +I445 +I702 +I446 +ta(I702 +I446 +I701 +I447 +ta(I701 +I447 +I701 +I448 +ta(I701 +I448 +I701 +I449 +ta(I701 +I449 +I701 +I450 +ta(I701 +I450 +I700 +I450 +ta(I700 +I450 +I700 +I451 +ta(I700 +I451 +I700 +I452 +tatp66 +a(g46 +I16 +(lp67 +(I699 +I472 +I700 +I472 +ta(I700 +I472 +I700 +I473 +ta(I700 +I473 +I700 +I474 +ta(I700 +I474 +I700 +I475 +ta(I700 +I475 +I700 +I476 +ta(I700 +I476 +I700 +I477 +ta(I700 +I477 +I700 +I478 +tatp68 +a. \ No newline at end of file diff --git a/wxPython/samples/doodle/superdoodle.py b/wxPython/samples/doodle/superdoodle.py new file mode 100644 index 0000000000..7bc579d785 --- /dev/null +++ b/wxPython/samples/doodle/superdoodle.py @@ -0,0 +1,369 @@ +# superdoodle.py + +""" +This module implements the SuperDoodle demo application. It takes the +DoodleWindow previously presented and reuses it in a much more +intelligent Frame. This one has a menu and a statusbar, is able to +save and reload doodles, clear the workspace, and has a simple control +panel for setting color and line thickness in addition to the popup +menu that DoodleWindow provides. There is also a nice About dialog +implmented using an wxHtmlWindow. +""" + +from wxPython.wx import * +from doodle import DoodleWindow + +import os, cPickle + + +#---------------------------------------------------------------------- + +idNEW = 11001 +idOPEN = 11002 +idSAVE = 11003 +idSAVEAS = 11004 +idCLEAR = 11005 +idEXIT = 11006 +idABOUT = 11007 + + +class DoodleFrame(wxFrame): + """ + A DoodleFrame contains a DoodleWindow and a ControlPanel and manages + their layout with a wxBoxSizer. A menu and associated event handlers + provides for saving a doodle to a file, etc. + """ + title = "Do a doodle" + def __init__(self, parent): + wxFrame.__init__(self, parent, -1, self.title, size=(800,600)) + self.CreateStatusBar() + self.MakeMenu() + self.filename = None + + self.doodle = DoodleWindow(self, -1) + cPanel = ControlPanel(self, -1, self.doodle) + + # Create a sizer to layout the two windows side-by-side. + # Both will grow vertically, the doodle window will grow + # horizontally as well. + box = wxBoxSizer(wxHORIZONTAL) + box.Add(cPanel, 0, wxEXPAND) + box.Add(self.doodle, 1, wxEXPAND) + + # Tell the frame that it should layout itself in response to + # size events. + self.SetAutoLayout(true) + self.SetSizer(box) + + + def SaveFile(self): + if self.filename: + data = self.doodle.GetLinesData() + f = open(self.filename, 'w') + cPickle.dump(data, f) + f.close() + + + def ReadFile(self): + if self.filename: + try: + f = open(self.filename, 'r') + data = cPickle.load(f) + f.close() + self.doodle.SetLinesData(data) + except cPickle.UnpicklingError: + wxMessageBox("%s is not a doodle file." % self.filename, + "oops!", style=wxOK|wxICON_EXCLAMATION) + + + def MakeMenu(self): + # create the file menu + menu1 = wxMenu() + menu1.Append(idOPEN, "&Open", "Open a doodle file") + menu1.Append(idSAVE, "&Save", "Save the doodle") + menu1.Append(idSAVEAS, "Save &As", "Save the doodle in a new file") + menu1.AppendSeparator() + menu1.Append(idCLEAR, "&Clear", "Clear the current doodle") + menu1.AppendSeparator() + menu1.Append(idEXIT, "E&xit", "Terminate the application") + + # and the help menu + menu2 = wxMenu() + menu2.Append(idABOUT, "&About", "Display the gratuitous 'about this app' thingamajig") + + # and add them to a menubar + menuBar = wxMenuBar() + menuBar.Append(menu1, "&File") + menuBar.Append(menu2, "&Help") + self.SetMenuBar(menuBar) + + EVT_MENU(self, idOPEN, self.OnMenuOpen) + EVT_MENU(self, idSAVE, self.OnMenuSave) + EVT_MENU(self, idSAVEAS, self.OnMenuSaveAs) + EVT_MENU(self, idCLEAR, self.OnMenuClear) + EVT_MENU(self, idEXIT, self.OnMenuExit) + EVT_MENU(self, idABOUT, self.OnMenuAbout) + + + + wildcard = "Doodle files (*.ddl)|*.ddl|All files (*.*)|*.*" + + def OnMenuOpen(self, event): + dlg = wxFileDialog(self, "Open doodle file...", + style=wxOPEN, wildcard = self.wildcard) + if dlg.ShowModal() == wxID_OK: + self.filename = dlg.GetPath() + self.ReadFile() + self.SetTitle(self.title + ' -- ' + self.filename) + dlg.Destroy() + + + def OnMenuSave(self, event): + if not self.filename: + self.OnMenuSaveAs(event) + else: + self.SaveFile() + + + def OnMenuSaveAs(self, event): + dlg = wxFileDialog(self, "Save doodle as...", + style=wxSAVE | wxOVERWRITE_PROMPT, + wildcard = self.wildcard) + if dlg.ShowModal() == wxID_OK: + filename = dlg.GetPath() + if not os.path.splitext(filename)[1]: + filename = filename + '.ddl' + self.filename = filename + self.SaveFile() + self.SetTitle(self.title + ' -- ' + self.filename) + dlg.Destroy() + + + def OnMenuClear(self, event): + self.doodle.SetLinesData([]) + self.SetTitle(self.title) + + + def OnMenuExit(self, event): + self.Close() + + + def OnMenuAbout(self, event): + dlg = DoodleAbout(self) + dlg.ShowModal() + dlg.Destroy() + + + +#---------------------------------------------------------------------- + + +class ControlPanel(wxPanel): + """ + This class implements a very simple control panel for the DoodleWindow. + It creates buttons for each of the colours and thickneses supported by + the DoodleWindow, and event handlers to set the selected values. There is + also a little window that shows an example doodleLine in the selected + values. Nested sizers are used for layout. + """ + def __init__(self, parent, ID, doodle): + wxPanel.__init__(self, parent, ID, style=wxRAISED_BORDER) + + numCols = 4 + spacing = 4 + + # Make a grid of buttons for each colour. Attach each button + # event to self.OnSetColour. The button ID is the same as the + # key in the colour dictionary. + colours = doodle.menuColours + keys = colours.keys() + keys.sort() + cGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2) + for k in keys: + bmp = self.MakeBitmap(wxNamedColour(colours[k])) + b = wxBitmapButton(self, k, bmp) + EVT_BUTTON(self, k, self.OnSetColour) + cGrid.Add(b, 0) + + # Save the button size so we can use it for the number buttons + btnSize = b.GetSize() + + # Make a grid of buttons for the thicknesses. Attach each button + # event to self.OnSetThickness. The button ID is the same as the + # thickness value. + tGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2) + for x in range(1, doodle.maxThickness+1): + b = wxButton(self, x, str(x), size=btnSize) + EVT_BUTTON(self, x, self.OnSetThickness) + tGrid.Add(b, 0) + + # Make a colour indicator window, it is registerd as a listener + # with the doodle window so it will be notified when the settings + # change + ci = ColourIndicator(self) + doodle.AddListener(ci) + doodle.Notify() + self.doodle = doodle + + # Make a box sizer and put the two grids and the indicator + # window in it. + box = wxBoxSizer(wxVERTICAL) + box.Add(cGrid, 0, wxALL, spacing) + box.Add(tGrid, 0, wxALL, spacing) + box.Add(ci, 0, wxEXPAND|wxALL, spacing) + self.SetSizer(box) + self.SetAutoLayout(true) + + # Resize this window so it is just large enough for the + # minimum requirements of the sizer. + box.Fit(self) + + + + def MakeBitmap(self, colour): + """ + We can create a bitmap of whatever we want by simply selecting + it into a wxMemoryDC and drawing on it. In this case we just set + a background brush and clear the dc. + """ + bmp = wxEmptyBitmap(16,16) + dc = wxMemoryDC() + dc.SelectObject(bmp) + dc.SetBackground(wxBrush(colour)) + dc.Clear() + dc.SelectObject(wxNullBitmap) + return bmp + + + def OnSetColour(self, event): + """ + Use the event ID to get the colour, set that colour in the doodle. + """ + colour = self.doodle.menuColours[event.GetId()] + self.doodle.SetColour(colour) + + + def OnSetThickness(self, event): + """ + Use the event ID to set the thickness in the doodle. + """ + self.doodle.SetThickness(event.GetId()) + + +#---------------------------------------------------------------------- + +class ColourIndicator(wxWindow): + """ + An instance of this class is used on the ControlPanel to show + a sample of what the current doodle line will look like. + """ + def __init__(self, parent): + wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER) + self.SetBackgroundColour(wxWHITE) + self.SetSize(wxSize(-1, 40)) + self.colour = self.thickness = None + EVT_PAINT(self, self.OnPaint) + + + def Update(self, colour, thickness): + """ + The doodle window calls this method any time the colour + or line thickness changes. + """ + self.colour = colour + self.thickness = thickness + self.Refresh() # generate a paint event + + + def OnPaint(self, event): + """ + This method is called when all or part of the window needs to be + redrawn. + """ + dc = wxPaintDC(self) + if self.colour: + sz = self.GetClientSize() + pen = wxPen(wxNamedColour(self.colour), self.thickness) + dc.BeginDrawing() + dc.SetPen(pen) + dc.DrawLine(10, sz.height/2, sz.width-10, sz.height/2) + dc.EndDrawing() + + +#---------------------------------------------------------------------- + +class DoodleAbout(wxDialog): + """ An about box that uses an HTML window """ + + text = ''' + + +
+ + + +

SuperDoodle

+
+

SuperDoodle is a demonstration program for wxPython that +will hopefully teach you a thing or two. Just follow these simple +instructions:

+

+

    +
  1. Read the Source... +
  2. Learn... +
  3. Do! +
+ +

SuperDoodle and wxPython are brought to you by +Robin Dunn and Total Control Software, Copyright +© 1997-2001.

+ + +''' + + def __init__(self, parent): + wxDialog.__init__(self, parent, -1, 'About SuperDoodle', + size=wxSize(420, 380)) + from wxPython.html import wxHtmlWindow + + html = wxHtmlWindow(self, -1) + html.SetPage(self.text) + button = wxButton(self, wxID_OK, "Okay") + + # constraints for the html window + lc = wxLayoutConstraints() + lc.top.SameAs(self, wxTop, 5) + lc.left.SameAs(self, wxLeft, 5) + lc.bottom.SameAs(button, wxTop, 5) + lc.right.SameAs(self, wxRight, 5) + html.SetConstraints(lc) + + # constraints for the button + lc = wxLayoutConstraints() + lc.bottom.SameAs(self, wxBottom, 5) + lc.centreX.SameAs(self, wxCentreX) + lc.width.AsIs() + lc.height.AsIs() + button.SetConstraints(lc) + + self.SetAutoLayout(true) + self.Layout() + self.CentreOnParent(wxBOTH) + + +#---------------------------------------------------------------------- + +class DoodleApp(wxApp): + def OnInit(self): + frame = DoodleFrame(None) + frame.Show(true) + self.SetTopWindow(frame) + return true + + +#---------------------------------------------------------------------- + +if __name__ == '__main__': + app = DoodleApp(0) + app.MainLoop() diff --git a/wxPython/samples/stxview/StructuredText/ClassicDocumentClass.py b/wxPython/samples/stxview/StructuredText/ClassicDocumentClass.py new file mode 100644 index 0000000000..23b73d6294 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/ClassicDocumentClass.py @@ -0,0 +1,689 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +import re, ST, STDOM +from string import split, join, replace, expandtabs, strip, find + +StringType=type('') +ListType=type([]) + +class StructuredTextExample(ST.StructuredTextParagraph): + """Represents a section of document with literal text, as for examples""" + + def __init__(self, subs, **kw): + t=[]; a=t.append + for s in subs: a(s.getNodeValue()) + apply(ST.StructuredTextParagraph.__init__, + (self, join(t,'\n\n'), ()), + kw) + + def getColorizableTexts(self): return () + def setColorizableTexts(self, src): pass # never color examples + +class StructuredTextBullet(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextNumbered(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextDescriptionTitle(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextDescriptionBody(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextDescription(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + + def __init__(self, title, src, subs, **kw): + apply(ST.StructuredTextParagraph.__init__, (self, src, subs), kw) + self._title=title + + def getColorizableTexts(self): return self._title, self._src + def setColorizableTexts(self, src): self._title, self._src = src + + def getChildren(self): + return (StructuredTextDescriptionTitle(self._title), + StructuredTextDescriptionBody(self._src, self._subs)) + +class StructuredTextSectionTitle(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextSection(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + def __init__(self, src, subs=None, **kw): + apply(ST.StructuredTextParagraph.__init__, + (self, StructuredTextSectionTitle(src), subs), + kw) + +# a StructuredTextTable holds StructuredTextRows +class StructuredTextTable(ST.StructuredTextDocument): + """ + rows is a list of lists containing tuples, which + represent the columns/cells in each rows. + EX + rows = [[('row 1:column1',1)],[('row2:column1',1)]] + """ + + def __init__(self, rows, src, subs, **kw): + apply(ST.StructuredTextDocument.__init__,(self,subs),kw) + self._rows = [] + for row in rows: + if row: + self._rows.append(StructuredTextRow(row,kw)) + + def getRows(self): + return [self._rows] + + def _getRows(self): + return self.getRows() + + def getColorizableTexts(self): + """ + return a tuple where each item is a column/cell's + contents. The tuple, result, will be of this format. + ("r1 col1", "r1=col2", "r2 col1", "r2 col2") + """ + + #result = () + result = [] + for row in self._rows: + for column in row.getColumns()[0]: + #result = result[:] + (column.getColorizableTexts(),) + result.append(column.getColorizableTexts()[0]) + return result + + def setColorizableTexts(self,texts): + """ + texts is going to a tuple where each item is the + result of being mapped to the colortext function. + Need to insert the results appropriately into the + individual columns/cells + """ + for row_index in range(len(self._rows)): + for column_index in range(len(self._rows[row_index]._columns)): + self._rows[row_index]._columns[column_index].setColorizableTexts((texts[0],)) + texts = texts[1:] + + def _getColorizableTexts(self): + return self.getColorizableTexts() + + def _setColorizableTexts(self): + return self.setColorizableTexts() + +# StructuredTextRow holds StructuredTextColumns +class StructuredTextRow(ST.StructuredTextDocument): + + def __init__(self,row,kw): + """ + row is a list of tuples, where each tuple is + the raw text for a cell/column and the span + of that cell/column". + EX + [('this is column one',1), ('this is column two',1)] + """ + + apply(ST.StructuredTextDocument.__init__,(self,[]),kw) + self._columns = [] + for column in row: + self._columns.append(StructuredTextColumn(column[0],column[1],kw)) + def getColumns(self): + return [self._columns] + + def _getColumns(self): + return [self._columns] + +# this holds the raw text of a table cell +class StructuredTextColumn(ST.StructuredTextParagraph): + """ + StructuredTextColumn is a cell/column in a table. + This contains the actual text of a column and is + thus a StructuredTextParagraph. A StructuredTextColumn + also holds the span of its column + """ + + def __init__(self,text,span,kw): + apply(ST.StructuredTextParagraph.__init__,(self,text,[]),kw) + self._span = span + + def getSpan(self): + return self._span + + def _getSpan(self): + return self._span + +class StructuredTextMarkup(STDOM.Element): + + def __init__(self, v, **kw): + self._value=v + self._attributes=kw.keys() + for k, v in kw.items(): setattr(self, k, v) + + def getChildren(self, type=type, lt=type([])): + v=self._value + if type(v) is not lt: v=[v] + return v + + def getColorizableTexts(self): return self._value, + def setColorizableTexts(self, v): self._value=v[0] + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, `self._value`) + +class StructuredTextLiteral(StructuredTextMarkup): + def getColorizableTexts(self): return () + def setColorizableTexts(self, v): pass + +class StructuredTextEmphasis(StructuredTextMarkup): pass + +class StructuredTextStrong(StructuredTextMarkup): pass + +class StructuredTextInnerLink(StructuredTextMarkup): pass + +class StructuredTextNamedLink(StructuredTextMarkup): pass + +class StructuredTextUnderline(StructuredTextMarkup): pass + +class StructuredTextLink(StructuredTextMarkup): + "A simple hyperlink" + +class DocumentClass: + """ + Class instance calls [ex.=> x()] require a structured text + structure. Doc will then parse each paragraph in the structure + and will find the special structures within each paragraph. + Each special structure will be stored as an instance. Special + structures within another special structure are stored within + the 'top' structure + EX : '-underline this-' => would be turned into an underline + instance. '-underline **this**' would be stored as an underline + instance with a strong instance stored in its string + """ + + paragraph_types = [ + 'doc_bullet', + 'doc_numbered', + 'doc_description', + 'doc_header', + 'doc_table', + ] + + text_types = [ + 'doc_href', + 'doc_strong', + 'doc_emphasize', + 'doc_literal', + 'doc_inner_link', + 'doc_named_link', + 'doc_underline', + ] + + def __call__(self, doc): + if type(doc) is type(''): + doc=ST.StructuredText(doc) + doc.setSubparagraphs(self.color_paragraphs( + doc.getSubparagraphs())) + else: + doc=ST.StructuredTextDocument(self.color_paragraphs( + doc.getSubparagraphs())) + return doc + + def parse(self, raw_string, text_type, + type=type, st=type(''), lt=type([])): + + """ + Parse accepts a raw_string, an expr to test the raw_string, + and the raw_string's subparagraphs. + + Parse will continue to search through raw_string until + all instances of expr in raw_string are found. + + If no instances of expr are found, raw_string is returned. + Otherwise a list of substrings and instances is returned + """ + + tmp = [] # the list to be returned if raw_string is split + append=tmp.append + + if type(text_type) is st: text_type=getattr(self, text_type) + + while 1: + t = text_type(raw_string) + if not t: break + #an instance of expr was found + t, start, end = t + + if start: append(raw_string[0:start]) + + tt=type(t) + if tt is st: + # if we get a string back, add it to text to be parsed + raw_string = t+raw_string[end:len(raw_string)] + else: + if tt is lt: + # is we get a list, append it's elements + tmp[len(tmp):]=t + else: + # normal case, an object + append(t) + raw_string = raw_string[end:len(raw_string)] + + if not tmp: return raw_string # nothing found + + if raw_string: append(raw_string) + elif len(tmp)==1: return tmp[0] + + return tmp + + + def color_text(self, str, types=None): + """Search the paragraph for each special structure + """ + if types is None: types=self.text_types + + for text_type in types: + + if type(str) is StringType: + str = self.parse(str, text_type) + elif type(str) is ListType: + r=[]; a=r.append + for s in str: + if type(s) is StringType: + s=self.parse(s, text_type) + if type(s) is ListType: r[len(r):]=s + else: a(s) + else: + s.setColorizableTexts( + map(self.color_text, + s.getColorizableTexts() + )) + a(s) + str=r + else: + r=[]; a=r.append; color=self.color_text + for s in str.getColorizableTexts(): + color(s, (text_type,)) + a(s) + + str.setColorizableTexts(r) + + return str + + def color_paragraphs(self, raw_paragraphs, + type=type, sequence_types=(type([]), type(())), + st=type('')): + result=[] + for paragraph in raw_paragraphs: + + if paragraph.getNodeName() != 'StructuredTextParagraph': + result.append(paragraph) + continue + + for pt in self.paragraph_types: + if type(pt) is st: + # grab the corresponding function + pt=getattr(self, pt) + # evaluate the paragraph + r=pt(paragraph) + if r: + if type(r) not in sequence_types: + r=r, + new_paragraphs=r + for paragraph in new_paragraphs: + paragraph.setSubparagraphs(self.color_paragraphs(paragraph.getSubparagraphs())) + break + else: + new_paragraphs=ST.StructuredTextParagraph(paragraph.getColorizableTexts()[0], + self.color_paragraphs(paragraph.getSubparagraphs()), + indent=paragraph.indent), + # color the inline StructuredText types + # for each StructuredTextParagraph + for paragraph in new_paragraphs: + paragraph.setColorizableTexts( + map(self.color_text, + paragraph.getColorizableTexts() + )) + result.append(paragraph) + + return result + + def doc_table(self,paragraph, expr = re.compile('(\s*)([||]+)').match): + text = paragraph.getColorizableTexts()[0] + m = expr(text) + + if not (m): + return None + rows = [] + + # initial split + for row in split(text,"\n"): + rows.append(row) + + # clean up the rows + for index in range(len(rows)): + tmp = [] + rows[index] = strip(rows[index]) + l = len(rows[index])-2 + result = split(rows[index][:l],"||") + for text in result: + if text: + tmp.append(text) + tmp.append('') + else: + tmp.append(text) + rows[index] = tmp + # remove trailing '''s + for index in range(len(rows)): + l = len(rows[index])-1 + rows[index] = rows[index][:l] + + result = [] + for row in rows: + cspan = 0 + tmp = [] + for item in row: + if item: + tmp.append(item,cspan) + cspan = 0 + else: + cspan = cspan + 1 + result.append(tmp) + + subs = paragraph.getSubparagraphs() + indent=paragraph.indent + return StructuredTextTable(result,text,subs,indent=paragraph.indent) + + def doc_bullet(self, paragraph, expr = re.compile('\s*[-*o]\s+').match): + top=paragraph.getColorizableTexts()[0] + m=expr(top) + + if not m: + return None + + subs=paragraph.getSubparagraphs() + if top[-2:]=='::': + subs=[StructuredTextExample(subs)] + top=top[:-1] + return StructuredTextBullet(top[m.span()[1]:], subs, + indent=paragraph.indent, + bullet=top[:m.span()[1]] + ) + + def doc_numbered( + self, paragraph, + expr = re.compile('(\s*[a-zA-Z]+\.)|(\s*[0-9]+\.)|(\s*[0-9]+\s+)').match): + + # This is the old expression. It had a nasty habit + # of grabbing paragraphs that began with a single + # letter word even if there was no following period. + + #expr = re.compile('\s*' + # '(([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.)*' + # '([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.?' + # '\s+').match): + + top=paragraph.getColorizableTexts()[0] + m=expr(top) + if not m: return None + subs=paragraph.getSubparagraphs() + if top[-2:]=='::': + subs=[StructuredTextExample(subs)] + top=top[:-1] + return StructuredTextNumbered(top[m.span()[1]:], subs, + indent=paragraph.indent, + number=top[:m.span()[1]]) + + def doc_description( + self, paragraph, + delim = re.compile('\s+--\s+').search, + nb=re.compile(r'[^\0- ]').search, + ): + + top=paragraph.getColorizableTexts()[0] + d=delim(top) + if not d: return None + start, end = d.span() + title=top[:start] + if find(title, '\n') >= 0: return None + if not nb(title): return None + d=top[start:end] + top=top[end:] + + subs=paragraph.getSubparagraphs() + if top[-2:]=='::': + subs=[StructuredTextExample(subs)] + top=top[:-1] + + return StructuredTextDescription( + title, top, subs, + indent=paragraph.indent, + delim=d) + + def doc_header(self, paragraph, + expr = re.compile('[ a-zA-Z0-9.:/,-_*<>\?\'\"]+').match + ): + subs=paragraph.getSubparagraphs() + if not subs: return None + top=paragraph.getColorizableTexts()[0] + if not strip(top): return None + if top[-2:]=='::': + subs=StructuredTextExample(subs) + if strip(top)=='::': return subs + return ST.StructuredTextParagraph(top[:-1], + [subs], + indent=paragraph.indent, + level=paragraph.level) + + if find(top,'\n') >= 0: return None + return StructuredTextSection(top, subs, indent=paragraph.indent, level=paragraph.level) + + def doc_literal( + self, s, + expr=re.compile( + "(?:\s|^)'" # open + "([^ \t\n\r\f\v']|[^ \t\n\r\f\v'][^\n']*[^ \t\n\r\f\v'])" # contents + "'(?:\s|[,.;:!?]|$)" # close + ).search): + + r=expr(s) + if r: + start, end = r.span(1) + return (StructuredTextLiteral(s[start:end]), start-1, end+1) + else: + return None + + def doc_emphasize( + self, s, + expr = re.compile('\s*\*([ \na-zA-Z0-9.:/;,\'\"\?]+)\*(?!\*|-)').search + ): + + r=expr(s) + if r: + start, end = r.span(1) + return (StructuredTextEmphasis(s[start:end]), start-1, end+1) + else: + return None + + def doc_inner_link(self, + s, + expr1 = re.compile("\.\.\s*").search, + expr2 = re.compile("\[[a-zA-Z0-9]+\]").search): + + # make sure we dont grab a named link + if expr2(s) and expr1(s): + start1,end1 = expr1(s).span() + start2,end2 = expr2(s).span() + if end1 == start2: + # uh-oh, looks like a named link + return None + else: + # the .. is somewhere else, ignore it + return (StructuredTextInnerLink(s[start2+1,end2-1],start2,end2)) + return None + elif expr2(s) and not expr1(s): + start,end = expr2(s).span() + return (StructuredTextInnerLink(s[start+1:end-1]),start,end) + return None + + def doc_named_link(self, + s, + expr=re.compile("(\.\.\s)(\[[a-zA-Z0-9]+\])").search): + + result = expr(s) + if result: + start,end = result.span(2) + a,b = result.span(1) + str = strip(s[a:b]) + s[start:end] + str = s[start+1:end-1] + st,en = result.span() + return (StructuredTextNamedLink(str),st,en) + #return (StructuredTextNamedLink(s[st:en]),st,en) + return None + + def doc_underline(self, + s, + expr=re.compile("\_([a-zA-Z0-9\s\.,\?\/]+)\_").search): + + result = expr(s) + if result: + start,end = result.span(1) + st,e = result.span() + return (StructuredTextUnderline(s[start:end]),st,e) + else: + return None + + def doc_strong(self, + s, + expr = re.compile('\s*\*\*([ \na-zA-Z0-9.:/;\-,!\?\'\"]+)\*\*').search + ): + + r=expr(s) + if r: + start, end = r.span(1) + return (StructuredTextStrong(s[start:end]), start-2, end+2) + else: + return None + + def doc_href( + + self, s, + expr1 = re.compile("(\"[ a-zA-Z0-9\n\-\.\,\;\(\)\/\:\/]+\")(:)([a-zA-Z0-9\:\/\.\~\-]+)([,]*\s*)").search, + expr2 = re.compile('(\"[ a-zA-Z0-9\n\-\.\:\;\(\)\/]+\")([,]+\s+)([a-zA-Z0-9\@\.\,\?\!\/\:\;\-\#]+)(\s*)').search): + + #expr1=re.compile('\"([ a-zA-Z0-9.:/;,\n\~\(\)\-]+)\"' + # ':' + # '([a-zA-Z0-9.:/;,\n\~]+)(?=(\s+|\.|\!|\?))' + # ).search, + #expr2=re.compile('\"([ a-zA-Z0-9./:]+)\"' + # ',\s+' + # '([ a-zA-Z0-9@.:/;]+)(?=(\s+|\.|\!|\?))' + # ).search, + + punctuation = re.compile("[\,\.\?\!\;]+").match + r=expr1(s) or expr2(s) + + if r: + # need to grab the href part and the + # beginning part + + start,e = r.span(1) + name = s[start:e] + name = replace(name,'"','',2) + #start = start + 1 + st,end = r.span(3) + if punctuation(s[end-1:end]): + end = end -1 + link = s[st:end] + #end = end - 1 + + # name is the href title, link is the target + # of the href + return (StructuredTextLink(name, href=link), + start, end) + + #return (StructuredTextLink(s[start:end], href=s[start:end]), + # start, end) + else: + return None diff --git a/wxPython/samples/stxview/StructuredText/DocBookClass.py b/wxPython/samples/stxview/StructuredText/DocBookClass.py new file mode 100644 index 0000000000..b126878bde --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/DocBookClass.py @@ -0,0 +1,325 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +import string +from string import join, split, find, lstrip + +class DocBookClass: + + element_types={ + '#text': '_text', + 'StructuredTextDocument': 'document', + 'StructuredTextParagraph': 'paragraph', + 'StructuredTextExample': 'example', + 'StructuredTextBullet': 'bullet', + 'StructuredTextNumbered': 'numbered', + 'StructuredTextDescription': 'description', + 'StructuredTextDescriptionTitle': 'descriptionTitle', + 'StructuredTextDescriptionBody': 'descriptionBody', + 'StructuredTextSection': 'section', + 'StructuredTextSectionTitle': 'sectionTitle', + 'StructuredTextLiteral': 'literal', + 'StructuredTextEmphasis': 'emphasis', + 'StructuredTextStrong': 'strong', + 'StructuredTextLink': 'link', + 'StructuredTextXref': 'xref', + } + + def dispatch(self, doc, level, output): + getattr(self, self.element_types[doc.getNodeName()])(doc, level, output) + + def __call__(self, doc, level=1): + r=[] + self.dispatch(doc, level-1, r.append) + return join(r,'') + + def _text(self, doc, level, output): + if doc.getNodeName() == 'StructuredTextLiteral': + output(doc.getNodeValue()) + else: + output(lstrip(doc.getNodeValue())) + + def document(self, doc, level, output): + output('\n') + output('\n') + children=doc.getChildNodes() + if (children and + children[0].getNodeName() == 'StructuredTextSection'): + output('%s' % children[0].getChildNodes()[0].getNodeValue()) + for c in children: + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + + def section(self, doc, level, output): + output('\n\n' % (level + 1)) + children=doc.getChildNodes() + for c in children: + getattr(self, self.element_types[c.getNodeName()])(c, level+1, output) + output('\n\n' % (level + 1)) + + def sectionTitle(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + + def description(self, doc, level, output): + p=doc.getPreviousSibling() + if p is None or p.getNodeName() is not doc.getNodeName(): + output('\n') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + n=doc.getNextSibling() + if n is None or n.getNodeName() is not doc.getNodeName(): + output('\n') + + def descriptionTitle(self, doc, level, output): + output('\n') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + + def descriptionBody(self, doc, level, output): + output('\n') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + output('\n') + + def bullet(self, doc, level, output): + p=doc.getPreviousSibling() + if p is None or p.getNodeName() is not doc.getNodeName(): + output('\n') + output('\n') + + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + n=doc.getNextSibling() + output('\n') + if n is None or n.getNodeName() is not doc.getNodeName(): + output('\n') + + def numbered(self, doc, level, output): + p=doc.getPreviousSibling() + if p is None or p.getNodeName() is not doc.getNodeName(): + output('\n') + output('\n') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + n=doc.getNextSibling() + output('\n') + if n is None or n.getNodeName() is not doc.getNodeName(): + output('\n') + + def example(self, doc, level, output): + i=0 + for c in doc.getChildNodes(): + if i==0: + output('\n' in your body will break this... + ## + output(prestrip(c.getNodeValue())) + output('\n]]>\n') + else: + getattr(self, self.element_types[c.getNodeName()])( + c, level, output) + + def paragraph(self, doc, level, output): + + output('\n\n') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])( + c, level, output) + output('\n\n') + + def link(self, doc, level, output): +# output('' % doc.href) + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) +# output('') + + def emphasis(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output(' ') + + def literal(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + output(c.getNodeValue()) + output('') + + def strong(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('') + + def xref(self, doc, level, output): + output('' % doc.getNodeValue()) + +def prestrip(v): + v=string.replace(v, '\r\n', '\n') + v=string.replace(v, '\r', '\n') + v=string.replace(v, '\t', ' ') + lines=string.split(v, '\n') + indent=len(lines[0]) + for line in lines: + if not len(line): continue + i=len(line)-len(string.lstrip(line)) + if i < indent: + indent=i + nlines=[] + for line in lines: + nlines.append(line[indent:]) + return string.join(nlines, '\r\n') + + +class DocBookChapter(DocBookClass): + + def document(self, doc, level, output): + output('\n') + children=doc.getChildNodes() + if (children and + children[0].getNodeName() == 'StructuredTextSection'): + output('%s' % children[0].getChildNodes()[0].getNodeValue()) + for c in children[0].getChildNodes()[1:]: + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + +ets = DocBookClass.element_types +ets.update({'StructuredTextImage': 'image'}) + +class DocBookChapterWithFigures(DocBookChapter): + + element_types = ets + + def image(self, doc, level, output): + if hasattr(doc, 'key'): + output('
%s\n' % (doc.key, doc.getNodeValue()) ) + else: + output('
%s\n' % doc.getNodeValue()) +## for c in doc.getChildNodes(): +## getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n
\n' % doc.href) + +class DocBookArticle(DocBookClass): + + def document(self, doc, level, output): + output('\n') + output('
\n') + children=doc.getChildNodes() + if (children and + children[0].getNodeName() == 'StructuredTextSection'): + output('\n%s\n\n' % + children[0].getChildNodes()[0].getNodeValue()) + for c in children: + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('
\n') + + +class DocBookBook: + + def __init__(self, title=''): + self.title = title + self.chapters = [] + + def addChapter(self, chapter): + self.chapters.append(chapter) + + def read(self): + out = '\n\n' + out = out + '%s\n' % self.title + for chapter in self.chapters: + out = out + chapter + '\n\n' + + return out + + def __str__(self): + return self.read() + + diff --git a/wxPython/samples/stxview/StructuredText/DocumentClass.py b/wxPython/samples/stxview/StructuredText/DocumentClass.py new file mode 100644 index 0000000000..ec6dc402a4 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/DocumentClass.py @@ -0,0 +1,777 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +import re, ST, STDOM +from string import split, join, replace, expandtabs, strip, find, rstrip + +StringType=type('') +ListType=type([]) + +class StructuredTextExample(ST.StructuredTextParagraph): + """Represents a section of document with literal text, as for examples""" + + def __init__(self, subs, **kw): + t=[]; a=t.append + for s in subs: a(s.getNodeValue()) + apply(ST.StructuredTextParagraph.__init__, + (self, join(t,'\n\n'), ()), + kw) + + def getColorizableTexts(self): return () + def setColorizableTexts(self, src): pass # never color examples + +class StructuredTextBullet(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextNumbered(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextDescriptionTitle(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextDescriptionBody(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextDescription(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + + def __init__(self, title, src, subs, **kw): + apply(ST.StructuredTextParagraph.__init__, (self, src, subs), kw) + self._title=title + + def getColorizableTexts(self): return self._title, self._src + def setColorizableTexts(self, src): self._title, self._src = src + + def getChildren(self): + return (StructuredTextDescriptionTitle(self._title), + StructuredTextDescriptionBody(self._src, self._subs)) + +class StructuredTextSectionTitle(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + +class StructuredTextSection(ST.StructuredTextParagraph): + """Represents a section of a document with a title and a body""" + def __init__(self, src, subs=None, **kw): + apply(ST.StructuredTextParagraph.__init__, + (self, StructuredTextSectionTitle(src), subs), + kw) + +# a StructuredTextTable holds StructuredTextRows +class StructuredTextTable(ST.StructuredTextDocument): + """ + rows is a list of lists containing tuples, which + represent the columns/cells in each rows. + EX + rows = [[('row 1:column1',1)],[('row2:column1',1)]] + """ + + def __init__(self, rows, src, subs, **kw): + apply(ST.StructuredTextDocument.__init__,(self,subs),kw) + self._rows = [] + for row in rows: + if row: + self._rows.append(StructuredTextRow(row,kw)) + + def getRows(self): + return [self._rows] + + def _getRows(self): + return self.getRows() + + def getColumns(self): + result = [] + for row in self._rows: + result.append(row.getColumns()) + return result + + def _getColumns(self): + return self.getColumns() + + def setColumns(self,columns): + for index in range(len(self._rows)): + self._rows[index].setColumns(columns[index]) + + def _setColumns(self,columns): + return self.setColumns(columns) + + def getColorizableTexts(self): + """ + return a tuple where each item is a column/cell's + contents. The tuple, result, will be of this format. + ("r1 col1", "r1=col2", "r2 col1", "r2 col2") + """ + + result = [] + for row in self._rows: + for column in row.getColumns()[0]: + result.append(column.getColorizableTexts()[0]) + return result + + def setColorizableTexts(self,texts): + """ + texts is going to a tuple where each item is the + result of being mapped to the colortext function. + Need to insert the results appropriately into the + individual columns/cells + """ + for row_index in range(len(self._rows)): + for column_index in range(len(self._rows[row_index]._columns)): + self._rows[row_index]._columns[column_index].setColorizableTexts((texts[0],)) + texts = texts[1:] + + def _getColorizableTexts(self): + return self.getColorizableTexts() + + def _setColorizableTexts(self): + return self.setColorizableTexts() + +# StructuredTextRow holds StructuredTextColumns +class StructuredTextRow(ST.StructuredTextDocument): + + def __init__(self,row,kw): + """ + row is a list of tuples, where each tuple is + the raw text for a cell/column and the span + of that cell/column". + EX + [('this is column one',1), ('this is column two',1)] + """ + + apply(ST.StructuredTextDocument.__init__,(self,[]),kw) + self._columns = [] + for column in row: + self._columns.append(StructuredTextColumn(column[0],column[1],kw)) + + def getColumns(self): + return [self._columns] + + def _getColumns(self): + return [self._columns] + + def setColumns(self,columns): + self._columns = columns + + def _setColumns(self,columns): + return self.setColumns(columns) + +# this holds the text of a table cell +class StructuredTextColumn(ST.StructuredTextParagraph): + """ + StructuredTextColumn is a cell/column in a table. + A cell can hold multiple paragraphs. The cell + is either classified as a StructuredTextTableHeader + or StructuredTextTableData. + """ + + def __init__(self,text,span,kw): + # print "StructuredTextColumn", text, span + apply(ST.StructuredTextParagraph.__init__,(self,text,[]),kw) + self._span = span + + def getSpan(self): + return self._span + + def _getSpan(self): + return self._span + +class StructuredTextTableHeader(ST.StructuredTextDocument): pass + +class StructuredTextTableData(ST.StructuredTextDocument): pass + +class StructuredTextMarkup(STDOM.Element): + + def __init__(self, v, **kw): + self._value=v + self._attributes=kw.keys() + for k, v in kw.items(): setattr(self, k, v) + + def getChildren(self, type=type, lt=type([])): + v=self._value + if type(v) is not lt: v=[v] + return v + + def getColorizableTexts(self): return self._value, + def setColorizableTexts(self, v): self._value=v[0] + + def __repr__(self): + return '%s(%s)' % (self.__class__.__name__, `self._value`) + +class StructuredTextLiteral(StructuredTextMarkup): + def getColorizableTexts(self): return () + def setColorizableTexts(self, v): pass + +class StructuredTextEmphasis(StructuredTextMarkup): pass + +class StructuredTextStrong(StructuredTextMarkup): pass + +class StructuredTextInnerLink(StructuredTextMarkup): pass + +class StructuredTextNamedLink(StructuredTextMarkup): pass + +class StructuredTextUnderline(StructuredTextMarkup): pass + +class StructuredTextSGML(StructuredTextMarkup): pass + +class StructuredTextLink(StructuredTextMarkup): pass + +class DocumentClass: + """ + Class instance calls [ex.=> x()] require a structured text + structure. Doc will then parse each paragraph in the structure + and will find the special structures within each paragraph. + Each special structure will be stored as an instance. Special + structures within another special structure are stored within + the 'top' structure + EX : '-underline this-' => would be turned into an underline + instance. '-underline **this**' would be stored as an underline + instance with a strong instance stored in its string + """ + + #'doc_table', + paragraph_types = [ + 'doc_bullet', + 'doc_numbered', + 'doc_description', + 'doc_header', + 'doc_table', + ] + + #'doc_inner_link', + #'doc_named_link', + #'doc_underline', + text_types = [ + 'doc_href', + 'doc_strong', + 'doc_emphasize', + 'doc_literal', + 'doc_sgml' + ] + + def __call__(self, doc): + if type(doc) is type(''): + doc=ST.StructuredText(doc) + doc.setSubparagraphs(self.color_paragraphs( + doc.getSubparagraphs())) + else: + doc=ST.StructuredTextDocument(self.color_paragraphs( + doc.getSubparagraphs())) + return doc + + def parse(self, raw_string, text_type, + type=type, st=type(''), lt=type([])): + + """ + Parse accepts a raw_string, an expr to test the raw_string, + and the raw_string's subparagraphs. + + Parse will continue to search through raw_string until + all instances of expr in raw_string are found. + + If no instances of expr are found, raw_string is returned. + Otherwise a list of substrings and instances is returned + """ + + tmp = [] # the list to be returned if raw_string is split + append=tmp.append + + if type(text_type) is st: text_type=getattr(self, text_type) + + while 1: + t = text_type(raw_string) + if not t: break + #an instance of expr was found + t, start, end = t + + if start: append(raw_string[0:start]) + + tt=type(t) + if tt is st: + # if we get a string back, add it to text to be parsed + raw_string = t+raw_string[end:len(raw_string)] + else: + if tt is lt: + # is we get a list, append it's elements + tmp[len(tmp):]=t + else: + # normal case, an object + append(t) + raw_string = raw_string[end:len(raw_string)] + + if not tmp: return raw_string # nothing found + + if raw_string: append(raw_string) + elif len(tmp)==1: return tmp[0] + + return tmp + + + def color_text(self, str, types=None): + """Search the paragraph for each special structure + """ + if types is None: types=self.text_types + + for text_type in types: + + if type(str) is StringType: + str = self.parse(str, text_type) + elif type(str) is ListType: + r=[]; a=r.append + for s in str: + if type(s) is StringType: + s=self.parse(s, text_type) + if type(s) is ListType: r[len(r):]=s + else: a(s) + else: + s.setColorizableTexts( + map(self.color_text, + s.getColorizableTexts() + )) + a(s) + str=r + else: + r=[]; a=r.append; color=self.color_text + for s in str.getColorizableTexts(): + color(s, (text_type,)) + a(s) + + str.setColorizableTexts(r) + + return str + + def color_paragraphs(self, raw_paragraphs, + type=type, sequence_types=(type([]), type(())), + st=type('')): + result=[] + for paragraph in raw_paragraphs: + #print type(paragraph) + if paragraph.getNodeName() != 'StructuredTextParagraph': + result.append(paragraph) + continue + + for pt in self.paragraph_types: + if type(pt) is st: + # grab the corresponding function + pt=getattr(self, pt) + # evaluate the paragraph + r=pt(paragraph) + if r: + if type(r) not in sequence_types: + r=r, + new_paragraphs=r + for paragraph in new_paragraphs: + paragraph.setSubparagraphs(self.color_paragraphs(paragraph.getSubparagraphs())) + break + else: + new_paragraphs=ST.StructuredTextParagraph(paragraph.getColorizableTexts()[0], + self.color_paragraphs(paragraph.getSubparagraphs()), + indent=paragraph.indent), + + # color the inline StructuredText types + # for each StructuredTextParagraph + for paragraph in new_paragraphs: + + if paragraph.getNodeName() is "StructuredTextTable": + #print "we have a table" + cells = paragraph.getColumns() + text = paragraph.getColorizableTexts() + text = map(ST.StructuredText,text) + text = map(self.__call__,text) + #for index in range(len(text)): + # text[index].setColorizableTexts(map(self.color_text,text[index].getColorizableTexts())) + paragraph.setColorizableTexts(text) + + paragraph.setColorizableTexts( + map(self.color_text, + paragraph.getColorizableTexts() + )) + result.append(paragraph) + + return result + + def doc_table(self, paragraph, expr = re.compile('\s*\|[-]+\|').match): + text = paragraph.getColorizableTexts()[0] + m = expr(text) + + subs = paragraph.getSubparagraphs() + + if not (m): + return None + rows = [] + + rows = split(text,'\n') + + spans = [] + ROWS = [] + COLS = [] + + TDdivider = re.compile("[\-]+").match + THdivider = re.compile("[\=]+").match + + # find where the column markers are located + col = re.compile('\|').search + text = strip(text) + rows = split(text,'\n') + for row in range(len(rows)): + rows[row] = strip(rows[row]) + + for row in rows: + tmp = strip(row) + tmp = row[1:len(tmp)-1] # remove leading and trailing | + offset = 0 + if col(tmp): + while col(tmp): + start,end = col(tmp).span() + if not start+offset in spans: + spans.append(start + offset) + COLS.append((tmp[0:start],start+offset)) + tmp = " " + tmp[end:] + offset = offset + (start) + if not offset+len(tmp) in spans: + spans.append(offset+len(tmp)) + COLS.append((tmp,offset+len(tmp))) + ROWS.append(COLS) + COLS = [] + + spans.sort() + + ROWS = ROWS[1:len(ROWS)] + + # find each column span + cols = [] + tmp = [] + + for row in ROWS: + for c in row: + tmp.append(c[1]) + cols.append(tmp) + tmp = [] + + cur = 1 # the current column span + tmp = [] + C = [] # holds the span of each cell + for col in cols: + for span in spans: + if not span in col: + cur = cur + 1 + else: + tmp.append(cur) + cur = 1 + C.append(tmp) + tmp = [] + + # make rows contain the cell's text and the span + # of that cell + for index in range(len(C)): + for i in range(len(C[index])): + ROWS[index][i] = (ROWS[index][i][0],C[index][i]) + rows = ROWS + + # now munge the table cells together + ROWS = [] + COLS = [] + for row in rows: + for index in range(len(row)): + if not COLS: + COLS = range(len(row)) + for i in range(len(COLS)): + COLS[i] = ["",1] + if TDdivider(row[index][0]) or THdivider(row[index][0]): + ROWS.append(COLS) + COLS = [] + else: + COLS[index][0] = COLS[index][0] + rstrip(row[index][0]) + "\n" + COLS[index][1] = row[index][1] + return StructuredTextTable(ROWS,text,subs,indent=paragraph.indent) + + def doc_bullet(self, paragraph, expr = re.compile('\s*[-*o]\s+').match): + top=paragraph.getColorizableTexts()[0] + m=expr(top) + + if not m: + return None + + subs=paragraph.getSubparagraphs() + if top[-2:]=='::': + subs=[StructuredTextExample(subs)] + top=top[:-1] + return StructuredTextBullet(top[m.span()[1]:], subs, + indent=paragraph.indent, + bullet=top[:m.span()[1]] + ) + + def doc_numbered( + self, paragraph, + expr = re.compile('(\s*[a-zA-Z]+\.)|(\s*[0-9]+\.)|(\s*[0-9]+\s+)').match): + + # This is the old expression. It had a nasty habit + # of grabbing paragraphs that began with a single + # letter word even if there was no following period. + + #expr = re.compile('\s*' + # '(([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.)*' + # '([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.?' + # '\s+').match): + + top=paragraph.getColorizableTexts()[0] + m=expr(top) + if not m: return None + subs=paragraph.getSubparagraphs() + if top[-2:]=='::': + subs=[StructuredTextExample(subs)] + top=top[:-1] + return StructuredTextNumbered(top[m.span()[1]:], subs, + indent=paragraph.indent, + number=top[:m.span()[1]]) + + def doc_description( + self, paragraph, + delim = re.compile('\s+--\s+').search, + nb=re.compile(r'[^\0- ]').search, + ): + + top=paragraph.getColorizableTexts()[0] + d=delim(top) + if not d: return None + start, end = d.span() + title=top[:start] + if find(title, '\n') >= 0: return None + if not nb(title): return None + d=top[start:end] + top=top[end:] + + subs=paragraph.getSubparagraphs() + if top[-2:]=='::': + subs=[StructuredTextExample(subs)] + top=top[:-1] + + return StructuredTextDescription( + title, top, subs, + indent=paragraph.indent, + delim=d) + + def doc_header(self, paragraph, + expr = re.compile('[ a-zA-Z0-9.:/,-_*<>\?\'\"]+').match + ): + subs=paragraph.getSubparagraphs() + if not subs: return None + top=paragraph.getColorizableTexts()[0] + if not strip(top): return None + if top[-2:]=='::': + subs=StructuredTextExample(subs) + if strip(top)=='::': return subs + return ST.StructuredTextParagraph( + top[:-1], [subs], indent=paragraph.indent) + + if find(top,'\n') >= 0: return None + return StructuredTextSection(top, subs, indent=paragraph.indent) + + def doc_literal( + self, s, + expr=re.compile( + "(?:\s|^)'" # open + "([^ \t\n\r\f\v']|[^ \t\n\r\f\v'][^\n']*[^ \t\n\r\f\v'])" # contents + "'(?:\s|[,.;:!?]|$)" # close + ).search): + + r=expr(s) + if r: + start, end = r.span(1) + return (StructuredTextLiteral(s[start:end]), start-1, end+1) + else: + return None + + def doc_emphasize( + self, s, + expr = re.compile('\s*\*([ \na-zA-Z0-9.:/;,\'\"\?]+)\*(?!\*|-)').search + ): + + r=expr(s) + if r: + start, end = r.span(1) + return (StructuredTextEmphasis(s[start:end]), start-1, end+1) + else: + return None + + def doc_inner_link(self, + s, + expr1 = re.compile("\.\.\s*").search, + expr2 = re.compile("\[[a-zA-Z0-9]+\]").search): + + # make sure we dont grab a named link + if expr2(s) and expr1(s): + start1,end1 = expr1(s).span() + start2,end2 = expr2(s).span() + if end1 == start2: + # uh-oh, looks like a named link + return None + else: + # the .. is somewhere else, ignore it + return (StructuredTextInnerLink(s[start2+1,end2-1],start2,end2)) + return None + elif expr2(s) and not expr1(s): + start,end = expr2(s).span() + return (StructuredTextInnerLink(s[start+1:end-1]),start,end) + return None + + def doc_named_link(self, + s, + expr=re.compile("(\.\.\s)(\[[a-zA-Z0-9]+\])").search): + + result = expr(s) + if result: + start,end = result.span(2) + a,b = result.span(1) + str = strip(s[a:b]) + s[start:end] + st,en = result.span() + return (StructuredTextNamedLink(str),st,en) + #return (StructuredTextNamedLink(s[st:en]),st,en) + return None + + def doc_underline(self, + s, + expr=re.compile("\_([a-zA-Z0-9\s\.,\?]+)\_").search): + + result = expr(s) + if result: + start,end = result.span(1) + st,e = result.span() + return (StructuredTextUnderline(s[start:end]),st,e) + else: + return None + + def doc_strong(self, + s, + expr = re.compile('\s*\*\*([ \na-zA-Z0-9.:/;\-,!\?\'\"]+)\*\*').search + ): + + r=expr(s) + if r: + start, end = r.span(1) + return (StructuredTextStrong(s[start:end]), start-2, end+2) + else: + return None + + def doc_href( + + self, s, + expr1 = re.compile("(\"[ a-zA-Z0-9\n\-\.\,\;\(\)\/\:\/]+\")(:)([a-zA-Z0-9\:\/\.\~\-]+)([,]*\s*)").search, + expr2 = re.compile('(\"[ a-zA-Z0-9\n\-\.\:\;\(\)\/]+\")([,]+\s+)([a-zA-Z0-9\@\.\,\?\!\/\:\;\-\#]+)(\s*)').search): + + punctuation = re.compile("[\,\.\?\!\;]+").match + r=expr1(s) or expr2(s) + + if r: + # need to grab the href part and the + # beginning part + + start,e = r.span(1) + name = s[start:e] + name = replace(name,'"','',2) + #start = start + 1 + st,end = r.span(3) + if punctuation(s[end-1:end]): + end = end -1 + link = s[st:end] + #end = end - 1 + + # name is the href title, link is the target + # of the href + return (StructuredTextLink(name, href=link), + start, end) + + #return (StructuredTextLink(s[start:end], href=s[start:end]), + # start, end) + else: + return None + + def doc_sgml(self,s,expr=re.compile("\<[a-zA-Z0-9\.\=\'\"\:\/\-\#\+\s]+\>").search): + """ + SGML text is ignored and outputed as-is + """ + r = expr(s) + if r: + start,end = r.span() + text = s[start:end] + return (StructuredTextSGML(text),start,end) diff --git a/wxPython/samples/stxview/StructuredText/DocumentWithImages.py b/wxPython/samples/stxview/StructuredText/DocumentWithImages.py new file mode 100644 index 0000000000..ac73abf307 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/DocumentWithImages.py @@ -0,0 +1,134 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +import re, ST, STDOM +from string import split, join, replace, expandtabs, strip, find + +from DocumentClass import * + +class StructuredTextImage(StructuredTextMarkup): + "A simple embedded image" + +class DocumentWithImages(DocumentClass): + """ + + """ + + + text_types = [ + 'doc_img', + ] + DocumentClass.text_types + + + def doc_img( + self, s, + expr1=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+)').search, + expr2=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+):([a-zA-Z0-9\-.:/;,\n\~]+)').search + ): + + + r = expr2(s) + if r: + startt, endt = r.span(1) + startk, endk = r.span(2) + starth, endh = r.span(3) + start, end = r.span() + return (StructuredTextImage(s[startt:endt], href=s[starth:endh], key=s[startk:endk]), + start, end) + + + else: + + r=expr1(s) + + if r: + startt, endt = r.span(1) + starth, endh = r.span(2) + start, end = r.span() + return (StructuredTextImage(s[startt:endt], href=s[starth:endh]), + start, end) + + return None + diff --git a/wxPython/samples/stxview/StructuredText/HTMLClass.py b/wxPython/samples/stxview/StructuredText/HTMLClass.py new file mode 100644 index 0000000000..d5c03d8357 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/HTMLClass.py @@ -0,0 +1,308 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +from string import join, split, find +import re, sys, ST + +class HTMLClass: + + element_types={ + '#text': '_text', + 'StructuredTextDocument': 'document', + 'StructuredTextParagraph': 'paragraph', + 'StructuredTextExample': 'example', + 'StructuredTextBullet': 'bullet', + 'StructuredTextNumbered': 'numbered', + 'StructuredTextDescription': 'description', + 'StructuredTextDescriptionTitle': 'descriptionTitle', + 'StructuredTextDescriptionBody': 'descriptionBody', + 'StructuredTextSection': 'section', + 'StructuredTextSectionTitle': 'sectionTitle', + 'StructuredTextLiteral': 'literal', + 'StructuredTextEmphasis': 'emphasis', + 'StructuredTextStrong': 'strong', + 'StructuredTextLink': 'link', + 'StructuredTextXref': 'xref', + 'StructuredTextInnerLink':'innerLink', + 'StructuredTextNamedLink':'namedLink', + 'StructuredTextUnderline':'underline', + 'StructuredTextTable':'table', + 'StructuredTextSGML':'sgml', + } + + def dispatch(self, doc, level, output): + getattr(self, self.element_types[doc.getNodeName()])(doc, level, output) + + def __call__(self, doc, level=1): + r=[] + self.dispatch(doc, level-1, r.append) + return join(r,'') + + def _text(self, doc, level, output): + output(doc.getNodeValue()) + + def document(self, doc, level, output): + output('\n') + children=doc.getChildNodes() + if (children and + children[0].getNodeName() == 'StructuredTextSection'): + output('\n%s\n\n' % + children[0].getChildNodes()[0].getNodeValue()) + output('\n') + for c in children: + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + output('\n') + + def section(self, doc, level, output): + children=doc.getChildNodes() + for c in children: + getattr(self, self.element_types[c.getNodeName()])(c, level+1, output) + + def sectionTitle(self, doc, level, output): + output('' % (level)) + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n' % (level)) + + def description(self, doc, level, output): + p=doc.getPreviousSibling() + if p is None or p.getNodeName() is not doc.getNodeName(): + output('
\n') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + n=doc.getNextSibling() + if n is None or n.getNodeName() is not doc.getNodeName(): + output('
\n') + + def descriptionTitle(self, doc, level, output): + output('
') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('
\n') + + def descriptionBody(self, doc, level, output): + output('
') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('
\n') + + def bullet(self, doc, level, output): + p=doc.getPreviousSibling() + if p is None or p.getNodeName() is not doc.getNodeName(): + output('\n') + + def numbered(self, doc, level, output): + p=doc.getPreviousSibling() + if p is None or p.getNodeName() is not doc.getNodeName(): + output('
    \n') + output('
  1. ') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + n=doc.getNextSibling() + output('
  2. \n') + if n is None or n.getNodeName() is not doc.getNodeName(): + output('
\n') + + def example(self, doc, level, output): + i=0 + for c in doc.getChildNodes(): + if i==0: + output('
')
+                output(html_quote(c.getNodeValue()))
+                output('
\n') + else: + getattr(self, self.element_types[c.getNodeName()])( + c, level, output) + + def paragraph(self, doc, level, output): + i=0 + output('

') + for c in doc.getChildNodes(): + if c.getNodeName() in ['StructuredTextParagraph']: + getattr(self, self.element_types[c.getNodeName()])( + c, level, output) + else: + getattr(self, self.element_types[c.getNodeName()])( + c, level, output) + output('

') + + def link(self, doc, level, output): + output('' % doc.href) + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('') + + def emphasis(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('') + + def literal(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + output(html_quote(c.getNodeValue())) + output('') + + def strong(self, doc, level, output): + output('') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('') + + def underline(self, doc, level, output): + output("") + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output("") + + def innerLink(self, doc, level, output): + output('[') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output(']') + + def namedLink(self, doc, level, output): + output('[') + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output(']') + + def sgml(self,doc,level,output): + for c in doc.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + + def table(self,doc,level,output): + """ + A StructuredTextTable holds StructuredTextRow(s) which + holds StructuredTextColumn(s). A StructuredTextColumn + is a type of StructuredTextParagraph and thus holds + the actual data. + """ + output("\n") + for row in doc.getRows()[0]: + output("\n") + for column in row.getColumns()[0]: + str = "\n") + output("\n") + output("
" % column.getSpan() + output(str) + #for c in doc.getChildNodes(): + # getattr(self, self.element_types[c.getNodeName()])(c, level, output) + for c in column.getChildNodes(): + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output("
\n") + +def html_quote(v, name='(Unknown name)', md={}, + character_entities=( + (('&'), '&'), + (('<'), '<' ), + (('>'), '>' ), + (('\213'), '<' ), + (('\233'), '>' ), + (('"'), '"'))): #" + text=str(v) + for re,name in character_entities: + if find(text, re) >= 0: text=join(split(text,re),name) + return text + + + + + diff --git a/wxPython/samples/stxview/StructuredText/HTMLWithImages.py b/wxPython/samples/stxview/StructuredText/HTMLWithImages.py new file mode 100644 index 0000000000..4d1e2f2b05 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/HTMLWithImages.py @@ -0,0 +1,133 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +from string import join, split, find +import re, sys, ST +import time + +from HTMLClass import HTMLClass + +ets = HTMLClass.element_types +ets.update({'StructuredTextImage': 'image'}) + +class HTMLWithImages(HTMLClass): + + element_types = ets + + def document(self, doc, level, output): + output('\n') + children=doc.getChildNodes() + if (children and + children[0].getNodeName() == 'StructuredTextSection'): + output('\n%s\n\n' % + children[0].getChildNodes()[0].getNodeValue()) + output('\n') + for c in children: + getattr(self, self.element_types[c.getNodeName()])(c, level, output) + output('\n') + output('\n') + + + def image(self, doc, level, output): + output('%s' % (doc.href, doc.getNodeValue())) + + + def image(self, doc, level, output): + if hasattr(doc, 'key'): + output('\n%s' % (doc.key, doc.href, doc.getNodeValue())) + else: + output('%s' % (doc.href, doc.getNodeValue())) + + + def xref(self, doc, level, output): + val = doc.getNodeValue() + output('%s' % (val, val) ) + + + + + + + diff --git a/wxPython/samples/stxview/StructuredText/MML.py b/wxPython/samples/stxview/StructuredText/MML.py new file mode 100644 index 0000000000..515bd3272c --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/MML.py @@ -0,0 +1,170 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## +''' +$Id$''' + +from StructuredText import * # :-) + +def ctag(s): + # Blech, wish we could use character tags + if s is None: s='' + s=gsub(strong,'\\1\\2\\3',s) + s=gsub(code, '\\1\\2\\3',s) + s=gsub(em, '\\1\\2\\3',s) + return join(map(strip,split(s,'\n')),'\n') + +class MML(StructuredText): + + '''\ + An MML structured text formatter. + '''\ + + def __str__(self, + ): + '''\ + Return an HTML string representation of the structured text data. + + ''' + s=self._str(self.structure,self.level) + return s + + def ul(self, before, p, after): + return ("%s\n\n\n%s%s" + % (before, ctag(p), after)) + + def ol(self, before, p, after): + return ("%s\n\n\n%s%s" + % (before, ctag(p), after)) + + def dl(self, before, t, d, after): + return ("%s\n\n\n%s\n\n\n%s%s" + % (before,ctag(t),ctag(d),after)) + + def head(self, before, t, level, d): + return ("%s\n\n\n%s%s" + % (before,level,ctag(t),d)) + + def normal(self,before,p,after): + return "%s\n\n\n%s%s" % (before, ctag(p), after) + + def pre(self,structure,r=None): + if r is None: r=[''] + for s in structure: + for line in split(s[0],'\n'): + r.append('\n
')
+                r.append(line)
+            self.pre(s[1],r)
+        return join(r,'\n')
+
+    def _str(self,structure,level):
+        r=''
+        for s in structure:
+            # print s[0],'\n', len(s[1]), '\n\n'
+            if bullet.match(s[0]) >= 0:
+                p=bullet.group(1)
+                r=self.ul(r,p,self._str(s[1],level))
+            elif ol.match(s[0]) >= 0:
+                p=ol.group(3)
+                r=self.ol(r,p,self._str(s[1],level))
+            elif olp.match(s[0]) >= 0:
+                p=olp.group(1)
+                r=self.ol(r,p,self._str(s[1],level))
+            elif dl.match(s[0]) >= 0:
+                t,d=dl.group(1,2)
+                r=self.dl(r,t,d,self._str(s[1],level))
+            elif example.search(s[0]) >= 0 and s[1]:
+                # Introduce an example, using pre tags:
+                r=self.normal(r,s[0],self.pre(s[1]))
+            elif s[0][-2:]=='::' and s[1]:
+                # Introduce an example, using pre tags:
+                r=self.normal(r,s[0][:-1],self.pre(s[1]))
+            elif nl.search(s[0]) < 0 and s[1] and s[0][-1:] != ':':
+                # Treat as a heading
+                t=s[0]
+                r=self.head(r,t,level,
+                            self._str(s[1],level and level+1))
+            else:
+                r=self.normal(r,s[0],self._str(s[1],level))
+        return r        
diff --git a/wxPython/samples/stxview/StructuredText/ST.py b/wxPython/samples/stxview/StructuredText/ST.py
new file mode 100644
index 0000000000..2e6d0aba1f
--- /dev/null
+++ b/wxPython/samples/stxview/StructuredText/ST.py
@@ -0,0 +1,278 @@
+import re, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+#####################################################################
+#                              Updated functions                    #
+#####################################################################
+
+def indention(str,front = re.compile("^\s+").match):
+    """ 
+    Convert all tabs to the appropriate number of spaces.
+    Find the number of leading spaces. If none, return 0
+    """
+    
+    if front(str):
+        start,end = front(str).span()
+        return end-start-1
+    else:
+        return 0     # no leading spaces
+
+def insert(struct, top, level):
+    """
+    find what will be the parant paragraph of
+    a sentence and return that paragraph's
+    sub-paragraphs. The new paragraph will be
+    appended to those sub-paragraphs
+    """
+    #print "struct", struct, top-1
+    if not top-1 in range(len(struct)):
+        return None
+    run = struct[top-1]
+    i    = 0
+    while i+1 < level:
+        run = run.getSubparagraphs()[len(run.getSubparagraphs())-1]
+        i = i + 1
+    #print "parent for level ", level, " was => ", run.getColorizableTexts()
+    return run.getSubparagraphs()
+        
+def display(struct):
+    """
+    runs through the structure and prints out
+    the paragraphs. If the insertion works
+    correctly, display's results should mimic
+    the orignal paragraphs.
+    """
+    
+    if struct.getColorizableTexts():
+        print join(struct.getColorizableTexts()),"\n"
+    if struct.getSubparagraphs():
+        for x in struct.getSubparagraphs():
+            display(x)
+    
+def display2(struct):
+    """
+    runs through the structure and prints out
+    the paragraphs. If the insertion works
+    correctly, display's results should mimic
+    the orignal paragraphs.    
+    """
+    
+    if struct.getNodeValue():
+        print struct.getNodeValue(),"\n"
+    if struct.getSubparagraphs():
+        for x in struct.getSubparagraphs():
+            display(x)
+            
+def findlevel(levels,indent):
+    """
+    remove all level information of levels
+    with a greater level of indentation.
+    Then return which level should insert this
+    paragraph
+    """
+    
+    keys = levels.keys()
+    for key in keys:
+        if levels[key] > indent:
+            del(levels[key])
+    keys = levels.keys()
+    if not(keys):
+        return 0
+    else:
+        for key in keys:
+            if levels[key] == indent:
+                return key
+    highest = 0
+    for key in keys:
+        if key > highest:
+            highest = key
+    return highest-1
+
+#####################################################################
+
+# Golly, the capitalization of this function always makes me think it's a class
+def StructuredText(paragraphs, paragraph_delimiter=re.compile('\n\s*\n')):
+    """
+    StructuredText accepts paragraphs, which is a list of 
+    lines to be parsed. StructuredText creates a structure
+    which mimics the structure of the paragraphs.
+    Structure => [paragraph,[sub-paragraphs]]
+    """
+
+    currentlevel    = 0
+    currentindent  = 0
+    levels            = {0:0}
+    level             = 0        # which header are we under
+    struct            = []      # the structure to be returned
+    run                = struct
+    
+    paragraphs = filter(
+        strip,
+        paragraph_delimiter.split(expandtabs('\n\n'+paragraphs+'\n\n'))
+        )
+    
+    if not paragraphs: return []
+    
+    ind = []     # structure based on indention levels
+    for paragraph in paragraphs:
+        ind.append([indention(paragraph), paragraph])
+    
+    currentindent = indention(paragraphs[0])
+    levels[0]        = currentindent
+    
+    #############################################################
+    #                                  updated                  #
+    #############################################################
+    
+    for indent,paragraph in ind :
+        if indent == 0:
+            level          = level + 1
+            currentlevel   = 0
+            currentindent  = 0
+            levels         = {0:0}
+            struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+        elif indent > currentindent:
+            currentlevel            = currentlevel + 1
+            currentindent           = indent
+            levels[currentlevel]    = indent
+            run = insert(struct,level,currentlevel)
+            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+        elif indent < currentindent:
+            result   = findlevel(levels,indent)
+            if result > 0:
+                currentlevel = result
+            currentindent  = indent
+            run = insert(struct,level,currentlevel)
+            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+        else:
+            if insert(struct,level,currentlevel):
+                run = insert(struct,level,currentlevel)
+            else:
+                run = struct
+                currentindet = indent
+            run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+    
+    return StructuredTextDocument(struct)
+
+Basic = StructuredText
+
+class StructuredTextParagraph(STDOM.Element):
+
+    indent=0
+
+    def __init__(self, src, subs=None, **kw):
+        if subs is None: subs=[]
+        self._src=src
+        self._subs=list(subs)
+        
+        self._attributes=kw.keys()
+        for k, v in kw.items(): setattr(self, k, v)
+
+    def getChildren(self, type=type, lt=type([])):
+        src=self._src
+        if type(src) is not lt: src=[src]
+        return src+self._subs
+
+    def getAttribute(self, name):
+        return getattr(self, name, None)
+        
+    def getAttributeNode(self, name):
+        if hasattr(self, name):
+            return STDOM.Attr(name, getattr(self, name))
+
+    def getAttributes(self):
+        d={}
+        for a in self._attributes:
+            d[a]=getattr(self, a, '')
+        return STDOM.NamedNodeMap(d)
+
+    def getSubparagraphs(self):
+        return self._subs
+
+    def setSubparagraphs(self, subs):
+        self._subs=subs
+
+    def getColorizableTexts(self):
+        return (self._src,)
+
+    def setColorizableTexts(self, src):
+        self._src=src[0]
+
+    def __repr__(self):
+        r=[]; a=r.append
+        a((' '*(self.indent or 0))+
+          ('%s(' % self.__class__.__name__)
+          +str(self._src)+', ['
+          )
+        for p in self._subs: a(`p`)
+        a((' '*(self.indent or 0))+'])')
+        return join(r,'\n')
+
+    """
+    create aliases for all above functions in the pythony way.
+    """
+
+    def _get_Children(self, type=type, lt=type([])):
+        return self.getChildren(type,lt)
+        
+    def _get_Attribute(self, name):
+        return self.getAttribute(name)
+        
+    def _get_AttributeNode(self, name):
+        return self.getAttributeNode(name)
+
+    def _get_Attributes(self):
+        return self.getAttributes()
+
+    def _get_Subparagraphs(self):
+        return self.getSubparagraphs()
+
+    def _set_Subparagraphs(self, subs):
+        return self.setSubparagraphs(subs)
+
+    def _get_ColorizableTexts(self):
+        return self.getColorizableTexts()
+
+    def _set_ColorizableTexts(self, src):
+        return self.setColorizableTexts(src)
+
+class StructuredTextDocument(StructuredTextParagraph):
+    """
+    A StructuredTextDocument holds StructuredTextParagraphs
+    as its subparagraphs.
+    """
+    _attributes=()
+    
+    def __init__(self, subs=None, **kw):
+        apply(StructuredTextParagraph.__init__,
+                (self, '', subs),
+                kw)
+
+    def getChildren(self):
+        return self._subs
+        
+    def getColorizableTexts(self):
+        return ()
+        
+    def setColorizableTexts(self, src):
+        pass
+
+    def __repr__(self):
+        r=[]; a=r.append
+        a('%s([' % self.__class__.__name__)
+        for p in self._subs: a(`p`+',')
+        a('])')
+        return join(r,'\n')
+    
+    """
+    create aliases for all above functions in the pythony way.
+    """
+    
+    def _get_Children(self):
+        return self.getChildren()
+        
+    def _get_ColorizableTexts(self):
+        return self.getColorizableTexts()
+        
+    def _set_ColorizableTexts(self, src):
+        return self.setColorizableTexts(src)
diff --git a/wxPython/samples/stxview/StructuredText/STDOM.py b/wxPython/samples/stxview/StructuredText/STDOM.py
new file mode 100644
index 0000000000..1eb2d42731
--- /dev/null
+++ b/wxPython/samples/stxview/StructuredText/STDOM.py
@@ -0,0 +1,736 @@
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+"""
+DOM implementation in StructuredText : Read-Only methods
+
+All standard Zope objects support DOM to a limited extent.
+"""
+import string
+
+
+# Node type codes
+# ---------------
+
+ELEMENT_NODE                  = 1
+ATTRIBUTE_NODE                = 2
+TEXT_NODE                     = 3
+CDATA_SECTION_NODE            = 4
+ENTITY_REFERENCE_NODE         = 5
+ENTITY_NODE                   = 6
+PROCESSING_INSTRUCTION_NODE   = 7
+COMMENT_NODE                  = 8
+DOCUMENT_NODE                 = 9
+DOCUMENT_TYPE_NODE            = 10
+DOCUMENT_FRAGMENT_NODE        = 11
+NOTATION_NODE                 = 12
+
+# Exception codes
+# ---------------
+
+INDEX_SIZE_ERR                = 1
+DOMSTRING_SIZE_ERR            = 2
+HIERARCHY_REQUEST_ERR         = 3
+WRONG_DOCUMENT_ERR            = 4
+INVALID_CHARACTER_ERR         = 5
+NO_DATA_ALLOWED_ERR           = 6
+NO_MODIFICATION_ALLOWED_ERR   = 7
+NOT_FOUND_ERR                 = 8
+NOT_SUPPORTED_ERR             = 9
+INUSE_ATTRIBUTE_ERR           = 10
+
+# Exceptions
+# ----------
+
+class DOMException(Exception):
+    pass
+class IndexSizeException(DOMException):
+    code = INDEX_SIZE_ERR
+class DOMStringSizeException(DOMException):
+    code = DOMSTRING_SIZE_ERR
+class HierarchyRequestException(DOMException):
+    code = HIERARCHY_REQUEST_ERR
+class WrongDocumentException(DOMException):
+    code = WRONG_DOCUMENT_ERR
+class InvalidCharacterException(DOMException):
+    code = INVALID_CHARACTER_ERR
+class NoDataAllowedException(DOMException):
+    code = NO_DATA_ALLOWED_ERR
+class NoModificationAllowedException(DOMException):
+    code = NO_MODIFICATION_ALLOWED_ERR
+class NotFoundException(DOMException):
+    code = NOT_FOUND_ERR
+class NotSupportedException(DOMException):
+    code = NOT_SUPPORTED_ERR
+class InUseAttributeException(DOMException):
+    code = INUSE_ATTRIBUTE_ERR
+
+# Node classes
+# ------------
+
+class ParentNode:
+   """
+   A node that can have children, or, more precisely, that implements
+   the child access methods of the DOM.
+   """
+
+   def getChildNodes(self, type=type, st=type('')):
+      """
+      Returns a NodeList that contains all children of this node.
+      If there are no children, this is a empty NodeList
+      """
+      
+      r=[]
+      for n in self.getChildren():
+         if type(n) is st: n=TextNode(n)
+         r.append(n.__of__(self))
+      
+      return  NodeList(r)
+   
+   def getFirstChild(self, type=type, st=type('')):
+      """
+      The first child of this node. If there is no such node
+      this returns None
+      """
+      children = self.getChildren()
+
+      if not children:
+         return None
+         
+      n=chidren[0]
+
+      if type(n) is st:
+         n=TextNode(n)
+         
+      return n.__of__(self)
+
+   def getLastChild(self, type=type, st=type('')):
+      """
+      The last child of this node.  If there is no such node
+      this returns None.
+      """
+      children = self.getChildren()
+      if not children: return None
+      n=chidren[-1]
+      if type(n) is st: n=TextNode(n)
+      return n.__of__(self)
+
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_ChildNodes(self, type=type, st=type('')):
+      return self.getChildNodes(type,st)
+   
+   def _get_FirstChild(self, type=type, st=type('')):
+      return self.getFirstChild(type,st)
+
+   def _get_LastChild(self, type=type, st=type('')):
+      return self.getLastChild(type,st)
+  
+class NodeWrapper(ParentNode):
+   """
+   This is an acquisition-like wrapper that provides parent access for 
+   DOM sans circular references!
+   """
+
+   def __init__(self, aq_self, aq_parent):
+      self.aq_self=aq_self
+      self.aq_parent=aq_parent
+
+   def __getattr__(self, name):
+      return getattr(self.aq_self, name)
+    
+   def getParentNode(self):
+      """
+      The parent of this node.  All nodes except Document
+      DocumentFragment and Attr may have a parent
+      """
+      return self.aq_parent
+
+   def _getDOMIndex(self, children, getattr=getattr):
+      i=0
+      self=self.aq_self
+      for child in children:
+         if getattr(child, 'aq_self', child) is self:
+            self._DOMIndex=i
+            return i
+         i=i+1
+      return None
+
+   def getPreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+      
+      children = self.aq_parent.getChildren()
+      if not children:
+         return None
+
+      index=getattr(self, '_DOMIndex', None)
+      if index is None:
+         index=self._getDOMIndex(children)
+         if index is None: return None
+
+      index=index-1
+      if index < 0: return None
+      try: n=children[index]
+      except IndexError: return None
+      else:
+         if type(n) is st:
+            n=TextNode(n)
+         n._DOMIndex=index
+         return n.__of__(self)
+
+
+   def getNextSibling(self, type=type, st=type('')):
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+      children = self.aq_parent.getChildren()
+      if not children:
+         return None
+
+      index=getattr(self, '_DOMIndex', None)
+      if index is None:
+         index=self._getDOMIndex(children)
+         if index is None:
+            return None
+
+      index=index+1
+      try: n=children[index]
+      except IndexError:
+         return None
+      else:
+         if type(n) is st:
+            n=TextNode(n)
+         n._DOMIndex=index
+         return n.__of__(self)
+
+   def getOwnerDocument(self):
+      """
+      The Document object associated with this node, if any.
+      """
+      return self.aq_parent.getOwnerDocument()
+
+   """
+   create aliases for all above functions in the pythony way.   
+   """
+   
+   def _get_ParentNode(self):
+      return self.getParentNode()
+
+   def _get_DOMIndex(self, children, getattr=getattr):
+      return self._getDOMIndex(children,getattr)
+      
+   def _get_PreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+
+      return self.getPreviousSibling(type,st,getattr,None)
+      
+   def _get_NextSibling(self, type=type, st=type('')):
+      return self.getNextSibling(type,st)
+      
+   def _get_OwnerDocument(self):
+      return self.getOwnerDocument()
+      
+class Node(ParentNode):
+   """
+   Node Interface
+   """
+
+   # Get a DOM wrapper with a parent link
+   def __of__(self, parent):
+      return NodeWrapper(self, parent)
+
+   # DOM attributes    
+   # --------------
+    
+   def getNodeName(self):
+      """
+      The name of this node, depending on its type
+      """
+
+   def getNodeValue(self):
+      """
+      The value of this node, depending on its type
+      """
+      return None
+
+   def getParentNode(self):
+      """
+      The parent of this node.  All nodes except Document
+      DocumentFragment and Attr may have a parent
+      """
+
+   def getChildren(self):
+      """
+      Get a Python sequence of children
+      """
+      return ()
+
+   def getPreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+
+   def getNextSibling(self, type=type, st=type('')):
+      """
+      The node immediately preceding this node.  If
+      there is no such node, this returns None.
+      """
+
+   def getAttributes(self):
+      """
+      Returns a NamedNodeMap containing the attributes
+      of this node (if it is an element) or None otherwise.
+      """
+      return None
+
+   def getOwnerDocument(self):
+      """
+      The Document object associated with this node, if any.
+      """
+        
+    # DOM Methods    
+    # -----------
+    
+   def hasChildNodes(self):
+      """
+      Returns true if the node has any children, false
+      if it doesn't.
+      """
+      return len(self.getChildren())
+
+   """
+   create aliases for all above functions in the pythony way.
+   """
+
+   def _get_NodeName(self):
+      return self.getNodeName()
+      
+   def _get_NodeValue(self):
+      return self.getNodeValue()
+      
+   def _get_ParentNode(self):
+      return self.getParentNode()
+
+   def _get_Children(self):
+      return self.getChildren()
+
+   def _get_PreviousSibling(self,
+                          type=type,
+                          st=type(''),
+                          getattr=getattr,
+                          None=None):
+      
+      return self.getPreviousSibling(type,st,getattr,None)
+      
+   def _get_NextSibling(self, type=type, st=type('')):
+      return self.getNextSibling()
+
+   def _get_Attributes(self):
+      return self.getAttributes()
+
+   def _get_OwnerDocument(self):
+      return self.getOwnerDocument()
+    
+   def _has_ChildNodes(self):
+      return self.hasChildNodes()
+      
+         
+class TextNode(Node):
+
+   def __init__(self, str): self._value=str
+      
+   def getNodeType(self):
+      return TEXT_NODE
+      
+   def getNodeName(self):
+      return '#text'
+
+   def getNodeValue(self):
+      return self._value
+   
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_NodeType(self):
+      return self.getNodeType()
+      
+   def _get_NodeName(self):
+      return self.getNodeName()
+
+   def _get_NodeValue(self):
+      return self.getNodeValue()
+
+class Element(Node):
+   """
+   Element interface
+   """
+    
+   # Element Attributes
+   # ------------------
+    
+   def getTagName(self):
+      """The name of the element"""
+      return self.__class__.__name__
+    
+   def getNodeName(self):
+      """The name of this node, depending on its type"""
+      return self.__class__.__name__
+      
+   def getNodeType(self):
+      """A code representing the type of the node."""
+      return ELEMENT_NODE
+
+   def getNodeValue(self, type=type, st=type('')):
+      r=[]
+      for c in self.getChildren():
+         if type(c) is not st:
+            c=c.getNodeValue()
+         r.append(c)
+      return string.join(r,'')
+    
+   def getParentNode(self):
+      """
+      The parent of this node.  All nodes except Document
+      DocumentFragment and Attr may have a parent
+      """
+      
+   # Element Methods
+   # ---------------
+    
+   _attributes=()
+
+   def getAttribute(self, name): return getattr(self, name, None)
+   def getAttributeNode(self, name):
+      if hasattr(self, name):
+         return Attr(name, getattr(self, name))
+
+   def getAttributes(self):
+      d={}
+      for a in self._attributes:
+         d[a]=getattr(self, a, '')
+      return NamedNodeMap(d)
+
+   def getAttribute(self, name):
+      """Retrieves an attribute value by name."""
+      return None
+
+   def getAttributeNode(self, name):
+      """ Retrieves an Attr node by name or None if
+      there is no such attribute. """
+      return None
+
+   def getElementsByTagName(self, tagname):
+      """
+      Returns a NodeList of all the Elements with a given tag
+      name in the order in which they would be encountered in a
+      preorder traversal of the Document tree.  Parameter: tagname
+      The name of the tag to match (* = all tags). Return Value: A new
+      NodeList object containing all the matched Elements.
+      """
+      nodeList = []
+      for child in self.getChildren():
+         if (child.getNodeType()==ELEMENT_NODE and \
+             child.getTagName()==tagname or tagname== '*'):
+                
+            nodeList.append(child)
+               
+         if hasattr(child, 'getElementsByTagName'):
+            n1       = child.getElementsByTagName(tagname)
+            nodeList = nodeList + n1._data
+      return NodeList(nodeList)
+   
+   """
+   create aliases for all above functions in the pythony way.
+   """
+
+   def _get_TagName(self):
+      return self.getTagName()
+      
+   def _get_NodeName(self):
+      return self.getNodeName()
+      
+   def _get_NodeType(self):
+      return self.getNodeType()
+      
+   def _get_NodeValue(self, type=type, st=type('')):
+      return self.GetNodeValue(type,st)
+      
+   def _get_ParentNode(self):
+      return self.getParentNode()
+      
+   def _get_Attribute(self, name):
+      return self.getAttribute(name)
+   
+   def _get_AttributeNode(self, name):
+      return self.getAttributeNode(name)
+      
+   def _get_Attributes(self):
+      return self.getAttributes()
+      
+   def _get_Attribute(self, name):
+      return self.getAttribute(name)
+      
+   def _get_AttributeNode(self, name):
+      return self.getAttributeNode(name)
+      
+   def _get_ElementsByTagName(self, tagname):
+      return self.getElementsByTagName(tagname)
+      
+         
+class NodeList:
+   """
+   NodeList interface - Provides the abstraction of an ordered
+   collection of nodes.
+    
+   Python extensions: can use sequence-style 'len', 'getitem', and
+   'for..in' constructs.
+   """
+    
+   def __init__(self,list=None):
+      self._data = list or []
+    
+   def __getitem__(self, index, type=type, st=type('')):
+      return self._data[index]
+
+   def __getslice__(self, i, j):
+      return self._data[i:j]
+    
+   def item(self, index):
+      """
+      Returns the index-th item in the collection
+      """
+      try:  return self._data[index]    
+      except IndexError: return None
+         
+   def getLength(self):
+      """
+      The length of the NodeList
+      """
+      return len(self._data)
+    
+   __len__=getLength
+   
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_Length(self):
+      return self.getLength()
+ 
+class NamedNodeMap:
+   """
+   NamedNodeMap interface - Is used to represent collections
+   of nodes that can be accessed by name.  NamedNodeMaps are not
+   maintained in any particular order.
+    
+   Python extensions: can use sequence-style 'len', 'getitem', and
+   'for..in' constructs, and mapping-style 'getitem'.
+   """
+    
+   def __init__(self, data=None):
+      if data is None:
+         data = {}
+      self._data = data
+
+   def item(self, index):
+      """
+      Returns the index-th item in the map
+      """
+      try: return self._data.values()[index]
+      except IndexError: return None
+        
+   def __getitem__(self, key):
+      if type(key)==type(1):
+         return self._data.values()[key]
+      else:
+         return self._data[key]
+            
+   def getLength(self):
+      """
+      The length of the NodeList
+      """
+      return len(self._data)
+    
+   __len__ = getLength
+    
+   def getNamedItem(self, name):
+      """
+      Retrieves a node specified by name. Parameters:
+      name Name of a node to retrieve. Return Value A Node (of any
+      type) with the specified name, or None if the specified name
+      did not identify any node in the map.
+      """
+      if self._data.has_key(name): 
+         return self._data[name]
+      return None
+
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   def _get_Length(self):
+      return self.getLength()
+      
+   def _get_NamedItem(self, name):
+      return self.getNamedItem(name)
+      
+class Attr(Node):
+   """
+   Attr interface - The Attr interface represents an attriubte in an
+   Element object. Attr objects inherit the Node Interface
+   """
+
+   def __init__(self, name, value, specified=1):
+      self.name = name
+      self.value = value
+      self.specified = specified
+        
+   def getNodeName(self):
+      """
+      The name of this node, depending on its type
+      """
+      return self.name
+
+   def getName(self):
+      """
+      Returns the name of this attribute.
+      """
+      return self.name
+    
+   def getNodeValue(self):
+      """
+      The value of this node, depending on its type
+      """
+      return self.value
+
+   def getNodeType(self):
+      """
+      A code representing the type of the node.
+      """
+      return ATTRIBUTE_NODE
+
+   def getSpecified(self):
+      """
+      If this attribute was explicitly given a value in the
+      original document, this is true; otherwise, it is false.
+      """
+      return self.specified
+        
+   """
+   create aliases for all above functions in the pythony way.
+   """
+   
+   def _get_NodeName(self):
+      return self.getNodeName()
+
+   def _get_Name(self):
+      return self.getName()
+    
+   def _get_NodeValue(self):
+      return self.getNodeValue()
+
+   def _get_NodeType(self):
+      return self.getNodeType()
+
+   def _get_Specified(self):
+      return self.getSpecified()
diff --git a/wxPython/samples/stxview/StructuredText/STNG.txt b/wxPython/samples/stxview/StructuredText/STNG.txt
new file mode 100644
index 0000000000..40af179bd1
--- /dev/null
+++ b/wxPython/samples/stxview/StructuredText/STNG.txt
@@ -0,0 +1,116 @@
+Using Structured Text
+
+  The goal of StructuredText is to make it possible to express
+  structured text using a relatively simple plain text format. Simple
+  structures, like bullets or headings are indicated through
+  conventions that are natural, for some definition of
+  "natural". Hierarchical structures are indicated through
+  indentation. The use of indentation to express hierarchical
+  structure is inspired by the Python programming language.
+
+  Use of StructuredText consists of one to three logical steps. In the
+  first step, a text string is converted to a network of objects using
+  the 'StructuredText.Basic' facility, as in the following
+  example::
+
+    raw=open("mydocument.txt").read()
+    import StructuredText
+    st=StructuredText.Basic(raw)
+
+  The output of 'StructuredText.Basic' is simply a
+  StructuredTextDocumemt object containing StructuredTextParagraph
+  objects arranged in a hierarchy. Paragraphs are delimited by strings
+  of two or more whitespace characters beginning and ending with
+  newline characters. Hierarchy is indicated by indentation. The
+  indentation of a paragraph is the minimum number of leading spaces
+  in a line containing non-white-space characters after converting tab
+  characters to spaces (assuming a tab stop every eight characters).
+
+  StructuredTextNode objects support the read-only subset of the
+  Document Object Model (DOM) API. It should be possible to process
+  'StructuredTextNode' hierarchies using XML tools such as XSLT.
+
+  The second step in using StructuredText is to apply additional
+  structuring rules based on text content. A variety of differentText
+  rules can be used. Typically, these are used to implement a
+  structured text language for producing documents, but any sort of
+  structured text language could be implemented in the second
+  step. For example, it is possible to use StructuredText to implement
+  structured text formats for representing structured data. The second
+  step, which could consist of multiple processing steps, is
+  performed by processing, or "coloring", the hierarchy of generic
+  StructuredTextParagraph objects into a network of more specialized
+  objects. Typically, the objects produced should also implement the DOM
+  API to allow processing with XML tools.
+
+  A document processor is provided to convert a StructuredTextDocument
+  object containing only StructuredStructuredTextParagraph objects
+  into a StructuredTextDocument object containing a richer collection
+  of objects such as bullets, headings, emphasis, and so on using
+  hints in the text. Hints are selected based on conventions of the
+  sort typically seen in electronic mail or news-group postings. It
+  should be noted, however, that these conventions are somewhat
+  culturally dependent, fortunately, the document processor is easily
+  customized to implement alternative rules. Here's an example of
+  using the DOC processor to convert the output of the previous example::
+
+    doc=StructuredText.Document(st)
+
+  The final step is to process the colored networks produced from the
+  second step to produce additional outputs. The final step could be
+  performed by Python programs, or by XML tools. A Python outputter is
+  provided for the document processor output that produces Hypertext Markup
+  Language (HTML) text::
+
+    html=StructuredText.HTML(doc)
+
+Customizing the document processor
+
+  The document processor is driven by two tables. The first table,
+  named 'paragraph_types', is a sequence of callable objects or method
+  names for coloring paragraphs. If a table entry is a string, then it
+  is the name of a method of the document processor to be used. For
+  each input paragraph, the objects in the table are called until one
+  returns a value (not 'None'). The value returned replaces the
+  original input paragraph in the output. If none of the objects in
+  the paragraph types table return a value, then a copy of the
+  original paragraph is used.  The new object returned by calling a
+  paragraph type should implement the ReadOnlyDOM,
+  StructuredTextColorizable, and StructuredTextSubparagraphContainer
+  interfaces. See the 'Document.py' source file for examples.
+
+  A paragraph type may return a list or tuple of replacement
+  paragraphs, this allowing a paragraph to be split into multiple
+  paragraphs. 
+
+  The second table, 'text_types', is a sequence of callable objects or
+  method names for coloring text. The callable objects in this table
+  are used in sequence to transform the input text into new text or
+  objects.  The callable objects are passed a string and return
+  nothing ('None') or a three-element tuple consisting of:
+
+    - a replacement object,
+
+    - a starting position, and
+
+    - an ending position
+
+  The text from the starting position is (logically) replaced with the
+  replacement object. The replacement object is typically an object
+  that implements that implements the ReadOnlyDOM, and
+  StructuredTextColorizable interfaces. The replacement object can
+  also be a string or a list of strings or objects. Replacement is
+  done from beginning to end and text after the replacement ending
+  position will be passed to the character type objects for processing.
+
+Example: adding wiki links
+
+  We want to add support for Wiki links. A Wiki link is a string of
+  text containing mixed-case letters, such that at least two of the
+  letters are upper case and such that the first letter is upper case.
+
+  
+
+     
+
+     
diff --git a/wxPython/samples/stxview/StructuredText/StructuredText.py b/wxPython/samples/stxview/StructuredText/StructuredText.py
new file mode 100644
index 0000000000..a1b3fd03ad
--- /dev/null
+++ b/wxPython/samples/stxview/StructuredText/StructuredText.py
@@ -0,0 +1,833 @@
+#! /usr/bin/env python -- # -*- python -*-
+##############################################################################
+# 
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+# 
+# Copyright (c) Digital Creations.  All rights reserved.
+# 
+# This license has been certified as Open Source(tm).
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+# 1. Redistributions in source code must retain the above copyright
+#    notice, this list of conditions, and the following disclaimer.
+# 
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions, and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+# 
+# 3. Digital Creations requests that attribution be given to Zope
+#    in any manner possible. Zope includes a "Powered by Zope"
+#    button that is installed by default. While it is not a license
+#    violation to remove this button, it is requested that the
+#    attribution remain. A significant investment has been put
+#    into Zope, and this effort will continue if the Zope community
+#    continues to grow. This is one way to assure that growth.
+# 
+# 4. All advertising materials and documentation mentioning
+#    features derived from or use of this software must display
+#    the following acknowledgement:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    In the event that the product being advertised includes an
+#    intact Zope distribution (with copyright and license included)
+#    then this clause is waived.
+# 
+# 5. Names associated with Zope or Digital Creations must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission from Digital Creations.
+# 
+# 6. Modified redistributions of any form whatsoever must retain
+#    the following acknowledgment:
+# 
+#      "This product includes software developed by Digital Creations
+#      for use in the Z Object Publishing Environment
+#      (http://www.zope.org/)."
+# 
+#    Intact (re-)distributions of any official Zope release do not
+#    require an external acknowledgement.
+# 
+# 7. Modifications are encouraged but must be packaged separately as
+#    patches to official Zope releases.  Distributions that do not
+#    clearly separate the patches from the original work must be clearly
+#    labeled as unofficial distributions.  Modifications which do not
+#    carry the name Zope may be packaged in any form, as long as they
+#    conform to all of the clauses above.
+# 
+# 
+# Disclaimer
+# 
+#   THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+#   EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+#   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+#   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+#   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+#   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+#   OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+#   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#   SUCH DAMAGE.
+# 
+# 
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations.  Specific
+# attributions are listed in the accompanying credits file.
+# 
+##############################################################################
+'''Structured Text Manipulation
+
+Parse a structured text string into a form that can be used with 
+structured formats, like html.
+
+Structured text is text that uses indentation and simple
+symbology to indicate the structure of a document.  
+
+A structured string consists of a sequence of paragraphs separated by
+one or more blank lines.  Each paragraph has a level which is defined
+as the minimum indentation of the paragraph.  A paragraph is a
+sub-paragraph of another paragraph if the other paragraph is the last
+preceding paragraph that has a lower level.
+
+Special symbology is used to indicate special constructs:
+
+- A single-line paragraph whose immediately succeeding paragraphs are lower
+  level is treated as a header.
+
+- A paragraph that begins with a '-', '*', or 'o' is treated as an
+  unordered list (bullet) element.
+
+- A paragraph that begins with a sequence of digits followed by a
+  white-space character is treated as an ordered list element.
+
+- A paragraph that begins with a sequence of sequences, where each
+  sequence is a sequence of digits or a sequence of letters followed
+  by a period, is treated as an ordered list element.
+
+- A paragraph with a first line that contains some text, followed by
+  some white-space and '--' is treated as
+  a descriptive list element. The leading text is treated as the
+  element title.
+
+- Sub-paragraphs of a paragraph that ends in the word 'example' or the
+  word 'examples', or '::' is treated as example code and is output as is.
+
+- Text enclosed single quotes (with white-space to the left of the
+  first quote and whitespace or puctuation to the right of the second quote)
+  is treated as example code.
+
+- Text surrounded by '*' characters (with white-space to the left of the
+  first '*' and whitespace or puctuation to the right of the second '*')
+  is emphasized.
+
+- Text surrounded by '**' characters (with white-space to the left of the
+  first '**' and whitespace or puctuation to the right of the second '**')
+  is made strong.
+
+- Text surrounded by '_' underscore characters (with whitespace to the left 
+  and whitespace or punctuation to the right) is made underlined.
+
+- Text encloded by double quotes followed by a colon, a URL, and concluded
+  by punctuation plus white space, *or* just white space, is treated as a
+  hyper link. For example:
+
+    "Zope":http://www.zope.org/ is ...
+
+  Is interpreted as 'Zope is ....'
+  Note: This works for relative as well as absolute URLs.
+
+- Text enclosed by double quotes followed by a comma, one or more spaces,
+  an absolute URL and concluded by punctuation plus white space, or just
+  white space, is treated as a hyper link. For example: 
+
+    "mail me", mailto:amos@digicool.com.
+
+  Is interpreted as 'mail me.' 
+
+- Text enclosed in brackets which consists only of letters, digits,
+  underscores and dashes is treated as hyper links within the document.
+  For example:
+    
+    As demonstrated by Smith [12] this technique is quite effective.
+
+  Is interpreted as '... by Smith [12] this ...'. Together
+  with the next rule this allows easy coding of references or end notes.
+
+- Text enclosed in brackets which is preceded by the start of a line, two
+  periods and a space is treated as a named link. For example:
+
+    .. [12] "Effective Techniques" Smith, Joe ... 
+
+  Is interpreted as '[12] "Effective Techniques" ...'.
+  Together with the previous rule this allows easy coding of references or
+  end notes. 
+
+
+- A paragraph that has blocks of text enclosed in '||' is treated as a
+  table. The text blocks correspond to table cells and table rows are
+  denoted by newlines. By default the cells are center aligned. A cell
+  can span more than one column by preceding a block of text with an
+  equivalent number of cell separators '||'. Newlines and '|' cannot
+  be a part of the cell text. For example:
+
+      |||| **Ingredients** ||
+      || *Name* || *Amount* ||
+      ||Spam||10||
+      ||Eggs||3||
+
+  is interpreted as::
+
+    
+     
+      
+     
+     
+      
+      
+     
+     
+      
+      
+     
+     
+      
+      
+     
+    
Ingredients
Name Amount
Spam10
Eggs3
+ + +$Id$''' +# Copyright +# +# Copyright 1996 Digital Creations, L.C., 910 Princess Anne +# Street, Suite 300, Fredericksburg, Virginia 22401 U.S.A. All +# rights reserved. Copyright in this software is owned by DCLC, +# unless otherwise indicated. Permission to use, copy and +# distribute this software is hereby granted, provided that the +# above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear. Note that +# any product, process or technology described in this software +# may be the subject of other Intellectual Property rights +# reserved by Digital Creations, L.C. and are not licensed +# hereunder. +# +# Trademarks +# +# Digital Creations & DCLC, are trademarks of Digital Creations, L.C.. +# All other trademarks are owned by their respective companies. +# +# No Warranty +# +# The software is provided "as is" without warranty of any kind, +# either express or implied, including, but not limited to, the +# implied warranties of merchantability, fitness for a particular +# purpose, or non-infringement. This software could include +# technical inaccuracies or typographical errors. Changes are +# periodically made to the software; these changes will be +# incorporated in new editions of the software. DCLC may make +# improvements and/or changes in this software at any time +# without notice. +# +# Limitation Of Liability +# +# In no event will DCLC be liable for direct, indirect, special, +# incidental, economic, cover, or consequential damages arising +# out of the use of or inability to use this software even if +# advised of the possibility of such damages. Some states do not +# allow the exclusion or limitation of implied warranties or +# limitation of liability for incidental or consequential +# damages, so the above limitation or exclusion may not apply to +# you. +# +# +# If you have questions regarding this software, +# contact: +# +# Jim Fulton, jim@digicool.com +# +# (540) 371-6909 +# +# $Log$ +# Revision 1.1 2001/03/10 05:07:20 RD +# Added some simple sample apps +# +# Revision 1.27 2000/04/21 13:38:10 jim +# Added closing list tags. Woo hoo! +# +# Revision 1.26 2000/03/14 17:22:04 brian +# Allow ~ in hrefs. +# +# Revision 1.25 2000/02/17 00:53:24 klm +# HTML._str(): We were getting preformatted examples rendered twice, +# second time without preformatting. Problem was a missing 'continue' +# in one of the cases. +# +# Revision 1.24 1999/12/13 16:32:48 klm +# Incorporated pavlos christoforou's mods to handle simple tables. From +# his web page at http://www.zope.org/Members/gaaros/StructuredText: +# +# Structured Text module with table support +# +# A paragraph that has blocks of text enclosed in '||' is treated as a +# table. The text blocks correspond to table cells and table rows are +# denoted by newlines. By default the cells are center aligned. You can +# change the defaults by modifying the CELL,ROW and TABLE class +# attributes in class Table. A cell can span more than one column by +# preceding a block of text with an equivalent number of cell separators +# '||'. Newlines and '|' cannot be a part of the cell text. If you need +# newlines use
. For example: +# +# |||| **Ingredients** || +# || *Name* || *Amount* || +# ||Spam||10|| +# ||Eggs||3|| +# +# Revision 1.23 1999/08/03 20:49:05 jim +# Fixed to allow list elements to introduce examples. +# +# Restructured _str using continue to avoid excessive nesting. +# +# Revision 1.22 1999/08/02 22:01:28 jim +# Fixed a bunch of bugs introduced by making ts_regex actually thread +# safe. +# +# Also localized a bunch of regular expressions +# using "static" variables (aka always default arguments). +# +# Revision 1.21 1999/08/02 13:26:52 jim +# paragraph_divider needs to be a regular (thread-unsafe) regex +# since it gets passed to ts_regex.split, which is thread-safe +# and wants to use regs. +# +# Revision 1.20 1999/07/21 13:33:59 jim +# untabified. +# +# Revision 1.19 1999/07/15 16:43:15 jim +# Checked in Scott Robertson's thread-safety fixes. +# +# Revision 1.18 1999/03/24 00:03:18 klm +# Provide for relative links, eg whatever, +# as: +# +# "whatever", :file_in_same_dir +# +# or +# +# "whatever"::file_in_same_dir +# +# .__init__(): relax the second gsub, using a '*' instead of a '+', so +# the stuff before the ':' can be missing, and also do postprocessing so +# any resulting ''s have the superfluous ':' +# removed. *Seems* good! +# +# Revision 1.17 1999/03/12 23:21:39 klm +# Gratuituous checkin to test my cvs *update* logging hook. +# +# Revision 1.16 1999/03/12 17:12:12 klm +# Added support for underlined elements, in the obvious way (and +# included an entry in the module docstring for it). +# +# Added an entry in the module docstring describing what i *guess* is +# the criterion for identifying header elements. (I'm going to have to +# delve into and understand the framework a bit better before *knowing* +# this is the case.) +# +# Revision 1.15 1999/03/11 22:40:18 klm +# Handle links that include '#' named links. +# +# Revision 1.14 1999/03/11 01:35:19 klm +# Fixed a small typo, and refined the module docstring link example, in +# order to do a checkin to exercise the CVS repository mirroring. Might +# as well include my last checkin message, with some substantial stuff: +# +# Links are now recognized whether or not the candidate strings are +# terminated with punctuation before the trailing whitespace. The old +# form - trailing punctuation then whitespace - is preserved, but the +# punctuation is now unnecessary. +# +# The regular expressions are a bit more complicated, but i've factored +# out the common parts and but them in variables with suggestive names, +# which may make them easier to understand. +# +# Revision 1.13 1999/03/11 00:49:57 klm +# Links are now recognized whether or not the candidate strings are +# terminated with punctuation before the trailing whitespace. The old +# form - trailing punctuation then whitespace - is preserved, but the +# punctuation is now unnecessary. +# +# The regular expressions are a bit more complicated, but i've factored +# out the common parts and but them in variables with suggestive names, +# which may make them easier to understand. +# +# Revision 1.12 1999/03/10 00:15:46 klm +# Committing with version 1.0 of the license. +# +# Revision 1.11 1999/02/08 18:13:12 klm +# Trival checkin (spelling fix "preceedeing" -> "preceding" and similar) +# to see what pitfalls my environment presents to accomplishing a +# successful checkin. (It turns out that i can't do it from aldous because +# the new version of cvs doesn't support the '-t' and '-f' options in the +# cvswrappers file...) +# +# Revision 1.10 1998/12/29 22:30:43 amos +# Improved doc string to describe hyper link and references capabilities. +# +# Revision 1.9 1998/12/04 20:15:31 jim +# Detabification and new copyright. +# +# Revision 1.8 1998/02/27 18:45:22 jim +# Various updates, including new indentation utilities. +# +# Revision 1.7 1997/12/12 15:39:54 jim +# Added level as argument for html_with_references. +# +# Revision 1.6 1997/12/12 15:27:25 jim +# Added additional pattern matching for HTML references. +# +# Revision 1.5 1997/03/08 16:01:03 jim +# Moved code to recognize: "foo bar", url. +# into object initializer, so it gets applied in all cases. +# +# Revision 1.4 1997/02/17 23:36:35 jim +# Added support for "foo title", http:/foohost/foo +# +# Revision 1.3 1996/12/06 15:57:37 jim +# Fixed bugs in character tags. +# +# Added -t command-line option to generate title if: +# +# - The first paragraph is one line (i.e. a heading) and +# +# - All other paragraphs are indented. +# +# Revision 1.2 1996/10/28 13:56:02 jim +# Fixed bug in ordered lists. +# Added option for either HTML-style headings or descriptive-list style +# headings. +# +# Revision 1.1 1996/10/23 14:00:45 jim +# *** empty log message *** +# +# +# + +import ts_regex, regex +from ts_regex import gsub +from string import split, join, strip, find + +def untabify(aString, + indent_tab=ts_regex.compile('\(\n\|^\)\( *\)\t').search_group, + ): + '''\ + Convert indentation tabs to spaces. + ''' + result='' + rest=aString + while 1: + ts_results = indent_tab(rest, (1,2)) + if ts_results: + start, grps = ts_results + lnl=len(grps[0]) + indent=len(grps[1]) + result=result+rest[:start] + rest="\n%s%s" % (' ' * ((indent/8+1)*8), + rest[start+indent+1+lnl:]) + else: + return result+rest + +def indent(aString, indent=2): + """Indent a string the given number of spaces""" + r=split(untabify(aString),'\n') + if not r: return '' + if not r[-1]: del r[-1] + tab=' '*level + return "%s%s\n" % (tab,join(r,'\n'+tab)) + +def reindent(aString, indent=2, already_untabified=0): + "reindent a block of text, so that the minimum indent is as given" + + if not already_untabified: aString=untabify(aString) + + l=indent_level(aString)[0] + if indent==l: return aString + + r=[] + + append=r.append + + if indent > l: + tab=' ' * (indent-l) + for s in split(aString,'\n'): append(tab+s) + else: + l=l-indent + for s in split(aString,'\n'): append(s[l:]) + + return join(r,'\n') + +def indent_level(aString, + indent_space=ts_regex.compile('\n\( *\)').search_group, + ): + '''\ + Find the minimum indentation for a string, not counting blank lines. + ''' + start=0 + text='\n'+aString + indent=l=len(text) + while 1: + + ts_results = indent_space(text, (1,2), start) + if ts_results: + start, grps = ts_results + i=len(grps[0]) + start=start+i+1 + if start < l and text[start] != '\n': # Skip blank lines + if not i: return (0,aString) + if i < indent: indent = i + else: + return (indent,aString) + +def paragraphs(list,start): + l=len(list) + level=list[start][0] + i=start+1 + while i < l and list[i][0] > level: i=i+1 + return i-1-start + +def structure(list): + if not list: return [] + i=0 + l=len(list) + r=[] + while i < l: + sublen=paragraphs(list,i) + i=i+1 + r.append((list[i-1][1],structure(list[i:i+sublen]))) + i=i+sublen + return r + + +class Table: + CELL=' %s\n' + ROW=' \n%s \n' + TABLE='\n\n%s
' + + def create(self,aPar,td=ts_regex.compile( + '[ \t\n]*||\([^\0|]*\)').match_group): + '''parses a table and returns nested list representing the + table''' + self.table=[] + text=filter(None,split(aPar,'\n')) + for line in text: + row=[] + while 1: + pos=td(line,(1,)) + if not pos:return 0 + row.append(pos[1]) + if pos[0]==len(line):break + line=line[pos[0]:] + self.table.append(row) + return 1 + + def html(self): + '''Creates an HTML representation of table''' + htmltable=[] + for row in self.table: + htmlrow=[] + colspan=1 + for cell in row: + if cell=='': + colspan=colspan+1 + continue + else: + htmlrow.append(self.CELL%(colspan,cell)) + colspan=1 + htmltable.append(self.ROW%join(htmlrow,'')) + return self.TABLE%join(htmltable,'') + +optional_trailing_punctuation = '\(,\|\([.:?;]\)\)?' +trailing_space = '\([\0- ]\)' +not_punctuation_or_whitespace = "[^-,.?:\0- ]" +table=Table() + +class StructuredText: + + """Model text as structured collection of paragraphs. + + Structure is implied by the indentation level. + + This class is intended as a base classes that do actual text + output formatting. + """ + + def __init__(self, aStructuredString, level=0, + paragraph_divider=regex.compile('\(\n *\)+\n'), + ): + '''Convert a structured text string into a structured text object. + + Aguments: + + aStructuredString -- The string to be parsed. + level -- The level of top level headings to be created. + ''' + + aStructuredString = gsub( + '\"\([^\"\0]+\)\":' # title: <"text":> + + ('\([-:a-zA-Z0-9_,./?=@#~]+%s\)' + % not_punctuation_or_whitespace) + + optional_trailing_punctuation + + trailing_space, + '
\\1\\4\\5\\6', + aStructuredString) + + aStructuredString = gsub( + '\"\([^\"\0]+\)\",[\0- ]+' # title: <"text", > + + ('\([a-zA-Z]*:[-:a-zA-Z0-9_,./?=@#~]*%s\)' + % not_punctuation_or_whitespace) + + optional_trailing_punctuation + + trailing_space, + '\\1\\4\\5\\6', + aStructuredString) + + protoless = find(aStructuredString, '\\2\\3',s) + s=gsub(under, '\\1\\2\\3',s) + s=gsub(code, '\\1\\2\\3',s) + s=gsub(em, '\\1\\2\\3',s) + return s + +class HTML(StructuredText): + + '''\ + An HTML structured text formatter. + '''\ + + def __str__(self, + extra_dl=regex.compile("\n
"), + extra_ul=regex.compile("\n
    "), + extra_ol=regex.compile("\n
      "), + ): + '''\ + Return an HTML string representation of the structured text data. + + ''' + s=self._str(self.structure,self.level) + s=gsub(extra_dl,'\n',s) + s=gsub(extra_ul,'\n',s) + s=gsub(extra_ol,'\n',s) + return s + + def ul(self, before, p, after): + if p: p="

      %s

      " % strip(ctag(p)) + return ('%s
      • %s\n%s\n
      \n' + % (before,p,after)) + + def ol(self, before, p, after): + if p: p="

      %s

      " % strip(ctag(p)) + return ('%s
      1. %s\n%s\n
      \n' + % (before,p,after)) + + def dl(self, before, t, d, after): + return ('%s
      %s

      %s

      \n%s\n
      \n' + % (before,ctag(t),ctag(d),after)) + + def head(self, before, t, level, d): + if level > 0 and level < 6: + return ('%s%s\n%s\n' + % (before,level,strip(ctag(t)),level,d)) + + t="

      %s

      " % strip(ctag(t)) + return ('%s

      %s\n
      %s\n
      \n' + % (before,t,d)) + + def normal(self,before,p,after): + return '%s

      %s

      \n%s\n' % (before,ctag(p),after) + + def pre(self,structure,tagged=0): + if not structure: return '' + if tagged: + r='' + else: + r='
      \n'
      +        for s in structure:
      +            r="%s%s\n\n%s" % (r,html_quote(s[0]),self.pre(s[1],1))
      +        if not tagged: r=r+'
      \n' + return r + + def table(self,before,table,after): + return '%s

      %s

      \n%s\n' % (before,ctag(table),after) + + def _str(self,structure,level, + # Static + bullet=ts_regex.compile('[ \t\n]*[o*-][ \t\n]+\([^\0]*\)' + ).match_group, + example=ts_regex.compile('[\0- ]examples?:[\0- ]*$' + ).search, + dl=ts_regex.compile('\([^\n]+\)[ \t]+--[ \t\n]+\([^\0]*\)' + ).match_group, + nl=ts_regex.compile('\n').search, + ol=ts_regex.compile( + '[ \t]*\(\([0-9]+\|[a-zA-Z]+\)[.)]\)+[ \t\n]+\([^\0]*\|$\)' + ).match_group, + olp=ts_regex.compile('[ \t]*([0-9]+)[ \t\n]+\([^\0]*\|$\)' + ).match_group, + ): + r='' + for s in structure: + + ts_results = bullet(s[0], (1,)) + if ts_results: + p = ts_results[1] + if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1]) + else: ps=self._str(s[1],level) + r=self.ul(r,p,ps) + continue + ts_results = ol(s[0], (3,)) + if ts_results: + p = ts_results[1] + if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1]) + else: ps=self._str(s[1],level) + r=self.ol(r,p,ps) + continue + ts_results = olp(s[0], (1,)) + if ts_results: + p = ts_results[1] + if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1]) + else: ps=self._str(s[1],level) + r=self.ol(r,p,ps) + continue + ts_results = dl(s[0], (1,2)) + if ts_results: + t,d = ts_results[1] + r=self.dl(r,t,d,self._str(s[1],level)) + continue + if example(s[0]) >= 0 and s[1]: + # Introduce an example, using pre tags: + r=self.normal(r,s[0],self.pre(s[1])) + continue + if s[0][-2:]=='::' and s[1]: + # Introduce an example, using pre tags: + r=self.normal(r,s[0][:-1],self.pre(s[1])) + continue + if table.create(s[0]): + ## table support. + r=self.table(r,table.html(),self._str(s[1],level)) + continue + else: + + if nl(s[0]) < 0 and s[1] and s[0][-1:] != ':': + # Treat as a heading + t=s[0] + r=self.head(r,t,level, + self._str(s[1],level and level+1)) + else: + r=self.normal(r,s[0],self._str(s[1],level)) + return r + + +def html_quote(v, + character_entities=( + (regex.compile('&'), '&'), + (regex.compile("<"), '<' ), + (regex.compile(">"), '>' ), + (regex.compile('"'), '"') + )): #" + text=str(v) + for re,name in character_entities: + text=gsub(re,name,text) + return text + +def html_with_references(text, level=1): + text = gsub( + '[\0\n].. \[\([-_0-9_a-zA-Z-]+\)\]', + '\n
      [\\1]', + text) + + text = gsub( + '\([\0- ,]\)\[\([0-9_a-zA-Z-]+\)\]\([\0- ,.:]\)', + '\\1[\\2]\\3', + text) + + text = gsub( + '\([\0- ,]\)\[\([^]]+\)\.html\]\([\0- ,.:]\)', + '\\1[\\2]\\3', + text) + + return HTML(text,level=level) + + +def main(): + import sys, getopt + + opts,args=getopt.getopt(sys.argv[1:],'tw') + + if args: + [infile]=args + s=open(infile,'r').read() + else: + s=sys.stdin.read() + + if opts: + + if filter(lambda o: o[0]=='-w', opts): + print 'Content-Type: text/html\n' + + if s[:2]=='#!': + s=ts_regex.sub('^#![^\n]+','',s) + + r=ts_regex.compile('\([\0-\n]*\n\)') + ts_results = r.match_group(s, (1,)) + if ts_results: + s=s[len(ts_results[1]):] + s=str(html_with_references(s)) + if s[:4]=='

      ': + t=s[4:find(s,'

      ')] + s='''%s + + %s + + ''' % (t,s) + print s + else: + print html_with_references(s) + +if __name__=="__main__": main() diff --git a/wxPython/samples/stxview/StructuredText/Zwiki.py b/wxPython/samples/stxview/StructuredText/Zwiki.py new file mode 100644 index 0000000000..c08ea51e57 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/Zwiki.py @@ -0,0 +1,158 @@ +#!/usr/bin/python +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +from Html import HTML +from string import split +from ST import DOC +import re + +""" +This is the new structured text type. +""" + +class Zwiki_Title: + def __init__(self,str=''): + self.expr1 = re.compile('([A-Z]+[A-Z]+[a-zA-Z]*)').search + self.expr2 = re.compile('([A-Z]+[a-z]+[A-Z]+[a-zA-Z]*)').search + self.str = [str] + self.typ = "Zwiki_Title" + + def type(self): + return '%s' % self.typ + + def string(self): + return self.str + + def __getitem__(self,index): + return self.str[index] + + def __call__(self,raw_string,subs): + + """ + The raw_string is checked to see if it matches the rules + for this structured text expression. If the raw_string does, + it is parsed for the sub-string which matches and a doc_inner_link + instance is returned whose string is the matching substring. + If raw_string does not match, nothing is returned. + """ + + if self.expr1(raw_string): + start,end = self.expr1(raw_string).span() + result = Zwiki_Title(raw_string[start:end]) + result.start,result.end = self.expr1(raw_string).span() + return result + elif self.expr2(raw_string): + start,end = self.expr2(raw_string).span() + result = Zwiki_Title(raw_string[start:end]) + result.start,result.end = self.expr2(raw_string).span() + return result + else: + return None + + def span(self): + return self.start,self.end + +class Zwiki_doc(DOC): + + def __init__(self): + DOC.__init__(self) + """ + Add the new type to self.types + """ + self.types.append(Zwiki_Title()) + +class Zwiki_parser(HTML): + def __init__(self): + HTML.__init__(self) + self.types["Zwiki_Title"] = self.zwiki_title + + def zwiki_title(self,object): + result = "" + for x in object.string(): + result = result + x + result = "%s" % (result,result) + #result = "" % result + self.string = self.string + result diff --git a/wxPython/samples/stxview/StructuredText/__init__.py b/wxPython/samples/stxview/StructuredText/__init__.py new file mode 100644 index 0000000000..65e6f75b0f --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/__init__.py @@ -0,0 +1,112 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## + +import HTMLClass, DocumentClass +import ClassicDocumentClass +from StructuredText import html_with_references, HTML +from ST import Basic +import DocBookClass +import HTMLWithImages +import DocumentWithImages + +ClassicHTML=HTML +HTMLNG=HTMLClass.HTMLClass() + +def HTML(src, level=0, type=type, StringType=type('')): + if type(src) is StringType: + return ClassicHTML(src, level) + return HTMLNG(src, level) + +Classic=ClassicDocumentClass.DocumentClass() +Document=DocumentClass.DocumentClass() +DocumentWithImages=DocumentWithImages.DocumentWithImages() +HTMLWithImages=HTMLWithImages.HTMLWithImages() + +DocBookBook=DocBookClass.DocBookBook +DocBookChapter=DocBookClass.DocBookChapter() +DocBookChapterWithFigures=DocBookClass.DocBookChapterWithFigures() +DocBookArticle=DocBookClass.DocBookArticle() + + diff --git a/wxPython/samples/stxview/StructuredText/ts_regex.py b/wxPython/samples/stxview/StructuredText/ts_regex.py new file mode 100644 index 0000000000..1471eb2449 --- /dev/null +++ b/wxPython/samples/stxview/StructuredText/ts_regex.py @@ -0,0 +1,215 @@ +############################################################################## +# +# Zope Public License (ZPL) Version 1.0 +# ------------------------------------- +# +# Copyright (c) Digital Creations. All rights reserved. +# +# This license has been certified as Open Source(tm). +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions in source code must retain the above copyright +# notice, this list of conditions, and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions, and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# 3. Digital Creations requests that attribution be given to Zope +# in any manner possible. Zope includes a "Powered by Zope" +# button that is installed by default. While it is not a license +# violation to remove this button, it is requested that the +# attribution remain. A significant investment has been put +# into Zope, and this effort will continue if the Zope community +# continues to grow. This is one way to assure that growth. +# +# 4. All advertising materials and documentation mentioning +# features derived from or use of this software must display +# the following acknowledgement: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# In the event that the product being advertised includes an +# intact Zope distribution (with copyright and license included) +# then this clause is waived. +# +# 5. Names associated with Zope or Digital Creations must not be used to +# endorse or promote products derived from this software without +# prior written permission from Digital Creations. +# +# 6. Modified redistributions of any form whatsoever must retain +# the following acknowledgment: +# +# "This product includes software developed by Digital Creations +# for use in the Z Object Publishing Environment +# (http://www.zope.org/)." +# +# Intact (re-)distributions of any official Zope release do not +# require an external acknowledgement. +# +# 7. Modifications are encouraged but must be packaged separately as +# patches to official Zope releases. Distributions that do not +# clearly separate the patches from the original work must be clearly +# labeled as unofficial distributions. Modifications which do not +# carry the name Zope may be packaged in any form, as long as they +# conform to all of the clauses above. +# +# +# Disclaimer +# +# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY +# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +# This software consists of contributions made by Digital Creations and +# many individuals on behalf of Digital Creations. Specific +# attributions are listed in the accompanying credits file. +# +############################################################################## +"""Provide a thread-safe interface to regex +""" +import regex, regsub #, Sync +from regex import * +from regsub import split, sub, gsub, splitx, capwords + +try: + import thread +except: + class allocate_lock: + def acquire(*args): pass + def release(*args): pass + +else: + class SafeFunction: + _l=thread.allocate_lock() + _a=_l.acquire + _r=_l.release + + def __init__(self, f): + self._f=f + + def __call__(self, *args, **kw): + self._a() + try: return apply(self._f, args, kw) + finally: self._r() + + split=SafeFunction(split) + sub=SafeFunction(sub) + gsub=SafeFunction(gsub) + splitx=SafeFunction(splitx) + capwords=SafeFunction(capwords) + + allocate_lock=thread.allocate_lock + +class compile: + + _r=None + groupindex=None + + def __init__(self, *args): + self._r=r=apply(regex.compile,args) + self._init(r) + + def _init(self, r): + lock=allocate_lock() + self.__a=lock.acquire + self.__r=lock.release + self.translate=r.translate + self.givenpat=r.givenpat + self.realpat=r.realpat + + def match(self, string, pos=0): + self.__a() + try: return self._r.match(string, pos) + finally: self.__r() + + def search(self, string, pos=0): + self.__a() + try: return self._r.search(string, pos) + finally: self.__r() + + def search_group(self, str, group, pos=0): + """Search a string for a pattern. + + If the pattern was not found, then None is returned, + otherwise, the location where the pattern was found, + as well as any specified group are returned. + """ + self.__a() + try: + r=self._r + l=r.search(str, pos) + if l < 0: return None + return l, apply(r.group, group) + finally: self.__r() + + def match_group(self, str, group, pos=0): + """Match a pattern against a string + + If the string does not match the pattern, then None is + returned, otherwise, the length of the match, as well + as any specified group are returned. + """ + self.__a() + try: + r=self._r + l=r.match(str, pos) + if l < 0: return None + return l, apply(r.group, group) + finally: self.__r() + + def search_regs(self, str, pos=0): + """Search a string for a pattern. + + If the pattern was not found, then None is returned, + otherwise, the 'regs' attribute of the expression is + returned. + """ + self.__a() + try: + r=self._r + r.search(str, pos) + return r.regs + finally: self.__r() + + def match_regs(self, str, pos=0): + """Match a pattern against a string + + If the string does not match the pattern, then None is + returned, otherwise, the 'regs' attribute of the expression is + returned. + """ + self.__a() + try: + r=self._r + r.match(str, pos) + return r.regs + finally: self.__r() + +class symcomp(compile): + + def __init__(self, *args): + self._r=r=apply(regex.symcomp,args) + self._init(r) + self.groupindex=r.groupindex + + + + + diff --git a/wxPython/samples/stxview/stxview.py b/wxPython/samples/stxview/stxview.py new file mode 100644 index 0000000000..4599f9749e --- /dev/null +++ b/wxPython/samples/stxview/stxview.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python +#---------------------------------------------------------------------- + +import sys, os +import StructuredText +from wxPython.wx import * + + +USE_WXHTML = 1 + + +if not USE_WXHTML: + try: # try to load the IE ActiveX control + from wxPython.lib.activexwrapper import MakeActiveXClass + import win32com.client.gencache + browserModule = win32com.client.gencache.EnsureModule( + "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1) + except: + USE_WXHTML = 1 + +if not USE_WXHTML: + BrowserClass = MakeActiveXClass(browserModule.WebBrowser) + + class MyHtmlWindow(BrowserClass): + def SetPage(self, html): + import tempfile + filename = tempfile.mktemp('.html') + f = open(filename, 'w') + f.write(html) + f.close() + self.Navigate(os.path.abspath(filename)) + self.filename = filename + + def OnDocumentComplete(self, pDisp=None, URL=None): + os.unlink(self.filename) + +else: + from wxPython.html import * + MyHtmlWindow = wxHtmlWindow + + + +class StxFrame(wxFrame): + title = "StxViewer" + def __init__(self, stxFile): + wxFrame.__init__(self, None, -1, self.title, size=(650, 700), + style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) + + ##self.CreateStatusBar() + + menu = wxMenu() + menu.Append(10, "&Open\tCtrl-O", "Open a Structured Text file") + EVT_MENU(self, 10, self.OnOpen) + menu.Append(20, "&Close", "Close the current file") + EVT_MENU(self, 20, self.OnClose) + menu.Append(30, "&Save\tCtrl-S", "Save the current file") + EVT_MENU(self, 30, self.OnSave) + menu.Append(40, "Save &as", "Save the current file to a new name") + EVT_MENU(self, 40, self.OnSaveAs) + menu.Append(45, "Save as &html", "Save the current file as HTML") + EVT_MENU(self, 45, self.OnSaveAsHTML) + menu.AppendSeparator() + menu.Append(50, "&Refresh\tCtrl-R", "Reload the file from disk") + EVT_MENU(self, 50, self.OnRefresh) + menu.AppendSeparator() + menu.Append(60, "E&xit\tCtrl-X", "Close the application") + EVT_MENU(self, 60, self.OnExit) + + + menuBar = wxMenuBar() + menuBar.Append(menu, "&File") + self.SetMenuBar(menuBar) + + + nb = wxNotebook(self, -1) + EVT_NOTEBOOK_PAGE_CHANGED(self, -1, self.OnPageChanged) + + self.htmlWin = MyHtmlWindow(nb, -1) + nb.AddPage(self.htmlWin, "View") + + self.editWin = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE) + self.editWin.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL)) + nb.AddPage(self.editWin, "Edit") + + self.viewHtml = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE|wxTE_READONLY) + self.viewHtml.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL)) + nb.AddPage(self.viewHtml, "HTML") + + self.LoadStxFile(stxFile) + + + def LoadStxFile(self, stxFile): + self.file = stxFile + if stxFile is not None: + text = open(stxFile).read() + self.SetTitle(self.title + ': ' + stxFile) + else: + text = "" + self.SetTitle(self.title) + self.LoadStxText(text) + + + def LoadStxText(self, text): + # Old ST + html = str(StructuredText.html_with_references(text)) + + # NG Version + #st = StructuredText.Basic(text) + #doc = StructuredText.Document(st) + #html = StructuredText.HTML(doc) + + self.htmlWin.SetPage(html) + self.editWin.SetValue(text) + self.viewHtml.SetValue(html) + self.html = html + + + def OnPageChanged(self, evt): + if evt.GetOldSelection() == 1: # if it was on the edit page + text = self.editWin.GetValue() + self.LoadStxText(text) + + + def OnOpen(self, evt): + dlg = wxFileDialog(self, defaultDir=os.getcwd(), + wildcard = "STX files (*.stx)|*.stx|" + "Text files (*.txt)|*.txt|" + "All files (*.*)|*.*", + style=wxOPEN) + if dlg.ShowModal() == wxID_OK: + self.LoadStxFile(dlg.GetPath()) + dlg.Destroy() + + + + def OnClose(self, evt): + self.LoadStxFile(None) + + + def OnSave(self, evt): + if not self.file: + self.OnSaveAs(evt) + else: + text = self.editWin.GetValue() + open(self.file, 'w').write(text) + self.LoadStxFile(self.file) + + + def OnSaveAs(self, evt): + dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(), + wildcard = "STX files (*.stx)|*.stx|" + "Text files (*.txt)|*.txt|" + "All files (*.*)|*.*", + style=wxSAVE) + if dlg.ShowModal() == wxID_OK: + file = dlg.GetPath() + text = self.editWin.GetValue() + open(file, 'w').write(text) + self.LoadStxFile(file) + dlg.Destroy() + + + def OnSaveAsHTML(self, evt): + dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(), + wildcard = "HTML files (*.html)|*.html|" + "All files (*.*)|*.*", + style=wxSAVE) + if dlg.ShowModal() == wxID_OK: + file = dlg.GetPath() + text = self.editWin.GetValue() + self.LoadStxText(text) + open(file, 'w').write(self.html) + dlg.Destroy() + + + + def OnRefresh(self, evt): + self.LoadStxFile(self.file) + + + def OnExit(self, evt): + self.Close(true) + + + + + +app = wxPySimpleApp() +wxInitAllImageHandlers() + +if len(sys.argv) > 1: + filename = sys.argv[1] +else: + filename = None + +frame = StxFrame(filename) +frame.Show(true) +app.MainLoop() + + + diff --git a/wxPython/samples/stxview/test.stx b/wxPython/samples/stxview/test.stx new file mode 100644 index 0000000000..20f53b2acd --- /dev/null +++ b/wxPython/samples/stxview/test.stx @@ -0,0 +1,127 @@ +Structured Text Manipulation + + Parse a structured text string into a form that can be used with + structured formats, like html. + + Structured text is text that uses indentation and simple + symbology to indicate the structure of a document. + + A structured string consists of a sequence of paragraphs separated by + one or more blank lines. Each paragraph has a level which is defined + as the minimum indentation of the paragraph. A paragraph is a + sub-paragraph of another paragraph if the other paragraph is the last + preceding paragraph that has a lower level. + +Special symbology is used to indicate special constructs: + + - A single-line paragraph whose immediately succeeding paragraphs are lower + level is treated as a header. + + - A paragraph that begins with a '-', '*', or 'o' is treated as an + unordered list (bullet) element. + + - A paragraph that begins with a sequence of digits followed by a + white-space character is treated as an ordered list element. + + - A paragraph that begins with a sequence of sequences, where each + sequence is a sequence of digits or a sequence of letters followed + by a period, is treated as an ordered list element. If the sequence is + made up of lower-case i's and v's, a lower-case roman-numeral list is + generated. If the sequence is made up of upper-case I's and V's, an + upper-case roman-numeral list is generated. If the sequence is made + up of other lower case letters (typically a,b,c) a lowercase alphabetic + list is generated. If the sequence is made of of other upper case + letters (typically, A,B,C) an uppercase alphabetic list is generated. + If the sequence is something else (typically, 1,2,3), a arabic-numeral + list is generated. + + - A paragraph with a first line that contains some text, followed by + some white-space and '--' is treated as a descriptive list element. + The leading text is treated as the element title. + + - Sub-paragraphs of a paragraph that ends in the word 'example' or the + word 'examples', or '::' is treated as example code and is output as is. + + - Text enclosed single quotes (with white-space to the left of the + first quote and whitespace or puctuation to the right of the second quote) + is treated as example code. + + - Text surrounded by '*' characters (with white-space to the left of the + first '*' and whitespace or puctuation to the right of the second '*') + is *emphasized*. + + - Text surrounded by '**' characters (with white-space to the left of the + first '**' and whitespace or puctuation to the right of the second '**') + is made **strong**. + + - Text surrounded by '_' underscore characters (with whitespace to the left + and whitespace or punctuation to the right) is made _underlined_. + + - Text encloded by double quotes followed by a colon, a URL, and concluded + by punctuation plus white space, *or* just white space, is treated as a + hyper link. For example: + + '"Zope":http://www.zope.org/ is ...' + + Is interpreted as 'Zope is ...' + Note: This works for relative as well as absolute URLs. + + - Text enclosed by double quotes followed by a comma, one or more spaces, + an absolute URL and concluded by punctuation plus white space, or just + white space, is treated as a hyper link. For example: + + "mail me", mailto:amos@digicool.com. + + Is interpreted as 'mail me.' + + - Text enclosed in brackets which consists only of letters, digits, + underscores and dashes is treated as hyper links within the document. + For example: + + As demonstrated by Smith [12] this technique is quite effective. + + Is interpreted as '... by Smith [12] this ...'. Together + with the next rule this allows easy coding of references or end notes. + + - Text enclosed in brackets which is preceded by the start of a line, two + periods and a space is treated as a named link. For example: + + .. [12] "Effective Techniques" Smith, Joe ... + + Is interpreted as '[12] "Effective Techniques" ...'. + Together with the previous rule this allows easy coding of references or + end notes. + + + - A paragraph that has blocks of text enclosed in '||' is treated as a + table. The text blocks correspond to table cells and table rows are + denoted by newlines. By default the cells are center aligned. A cell + can span more than one column by preceding a block of text with an + equivalent number of cell separators '||'. Newlines and '|' cannot + be a part of the cell text. For example: + + |||| **Ingredients** || + || *Name* || *Amount* || + ||Spam||10|| + ||Eggs||3|| + + is interpreted as:: + + + + + + + + + + + + + + + + + +
      Ingredients
      Name Amount
      Spam10
      Eggs3
      + diff --git a/wxPython/samples/wxProject/README.txt b/wxPython/samples/wxProject/README.txt new file mode 100644 index 0000000000..ea9e5e914a --- /dev/null +++ b/wxPython/samples/wxProject/README.txt @@ -0,0 +1,3 @@ +This sample comes from an IBM developerWorks article at +http://www-106.ibm.com/developerworks/library/l-wxpy/index.html + diff --git a/wxPython/samples/wxProject/wxProject.py b/wxPython/samples/wxProject/wxProject.py new file mode 100644 index 0000000000..03b6df1075 --- /dev/null +++ b/wxPython/samples/wxProject/wxProject.py @@ -0,0 +1,286 @@ +#!/bin/python +import sys, os +from wxPython.wx import * +from string import * + +# Process the command line. Not much to do; +# just get the name of the project file if it's given. Simple. +projfile = 'Unnamed' +if len(sys.argv) > 1: + projfile = sys.argv[1] + + +def MsgBox (window, string): + dlg=wxMessageDialog(window, string, 'wxProject', wxOK) + dlg.ShowModal() + dlg.Destroy() + +class main_window(wxFrame): + def __init__(self, parent, id, title): + wxFrame.__init__(self, parent, -1, title, size = (500, 500), + style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) + + + # ------------------------------------------------------------------------------------ + # Set up menu bar for the program. + # ------------------------------------------------------------------------------------ + self.mainmenu = wxMenuBar() # Create menu bar. + mainwindow = self + + menu=wxMenu() # Make a menu (will be the Project menu) + + exitID=wxNewId() # Make a new ID for a menu entry. + menu.Append(exitID, '&Open', 'Open project') # Name the ID by adding it to the menu. + EVT_MENU(self, exitID, self.OnProjectOpen) # Create and assign a menu event. + exitID=wxNewId() + menu.Append(exitID, '&New', 'New project') + EVT_MENU(self, exitID, self.OnProjectNew) + exitID=wxNewId() + menu.Append(exitID, 'E&xit', 'Exit program') + EVT_MENU(self, exitID, self.OnProjectExit) + + self.mainmenu.Append (menu, '&Project') # Add the project menu to the menu bar. + + + menu=wxMenu() # Make a menu (will be the File menu) + + exitID=wxNewId() + menu.Append(exitID, '&Add', 'Add file to project') + EVT_MENU(self, exitID, self.OnFileAdd) + exitID=wxNewId() + menu.Append(exitID, '&Remove', 'Remove file from project') + EVT_MENU(self, exitID, self.OnFileRemove) + exitID=wxNewId() + menu.Append(exitID, '&Open', 'Open file for editing') + EVT_MENU(self, exitID, self.OnFileOpen) + exitID=wxNewId() + menu.Append(exitID, '&Save', 'Save file') + EVT_MENU(self, exitID, self.OnFileSave) + + self.mainmenu.Append (menu, '&File') # Add the file menu to the menu bar. + + self.SetMenuBar (self.mainmenu) # Attach the menu bar to the window. + + + # ------------------------------------------------------------------------------------ + # Create the splitter window. + # ------------------------------------------------------------------------------------ + splitter = wxSplitterWindow (self, -1, style=wxNO_3D|wxSP_3D) + splitter.SetMinimumPaneSize (1) + + # ------------------------------------------------------------------------------------ + # Create the tree on the left. + # ------------------------------------------------------------------------------------ + tID = wxNewId() + self.tree = wxTreeCtrl (splitter, tID, style=wxTR_HAS_BUTTONS | + wxTR_EDIT_LABELS | + wxTR_HAS_VARIABLE_ROW_HEIGHT) + EVT_TREE_BEGIN_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEdit) + EVT_TREE_END_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEditEnd) + EVT_TREE_ITEM_ACTIVATED(self.tree, tID, self.OnTreeItemActivated) + + # ------------------------------------------------------------------------------------ + # Create the editor on the right. + # ------------------------------------------------------------------------------------ + self.editor = wxTextCtrl(splitter, -1, style=wxTE_MULTILINE) + self.editor.Enable (0) + + # ------------------------------------------------------------------------------------ + # Install the tree and the editor. + # ------------------------------------------------------------------------------------ + splitter.SplitVertically (self.tree, self.editor) + splitter.SetSashPosition (180, true) + + self.Show(true) + + # Some global state variables. + self.projectdirty = false + + # ---------------------------------------------------------------------------------------- + # Some nice little handlers. + # ---------------------------------------------------------------------------------------- + + + def project_open(self, project_file): + try: + input = open (project_file, 'r') + + self.tree.DeleteAllItems() + + self.project_file = project_file + name = replace (input.readline(), "\n", "") + self.SetTitle (name) + self.root = self.tree.AddRoot(name) + self.activeitem = self.root + for line in input.readlines(): + self.tree.AppendItem (self.root, replace(line, "\n", "")) + input.close + self.tree.Expand (self.root) + + self.editor.Clear() + self.editor.Enable (false) + + self.projectdirty = false + except IOError: + pass + + def project_save(self): + try: + output = open (self.project_file, 'w+') + output.write (self.tree.GetItemText (self.root) + "\n") + + count = self.tree.GetChildrenCount (self.root) + iter = 0 + child = '' + for i in range(count): + if i == 0: + (child,iter) = self.tree.GetFirstChild(self.root,iter) + else: + (child,iter) = self.tree.GetNextChild(self.root,iter) + output.write (self.tree.GetItemText(child) + "\n") + output.close() + self.projectdirty = false + except IOError: + dlg_m = wxMessageDialog (self, 'There was an error saving the project file.', + 'Error!', wxOK) + dlg_m.ShowModal() + dlg_m.Destroy() + + # ---------------------------------------------------------------------------------------- + # Event handlers from here on out. + # ---------------------------------------------------------------------------------------- + + def OnProjectOpen(self, event): + open_it = true + if self.projectdirty: + dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject', + wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.project_save() + if result == wxID_CANCEL: + open_it = false + dlg.Destroy() + if open_it: + dlg = wxFileDialog(self, "Choose a project to open", ".", "", "*.wxp", wxOPEN) + if dlg.ShowModal() == wxID_OK: + self.project_open(dlg.GetPath()) + dlg.Destroy() + + def OnProjectNew(self, event): + open_it = true + if self.projectdirty: + dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject', + wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.project_save() + if result == wxID_CANCEL: + open_it = false + dlg.Destroy() + + if open_it: + dlg = wxTextEntryDialog (self, "Name for new project:", "New Project", + "New project", wxOK | wxCANCEL) + if dlg.ShowModal() == wxID_OK: + newproj = dlg.GetValue() + dlg.Destroy() + dlg = wxFileDialog (self, "Place to store new project", ".", "", "*.wxp", + wxSAVE) + if dlg.ShowModal() == wxID_OK: + try: + proj = open (dlg.GetPath(), 'w') + proj.write (newproj + "\n") + proj.close() + self.project_open (dlg.GetPath()) + except IOError: + dlg_m = wxMessageDialog (self, + 'There was an error saving the new project file.', + 'Error!', wxOK) + dlg_m.ShowModal() + dlg_m.Destroy() + dlg.Destroy() + + def OnProjectExit(self, event): + close = true + if self.projectdirty: + dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject', + wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.project_save() + if result == wxID_CANCEL: + close = false + dlg.Destroy() + if close: + self.Close() + + def OnFileAdd(self, event): + dlg = wxFileDialog (self, "Choose a file to add", ".", "", "*.*", wxOPEN) + if dlg.ShowModal() == wxID_OK: + path = os.path.split(dlg.GetPath()) + self.tree.AppendItem (self.root, path[1]) + self.tree.Expand (self.root) + self.project_save() + + def OnFileRemove(self, event): + item = self.tree.GetSelection() + if item != self.root: + self.tree.Delete (item) + self.project_save() + + def OnFileOpen(self, event): + item = self.tree.GetSelection() + + def OnFileSave(self, event): + if self.activeitem != self.root: + self.editor.SaveFile (self.tree.GetItemText (self.activeitem)) + + + def OnTreeLabelEdit(self, event): + item=event.GetItem() + if item != self.root: + event.Veto() + + def OnTreeLabelEditEnd(self, event): + self.projectdirty = true + + def OnTreeItemActivated(self, event): + go_ahead = true + if self.activeitem != self.root: + if self.editor.IsModified(): + dlg=wxMessageDialog(self, 'The edited file has changed. Save it?', + 'wxProject', wxYES_NO | wxCANCEL) + result = dlg.ShowModal() + if result == wxID_YES: + self.editor.SaveFile (self.tree.GetItemText (self.activeitem)) + if result == wxID_CANCEL: + go_ahead = false + dlg.Destroy() + if go_ahead: + self.tree.SetItemBold (self.activeitem, 0) + + if go_ahead: + item=event.GetItem() + self.activeitem = item + if item != self.root: + self.tree.SetItemBold (item, 1) + self.editor.Enable (1) + self.editor.LoadFile (self.tree.GetItemText(item)) + self.editor.SetInsertionPoint (0) + self.editor.SetFocus() + else: + self.editor.Clear() + self.editor.Enable (0) + +class App(wxApp): + def OnInit(self): + frame = main_window(None, -1, "wxProject - " + projfile) + self.SetTopWindow(frame) + if (projfile != 'Unnamed'): + frame.project_open (projfile) + return true + +app = App(0) +app.MainLoop() +