From eefe74858762cfeb91b87a8681f80b9917d30b29 Mon Sep 17 00:00:00 2001 From: Gregory John Casamento Date: Sun, 28 Dec 2008 07:19:45 +0000 Subject: [PATCH] * Framework/PCEditorManager.m: Remove log. * Modules/Debuggers/ProjectCenter/GNUmakefile: Added new images to resource list. * Modules/Debuggers/ProjectCenter/PCDebugger.[hm]: Added setStatus: method to manage status field. * Modules/Debuggers/ProjectCenter/PCDebuggerView.m: Added code to handle the toolbar. * Modules/Debuggers/ProjectCenter/PTYView.[hm]: Added method called "terminate" so that subclasses can override how the process is terminated. * Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm: Added status line. * Modules/Debuggers/ProjectCenter/Resources/go_button.png * Modules/Debuggers/ProjectCenter/Resources/next_button.png * Modules/Debuggers/ProjectCenter/Resources/pause_button.png * Modules/Debuggers/ProjectCenter/Resources/restart_button.png * Modules/Debuggers/ProjectCenter/Resources/stepin_button.png * Modules/Debuggers/ProjectCenter/Resources/stepout_button.png: Images for debugger toolbar. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/projectcenter/trunk@27440 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 22 ++ Framework/PCEditorManager.m | 2 +- Modules/Debuggers/ProjectCenter/GNUmakefile | 9 +- Modules/Debuggers/ProjectCenter/PCDebugger.h | 7 +- Modules/Debuggers/ProjectCenter/PCDebugger.m | 197 ++++++++++++++++++ .../Debuggers/ProjectCenter/PCDebuggerView.m | 66 ++++-- Modules/Debuggers/ProjectCenter/PTYView.h | 2 + Modules/Debuggers/ProjectCenter/PTYView.m | 12 +- .../Resources/PCDebugger.gorm/data.classes | 3 +- .../Resources/PCDebugger.gorm/data.info | Bin 184 -> 184 bytes .../Resources/PCDebugger.gorm/objects.gorm | Bin 2260 -> 3122 bytes .../ProjectCenter/Resources/go_button.png | Bin 0 -> 757 bytes .../ProjectCenter/Resources/next_button.png | Bin 0 -> 545 bytes .../ProjectCenter/Resources/pause_button.png | Bin 0 -> 495 bytes .../Resources/restart_button.png | Bin 0 -> 1032 bytes .../ProjectCenter/Resources/stepin_button.png | Bin 0 -> 535 bytes .../Resources/stepout_button.png | Bin 0 -> 537 bytes 17 files changed, 297 insertions(+), 23 deletions(-) create mode 100644 Modules/Debuggers/ProjectCenter/Resources/go_button.png create mode 100644 Modules/Debuggers/ProjectCenter/Resources/next_button.png create mode 100644 Modules/Debuggers/ProjectCenter/Resources/pause_button.png create mode 100644 Modules/Debuggers/ProjectCenter/Resources/restart_button.png create mode 100644 Modules/Debuggers/ProjectCenter/Resources/stepin_button.png create mode 100644 Modules/Debuggers/ProjectCenter/Resources/stepout_button.png diff --git a/ChangeLog b/ChangeLog index 45ec92f..045e9cc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,25 @@ +2008-12-28 02:23-EST Gregory John Casamento + + * Framework/PCEditorManager.m: Remove log. + * Modules/Debuggers/ProjectCenter/GNUmakefile: Added new images + to resource list. + * Modules/Debuggers/ProjectCenter/PCDebugger.[hm]: Added setStatus: + method to manage status field. + * Modules/Debuggers/ProjectCenter/PCDebuggerView.m: Added code + to handle the toolbar. + * Modules/Debuggers/ProjectCenter/PTYView.[hm]: Added method called + "terminate" so that subclasses can override how the process is + terminated. + * Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm: Added + status line. + * Modules/Debuggers/ProjectCenter/Resources/go_button.png + * Modules/Debuggers/ProjectCenter/Resources/next_button.png + * Modules/Debuggers/ProjectCenter/Resources/pause_button.png + * Modules/Debuggers/ProjectCenter/Resources/restart_button.png + * Modules/Debuggers/ProjectCenter/Resources/stepin_button.png + * Modules/Debuggers/ProjectCenter/Resources/stepout_button.png: + Images for debugger toolbar. + 2008-12-27 00:47-EST Gregory John Casamento * Framework/PCEditorManager.m: Changed code to use the filePath diff --git a/Framework/PCEditorManager.m b/Framework/PCEditorManager.m index 068c396..75628cb 100644 --- a/Framework/PCEditorManager.m +++ b/Framework/PCEditorManager.m @@ -398,7 +398,7 @@ NSString *PCEditorDidResignActiveNotification = editable: YES windowed: NO]; [editor scrollToLineNumber: [line intValue]]; - NSLog(@"object = %@", [aNotif object]); + // NSLog(@"object = %@", [aNotif object]); } @end diff --git a/Modules/Debuggers/ProjectCenter/GNUmakefile b/Modules/Debuggers/ProjectCenter/GNUmakefile index fae6769..661aad0 100644 --- a/Modules/Debuggers/ProjectCenter/GNUmakefile +++ b/Modules/Debuggers/ProjectCenter/GNUmakefile @@ -21,7 +21,14 @@ ProjectCenter_LIBRARIES_DEPEND_UPON += # ProjectCenter_RESOURCE_FILES= \ Resources/PCDebugger.gorm \ - Resources/Info.table + Resources/Info.table \ + Resources/go_button.png \ + Resources/pause_button.png \ + Resources/restart_button.png \ + Resources/next_button.png \ + Resources/stepin_button.png \ + Resources/stepout_button.png + # # Header files # diff --git a/Modules/Debuggers/ProjectCenter/PCDebugger.h b/Modules/Debuggers/ProjectCenter/PCDebugger.h index a85abcf..1d583fc 100644 --- a/Modules/Debuggers/ProjectCenter/PCDebugger.h +++ b/Modules/Debuggers/ProjectCenter/PCDebugger.h @@ -31,10 +31,11 @@ { id debuggerView; id debuggerWindow; + id statusField; NSString *path; NSString *debuggerPath; - // BOOL _isLogging; - // BOOL _isErrorLogging; - // FILE *std_input; } + +- (void) setStatus: (NSString *) status; +- (NSString *) status; @end diff --git a/Modules/Debuggers/ProjectCenter/PCDebugger.m b/Modules/Debuggers/ProjectCenter/PCDebugger.m index ff6f761..45c5c62 100644 --- a/Modules/Debuggers/ProjectCenter/PCDebugger.m +++ b/Modules/Debuggers/ProjectCenter/PCDebugger.m @@ -28,7 +28,55 @@ #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter] #endif +static NSImage *goImage = nil; +static NSImage *pauseImage = nil; +static NSImage *restartImage = nil; +static NSImage *nextImage = nil; +static NSImage *stepInImage = nil; +static NSImage *stepOutImage = nil; + @implementation PCDebugger ++ (void) initialize +{ + if (self == [PCDebugger class]) + { + NSBundle *bundle; + NSString *path; + + bundle = [NSBundle bundleForClass: self]; + path = [bundle pathForImageResource: @"go_button"]; + if (path != nil) + { + goImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"pause_button"]; + if (path != nil) + { + pauseImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"restart_button"]; + if (path != nil) + { + restartImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"next_button"]; + if (path != nil) + { + nextImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"stepin_button"]; + if (path != nil) + { + stepInImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + path = [bundle pathForImageResource: @"stepout_button"]; + if (path != nil) + { + stepOutImage = [[NSImage alloc] initWithContentsOfFile: path]; + } + } +} + - (id) init { if((self = [super init]) != nil) @@ -69,8 +117,16 @@ - (void) awakeFromNib { + NSToolbar *toolbar = [(NSToolbar *)[NSToolbar alloc] initWithIdentifier: @"PCDebuggerToolbar"]; + [toolbar setAllowsUserCustomization: NO]; + [toolbar setDelegate: self]; + [debuggerWindow setToolbar: toolbar]; + RELEASE(toolbar); + + [toolbar setUsesStandardBackgroundColor: YES]; [debuggerView setFont: [NSFont userFixedPitchFontOfSize: 0]]; [debuggerWindow setFrameAutosaveName: @"PCDebuggerWindow"]; + [self setStatus: @"Idle."]; } - (NSWindow *)debuggerWindow @@ -102,4 +158,145 @@ { ASSIGN(path,p); } + +// action methods for toolbar... +- (void) go: (id) sender +{ + [self setStatus: @"Running..."]; + [debuggerView putString: @"run\n"]; +} + +- (void) pause: (id) sender +{ +} + +- (void) restart: (id) sender +{ + [self setStatus: @"Running..."]; + [debuggerView putString: @"run\n"]; +} + +- (void) next: (id) sender +{ + [self setStatus: @"Going to next line."]; + [debuggerView putString: @"next\n"]; +} + +- (void) stepInto: (id) sender +{ + [self setStatus: @"Stepping into method."]; + [debuggerView putString: @"step\n"]; +} + +- (void) stepOut: (id) sender +{ + [self setStatus: @"Finishing method."]; + [debuggerView putString: @"finish\n"]; +} + +// Status.. +- (void) setStatus: (NSString *) status +{ + [statusField setStringValue: status]; +} + +- (NSString *) status +{ + return [statusField stringValue]; +} +@end + +@implementation PCDebugger (NSToolbarDelegate) + +- (NSToolbarItem*)toolbar: (NSToolbar*)toolbar + itemForItemIdentifier: (NSString*)itemIdentifier +willBeInsertedIntoToolbar: (BOOL)flag +{ + NSToolbarItem *toolbarItem = AUTORELEASE([[NSToolbarItem alloc] + initWithItemIdentifier: itemIdentifier]); + + if([itemIdentifier isEqual: @"GoItem"]) + { + [toolbarItem setLabel: @"Go"]; + [toolbarItem setImage: goImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(go:)]; + [toolbarItem setTag: 0]; + } + else if([itemIdentifier isEqual: @"PauseItem"]) + { + [toolbarItem setLabel: @"Pause"]; + [toolbarItem setImage: pauseImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(pause:)]; + [toolbarItem setTag: 1]; + } + else if([itemIdentifier isEqual: @"RestartItem"]) + { + [toolbarItem setLabel: @"Restart"]; + [toolbarItem setImage: restartImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(restart:)]; + [toolbarItem setTag: 1]; + } + else if([itemIdentifier isEqual: @"NextItem"]) + { + [toolbarItem setLabel: @"Next"]; + [toolbarItem setImage: nextImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(next:)]; + [toolbarItem setTag: 2]; + } + else if([itemIdentifier isEqual: @"StepIntoItem"]) + { + [toolbarItem setLabel: @"Step Into"]; + [toolbarItem setImage: stepInImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(stepInto:)]; + [toolbarItem setTag: 3]; + } + else if([itemIdentifier isEqual: @"StepOutItem"]) + { + [toolbarItem setLabel: @"Step Out"]; + [toolbarItem setImage: stepOutImage]; + [toolbarItem setTarget: self]; + [toolbarItem setAction: @selector(stepOut:)]; + [toolbarItem setTag: 4]; + } + + return toolbarItem; +} + +- (NSArray*) toolbarAllowedItemIdentifiers: (NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects: @"GoItem", + @"PauseItem", + @"RestartItem", + @"NextItem", + @"StepIntoItem", + @"StepOutItem", + nil]; +} + +- (NSArray*) toolbarDefaultItemIdentifiers: (NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects: @"GoItem", + @"PauseItem", + @"RestartItem", + @"NextItem", + @"StepIntoItem", + @"StepOutItem", + nil]; +} + +- (NSArray*) toolbarSelectableItemIdentifiers: (NSToolbar*)toolbar +{ + return [NSArray arrayWithObjects: @"GoItem", + @"PauseItem", + @"RestartItem", + @"NextItem", + @"StepIntoItem", + @"StepOutItem", + nil]; +} @end diff --git a/Modules/Debuggers/ProjectCenter/PCDebuggerView.m b/Modules/Debuggers/ProjectCenter/PCDebuggerView.m index 2414f7f..6841a36 100644 --- a/Modules/Debuggers/ProjectCenter/PCDebuggerView.m +++ b/Modules/Debuggers/ProjectCenter/PCDebuggerView.m @@ -21,27 +21,19 @@ */ #include "PCDebuggerView.h" +#include "PCDebugger.h" + #include #include +#include +#include + #ifndef NOTIFICATION_CENTER #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter] #endif @implementation PCDebuggerView -/* -- (void) runProgram: (NSString *)path - inCurrentDirectory: (NSString *)directory - withArguments: (NSArray *)array - logStandardError: (BOOL)logError -{ - [super runProgram: path - inCurrentDirectory: directory - withArguments: array - logStandardError: logError]; - [self putString: @"set annotate 3\n"]; -} -*/ -(void)setDebugger:(PCDebugger *)theDebugger { @@ -87,7 +79,9 @@ NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: file, @"file", line, @"line", nil]; - NSLog(@"dict = %@", dict); + NSString *statusString = [NSString stringWithFormat: @"Stopped, %@:%@",file,line]; + + [debugger setStatus: statusString]; [NOTIFICATION_CENTER postNotificationName: PCProjectBreakpointNotification object: dict]; @@ -121,4 +115,48 @@ { return currentFile; } + +/** + * lookup the process id. + */ +/* +- (int) lookupProcessId +{ + int task_pid = [task processIdentifier]; + int child_pid = 0; + NSArray *entries = [[NSFileManager defaultManager] directoryContentsAtPath: @"/proc"]; + NSEnumerator *en = [entries objectEnumerator]; + NSString *entry = nil; + + // FIXME: I'm looking for a generic way to do this, what we have here is very /proc specific. + // which I don't like since it ties this functionality to systems which have /proc. + while((entry = [en nextObject]) != nil) + { + int pid = [entry intValue]; + if (pid != 0) + { + int ppid = getppid(pid); + if (ppid == task_pid) + { + child_pid = pid; + break; + } + } + } + + return child_pid; +} + +- (void) interrupt +{ + int pid = [self lookupProcessId]; + kill(pid,SIGINT); +} +*/ + +- (void) terminate +{ + [super terminate]; + [debugger setStatus: @"Process ended."]; +} @end diff --git a/Modules/Debuggers/ProjectCenter/PTYView.h b/Modules/Debuggers/ProjectCenter/PTYView.h index 05023ea..0f26b26 100644 --- a/Modules/Debuggers/ProjectCenter/PTYView.h +++ b/Modules/Debuggers/ProjectCenter/PTYView.h @@ -58,6 +58,8 @@ - (void) terminate; +- (void) interrupt; + - (void) putString: (NSString *)string; - (void) putChar:(unichar)ch; diff --git a/Modules/Debuggers/ProjectCenter/PTYView.m b/Modules/Debuggers/ProjectCenter/PTYView.m index 62b1fb1..d542edc 100644 --- a/Modules/Debuggers/ProjectCenter/PTYView.m +++ b/Modules/Debuggers/ProjectCenter/PTYView.m @@ -25,6 +25,7 @@ #include #include #include +#include #ifndef NOTIFICATION_CENTER #define NOTIFICATION_CENTER [NSNotificationCenter defaultCenter] @@ -115,8 +116,8 @@ // // Is it backspace? If so, remove one character from the terminal to reflect - // the deletion. For some reason backspace sends "\b \b", so I have to remove - // four characters in order to appropriately delete from the buffer. + // the deletion. For some reason backspace sends multiple characters, so I have to remove + // one more character than what is sent in order to appropriately delete from the buffer. // range = [str rangeOfString: @"\b"]; if (range.location != NSNotFound) @@ -332,6 +333,11 @@ [master_handle writeData: data]; } +- (void) interrupt +{ + [task interrupt]; +} + /** * Respond to key events and pipe them down to the debugger */ @@ -347,7 +353,7 @@ if (c == 3) // ETX, Control-C { - [task interrupt]; // send the interrupt signal to the subtask + [self interrupt]; // send the interrupt signal to the subtask } else { diff --git a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes index 8fad690..ef27407 100644 --- a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes +++ b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.classes @@ -5,7 +5,8 @@ ); Outlets = ( debuggerView, - debuggerWindow + debuggerWindow, + statusField ); Super = NSObject; }; diff --git a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.info b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/data.info index 3bc8f05d4a6be2a0a9d14ad67d0720f682795b0a..336424908965f092fd6d62dd667d63cc1130a3c4 100644 GIT binary patch delta 18 ZcmdnNxPx(m2y?1=@1zZ3C diff --git a/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/objects.gorm b/Modules/Debuggers/ProjectCenter/Resources/PCDebugger.gorm/objects.gorm index a656ac5e9c26c512c2ecfa70936197a3106298e5..9cd3b1b0bbdce5473511fbbd9254b161a9da6b5c 100644 GIT binary patch delta 1025 zcmaJ=O-~a+7@pbE-QsKjKPWBzgi57~@~+xKw?$i8P*E3>dhm)^lP07jP@&csm@#e)iAGNWPIGaq~_nr6Sd7hd5bn_DWOdi4ihAn+QOtB?qxi~Wiv1?4g%~0eqmG&-s~Gwfvyul#B1DZ zKIyEsn%fV>IYu+Gp8n}mdyi0jt5lc+?fYQ^sSjsG=?JAT>D$uOy&&d9(db`e zYR&C!acDS|No0GC>Q<+<)9wW^g18@&#g+sTl$b4}(b??m@3|Bb{)7w@QU!!~oP8OJ zu|H07Njmg92cY?)^ZpM5fOr%9S~&3k3v?nL=?_xP7|a$COBoamh9`$DZwl~ zI!Njt7PE>)PO&(zSzJ&oaxf=ZjPzJsRC$+F-aLC3oW;OC3+4{{8H|a2-1Op?HAE~G z$2g0F^%51}muPteuw#042H79{ayoT3$P}^y@ zn_HcoT?LdEd4a-pKf%kqNTDK(MP8;*6^6?fDJ(llc4WmZmlvSsq}UH@p49!Mtb-Ll z#pXg$vZ{O+ZU}!PlpVe)`~ok+E!GW94X-KBh1={^D7A7&G|tNjcZE@shNsR;u&#-b VzFNfCQ}0{-gRtSp)aw1LMm9`lU*@o->x2|=a)1~eY1dp~eu`+hxvD?Zhj21?VcoR|x-hg-k zsosP~L&3Z79>la0L30q^C*S*hZ<6Qy$9|B_E$96+94}+>BYLAy=OGUO8ovTEfal~3 zD&zqUd6)wLK=KYBIRIXKuAbn-3{B$#+43?h5-PMtrBKkAi&xo}jQl)zZ97Z%7MFJw z;kP1i6Kn3TR@R1=Nm?|gl`s|c?qX;HS9c6>&B%j{IlJ_|oB7(B*bC2gotw=aGXp~g zDRcJs3`Ap+xK7^00&I{^vCLl3kt(oBM5zH)av{~AM((9j`*4>bMpqSa%P4?7b7tD} zvFkY2!gDuK2A~So*)Vw=;C5J`8dU;(#6**70q!uN(q@2 zqeKo+7j?rTRT$&2M5ahaM$9TcW$YtO>@n6^YM(rzx;ThQ#Y3`1)zm1=$KS+4Q{OO4 BZ=3)C diff --git a/Modules/Debuggers/ProjectCenter/Resources/go_button.png b/Modules/Debuggers/ProjectCenter/Resources/go_button.png new file mode 100644 index 0000000000000000000000000000000000000000..b5edab8da446168fc8fcb3054d4edfb36ceb4687 GIT binary patch literal 757 zcmVWFU8GbZ8({Xk{QrNlj4iWF>9@00LP_L_t(o!|j(#Xj4HH zhQCRhbR`<&3lUwVkWekU2oY{%>T_fXU?2~e|-oy#zrxD7)SsyAPj`$ zuLYnAl!0-f>5n=JU=)+*fGiMkxNZd)7MecV7JyMq?gR3`fJYBc0Xd=R&s+l-#pDU# z4&ZMy%uOIIG`-*$K#Je(aK5Ef5W>XmPdc!3l_%n>!{JjH=B>o%7aLvy{Bmtf0c5tD zCS0p!u=`Ajr!VSWAqJ#|sRy!Fv*#BZysI}D%suAPtrIR#sdkrTbX;m#Fdd*;uj{U&V6<>HK78Cc@6CJs}J;NN{l?H zVHl3Q5mNz#+c{%jzqL4@pW)c`X=ZC5?aad}fRNp+fZt~eGB){^J(&{sC*D|@g{;o7V@( zU+m-fq3v{cxyt2=(DbO;DHyiB(z*nhBRhF{TjS)=4!7cKG*tb-q*X4ID|KR#pw~Q| z5}JO{t{=$B=0ROUy^A;H+E@a}jwSsYo&af8bLulmv;vT_@`THsr_7pCpGCG8fVga} nJ;z-3frY>GVe%)QX8*?z=V`sG@iMt500000NkvXXu0mjfmswAu literal 0 HcmV?d00001 diff --git a/Modules/Debuggers/ProjectCenter/Resources/next_button.png b/Modules/Debuggers/ProjectCenter/Resources/next_button.png new file mode 100644 index 0000000000000000000000000000000000000000..31fc00199ce75a3669590efc87b47f0d94cc4626 GIT binary patch literal 545 zcmV++0^a?JP)WFU8GbZ8({Xk{QrNlj4iWF>9@00D(bL_t(o!|j(ba>6hW zMV~y$2`F*`3fdG51!+8KXk3QI2S{bk0#y!>CX{Yy7&oEFP^6{c44i<%X?7CDtc)=d zGa0g-EouMPm$dqVYY%fu=dws1ff3LLxsalStR$s6d1Ntcm+&MoPVB7pe&Ln;1#$%bD8%*YT|s}n1F!4dERehjf8Q?{^4Qf zni7NRazskUX#j8}=d}7WQg-_=;ISVHhEsveTY-slS5u}EkRsFbIb8>do?sm)FbYy? zbrRoLH`dR-YhYO1Yz4Y5kT#%4l;~;%I>B$g9}=CqI&jgj3GB2r*S_0^ zm1n1I!Yy!j474ek>b|Lr+iD7|L&>a=UTXvv7Xtr<6mm`CSo3Z$6j(%OF$e;8h}8mnbXK|hUdW8lM;KEAFM6KGGHLqy7iii j51jwahshhLf400000NkvXXu0mjf=4;t8 literal 0 HcmV?d00001 diff --git a/Modules/Debuggers/ProjectCenter/Resources/pause_button.png b/Modules/Debuggers/ProjectCenter/Resources/pause_button.png new file mode 100644 index 0000000000000000000000000000000000000000..0c762b83a1fa149c15cf3fdf5490984b5b451d79 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwEM~2B-jbU$pK2S)u#5JPCIX^cyHLrxhxhOTUBsE2$ zJhLQ2AtWPJ!QIn0;C+f}9s>hou&0Y-NW|f{({=L>I|#VlcRR~j!^V8MNkc(3tg|!G zx2R#!7ah)5j9yY1NkWp6A#4lT?3(=p9!z2kGtyS=wGF+>_vK$retP+}`-kHB%YC2k z^O0|4iC|C^@Cat#;=n7ScaDEC)0fm=JUI<74pmAgJb(1(t6IZ8pZATr8-As=X+Jo6 z^ykMcpuqeF^Mty`X7x`YN&Zt&Q0&S-+fy#t+W8w^+?G8h&r zI;>!1X=7+y&vho5WFU8GbZ8({Xk{QrNlj4iWF>9@00V4EL_t(o!|j((XcT7{ z#(!VBD|6XJjKl=W#!Fa3DkdJL5w-*t4=!RL3VI1h@X{U{@eq)pHj0#L2$Eddi-$rK zB4~6GRv`p+7feSSeKwMgn2CNhg_I$HPvxlgT&xCx%j}?`hfZo%eaZXWsAq zo`L^+h-#9}$;49eh;a0W4uGI6Cc?P*Vc@C@|#)F2d1D2!wzst5)R%tOv#bZ%O$oBjE+c+(^{8 z$Uf>;Z9Fl{XJ5apmIT14RlBSL!?K-^CuZ5%GsBT@o{~%^rAqAVnPEIJTS|%Hl1*rJ z`}fYIj)4U|ncp%NlTiv9qoC zd_GLmMAJ04*U@ZYty3W4%sh2>eva)+ZX(P|E3UdsWUGl z@Z6pe3>HA6{x-O>~&;Vb^@9`qc4&}h{B*ee`}>G0^i+PE=)!t=!@iJDVmHx z%-KkRK%x6*o+Y{WWUeG=F8>aIn~(nF=V!kH5C{a;G^7lx#&)4hSWc!GS5DNSC<=yQ zaP(r5dr#g-!Snfdcs{9N?7<)O4E>H__>VA%h7IIxxL{kz#-|0!=4R>&;oSX$1L{rewqAq0($ zja={F?FMdGwac4Qnw$L5T5mKGK)W0GfB(be-}p5981DhWTvf?21mHvf0000WFU8GbZ8({Xk{QrNlj4iWF>9@00DbRL_t(o!|j(La>76q zhQDRX2{;3S%8Dpzc4{z@#c+VCaF$@&17JX|!E|C;g{UloGjIY#YIZsyyewIg>@d@= zOm^S@?LXPKf8ehV@6(#xJhd{rgxIr_lL*1Qa0 zZC`fq!7pv?iw>kM?ObvqbpqJ0eca)(A6tz|2a*82ClLW`lNkj77+I||2POeK@I(TL z0s=%5z%U@duhw1R;lSCmh0f=iQ_&UAw0a&lAzjQZ0vy^XTvPlY0qmRZ&SU3$31HjA zVjtU!T19}3XF9r8{6tHYihc*^hC8Lry>tu#7Qk!mJXinNl{KmpQJ%#gb#6qDM066- zls1o-^1$52sJ6$^)^-OH8z5&L0L-Lt+N-d44NP55lWFU8GbZ8({Xk{QrNlj4iWF>9@00DhTL_t(o!|j(LQo}$L zhQIB!C&(Epf<$x>!R%mSBB|*CP;`cyv<41

jK;RJ|Xxjr`qYhAb)GbT^ zxkrH91hDf6@U1njT}**HM}smHARV-d2gcqi9ye~Tf&0D(PS1|4yZpe5?L<7mVYC%e zU3U3_r8W