From ebe2bd45e0dac4c0b58506062c91b9996a09ae77 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 8 Mar 2008 23:38:07 -0500 Subject: [PATCH] Add a bunch of new NSView classes (to form a meta-view BSSourceView) that adds a line-numbered NSTextView embedded in a NSScrollView * English.lproj/Debugger.xib: Use our BSSourceView instead of an NSTextView for the source viewer * Source/BSLineNumberView.h: new file * Source/BSLineNumberView.m: new file * Source/BSSourceView.h: new file * Source/BSSourceView.m: new file * Source/BSSourceViewTextView.h: new file * Source/BSSourceViewTextView.m: new file * MacGDBp.xcodeproj: Project updates for all the new files * Source/DebuggerWindowController.h: Switch to using a BSSourceView * Source/DebuggerWindowController.m: ditto --- English.lproj/Debugger.xib | 1437 +++++++---------------------- MacGDBp.xcodeproj/project.pbxproj | 26 + Source/BSLineNumberView.h | 28 + Source/BSLineNumberView.m | 79 ++ Source/BSSourceView.h | 32 + Source/BSSourceView.m | 94 ++ Source/BSSourceViewTextView.h | 28 + Source/BSSourceViewTextView.m | 33 + Source/DebuggerWindowController.h | 4 +- Source/DebuggerWindowController.m | 25 +- 10 files changed, 668 insertions(+), 1118 deletions(-) create mode 100644 Source/BSLineNumberView.h create mode 100644 Source/BSLineNumberView.m create mode 100644 Source/BSSourceView.h create mode 100644 Source/BSSourceView.m create mode 100644 Source/BSSourceViewTextView.h create mode 100644 Source/BSSourceViewTextView.m diff --git a/English.lproj/Debugger.xib b/English.lproj/Debugger.xib index 0653a70..54f03b6 100644 --- a/English.lproj/Debugger.xib +++ b/English.lproj/Debugger.xib @@ -1,26 +1,26 @@ - + 1050 - 9B18 - 629 - 949 - 343.00 + 9C31 + 644 + 949.26 + 352.00 YES - + YES - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin YES - DebuggerWindowController + DebuggerWindowController - FirstResponder + FirstResponder NSApplication @@ -63,18 +63,18 @@ 4F493FF4-D55D-4881-B16D-54ED9DC66FF7 - Step Out - - + Step Out + Step Out + - NSImage + NSImage StepOut.png - {0, 0} - + {0, 0} + {0, 0} YES NO -1 @@ -85,18 +85,18 @@ 91C3B0BD-0D34-4A26-A0EA-CC2A093F5916 - Step In - - + Step In + Step In + - + NSImage StepIn.png - - + {0, 0} + {0, 0} YES NO -1 @@ -107,18 +107,18 @@ 9FD4795A-41D6-49D4-94CE-99E9DF733A09 - Run - - + Run + Run + - + NSImage Run.png - - + {0, 0} + {0, 0} YES NO -1 @@ -129,18 +129,18 @@ DD23489D-A21C-474A-84A1-392673464E24 - Reconnect - - + Reconnect + Reconnect + - + NSImage Reconnect.png - - + {0, 0} + {0, 0} YES NO -1 @@ -151,18 +151,18 @@ E0B2A793-522F-487A-AF2E-BE7FDFF26543 - Step Over - - + Step Over + Step Over + - + NSImage StepOver.png - - + {0, 0} + {0, 0} YES NO -1 @@ -171,8 +171,8 @@ NSToolbarCustomizeToolbarItem - Customize - + Customize + Customize Customize Toolbar @@ -268,8 +268,8 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ runToolbarCustomizationPalette: - - + {0, 0} + {0, 0} YES YES -1 @@ -278,7 +278,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ NSToolbarFlexibleSpaceItem - + Flexible Space @@ -295,23 +295,23 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES YES - - + + 1048576 2147483647 - - + + NSImage NSMenuCheckmark - - + + NSImage NSMenuMixedState NSToolbarSeparatorItem - + Separator @@ -328,17 +328,17 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES YES - - + + 1048576 2147483647 - - + + NSToolbarSpaceItem - + Space @@ -355,12 +355,12 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES YES - - + + 1048576 2147483647 - - + + @@ -401,21 +401,20 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ -2147483359 {{447, 3}, {632, 14}} - YES 67239424 272629760 PGVycm9yPg - LucidaGrande + LucidaGrande 1.100000e+01 3100 6 - System + System controlColor 3 @@ -433,14 +432,13 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 292 {{3, 0}, {196, 17}} - YES 67239424 272629760 PHN0YXR1cz4 - + LucidaGrande 1.100000e+01 16 @@ -448,7 +446,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 6 - + System controlTextColor 3 @@ -457,13 +455,13 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - + - 274 + 256 YES - + 274 YES @@ -482,14 +480,12 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 4352 {377, 205} - YES 256 {377, 17} - @@ -497,7 +493,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ -2147483392 {{-26, 0}, {16, 17}} - YES @@ -516,7 +511,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 6 - + System headerTextColor @@ -524,12 +519,12 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - Text Cell + Text Cell 6 - + System controlBackgroundColor @@ -554,7 +549,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - + Text Cell @@ -575,7 +570,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 6 - + System headerColor 3 @@ -587,7 +582,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - + Text Cell @@ -603,7 +598,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 6 - + System gridColor 3 @@ -620,7 +615,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {{1, 17}, {377, 205}} - @@ -631,9 +625,8 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ -2147483392 {{84, 17}, {15, 67}} - - _doScroller: + _doScroller: 8.170732e-01 @@ -641,10 +634,9 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ -2147483392 {{1, 207}, {377, 15}} - 1 - + _doScroller: 3.449477e-01 @@ -656,7 +648,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {{1, 0}, {377, 17}} - @@ -666,7 +657,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {379, 223} - 562 @@ -691,27 +681,24 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 4370 {382, 205} - YES 256 {382, 17} - -2147483392 - {{368, 0}, {16, 17}} + {{-26, 0}, {16, 17}} - YES - 2.500000e+01 + 1.000000e+01 1.000000e+01 3.000000e+01 @@ -728,9 +715,9 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - + Text Cell - + LucidaGrande 1.300000e+01 1044 @@ -743,7 +730,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 1.713853e+02 + 1.763853e+02 8.000000e+00 1.000000e+03 @@ -757,7 +744,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - + Text Cell @@ -768,7 +755,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 3.500000e+01 + 4.000000e+01 2.600000e+01 1.000000e+03 @@ -782,7 +769,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - + Text Cell @@ -793,7 +780,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 1.390625e+02 + 1.440625e+02 5.006250e+01 1.000000e+03 @@ -807,7 +794,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 337772096 2048 - + Text Cell @@ -832,7 +819,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {{1, 17}, {382, 205}} - @@ -843,10 +829,8 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ -2147483392 {{368, 17}, {15, 190}} - - YES - + _doScroller: 9.951220e-01 @@ -854,11 +838,9 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ -2147483392 {{1, 207}, {367, 15}} - - YES 1 - + _doScroller: 9.973890e-01 @@ -870,7 +852,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {{1, 0}, {382, 17}} - @@ -880,9 +861,8 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {{388, 0}, {384, 223}} - - 754 + 562 @@ -892,174 +872,23 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ {772, 223} - - + YES - - - 274 - - YES - - - 2304 - - YES - - - 2322 - - YES - - YES - Apple HTML pasteboard type - Apple PDF pasteboard type - Apple PICT pasteboard type - Apple PNG pasteboard type - Apple URL pasteboard type - CorePasteboardFlavorType 0x6D6F6F76 - CorePasteboardFlavorType 0x75726C20 - NSColor pasteboard type - NSFilenamesPboardType - NSStringPboardType - NeXT Encapsulated PostScript v1.2 pasteboard type - NeXT RTFD pasteboard type - NeXT Rich Text Format v1.0 pasteboard type - NeXT TIFF v4.0 pasteboard type - NeXT font pasteboard type - NeXT ruler pasteboard type - WebURLsWithTitlesPboardType - - - {{0, 138}, {770, 14}} - - - - - - - - - - - - YES - - - 6 - - - - 7.700000e+02 - 1 - - - 11239 - - - - YES - - YES - NSBackgroundColor - NSColor - - - YES - - 6 - - selectedTextBackgroundColor - - - - 6 - - selectedTextColor - - - - - - - YES - - YES - - NSUnderline - - - YES - - 1 - MCAwIDEAA - - - - - - - 6 - {770, 1e+07} - {98, 0} - - - - {{1, 1}, {770, 247}} - {{0, 138}, {770, 247}} - - - - - - - {4, -5} - 1 - - 4 - - - - -2147483392 - {{-30, 1}, {15, 147}} - - - - - 1.000000e+00 - - - - 256 - {{-100, -100}, {87, 18}} - - - 1 - - - 1.000000e+00 - 9.456522e-01 - - - {{0, 232}, {772, 249}} - - - - 530 - - - + + + 268 + {{0, 232}, {772, 251}} + + BSSourceView - {{-1, 21}, {772, 481}} + {{-1, 19}, {772, 483}} - {769, 501} - {{0, 0}, {1440, 878}} {213, 185} @@ -1086,7 +915,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES - value + value variable type @@ -1112,13 +941,13 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - contentArray: stack + contentArray: stack - + contentArray: stack contentArray stack 2 @@ -1128,14 +957,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.level + value: arrangedObjects.level - - + value: arrangedObjects.level + value arrangedObjects.level 2 @@ -1144,14 +973,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.filename + value: arrangedObjects.filename - - + value: arrangedObjects.filename + value arrangedObjects.filename 2 @@ -1160,14 +989,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.lineno + value: arrangedObjects.lineno - - + value: arrangedObjects.lineno + value arrangedObjects.lineno 2 @@ -1176,14 +1005,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.where + value: arrangedObjects.where - - + value: arrangedObjects.where + value arrangedObjects.where 2 @@ -1192,7 +1021,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - delegate + delegate @@ -1200,13 +1029,13 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - content: arrangedObjects + content: arrangedObjects - + content: arrangedObjects content arrangedObjects 2 @@ -1216,14 +1045,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.value + value: arrangedObjects.value - - + value: arrangedObjects.value + value arrangedObjects.value 2 @@ -1232,14 +1061,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.variable + value: arrangedObjects.variable - - + value: arrangedObjects.variable + value arrangedObjects.variable 2 @@ -1248,14 +1077,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - value: arrangedObjects.type + value: arrangedObjects.type - - + value: arrangedObjects.type + value arrangedObjects.type 2 @@ -1264,7 +1093,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - + delegate @@ -1272,7 +1101,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - + delegate @@ -1310,22 +1139,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 244 - - - sourceViewer - - - - 269 - - - - sourceViewerScroller - - - - 294 - statusmsg @@ -1414,6 +1227,14 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 493 + + + sourceViewer + + + + 503 + @@ -1462,7 +1283,7 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES - + @@ -1569,12 +1390,12 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 494 - + 502 + YES - + @@ -1583,211 +1404,190 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES - + - - - - 11 - - - YES - - - - - - + 15 YES - - - + + + - 16 - + 11 + YES - - - - + + + + - + - 468 - - + 467 + + - 469 - - + 466 + + - 17 - + 465 + + + + + 12 + YES - + + + - + - 18 - + 81 + YES - + - + - 42 - + 14 + YES - + - + - 48 - + 13 + YES - + - - - - 462 - - - - - 461 - - + - 460 - - + 456 + + - 459 - - + 457 + + - 12 - - - YES - - - - - + 458 + + - 465 - - + 495 + + - 466 - - + 469 + + - 467 - - + 468 + + - 13 - + 16 + YES - + + + + - + - 14 - + 48 + YES - + - + - 81 - + 42 + YES - + - - - - 458 - - - - - 457 - - + - 456 - - + 18 + + + YES + + + - 23 - + 17 + YES - - - + - + - 24 - - + 459 + + - 463 - - + 460 + + - 464 - - + 461 + + - 495 - - + 462 + + + + + 496 + + @@ -1817,10 +1617,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 18.ImportedFromIB2 22.IBPluginDependency 22.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 24.IBPluginDependency - 24.ImportedFromIB2 27.IBPluginDependency 27.ImportedFromIB2 36.IBPluginDependency @@ -1837,8 +1633,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 460.IBShouldRemoveOnLegacySave 461.IBShouldRemoveOnLegacySave 462.IBShouldRemoveOnLegacySave - 463.IBShouldRemoveOnLegacySave - 464.IBShouldRemoveOnLegacySave 465.IBShouldRemoveOnLegacySave 466.IBShouldRemoveOnLegacySave 467.IBShouldRemoveOnLegacySave @@ -1857,15 +1651,19 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ 481.IBPluginDependency 482.IBPluginDependency 483.IBPluginDependency - 494.CustomClassName + 496.IBPluginDependency + 502.CustomClassName 59.IBPluginDependency 59.ImportedFromIB2 + 7.IBEditorWindowLastContentRect 7.IBPluginDependency 7.IBViewEditorWindowController.showingBoundsRectangles + 7.IBViewEditorWindowController.showingLayoutRectangles 7.IBWindowTemplateEditedContentRect 7.ImportedFromIB2 7.NSWindowTemplate.visibleAtLaunch 7.editorWindowContentRectSynchronizationRect + 7.lastResizeAction 7.windowTemplate.hasMaxSize 7.windowTemplate.hasMinSize 7.windowTemplate.maxSize @@ -1877,44 +1675,42 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES - - - - - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - - + BSSplitView + com.apple.InterfaceBuilder.CocoaPlugin - BSSplitView - @@ -1922,39 +1718,51 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - - - - - + com.apple.InterfaceBuilder.CocoaPlugin {{418, 770}, {617, 0}} - - - - - - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - - - - - - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + BSSplitView + com.apple.InterfaceBuilder.CocoaPlugin - + {{342, 237}, {769, 501}} + com.apple.InterfaceBuilder.CocoaPlugin - {{344, 269}, {769, 501}} + + {{342, 237}, {769, 501}} {{344, 269}, {769, 501}} + + YES + + YES + IBResizeActionFinalFrame + IBResizeActionInitialFrame + + + YES + {{342, 237}, {769, 501}} + {{342, 237}, {769, 501}} + + {3.40282e+38, 3.40282e+38} {213, 107} - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin @@ -1978,139 +1786,33 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ - 495 + 503 YES - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - IBUserSource - - - - - NSObject - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - + BSSourceView + NSView - IBProjectSource - Source/SocketWrapper.h + IBProjectSource + Source/BSSourceView.h - + BSSplitView NSSplitView - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - + IBProjectSource + Source/BSSplitView.h BSSplitView NSSplitView - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - Source/BSSplitView.h + IBUserSource + @@ -2128,11 +1830,11 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES - id - - - - + id + id + id + id + id @@ -2145,7 +1847,6 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ registerView runButton sourceViewer - sourceViewerScroller stackController statusmsg stepInButton @@ -2154,519 +1855,57 @@ ELIAAAAAAAgACAAIAAgAAQABAAEAAQ YES - NSTextField + NSTextField NSToolbarItem NSTreeController NSOutlineView NSToolbarItem - NSTextView - NSScrollView + BSSourceView NSArrayController - + NSTextField NSToolbarItem NSToolbarItem NSToolbarItem - + IBProjectSource Source/DebuggerWindowController.h - + DebuggerWindowController NSWindowController - - YES - - YES - - - YES - + + IBUserSource + - - YES - - YES - - - YES - + + + FirstResponder + + IBUserSource + + + + NSObject + + IBProjectSource + Source/SocketWrapper.h + + + + NSObject - - + IBUserSource + 0 - ../../MacGDBp.xcodeproj + ../MacGDBp.xcodeproj 3 - - YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxECGQALAAwAMQA1ADYAPAA9 -AEIAWgBbAFwAXQB2AHoAfgCVAJYAlwCYAJkAmgCbAJwAnQCeAL4AwADBAMIAxwDIAMkAzADNANAAlgDB -AOEA4gDjAOQAwQD2APoA+wD/AQABAwEFAJcBFAEVARYBIAEhASUArgEqAS4BLwEzATYBOQE/AUEBQwFE -AVMBVQFWAVoBWwFqAWwBbQFxAXIBgQGDAYQBiAGJAZgBmgGbAZ8BoACcAbABsQGyAbMBuwG9AJ0BzQHO -ASABzwHXAdkB3QHpAfMB9gH5AAsCBgIMAhgCGQIpAioCMQIyAjUCPQI+Aj8CQgJGAkoCUAJZAloCYQJi -AmYCawJsAm8CegJ7AnwCgQJ7AowCkQKoArACvwLDAuAC4QLpAvMC9AL3Av4C/wMCAwgDGAMfAyADIwMo -AykDLAM1AzYDOwM8Az8DRwNNA04DVQNdA2MDZANpA2oDbQN0A3kDegN9A4ADgQOEA5ADkQOSA5UDngOf -A6MDpAOlA6gDuAPAA8oDzgPeA98D5gPwA/ED9wP4A/8ECAQOBA8EEQQYBB0EJAQqBCsEMgQ6BEAEQQRI -BFAEVgRXBF4EYARhBGsEbAR2BHcEewR8BH0EfgSBBI0EkwShBKUEuATMBM0EzgTPBNAE0QTSBNME1ATV -BNYE1wTYBNkE2gTbBNwE3QThBOIE6gTyBPYE+AT8BQAFAgUEBRMCGwEaBRsFIAUhBSYFJwUpBTEAbwUy -BTUFOAU5BToFPQU+BT8FRAVFBUcFUQVSBVsFXAVdBV4ACwVfBWEFYgVjBWQFZwWIBZAFkQWVBZoFmwWg -BaEFpgWnBawFrQWwBbUFtgW7BcAF0gXYBdkF2gXbBdwF3gXgBeEF4gXnBegF7QXuBfMF9AX5BfoF/wYA -BgUGEgYbBhwGHQYeBh8GIAYhBiMGJgYnBiwGLQYyBjMGOAY5Bj4GQwZEBkkGSgZPBlAGVQZWBmAGYQZi -BmUGbAZtBm4GdQZ2BncGfgZ/BoAGhwaIBokGigaRBpIGkwaaBpsGnAadBqQGpQamBq0GrgavBuMG5gbn -BxsHUAeFB4YHhweIB4kHigeLB4wHjQeOB48HkAeRB5IHkweUB5UHlgeXB5gHmQeaB5sHnAedB54Hnweg -B6EHogejB6QHpQemB6cHqAepB6oHqwesB60HrgevB7AHsQeyB7MHtAe1B7YHtwe8B8EIFABXCGcIaAhp -CGoIawhsCG0IbghvCHAIcQhyCHMIdAh1CHYIdwh4CHkIegh7CHwIfQh+CH8IgAiBCIIIgwiECIUIhgiH -CIgIiQiKAmUIiwiMCI0IjgiPCJAIkQiSCJMIlAiVCJYIlwiYCJkImgibCJwInQieCJ8IoAihCKIIowik -CKUIpginCKgIqQiqCKsIrAitCK4IrwiwCLEIsgizCLQItQi4CLsIvlUkbnVsbN8QEgANAA4ADwAQABEA -EgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8A -MFZOU1Jvb3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0NsYXNzZXNWYWx1ZXNfEBlOU0FjY2Vzc2li -aWxpdHlPaWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1lc0tleXNbTlNGcmFtZXdvcmtdTlNDbGFz -c2VzS2V5c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlDb25uZWN0b3Jz -XU5TRm9udE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAPTlNPYmplY3RzVmFsdWVzXxAXTlNBY2Nl -c3NpYmlsaXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1ZhbHVlc4ACgQIYgQGJgQHCgQIXgQErgQGN -gAWBAcGBAcOBAY6BAhWAAIAGgQGMgQIWEQHxgQHE0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA18QGERl -YnVnZ2VyV2luZG93Q29udHJvbGxlctIANwA4ADkAOlgkY2xhc3Nlc1okY2xhc3NuYW1logA6ADteTlND -dXN0b21PYmplY3RYTlNPYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAOAD4APwBAWk5TLm9iamVjdHOA -/qEAQYAH3ABDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWVxOU1dp -bmRvd1ZpZXdcTlNTY3JlZW5SZWN0XU5TV2luZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3Nc -TlNXaW5kb3dSZWN0WU5TTWF4U2l6ZV8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5bGVNYXNr -WU5TTWluU2l6ZVtOU1ZpZXdDbGFzc4BpgQEqgQEngAkScHgAAIAKgAiBASkQAhAPgQEogAtfEBh7ezM2 -MywgMjc3fSwgezc2OSwgNTAxfX1fEB5HREJwIDxob3N0Pjo8cG9ydD4gQCA8c2Vzc2lvbj5YTlNXaW5k -b3fdAA4AXgBfAGAAYQBiAGMAZABlAGYAZwBoAGkAagBrAGwAbQBsAG8AcAArAGwAbAB0AFYAdV8QF05T -VG9vbGJhcklCRGVmYXVsdEl0ZW1zXxAfTlNUb29sYmFyU2hvd3NCYXNlbGluZVNlcGFyYXRvcl8QF05T -VG9vbGJhcklCQWxsb3dlZEl0ZW1zXxAfTlNUb29sYmFyQXV0b3NhdmVzQ29uZmlndXJhdGlvbl8QEU5T -VG9vbGJhclNpemVNb2RlXxAaTlNUb29sYmFySUJJZGVudGlmaWVkSXRlbXNfEBFOU1Rvb2xiYXJEZWxl -Z2F0ZV8QGU5TVG9vbGJhclByZWZlcnNUb0JlU2hvd25fECBOU1Rvb2xiYXJBbGxvd3NVc2VyQ3VzdG9t -aXphdGlvbl8QGk5TVG9vbGJhcklCU2VsZWN0YWJsZUl0ZW1zXxAUTlNUb29sYmFyRGlzcGxheU1vZGVf -EBNOU1Rvb2xiYXJJZGVudGlmaWVygGiAZgmAZQkQAYAOgAAJCYBngAzSAA4AdwB4AHlZTlMuc3RyaW5n -gA1fECQyRTcwNDIyOC0wMEQxLTQzQzMtQjQ1OC05ODM5Q0VGNUE3RDDSADcAOAB7AHyjAHwAfQA7XxAP -TlNNdXRhYmxlU3RyaW5nWE5TU3RyaW5n0wAOAH8APgCAAIEAi1dOUy5rZXlzgGSpAIIAgwCEAIUAhgCH -AIgAiQCKgA+AEIARgBKAE4AUgBWAFoAXqQCMAI0AjgCPAJAAkQCSAJMAlIAYgCKAMIBCgEeATIBRgFaA -XV8QJDlGRDQ3OTVBLTQxRDYtNDlENC05NENFLTk5RTlERjczM0EwOV8QFk5TVG9vbGJhclNlcGFyYXRv -ckl0ZW1fEB1OU1Rvb2xiYXJDdXN0b21pemVUb29sYmFySXRlbV8QJDRGNDkzRkY0LUQ1NUQtNDg4MS1C -MTZELTU0RUQ5REM2NkZGN18QJDkxQzNCMEJELTBEMzQtNEEyNi1BMEVBLUNDMkEwOTNGNTkxNl8QJERE -MjM0ODlELUEyMUMtNDc0QS04NEExLTM5MjY3MzQ2NEUyNF8QJEUwQjJBNzkzLTUyMkYtNDg3QS1BRjJF -LUJFN0ZERkYyNjU0M18QGk5TVG9vbGJhckZsZXhpYmxlU3BhY2VJdGVtXxASTlNUb29sYmFyU3BhY2VJ -dGVt3xAQAJ8ADgCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvACsAbAArAGwAKwC1ALYAtwC4 -ALkAugC6ALcAvV8QH05TVG9vbGJhckl0ZW1WaXNpYmlsaXR5UHJpb3JpdHlfEBFOU1Rvb2xiYXJJdGVt -Vmlld18QFE5TVG9vbGJhckl0ZW1FbmFibGVkXxATTlNUb29sYmFySXRlbUFjdGlvbl8QGE5TVG9vbGJh -cklzVXNlclJlbW92YWJsZV8QE05TVG9vbGJhckl0ZW1UYXJnZXRfEBpOU1Rvb2xiYXJJdGVtQXV0b3Zh -bGlkYXRlc18QF05TVG9vbGJhckl0ZW1JZGVudGlmaWVyXxAZTlNUb29sYmFySXRlbVBhbGV0dGVMYWJl -bF8QFE5TVG9vbGJhckl0ZW1Ub29sVGlwXxAQTlNUb29sYmFySXRlbVRhZ18QFE5TVG9vbGJhckl0ZW1N -YXhTaXplXxAUTlNUb29sYmFySXRlbU1pblNpemVfEBJOU1Rvb2xiYXJJdGVtTGFiZWxfEBJOU1Rvb2xi -YXJJdGVtSW1hZ2UQAIAhgAAJgAAJgAAIgBmAGoAbE///////////gCCAIIAagBzSAA4AdwB4AJWADVNS -dW5Q0wAOADIAwwDEAMUAxl5OU1Jlc291cmNlTmFtZYAfgB2AHldOU0ltYWdlV1J1bi5wbmfSADcAOADK -AMuiAMsAO18QEE5TQ3VzdG9tUmVzb3VyY2VWezAsIDB90gA3ADgAzgDPogDPADtdTlNUb29sYmFySXRl -bd8QEQCfAA4A0QCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgDSANMAKwBsACsAbAArAGwA2gDb -ACsAuQDdAN4A3wArXxAjTlNUb29sYmFySXRlbU1lbnVGb3JtUmVwcmVzZW50YXRpb26AL4AogAAJgAAJ -gAAJgCOAJYAAgCeAJoAkgABZU2VwYXJhdG9yV3sxMiwgNX1aezEyLCAxMDAwfdkADgDlAOYA5wDoAOkA -6gDrAOwA7QDuAO8AbADuAGwA8wD0APVXTlNUaXRsZV8QEU5TS2V5RXF1aXZNb2RNYXNrXU5TSXNTZXBh -cmF0b3JaTlNLZXlFcXVpdlxOU0lzRGlzYWJsZWRdTlNNbmVtb25pY0xvY1lOU09uSW1hZ2VcTlNNaXhl -ZEltYWdlgC6AKRIAEAAACYApCRJ/////gCqALNMADgAyAMMAxADFAPmAH4AdgCtfEA9OU01lbnVDaGVj -a21hcmvTAA4AMgDDAMQAxQD+gB+AHYAtXxAQTlNNZW51TWl4ZWRTdGF0ZdIANwA4AQEBAqIBAgA7Wk5T -TWVudUl0ZW3SADcAOAEEAJajAJYAzwA73xAQAJ8ADgCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0A -rgCvACsAbAEJAGwAKwBsAQ0BDgEPALkAugC6AQ4BE4AhgAAJgEEJgAAJgDGAMoAzgCCAIIAygDRZQ3Vz -dG9taXplXxARQ3VzdG9taXplIFRvb2xiYXLVAA4BFwEYARkBGgEbARwBHQEeAR9WTlNTaXplXE5TSW1h -Z2VGbGFnc1ZOU1JlcHNXTlNDb2xvcoBAgDUSKMAAAIA2gD5YezMyLCAzMn3SAA4APgEiASOAPaEBJIA3 -0gAOAD4BJgEngDyiASgBKYA4gDnSAA4BKwEsAS1fEBROU1RJRkZSZXByZXNlbnRhdGlvboA7gDpPERC6 -TU0AKgAAEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -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 -AAAACwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0BAAADAAAAAQAgAAABAQADAAAAAQAgAAABAgADAAAABAAA -EKoBAwADAAAAAQABAAABBgADAAAAAQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAE -AAABFgADAAAAAQD8AAABFwAEAAAAAQAAEAABHAADAAAAAQABAAABUgADAAAAAQABAAABUwADAAAABAAA -ELIAAAAAAAgACAAIAAgAAQABAAEAAdIANwA4ATABMaMBMQEyADtfEBBOU0JpdG1hcEltYWdlUmVwWk5T -SW1hZ2VSZXDSADcAOAE0ATWiATUAO1dOU0FycmF50gA3ADgBNwE4owE4ATUAO15OU011dGFibGVBcnJh -edMADgE6ATsBPAE9AT5cTlNDb2xvclNwYWNlV05TV2hpdGWAPxADRDAgMADSADcAOAFAARqiARoAO9IA -NwA4AUIAx6IAxwA7XxAfcnVuVG9vbGJhckN1c3RvbWl6YXRpb25QYWxldHRlOt8QEACfAA4AoAChAKIA -owCkAKUApgCnAKgAqQCqAKsArACtAK4ArwArAGwAKwBsACsAtQFMAU0AuAC5ALoAugFNAVKAIYAACYAA -CYAACIBDgESAG4AggCCARIBF0gAOAHcAeACYgA1YU3RlcCBPdXTTAA4AMgDDAMQAxQFZgB+AHYBGW1N0 -ZXBPdXQucG5n3xAQAJ8ADgCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvACsAbAArAGwAKwC1 -AWMBZAC4ALkAugC6AWQBaYAhgAAJgAAJgAAIgEiASYAbgCCAIIBJgErSAA4AdwB4AJmADVdTdGVwIElu -0wAOADIAwwDEAMUBcIAfgB2AS1pTdGVwSW4ucG5n3xAQAJ8ADgCgAKEAogCjAKQApQCmAKcAqACpAKoA -qwCsAK0ArgCvACsAbAArAGwAKwC1AXoBewC4ALkAugC6AXsBgIAhgAAJgAAJgAAIgE2AToAbgCCAIIBO -gE/SAA4AdwB4AJqADVlSZWNvbm5lY3TTAA4AMgDDAMQAxQGHgB+AHYBQXVJlY29ubmVjdC5wbmffEBAA -nwAOAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCuAK8AKwBsACsAbAArALUBkQGSALgAuQC6ALoB -kgGXgCGAAAmAAAmAAAiAUoBTgBuAIIAggFOAVNIADgB3AHgAm4ANWVN0ZXAgT3ZlctMADgAyAMMAxADF -AZ6AH4AdgFVcU3RlcE92ZXIucG5n3xARAJ8ADgDRAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCu -AaEBogArAGwAKwBsACsAbAGpAaoAKwC5AawBrQDfACuAXIBbgAAJgAAJgAAJgFeAWIAAgFqAWYAkgABe -RmxleGlibGUgU3BhY2VWezEsIDV9W3syMDAwMCwgMzJ92QAOAOUA5gDnAOgA6QDqAOsA7ADtAO4A7wBs -AO4AbADzAPQA9YAugCkJgCkJgCqALNIANwA4AbwAnKMAnADPADvfEBEAnwAOANEAoAChAKIAowCkAKUA -pgCnAKgAqQCqAKsArACtAK4BvgG/ACsAbAArAGwAKwBsAcYBxwArALkByQHKAN8AK4BjgGKAAAmAAAmA -AAmAXoBfgACAYYBggCSAAFVTcGFjZVd7MzIsIDV92QAOAOUA5gDnAOgA6QDqAOsA7ADtAO4A7wBsAO4A -bADzAPQA9YAugCkJgCkJgCqALNIANwA4AdgAnaMAnQDPADvSADcAOAHaAdujAdsB3AA7XxATTlNNdXRh -YmxlRGljdGlvbmFyeVxOU0RpY3Rpb25hcnnSAA4APgEmAd+APKkAkACPAJIAjACRAI0AlACTAI6AR4BC -gFGAGIBMgCKAXYBWgDDSAA4APgEiAeuAPacAkACPAJIAjQCMAJMAkYBHgEKAUYAigBiAVoBM0gAOAD4B -IgH1gD2g0gA3ADgB9wH4ogH4ADtZTlNUb29sYmFy1wH6AA4B+wH8Af0AXAH+Af8CAAIBAgICAwH/AgVf -EA9OU05leHRSZXNwb25kZXJaTlNTdWJ2aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1cGVydmll -d4BqgQEmgGsRAQCBASSAaoEBJdIADgA+ASICCIA9owIJAgoCC4BsgHqAgtgB+gAOAg0CDgH8Ag8AXAH+ -AE4CEQISAhMCFABsAf8ATldOU0ZyYW1lVk5TQ2VsbFlOU0VuYWJsZWSAaYB5gG2AbhP/////gAABIQmA -aoBpXxAVe3s0NDcsIDN9LCB7NjMyLCAxNH192AIaAA4CGwIcAh0CHgIfAiACIQIiAiMCJAIlAgkCJwIo -W05TQ2VsbEZsYWdzXxARTlNCYWNrZ3JvdW5kQ29sb3JaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250 -cm9sVmlld1xOU0NlbGxGbGFnczJbTlNUZXh0Q29sb3ISBAH+AIB4gHOAb4BwgGwSEEAAAIB3VzxlcnJv -cj7UAA4BFwIrAiwCLQIuAi8CMFZOU05hbWVYTlNmRmxhZ3OAciNAJgAAAAAAAIBxEQwcXEx1Y2lkYUdy -YW5kZdIANwA4AjMCNKICNAA7Vk5TRm9udNUADgEaAToCNgI3ATwCOQI6AjsCPFtOU0NvbG9yTmFtZV1O -U0NhdGFsb2dOYW1lgD+AdhAGgHWAdFZTeXN0ZW1cY29udHJvbENvbG9y0wAOAToBOwE8AT0CQYA/SzAu -NjY2NjY2NjkA0wAOAToCQwE8AG8CRVVOU1JHQoA/RjEgMCAwANIANwA4AkcCSKQCSAJJAg4AO18QD05T -VGV4dEZpZWxkQ2VsbFxOU0FjdGlvbkNlbGzSADcAOAJLAkylAkwCTQJOAk8AO1tOU1RleHRGaWVsZFlO -U0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy2AH6AA4CDQIOAfwCDwBcAf4ATgIRAlMCVAJVAGwB/wBO -gGmAeYB7gHwRASQJgGqAaV8QE3t7MywgMH0sIHsxOTYsIDE3fX3YAhoADgIbAhwCHQIeAh8CIAIhAiIC -IwJdAl4CCgInAmCAeIBzgH2AfoB6gH9YPHN0YXR1cz7UAA4BFwIrAiwCLQIuAi8CZYBygHEQENUADgEa -AToCNgI3ATwCaAI6AmkCPIA/gIGAgIB0XxAQY29udHJvbFRleHRDb2xvctMADgE6ATsBPAE9Am6AP0Iw -ANkB+gAOAg0CcAH7AfwAXAAyAf4ATgJyAnMCdAJ1AnYB/wJ4AE5fEBNOU09yaWdpbmFsQ2xhc3NOYW1l -gGmA5oEBI4CEgIURARKAaoCDgGlbQlNTcGxpdFZpZXdbTlNTcGxpdFZpZXfSAA4APgEiAn6APaICfwKA -gIaA59oB+gAOAnAB+wH8Af0AXAAyAf4CggILAnIChQKGAnYChwH/AngCCwBsXE5TSXNWZXJ0aWNhbICC -gOaAh4CIgOWAaoCDgIIJ0gAOAD4BIgKOgD2iAo8CkICJgL7fEA8B+gKSAA4CkwKUApUB+wKWAfwB/QBc -Af4ClwKYApkCfwKbApwCnQKeAp8CoAKhAnYCogH/An8CpQKmAqZbTlNIU2Nyb2xsZXJYTlNzRmxhZ3Nc -TlNDb3JuZXJWaWV3XxAQTlNIZWFkZXJDbGlwVmlld1xOU1Njcm9sbEFtdHNbTlNWU2Nyb2xsZXJdTlNO -ZXh0S2V5Vmlld11OU0NvbnRlbnRWaWV3gIaAuIC9EQIygJOAkICKTxAQQSAAAEEgAABBgAAAQYAAAIC8 -gGqAhoC0gIuAi9IADgA+ASICqoA9pQKmAqUCmwKfAp6Ai4C0gLiAkICT2wH6AA4CDQKxAfsB/AKyAFwC -swH+ApgCjwK1ArYCtwK4ArkCugH/ArwCjwK6WU5TY3ZGbGFnc1lOU0RvY1ZpZXdZTlNCR0NvbG9ygImA -s4CyEASAjBEJAICNgGqAoICJgI3SAA4APgEiAsGAPaECuoCN3xAUAfoCxAAOAsUCxgIbAscClALIAskC -ygH8Af0CDwBcAssCzAH+As0CzgKmAK4C0ALRAtIC0wBsAp4C1gBvAtcC2ALZAGwB/wLcAFcCpgLeAt9f -EB9OU0RyYWdnaW5nU291cmNlTWFza0Zvck5vbkxvY2FsWU5TVHZGbGFnc1xOU0hlYWRlclZpZXdfEBJO -U0FsbG93c1R5cGVTZWxlY3RfEBdOU0ludGVyY2VsbFNwYWNpbmdXaWR0aF8QGU5TQ29sdW1uQXV0b3Jl -c2l6aW5nU3R5bGVfEBhOU0ludGVyY2VsbFNwYWNpbmdIZWlnaHRbTlNHcmlkQ29sb3JfEBxOU0RyYWdn -aW5nU291cmNlTWFza0ZvckxvY2FsXk5TVGFibGVDb2x1bW5zW05TUm93SGVpZ2h0gIuAsRJSQIAAgI+A -rAmAkyNACAAAAAAAACNAAAAAAAAAABERAICOCYBqgK6Ai4CWI0AsAAAAAAAAWnszNzcsIDIwNX3XAfoA -DgH8Af0AXAH+AuICnwLkAgIC5QH/Ap8CultOU1RhYmxlVmlld4CQgJKAkYBqgJCAjdsB+gAOAg0CsQH7 -AfwCsgBcArMB/gKYAo8CtQLsArcC7QK5AtIB/wK8Ao8C0oCJgLOAu4C6gI+AaoCggImAj1l7Mzc3LCAx -N33SADcAOAL1AvakAvYCTgJPADtfEBFOU1RhYmxlSGVhZGVyVmlld9YB+gAOAg0B/ABcAf4CjwL5AvoC -+wH/Ao+AiYCVgJQT/////4AAAQCAaoCJXxAUe3stMjYsIDB9LCB7MTYsIDE3fX3SADcAOAMAAwGkAwEC -TgJPADtdX05TQ29ybmVyVmlld9IADgA+ASIDBIA9owMFAwYDB4CXgKOAp9kDCQAOAwoDCwMMAw0DDgMP -AuIAbAMRAxIDEwMUAT0DFQMWArpeTlNJc1Jlc2l6ZWFibGVcTlNIZWFkZXJDZWxsV05TV2lkdGhaTlNE -YXRhQ2VsbF5OU1Jlc2l6aW5nTWFza1pOU01pbldpZHRoWk5TTWF4V2lkdGgJgKKAmCNAW4AAAAAAAICe -I0AwAAAAAAAAI0CPQAAAAAAAgI3XAhoADgIbAhwCHQIfAiADGQMaAxsDHAIlAK4DHhIEgf4AgJ2AmoCZ -gHCAm1hWYXJpYWJsZdMADgE6ATsBPAE9AyKAP0swLjMzMzMzMjk5ANUADgEaAToCNgI3ATwCaAI6AyYC -PIA/gIGAnIB0XxAPaGVhZGVyVGV4dENvbG9y0gA3ADgDKgMrpQMrAkgCSQIOADtfEBFOU1RhYmxlSGVh -ZGVyQ2VsbNgCGgAOAhsCHAIdAh4CHwIgAy0CIgK8AzACJQK6AzMCYBIUIf5AgHiAoICfgHCAjREIAIB/ -WVRleHQgQ2VsbNUADgEaAToCNgI3ATwCOQI6AzkCPIA/gHaAoYB0XxAWY29udHJvbEJhY2tncm91bmRD -b2xvctIANwA4Az0DPqIDPgA7XU5TVGFibGVDb2x1bW7ZAwkADgMKAwsDDAMNAw4DDwLiAGwDEQNCA0MD -RAE9A0UDFgK6CYCigKQjQGFAAAAAAACApiNAIAAAAAAAAICN1wIaAA4CGwIcAh0CHwIgAxkDGgMbA0oC -JQCuAx6AnYCagKWAcICbVVZhbHVl2AIaAA4CGwIcAh0CHgIfAiADLQIiArwDMAIlAroDMwJggHiAoICf -gHCAjYB/2QMJAA4DCgMLAwwDDQMOAw8C4gBsAxEDWANZA1oBPQNbAxYCugmAooCoI0Bd8EgAAAAAgK0j -QD3BH8AAAACAjdcCGgAOAhsCHAIdAh8CIAIhAxoDXwNgAiUArgMegJ2AqoCpgHCAm1RUeXBl1QAOARoB -OgI2AjcBPALTAjoDZwI8gD+ArICrgHRbaGVhZGVyQ29sb3LTAA4BOgE7ATwBPQNsgD9CMQDYAhoADgIb -AhwCHQIeAh8CIAMtAiICvAMwAiUCugMzAmCAeICggJ+AcICNgH/VAA4BGgE6AjYCNwE8A3YCOgN3AjyA -P4CwgK+AdFlncmlkQ29sb3LTAA4BOgE7ATwBPQN8gD9EMC41ANIANwA4A34Df6YDfwLiAk0CTgJPADtd -TlNPdXRsaW5lVmlld18QFXt7MSwgMTd9LCB7Mzc3LCAyMDV9fdIANwA4A4IDg6QDgwJOAk8AO1pOU0Ns -aXBWaWV32QH6A4UADgINAfwAXAOGAf4DhwKPAo8DigOLAvsB/wONAo8Dj1hOU1RhcmdldFhOU0FjdGlv -bllOU1BlcmNlbnSAiYCJgLeAtYBqgLaAiSM/6iV2oAAAAF8QFHt7ODQsIDE3fSwgezE1LCA2N319XF9k -b1Njcm9sbGVyOtIANwA4A5MDlKUDlAJNAk4CTwA7Wk5TU2Nyb2xsZXLaAfoDhQAOAg0CkwH8AFwDhgH+ -A4cCjwKPA4oDmQBvAvsB/wONAo8DnYCJgImAt4C5gGqAtoCJIz/WE5+gAAAAXxAVe3sxLCAyMDd9LCB7 -Mzc3LCAxNX190gAOAD4BIgOhgD2hAtKAj18QE3t7MSwgMH0sIHszNzcsIDE3fX1aezM3OSwgMjIzfdIA -NwA4A6YDp6QDpwJOAk8AO1xOU1Njcm9sbFZpZXffEA8B+gKSAA4CDQKTApQClQH7ApYB/ABcAf4ClwKY -ApkCfwOqApwDrAOtA64DrwOwA7EDsgH/An8DtQO2A7aAhoDggL2A5BEC8oDHgMWAv08QEEEgAABBIAAA -QZgAAEGYAAARASGAaoCGgN6AwIDA0gAOAD4BIgO6gD2lA7YDtQOqA68DroDAgN6A4IDFgMfbAfoADgIN -ArEB+wH8ArIAXAKzAf4CmAKQArUDwwK3A8QCuQPFAf8CvAKQA8WAvoCzgN2AwYDCgGqAoIC+gMLSAA4A -PgEiA8yAPaEDxYDC3xAUAfoCxAAOAsUCxgIbAscClALIAskCygH8Af0CDwBcAssCzAH+As0CzgO2AK4D -0APRA9IC0wBsA64C1gBvAtcD1gPXAGwB/wLcAFcDtgPcA92AwIDcElLAgACAxICsCYDHERESgMMJgGqA -roDAgMkjQDEAAAAAAABaezM4MiwgMjA1fdcB+gAOAfwB/QBcAf4C4gOvAuQCAgPiAf8DrwPFgMWAkoDG -gGqAxYDC2wH6AA4CDQKxAfsB/AKyAFwCswH+ApgCkAK1A+kCtwPqArkD0gH/ArwCkAPSgL6As4DjgOKA -xIBqgKCAvoDEWXszODIsIDE3fdYB+gAOAg0B/ABcAf4CkAL5A/QC+wH/ApCAvoCVgMiAaoC+XxAUe3sz -NjgsIDB9LCB7MTYsIDE3fX3SAA4APgEiA/qAPaQD+wP8A/0D/oDKgNCA1IDY2QMJAA4DCgMLAwwDDQMO -Aw8C4gBsAxEEAgQDBAQBPQQFBAYDxQmAooDLI0A5AAAAAAAAgM4jQCQAAAAAAAAjQD4AAAAAAACAwtcC -GgAOAhsCHAIdAh8CIAMZAxoECgQLAiUArgMegJ2AzYDMgHCAm1Ej0wAOAToBOwE8AT0DIoA/2AIaAA4C -GwIcAh0CHgIfAiADLQIiArwDMAQVA8UDMwJggHiAoICfgM+AwoB/1AAOARcCKwIsAi0EGgIvBByAciNA -KgAAAAAAAIBxEQQU2QMJAA4DCgMLAwwDDQMOAw8C4gBsAxEEIAQhBCIBPQNFAxYDxQmAooDRI0BlbFRg -AAAAgNOAwtcCGgAOAhsCHAIdAh8CIAMZAxoECgQnAiUArgMegJ2AzYDSgHCAm1RGaWxl2AIaAA4CGwIc -Ah0CHgIfAiADLQIiArwDMAQVA8UDMwJggHiAoICfgM+AwoB/2QMJAA4DCgMLAwwDDQMOAw8C4gBsAxEE -NQQ2BDcBPQQ4AxYDxQmAooDVI0BBgAAAAAAAgNcjQDoAAAAAAACAwtcCGgAOAhsCHAIdAh8CIAIhAxoD -XwQ9AiUArgMegJ2AqoDWgHCAm1RMaW5l2AIaAA4CGwIcAh0CHgIfAiADLQIiArwDMAQVA8UDMwJggHiA -oICfgM+AwoB/2QMJAA4DCgMLAwwDDQMOAw8C4gBsAxEESwRMBE0BPQROAxYDxQmAooDZI0BhYgAAAAAA -gNsjQEkIAAAAAACAwtcCGgAOAhsCHAIdAh8CIAIhAxoDXwRTAiUArgMegJ2AqoDagHCAm1hGdW5jdGlv -btgCGgAOAhsCHAIdAh4CHwIgAy0CIgK8AzAEFQPFAzMCYIB4gKCAn4DPgMKAf9IANwA4BF8C4qUC4gJN -Ak4CTwA7XxAVe3sxLCAxN30sIHszODIsIDIwNX192gH6A4UADgINAfwCDwBcA4YB/gOHApACkAOKBGUC -+wBsAf8DjQKQBGqAvoC+gLeA3wmAaoC2gL4jP+/YCgAAAABfEBZ7ezM2OCwgMTd9LCB7MTUsIDE5MH19 -2wH6A4UADgINApMB/AIPAFwDhgH+A4cCkAKQA4oEcABvAvsAbAH/A40CkAR1gL6AvoC3gOEJgGqAtoC+ -Iz/v6pxgAAAAXxAVe3sxLCAyMDd9LCB7MzY3LCAxNX190gAOAD4BIgR5gD2hA9KAxF8QE3t7MSwgMH0s -IHszODIsIDE3fX1fEBZ7ezM4OCwgMH0sIHszODQsIDIyM319Wns3NzIsIDIyM33SADcAOAR/BICiBIAA -O15OU0NsYXNzU3dhcHBlctwB+gKSAA4CDQKTAfsB/ABcAf4ClwKYApkCCwSDApwEhQSGBIcCdgH/AgsE -igSLBIuAgoEBIIC9gQEiEQISgOiAaoCCgQEegOmA6dIADgA+ASIEj4A9owSLBIoEg4DpgQEegQEg3QH6 -AA4CDQSUBJUCsQH7AfwCsgBcArMB/gKYAoACtQSYBJkEmgK3BJsCuQScAf8C0wKABJxYTlNCb3VuZHNY -TlNDdXJzb3KA54CzgQEZgQEagQEbgOqA64BqgKyA54Dr0gAOAD4BIgSjgD2hBJyA690B+gAOAg0EpgSn -BKgEqQH8AEkAXASqAf4EqwSLBK0ErgSvAjoEsASxBLIEswH/BLUEiwArXxAPTlNUZXh0Q29udGFpbmVy -WU5TVFZGbGFnc1xOU1NoYXJlZERhdGFbTlNEcmFnVHlwZXNYTlNNaW5pemVaTlNEZWxlZ2F0ZYDpgQEY -gP+BAQCBAQiA7BEJEoEBFoBqgQEXgOmAANIADgA+AD8EuoD+rxARBLsEvAS9BL4EvwTABMEEwgTDBMQE -xQTGBMcEyATJBMoEy4DtgO6A74DwgPGA8oDzgPSA9YD2gPeA+ID5gPqA+4D8gP1fEBlOZVhUIFJURkQg -cGFzdGVib2FyZCB0eXBlXxASTlNTdHJpbmdQYm9hcmRUeXBlXxAaTmVYVCBydWxlciBwYXN0ZWJvYXJk -IHR5cGVfEB5OZVhUIFRJRkYgdjQuMCBwYXN0ZWJvYXJkIHR5cGVfEBlBcHBsZSBVUkwgcGFzdGVib2Fy -ZCB0eXBlXxAjQ29yZVBhc3RlYm9hcmRGbGF2b3JUeXBlIDB4NkQ2RjZGNzZfECNDb3JlUGFzdGVib2Fy -ZEZsYXZvclR5cGUgMHg3NTcyNkMyMF8QG1dlYlVSTHNXaXRoVGl0bGVzUGJvYXJkVHlwZV8QGUFwcGxl -IFBERiBwYXN0ZWJvYXJkIHR5cGVfEBlBcHBsZSBQTkcgcGFzdGVib2FyZCB0eXBlXxAaQXBwbGUgSFRN -TCBwYXN0ZWJvYXJkIHR5cGVfEBVOU0ZpbGVuYW1lc1Bib2FyZFR5cGVfEBdOU0NvbG9yIHBhc3RlYm9h -cmQgdHlwZV8QMU5lWFQgRW5jYXBzdWxhdGVkIFBvc3RTY3JpcHQgdjEuMiBwYXN0ZWJvYXJkIHR5cGVf -EBpBcHBsZSBQSUNUIHBhc3RlYm9hcmQgdHlwZV8QGU5lWFQgZm9udCBwYXN0ZWJvYXJkIHR5cGVfECpO -ZVhUIFJpY2ggVGV4dCBGb3JtYXQgdjEuMCBwYXN0ZWJvYXJkIHR5cGXSADcAOATeBN+jBN8E4AA7XE5T -TXV0YWJsZVNldFVOU1NldF8QFXt7MCwgMTM4fSwgezc3MCwgMTR9fdUE4wAOBOQDCwTlAG8E5gScBOgE -6VlOU1RDRmxhZ3NaTlNUZXh0Vmlld18QD05TTGF5b3V0TWFuYWdlcoEBB4DrI0CIEAAAAAAAgQEB1QAO -BOsE7ATtBKsE7gTvBPACOgArXxAQTlNUZXh0Q29udGFpbmVyc11OU1RleHRTdG9yYWdlWU5TTE1GbGFn -c4EBBoEBBYEBAoAA0wAOAH0EqwTzBPQAK4EBBIEBA4AA0gAOAHcAeADBgA3SADcAOAT5BOykBOwE+gT7 -ADtfEBlOU011dGFibGVBdHRyaWJ1dGVkU3RyaW5nXxASTlNBdHRyaWJ1dGVkU3RyaW5n0gAOAD4BIgT+ -gD2hBK+BAQDSADcAOAUBBOWiBOUAO9IANwA4BQMEpqIEpgA72AAOBQUFBgUHAhsFCAUJBQoFCwUMACsC -aALTBRAAKwUSV05TRmxhZ3NfEBdOU0RlZmF1bHRQYXJhZ3JhcGhTdHlsZV8QEE5TSW5zZXJ0aW9uQ29s -b3JfEBROU1NlbGVjdGVkQXR0cmlidXRlc18QEk5TTWFya2VkQXR0cmlidXRlc18QEE5TTGlua0F0dHJp -YnV0ZXOBARURK+eAAICBgKyBAQmAAIEBEdMADgB/AD4FFAUVBRiBARCiBRYFF4EBCoEBC6IFGQUagQEM -gQEO1QAOARoBOgI2AjcBPAI5AjoFHgI8gD+AdoEBDYB0XxAbc2VsZWN0ZWRUZXh0QmFja2dyb3VuZENv -bG9y1QAOARoBOgI2AjcBPAJoAjoFJAI8gD+AgYEBD4B0XxARc2VsZWN0ZWRUZXh0Q29sb3LSADcAOAUo -AdyiAdwAO9MADgB/AD4FFAUrBS6BARCiBSwFF4EBEoEBC6IFLwUwgQETgQEUW05TVW5kZXJsaW5l0wAO -AToCQwE8AG8FNIA/RjAgMCAxANIANwA4BTYFN6IFNwA7XxAUTlNUZXh0Vmlld1NoYXJlZERhdGFcezc3 -MCwgMWUrMDd9V3s5OCwgMH3SADcAOAU7BOSlBOQFPAJOAk8AO1ZOU1RleHRfEBR7ezEsIDF9LCB7Nzcw -LCAyNDd9fV8QFnt7MCwgMTM4fSwgezc3MCwgMjQ3fX3TAA4FQAVBBUIFQwBvWU5TSG90U3BvdFxOU0N1 -cnNvclR5cGWBAR2BARxXezQsIC01fdIANwA4BUYElaIElQA72QH6A4UADgINAfwAXAOGAf4FSAKAAoAD -igVMAvsB/wONAoAFUFpOU0N1clZhbHVlgOeA54C3gQEfgGqAtoDnIz/wAAAAAAAAXxAVe3stMzAsIDF9 -LCB7MTUsIDE0N3192wH6A4UADgINApMB/ABcA4YB/gVIA4cCgAKAA4oFVgBvAgIB/wONAoAFUAVagOeA -54C3gQEhgGqAtoDnIz/uQshgAAAAXxAYe3stMTAwLCAtMTAwfSwgezg3LCAxOH19XxAWe3swLCAyMzJ9 -LCB7NzcyLCAyNDl9fV8QFnt7LTEsIDIxfSwgezc3MiwgNDgxfX1aezc2OSwgNTAxfdIANwA4BWACTqMC -TgJPADtfEBV7ezAsIDB9LCB7MTQ0MCwgODc4fX1aezIxMywgMTg1fV8QGnszLjQwMjgyZSszOCwgMy40 -MDI4MmUrMzh90gA3ADgFZQVmogVmADtfEBBOU1dpbmRvd1RlbXBsYXRl0gAOAD4BIgVpgD2vEB4FagVr -BWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYeBASyB -AS+BATGBATOBATWBATiBATqBATuBAUiBAUqBAUyBAU6BAVCBAVyBAV6BAWCBAWKBAWOBAWWBAWeBAWmB -AWuBAW+BAXKBAXWBAXiBAXyBAX+BAYOBAYbUAA4FiQWKBYsFjAAfAroFj11OU0Rlc3RpbmF0aW9uWE5T -U291cmNlV05TTGFiZWyBAS6AAoCNgQEtWGRlbGVnYXRl0gA3ADgFkgWTowWTBZQAO18QFE5TTmliT3V0 -bGV0Q29ubmVjdG9yXk5TTmliQ29ubmVjdG9y1AAOBYkFigWLBYwAQQAfBZmBAS6AB4ACgQEwVndpbmRv -d9QADgWJBYoFiwWMAgoAHwWfgQEugHqAAoEBMllzdGF0dXNtc2fUAA4FiQWKBYsFjACRAB8FpYEBLoBM -gAKBATRfEA9yZWNvbm5lY3RCdXR0b27UAA4FiQWKBYsFqAAfAJAFq4EBN4ACgEeBATZXc3RlcEluOtIA -NwA4Ba4Fr6MFrwWUADtfEBVOU05pYkNvbnRyb2xDb25uZWN0b3LUAA4FiQWKBYsFjAIJAB8FtIEBLoBs -gAKBATlYZXJyb3Jtc2fUAA4FiQWKBYsFjAAfA8UFj4EBLoACgMKBAS3UAA4FiQWKBYsFjAW9AB8Fv4EB -LoEBPIACgQFH2QAOBcEFwgXDBcQFxQXGBccFyAXJAGwFywXMBc0FzgBsBdAAbF8QFE5TUHJlc2VydmVz -U2VsZWN0aW9uXxAPX05TTWFuYWdlZFByb3h5XxARTlNPYmplY3RDbGFzc05hbWVeTlNEZWNsYXJlZEtl -eXNfEBROU1RyZWVDb250ZW50TGVhZktleV8QGE5TU2VsZWN0c0luc2VydGVkT2JqZWN0c18QGE5TVHJl -ZUNvbnRlbnRDaGlsZHJlbktleV8QFk5TQXZvaWRzRW1wdHlTZWxlY3Rpb26BAUYJgQFCgQFBgQE9gQFF -CYEBRAnSAA4APgEiBdSAPaMF1QXWBdeBAT6BAT+BAUBVdmFsdWVYdmFyaWFibGVUdHlwZVxOU1hNTEVs -ZW1lbnTRAA4F3YEBQ9IANwA4Bd8FwqIFwgA7WGNoaWxkcmVuVmlzTGVhZtIANwA4BeMF5KQF5AXlBeYA -O18QEE5TVHJlZUNvbnRyb2xsZXJfEBJOU09iamVjdENvbnRyb2xsZXJcTlNDb250cm9sbGVyXxAScmVn -aXN0ZXJDb250cm9sbGVy1AAOBYkFigWLBYwAkAAfBeyBAS6AR4ACgQFJXHN0ZXBJbkJ1dHRvbtQADgWJ -BYoFiwWoAB8AkgXygQE3gAKAUYEBS1lzdGVwT3ZlcjrUAA4FiQWKBYsFqAAfAI8F+IEBN4ACgEKBAU1Y -c3RlcE91dDrUAA4FiQWKBYsFjAScAB8F/oEBLoDrgAKBAU9cc291cmNlVmlld2Vy1AAOBYkFigWLBYwG -AgAfBgSBAS6BAVGAAoEBW9kGBgAOBcEFwgYHBcQGCAXGBcgAbAYKAGwGDABsBg4AbABsAGxfEBpOU0Zp -bHRlclJlc3RyaWN0c0luc2VydGlvblpOU0VkaXRhYmxlXxAiTlNDbGVhcnNGaWx0ZXJQcmVkaWNhdGVP -bkluc2VydGlvbgmBAVoJgQFZCYEBUgkJCdIADgA+ASIGFIA9pgYVBhYGFwYYBhkGGoEBU4EBVIEBVYEB -VoEBV4EBWFVsZXZlbFhmaWxlbmFtZVZsaW5lbm9Vd2hlcmVYcmVnaXN0ZXJfEBRyZWdpc3Rlci5yb290 -RWxlbWVudNEADgXdgQFD0gA3ADgGJAYlpAYlBeUF5gA7XxARTlNBcnJheUNvbnRyb2xsZXJfEA9zdGFj -a0NvbnRyb2xsZXLUAA4FiQWKBYsFjAKAAB8GK4EBLoDngAKBAV1fEBRzb3VyY2VWaWV3ZXJTY3JvbGxl -ctQADgWJBYoFiwWoAB8AjAYxgQE3gAKAGIEBX1RydW461AAOBYkFigWLBYwCugAfBjeBAS6AjYACgQFh -XHJlZ2lzdGVyVmlld9QADgWJBYoFiwWMAB8AQQWPgQEugAKAB4EBLdQADgWJBYoFiwWMAIwAHwZCgQEu -gBiAAoEBZFlydW5CdXR0b27UAA4FiQWKBYsFjACSAB8GSIEBLoBRgAKBAWZec3RlcE92ZXJCdXR0b27U -AA4FiQWKBYsFjACPAB8GToEBLoBCgAKBAWhdc3RlcE91dEJ1dHRvbtQADgWJBYoFiwWoAB8AkQZUgQE3 -gAKATIEBalpyZWNvbm5lY3Q61wAOBYkGVwZYBYoFiwZZBloFvQZcBdUDBwZfAFZZTlNLZXlQYXRoWU5T -QmluZGluZ18QHE5TTmliQmluZGluZ0Nvbm5lY3RvclZlcnNpb26BAW6BATyBAW2BAT6Ap4EBbF8QG3Zh -bHVlOiBhcnJhbmdlZE9iamVjdHMudHlwZV8QFGFycmFuZ2VkT2JqZWN0cy50eXBl0gA3ADgGYwZkowZk -BZQAO18QFU5TTmliQmluZGluZ0Nvbm5lY3RvctcADgWJBlcGWAWKBYsGWQZaBgIGaAXVA/0GawBWgQFu -gQFRgQFxgQE+gNSBAXBfEB12YWx1ZTogYXJyYW5nZWRPYmplY3RzLmxpbmVub18QFmFycmFuZ2VkT2Jq -ZWN0cy5saW5lbm/XAA4FiQZXBlgFigWLBlkGWgW9BnEF1QMGBnQAVoEBboEBPIEBdIEBPoCjgQFzXxAc -dmFsdWU6IGFycmFuZ2VkT2JqZWN0cy52YWx1ZV8QFWFycmFuZ2VkT2JqZWN0cy52YWx1ZdcADgWJBlcG -WAWKBYsGWQZaBgIGegXVA/4GfQBWgQFugQFRgQF3gQE+gNiBAXZfEBx2YWx1ZTogYXJyYW5nZWRPYmpl -Y3RzLndoZXJlXxAVYXJyYW5nZWRPYmplY3RzLndoZXJl1wAOBYkGVwZYBYoFiwZZBloFvQaDBoQCugaG -AFaBAW6BATyBAXuBAXqAjYEBeV8QGGNvbnRlbnQ6IGFycmFuZ2VkT2JqZWN0c1djb250ZW50XxAPYXJy -YW5nZWRPYmplY3Rz1wAOBYkGVwZYBYoFiwZZBloFvQaNBdUDBQaQAFaBAW6BATyBAX6BAT6Al4EBfV8Q -H3ZhbHVlOiBhcnJhbmdlZE9iamVjdHMudmFyaWFibGVfEBhhcnJhbmdlZE9iamVjdHMudmFyaWFibGXX -AA4FiQZXBlgFigWLBlkGWgAfBpYGlwYCBpkAVoEBboACgQGCgQGBgQFRgQGAXxATY29udGVudEFycmF5 -OiBzdGFja1xjb250ZW50QXJyYXlVc3RhY2vXAA4FiQZXBlgFigWLBlkGWgYCBqAF1QP8BqMAVoEBboEB -UYEBhYEBPoDQgQGEXxAfdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5maWxlbmFtZV8QGGFycmFuZ2VkT2Jq -ZWN0cy5maWxlbmFtZdcADgWJBlcGWAWKBYsGWQZaBgIGqQXVA/sGrABWgQFugQFRgQGIgQE+gMqBAYdf -EBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmxldmVsXxAVYXJyYW5nZWRPYmplY3RzLmxldmVs0gAOAD4B -JgaxgDyvEDECkANaAJEENwSDAJQAjgCMBJwD/gMFAEED/QKPAqUC0gW9A7UATgPSBsYDBgBZA8UAkAMH -AgkEBAP8AroAjQSKA0QCmwYCAJMCEwJUBE0CfwIKA6oAjwQiAxQCgACSA/sCC4C+gK2ATIDXgQEggF2A -MIAYgOuA2ICXgAeA1ICJgLSAj4EBPIDegGmAxIEBioCjgAuAwoBHgKeAbIDOgNCAjYAigQEegKaAuIEB -UYBWgG6AfIDbgIaAeoDggEKA04CegOeAUYDKgILSAA4AMgAzBuWABIEBi11OU0FwcGxpY2F0aW9u0gAO -AD4BJgbpgDyvEDECfwMHAFkD/QKAAFkAWQBZAoADxQK6AB8DxQJ/Ao8CjwAfApAAQQKQAB8CugBBApAA -WQK6AE4D+wPFAo8AWQKAAwYCjwAfAFkCCQIKA/4CCwBOApAAWQP8AwUCCwBZA8UAToCGgKeAC4DUgOeA -C4ALgAuA54DCgI2AAoDCgIaAiYCJgAKAvoAHgL6AAoCNgAeAvoALgI2AaYDKgMKAiYALgOeAo4CJgAKA -C4BsgHqA2ICCgGmAvoALgNCAl4CCgAuAwoBp0gAOAD4BJgcdgDyvEDICkANaAJEAjgCMAJQEgwQ3BJwD -/gMFAEED/QKPAqUC0gW9A7UATgPSBsYDBgBZA8UAkAMHAgkEBAP8AroAjQSKA0QCmwYCAJMCEwJUBE0C -fwIKA6oAHwCPAxQEIgKAA/sCCwCSgL6ArYBMgDCAGIBdgQEggNeA64DYgJeAB4DUgImAtICPgQE8gN6A -aYDEgQGKgKOAC4DCgEeAp4BsgM6A0ICNgCKBAR6ApoC4gQFRgFaAboB8gNuAhoB6gOCAAoBCgJ6A04Dn -gMqAgoBR0gAOAD4BJgdSgDyvEDIHUwdUB1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdjB2QHZQdm -B2cHaAdpB2oHawdsB20HbgdvB3AHcQdyB3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeBB4IHgweE -gQGPgQGQgQGRgQGSgQGTgQGUgQGVgQGWgQGXgQGYgQGZgQGagQGbgQGcgQGdgQGegQGfgQGggQGhgQGi -gQGjgQGkgQGlgQGmgQGngQGogQGpgQGqgQGrgQGsgQGtgQGugQGvgQGwgQGxgQGygQGzgQG0gQG1gQG2 -gQG3gQG4gQG5gQG6gQG7gQG8gQG9gQG+gQG/gQHAXVNjcm9sbCBWaWV3LTFfEB1UZXh0IEZpZWxkIENl -bGwgKFRleHQgQ2VsbCktNl8QGFRvb2xiYXIgSXRlbSAoUmVjb25uZWN0KV8QGFRvb2xiYXIgSXRlbSAo -Q3VzdG9taXplKV8QElRvb2xiYXIgSXRlbSAoUnVuKV8QGlRvb2xiYXIgU3BhY2UgSXRlbSAoU3BhY2Up -XxATSG9yaXpvbnRhbCBTY3JvbGxlcl8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0xWVRleHQg -Vmlld18QF1RhYmxlIENvbHVtbiAoRnVuY3Rpb24pXxAXVGFibGUgQ29sdW1uIChWYXJpYWJsZSlWV2lu -ZG93XxATVGFibGUgQ29sdW1uIChMaW5lKV1TY3JvbGwgVmlldy0yXxATVmVydGljYWwgU2Nyb2xsZXIt -Ml8QE1RhYmxlIEhlYWRlciBWaWV3LTFfEBNSZWdpc3RlcnNDb250cm9sbGVyXxATVmVydGljYWwgU2Ny -b2xsZXItMVxDb250ZW50IFZpZXdfEBFUYWJsZSBIZWFkZXIgVmlld1tBcHBsaWNhdGlvbl8QFFRhYmxl -IENvbHVtbiAoVmFsdWUpV1Rvb2xiYXJfECRUYWJsZSBWaWV3ICgjLCBGaWxlLCBMaW5lLCBGdW5jdGlv -bilfEBZUb29sYmFyIEl0ZW0gKFN0ZXAgSW4pXxATVGFibGUgQ29sdW1uIChUeXBlKV8QFVN0YXRpYyBU -ZXh0ICg8ZXJyb3I+KV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0zXxATVGFibGUgQ29sdW1u -IChGaWxlKV8QJE91dGxpbmUgVmlldyAoVmFyaWFibGUsIFZhbHVlLCBUeXBlKV8QIlRvb2xiYXIgU2Vw -YXJhdG9yIEl0ZW0gKFNlcGFyYXRvcilfEBFWZXJ0aWNhbCBTY3JvbGxlcl8QHVRleHQgRmllbGQgQ2Vs -bCAoVGV4dCBDZWxsKS01XxAVSG9yaXpvbnRhbCBTY3JvbGxlci0yXxAPU3RhY2tDb250cm9sbGVyXxAs -VG9vbGJhciBGbGV4aWJsZSBTcGFjZSBJdGVtIChGbGV4aWJsZSBTcGFjZSlfEBlUZXh0IEZpZWxkIENl -bGwgKDxlcnJvcj4pXxAaVGV4dCBGaWVsZCBDZWxsICg8c3RhdHVzPilfEBtUZXh0IEZpZWxkIENlbGwg -KFRleHQgQ2VsbClcU3BsaXQgVmlldy0xXxAWU3RhdGljIFRleHQgKDxzdGF0dXM+KV8QFUhvcml6b250 -YWwgU2Nyb2xsZXItMVxGaWxlJ3MgT3duZXJfEBdUb29sYmFyIEl0ZW0gKFN0ZXAgT3V0KV8QHVRleHQg -RmllbGQgQ2VsbCAoVGV4dCBDZWxsKS00XxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTJbU2Ny -b2xsIFZpZXdfEBBUYWJsZSBDb2x1bW4gKCMpWlNwbGl0IFZpZXdfEBhUb29sYmFyIEl0ZW0gKFN0ZXAg -T3ZlcinSAA4APgEmB7mAPKICCwJ/gIKAhtIADgA+ASYHvoA8ogJ4AniAg4CD0gAOAD4BJgfDgDyvEFAC -kAV4A1oFcQWEBXAAkQVzBX8ENwSDAJQAjgCMBJwFeQP+BYIDBQBBBYcD/QKPAqUC0gW9A7UFdQBOBYYD -0gV3BsYFawVsAwYAWQPFBX0AkAMHAgkEBAWDA/wFgAK6AI0EigV0A0QFcgWBApsFbwV8BgIFewCTAhMF -agJUBE0FegJ/BX4CCgOqBW4AHwVtAI8FhQV2BCIDFAKAAJID+wILgL6BAV6ArYEBO4EBfIEBOoBMgQFK -gQFrgNeBASCAXYAwgBiA64EBYIDYgQF1gJeAB4EBhoDUgImAtICPgQE8gN6BAU6AaYEBg4DEgQFcgQGK -gQEvgQExgKOAC4DCgQFngEeAp4BsgM6BAXiA0IEBb4CNgCKBAR6BAUyApoEBSIEBcoC4gQE4gQFlgQFR -gQFjgFaAboEBLIB8gNuBAWKAhoEBaYB6gOCBATWAAoEBM4BCgQF/gQFQgNOAnoDngFGAyoCC0gAOAD4B -JggWgDyvEFAIFwgYCBkIGggbCBwIHQgeCB8IIAghCCIIIwgkCCUIJggnCCgIKQgqCCsILAgtCC4ILwgw -CDEIMggzCDQINQg2CDcIOAg5CDoIOwg8CD0IPgg/CEAIQQhCCEMIRAhFCEYIRwhICEkISghLCEwITQhO -CE8IUAhRCFIIUwhUCFUIVghXCFgIWQhaCFsIXAhdCF4IXwhgCGEIYghjCGQIZQhmgQHFgQHGgQHHgQHI -gQHJgQHKgQHLgQHMgQHNgQHOgQHPgQHQgQHRgQHSgQHTgQHUgQHVgQHWgQHXgQHYgQHZgQHagQHbgQHc -gQHdgQHegQHfgQHggQHhgQHigQHjgQHkgQHlgQHmgQHngQHogQHpgQHqgQHrgQHsgQHtgQHugQHvgQHw -gQHxgQHygQHzgQH0gQH1gQH2gQH3gQH4gQH5gQH6gQH7gQH8gQH9gQH+gQH/gQIAgQIBgQICgQIDgQIE -gQIFgQIGgQIHgQIIgQIJgQIKgQILgQIMgQINgQIOgQIPgQIQgQIRgQISgQITgQIUEQHnEQHKEJAQShA1 -EQHhEQHmEFMRAc0RAdARAdwRAd4RAeAQGBCpEDAQMRAOEAcQKBAqEAsRAdERAdMQOxEB1BEBDRAIECwR -Ae8RASYT//////////0QGhEBvhANEQHXEQHqEQHfEFEQFhEByxBFEBIQLRAMEQHaEQHPEQHlEQHIEQHp -EEYRAdIQ9BEB6xAkEQHsEQHdEQHFEFQRAccRAc4QXBAuEQHoEBsRAdURAeQRAfARAe0RAeMQJhB3EQHM -EQHJEBcRAeIQEREB7tIADgA+ASIIt4A9oNIADgA+ASYIuoA8oNIADgA+ASYIvYA8oNIANwA4CL8IwKII -wAA7Xk5TSUJPYmplY3REYXRhAAgAGQAiACcAMQA6AD8ARABSAFQAZgScBKIE7QT0BPsFCQUbBTcFRQVR -BV0FawV2BYQFoAWuBcEF0wXtBfcGBAYGBgkGDAYPBhIGFQYYBhoGHQYgBiMGJgYoBioGLQYwBjMGNgY/ -BksGTQZPBmoGcwZ8BocGjAabBqQGtwbABssGzQbQBtIHAwcQBx0HKwc1B0MHUAdaB2wHgAeKB5YHmAeb -B54HoAelB6cHqQesB64HsAezB7UH0AfxB/oILwhJCGsIhQinCLsI2AjsCQgJKwlICV8JdQl3CXkJegl8 -CX0JfwmBCYMJhAmFCYcJiQmSCZwJngnFCc4J1QnnCfAJ/QoFCgcKGgocCh4KIAoiCiQKJgooCioKLAo/ -CkEKQwpFCkcKSQpLCk0KTwpRCngKkQqxCtgK/wsmC00Lagt/C8IL5Av4DA8MJQxADFYMcwyNDKkMwAzT -DOoNAQ0WDSsNLQ0vDTENMg00DTUNNw04DToNPA0+DUcNSQ1LDU0NTw1YDVoNXg1fDWwNew19DX8NgQ2J -DZENmg2fDbINuQ3CDccN1Q4cDkIORA5GDkgOSQ5LDkwOTg5PDlEOUw5VDlcOWQ5bDl0OZw5vDnoOnw6n -DrsOyQ7UDuEO7w75DwYPCA8KDw8PEA8SDxMPGA8aDxwPKQ8rDy0PLw9BD04PUA9SD1QPZw9wD3UPgA+J -D5AP0w/VD9cP2A/aD9sP3Q/eD+AP4g/kD+YP6A/qD+wP9hAKEB8QJhAzEDoQQhBEEEYQSxBNEE8QWBBh -EGMQZhBoEHEQcxB4EHoQfBCFEJwQnhCgIV4hZyFuIYEhjCGVIZohoiGrIbIhwSHOIdsh4yHlIech7CH1 -IfoiAyIIIioibSJvInEiciJ0InUidyJ4InoifCJ+IoAigiKEIoYijyKRIpoipyKpIqsirSK5Ivwi/iMA -IwEjAyMEIwYjByMJIwsjDSMPIxEjEyMVIx4jICMoIzUjNyM5IzsjRiOJI4sjjSOOI5AjkSOTI5QjliOY -I5ojnCOeI6AjoiOrI60jtyPEI8YjyCPKI9gkGyQdJB8kICQiJCMkJSQmJCgkKiQsJC4kMCQyJDQkPSQ/ -JEkkViRYJFokXCRpJLAksiS0JLYktyS5JLokvCS9JL8kwSTDJMUkxyTJJMsk2iThJO0lEiUUJRYlFyUZ -JRolHCUeJSclLiV1JXcleSV7JXwlfiV/JYElgiWEJYYliCWKJYwljiWQJZYlniXDJcUlxyXIJcolyyXN -Jc8l2CXfJegl7yYFJhImGyYdJjAmMiY0JjYmOCY6JjwmPiZAJkImSyZNJlwmXiZgJmImZCZmJmgmaiZz -JnUmdiZ/JoQmjiarJr0myCbRJt0m6SbrJu4m8CbzJvYm+Cb7JwQnBicNJw8nEScTJzQnPCdDJ00nTydR -J1MnVSdeJ18nYSdjJ3snnCeoJ7wnxyfRJ98n7Cf4J/0n/ygBKAMoBSgHKAwoDigWKCcoLig3KDkoQihE -KEcoVChdKGIoaSh+KIoomCiaKJwoniigKKIoqSi2KMMoxSjRKN4o5CjmKO0o9ij/KREpHiknKTIpPilI -KU8pWyl8KX4pgCmCKYQphymIKYopjCmiKcMpxSnHKckpyynNKc8p2CnpKesp7SnvKgQqBioIKgoqDCof -KiwqLioxKlYqbCpuKnAqcyp1Kncqeip8Kn4qgCqMKpgqoSqjKqgqqiqsKtUq4irkKuYq6CrqKuwq7irw -KvIq8yr8Kv4rAysFKwcrRitSK1sraCt7K4grlCuiK7Arsiu0K7YruSu7K70rvyvSK9Qr1ivYK9or3Cve -K+cr6Sv0K/Yr+Cv6K/wr/iwrLDUsPyxJLEssTSxPLFEsUyxWLFgsWixcLF4sYCxpLGssbixwLMMs5Szv -LPwtES0rLUctYi1uLY0tnC2oLaotrC2xLbMttS22LbgtwS3KLc0tzy3QLdIt1C3WLdgt4S3sLgkuFS4X -LhkuGy4dLh8uIS5OLlAuUi5ULlYuWC5aLlwuXi5gLmoucy58LpAuqS6rLq0ury64LrouvC7TLtwu5S7z -Lvwu/i8FLwcvCS8LLzAvPy9ML1QvXy9uL3kvhC+FL4cviS+SL5QvnS+mL6gvxS/KL8wvzi/QL9Iv1C/d -L+ov7C/4MA0wDzARMBMwFTAnMDAwOzBPMHAwdTB3MHkwezB9MH8wgjCEMI4wozClMKcwqTCrMMQwzTDS -MOAxBTEGMQgxCjETMRUxHjEgMT0xPzFBMUMxRTFHMU0xbjFwMXIxdDF2MXgxejGfMaAxojGkMa0xrzG4 -Mbox1zHZMdsx3THfMeEx5jH7Mf0x/zIBMgMyDzIcMh4yITJCMkQyRjJIMkoyTDJOMmMyZTJnMmkyazJ1 -MoIyhDKJMpIynzKtMsUyzjLXMuIzBzMQMxkzIzMlMyczKTMrMy0zLzMxMzozUTNeM2czcjN9M6YzqDOq -M6wzrjOwM7IztDO9M9Uz3jPgM+Mz5TP7NAY0DzQYNCU0ZDRmNGg0ajRsNG80cTRzNHU0iDSLNI00jzSR -NJM0lTSeNKA0qzStNK80sTSzNLU04jTkNOY06DTqNOw07jTwNPI09DT9NP81AjUENVc1WTVbNWA1YjVk -NWU1ZzVqNWw1bTVvNXE1czV1NX41iTWmNag1qjWsNa41sDWyNd814TXjNeU15zXpNes17TXvNfE1+zYU -NhY2GDYaNhw2HjY1Nj42QDZJNks2TTZPNlE2djZ3Nnk2ezaENoY2jzaYNpo2tza5Nrs2vTa/NsE2wzbQ -NtI28zb1Nvc2+Tb7Nv02/zcQNxI3GzcdNyA3RTdGN0g3SjdTN1U3Vzd0N3Y3eDd6N3w3fjeDN6Q3pjeo -N6o3rDeuN7A31TfWN9g32jfjN+U37jfwOA04DzgROBM4FTgXOBw4PTg/OEE4QzhFOEc4SThuOG84cThz -OHw4fjiHOIk4pjioOKo4rDiuOLA4uTjaONw43jjgOOI45DjmOO84+jkSOTs5PTk/OUE5QzlEOUY5SDlK -OVM5bDmZOZs5nTmfOaE5ojmkOaY5qDmxOck50jnUOdc52TnvOgg6EzocOiE6MDphOmM6ZjpoOms6bjpw -OnI6dDp3Onk6ezqEOoY6jTqPOpI6lTrKOtM63DreOuA64zrmOuk66zrtOu868TrzOvU6/jsAOwM7BTs6 -O0w7VjtjO287eDuDO4U7iDuKO407kDuSO5U7mDuaO507nzuhO6o7rDvRO9M71TvXO9k72zvdO9874Tvj -O+U75zvpO+s77TvvO/E78zwPPCQ8QTxiPH48pDzKPOg9BD0gPT09VT1vPaM9wD3cPgk+Ej4ZPiY+LD5E -Plk+Yz5uPoA+gz6FPo4+kT6mPrk+xz7RPtQ+1z7aPtw+6T7sPu8+8T76Pvw/BT8OPyo/Pz9IP0o/TT9Q -P1k/Xj9nP2w/jT+VP68/wj/ZP+5AAUAEQAdACUALQA1AEEASQBVAIkAlQCpALUAwQDVAOEA7QFBAUkBU -QFdAWUB3QIxAjkCQQJNAlUCpQLJAt0DEQMdAzEDPQNJA10DaQN1A6UD2QPhA/0EIQQ1BJEExQTlBQkFN -QVRBa0GEQZFBm0GoQatBrkG2Qb9BxEHpQfRB9kH4QfpB/UH/QgFCA0IMQiRCUUJTQlVCV0JaQlxCXkJg -QmlChEKdQrZCwULKQtFC6UL0QxFDGkMfQzJDO0M9Q3xDf0OCQ4VDiEOLQ45DkUOUQ5dDmkOdQ6BDo0Om -Q6lDrEOvQ7JDtUO4Q7tDvkPBQ8RDx0PKQ81D0EPTQ9ZD50P1Q/5EBkQJRAtEDUQQRBlEIkQpREBET0Rg -RGNEZURnRGpEcUSCRIVEh0SJRIxElkSnRKpErESuRLFEw0TURNdE2UTbRN5E5kTvRPZFDkUfRSJFJEUm -RSlFMkVDRUZFSEVKRU1FXkVhRWRFZkVpRY5FpUW3RctF2kXxRgxGJ0ZARkNGREZHRkpGTUZQRlFGVEZV -Rl5GYEZnRmpGbUZwRnZGf0aERpFGlkaZRqJGp0awRrdGwEbJRtxG8Ub+RxNHJEcnRylHK0cuRztHTEdP -R1FHU0dWR2BHcUd0R3ZHeEd7R4RHlUeYR5pHnEefR6xHvUfAR8NHxUfIR+1ICkgVSDpIO0g+SD9IQkhD -SEZIR0hISElIUkhUSGFIZEhnSGpIbUhwSHNIeUiCSIlIj0iYSK9ItEi3SMBIyUjdSO9JAEkDSQVJB0kK -SSFJMkk1STdJOUk8SUFJUklVSVdJWUlcSWlJekl9SX9JgUmESZVJmEmaSZxJn0mpSbpJvUm/ScFJxEnT -SeRJ50npSetJ7kn8Sg1KEEoSShRKF0oiSj9KSUpTSnJKdUp4SntKfkqASoNKoUq4SsFKyErgSv1LAEsD -SwZLCUsLSw5LLktHS2RLZ0tqS21LcEtyS3VLlEusS8lLzEvPS9JL1UvXS9pL+UwRTC5MMUw0TDdMOkw8 -TD9MWkxiTHRMkUyUTJdMmkydTJ9MokzETN9M/Ez/TQFNBE0HTQpNDU0jTTBNNk1TTVZNWU1cTV9NYU1k -TYZNoU2+TcFNxE3HTcpNzE3PTe5OBk4PThFOdk54TnpOfE5+ToFOg06FTodOiU6LTo1Oj06RTpNOlU6X -TppOnE6eTqBOo06lTqdOqU6rTq1Or06xTrNOtU63TrpOvE6+TsFOw07FTsdOyU7LTs1Oz07RTtNO1U7X -TtlO207dTuZO6E7rTvlPAk8ET2lPa09tT29PcU9zT3VPd095T3tPfU9/T4FPg0+FT4dPiU+LT41Pj0+R -T5NPlU+XT5lPm0+dT59PoU+jT6VPp0+pT6tPrU+vT7FPs0+1T7dPuU+7T71Pv0/BT8NPxU/HT8lPy0/U -T9ZQPVA/UEFQQ1BFUEdQSVBMUE5QUFBSUFRQVlBYUFpQXFBeUGFQY1BlUGdQalBsUG5QcFByUHRQdlB4 -UHpQfFB+UIFQg1CFUIhQilCMUI5QkFCSUJRQllCYUJpQnFCeUKBQolCkUKZQr1CxURhRG1EeUSFRJFEn -USpRLVEwUTNRNlE5UTxRP1FCUUVRSFFLUU5RUVFUUVdRWlFdUWBRY1FmUWlRbFFvUXJRdVF4UXtRflGB -UYRRh1GKUY1RkFGTUZZRmVGcUZ9RolGlUahRq1GuUbxR3FH3UhJSJ1JEUlpSelKEUp5SuFK/UtVS41L5 -Uw9TJVM7U0hTXFNoU39Th1OuU8dT3VP1VBVUK1RSVHdUi1SrVMNU1VUEVSBVPVVbVWhVgVWZVaZVwFXg -VgBWDFYfVipWRVZOVlBWVVZXVllWYlZkVmlWa1ZtVnZWeFcbVx1XIFciVyVXKFcrVy1XMFczVzVXOFc6 -VzxXPldAV0NXRVdIV0pXTFdPV1FXU1dVV1dXWldcV19XYVdkV2ZXaVdsV29Xcld0V3ZXeFd7V31Xf1eB -V4NXhleIV4tXjVePV5JXlVeXV5pXnVefV6JXpVeoV6tXrVevV7JXtFe2V7lXu1e+V8BXwlfFV8dXylfM -V89X0lfUV9ZX2FfaV9xX3lfnV+lYjFiPWJJYlViYWJtYnlihWKRYp1iqWK1YsFizWLZYuVi8WL9YwljF -WMhYy1jOWNFY1FjXWNpY3VjgWONY5ljpWOxY71jyWPVY+Fj7WP5ZAVkEWQdZClkNWRBZE1kWWRlZHFkf -WSJZJVkoWStZLlkxWTRZN1k6WT1ZQFlDWUZZSVlMWU9ZUllVWVhZW1leWWFZZFlnWWpZbVlwWXNZdll5 -WXxZf1mCWYRZhlmIWYtZjlmQWZNZllmZWZxZn1mhWaNZpVmnWalZq1mtWa9ZsVm0WbdZuVm8Wb9ZwVnD -WcZZyVnSWdRZ11nZWdxZ31niWeRZ5lnpWetZ7VnvWfFZ9Fn3WfpZ/VoAWgJaBVoHWgpaDFoPWhJaFVoX -WhpaHVofWiFaJFomWilaLFovWjJaNVo3WjlaPFo/WkFaRFpGWklaUlpUWlVaXlpgWmFaalpsWm1adlp7 -AAAAAAAAAgIAAAAAAAAIwQAAAAAAAAAAAAAAAAAAWoo - diff --git a/MacGDBp.xcodeproj/project.pbxproj b/MacGDBp.xcodeproj/project.pbxproj index a37452c..dfc62d6 100644 --- a/MacGDBp.xcodeproj/project.pbxproj +++ b/MacGDBp.xcodeproj/project.pbxproj @@ -18,6 +18,9 @@ 1E35FEA10C6599040030F527 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E35FEA00C6599040030F527 /* base64.c */; }; 1E416FF80D36F821009A53A2 /* Connect.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1E416FF40D36F821009A53A2 /* Connect.xib */; }; 1E416FF90D36F821009A53A2 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1E416FF60D36F821009A53A2 /* MainMenu.xib */; }; + 1E7188680D839F6300969277 /* BSLineNumberView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E7188630D839F6300969277 /* BSLineNumberView.m */; }; + 1E7188690D839F6300969277 /* BSSourceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E7188650D839F6300969277 /* BSSourceView.m */; }; + 1E71886A0D839F6300969277 /* BSSourceViewTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E7188670D839F6300969277 /* BSSourceViewTextView.m */; }; 1EEBFBE50D34C793008F835B /* Debugger.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1EEBFBE30D34C793008F835B /* Debugger.xib */; }; 1EEBFC2B0D358EBD008F835B /* StepIn.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EEBFC2A0D358EBD008F835B /* StepIn.png */; }; 1EEBFC370D358F1B008F835B /* StepOut.png in Resources */ = {isa = PBXBuildFile; fileRef = 1EEBFC360D358F1B008F835B /* StepOut.png */; }; @@ -50,6 +53,12 @@ 1E35FFB00C65A74C0030F527 /* NSXMLElementAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NSXMLElementAdditions.h; path = Source/NSXMLElementAdditions.h; sourceTree = ""; }; 1E416FF50D36F821009A53A2 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/Connect.xib; sourceTree = ""; }; 1E416FF70D36F821009A53A2 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; }; + 1E7188620D839F6300969277 /* BSLineNumberView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BSLineNumberView.h; path = Source/BSLineNumberView.h; sourceTree = ""; }; + 1E7188630D839F6300969277 /* BSLineNumberView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BSLineNumberView.m; path = Source/BSLineNumberView.m; sourceTree = ""; }; + 1E7188640D839F6300969277 /* BSSourceView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BSSourceView.h; path = Source/BSSourceView.h; sourceTree = ""; }; + 1E7188650D839F6300969277 /* BSSourceView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BSSourceView.m; path = Source/BSSourceView.m; sourceTree = ""; }; + 1E7188660D839F6300969277 /* BSSourceViewTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BSSourceViewTextView.h; path = Source/BSSourceViewTextView.h; sourceTree = ""; }; + 1E7188670D839F6300969277 /* BSSourceViewTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BSSourceViewTextView.m; path = Source/BSSourceViewTextView.m; sourceTree = ""; }; 1EEBFBE40D34C793008F835B /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/Debugger.xib; sourceTree = ""; }; 1EEBFC2A0D358EBD008F835B /* StepIn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = StepIn.png; path = Icons/StepIn.png; sourceTree = ""; }; 1EEBFC360D358F1B008F835B /* StepOut.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = StepOut.png; path = Icons/StepOut.png; sourceTree = ""; }; @@ -95,6 +104,7 @@ 1E35FC750C6579CA0030F527 /* NSXMLElementAdditions.m */, 1EEBFD080D3599E8008F835B /* BSSplitView.h */, 1EEBFD070D3599E8008F835B /* BSSplitView.m */, + 1E71886C0D839F6C00969277 /* Source View */, ); name = Classes; sourceTree = ""; @@ -147,6 +157,19 @@ name = Interfaces; sourceTree = ""; }; + 1E71886C0D839F6C00969277 /* Source View */ = { + isa = PBXGroup; + children = ( + 1E7188620D839F6300969277 /* BSLineNumberView.h */, + 1E7188630D839F6300969277 /* BSLineNumberView.m */, + 1E7188640D839F6300969277 /* BSSourceView.h */, + 1E7188650D839F6300969277 /* BSSourceView.m */, + 1E7188660D839F6300969277 /* BSSourceViewTextView.h */, + 1E7188670D839F6300969277 /* BSSourceViewTextView.m */, + ); + name = "Source View"; + sourceTree = ""; + }; 29B97314FDCFA39411CA2CEA /* MacGDBp */ = { isa = PBXGroup; children = ( @@ -280,6 +303,9 @@ 1E35FC760C6579CA0030F527 /* NSXMLElementAdditions.m in Sources */, 1E35FEA10C6599040030F527 /* base64.c in Sources */, 1EEBFD090D3599E8008F835B /* BSSplitView.m in Sources */, + 1E7188680D839F6300969277 /* BSLineNumberView.m in Sources */, + 1E7188690D839F6300969277 /* BSSourceView.m in Sources */, + 1E71886A0D839F6300969277 /* BSSourceViewTextView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Source/BSLineNumberView.h b/Source/BSLineNumberView.h new file mode 100644 index 0000000..b61aa2e --- /dev/null +++ b/Source/BSLineNumberView.h @@ -0,0 +1,28 @@ +/* + * MacGDBp + * Copyright (c) 2007 - 2008, Blue Static + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#import + +@class BSSourceView; + +@interface BSLineNumberView : NSView +{ + BSSourceView *sourceView; +} + +@property(readwrite, assign) BSSourceView *sourceView; + +@end diff --git a/Source/BSLineNumberView.m b/Source/BSLineNumberView.m new file mode 100644 index 0000000..27f75f1 --- /dev/null +++ b/Source/BSLineNumberView.m @@ -0,0 +1,79 @@ +/* + * MacGDBp + * Copyright (c) 2007 - 2008, Blue Static + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#import "BSLineNumberView.h" + + +@implementation BSLineNumberView + +@synthesize sourceView; + +/** + * Initializer for the line number view + */ +- (id)initWithFrame:(NSRect)frame +{ + if (self = [super initWithFrame:frame]) + { + + } + return self; +} + +/** + * Flip the coordinates + */ +- (BOOL)isFlipped +{ + return YES; +} + +/** + * Draws the line numbers whenever necessary + */ +- (void)drawRect:(NSRect)rect +{ + // background color + [[NSColor colorWithDeviceRed:0.871 green:0.871 blue:0.871 alpha:1] set]; + [NSBezierPath fillRect:rect]; + + // font attributes for the line number + NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:[NSFont fontWithName:@"Monaco" size:10.0], NSFontAttributeName, [NSColor grayColor], NSForegroundColorAttributeName, nil]; + + unsigned i = 0, line = 1; + while (i < [[[sourceView textView] layoutManager] numberOfGlyphs]) + { + NSRange fragRange; + NSRect fragRect = [self convertRect:[[[sourceView textView] layoutManager] lineFragmentRectForGlyphAtIndex:i effectiveRange:&fragRange] fromView:[sourceView textView]]; + fragRect.origin.x = rect.origin.x; // horizontal scrolling matters not + + // we want to paint the top and bottom line number even if they're cut off + NSRect testRect = rect; + testRect.origin.y -= fragRect.size.height - 1; + testRect.size.height += fragRect.size.height - 1; + if (NSPointInRect(fragRect.origin, testRect)) + { + NSString *num = [NSString stringWithFormat:@"%u", line]; + NSSize strSize = [num sizeWithAttributes:attrs]; + [num drawAtPoint:NSMakePoint([self frame].size.width - strSize.width - 3, fragRect.origin.y) withAttributes:attrs]; + } + + i += fragRange.length; + line++; + } +} + +@end diff --git a/Source/BSSourceView.h b/Source/BSSourceView.h new file mode 100644 index 0000000..3a44765 --- /dev/null +++ b/Source/BSSourceView.h @@ -0,0 +1,32 @@ +/* + * MacGDBp + * Copyright (c) 2007 - 2008, Blue Static + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#import +#import "BSLineNumberView.h" +#import "BSSourceViewTextView.h" + +@interface BSSourceView : NSView +{ + BSLineNumberView *numberView; + BSSourceViewTextView *textView; + NSScrollView *scrollView; +} + +@property(readwrite, assign) BSLineNumberView *numberView; +@property(readwrite, assign) BSSourceViewTextView *textView; +@property(readwrite, assign) NSScrollView *scrollView; + +@end diff --git a/Source/BSSourceView.m b/Source/BSSourceView.m new file mode 100644 index 0000000..be5a15a --- /dev/null +++ b/Source/BSSourceView.m @@ -0,0 +1,94 @@ +/* + * MacGDBp + * Copyright (c) 2007 - 2008, Blue Static + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#import "BSSourceView.h" + +@interface BSSourceView (Private) +- (void)setupViews; +@end + +@implementation BSSourceView + +@synthesize numberView, textView, scrollView; + +/** + * Initializes the source view with the path of a file + */ +- (id)initWithFrame:(NSRect)frame +{ + if (self = [super initWithFrame:frame]) + { + [self setupViews]; + } + return self; +} + +/** + * Flip the coordinates + */ +- (BOOL)isFlipped +{ + return YES; +} + +/** + * Setup all the subviews for the source metaview + */ +- (void)setupViews +{ + int gutterWidth = 30; + + // setup the line number view + NSRect numberFrame = [self bounds]; + numberFrame.origin = NSMakePoint(0.0, 0.0); + numberFrame.size.width = gutterWidth; + numberView = [[BSLineNumberView alloc] initWithFrame:numberFrame]; + [numberView setAutoresizingMask:NSViewHeightSizable]; + [numberView setSourceView:self]; + [self addSubview:numberView]; + + // create the scroll view + NSRect scrollFrame = [self bounds]; + scrollFrame.origin.x = gutterWidth; + scrollFrame.size.width = scrollFrame.size.width - gutterWidth; + scrollView = [[NSScrollView alloc] initWithFrame:scrollFrame]; + [scrollView setHasHorizontalScroller:YES]; + [scrollView setHasVerticalScroller:YES]; + [scrollView setBorderType:NSBezelBorder]; + [scrollView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; + [[scrollView contentView] setAutoresizesSubviews:YES]; + [self addSubview:scrollView]; + + // add the text view to the scroll view + NSRect textFrame; + textFrame.origin = NSMakePoint(0.0, 0.0); + textFrame.size = [scrollView contentSize]; + textView = [[BSSourceViewTextView alloc] initWithFrame:textFrame]; + [textView setSourceView:self]; + [textView setEditable:NO]; + [textView setFont:[NSFont fontWithName:@"Monaco" size:10.0]]; + [textView setHorizontallyResizable:YES]; + [textView setVerticallyResizable:YES]; + [textView setMinSize:textFrame.size]; + [textView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)]; + [[textView textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)]; + [[textView textContainer] setWidthTracksTextView:NO]; + [[textView textContainer] setHeightTracksTextView:NO]; + [textView setAutoresizingMask:NSViewNotSizable]; + [scrollView setDocumentView:textView]; +} + +@end diff --git a/Source/BSSourceViewTextView.h b/Source/BSSourceViewTextView.h new file mode 100644 index 0000000..69e6bd9 --- /dev/null +++ b/Source/BSSourceViewTextView.h @@ -0,0 +1,28 @@ +/* + * MacGDBp + * Copyright (c) 2007 - 2008, Blue Static + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#import + +@class BSSourceView; + +@interface BSSourceViewTextView : NSTextView +{ + BSSourceView *sourceView; +} + +@property(readwrite, assign) BSSourceView *sourceView; + +@end diff --git a/Source/BSSourceViewTextView.m b/Source/BSSourceViewTextView.m new file mode 100644 index 0000000..76d5a85 --- /dev/null +++ b/Source/BSSourceViewTextView.m @@ -0,0 +1,33 @@ +/* + * MacGDBp + * Copyright (c) 2007 - 2008, Blue Static + * + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program; if not, + * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#import "BSSourceViewTextView.h" +#import "BSSourceView.h" + +@implementation BSSourceViewTextView + +@synthesize sourceView; + +/** + * Override -[drawRect:] so we can tell the line numbers to draw + */ +- (void)drawRect:(NSRect)rect +{ + [super drawRect:rect]; + [[sourceView numberView] setNeedsDisplay:YES]; +} + +@end diff --git a/Source/DebuggerWindowController.h b/Source/DebuggerWindowController.h index 20c48b5..50709f9 100644 --- a/Source/DebuggerWindowController.h +++ b/Source/DebuggerWindowController.h @@ -15,6 +15,7 @@ */ #import +#import "BSSourceView.h" @class DebuggerConnection; @@ -32,8 +33,7 @@ IBOutlet NSTextField *statusmsg; IBOutlet NSTextField *errormsg; - IBOutlet NSTextView *sourceViewer; - IBOutlet NSScrollView *sourceViewerScroller; + IBOutlet BSSourceView *sourceViewer; IBOutlet NSToolbarItem *stepInButton; IBOutlet NSToolbarItem *stepOutButton; diff --git a/Source/DebuggerWindowController.m b/Source/DebuggerWindowController.m index a0b19be..f3d76dd 100644 --- a/Source/DebuggerWindowController.m +++ b/Source/DebuggerWindowController.m @@ -48,15 +48,6 @@ */ - (void)awakeFromNib { - // set up the scroller for the source viewer - [sourceViewer setEditable:NO]; - [sourceViewer setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)]; - [[sourceViewer textContainer] setContainerSize:NSMakeSize(FLT_MAX, FLT_MAX)]; - [[sourceViewer textContainer] setWidthTracksTextView:NO]; - [sourceViewer setHorizontallyResizable:YES]; - [sourceViewerScroller setHasHorizontalScroller:YES]; - [sourceViewerScroller display]; - [self setStatus:@"Connecting"]; } @@ -75,7 +66,7 @@ { [registerController setContent:nil]; [stackController setContent:nil]; - [sourceViewer setString:@""]; + [[sourceViewer textView] setString:@""]; } /** @@ -217,7 +208,7 @@ id selectedLevel = [[stackController selection] valueForKey:@"level"]; if (selectedLevel == NSNoSelectionMarker) { - [sourceViewer setString:@""]; + [[sourceViewer textView] setString:@""]; return; } int selection = [selectedLevel intValue]; @@ -226,7 +217,7 @@ NSString *filename = [[stack objectAtIndex:selection] valueForKey:@"filename"]; filename = [[NSURL URLWithString:filename] path]; NSString *text = [NSString stringWithContentsOfFile:filename]; - [sourceViewer setString:text]; + [[sourceViewer textView] setString:text]; // go through the document until we find the NSRange for the line we want int destination = [[[stack objectAtIndex:selection] valueForKey:@"lineno"] intValue]; @@ -242,13 +233,13 @@ NSRange lineRange = NSMakeRange(lineStart, lineEnd - lineStart); // colorize it so the user knows which line we're on in the stack - [[sourceViewer textStorage] setAttributes:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSColor redColor], [NSColor yellowColor], nil] - forKeys:[NSArray arrayWithObjects:NSForegroundColorAttributeName, NSBackgroundColorAttributeName, nil]] - range:lineRange]; - [sourceViewer scrollRangeToVisible:[text lineRangeForRange:NSMakeRange(lineStart, lineEnd - lineStart)]]; + [[[sourceViewer textView] textStorage] setAttributes:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[NSColor redColor], [NSColor yellowColor], nil] + forKeys:[NSArray arrayWithObjects:NSForegroundColorAttributeName, NSBackgroundColorAttributeName, nil]] + range:lineRange]; + [[sourceViewer textView] scrollRangeToVisible:[text lineRangeForRange:NSMakeRange(lineStart, lineEnd - lineStart)]]; // make sure the font stays Monaco - [sourceViewer setFont:[NSFont fontWithName:@"Monaco" size:10.0]]; + //[sourceViewer setFont:[NSFont fontWithName:@"Monaco" size:10.0]]; } /** -- 2.22.5