From e5355393f1913e787994caee9c787b86c1a70dcb Mon Sep 17 00:00:00 2001 From: michael starke Date: Sun, 12 May 2013 00:58:59 +0200 Subject: [PATCH] Cleaned up old KdbEntry and KdbGroup categories Fixed dealloc bug in MPDocumentWindowController Introduced undo category for entries and groups --- MacPass.xcodeproj/project.pbxproj | 18 +++---- MacPass/Kdb4Entry+Copying.h | 14 ----- MacPass/Kdb4Entry+Copying.m | 35 ------------- MacPass/KdbEntry+Copying.h | 13 ----- MacPass/KdbEntry+Copying.m | 19 ------- MacPass/KdbEntry+Undo.h | 25 +++++++++ MacPass/KdbEntry+Undo.m | 68 +++++++++++++++++++++++++ MacPass/MPDocument.h | 2 - MacPass/MPDocument.m | 5 +- MacPass/MPDocumentWindowController.m | 1 - MacPass/MPInspectorTabViewController.m | 6 +-- MacPass/MacPass-Info.plist | 2 +- MacPass/en.lproj/Localizable.strings | Bin 3526 -> 4400 bytes 13 files changed, 106 insertions(+), 102 deletions(-) delete mode 100644 MacPass/Kdb4Entry+Copying.h delete mode 100644 MacPass/Kdb4Entry+Copying.m delete mode 100644 MacPass/KdbEntry+Copying.h delete mode 100644 MacPass/KdbEntry+Copying.m create mode 100644 MacPass/KdbEntry+Undo.h create mode 100644 MacPass/KdbEntry+Undo.m diff --git a/MacPass.xcodeproj/project.pbxproj b/MacPass.xcodeproj/project.pbxproj index 121fa350..668a3402 100644 --- a/MacPass.xcodeproj/project.pbxproj +++ b/MacPass.xcodeproj/project.pbxproj @@ -91,8 +91,6 @@ 4CA0B2F915BCAF6700654E32 /* MPGeneralSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B2F815BCAF6700654E32 /* MPGeneralSettingsController.m */; }; 4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA0B2FB15BCAF8600654E32 /* MPSettingsWindowController.m */; }; 4CAC6F7816D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAC6F7716D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m */; }; - 4CACB72C16F7C9B600D47C9E /* KdbEntry+Copying.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CACB72B16F7C9B600D47C9E /* KdbEntry+Copying.m */; }; - 4CACB72F16F7CA5100D47C9E /* Kdb4Entry+Copying.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CACB72E16F7CA5100D47C9E /* Kdb4Entry+Copying.m */; }; 4CAD747B15B887FD00104512 /* DDXMLElementAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745715B887FD00104512 /* DDXMLElementAdditions.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 4CAD747C15B887FD00104512 /* NSString+DDXML.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745A15B887FD00104512 /* NSString+DDXML.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 4CAD747D15B887FD00104512 /* DDXMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CAD745D15B887FD00104512 /* DDXMLDocument.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; @@ -105,6 +103,7 @@ 4CBFA240172B385D006090DF /* PasswordEditView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CBFA23F172B385D006090DF /* PasswordEditView.xib */; }; 4CC1AEBE16D4467C006D2AAB /* KdbTree+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */; }; 4CC6259115BA1C99002F5B11 /* MPOutlineViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6259015BA1C99002F5B11 /* MPOutlineViewDelegate.m */; }; + 4CCF9754173EFBA500460BD2 /* KdbEntry+Undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCF9753173EFBA500460BD2 /* KdbEntry+Undo.m */; }; 4CD78ABC16D155FF00768A1D /* 07_NotepadTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78AB716D155FF00768A1D /* 07_NotepadTemplate.pdf */; }; 4CD78ABD16D155FF00768A1D /* 08_SocketTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78AB816D155FF00768A1D /* 08_SocketTemplate.pdf */; }; 4CD78ABE16D155FF00768A1D /* 09_IdentityTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CD78AB916D155FF00768A1D /* 09_IdentityTemplate.pdf */; }; @@ -277,10 +276,6 @@ 4CA0B30D15BCB6FD00654E32 /* MPSettingsTab.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPSettingsTab.h; sourceTree = ""; }; 4CAC6F7616D2B54800D79D5E /* MPMainWindowSplitViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPMainWindowSplitViewDelegate.h; sourceTree = ""; }; 4CAC6F7716D2B54800D79D5E /* MPMainWindowSplitViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMainWindowSplitViewDelegate.m; sourceTree = ""; }; - 4CACB72A16F7C9B600D47C9E /* KdbEntry+Copying.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbEntry+Copying.h"; sourceTree = ""; }; - 4CACB72B16F7C9B600D47C9E /* KdbEntry+Copying.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+Copying.m"; sourceTree = ""; }; - 4CACB72D16F7CA5100D47C9E /* Kdb4Entry+Copying.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Kdb4Entry+Copying.h"; sourceTree = ""; }; - 4CACB72E16F7CA5100D47C9E /* Kdb4Entry+Copying.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Kdb4Entry+Copying.m"; sourceTree = ""; }; 4CAD745615B887FD00104512 /* DDXMLElementAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDXMLElementAdditions.h; sourceTree = ""; }; 4CAD745715B887FD00104512 /* DDXMLElementAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDXMLElementAdditions.m; sourceTree = ""; }; 4CAD745915B887FD00104512 /* NSString+DDXML.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+DDXML.h"; sourceTree = ""; }; @@ -303,6 +298,8 @@ 4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbTree+MPAdditions.m"; sourceTree = ""; }; 4CC6258F15BA1C99002F5B11 /* MPOutlineViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineViewDelegate.h; sourceTree = ""; }; 4CC6259015BA1C99002F5B11 /* MPOutlineViewDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineViewDelegate.m; sourceTree = ""; }; + 4CCF9752173EFBA500460BD2 /* KdbEntry+Undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KdbEntry+Undo.h"; sourceTree = ""; }; + 4CCF9753173EFBA500460BD2 /* KdbEntry+Undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KdbEntry+Undo.m"; sourceTree = ""; }; 4CD78AB716D155FF00768A1D /* 07_NotepadTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 07_NotepadTemplate.pdf; sourceTree = ""; }; 4CD78AB816D155FF00768A1D /* 08_SocketTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 08_SocketTemplate.pdf; sourceTree = ""; }; 4CD78AB916D155FF00768A1D /* 09_IdentityTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 09_IdentityTemplate.pdf; sourceTree = ""; }; @@ -376,10 +373,8 @@ 4C2C4C2B16D3BE3700D49295 /* KdbGroup+MPAdditions.m */, 4CC1AEBC16D4467C006D2AAB /* KdbTree+MPAdditions.h */, 4CC1AEBD16D4467C006D2AAB /* KdbTree+MPAdditions.m */, - 4CACB72A16F7C9B600D47C9E /* KdbEntry+Copying.h */, - 4CACB72B16F7C9B600D47C9E /* KdbEntry+Copying.m */, - 4CACB72D16F7CA5100D47C9E /* Kdb4Entry+Copying.h */, - 4CACB72E16F7CA5100D47C9E /* Kdb4Entry+Copying.m */, + 4CCF9752173EFBA500460BD2 /* KdbEntry+Undo.h */, + 4CCF9753173EFBA500460BD2 /* KdbEntry+Undo.m */, ); name = KeePassLibAdditions; sourceTree = ""; @@ -947,8 +942,6 @@ 4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */, 4CE39ABF16ECE34A000FE29D /* MPIconSelectViewController.m in Sources */, 4CE39AC416ECE4F7000FE29D /* MPPopupImageView.m in Sources */, - 4CACB72C16F7C9B600D47C9E /* KdbEntry+Copying.m in Sources */, - 4CACB72F16F7CA5100D47C9E /* Kdb4Entry+Copying.m in Sources */, 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */, 4C46B88817063A170046109A /* NSString+MPPasswordAnalysis.m in Sources */, 4C46B88B1706D16E0046109A /* NSData+MPRandomBytes.m in Sources */, @@ -956,6 +949,7 @@ 4C5A11FE1708DE8700223D8A /* MPPasswordCreatorViewController.m in Sources */, 4C7E832A172DE2F2002493D8 /* MPPasswordEditViewController.m in Sources */, 4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */, + 4CCF9754173EFBA500460BD2 /* KdbEntry+Undo.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MacPass/Kdb4Entry+Copying.h b/MacPass/Kdb4Entry+Copying.h deleted file mode 100644 index f3bc983d..00000000 --- a/MacPass/Kdb4Entry+Copying.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Kdb4Entry+Copying.h -// MacPass -// -// Created by Michael Starke on 18.03.13. -// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. -// - -#import "KdbLib.h" -#import "Kdb4Node.h" - -@interface Kdb4Entry (Copying) - -@end diff --git a/MacPass/Kdb4Entry+Copying.m b/MacPass/Kdb4Entry+Copying.m deleted file mode 100644 index 14e0220f..00000000 --- a/MacPass/Kdb4Entry+Copying.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// Kdb4Entry+Copying.m -// MacPass -// -// Created by Michael Starke on 18.03.13. -// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. -// - -#import "Kdb4Entry+Copying.h" -#import "KdbEntry+Copying.h" - -@implementation Kdb4Entry (Copying) - -- (id)copyWithZone:(NSZone *)zone { - Kdb4Entry *entry = [[Kdb4Entry allocWithZone:zone] init]; - entry.uuid = [[self.uuid copy] autorelease]; - entry.titleStringField = [[self.titleStringField copy] autorelease]; - entry.usernameStringField = [[self.usernameStringField copy] autorelease]; - entry.passwordStringField = [[self.passwordStringField copy] autorelease]; - entry.urlStringField = [[self.urlStringField copy] autorelease]; - entry.notesStringField = [[self.notesStringField copy] autorelease]; - entry.customIconUuid = self.customIconUuid; - entry.foregroundColor = self.foregroundColor; - entry.backgroundColor = self.backgroundColor; - entry.overrideUrl = self.overrideUrl; - entry.tags = self.tags; - entry.locationChanged = self.locationChanged; - //entry.stringFields = self.stringFields; - //entry.binaries = self.binaries; - entry.autoType = self.autoType; - //entry.history = self.history; - return entry; -} - -@end diff --git a/MacPass/KdbEntry+Copying.h b/MacPass/KdbEntry+Copying.h deleted file mode 100644 index 84ebdb51..00000000 --- a/MacPass/KdbEntry+Copying.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// KdbEntry+Copying.h -// MacPass -// -// Created by Michael Starke on 18.03.13. -// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. -// - -#import "Kdb.h" - -@interface KdbEntry (Copying) - -@end diff --git a/MacPass/KdbEntry+Copying.m b/MacPass/KdbEntry+Copying.m deleted file mode 100644 index d923bb21..00000000 --- a/MacPass/KdbEntry+Copying.m +++ /dev/null @@ -1,19 +0,0 @@ -// -// KdbEntry+Copying.m -// MacPass -// -// Created by Michael Starke on 18.03.13. -// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. -// - -#import "KdbEntry+Copying.h" - -@implementation KdbEntry (Copying) - -- (id)copyWithZone:(NSZone *)zone { - [self doesNotRecognizeSelector:_cmd]; - return nil; -} - - -@end diff --git a/MacPass/KdbEntry+Undo.h b/MacPass/KdbEntry+Undo.h new file mode 100644 index 00000000..97ac82e5 --- /dev/null +++ b/MacPass/KdbEntry+Undo.h @@ -0,0 +1,25 @@ +// +// KdbEntry+Undo.h +// MacPass +// +// Created by Michael Starke on 12.05.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "Kdb.h" + +@interface KdbEntry (Undo) + +- (NSString *)titleUndoable; +- (NSString *)usernameUndoable; +- (NSString *)passwordUndoable; +- (NSString *)urlUndoable; +- (NSString *)notesUndoable; + +- (void)setTitleUndoable:(NSString *)title; +- (void)setUsernameUndoable:(NSString *)username; +- (void)setPasswordUndoable:(NSString *)password; +- (void)setUrlUndoable:(NSString *)url; +- (void)setNotesUndoable:(NSString *)notes; + +@end diff --git a/MacPass/KdbEntry+Undo.m b/MacPass/KdbEntry+Undo.m new file mode 100644 index 00000000..6a45d0a1 --- /dev/null +++ b/MacPass/KdbEntry+Undo.m @@ -0,0 +1,68 @@ +// +// KdbEntry+Undo.m +// MacPass +// +// Created by Michael Starke on 12.05.13. +// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved. +// + +#import "KdbEntry+Undo.h" + +@implementation KdbEntry (Undo) + +- (NSString *)titleUndoable { + return [self title]; +} + +- (NSString *)usernameUndoable { + return [self username]; +} + +- (NSString *)passwordUndoable { + return [self password]; +} + +- (NSString *)urlUndoable { + return [self url]; +} + +- (NSString *)notesUndoable { + return [self notes]; +} + + +- (void)setTitleUndoable:(NSString *)title { + NSDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; + [[document undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.title]; + [[document undoManager] setActionName:NSLocalizedString(@"UNDO_SET_TITLE", "Undo set title")]; + [self setTitle:title]; +} + +- (void)setUsernameUndoable:(NSString *)username { + NSDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; + [[document undoManager] registerUndoWithTarget:self selector:@selector(setUsernameUndoable:) object:self.username]; + [[document undoManager] setActionName:NSLocalizedString(@"UNDO_SET_USERNAME", "Undo set username")]; + [self setUsername:username]; +} + +- (void)setPasswordUndoable:(NSString *)password { + NSDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; + [[document undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.password]; + [[document undoManager] setActionName:NSLocalizedString(@"UNDO_SET_PASSWORT", "Undo set password")]; + [self setPassword:password]; +} + +- (void)setUrlUndoable:(NSString *)url { + NSDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; + [[document undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.url]; + [[document undoManager] setActionName:NSLocalizedString(@"UNDO_SET_URL", "Undo set URL")]; + [self setUrl:url]; +} + +- (void)setNotesUndoable:(NSString *)notes { + NSDocument *document = [[NSDocumentController sharedDocumentController] currentDocument]; + [[document undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.notes]; + [[document undoManager] setActionName:NSLocalizedString(@"UNDO_SET_NOTES", "Undo set notes")]; + [self setNotes:notes]; +} +@end diff --git a/MacPass/MPDocument.h b/MacPass/MPDocument.h index 15368e3e..3348ffb2 100644 --- a/MacPass/MPDocument.h +++ b/MacPass/MPDocument.h @@ -33,8 +33,6 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey; - (id)initWithVersion:(MPDatabaseVersion)version; - (BOOL)decryptWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL; - - - (KdbGroup *)createGroup:(KdbGroup *)parent; - (KdbEntry *)createEntry:(KdbGroup *)parent; diff --git a/MacPass/MPDocument.m b/MacPass/MPDocument.m index df610950..d86269a8 100644 --- a/MacPass/MPDocument.m +++ b/MacPass/MPDocument.m @@ -149,7 +149,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey"; newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group"); [[self undoManager] registerUndoWithTarget:self selector:@selector(deleteGroup:) object:newGroup]; - [[self undoManager] setActionName:NSLocalizedString(@"ADD_GROUP_UNDO", @"Create Group Undo")]; + [[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_GROUP", @"Create Group Undo")]; [parent addGroup:newGroup]; NSDictionary *userInfo = @{ MPDocumentGroupKey:newGroup }; [[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddGroupNotification object:self userInfo:userInfo]; @@ -176,7 +176,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey"; - (void)deleteGroup:(KdbGroup *)group { if(group.parent) { [[self undoManager] registerUndoWithTarget:self selector:@selector(addGroup:) object:@[group.parent, group]]; - [[self undoManager] setActionName:NSLocalizedString(@"DELETE_GROUP_UNDO", @"Create Group Undo")]; + [[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_GROUP", @"Create Group Undo")]; [group.parent removeGroup:group]; NSDictionary *userInfo = @{ MPDocumentEntryKey:group }; [[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidDelteGroupNotification object:self userInfo:userInfo]; @@ -185,4 +185,5 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey"; } } + @end diff --git a/MacPass/MPDocumentWindowController.m b/MacPass/MPDocumentWindowController.m index 04415433..8a9cd5e8 100644 --- a/MacPass/MPDocumentWindowController.m +++ b/MacPass/MPDocumentWindowController.m @@ -69,7 +69,6 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; [_welcomeView release]; - [_welcomeText release]; [_toolbar release]; [_passwordInputController release]; diff --git a/MacPass/MPInspectorTabViewController.m b/MacPass/MPInspectorTabViewController.m index d90087bc..c397164b 100644 --- a/MacPass/MPInspectorTabViewController.m +++ b/MacPass/MPInspectorTabViewController.m @@ -14,6 +14,7 @@ #import "MPPopupImageView.h" #import "MPIconSelectViewController.h" #import "KdbLib.h" +#import "KdbEntry+Undo.h" @interface MPInspectorTabViewController () @@ -52,8 +53,6 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; - [_selectedGroup release]; - [_selectedEntry release]; [_iconPopup release]; [super dealloc]; } @@ -99,7 +98,8 @@ [self.itemNameTextfield setStringValue:self.selectedEntry.title]; [self.itemImageView setImage:[MPIconHelper icon:(MPIconType)self.selectedEntry.image ]]; [self.passwordTextField setStringValue:self.selectedEntry.password]; - [self.usernameTextField setStringValue:self.selectedEntry.username]; + [self.usernameTextField bind:NSValueBinding toObject:self.selectedEntry withKeyPath:@"usernameUndoable" options:nil]; + //[self.usernameTextField setStringValue:self.selectedEntry.username]; [self.titleOrNameLabel setStringValue:NSLocalizedString(@"TITLE",@"")]; [self.titleTextField setStringValue:self.selectedEntry.title]; [self.URLTextField setStringValue:self.selectedEntry.url]; diff --git a/MacPass/MacPass-Info.plist b/MacPass/MacPass-Info.plist index 23d1bdcd..edd21bce 100644 --- a/MacPass/MacPass-Info.plist +++ b/MacPass/MacPass-Info.plist @@ -46,7 +46,7 @@ CFBundleSignature ???? CFBundleVersion - 69B + 6AA LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright diff --git a/MacPass/en.lproj/Localizable.strings b/MacPass/en.lproj/Localizable.strings index 74a2fde2c3a0113bef0a437e4aa7e2c895d5dca5..a4eb301c666ab89c4acfcc7e4564165f35acb68e 100644 GIT binary patch delta 542 zcmaixK}!Nb9L1lMDT;^a5Fy66$1c)YJOoJ)vYOi>;b94k2-0LX>F9@;Pv9*)?Wgc_ z`P;>{!zwX62LAKry&p51dhEpOTFKSD`U>n*p=0Cfk|!n~^}oto zjRu75!hg|=v?QeRRntQS`}}dSQR)IlvRxLNK^}8XM#TC7KE#=W&9c}Bx`W%(h({X2 z`}as$$NOpXHs9gn?j29I=O-6?%2nm^0Obt2)B_HYK$++ic8Fp2DvA?zJ EEg-{N)Bpeg delta 11 Scmdm>bWD1~D&EN=f-(RckOS`k