From 8d8b1e08b0641301c93c88ac35cb021e7a8f7bc5 Mon Sep 17 00:00:00 2001 From: n Date: Thu, 7 Feb 2013 17:54:42 +0400 Subject: [PATCH 1/4] Initial commit from previous project. --- iDNA/iDNA.xcodeproj/project.pbxproj | 332 + .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 25779 bytes .../xcdebugger/Breakpoints.xcbkptlist | 150 + .../n.xcuserdatad/xcschemes/iDNA.xcscheme | 86 + .../xcschemes/iDNAtests.xcscheme | 53 + .../xcschemes/xcschememanagement.plist | 32 + iDNA/iDNA/AppDelegate.h | 49 + iDNA/iDNA/AppDelegate.m | 222 + iDNA/iDNA/Cell.h | 26 + iDNA/iDNA/Cell.m | 237 + iDNA/iDNA/Evolution.h | 43 + iDNA/iDNA/Evolution.m | 150 + iDNA/iDNA/Graph.h | 23 + iDNA/iDNA/Graph.m | 78 + iDNA/iDNA/NSMutableArray+Shuffle.h | 13 + iDNA/iDNA/NSMutableArray+Shuffle.m | 22 + iDNA/iDNA/en.lproj/Credits.rtf | 29 + iDNA/iDNA/en.lproj/InfoPlist.strings | 2 + iDNA/iDNA/en.lproj/MainMenu.xib | 5649 +++++++++++++++++ iDNA/iDNA/iDNA-Info.plist | 34 + iDNA/iDNA/iDNA-Prefix.pch | 7 + iDNA/iDNA/main.m | 14 + iDNA/iDNAtests/en.lproj/InfoPlist.strings | 2 + iDNA/iDNAtests/iDNAtests-Info.plist | 22 + iDNA/iDNAtests/iDNAtests-Prefix.pch | 7 + iDNA/iDNAtests/iDNAtests.h | 13 + iDNA/iDNAtests/iDNAtests.m | 24 + 28 files changed, 7326 insertions(+) create mode 100644 iDNA/iDNA.xcodeproj/project.pbxproj create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme create mode 100644 iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 iDNA/iDNA/AppDelegate.h create mode 100644 iDNA/iDNA/AppDelegate.m create mode 100644 iDNA/iDNA/Cell.h create mode 100644 iDNA/iDNA/Cell.m create mode 100644 iDNA/iDNA/Evolution.h create mode 100644 iDNA/iDNA/Evolution.m create mode 100644 iDNA/iDNA/Graph.h create mode 100644 iDNA/iDNA/Graph.m create mode 100644 iDNA/iDNA/NSMutableArray+Shuffle.h create mode 100644 iDNA/iDNA/NSMutableArray+Shuffle.m create mode 100644 iDNA/iDNA/en.lproj/Credits.rtf create mode 100644 iDNA/iDNA/en.lproj/InfoPlist.strings create mode 100644 iDNA/iDNA/en.lproj/MainMenu.xib create mode 100644 iDNA/iDNA/iDNA-Info.plist create mode 100644 iDNA/iDNA/iDNA-Prefix.pch create mode 100644 iDNA/iDNA/main.m create mode 100644 iDNA/iDNAtests/en.lproj/InfoPlist.strings create mode 100644 iDNA/iDNAtests/iDNAtests-Info.plist create mode 100644 iDNA/iDNAtests/iDNAtests-Prefix.pch create mode 100644 iDNA/iDNAtests/iDNAtests.h create mode 100644 iDNA/iDNAtests/iDNAtests.m diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj new file mode 100644 index 0000000..886b163 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -0,0 +1,332 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0D6AEA1D1689DF2600034395 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D6AEA1C1689DF2600034395 /* Cocoa.framework */; }; + 0D6AEA271689DF2600034395 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA251689DF2600034395 /* InfoPlist.strings */; }; + 0D6AEA291689DF2600034395 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA281689DF2600034395 /* main.m */; }; + 0D6AEA2D1689DF2600034395 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA2B1689DF2600034395 /* Credits.rtf */; }; + 0D6AEA301689DF2600034395 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA2F1689DF2600034395 /* AppDelegate.m */; }; + 0D6AEA331689DF2600034395 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D6AEA311689DF2600034395 /* MainMenu.xib */; }; + 0D6AEA431689FE7400034395 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA421689FE7300034395 /* Cell.m */; }; + 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */; }; + 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D7E761D169A0BBA0089D9C8 /* Evolution.m */; }; + 0DD00A8116A05DAA00B661B2 /* Graph.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD00A8016A05DAA00B661B2 /* Graph.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 0D6AEA181689DF2600034395 /* iDNA.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iDNA.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 0D6AEA1C1689DF2600034395 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 0D6AEA1F1689DF2600034395 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 0D6AEA201689DF2600034395 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 0D6AEA211689DF2600034395 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 0D6AEA241689DF2600034395 /* iDNA-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "iDNA-Info.plist"; sourceTree = ""; }; + 0D6AEA261689DF2600034395 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 0D6AEA281689DF2600034395 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 0D6AEA2A1689DF2600034395 /* iDNA-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "iDNA-Prefix.pch"; sourceTree = ""; }; + 0D6AEA2C1689DF2600034395 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + 0D6AEA2E1689DF2600034395 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 0D6AEA2F1689DF2600034395 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 0D6AEA321689DF2600034395 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 0D6AEA411689FE7300034395 /* Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cell.h; sourceTree = ""; }; + 0D6AEA421689FE7300034395 /* Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Cell.m; sourceTree = ""; }; + 0D6AEA481689FF5500034395 /* NSMutableArray+Shuffle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+Shuffle.h"; sourceTree = ""; }; + 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+Shuffle.m"; sourceTree = ""; }; + 0D7E761C169A0BBA0089D9C8 /* Evolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Evolution.h; sourceTree = ""; }; + 0D7E761D169A0BBA0089D9C8 /* Evolution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Evolution.m; sourceTree = ""; }; + 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; + 0DD00A7F16A05DAA00B661B2 /* Graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graph.h; sourceTree = ""; }; + 0DD00A8016A05DAA00B661B2 /* Graph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Graph.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0D6AEA151689DF2600034395 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6AEA1D1689DF2600034395 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0D6AEA0D1689DF2600034395 = { + isa = PBXGroup; + children = ( + 0D6AEA221689DF2600034395 /* iDNA */, + 0D6AEA1B1689DF2600034395 /* Frameworks */, + 0D6AEA191689DF2600034395 /* Products */, + ); + sourceTree = ""; + }; + 0D6AEA191689DF2600034395 /* Products */ = { + isa = PBXGroup; + children = ( + 0D6AEA181689DF2600034395 /* iDNA.app */, + ); + name = Products; + sourceTree = ""; + }; + 0D6AEA1B1689DF2600034395 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0D6AEA1C1689DF2600034395 /* Cocoa.framework */, + 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */, + 0D6AEA1E1689DF2600034395 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 0D6AEA1E1689DF2600034395 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 0D6AEA1F1689DF2600034395 /* AppKit.framework */, + 0D6AEA201689DF2600034395 /* CoreData.framework */, + 0D6AEA211689DF2600034395 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 0D6AEA221689DF2600034395 /* iDNA */ = { + isa = PBXGroup; + children = ( + 0D7E761C169A0BBA0089D9C8 /* Evolution.h */, + 0D7E761D169A0BBA0089D9C8 /* Evolution.m */, + 0D6AEA411689FE7300034395 /* Cell.h */, + 0D6AEA421689FE7300034395 /* Cell.m */, + 0D6AEA481689FF5500034395 /* NSMutableArray+Shuffle.h */, + 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */, + 0D6AEA2E1689DF2600034395 /* AppDelegate.h */, + 0D6AEA2F1689DF2600034395 /* AppDelegate.m */, + 0D6AEA311689DF2600034395 /* MainMenu.xib */, + 0D6AEA231689DF2600034395 /* Supporting Files */, + 0DD00A7F16A05DAA00B661B2 /* Graph.h */, + 0DD00A8016A05DAA00B661B2 /* Graph.m */, + ); + path = iDNA; + sourceTree = ""; + }; + 0D6AEA231689DF2600034395 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 0D6AEA241689DF2600034395 /* iDNA-Info.plist */, + 0D6AEA251689DF2600034395 /* InfoPlist.strings */, + 0D6AEA281689DF2600034395 /* main.m */, + 0D6AEA2A1689DF2600034395 /* iDNA-Prefix.pch */, + 0D6AEA2B1689DF2600034395 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 0D6AEA171689DF2600034395 /* iDNA */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0D6AEA361689DF2600034395 /* Build configuration list for PBXNativeTarget "iDNA" */; + buildPhases = ( + 0D6AEA141689DF2600034395 /* Sources */, + 0D6AEA151689DF2600034395 /* Frameworks */, + 0D6AEA161689DF2600034395 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iDNA; + productName = iDNA; + productReference = 0D6AEA181689DF2600034395 /* iDNA.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0D6AEA0F1689DF2600034395 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = witzawitz; + }; + buildConfigurationList = 0D6AEA121689DF2600034395 /* Build configuration list for PBXProject "iDNA" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 0D6AEA0D1689DF2600034395; + productRefGroup = 0D6AEA191689DF2600034395 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0D6AEA171689DF2600034395 /* iDNA */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0D6AEA161689DF2600034395 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6AEA271689DF2600034395 /* InfoPlist.strings in Resources */, + 0D6AEA2D1689DF2600034395 /* Credits.rtf in Resources */, + 0D6AEA331689DF2600034395 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0D6AEA141689DF2600034395 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0D6AEA291689DF2600034395 /* main.m in Sources */, + 0D6AEA301689DF2600034395 /* AppDelegate.m in Sources */, + 0D6AEA431689FE7400034395 /* Cell.m in Sources */, + 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */, + 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */, + 0DD00A8116A05DAA00B661B2 /* Graph.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 0D6AEA251689DF2600034395 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 0D6AEA261689DF2600034395 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 0D6AEA2B1689DF2600034395 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + 0D6AEA2C1689DF2600034395 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + 0D6AEA311689DF2600034395 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 0D6AEA321689DF2600034395 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0D6AEA341689DF2600034395 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 0D6AEA351689DF2600034395 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.8; + SDKROOT = macosx; + }; + name = Release; + }; + 0D6AEA371689DF2600034395 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 0D6AEA381689DF2600034395 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "iDNA/iDNA-Prefix.pch"; + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + INFOPLIST_FILE = "iDNA/iDNA-Info.plist"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0D6AEA121689DF2600034395 /* Build configuration list for PBXProject "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D6AEA341689DF2600034395 /* Debug */, + 0D6AEA351689DF2600034395 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0D6AEA361689DF2600034395 /* Build configuration list for PBXNativeTarget "iDNA" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0D6AEA371689DF2600034395 /* Debug */, + 0D6AEA381689DF2600034395 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0D6AEA0F1689DF2600034395 /* Project object */; +} diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2d38afe --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..a5d816b52d4ec044a1a9db421bbb5869507da248 GIT binary patch literal 25779 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 G|Nj6CKbjl> literal 0 HcmV?d00001 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 0000000..080373b --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme new file mode 100644 index 0000000..b7c2100 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNA.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme new file mode 100644 index 0000000..f6304b9 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/iDNAtests.xcscheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..35fd38b --- /dev/null +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + iDNA.xcscheme + + orderHint + 0 + + iDNAtests.xcscheme + + orderHint + 1 + + + SuppressBuildableAutocreation + + 0D6AEA171689DF2600034395 + + primary + + + 0D7E762C169B11AC0089D9C8 + + primary + + + + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h new file mode 100644 index 0000000..e1ede13 --- /dev/null +++ b/iDNA/iDNA/AppDelegate.h @@ -0,0 +1,49 @@ +// +// AppDelegate.h +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import +#import "Cell.h" +#import "Graph.h" +#import "Evolution.h" + +@interface AppDelegate : NSObject +{ + NSInteger populationSize; + NSInteger dnaLength; + NSInteger mutationRate; + + Evolution *evolution; +} + +@property (assign) IBOutlet NSWindow *window; + +// Text fields. +@property (weak) IBOutlet NSTextField *tfPopulationSize; +@property (weak) IBOutlet NSTextField *tfDnaLength; +@property (weak) IBOutlet NSTextField *tfMutationRate; +@property (weak) IBOutlet NSTextField *tfGoalDNA; +// Sliders. +@property (weak) IBOutlet NSSlider *slPopulationSize; +@property (weak) IBOutlet NSSlider *slDnaLength; +@property (weak) IBOutlet NSSlider *slMutationRate; +// Buttons. +@property (weak) IBOutlet NSButton *btStartEvolution; +@property (weak) IBOutlet NSButton *btPause; +@property (weak) IBOutlet NSButton *btLoadGoalDNA; +// Labels. +@property (weak) IBOutlet NSTextField *lbGeneration; +@property (weak) IBOutlet NSTextField *lbBestMatch; + +// View for drawing graph. +@property (weak) IBOutlet Graph *vwGraph; + +- (IBAction)startEvolution:(id)sender; +- (IBAction)pause:(id)sender; +- (IBAction)loadGoalDNA:(id)sender; + +@end diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m new file mode 100644 index 0000000..14ca377 --- /dev/null +++ b/iDNA/iDNA/AppDelegate.m @@ -0,0 +1,222 @@ +// +// AppDelegate.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate +{ + NSInteger maxPopulationSize; + NSInteger maxDnaLength; + NSInteger maxMutationRate; +} + +- (id) init +{ + if (self = [super init]) + { + maxDnaLength = 100; + maxMutationRate = 100; + maxPopulationSize = 10000; + + dnaLength = maxDnaLength / 2; + mutationRate = maxMutationRate / 2; + populationSize = maxPopulationSize / 2; + } + + return self; +} + +- (void) applicationDidFinishLaunching:(NSNotification *)aNotification +{ + [_slDnaLength setIntegerValue:dnaLength]; + [_slMutationRate setIntegerValue:mutationRate]; + [_slPopulationSize setIntegerValue:populationSize]; + + evolution = [[Evolution alloc] init]; + [self setGoalDNA]; + [self addObserver:self forKeyPath:@"dnaLength" options:NSKeyValueObservingOptionNew context:nil]; + [self addObserver:self forKeyPath:@"mutationRate" options:NSKeyValueObservingOptionNew context:nil]; + [self addObserver:self forKeyPath:@"populationSize" options:NSKeyValueObservingOptionNew context:nil]; + + [_vwGraph setHidden:YES]; +} + +-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // If any of parameters was changed we should reset evolution. + [evolution reset]; + [self setLabelForGeneration:0]; + [self setLabelForBestMatch:0]; + + [_vwGraph reset]; + [_vwGraph setNeedsDisplay:YES]; +} + +// Only for remove observers. +-(void) dealloc +{ + [self removeObserver:self forKeyPath:@"dnaLength"]; + [self removeObserver:self forKeyPath:@"mutationRate"]; + [self removeObserver:self forKeyPath:@"populationSize"]; +} + +- (IBAction)startEvolution:(id)sender +{ + [self checkInputValues]; + if (dnaLength > 0 && populationSize > 0) + { + dispatch_queue_t back = dispatch_queue_create("back", NULL); + dispatch_async(back, ^{ + [self setInputsEnabled:NO]; + + if ([evolution state] == INIT) + [evolution initWithMutationRate:mutationRate PopulationSize:populationSize DnaLength:dnaLength]; + else if ([evolution state] == PAUSED) + [evolution setState:STARTED]; + + while ([evolution state] == STARTED) + { + [evolution perfomStep]; + dispatch_sync(dispatch_get_main_queue(), ^{ + [self updateLabels]; + }); + } + [self setInputsEnabled:YES]; + }); + } + else + { + NSAlert *alert = [NSAlert alertWithMessageText:@"Какой-то из параметров равен 0." defaultButton:@"Просто закройся" alternateButton:@"Я понял" otherButton:@"Другая кнопка" informativeTextWithFormat:@"Скорее всего это размер ДНК или популяции."]; + [alert runModal]; + } +} + +-(void) checkInputValues +{ + [self setDnaLength:[_tfDnaLength integerValue]]; + [self setMutationRate:[_tfMutationRate integerValue]]; + // It can be over 1000 which implies a space after thousands. + //[self setPopulationSize:[[[_tfPopulationSize stringValue] stringByReplacingOccurrencesOfString:@"\t" withString:@""] integerValue]]; + [self setPopulationSize:[[[[_tfPopulationSize stringValue] componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] integerValue]]; +} + +// Pause button pressed. +- (IBAction)pause:(id)sender +{ + [evolution setState:PAUSED]; +} + +- (IBAction)loadGoalDNA:(id)sender +{ + [self openDNADialog]; +} + +-(void) openDNADialog +{ + NSOpenPanel *open = [NSOpenPanel openPanel]; + [open setCanChooseFiles:YES]; + [open setAllowsMultipleSelection:NO]; + [open setAllowedFileTypes:[NSArray arrayWithObjects:@"txt", nil]]; + + if ([open runModal] == NSOKButton) + { + @try + { + NSString *path = [[[open URLs] objectAtIndex:0] path]; + if (path) + { + NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + // Validate string. Force reading only necessary symbols. + content = [[content componentsSeparatedByCharactersInSet: [[NSCharacterSet characterSetWithCharactersInString:NUCLEOTIDES] invertedSet]] componentsJoinedByString:@""]; + content = [content substringToIndex:MIN([content length], maxDnaLength)]; + dnaLength = [content length]; + [_tfDnaLength setStringValue:[NSString stringWithFormat:@"%ld", dnaLength]]; + [_tfGoalDNA setStringValue:content]; + [evolution setGoalDNAwithString:@"content"]; + } + } + @catch(NSException *exception) + { + NSAlert *alert = [NSAlert alertWithMessageText:@"Неправильный файл." defaultButton:@"Просто закройся" alternateButton:@"Я понял" otherButton:@"Другая кнопка" informativeTextWithFormat:@"Что-то пошло не так."]; + [alert runModal]; + } + } +} + +// Set information for labels 'current generation' and 'best match'. +-(void) updateLabels +{ + [self setLabelForGeneration:[evolution step]]; + [self setLabelForBestMatch:[evolution bestMatch]]; +} + +-(void) setLabelForGeneration: (NSInteger) step +{ + [_lbGeneration setStringValue:[NSString stringWithFormat:@"%ld", step]]; +} + +-(void) setLabelForBestMatch: (NSInteger) bestMatch +{ + [_lbBestMatch setStringValue:[NSString stringWithFormat:@"%ld", bestMatch]]; +} + +// Enabling or disabling inputs. +- (void) setInputsEnabled: (Boolean) status +{ + [_btLoadGoalDNA setEnabled:status]; + [_btStartEvolution setEnabled:status]; + [_btPause setEnabled:!status]; + + [_tfDnaLength setEnabled:status]; + [_tfMutationRate setEnabled:status]; + [_tfPopulationSize setEnabled:status]; + + [_slDnaLength setEnabled:status]; + [_slMutationRate setEnabled:status]; + [_slPopulationSize setEnabled:status]; +} + +// Create new goal DNA and sets value to corresponding text field. +- (void) setGoalDNA +{ + [_tfGoalDNA setStringValue:[[evolution createGoalDNAWithLength:dnaLength] DNAtoString]]; +} + +// Getters. +- (NSInteger) dnaLength { return dnaLength; } +- (NSInteger) mutationRate { return mutationRate; } +- (NSInteger) populationSize { return populationSize; } + +// Setters. +- (void) setDnaLength: (NSInteger) x +{ + dnaLength = MIN(x, maxDnaLength); + [_tfDnaLength setStringValue:[NSString stringWithFormat:@"%ld", dnaLength]]; + if ([evolution state] == INIT || [evolution state] == FINISHED) + [self setGoalDNA]; +} + +- (void) setMutationRate: (NSInteger) x +{ + mutationRate = MIN(x, maxMutationRate); + [_tfMutationRate setStringValue:[NSString stringWithFormat:@"%ld", mutationRate]]; +} + +- (void) setPopulationSize: (NSInteger) x +{ + populationSize = MIN(x, maxPopulationSize); + [_tfPopulationSize setStringValue:[NSString stringWithFormat:@"%ld", populationSize]]; +} + +// Close app if window is closed. +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication +{ + return YES; +} + +@end diff --git a/iDNA/iDNA/Cell.h b/iDNA/iDNA/Cell.h new file mode 100644 index 0000000..20ee836 --- /dev/null +++ b/iDNA/iDNA/Cell.h @@ -0,0 +1,26 @@ +// +// Cell.h +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import +#define NUCLEOTIDES @"ATGC" + +@interface Cell : NSObject + +-(int) hammingDistance: (Cell *) cell; +-(NSInteger) DNAsize; +-(NSString *) getDNAatIndex: (NSInteger)index; +-(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index; +-(id) initWithCell: (Cell *) cell; +-(id) initWithDNAlength: (NSInteger) length; +-(id) initWithString: (NSString *) dna; +-(NSString *) DNAtoString; +-(Cell *) crossWithCell: (Cell *) otherCell; +-(void) mutate: (NSInteger) percentToReplace; +-(NSString *) randomNucleotide; + +@end diff --git a/iDNA/iDNA/Cell.m b/iDNA/iDNA/Cell.m new file mode 100644 index 0000000..0f93617 --- /dev/null +++ b/iDNA/iDNA/Cell.m @@ -0,0 +1,237 @@ +// +// Cell.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import "Cell.h" +#import "NSMutableArray+Shuffle.h" + +@implementation Cell +{ + NSMutableArray *DNA; + NSString *nucleotide; +} + +-(id) init +{ + self = [super init]; + + if (self) + { + [self initNucleotides]; + [self initDNAWithlength:100]; + } + + return self; +} + +-(void) initNucleotides +{ + nucleotide = NUCLEOTIDES; +} + +-(id) initWithDNAlength: (NSInteger) length +{ + if (self = [super init]) + { + [self initNucleotides]; + [self initDNAWithlength:length]; + } + return self; +} + +-(id) initWithCell: (Cell *) cell +{ + if (self = [super init]) + { + [self initNucleotides]; + + NSInteger DNAsize = [cell DNAsize]; + DNA = [[NSMutableArray alloc] initWithCapacity:DNAsize]; + for (NSInteger i = 0; i < DNAsize; i++) + [DNA setObject:[cell getDNAatIndex:i] atIndexedSubscript:i]; + } + return self; +} + +-(void) initDNAWithlength: (NSInteger) length +{ + int DNAsize = (int) length; + + // First init of DNA array. + DNA = [[NSMutableArray alloc] initWithCapacity:DNAsize]; + + // Fill with random nucleotides from corresponding array. + for (NSInteger i=0; i < DNAsize; i++) + { + [DNA setObject:[self randomNucleotide] atIndexedSubscript:i]; + } +} + +-(id) initWithString: (NSString *) dna +{ + if (self = [super init]) + { + [self initNucleotides]; + DNA = [[NSMutableArray alloc] initWithCapacity:[dna length]]; + for (NSInteger i = 0; i < [dna length]; i++) + [DNA setObject:[NSString stringWithFormat:@"%c", [dna characterAtIndex:i]] atIndexedSubscript:i]; + } + return self; +} + +-(int) hammingDistance: (Cell *) cell +{ + int dist = 0; + + // In case DNA size of two cells are differents. + NSInteger minDNAsize = MIN([cell DNAsize], [self DNAsize]); + NSInteger maxDNAsize = MAX([cell DNAsize], [self DNAsize]); + + // Comparing elements. + for (NSInteger i=0; i= [self DNAsize])) + return nil; + return [DNA objectAtIndex:index]; +} + +// Sets DNA nucleotide at given index. +-(void) setDNA: (NSString *) nucluotide atIndex: (NSInteger)index +{ + if ((index >= 0) && (index < [self DNAsize])) + { + [DNA setObject:nucluotide atIndexedSubscript:index]; + } +} + +// Return random nucleotide from corresponding array. +-(NSString *) randomNucleotide +{ + return [NSString stringWithFormat:@"%c", [nucleotide characterAtIndex:arc4random_uniform((int)[nucleotide length])]]; +} + +-(NSString *) randomNucleotideExceptGiven: (NSString *) except +{ + @autoreleasepool + { + NSString *ncl = [nucleotide stringByReplacingOccurrencesOfString:except withString:@""]; + return [NSString stringWithFormat:@"%c", [ncl characterAtIndex:arc4random_uniform((int)[ncl length])]]; + } +} + +-(void) setRandomDNAatIndex:(NSInteger) index +{ + [self setDNA:[self randomNucleotideExceptGiven:[self getDNAatIndex:index]] atIndex:index]; +} + +-(Cell *) crossWithCell: (Cell *) otherCell +{ + switch (arc4random_uniform(3)) + { + case 0: + return [self crossByHalfWithCell:otherCell]; + case 1: + return [self crossByOnePercentWithCell:otherCell]; + case 2: + return [self crossByPartsWithCell:otherCell]; + default: + return self; + } +} + +-(Cell *) crossByHalfWithCell: (Cell *) otherCell +{ + if ([self DNAsize] != [otherCell DNAsize]) + return self; + for (NSInteger i = [self DNAsize] / 2; i<[self DNAsize]; i++) + [self setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return self; +} + +-(Cell *) crossByOnePercentWithCell: (Cell *) otherCell +{ + if ([self DNAsize] != [otherCell DNAsize]) + return self; + for (NSInteger i = 0; i < [self DNAsize]; i++) + if (i % 2 == 1) + [self setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return self; +} + +-(Cell *) crossByPartsWithCell: (Cell *) otherCell +{ + if ([self DNAsize] != [otherCell DNAsize]) + return self; + for (NSInteger i = [self DNAsize]/5; i < 4*[self DNAsize]/5; i++) + [self setDNA:[otherCell getDNAatIndex:i] atIndex:i]; + return self; +} + +-(void) mutate: (NSInteger) percentToReplace +{ + // Explicit number of element to replace. + NSInteger replace = percentToReplace * [self DNAsize] / 100; + + // Some preparation in case of data out of range. + if (replace < 0) + replace = 0; + if (replace > [self DNAsize]) + replace = [self DNAsize]; + + // Nothing to do here. + if (replace == 0) + return; + + NSInteger i = 0; + + // Array that stores indices to replace. + NSMutableArray *indicesToReplace = [[NSMutableArray alloc] initWithCapacity:[self DNAsize]]; + for (i = 0; i < [self DNAsize]; i++) + [indicesToReplace setObject:[NSNumber numberWithInteger:i] atIndexedSubscript:i]; + // Shuffle it! + [indicesToReplace shuffle]; + + for (i = 0; i < replace; i++) + { + [self setRandomDNAatIndex:[[indicesToReplace objectAtIndex:i] integerValue]]; + } +} + +// Returns DNA as string. +-(NSString *) DNAtoString +{ + NSMutableString *output = [[NSMutableString alloc] init]; + for (NSInteger i = 0; i < [self DNAsize]; i++) + { + [output appendString: [self getDNAatIndex:i]]; + } + return output; +} + +@end diff --git a/iDNA/iDNA/Evolution.h b/iDNA/iDNA/Evolution.h new file mode 100644 index 0000000..bc43177 --- /dev/null +++ b/iDNA/iDNA/Evolution.h @@ -0,0 +1,43 @@ +// +// Evolution.h +// iDNA +// +// Created by n on 06.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import +#import "Cell.h" + +// States of evolution process. +#define INIT 0 +#define STARTED 1 +#define FINISHED 2 +#define PAUSED 3 + +@interface Evolution : NSObject +{ + NSInteger step; + NSInteger state; + + NSInteger mutationRate; + NSInteger populationSize; + NSInteger dnaLength; + + NSInteger bestMatch; + + NSMutableArray *population; + Cell *goalDNA; +} + +-(Cell *) createGoalDNAWithLength:(NSInteger) length; +-(void) initWithMutationRate:(NSInteger)rate PopulationSize: (NSInteger) size DnaLength: (NSInteger) length; +-(void) perfomStep; +-(NSInteger) state; +-(NSInteger) step; +-(NSInteger) bestMatch; +-(void) reset; +-(void) setState: (NSInteger) st; +-(void) setGoalDNAwithString: (NSString *) dna; + +@end diff --git a/iDNA/iDNA/Evolution.m b/iDNA/iDNA/Evolution.m new file mode 100644 index 0000000..fd6feee --- /dev/null +++ b/iDNA/iDNA/Evolution.m @@ -0,0 +1,150 @@ +// +// Evolution.m +// iDNA +// +// Created by n on 06.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import "Evolution.h" + +@implementation Evolution + +-(id) init +{ + if (self = [super init]) + { + step = 0; + state = INIT; + bestMatch = 0; + } + return self; +} + +-(NSInteger) state { return state; } +-(NSInteger) step { return step; } + +// Create goal DNA with given length. +-(Cell *) createGoalDNAWithLength:(NSInteger) length +{ + goalDNA = [[Cell alloc] initWithDNAlength:length]; + return goalDNA; +} + +// Init population with given parameters. +-(void) creatPopulation +{ + population = [[NSMutableArray alloc] initWithCapacity:populationSize]; + for (NSInteger i = 0; i < populationSize; i++) + { + [population setObject:[[Cell alloc] initWithDNAlength:dnaLength] atIndexedSubscript:i]; + } +} + +// Setters. +-(void) setMutationRate: (NSInteger) rate { mutationRate = rate; } +-(void) setPopulationSize: (NSInteger) size { populationSize = size; } +-(void) setDnaLength: (NSInteger) length { dnaLength = length; } +-(void) setState: (NSInteger) st { state = st; } +-(void) setGoalDNAwithString: (NSString *) dna +{ + [self reset]; + goalDNA = [[Cell alloc] initWithString:dna]; + dnaLength = [goalDNA DNAsize]; +} + +// Initialization with parameters. +-(void) initWithMutationRate:(NSInteger)rate PopulationSize: (NSInteger) size DnaLength: (NSInteger) length +{ + [self setMutationRate:rate]; + [self setPopulationSize:size]; + [self setDnaLength:length]; + + if (state == INIT) + { + [self creatPopulation]; + state = STARTED; + } +} + +// Performs one step of evolution. +-(void) perfomStep +{ + step++; + [self sortPopulation]; + if ([self isZeroHammingDistance]) + { + state = FINISHED; + return; + } + + [self crossPopulation]; + [self mutatePopulation]; +} + +// Sort population by hamming distance. +- (void) sortPopulation +{ + NSArray *sorted = [population sortedArrayUsingComparator:^NSComparisonResult (id a, id b){ + NSNumber *first = [NSNumber numberWithInt:[(Cell *)a hammingDistance:goalDNA]]; + NSNumber *second = [NSNumber numberWithInt:[(Cell *)b hammingDistance:goalDNA]]; + return first > second; + }]; + population = [NSMutableArray arrayWithArray:sorted]; +} + +// Cross first half of population and replace the second. +- (void) crossPopulation +{ + for (NSInteger i = ceil([population count] / 2); i < [population count]; i++) + { + [population setObject:[self crossDNAfromTop] atIndexedSubscript:i]; + } +} + +// Crosses two random DNA from first half. +- (Cell *) crossDNAfromTop +{ + int half = ceil([population count] / 2); + Cell *cell1 = [population objectAtIndex:arc4random_uniform(half)]; + Cell *cell2 = [population objectAtIndex:arc4random_uniform(half)]; + + return [cell1 crossWithCell:cell2]; +} + +// Mutate the whole population. +- (void) mutatePopulation +{ + for (Cell *cell in population) + [cell mutate:mutationRate]; +} + +// Checks whether there is cell with hamming distance = 0. +// Implying the population array is sorted. +- (Boolean) isZeroHammingDistance +{ + if ([population count] < 1) + return NO; + if ([goalDNA hammingDistance:[population objectAtIndex:0]] == 0) + return YES; + return NO; +} + +-(NSInteger) bestMatch +{ + NSInteger bestHD = 0; + if ([population count] > 0) + bestHD = [goalDNA hammingDistance:[population objectAtIndex:0]]; + bestMatch = MAX(bestMatch, 100 - 100 * bestHD / dnaLength); + + return bestMatch; +} + +-(void) reset +{ + state = INIT; + step = 0; + bestMatch = 0; +} + +@end diff --git a/iDNA/iDNA/Graph.h b/iDNA/iDNA/Graph.h new file mode 100644 index 0000000..0c633ca --- /dev/null +++ b/iDNA/iDNA/Graph.h @@ -0,0 +1,23 @@ +// +// Graph.h +// iDNA +// +// Created by n on 11.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import + +@interface Graph : NSView +{ + NSPointArray points; + NSMutableData *pointData; + float width; + float height; + float originX; +} + +-(void) addPointWithY: (float) y; +-(void) reset; + +@end diff --git a/iDNA/iDNA/Graph.m b/iDNA/iDNA/Graph.m new file mode 100644 index 0000000..1806bab --- /dev/null +++ b/iDNA/iDNA/Graph.m @@ -0,0 +1,78 @@ +// +// Graph.m +// iDNA +// +// Created by n on 11.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import "Graph.h" + +@implementation Graph + +- (id)initWithFrame:(NSRect)frame +{ + self = [super initWithFrame:frame]; + if (self) + { + pointData = [[NSMutableData alloc] init]; + width = self.frame.size.width; + height = self.frame.size.height; + originX = self.frame.origin.x; + } + + return self; +} + +-(void) addPoint: (NSPoint) point +{ + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + [pointData setLength:(pointCount+1) * sizeof(NSPoint)]; + points = [pointData mutableBytes]; + points[pointCount] = point; +} + +-(void) addPointWithX: (float) x andY: (float) y +{ + [self addPoint:NSMakePoint(x, y)]; +} + +-(void) addPointWithY: (float) y +{ + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + if (pointCount == 0) + [self addPoint:NSMakePoint(0, y)]; + else + { + float lastX = points[pointCount-1].x; + [self addPoint:NSMakePoint(lastX+1, y)]; + } +} + +-(void) reset +{ + [pointData setLength:0]; + points = NULL; +} + +- (void)drawRect:(NSRect)rect +{ + [NSBezierPath strokeLineFromPoint:NSMakePoint(0, 0) toPoint:NSMakePoint(0, height)]; + [NSBezierPath strokeLineFromPoint:NSMakePoint(0, 0) toPoint:NSMakePoint(width, 0)]; + + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + if (pointCount > 0) + { + NSBezierPath *path = [NSBezierPath bezierPath]; + NSUInteger pointCount = [pointData length] / sizeof(NSPoint); + if (pointCount > width) + { + //originX--; + //[self translateOriginToPoint:NSMakePoint(-points[pointCount-(int)width-1].x, 0)]; + } + [path appendBezierPathWithPoints:[pointData mutableBytes] count: pointCount]; + [path stroke]; + } +} + +@end diff --git a/iDNA/iDNA/NSMutableArray+Shuffle.h b/iDNA/iDNA/NSMutableArray+Shuffle.h new file mode 100644 index 0000000..374d469 --- /dev/null +++ b/iDNA/iDNA/NSMutableArray+Shuffle.h @@ -0,0 +1,13 @@ +// +// NSMutableArray+Shuffle.h +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import + +@interface NSMutableArray (Shuffle) +-(void) shuffle; +@end diff --git a/iDNA/iDNA/NSMutableArray+Shuffle.m b/iDNA/iDNA/NSMutableArray+Shuffle.m new file mode 100644 index 0000000..66a3174 --- /dev/null +++ b/iDNA/iDNA/NSMutableArray+Shuffle.m @@ -0,0 +1,22 @@ +// +// NSMutableArray+Shuffle.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import "NSMutableArray+Shuffle.h" + +@implementation NSMutableArray (Shuffle) + +// Everyday I'm shuffling! +-(void) shuffle +{ + for (NSInteger i = 0; i < [self count] - 1; i++) + { + [self exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((int)([self count]-i)) + i]; + } +} + +@end diff --git a/iDNA/iDNA/en.lproj/Credits.rtf b/iDNA/iDNA/en.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/iDNA/iDNA/en.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/iDNA/iDNA/en.lproj/InfoPlist.strings b/iDNA/iDNA/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNA/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib new file mode 100644 index 0000000..330201a --- /dev/null +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -0,0 +1,5649 @@ + + + + 1080 + 12C60 + 2844 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2844 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSCustomView + NSMenu + NSMenuItem + NSSlider + NSSliderCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + iDNA + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + iDNA + + + + About iDNA + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide iDNA + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit iDNA + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligatures + + 2147483647 + + + submenuAction: + + Ligatures + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + iDNA Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {505, 343}} + 880279552 + iDNA + NSWindow + + + {505, 343} + {505, 343} + + + 256 + + + + 268 + {{17, 306}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Population size + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 272}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + DNA length + + _NS:1535 + + + + + NO + + + + 268 + {{17, 240}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Mutation rate % + + _NS:1535 + + + + + NO + + + + 268 + {{140, 301}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304256 + 5000 + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + + 268 + {{140, 267}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + -2076179456 + 50 + + _NS:9 + + YES + + + + NO + + + + 268 + {{140, 235}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304192 + 50 + + _NS:9 + + YES + + + + NO + + + + 268 + {{197, 301}, {290, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 10000 + 0.0 + 5000 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{197, 267}, {290, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{197, 235}, {290, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{17, 215}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Generation + + _NS:1535 + + + + + NO + + + + 268 + {{137, 215}, {57, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + 0 + + _NS:1535 + + + + + NO + + + + 268 + {{17, 190}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Best match % + + _NS:1535 + + + + + NO + + + + 268 + {{17, 165}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Goal DNA + + _NS:1535 + + + + + NO + + + + 268 + {{137, 190}, {57, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + 0 + + _NS:1535 + + + + + NO + + + + 268 + {{20, 49}, {465, 108}} + + + + _NS:9 + {250, 750} + YES + + -1805647871 + 272629760 + + + _NS:9 + + YES + + + + NO + + + + 268 + {{14, 13}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Start evolution + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{357, 13}, {134, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Load goal DNA + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{146, 13}, {77, 32}} + + + + _NS:9 + YES + + 603979776 + 134217728 + Pause + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{206, 165}, {279, 67}} + + + + _NS:9 + Graph + + + {505, 343} + + + + + {{0, 0}, {1280, 778}} + {505, 365} + {505, 365} + YES + + + AppDelegate + + + NSFontManager + + + YES + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + addFontTrait: + + + + 421 + + + + addFontTrait: + + + + 422 + + + + modifyFont: + + + + 423 + + + + orderFrontFontPanel: + + + + 424 + + + + modifyFont: + + + + 425 + + + + window + + + + 532 + + + + tfGoalDNA + + + + 1456 + + + + startEvolution: + + + + 1457 + + + + tfPopulationSize + + + + 1458 + + + + tfDnaLength + + + + 1459 + + + + tfMutationRate + + + + 1460 + + + + slPopulationSize + + + + 1461 + + + + slDnaLength + + + + 1462 + + + + slMutationRate + + + + 1463 + + + + btStartEvolution + + + + 1464 + + + + btPause + + + + 1465 + + + + btLoadGoalDNA + + + + 1466 + + + + pause: + + + + 1467 + + + + lbGeneration + + + + 1477 + + + + lbBestMatch + + + + 1478 + + + + vwGraph + + + + 1530 + + + + loadGoalDNA: + + + + 1531 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1434 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1437 + + + + value: self.dnaLength + + + + + + value: self.dnaLength + value + self.dnaLength + 2 + + + 1455 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 1443 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1345 + + + + takeIntValueFrom: + + + + 1362 + + + + takeIntValueFrom: + + + + 1363 + + + + value: self.dnaLength + + + + + + value: self.dnaLength + value + self.dnaLength + 2 + + + 1450 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 1361 + + + + takeIntValueFrom: + + + + 1364 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 12 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 206 + + 1000 + + 3 + 9 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 10 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 420 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + 1132 + + + + + + 7 + 0 + + 0 + 1 + + 112 + + 1000 + + 3 + 9 + 1 + + + + + + 1133 + + + + + 1137 + + + + + + + + 1138 + + + + + 1200 + + + + + + + + 1201 + + + + + 1206 + + + + + + 7 + 0 + + 0 + 1 + + 51 + + 1000 + + 3 + 9 + 1 + + + + + + 1207 + + + + + 1211 + + + + + 1212 + + + + + + + + 1214 + + + + + + 1220 + + + + + + + + 1221 + + + + + 1241 + + + + + 1242 + + + + + 1246 + + + + + 1248 + + + + + 1267 + + + + + 1295 + + + + + 1296 + + + + + 1298 + + + + + 1299 + + + + + 1302 + + + + + 1303 + + + + + 1304 + + + + + 1306 + + + + + 1307 + + + + + + + + 1308 + + + + + 1313 + + + + + 1314 + + + + + + + + 1316 + + + + + 1323 + + + + + 1324 + + + + + + + + 1325 + + + + + 1329 + + + + + 1336 + + + + + 1354 + + + + + 1355 + + + + + 1356 + + + + + 1357 + + + + + 1358 + + + + + 1365 + + + + + + + + 1366 + + + + + 1368 + + + + + 1369 + + + + + 1370 + + + + + + + + 1371 + + + + + 1374 + + + + + 1375 + + + + + 1376 + + + + + 1377 + + + + + 1378 + + + + + + + + 1379 + + + + + + + + 1380 + + + + + 1381 + + + + + 1383 + + + + + 1386 + + + + + 1388 + + + + + 1389 + + + + + 1390 + + + + + 1391 + + + + + 1392 + + + + + + + + 1393 + + + + + 1397 + + + + + 1398 + + + + + 1399 + + + + + 1400 + + + + + + 8 + 0 + + 0 + 1 + + 108 + + 1000 + + 3 + 9 + 1 + + + + + + 1401 + + + + + 1402 + + + + + 1403 + + + + + 1406 + + + + + 1409 + + + + + + + + 1410 + + + + + 1411 + + + + + 1412 + + + + + 1413 + + + + + + + + 1414 + + + + + 1417 + + + + + 1418 + + + + + 1419 + + + + + + + + 1420 + + + + + 1423 + + + + + 1424 + + + + + 1425 + + + + + 1426 + + + + + 1486 + + + + + 1488 + + + + + 1490 + + + + + 1493 + + + + + 1522 + + + + + 1523 + + + + + 1525 + + + + + 1528 + + + + + 1529 + + + + + + + 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 + + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{380, 496}, {480, 360}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + 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 + 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 + 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 + 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 + 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 + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 1531 + + + + + AppDelegate + NSObject + + id + id + id + + + + loadGoalDNA: + id + + + pause: + id + + + startEvolution: + id + + + + NSButton + NSButton + NSButton + NSTextField + NSTextField + NSSlider + NSSlider + NSSlider + NSTextField + NSTextField + NSTextField + NSTextField + Graph + NSWindow + + + + btLoadGoalDNA + NSButton + + + btPause + NSButton + + + btStartEvolution + NSButton + + + lbBestMatch + NSTextField + + + lbGeneration + NSTextField + + + slDnaLength + NSSlider + + + slMutationRate + NSSlider + + + slPopulationSize + NSSlider + + + tfDnaLength + NSTextField + + + tfGoalDNA + NSTextField + + + tfMutationRate + NSTextField + + + tfPopulationSize + NSTextField + + + vwGraph + Graph + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + Graph + NSView + + IBProjectSource + ./Classes/Graph.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + diff --git a/iDNA/iDNA/iDNA-Info.plist b/iDNA/iDNA/iDNA-Info.plist new file mode 100644 index 0000000..8abc952 --- /dev/null +++ b/iDNA/iDNA/iDNA-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + bie.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2012 witzawitz. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/iDNA/iDNA/iDNA-Prefix.pch b/iDNA/iDNA/iDNA-Prefix.pch new file mode 100644 index 0000000..41eaf80 --- /dev/null +++ b/iDNA/iDNA/iDNA-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iDNA' target in the 'iDNA' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/iDNA/iDNA/main.m b/iDNA/iDNA/main.m new file mode 100644 index 0000000..cb2669b --- /dev/null +++ b/iDNA/iDNA/main.m @@ -0,0 +1,14 @@ +// +// main.m +// iDNA +// +// Created by n on 25.12.12. +// Copyright (c) 2012 witzawitz. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/iDNA/iDNAtests/en.lproj/InfoPlist.strings b/iDNA/iDNAtests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNAtests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNAtests/iDNAtests-Info.plist b/iDNA/iDNAtests/iDNAtests-Info.plist new file mode 100644 index 0000000..16679ab --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + bie.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/iDNA/iDNAtests/iDNAtests-Prefix.pch b/iDNA/iDNAtests/iDNAtests-Prefix.pch new file mode 100644 index 0000000..8e69d7b --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'iDNAtests' target in the 'iDNAtests' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/iDNA/iDNAtests/iDNAtests.h b/iDNA/iDNAtests/iDNAtests.h new file mode 100644 index 0000000..e00857d --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests.h @@ -0,0 +1,13 @@ +// +// iDNAtests.h +// iDNAtests +// +// Created by n on 07.01.13. +// Copyright (c) 2013 witzawitz. All rights reserved. +// + +#import + +@interface iDNAtests : SenTestCase + +@end diff --git a/iDNA/iDNAtests/iDNAtests.m b/iDNA/iDNAtests/iDNAtests.m new file mode 100644 index 0000000..13edc92 --- /dev/null +++ b/iDNA/iDNAtests/iDNAtests.m @@ -0,0 +1,24 @@ +#import "iDNAtests.h" + +@implementation iDNAtests + +- (void)setUp +{ + [super setUp]; + + // Set-up code here. +} + +- (void)tearDown +{ + // Tear-down code here. + + [super tearDown]; +} + +- (void)testExample +{ + STFail(@"Unit tests are not implemented yet in iDNAtests"); +} + +@end From d80c488657dfbf859a86a7af1a36d5697125cdf3 Mon Sep 17 00:00:00 2001 From: n Date: Thu, 7 Feb 2013 18:23:08 +0400 Subject: [PATCH 2/4] Pause works as expected. --- .../UserInterfaceState.xcuserstate | Bin 25779 -> 28334 bytes .../xcdebugger/Expressions.xcexplist | 4 ++ .../xcdebugger/Breakpoints.xcbkptlist | 59 ++++++++++++++---- iDNA/iDNA/AppDelegate.m | 19 +++++- 4 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/xcdebugger/Expressions.xcexplist diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index a5d816b52d4ec044a1a9db421bbb5869507da248..c09f74a26d0661b45f09e1ac0541cc02c366e326 100644 GIT binary patch literal 28334 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 diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/xcdebugger/Expressions.xcexplist b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/xcdebugger/Expressions.xcexplist new file mode 100644 index 0000000..1f7c506 --- /dev/null +++ b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -0,0 +1,4 @@ + + + diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index 080373b..e7e7703 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380064222.089664" + timestampString = "381939548.280556" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "198" - endingLineNumber = "198" + startingLineNumber = "211" + endingLineNumber = "211" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -99,11 +99,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380063088.913543" + timestampString = "381939548.280556" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "101" - endingLineNumber = "101" + startingLineNumber = "114" + endingLineNumber = "114" landmarkName = "-checkInputValues" landmarkType = "5"> @@ -112,11 +112,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380064222.089664" + timestampString = "381939548.280556" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "133" - endingLineNumber = "133" + startingLineNumber = "146" + endingLineNumber = "146" landmarkName = "-openDNADialog" landmarkType = "5"> @@ -138,13 +138,48 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380063598.100505" + timestampString = "381939548.280556" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "103" - endingLineNumber = "103" + startingLineNumber = "116" + endingLineNumber = "116" landmarkName = "-checkInputValues" landmarkType = "5"> + + + + + + + + + + diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 14ca377..b60d33a 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -70,6 +70,7 @@ - (IBAction)startEvolution:(id)sender [self checkInputValues]; if (dnaLength > 0 && populationSize > 0) { + // Async evolution in another thread. dispatch_queue_t back = dispatch_queue_create("back", NULL); dispatch_async(back, ^{ [self setInputsEnabled:NO]; @@ -98,11 +99,23 @@ - (IBAction)startEvolution:(id)sender -(void) checkInputValues { - [self setDnaLength:[_tfDnaLength integerValue]]; - [self setMutationRate:[_tfMutationRate integerValue]]; + NSInteger currentDnaLength = [_tfDnaLength integerValue]; + NSInteger currentMutationRate = [_tfMutationRate integerValue]; + NSInteger currentPopulationSize = [[[[_tfPopulationSize stringValue] componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] integerValue]; + + // Check if any value was changed. + if (currentDnaLength != [self dnaLength]) + [self setDnaLength:currentDnaLength]; + if (currentMutationRate != [self mutationRate]) + [self setMutationRate:currentMutationRate]; + if (currentPopulationSize != [self populationSize]) + [self setPopulationSize:currentPopulationSize]; + +// [self setDnaLength:]; +// [self setMutationRate:]; // It can be over 1000 which implies a space after thousands. //[self setPopulationSize:[[[_tfPopulationSize stringValue] stringByReplacingOccurrencesOfString:@"\t" withString:@""] integerValue]]; - [self setPopulationSize:[[[[_tfPopulationSize stringValue] componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""] integerValue]]; +// [self setPopulationSize:]; } // Pause button pressed. From 5568ac77d555e974cff116658d8ec964163dd3db Mon Sep 17 00:00:00 2001 From: n Date: Sat, 9 Feb 2013 21:27:02 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=9B=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iDNA/iDNA.xcodeproj/project.pbxproj | 27 +- .../UserInterfaceState.xcuserstate | Bin 28334 -> 35045 bytes .../xcdebugger/Breakpoints.xcbkptlist | 82 +- iDNA/iDNA/AppDelegate.h | 5 +- iDNA/iDNA/AppDelegate.m | 26 +- iDNA/iDNA/en.lproj/Localizable.strings | 0 iDNA/iDNA/en.lproj/MainMenu.xib | 3890 +++-------------- iDNA/iDNA/ru.lproj/Credits.rtf | 29 + iDNA/iDNA/ru.lproj/InfoPlist.strings | 2 + iDNA/iDNA/ru.lproj/Localizable.strings | 8 + iDNA/iDNA/ru.lproj/MainMenu.xib | 3173 ++++++++++++++ 11 files changed, 3994 insertions(+), 3248 deletions(-) create mode 100644 iDNA/iDNA/en.lproj/Localizable.strings create mode 100644 iDNA/iDNA/ru.lproj/Credits.rtf create mode 100644 iDNA/iDNA/ru.lproj/InfoPlist.strings create mode 100644 iDNA/iDNA/ru.lproj/Localizable.strings create mode 100644 iDNA/iDNA/ru.lproj/MainMenu.xib diff --git a/iDNA/iDNA.xcodeproj/project.pbxproj b/iDNA/iDNA.xcodeproj/project.pbxproj index 886b163..af963d7 100644 --- a/iDNA/iDNA.xcodeproj/project.pbxproj +++ b/iDNA/iDNA.xcodeproj/project.pbxproj @@ -16,7 +16,7 @@ 0D6AEA431689FE7400034395 /* Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA421689FE7300034395 /* Cell.m */; }; 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D6AEA491689FF5500034395 /* NSMutableArray+Shuffle.m */; }; 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D7E761D169A0BBA0089D9C8 /* Evolution.m */; }; - 0DD00A8116A05DAA00B661B2 /* Graph.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DD00A8016A05DAA00B661B2 /* Graph.m */; }; + 0DD850ED16C401A8002ECD1C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0DD850EF16C401A8002ECD1C /* Localizable.strings */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -40,8 +40,11 @@ 0D7E761C169A0BBA0089D9C8 /* Evolution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Evolution.h; sourceTree = ""; }; 0D7E761D169A0BBA0089D9C8 /* Evolution.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Evolution.m; sourceTree = ""; }; 0D7E762E169B11AC0089D9C8 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = Library/Frameworks/SenTestingKit.framework; sourceTree = DEVELOPER_DIR; }; - 0DD00A7F16A05DAA00B661B2 /* Graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graph.h; sourceTree = ""; }; - 0DD00A8016A05DAA00B661B2 /* Graph.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Graph.m; sourceTree = ""; }; + 0DD850E816C3FFAC002ECD1C /* ru */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = ru; path = ru.lproj/MainMenu.xib; sourceTree = ""; }; + 0DD850E916C3FFAC002ECD1C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/InfoPlist.strings; sourceTree = ""; }; + 0DD850EA16C3FFAD002ECD1C /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = ru; path = ru.lproj/Credits.rtf; sourceTree = ""; }; + 0DD850EE16C401A8002ECD1C /* en */ = {isa = PBXFileReference; lastKnownFileType = file; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 0DD850F016C401AD002ECD1C /* ru */ = {isa = PBXFileReference; lastKnownFileType = file; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -106,8 +109,7 @@ 0D6AEA2F1689DF2600034395 /* AppDelegate.m */, 0D6AEA311689DF2600034395 /* MainMenu.xib */, 0D6AEA231689DF2600034395 /* Supporting Files */, - 0DD00A7F16A05DAA00B661B2 /* Graph.h */, - 0DD00A8016A05DAA00B661B2 /* Graph.m */, + 0DD850EF16C401A8002ECD1C /* Localizable.strings */, ); path = iDNA; sourceTree = ""; @@ -159,6 +161,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + ru, ); mainGroup = 0D6AEA0D1689DF2600034395; productRefGroup = 0D6AEA191689DF2600034395 /* Products */; @@ -178,6 +181,7 @@ 0D6AEA271689DF2600034395 /* InfoPlist.strings in Resources */, 0D6AEA2D1689DF2600034395 /* Credits.rtf in Resources */, 0D6AEA331689DF2600034395 /* MainMenu.xib in Resources */, + 0DD850ED16C401A8002ECD1C /* Localizable.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -193,7 +197,6 @@ 0D6AEA431689FE7400034395 /* Cell.m in Sources */, 0D6AEA4A1689FF5500034395 /* NSMutableArray+Shuffle.m in Sources */, 0D7E761E169A0BBA0089D9C8 /* Evolution.m in Sources */, - 0DD00A8116A05DAA00B661B2 /* Graph.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -204,6 +207,7 @@ isa = PBXVariantGroup; children = ( 0D6AEA261689DF2600034395 /* en */, + 0DD850E916C3FFAC002ECD1C /* ru */, ); name = InfoPlist.strings; sourceTree = ""; @@ -212,6 +216,7 @@ isa = PBXVariantGroup; children = ( 0D6AEA2C1689DF2600034395 /* en */, + 0DD850EA16C3FFAD002ECD1C /* ru */, ); name = Credits.rtf; sourceTree = ""; @@ -220,10 +225,20 @@ isa = PBXVariantGroup; children = ( 0D6AEA321689DF2600034395 /* en */, + 0DD850E816C3FFAC002ECD1C /* ru */, ); name = MainMenu.xib; sourceTree = ""; }; + 0DD850EF16C401A8002ECD1C /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 0DD850EE16C401A8002ECD1C /* en */, + 0DD850F016C401AD002ECD1C /* ru */, + ); + name = Localizable.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index c09f74a26d0661b45f09e1ac0541cc02c366e326..f8b321d5868c893fb862d0b34a89928ddc1db901 100644 GIT binary patch literal 35045 zcmdUY30zdw_xQW_Ei>}~9d=}qVU>NGfdK@B0aO$O0oh>~h5<%dh5=kt-*rnfEj2SU zQ^0*MOX)m)fE6Xg`%%%T*^B7=KT7Lcdet-WyeFWaS@7#0GJ=;C!-gB!A z_4=09h=?-;ARs{!6hRXV`xSe>$alQX*rIQ0Eb?ut8mrT`wiNqnjM_Rqew^>y+GMaJ zz?{|FZOKSNM2HD{!hvuk0*N3Zmt5|fC@#57_CF_)M}JVrcDJWZ@1o*`Be?Zi%E7x4nIo7h9V zNW4V6OuRxIBiwX+i3`Lx#3kZq;tFwtxJCR*+$HW2 zzX2LBfCc?Pe;@@;z!eMxo?sA&0Q z9J~uof>Yo$I0HTepMcN7IdBpD2nh(F4eST|Ln*X{j?f7Xgq~0aePIBMfl3$)<6t}- z3=?1?Oo2n;FgP4$!dzGcOJNyQ!%C=y)ldiZa4Z}L>!AU*!ZwKD3^)_cg0ta#5CI>B zi{TQu96k+K!S!$h+z2^;84ZNHtLgs+lrUEmSKtgPKXrqGnTbsE4UV z)Kcn6>S<~PwTfCzZK1YO+oH_sW^#k=2b%(l3-J^b^37Vp5+J^2&_owY?XWEbUrw7pibRZo>2h$;R6fLJ? z=>&Q>okQo-MRW~aOV`o$bTe(F$I}nd9F6Gt^rQ3wdLjK7y@Y;}ewOZ_JL&cG2Kq(% zCHiIh6?!kdkA9WjPrptdq2HoU(`V@S==bRl=+EhM^cVEk^mp`S`X~Bl`WF2weVe{R z-(?`fFb<3(Ini<1v zWVSNfnCF?D%pT@NW-qgkd5t;99AS2CWDqrrri!MC zri(Zc63r0J6wMMnE?Oj7ELtL3C0Z?N7j=j_MQcQBMbC+z7wr`75*-k|CORlOBswg5 zU35frN_1LuM)aQOebEP^4@KuiUyCk?z7bs&T@zgw12Ghn;{IZ(*j8*O9w_z{%fun# zP;riZjI};!<&$xLm9kj}?y-PY_QOPZCcS&k;W?o-3XwUMhZ4 zyiD9FUL#&BUMGHDyi>eO{DSy3@j>w+@nP}1;*;W2;mSnbMkz}!CiR1~%QpuB&Ws;{PYb0wW>m=(XJ0-g$FGzMv z4oVJ54olvZoRoYZ`9$)mM##UofeLc3sYH3n$)GS`AQjX_QQzFA%c#br(AVg7Mzz!vH&4;F zVrSsN==Sa`zp1IdN@L7uDbTm*tLkxQF5QUWVW=!$O_>rI5gj6ni<}xFn-ZyrQ1HLU zO`UqmH1~2Mx}6w+$=LrCp(J97I3m78nD$0Y$0FfZT?^)p6r)iysRK6{Tr?^#+vLHR zr!kQjMg(jml87NhGLb^4h*TntNGFDJwwxVj&pB|8oD=8Fxo`tE62tKXjvz)7nM4+z z&}<@ybH!7b&3(ari$DUGg1|5YhI4-9cu48h`qn06iczOgOQrblyt<|dqcr37wHo|b zEpc4b5jPqlKQf>0Bc zgodahv_v(brR&Vw7sd2%w&i}U7uHWIZ&9icZ-uAXQh8nFoYa{gS2iE?$^A?`z7 z2-H$pnyyCER^OV#dzvk+n7wj!2BWS8|DtKdt|w-CCya?eE)$>TVe(aLjMXLeCfem= z2IeWxk40!z(yOsan0x&_OxLJy!!Ygf7hOH4>8jdl1rpktey`OTdsCVRY<|u+GqcbX z;vphn^=i&fV8iJIhry1@%W7-YU=B~yW6@}8)EFmq64MDp3@#g$*YnH_V%*#)4VVHl5c%2w%(H*93t1b`oYh$hH*KUk4f2gI7mTh(QcuAnE{{8b| zx~2wQt8tPbtxoWc4Y8J3N316{5F5D&E|QDl?p zn~5#NR$?2mo!CJ<$0@m3E}hHgGPp5Z0q0l7vuK*8Rg*u-peq${GGU9gN{VTD!cTxD z8>ywXg1F!}8Lhg8Q6`l;z^vUL@XpQrE`1{AN`4j8qx?$E@5bb2Vl`)ItE$&)yKE5F zhoRcgmZmnNR%agaUg98Ox0cvPyh`jR4iK+#aa=q%m`mUi*Aj<_!&s{vA&zoMTr!pk z6_?7T6{lj2JhZ948dKdR$Ea_>d}Qu3U*Di>Y1K3s%7^Q#bt(1r87(bs{Pg(#u3?w1 zO|8=yHF%D5f-ES|d$7e9M*jVjC}l)!h%7Q@>hIpR;J1-I zA50Cg_?GYEf7Y8K@;}*|GU8w9EkqU;7WO-Wb&)eRQXV3Uiu^Njny48l&{y~pV;U0| z(LE15{UZjm*zod(_B3%uE$!c};e;ve#E;)I8Cc%aFI8Thg=FQCPnN3=g8K~$H zKHfN)S~Ory*YlWnHyW#T6SHf~-}b!Ya=2k!9ygTBR!hT+v{<&nu>Q9Y`m`nfZp`!A0VMpmAN0yZI$#B?)zX09&sGl|E!BJnu;Ib|<@Rc+Te7~vP_N@% zd=sO|dSS1Y`gb$SNPTOVU~0@m2+K3+cwSSV2DX^yc7Os70P@R{Dou;76#q2p>M_*u zI*#B9xzWOioPo=jQF(YmI=}#8u<)yi$$%TSmB5`V=K5osI%NtL#t4%K92tWpCsrY! zI`s^Y0WaW7n3xEKU$a^EXX zi;*nlYTgF{AP{#D1cE^b?!*U#g9s2w+$+L?zxryUuCc(N!T+|FYI(Sgt-KY+ew>-p z`kI>3CZpa=WZaXM(@6nW)=U0@94G|&=c>4JL0kp8#9`qB@nA4^wktR_SJ_MWuum|; zLM}{yfOISpnl6#B5D0$i>6Gd2QfC5mcmJY(a z*sUcj+-%E9=m14LEB@8y0&kRnQnl3QFZ9p>%6RC1rKzOL3ju0SMFez!N}%EN+}IAF z1=ZX*t{yL3Ozv(@Q;VK=S^ugF>OF)Yu<|!8$iZ09z{4H~>bVB4u>&-MCa#HllJhH0 zsmHEIBUXmJJyXyMCSuPNw1M$p0%zcwIb$c7M2rAaxEAc0KJg#$OaTHj+rbR3m0MyS z#B8ttd!}Fxco@tD^S~ouK6sRCWecMFA`#sIUIH(34|9)nFFn9Muph6Mz^mNcc5r~3$1k^>8Z?b< zntH+f_gHeZG-#Z#R?OA4;N@w{Fr&s$XHucLnh98W=d|eBs+)w*%w&BX9Oc0u;pVr4 zH@HVRzY=|~c!{@#EfIjHV!5boGENH1GGSp>Rd4gQn_Kw5V5Q|2R$AVNmB#**Q?edw zb7Kt-dG$7d7TyeQ_CGL)Z{t}hS9vzP?X?T)_I{TW%TFAFpv~0=(~e4gLf7R1XVW1~>my#(x2~z^~vo zxC8Ejd)#vFX>KR?Dz}^4&mAzW(6vnsVHyMW8p1NnG*h)<+o&_j!%~~HO`5Qx3{@AV z5JC}_HAq4V(vaa+aL;fnxo6ivF_b_CT5+qmcJ5hj9WQGG%uBH>T|<@5*u#x@ap#$# z8a}DYsITsJO!+`iPkat9aD}h22FFg?c+7cxyeUJKs%adr!Ev|VjZMUXc9=NOo?FfJ z&yS2&$jt~lLszWIp$i>&<(nCYq+)i$elA(*=?=$`bM24JU(Ws!hX>>%g1Jj zUeH^Jl$am*L4V5!fiRp1SPO$-FbsjAFpOKzZQwR?o4CzuVFZkXQBV#Q+!k&tw~gD* zJ&z@;q^YT4C|=e!8B0^KTcI=NG+_qDN~w!>Y57f=nwHj)jZG681rnI;Tb9OvN5cC* zy6XHUL#A%LuHO6+zls(Dg&BVcz-P!$*!bc9DyBq7M}=YTRK!JwMNc&kFbNJZ$A)mY z8mh21f~hc#+rd4@_0N+lBXgtT%xyE^2%&8+#RjwBDBc%>qq)7@E|V|xiZE$;*cXEN za11QqUf}j{FLn7s;12e9c5@@j`0!7buCXm_qQ1)H3&C>y=EdF%2B^VLUhaBgKm9l1 zzb@SaYfQRlpP+lj{W~iJU1L~1zj6rgjV)#(K8mB)%JQ+dDhrkIfAO)pC=11D5-?uw zYK3uJU9M+ih&pv^C%{L3a7#8+#B3m+?(9n*ug2#81;O>sihE0V@p%Lu0(JIg`hegyzGfE zcE=UX-OPb=vB`iBbI01@Gz<_6nQJ#dUYg7*Ay3<6FvpYN0{9sJ)k5xgJ2rjU{8zSJ zo#WUT76!g=a~Ds*C;7%pxp&&(GVX+_F05dz_GjJvMF85xyTLf3b zPQtDOw!;qYBzLL{lhBwk z+XA;+0Nw$gPr1)<)D6#-urBgRo_@}v)8p`j#W(N5licUrIbLh`H_tGR8w&`x zzH9OA`|!i=3HXTnk`Ea3N&(xt4)_^7%YDUN=t1rac;2F;ui*vmJoh!1mgAE=Lu>)} zd-&t;n*M~Fe#52tBpX&+w7dp?<<;wTcmv*qzrb7Ecictpd+rDB(pq>M-hp@FJ@^~< zBLXx6!3abk5XqBOW+8ap>4vaw6Qq`U^wGo|lXUOny-6gxZI-UO8@O6(=_hr+2vcEZ z7-!(Md`lMtks`7`Hs++5l#ncGMOu?KWIygQ_Y?OscZIvkUE{8=C#8fBX-C@Q7^@HI z#NEJt?M?0;{uifhNFfW?6(`NbaShx%p3O0hEt>JVYV$&05Gfo0O>gAo90$DlDK`ry zzv$-eA7-722ArADRhtA#c+AIq@=~(|O?E#VKIMnI#rCW3zWB6GHxVqlQ0Z!#jJj^9 zU5NB}O;K_jR8_{|#F?31UZf9U*G_tKzqFIS+$}Tr7HH~m06C?FhhT0RKn7u^B?Gx% z+sR<=Hcl+?0Uq<)aJ=OQryXu`neAj0cZc&czlbK4{EO{eMmrhH-R1mp%x@CNr0%|l zaKCYB<`*h5t-Ggm1c)AB!^x4@6Cq=9KXP1X6hGq=!~#qH9vd8L!tc7<4>LBk8Sn?atf;_nN@Z83mYhk> zT8)6M$@3@YkPqV&SXXu|PuJRspUgGIzwjR>jYvL1&T1#;BVdm|GIPg5atXG>-<{)EBX$?+wXX#p6G_|_? zRy@$+mbNOriC99i{6vlN-p5I1Cm++#@%U zn*l{`Cb#0T<2;P96>A1em9~b)QEj~2j_IUptiJD|t=1wBlc~dj7OBuM6Fb!1-#8eI(L%KlRNpaR9_7q z9O&(X*yQeB#C{16SZa%hj0ZeYEe%V_O_gEoSEa9Rk?AJlytr21D#MX$euiZ@d0Z`P zs*w%C;a44w#16ug=0Ctod7Oqal?N8*k22;*5gett=hV9VLwe+-Gk=l6!{7HX|G{? z&JV*+8e*CqTc;0jl)$WzWHrX723dnfYiyDYG6PrlOp9Y`Jx)r>GBXRZWRYPJvQbUg z{})m&C-P_V3IZ6TPz1s{$!pm9 zk3b+Cn|+hB%x^xyHd#9^wW)#MY`|xCO-2wqH2f>9JhL0?Cz)3Fm}g9~Y@#<7`83tA z{5tH4RA(DUx9Qq+ysIsRf5BNY<9LrEc?SE9A}ByX1fmd-BcMPadJRPpJ`_V?s}jRo zhd2b{d4xAXWUFIHH5nMMt>_;NUvfdKYjhMGI>-dH1aY)CeJu9lAe%UL$rU(B&t z1nC;g^O-}H5doX2(Nr##N99vvr~;~xDx!+15~>sdEDj?P$V4Cufl&x#Banl@XasT* z$U`81GvQBF5F@BcN<&pqTB@4T@g6i+i@+Ez8^P}o{1L&Q5h+EaEy8XhcBoCP+QX17 zrp;kEz=<7Z*RH)b!s?25hjlGOn~XS)iaiKtVRsFdGGWu1N>_(>pzzzJ9EAO4xowSj z3lkPYlNu}&9_DH5aMn&Ojo`yPyd2{!rLMYXzl`u+h1Gwx=>xon3g-%&jM&HTZ#G;) ze;5T13;awQ^78bP@eYhG6kP8Gbr<$nLl4DS)|QOMEPbQCdn_1xi@&>;wC34q zqi}p-Ej6B+Kux43QIioUK%fwTA_R&NC|OHAL`|ipQPU|70X$vUGuec|w+MdDQ~7@o z5y6=#i=~+5P{MNfBLKoPwNxpzH2o{b!9+geo7ZOGiTC?xi$$Bi93K7?WHOs-%``TX zYc7TNIdxL=s7EO5AYzxj0)fg-Y5}#7dJKUo1g0Xe6t4?<60y`1eB1|ta<%jyMX~yJ zj~*Ds>W#s20R#0v#Gr32U~GFp9IZD7&k7je&4~Yq27P1jU>XQXL8_fvhb@SueBNh9Rf9LsP)taYAuC%8f%m~`~-m}p0oe6A#mzBA{vLk%}ln7!jYv;>IG^y zwFdz`0%H*v*GauZy-dA=Ks^Et2sH9o{>?Zz9#(fOx>x+XP+#3zXYTto>Y$}He4WC6 zD8IcBM{~|uSe`ejcX`$E7ImC@n|g=BE~f#3W(14~v>?#BmO4qDqE1t1sP_M)!&eBKN5`0>6V&I_7ufz&=Mb3KPJM~MB+icym6uKljg;dEdt|gy z*a1v^!-vz;sPDMv5Kb7I;^}5GUZQ@qB;(K24W0+DP*L&FI zb)EVZff)$Q!cPz|r3C-8JV*l^lBOZfMq7-8W@rfxZO|eb2N-4}FsFlNX&hpB7=gL} z0~YL}4=tr_E$Bl#(2kZ5T>`SIZM&d1Mk#c@t z8eUJ(3KMJ5kY_DCA!f40(eaj4N~BeNvekMzjk-<`HL12IO>DKiJ7Ps=(3!uR)+`$P zU&|19s;ALtI@hwhF?50DgJN3!$Fo#PYv?LkOJjxmGy*FScm{!$2&}^Tq*v}r8N-t) zIugsGSqy1CJyz&Tph$y2ktUuZ&swr*3*Bmo)dYGHPvMCOw71h(<8)eBWO}+_jXKm) z-F@ra|COC*e26kMqp_w5uYIvUW1hVk^c<|$>6!E_8cWg|1lA(3u9I3%&!y*?W@$ab zn;x)UABfir>YU7synJ zhml^ClQJr=8%D2ynUHphP;>>%=*MvYjK<=$(G)e~`SA(U!q+^IW%ScL^E^c_M_@Ao zTRZ3#G@jS(2)tuS>2`tATh!9Ze?sX#eV?$2{3c3M3a^*DL9Y|K-S!W=?bF@p-L2qb z&>QI;M8G*(j`=jomFF8T#}Hv;&7Y~Ei( z;2;8r5WqP+eE!11krf=_9HR~|L)u!pJYeA=4p_9{1w+6C+J_07zB4iBg|%P?Y#ont zVfa|h1Dcva=WC3$x-P%F3v%!SnyW3I@eFQu)gJ`h9O^au(B|+QMqAjvVfN{}fC#{Q zqk=u0K6*5B;sF}FEA2EU;*0GxCgMvx5p5rwR-}*OOc(tIeGGw@5!m0ocBhZid{T{m zn|=oY>|pKfpx>oWBCrqP9XfxWT*L`6ov@}hBlRKu$$juXGr>E+C&kd?T`O?A`$udB z@g@CLZ{>G^x6R)maG2|VhQ0^@zd`ol#CDKi@=8neA+FP%pfKR3lS5*1S0Se0v}_cWI{|r^vPck zN}uFv3z=l1nCSb!DNW#T!rdo%p0JPRfoy5=KbQn8f=nU;=X!}Clgy+rD*8tRzCr-6 z6u$W9g7;T!j%ioo^YgBqH*@hY25;TzV20CI5jc-!uY(!MWFqi20v9;H!Y;dElCD41 zs7x+{QNy zEHjR&XBwDBrin2y&5V(0VOp6sW;`>2naE6HCNoo*hnT4hUI2ZE!1oATLf|q2KO=yV z#|tB@Fm54m8-cqB{DvSvkVKG1P=ufaK`R7p5bTejErRw4IwI(d-~a^O5cELM6G1No zeGv3Ra1erl2nHhj9W5UfM69>FFATM(Rp;A8}+A&3y1jo>^4A4TwS1fM|gDFjy_ z_$-3$2(CqNBZ4~++=bvC1YbdLKZ1u4Jc8hx2%bXleFQ&7@G}c%i`gQ0Js1BodAMHw z7W16Y^ABpN;h(s9ee!;IcX)^QIZQFa?o4`5q>b4vpz)(xI&@;_MBXzD#kn5rC*f_3 z^^@=c6P(l3j#Jn0=bVRNr%{VDE*WWwaz&&v(!bS|Ou>If`kNZy-y(XC@f891PikrT zKN(}6hBe%@vp1}+cb^A@KCh^yHUCPVIQorKcl>I_^qXbpuM3@D`$imad<5W0*j3BI`H$_hf{r>Vd2c^J=*`s;}74u*gIU@l7^=|@?i%>)< zdw@qj82Cp5@H=X0*}p@vR9$_&C9%#5UEcfG#JW3f{D)%wl?e^_PY;UqEqOR|(tT3S zLjJxLdd68*<3FK!-+HZ^01w(D)JwBn5)h%(()7Qh*%XoTm>$OJL$O^EU^D;FZ1g?I z-sH6q#+yRV_(i3K z(52{GkM+0|7DV+G`gQ%AgHkAB<-Nq=!7ha;Pyp`!e@%;FQRGh||A_|6Xu#Xx_?`Hc zvJfT=YT!R~W%{0}`&=23TVXv7Gj(!^c?gbP#+dEHCpI5*qNkQl ziHeQn_ov9abLgVkqDSzE?mJ*FnlE}3k7gl)Dg;yc(WK#ge9G>_#KRp+*BA0<-4)SO z3xvuaU2$O16Qbojb(V^r6fG0sXys4@haor|!HhMcr$s9Scq0%T*#+;vNS&204mx{y zP1zKMJPse#kBm`7ns*h5)`>RvIf^Z!t#}mM5zInx6h8{QNt;h{?Y%s%6BO~(kmF)T zMN^_;FwG;nLB1e*nFqOBv`6%!=p_V4BbbX|9)kI6M6ZbU3WOPh@JU&L(Emlktg!od z$dD&ZLy3w|c8}nw=r})uH$=xoZ;IYRun56o1WOPsT_bv1^o}rsG6c*2`y)7XY16u) z0eIh5Tr|I7MyXVEkK!ZIS$-4`6yMK9=kO@LL{N=jB|i#{X=>MJZLCf6#Ois(2z*vPopsd(E_loHn>s$m$*h8BUWO7I04g&U>gr`yb0i8s|)Aq(*&u-mBb3C$nmIqpbZh@ z(|&!Rm@XbFjCCS{lX}LwKKp{_%ZmGERh%Wp8MD5s>WRl-BkS;?X{;lbI=5A=dI}K1edf)ndFCo>$`25#)N%Jap&K&yVN?G-G1q-7{M+ZstKf zNKJ{2;uef%8?M@o;7lIWEE9@P+btYrb%WQV3Veh!DiYJNWJ+{oB$f|(R5#!$Vy;h8 zBJm6icou?l5I$Uv0pm@BSU}bfI9EFJRnz1s!Q{KeuV9e(i{D=HJ`4_L0hc29BoA(x3EW}OQS_p-30!1kECz@F?ak${i{I=M z!?(o81u8B_@aY~Zu5eqWi|Qw^Ph>>Tgq#-R)8l<`;z#0-1yIi*d}tqIC%6-bF0Hux z)B+QB%AWnT;xEJ(ct{VNj&H=@3XoPIxVi_@>ixTXR;AxBdY8r5`UG`dd;^p07X&*H z?BqeM5oWd`@5J+D7pQ1cJ)bzN0(&&WJqdp<>OMUqp(HfnBf)9tbqKEK;o+@%yw5}y z9{pv4051Y7XgsB{z3qp@Mq-EIN%~3pOQaHD+yN3H; zbPtyQ^5U@-ZUT48yL~2!r^J`1@`E&o#82XnsS<$Ta|k}qk6@>XDl6<;Z%w-=K#Jvw zj3aoxh%5<{$omATkVFeac>%%QT|~izULmcqEjU#&#Uzo@Jz^+HkfiXi9%T0=DoH9v zFCD=b5iZhz(R^audgkVPqT@?QR~BjFjYHkoSq9WV9p~gUd&7FM|7c zaIc!c9s14ZrMt>5p2CDHni3b$+eMU=Nbok<2Mdp+Qlh~yu>)}c!Pj`02L+gSK8d~) zj2)d=z6LekbRNz7CUOhkM5328_6fI1Vi3r97{S+j$av_^?5tc@)6jWuw#(2+CP;7< z;Xa5sRWc1@$RT(X!8dqF#{?qU`yZV0UKy^3#VZ}`HpOBLvCECo?V;ox$$Sh~@~~vC zWS#`;YwTSfNAPU~-&rGhRI&iWeGI`92)@h1J^5c>u%JJ~Apcig!X3 zd_|U?;VhRt+b5Y;Nmk?GU~O|6!881D-V?|)V&8|mu9yfOgO3grO^LP?g$@5Bt@)#2FS;yb-ziuvR*j))inJ8W^r3NS>9|CGj9eLt zi{ht-#>K@($Hu6zWr|8M_wkwJbG{FZ##ilH{>kX~NxJHL^f#ka62CmTA z{Yi)9CNa481EJL|3Eow}*YN3eCe6H`wo`Ija);jt*~j}o+yN=M#{#@}O!6B`Ab1hM z?>kt?k_i5Q;3b}nd|3y4wi};@Hg|_>f_6VM71?aX$MSH2T3oZFdVFiOscmRIU-Kdq z7br8d;W9w+ra$@0t_2fgW7IKt;rwh-YnZCW$8 zwqx;O-%i$^bzmJ4yn^6W1g~|n&a4Y@6T$0RaRwO%+J&U%8GYgifU#d@VDWx5j3@R;ZgsN3YzP~Q;I9bYMi3V+!F!_b>&F5~TrIoFh!2md zrNMvPP=)t6<>_#3RH4*=;2*aZ`Yk23#E^r4@<1#!b;CnKxIkGsfO{>-Ea7~@lwsx$&(|`wD`O)Fv$Wa{K;p~F1 z;E-@u1*7tY;^GLnB|b9WWIW?B(36#UdHdk!{E=SVYt7JlO>GPQn`d{QWPgEpwl-4! z1`jNGnQdBqwFU>Bu{sG=;Ues({09XDKIo2#uD&_~f_g5P2nl7w!Xt3^g>|^X93GSj zjXeG?5mf{sB{>#@i;|o1>xc@%e@DkyTo2F@%|DEd!`ote5v5unS4TX~l|10NsW$gW z-6VY8x$BOulZi?Be05+B;M=)u@ognOL@2(EOG%^?Bk_G)r9>6cgzw;L!S`=XC*}|f ziRHvI#IwX|T$_I_uFJoX*nw}`dX0F4IEnAp`T|$xzCe6S+yMYs14rPF@6QSV;XrA+ zJ1YZ>1UaAxl;ZNT4Zwg4yFLOIfDW*WzYR+uFa*L+Vo2A|t{>o4MA9a0%jU89<=s0W z_zM4>_|X_*Fs3vAmsu_f*$RB-1B-SsTfzpiWo$Vw;G_tV*fiWiqy&-dI#vy*u^P4t zS8JPwNGtA5L|P+U9_me@${Jti$x^#mNWD-v=T918oUr!gEByWeB)(Bz>m>fplRs(6 z7xp)`^hp*9eG#YFdMt?zY$MP2eEDwdjvsk7PTrP>NE?A<2DVwCj;@0>5Q8i7o2oUF zWSUkSHHeRjkzO=yqGsE0ofE5 z$0BwHB3%*biAZlm`dN4n?87GSfwcd3voF09KJ24HmyZ8|?2ARei-dli|6yXZ@2n5b z`*m-Ev*`Irq2~er@a%TqJ$I*OdRJjI%h+=E8N6?weVSc?NH;{fcd#qjXA$Xv$bnqi zm9@zNsz>-%6J* z8isGB8;S3w%NC8s_tI74+vw^w@PH>rKXUa=Bexm$%>C0Hd|C0Qj~Wmu`LYOGqUIIEdf zv#sV@J!18!)h?^otPWcpu{vh;met!s7=x?uIK)kUixtgc#Jx4LO{%j&lEAnPI4 zh1QkUT5Fwkt#zyQOzYX!4_nW(o^QRt`Z4Q8)~l^Mtk+ntv)*96$$E?RHtQYM`>c;y zpSS+S#=$1aCdsD6rq;%2(`qx`W}?kxn}=*3wwY%$-)4c$V>XLyme{PcdC}&G&82>h z{RZ|6=ocjQmIg}`rD@VEX@Rs*S}kpqPLMt%T_jy2-6=gH{Ze{fdO`ZF^rG|!+kv)& zY{P6LY@=)ywlTItY)9B;+K#dy=hl&S7Y~(9kN?yx7zM4yLatw+Yhi;*=O4q+H37~_OFOb z?H{#&%zlym68p{ed+kr!fA7FJh#go5YlnUggB&6pln$v5H4a9HR)_Hp6CEZyJmj#* zVTr?1hh+}S9acE3aoFsz)nU8Ca}GNl_By=kaKPc1!&?q-JG}4kp~J@xpF8~E@T0>| z4p$tl9Bmx?JK8$hJGwi1I(j+!IEFYDIF>rjc3kMV%kd@0&mGS>UUIzRc+K&K<88;g zj=wnpr~Xb#rv#@Ar%_HhPPtBnPQ^~8PUTLuPW4WcoH(Z$PP3fmI4y8`%xRI+5~rn3 zuQ`3>^t02iPIsMta|X`+oIRX9oxPlWoc){!IR`oiJI6aGI43zLJFA@2oQFCOcOKzf z=&W^~=DgT>oAYt!51lVM-*h2dpbO=~xQJbBUF=;PU7TG8xVX8*xRkq$b6Mi@jLSNg z?JkF1j<~$x@}|pimv>w~aQW2btjjr16B-J=}Nk~y9T-DxmLPXxmLT@xHh>?bDizF&~=gP64#}!TU=jq zJ>YuK^|0#^*SB3yxSn)9?fRbUS=TRIzjFQB^@k(uw*pU2(hZcF&z~ zhwdVG2loN)ZtfoL-tNBc{_X+pD)(ad8uwcFI`^^e6Wk}dPja8)KG%JT`%?F1?#ta* zxUY2I;J(Ryi~BbB9q!M&?{eSo{+9a{4{Hy(M}o&lk0Os^j}nhE51q$Yk9vc+B-!>9NYA-J{cEt;c$g9Ugl;Uh;UwW1q)PEk;j)F=RGcX zeD871~b!obS|uME64@P?<2r>m!r zr=RB_&p^*$PlacUXRK$uXM$&v=Wx#)&r;7;PvkkvbB^ac&-tDUJU4mn@qF2HujhWx z*E|n-e&BiD^Bd3aJb&=~(eo!6C9{#)$sA-(G8dVjEJ%hgA(F{u(K4khPBu(dBCC@% z%cjX@%4W+RmOUz4D0^JCSoW-Jy=<3kkL)GcUfHX%1F|!+&tzZ9&dV;yzLi~<{VKa7 zyXQrE(Ox1iiI=^XyH}uBm{){Xl$X*g&TFt&qF1(8k(bV^&TFh!gIAMRv)5#=>0Zcd zrq^t*#a_$2mV2%6TJ6>0wZ?0m*LtrVUi-WbdL8yU;`Nr-+g>NUPI`Up^^MmRuWMd6 zyngZe)$5M8$XnuV?cLwo&fC%3**o65#CwwW0`KR&_j|wN{jT>Z?=#--dw=NtvG=Fm z-+N#3zU=+8_f_xf-Z#B}^}gd{3hKUb>E}DZ~C6_J?VSe_dVb5eSh)2 z?R(dc@FV?bKRZ8rKLKj**8e~ zcvbN3;IqM(f`1FK4(T6a7vdP=65<*X5)u~@A2K*3F(f}k6H*;g8!|SeA*3nfp^&K| z(?YnA1tE`zEDl*3@>IyvA)O(cLbitN2-z9(Lde08qanva-U@j)c(A95`e zgfgMxP&TxGs9mUIsB@@aXjtgr(Bx26Xj*7SXl7`3=;+Yu(1y_0LQjN#8hSPKM(C~3 zJE6aY!7w^Z9A*{PFU&T~AuKp7G%O+v7wy0$90!Lbg{6e0g$)fG9yTIO6E-dEsj%%~ zd&4e=gK)3#gz$p!hVaSZv%}|x&ktW1z9{^O@Kxa*;cLS;gl`Vt7QQ3=>xljl84<>a zXCgL6?1?`6 ziW(hN5mg&CHmV`Y5Y-a(P}KCO8Bw#N=0-gdwJz$7s86G=N8OA1O%CM!<%$)GRf^4uU5b|!uP9zs98erq zoK&1roL0Q2_)_t`;zz~Liff9S(L^*E%|uJ0t)u%z2SsN_S4K~Yo)JAedT#V1(F>zj zM6ZtSj9wSLIeJ_4bJ07a-;O>X{d4q{=&RA!V_*y!L&Y#L_AvuvykdM~2E_!$gvP|i z430^PNr_2|85WZflOIzV^KeXi%o{N$W6s4~iuoz#YRrw8TQRqljIzJdLFuF%pmb9P zCXpQZ84n zP;O9eRBlpkQNE-+tURiGQ~9>?UFB)zS>+eX^U80O7nPTkmzBT7ieepN9b=thU1Ggr z{bK`SgJVNuBV&_dhr}kws$#Qab7RNE7R8pvmdB2bt&eStZI1mY_CoBX*q>sr#@>j% z8%M;EaZH>zE-)@Lt|4w#+=95r_PAYfd*WV>+aGr@?)A8%acAP* zkNYt0llY|gk?~pa+3~sYFT@{=KM{W_{=N7Q<3EW%8~;W8kMTdpUyHvP|7-l+!Ng!V zIBIbD;713)Jovi=yM&O0xP*j+AqlF4^n_svr3uvu`h@y~riA8%X$dnE<|NEZSeURV z;faJN6V@c`Nq8~gwS;#PPA9yd@KM6qgf9}#CtOIloJb|wCfX(1Cpsn$O!P|hP4rJx zCZ;5&B@Rm*k(iaZBk`rgBZ+S%zLR(|@%_Y)588B_BvWlzb#5FeNHwNJ?7Du#^!g*(tdx zV^RuJ)G5^|(^BTAJesl~<*}4!QZA=lNx7c#OUmt(dn%x!R3a6tvQbG@_9`dU0F}GS zQ{}DlQw6AkRbi?~l|rRd#j6rk$*NSY~_RHdp4l}1&qs#U$L+NV08 zI;1+HI;J|VI-xqHdQbJC>J!yj)fcMss&7;mRhLvhsjjMSsBWq5sD4X@sdTD1)he}L zs%@%6s&lGqsz<6U)hE?IH83?KH9R#cRgs#KnwpxPIy`k->MN=HQun7GOp8uarKP0} zP0L7IoVF^hJ*_isT{@F)pYE9MobH-FGyU=O#pzF^FH1j{ekuKO`p@ath87Lg4Xquj zA6h^3g`o$B9v*sR=&@mT!#sz14f7f1KWz4}#lxN$_T;eT!>xx8816RQW4LVioZ(A` zFCD&Y_|qBvGu$%#pGR9?0%$S_T+6tTachKXMD~c$Bl1QRjC3C9 zJJNq-z{uc{&y3tSa`VWoBX^9vmC0m^Gucd=%#)dCGtXsynfY~AL6$a4msOiJHtYSY zud=?*`X=k*DEX-5QL0gCqlS&zJnF?!FOS+gYJavk+cDcYdqB2(_Gj4_vwz6`G5hD7 zoSgC;b&e*dI_FT%yE&(F&g6VBI(c-~=N9T`TIeOFREu*)Mes1(Hxpb~5SCVU; zYs{UVi*je?&dI%)do%Y|?(N)rc@=r%@*47*@{IY4{FMCE{Pg_c`5W?I$lsIyQvTjC zZes$*1dRz96Fz3inAKxC#;h5$e#}o}?vDAb02ELKlM3b(JXWx{U}?cq1uF{H6s#}U zRIsIBd%<%B#|y3&g2KSUsKOzIBMXZPHHF$jT_G;OS!gV5E1Xz3xo~RX^uoD?j~6a0 zTvNEUa7W?J!rg^06&@^nz3`2~Hw)h`JW+VD$hOF{XjoBBQF+nWqL!lZMU#piDwIJUU5 zSYK=`o?bk+cz*H1;zh+z6t65^UEEo`ws=GFrsCI&e<=R7#JeQ8B(@~IWK_xMlKhgw zl9Cc_Nll5qWL!yOiJ@dt$?THHN}efMTe6{KbIG=n=Sp5K*;jI)sdP)}_R{A{UoJgZdZP5h(oagymVQxszVuS* zPo-B&ub2K(`fC|kW>e-|=35q87G4%vCNGOFODan#ODh{%mQgmcEWfP0Ojl+sn^HEd z43*6)d${cJvL$6tmOWLrqHJZ^y0RT*`^w%Zd$a6#**j(LmYpj5tnBl$FU!uCeN%R^ z?1!@J<*?kkd_cK(xnFred2o4Hxw1UIJh6O8xvD&^JgdC0yt=%h+)&<9KE8ZX`Hb?} z<#Wp)DPK_jSou@sYs+_(?<+r2eysd>`HAvV<)4(FE&rnYtMUuw-K* zR#j}Q*j=%|;$X$=6>n6$RdJ@`gNlzUKCSq?;){xl6;~_ns3mGUwS(G8?V@&7`>6fZ zf$Cs&m^wlor&g&)s*BVbb+x)yJyzYI9q{jnp&MkE)+kcdECjx2vC5zo33m z{hIo)`l$Mt`ndWX^#|&6>PzYy>RakN>fb71rB!9WO4~~NN~cPfO0UY`%Gk=3%CyR1 zl_M&%Dhn!$E6XY?Dm9hb%KFOjmD4L9tz25Uta5qfiprIh>nb-^ZmHZ>`CR4B%Dt6G zDo<2?TKRS5x0T;l{#f~Q<*$`@HG~FgXpKnYt;x_7YNl)EY8Gjp)vVWS(rnf2(CpOg z)$G?C)Ew3v)g05D(tM&hulZT?tLAPMQAJiURsE~%svN7Ft6ZzxtNf}WsuHV)R%KLW zR%KV^R+Uy&RB5WTRW((0Rn1kCt7cX`UbVbxMb*lxRaNa(o2s@}?WlUb>V>L3RR^lx ztU6tFuIjt0AF3`_U8%ZWbx#Yll$Oy-v{qUNt(P`f8>>yxrfG+1M`*LO1=?b5nYKc! z(Q38z+BWSB?R@P*?IP_H+GX0++D`2{?FQ{;?N;q>?IG>k+K;tgX)kEM)Bd2nto=oM zTYImXs3xoFYFYKL>M_+*tLIcNu70L^WA*dZFI2x+{Yv$#)kmw}tbV)tMD?laGu59} zU#PxZeMd*@#5yZoKb@`4Rp+6T>AZD*xps?fraPzmN_Ro`t?s(+rtX&R zPEBM@QcX%tTFtPU5jB}Lbv4a3tu+&BCe%Oh~zV1rh^}1i`Zr9z_`|I=doPM5uzJ8JZS^Zl52K{FJHvJ3w7xk~`U)3Mb zAJZS#pVXh#f35#k|GoZ4{dN5>`rG<@V~MenvC^>v#(LGG`dRf0>Q~fv)NiccU4N+l zNd2+;&`ZoGE${V8_m5uR@%Ny4< zZfM-pxV6c)X<(DA$-Bv~X@1jFO;0yH)3nN9V{kQi8oUjDh9El-yGN+(j49#)g0X%+Z^9KtU053Wb>%z-OY!ZUvECz v{H8I{IKr4|9AzABJZwB^JZ*f>_@VKl@v`x{kPCoN_{n}F{51b-y!rnC2ZeyJ literal 28334 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 @@ -21,11 +21,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "380063088.913543" + timestampString = "381943605.499617" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "69" - endingLineNumber = "69" + startingLineNumber = "65" + endingLineNumber = "65" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -81,42 +81,16 @@ landmarkName = "-perfomStep" landmarkType = "5"> - - - - @@ -138,24 +112,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381939548.280556" + timestampString = "381943605.499617" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "116" - endingLineNumber = "116" - landmarkName = "-checkInputValues" - landmarkType = "5"> - - @@ -173,13 +134,26 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381939548.280556" + timestampString = "381946527.011291" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "124" - endingLineNumber = "124" + startingLineNumber = "123" + endingLineNumber = "123" landmarkName = "-pause:" landmarkType = "5"> + + diff --git a/iDNA/iDNA/AppDelegate.h b/iDNA/iDNA/AppDelegate.h index e1ede13..4c314a7 100644 --- a/iDNA/iDNA/AppDelegate.h +++ b/iDNA/iDNA/AppDelegate.h @@ -8,7 +8,6 @@ #import #import "Cell.h" -#import "Graph.h" #import "Evolution.h" @interface AppDelegate : NSObject @@ -38,9 +37,7 @@ // Labels. @property (weak) IBOutlet NSTextField *lbGeneration; @property (weak) IBOutlet NSTextField *lbBestMatch; - -// View for drawing graph. -@property (weak) IBOutlet Graph *vwGraph; +@property (weak) IBOutlet NSTextField *lbStatus; - (IBAction)startEvolution:(id)sender; - (IBAction)pause:(id)sender; diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index b60d33a..04fef4d 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -37,13 +37,13 @@ - (void) applicationDidFinishLaunching:(NSNotification *)aNotification [_slMutationRate setIntegerValue:mutationRate]; [_slPopulationSize setIntegerValue:populationSize]; + [_lbStatus setStringValue:@""]; + evolution = [[Evolution alloc] init]; [self setGoalDNA]; [self addObserver:self forKeyPath:@"dnaLength" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"mutationRate" options:NSKeyValueObservingOptionNew context:nil]; [self addObserver:self forKeyPath:@"populationSize" options:NSKeyValueObservingOptionNew context:nil]; - - [_vwGraph setHidden:YES]; } -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context @@ -52,9 +52,6 @@ -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N [evolution reset]; [self setLabelForGeneration:0]; [self setLabelForBestMatch:0]; - - [_vwGraph reset]; - [_vwGraph setNeedsDisplay:YES]; } // Only for remove observers. @@ -92,8 +89,17 @@ - (IBAction)startEvolution:(id)sender } else { - NSAlert *alert = [NSAlert alertWithMessageText:@"Какой-то из параметров равен 0." defaultButton:@"Просто закройся" alternateButton:@"Я понял" otherButton:@"Другая кнопка" informativeTextWithFormat:@"Скорее всего это размер ДНК или популяции."]; - [alert runModal]; + NSMutableString *title = [NSMutableString stringWithString:@""]; + if (dnaLength == 0) + [title appendFormat:NSLocalizedString(@"ALERT_PARAMETER_TITLE", nil), NSLocalizedString(@"DNA_LENGTH", nil)]; + if (populationSize == 0) + [title appendFormat:NSLocalizedString(@"ALERT_PARAMETER_TITLE", nil), NSLocalizedString(@"POPULATION_SIZE", nil)]; + + [[NSAlert alertWithMessageText : title + defaultButton : NSLocalizedString(@"ALERT_PARAMETER_DEFAULT_BTN", nil) + alternateButton : NSLocalizedString(@"ALERT_PARAMETER_ALT_BTN", nil) + otherButton : NSLocalizedString(@"ALERT_PARAMETER_OTHER_BTN", nil) + informativeTextWithFormat : NSLocalizedString(@"ALERT_PARAMETER_MESSAGE", nil)] runModal]; } } @@ -110,12 +116,6 @@ -(void) checkInputValues [self setMutationRate:currentMutationRate]; if (currentPopulationSize != [self populationSize]) [self setPopulationSize:currentPopulationSize]; - -// [self setDnaLength:]; -// [self setMutationRate:]; - // It can be over 1000 which implies a space after thousands. - //[self setPopulationSize:[[[_tfPopulationSize stringValue] stringByReplacingOccurrencesOfString:@"\t" withString:@""] integerValue]]; -// [self setPopulationSize:]; } // Pause button pressed. diff --git a/iDNA/iDNA/en.lproj/Localizable.strings b/iDNA/iDNA/en.lproj/Localizable.strings new file mode 100644 index 0000000..e69de29 diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index 330201a..23c1e3c 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -2,22 +2,22 @@ 1080 - 12C60 - 2844 + 12C2034 + 3084 1187.34 625.00 com.apple.InterfaceBuilder.CocoaPlugin - 2844 + 3084 IBNSLayoutConstraint NSButton NSButtonCell NSCustomObject - NSCustomView NSMenu NSMenuItem + NSProgressIndicator NSSlider NSSliderCell NSTextField @@ -103,32 +103,6 @@ - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - Hide iDNA @@ -192,15 +166,6 @@ File - - - New - n - 1048576 - 2147483647 - - - Open… @@ -264,1256 +229,252 @@ - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - + - Edit + Help - 1048576 2147483647 submenuAction: - - Edit + + Help - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a + + + iDNA Help + ? 1048576 2147483647 - - - YES - YES - - - 1048576 - 2147483647 - - + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {505, 310}} + 880279552 + iDNA + NSWindow + + + {505, 343} + {505, 343} + + + 256 + + + + 268 + {{17, 273}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Population size + + LucidaGrande + 13 + 1044 - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find and Replace… - f - 1572864 - 2147483647 - - - 12 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - - - Show Spelling and Grammar - : - 1048576 - 2147483647 - - - - - - Check Document Now - ; - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - Correct Spelling Automatically - - 2147483647 - - - - + + 6 + System + controlTextColor + + 3 + MAA - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - - - Show Substitutions - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Dashes - - 2147483647 - - - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - Text Replacement - - 2147483647 - - - - - - - - - Transformations - - 2147483647 - - - submenuAction: - - Transformations - - - - Make Upper Case - - 2147483647 - - - - - - Make Lower Case - - 2147483647 - - - - - - Capitalize - - 2147483647 - - - - + + NO + + + + 268 + {{17, 239}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + DNA length + + _NS:1535 + + + + + NO + + + + 268 + {{17, 207}, {118, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Mutation rate % + + _NS:1535 + + + + + NO + + + + 268 + {{140, 268}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304256 + 5000 + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - + + 6 + System + textColor + - + + NO - - - - Format - - 2147483647 - - - submenuAction: - - Format - - - - Font - - 2147483647 - - - submenuAction: - - Font - - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligatures - - 2147483647 - - - submenuAction: - - Ligatures - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Writing Direction - - 2147483647 - - - submenuAction: - - Writing Direction - - - - YES - Paragraph - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - YES - Selection - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - - - iDNA Help - ? - 1048576 - 2147483647 - - - - - _NSHelpMenu - - - - _NSMainMenu - - - 15 - 2 - {{335, 390}, {505, 343}} - 880279552 - iDNA - NSWindow - - - {505, 343} - {505, 343} - - - 256 - - + 268 - {{17, 306}, {118, 17}} + {{140, 234}, {51, 22}} - - _NS:1535 + + _NS:9 YES - - 68157504 - 272630784 - Population size - - LucidaGrande - 13 - 1044 - - _NS:1535 - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - + + -1804599231 + -2076179456 + 50 + + _NS:9 + + YES + + NO - + 268 - {{17, 272}, {118, 17}} + {{140, 202}, {51, 22}} - - _NS:1535 + + _NS:9 YES - - 68157504 - 272630784 - DNA length + + -1804599231 + 71304192 + 50 - _NS:1535 - - - + _NS:9 + + YES + + NO - + 268 - {{17, 240}, {118, 17}} + {{197, 268}, {290, 21}} - - _NS:1535 + + _NS:9 YES - - 68157504 - 272630784 - Mutation rate % - - _NS:1535 - - - + + -2080112384 + 0 + + _NS:9 + + 10000 + 0.0 + 5000 + 0.0 + 0 + 1 + NO + NO NO - + 268 - {{140, 301}, {51, 22}} + {{197, 234}, {290, 21}} - + _NS:9 YES - - -1804599231 - 71304256 - 5000 - - _NS:9 - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - - - NO - - - - 268 - {{140, 267}, {51, 22}} - - - - _NS:9 - YES - - -1804599231 - -2076179456 - 50 - - _NS:9 - - YES - - - - NO - - - - 268 - {{140, 235}, {51, 22}} - - - - _NS:9 - YES - - -1804599231 - 71304192 - 50 - - _NS:9 - - YES - - - - NO - - - - 268 - {{197, 301}, {290, 21}} - - - - _NS:9 - YES - - -2080112384 - 0 - - _NS:9 - - 10000 - 0.0 - 5000 - 0.0 - 0 - 1 - NO - NO - - NO - - - - 268 - {{197, 267}, {290, 21}} - - - - _NS:9 - YES - - -2080112384 - 0 - + + -2080112384 + 0 + _NS:9 100 @@ -1530,7 +491,7 @@ 268 - {{197, 235}, {290, 21}} + {{197, 202}, {290, 21}} @@ -1556,7 +517,7 @@ 268 - {{17, 215}, {118, 17}} + {{17, 182}, {118, 17}} @@ -1577,7 +538,7 @@ 268 - {{137, 215}, {57, 17}} + {{137, 182}, {57, 17}} @@ -1598,7 +559,7 @@ 268 - {{17, 190}, {118, 17}} + {{17, 157}, {118, 17}} @@ -1619,10 +580,10 @@ 268 - {{17, 165}, {118, 17}} + {{17, 114}, {118, 17}} - + _NS:1535 YES @@ -1637,13 +598,34 @@ NO + + + 268 + {{211, 114}, {277, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + Status + + _NS:1535 + + + + + NO + 268 - {{137, 190}, {57, 17}} + {{137, 157}, {57, 17}} - + _NS:1535 YES @@ -1661,7 +643,7 @@ 268 - {{20, 49}, {465, 108}} + {{20, 49}, {465, 57}} @@ -1676,630 +658,199 @@ _NS:9 YES - - - - NO - - - - 268 - {{14, 13}, {132, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Start evolution - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{357, 13}, {134, 32}} - - - - _NS:9 - YES - - 67108864 - 134217728 - Load goal DNA - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{146, 13}, {77, 32}} - - - - _NS:9 - YES - - 603979776 - 134217728 - Pause - - _NS:9 - - -2038284288 - 129 - - - 200 - 25 - - NO - - - - 268 - {{206, 165}, {279, 67}} - - - - _NS:9 - Graph - - - {505, 343} - - - - - {{0, 0}, {1280, 778}} - {505, 365} - {505, 365} - YES - - - AppDelegate - - - NSFontManager - - - YES - - - - - - - terminate: - - - - 449 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - delegate - - - - 495 - - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - saveDocument: - - - - 362 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - raiseBaseline: - - - - 426 - - - - lowerBaseline: - - - - 427 - - - - copyFont: - - - - 428 - - - - subscript: - - - - 429 - - - - superscript: - - - - 430 - - - - tightenKerning: - - - - 431 - - - - underline: - - - - 432 - - - - orderFrontColorPanel: - - - - 433 - - - - useAllLigatures: - - - - 434 - - - - loosenKerning: - - - - 435 - - - - pasteFont: - - - - 436 - - - - unscript: - - - - 437 - - - - useStandardKerning: - - - - 438 - - - - useStandardLigatures: - - - - 439 - - - - turnOffLigatures: - - - - 440 - - - - turnOffKerning: - - - - 441 - - - - toggleAutomaticSpellingCorrection: - - - - 456 + + + + NO + + + + 268 + {{14, 13}, {132, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Start evolution + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{357, 13}, {134, 32}} + + + _NS:9 + YES + + 67108864 + 134217728 + Load goal DNA + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{146, 13}, {77, 32}} + + + + _NS:9 + YES + + 603979776 + 134217728 + Pause + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{20, 133}, {465, 20}} + + + + _NS:9 + {250, 250} + 16399 + 100 + + + {505, 310} + + + + {{0, 0}, {1920, 1058}} + {505, 365} + {505, 365} + YES + + + AppDelegate + + + NSFontManager + + + YES + + + + - orderFrontSubstitutionsPanel: - - + terminate: + + - 458 + 449 - toggleAutomaticDashSubstitution: - - + orderFrontStandardAboutPanel: + + - 461 + 142 - - toggleAutomaticTextReplacement: - - + + delegate + + - 463 + 495 - uppercaseWord: + clearRecentDocuments: - + - 464 + 127 - capitalizeWord: + performClose: - + - 467 + 193 - lowercaseWord: + saveDocument: - + - 468 + 362 - pasteAsPlainText: + hide: - + - 486 + 367 - performFindPanelAction: + hideOtherApplications: - + - 487 + 368 - performFindPanelAction: + unhideAllApplications: - + - 488 + 370 - performFindPanelAction: + openDocument: - + - 489 + 374 @@ -2309,158 +860,6 @@ 493 - - - alignCenter: - - - - 518 - - - - pasteRuler: - - - - 519 - - - - toggleRuler: - - - - 520 - - - - alignRight: - - - - 521 - - - - copyRuler: - - - - 522 - - - - alignJustified: - - - - 523 - - - - alignLeft: - - - - 524 - - - - makeBaseWritingDirectionNatural: - - - - 525 - - - - makeBaseWritingDirectionLeftToRight: - - - - 526 - - - - makeBaseWritingDirectionRightToLeft: - - - - 527 - - - - makeTextWritingDirectionNatural: - - - - 528 - - - - makeTextWritingDirectionLeftToRight: - - - - 529 - - - - makeTextWritingDirectionRightToLeft: - - - - 530 - - - - performFindPanelAction: - - - - 535 - - - - addFontTrait: - - - - 421 - - - - addFontTrait: - - - - 422 - - - - modifyFont: - - - - 423 - - - - orderFrontFontPanel: - - - - 424 - - - - modifyFont: - - - - 425 - window @@ -2581,14 +980,6 @@ 1478 - - - vwGraph - - - - 1530 - loadGoalDNA: @@ -2597,6 +988,14 @@ 1531 + + + lbStatus + + + + 1576 + value: self.populationSize @@ -2764,37 +1163,17 @@ 29 - - - - - - 19 - - - - - - 56 - - - - - - - - 217 - + - + @@ -2811,15 +1190,10 @@ - - - - - @@ -2828,21 +1202,11 @@ - - 78 - - - 72 - - 82 - - - 124 @@ -2851,11 +1215,6 @@ - - 77 - - - 73 @@ -2866,16 +1225,6 @@ - - 112 - - - - - 74 - - - 125 @@ -2889,155 +1238,6 @@ - - 205 - - - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - - - - - - 216 - - - - - - - - 200 - - - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - 57 @@ -3046,11 +1246,9 @@ - - @@ -3076,11 +1274,6 @@ - - 144 - - - 129 @@ -3096,14 +1289,6 @@ - - 131 - - - - - - 149 @@ -3114,138 +1299,6 @@ - - 130 - - - - - 24 - - - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - - - - - - 296 - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - - - - - - 212 - - - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - - - - - - 349 - - - - - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - 371 @@ -3258,12 +1311,12 @@ 372 - + - 6 + 4 0 - 6 + 4 1 20 @@ -3274,12 +1327,12 @@ 29 3 - + - 4 + 6 0 - 4 + 6 1 20 @@ -3290,7 +1343,7 @@ 29 3 - + 4 0 @@ -3322,28 +1375,28 @@ 24 3 - - - 3 + + + 11 0 - - 4 + + 11 1 - - 8 + + 0.0 1000 6 24 - 3 + 2 - + - 4 + 6 0 - - 4 + + 6 1 20 @@ -3354,28 +1407,28 @@ 29 3 - + - 5 + 3 0 - - 5 + + 4 1 - 20 + 8 1000 - 8 - 29 + 6 + 24 3 - + - 6 + 4 0 - - 6 + + 4 1 20 @@ -3386,38 +1439,22 @@ 29 3 - - + + 5 0 5 1 - - 206 + + 20 1000 - 3 - 9 + 8 + 29 3 - - - 3 - 0 - - 3 - 1 - - 0.0 - - 1000 - - 6 - 24 - 2 - 11 @@ -3466,12 +1503,60 @@ 24 2 - - - 6 + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 0 - - 6 + + 5 1 20 @@ -3658,28 +1743,12 @@ 24 2 - - - 3 - 0 - - 4 - 1 - - 8 - - 1000 - - 6 - 24 - 3 - - - - 6 + + + 5 0 - - 6 + + 5 1 20 @@ -3690,37 +1759,21 @@ 29 3 - - - 3 + + + 6 0 - - 4 + + 6 1 - - 8 + + 0.0 1000 6 24 - 3 - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - - 8 - 29 - 3 + 2 @@ -3850,53 +1903,53 @@ 24 2 - - - 5 + + + 4 0 - - 5 + + 4 1 - - 20 + + 134 1000 - 8 - 29 + 3 + 9 3 - - - 3 + + + 6 0 - - 4 + + 6 1 - 8 + 20 1000 - 6 - 24 + 8 + 29 3 - - - 6 + + + 5 0 - - 6 + + 5 1 - - 0.0 + + 20 1000 - 6 - 24 - 2 + 8 + 29 + 3 @@ -4058,379 +2111,98 @@ 29 3 - + - 5 - 0 - - 5 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - 3 0 3 1 - - 20 - - 1000 - - 8 - 29 - 3 - - - - - - - - - - - - - - - - - - - - - - - - - 375 - - - - - - - - 376 - - - - - - - - - 377 - - - - - - - - 388 - - - - - - - - - - - - - - - - - - - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - - - 397 - - - - - - - - 398 - - - - - - - - 399 - - - - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - - - 405 - - - - - - - - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - - - - - - - - 412 - - - - - 413 - - - - - 414 - - - - - 415 - - - - - - + + 54 + + 1000 + + 3 + 9 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - + 420 - - 450 - - - - - - - - 451 - - - - - - - - - - 452 - - - - - 453 - - - - - 454 - - - - - 457 - - - - - 459 - - - - - 460 - - - - - 462 - - - - - 465 - - - - - 466 - - - - - 485 - - - 490 @@ -4457,150 +2229,6 @@ - - 496 - - - - - - - - 497 - - - - - - - - - - - - - - - - - 498 - - - - - 499 - - - - - 500 - - - - - 501 - - - - - 502 - - - - - 503 - - - - - - - - 504 - - - - - 505 - - - - - 506 - - - - - 507 - - - - - 508 - - - - - - - - - - - - - - - - 509 - - - - - 510 - - - - - 511 - - - - - 512 - - - - - 513 - - - - - 514 - - - - - 515 - - - - - 516 - - - - - 517 - - - - - 534 - - - 1132 @@ -4996,11 +2624,6 @@ - - 1398 - - - 1399 @@ -5011,7 +2634,7 @@ - + 8 0 @@ -5019,7 +2642,7 @@ 0 1 - 108 + 57 1000 @@ -5040,11 +2663,6 @@ - - 1403 - - - 1406 @@ -5068,11 +2686,6 @@ - - 1412 - - - 1413 @@ -5091,11 +2704,6 @@ - - 1418 - - - 1419 @@ -5109,26 +2717,11 @@ - - 1423 - - - 1424 - - 1425 - - - - - 1426 - - - 1486 @@ -5150,37 +2743,111 @@ - 1522 - + 1533 + + + + + 1535 + + + + + + 1538 + - 1523 - + 1539 + - 1525 - + 1543 + + + + + + 7 + 0 + + 0 + 1 + + 271 + + 1000 + + 3 + 9 + 1 + + - 1528 + 1544 + + + + + 1549 - 1529 - + 1554 + + + + + 1556 + + + + + 1557 + + + + + 1558 + + + + + 1563 + + + + + 1566 + + + + + 1567 + + + + + 1572 + + + 1573 + + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin @@ -5219,7 +2886,6 @@ 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 @@ -5227,7 +2893,6 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -5273,36 +2938,28 @@ 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 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 @@ -5310,62 +2967,37 @@ 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 - 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 - 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 + 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 - 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 {{380, 496}, {480, 360}} - + + @@ -5376,9 +3008,9 @@ - - - + + + @@ -5387,10 +3019,8 @@ - - - - + + @@ -5402,118 +3032,44 @@ + + + - - - - + + + - - + + 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 - 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 - 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 - 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 - 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 - 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 - com.apple.InterfaceBuilder.CocoaPlugin - 1531 + 1576 @@ -5545,6 +3101,7 @@ NSButton NSTextField NSTextField + NSTextField NSSlider NSSlider NSSlider @@ -5552,7 +3109,6 @@ NSTextField NSTextField NSTextField - Graph NSWindow @@ -5576,6 +3132,10 @@ lbGeneration NSTextField + + lbStatus + NSTextField + slDnaLength NSSlider @@ -5604,10 +3164,6 @@ tfPopulationSize NSTextField - - vwGraph - Graph - window NSWindow @@ -5618,14 +3174,6 @@ ./Classes/AppDelegate.h - - Graph - NSView - - IBProjectSource - ./Classes/Graph.h - - NSLayoutConstraint NSObject diff --git a/iDNA/iDNA/ru.lproj/Credits.rtf b/iDNA/iDNA/ru.lproj/Credits.rtf new file mode 100644 index 0000000..46576ef --- /dev/null +++ b/iDNA/iDNA/ru.lproj/Credits.rtf @@ -0,0 +1,29 @@ +{\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;} +{\colortbl;\red255\green255\blue255;} +\paperw9840\paperh8400 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\b0 \ + Some people\ +\ + +\b Human Interface Design: +\b0 \ + Some other people\ +\ + +\b Testing: +\b0 \ + Hopefully not nobody\ +\ + +\b Documentation: +\b0 \ + Whoever\ +\ + +\b With special thanks to: +\b0 \ + Mom\ +} diff --git a/iDNA/iDNA/ru.lproj/InfoPlist.strings b/iDNA/iDNA/ru.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/iDNA/iDNA/ru.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/iDNA/iDNA/ru.lproj/Localizable.strings b/iDNA/iDNA/ru.lproj/Localizable.strings new file mode 100644 index 0000000..7cd7112 --- /dev/null +++ b/iDNA/iDNA/ru.lproj/Localizable.strings @@ -0,0 +1,8 @@ +"ALERT_PARAMETER_TITLE" = "%@ равен 0. "; +"ALERT_PARAMETER_MESSAGE" = "Надо поправить. Ладненько?"; +"ALERT_PARAMETER_DEFAULT_BTN" = "Просто закройся"; +"ALERT_PARAMETER_ALT_BTN" = "Я понял"; +"ALERT_PARAMETER_OTHER_BTN" = "Другая кнопка"; + +"DNA_LENGTH" = "Размер ДНК"; +"POPULATION_SIZE" = "Размер популяции"; \ No newline at end of file diff --git a/iDNA/iDNA/ru.lproj/MainMenu.xib b/iDNA/iDNA/ru.lproj/MainMenu.xib new file mode 100644 index 0000000..a9ee7c8 --- /dev/null +++ b/iDNA/iDNA/ru.lproj/MainMenu.xib @@ -0,0 +1,3173 @@ + + + + 1080 + 12C2034 + 3084 + 1187.34 + 625.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 3084 + + + IBNSLayoutConstraint + NSButton + NSButtonCell + NSCustomObject + NSMenu + NSMenuItem + NSProgressIndicator + NSSlider + NSSliderCell + NSTextField + NSTextFieldCell + NSUserDefaultsController + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + iDNA + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + iDNA + + + + О iDNA + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Настройки… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Свернуть iDNA + h + 1048576 + 2147483647 + + + + + + Свернуть остальное + h + 1572864 + 2147483647 + + + + + + Показать все + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Выйти + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + Файл + + 1048576 + 2147483647 + + + submenuAction: + + Файл + + + + Открыть… + o + 1048576 + 2147483647 + + + + + + Последние открытые + + 1048576 + 2147483647 + + + submenuAction: + + Последние открытые + + + + Очистить список + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Закрыть + w + 1048576 + 2147483647 + + + + + + Сохранить… + s + 1048576 + 2147483647 + + + + + + + + + Помощь + + 2147483647 + + + submenuAction: + + Помощь + + + + Помощь с iDNA + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {505, 310}} + 880279552 + iDNA + NSWindow + + + {505, 343} + {505, 343} + + + 256 + + + + 268 + {{17, 273}, {146, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Размер популяции + + LucidaGrande + 13 + 1044 + + _NS:1535 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + + + + 268 + {{17, 239}, {146, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Длина ДНК + + _NS:1535 + + + + + NO + + + + 268 + {{17, 207}, {146, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Мутация % + + _NS:1535 + + + + + NO + + + + 268 + {{168, 268}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304256 + 5000 + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + NO + + + + 268 + {{168, 234}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + -2076179456 + 50 + + _NS:9 + + YES + + + + NO + + + + 268 + {{168, 202}, {51, 22}} + + + + _NS:9 + YES + + -1804599231 + 71304192 + 50 + + _NS:9 + + YES + + + + NO + + + + 268 + {{225, 268}, {262, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 10000 + 0.0 + 5000 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{225, 234}, {262, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{225, 202}, {262, 21}} + + + + _NS:9 + YES + + -2080112384 + 0 + + _NS:9 + + 100 + 0.0 + 50 + 0.0 + 0 + 1 + NO + NO + + NO + + + + 268 + {{17, 182}, {146, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Поколение + + _NS:1535 + + + + + NO + + + + 268 + {{165, 182}, {57, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + 0 + + _NS:1535 + + + + + NO + + + + 268 + {{17, 157}, {146, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Лучшее совпадение % + + _NS:1535 + + + + + NO + + + + 268 + {{17, 114}, {146, 17}} + + + + _NS:1535 + YES + + 68157504 + 272630784 + Целевая ДНК + + _NS:1535 + + + + + NO + + + + 268 + {{211, 114}, {277, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + Статус + + _NS:1535 + + + + + NO + + + + 268 + {{165, 157}, {57, 17}} + + + + _NS:1535 + YES + + 68157504 + 71304192 + 0 + + _NS:1535 + + + + + NO + + + + 268 + {{20, 49}, {465, 57}} + + + + _NS:9 + {250, 750} + YES + + -1805647871 + 272629760 + + + _NS:9 + + YES + + + + NO + + + + 268 + {{14, 13}, {155, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Начать эволюцию + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{297, 13}, {194, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + Загрузить целевую ДНК + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{169, 13}, {77, 32}} + + + + _NS:9 + YES + + 603979776 + 134217728 + Пауза + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{20, 133}, {465, 20}} + + + + _NS:9 + {250, 250} + 16399 + 100 + + + {505, 310} + + + + + {{0, 0}, {1920, 1058}} + {505, 365} + {505, 365} + YES + + + AppDelegate + + + NSFontManager + + + YES + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + saveDocument: + + + + 362 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + openDocument: + + + + 374 + + + + showHelp: + + + + 493 + + + + window + + + + 532 + + + + tfGoalDNA + + + + 1456 + + + + startEvolution: + + + + 1457 + + + + tfPopulationSize + + + + 1458 + + + + tfDnaLength + + + + 1459 + + + + tfMutationRate + + + + 1460 + + + + slPopulationSize + + + + 1461 + + + + slDnaLength + + + + 1462 + + + + slMutationRate + + + + 1463 + + + + btStartEvolution + + + + 1464 + + + + btPause + + + + 1465 + + + + btLoadGoalDNA + + + + 1466 + + + + pause: + + + + 1467 + + + + lbGeneration + + + + 1477 + + + + lbBestMatch + + + + 1478 + + + + loadGoalDNA: + + + + 1531 + + + + lbStatus + + + + 1576 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1434 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1437 + + + + value: self.dnaLength + + + + + + value: self.dnaLength + value + self.dnaLength + 2 + + + 1455 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 1443 + + + + value: self.populationSize + + + + + + value: self.populationSize + value + self.populationSize + 2 + + + 1345 + + + + takeIntValueFrom: + + + + 1362 + + + + takeIntValueFrom: + + + + 1363 + + + + value: self.dnaLength + + + + + + value: self.dnaLength + value + self.dnaLength + 2 + + + 1450 + + + + value: self.mutationRate + + + + + + value: self.mutationRate + value + self.mutationRate + 2 + + + 1361 + + + + takeIntValueFrom: + + + + 1364 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + 56 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + 75 + + + + + 72 + + + + + 124 + + + + + + + + 73 + + + + + 79 + + + + + 125 + + + + + + + + 126 + + + + + 57 + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 149 + + + + + 145 + + + + + 371 + + + + + + + + 372 + + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 12 + + 1000 + + 6 + 24 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 4 + 0 + + 4 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 4 + 1 + + 10 + + 1000 + + 6 + 24 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 6 + 0 + + 6 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 5 + 1 + + 0.0 + + 1000 + + 6 + 24 + 2 + + + + 5 + 0 + + 6 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 4 + 0 + + 4 + 1 + + 134 + + 1000 + + 3 + 9 + 3 + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 4 + 1 + + 8 + + 1000 + + 6 + 24 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 54 + + 1000 + + 3 + 9 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + + 8 + 29 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + 420 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 1132 + + + + + + + + 1133 + + + + + 1137 + + + + + + + + 1138 + + + + + 1200 + + + + + + + + 1201 + + + + + 1206 + + + + + + 7 + 0 + + 0 + 1 + + 51 + + 1000 + + 3 + 9 + 1 + + + + + + 1207 + + + + + 1211 + + + + + 1212 + + + + + + + + 1214 + + + + + + 1220 + + + + + + + + 1221 + + + + + 1241 + + + + + 1242 + + + + + 1246 + + + + + 1248 + + + + + 1267 + + + + + 1296 + + + + + 1298 + + + + + 1299 + + + + + 1302 + + + + + 1303 + + + + + 1304 + + + + + 1306 + + + + + 1307 + + + + + + + + 1308 + + + + + 1313 + + + + + 1314 + + + + + + + + 1316 + + + + + 1323 + + + + + 1324 + + + + + + + + 1325 + + + + + 1329 + + + + + 1336 + + + + + 1354 + + + + + 1355 + + + + + 1356 + + + + + 1357 + + + + + 1358 + + + + + 1365 + + + + + + + + 1366 + + + + + 1368 + + + + + 1369 + + + + + 1370 + + + + + + + + 1371 + + + + + 1374 + + + + + 1375 + + + + + 1376 + + + + + 1377 + + + + + 1378 + + + + + + + + 1379 + + + + + + + + 1380 + + + + + 1381 + + + + + 1383 + + + + + 1386 + + + + + 1388 + + + + + 1389 + + + + + 1390 + + + + + 1391 + + + + + 1392 + + + + + + + + 1393 + + + + + 1397 + + + + + 1399 + + + + + 1400 + + + + + + 8 + 0 + + 0 + 1 + + 57 + + 1000 + + 3 + 9 + 1 + + + + + + 1401 + + + + + 1402 + + + + + 1406 + + + + + 1409 + + + + + + + + 1410 + + + + + 1411 + + + + + 1413 + + + + + + + + 1414 + + + + + 1417 + + + + + 1419 + + + + + + + + 1420 + + + + + 1424 + + + + + 1486 + + + + + 1488 + + + + + 1490 + + + + + 1493 + + + + + 1533 + + + + + 1535 + + + + + + 1538 + + + + + 1539 + + + + + 1543 + + + + + + 7 + 0 + + 0 + 1 + + 271 + + 1000 + + 3 + 9 + 1 + + + + + + 1544 + + + + + 1549 + + + + + 1554 + + + + + 1556 + + + + + 1557 + + + + + 1558 + + + + + 1563 + + + + + 1566 + + + + + 1567 + + + + + 1572 + + + + + 1573 + + + + + + + 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 + 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 + 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 + 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 + + 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 + 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 + 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 + 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 + {{380, 496}, {480, 360}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + + 1576 + + + + + AppDelegate + NSObject + + id + id + id + + + + loadGoalDNA: + id + + + pause: + id + + + startEvolution: + id + + + + NSButton + NSButton + NSButton + NSTextField + NSTextField + NSTextField + NSSlider + NSSlider + NSSlider + NSTextField + NSTextField + NSTextField + NSTextField + NSWindow + + + + btLoadGoalDNA + NSButton + + + btPause + NSButton + + + btStartEvolution + NSButton + + + lbBestMatch + NSTextField + + + lbGeneration + NSTextField + + + lbStatus + NSTextField + + + slDnaLength + NSSlider + + + slMutationRate + NSSlider + + + slPopulationSize + NSSlider + + + tfDnaLength + NSTextField + + + tfGoalDNA + NSTextField + + + tfMutationRate + NSTextField + + + tfPopulationSize + NSTextField + + + window + NSWindow + + + + IBProjectSource + ./Classes/AppDelegate.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + YES + 3 + + {11, 11} + {10, 3} + + YES + + From 116ac6024c8f0821b00c2d250a7f9289f2b2e3c4 Mon Sep 17 00:00:00 2001 From: n Date: Thu, 14 Feb 2013 20:59:18 +0400 Subject: [PATCH 4/4] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D1=82=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserInterfaceState.xcuserstate | Bin 35045 -> 34197 bytes .../xcdebugger/Breakpoints.xcbkptlist | 36 ++++++++--------- iDNA/iDNA/AppDelegate.m | 37 ++++++++++++++++-- iDNA/iDNA/en.lproj/Localizable.strings | 13 ++++++ iDNA/iDNA/en.lproj/MainMenu.xib | 19 ++++----- iDNA/iDNA/ru.lproj/Localizable.strings | 5 +++ 6 files changed, 77 insertions(+), 33 deletions(-) diff --git a/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate b/iDNA/iDNA.xcodeproj/project.xcworkspace/xcuserdata/n.xcuserdatad/UserInterfaceState.xcuserstate index f8b321d5868c893fb862d0b34a89928ddc1db901..20901c195d6ef1e2ed607e60ddc90111f75385c1 100644 GIT binary patch literal 34197 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 literal 35045 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 diff --git a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist index 5bbb28e..2cc0d24 100644 --- a/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ b/iDNA/iDNA.xcodeproj/xcuserdata/n.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -8,11 +8,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381946527.011291" + timestampString = "382289354.858739" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "210" - endingLineNumber = "210" + startingLineNumber = "215" + endingLineNumber = "215" landmarkName = "-setDnaLength:" landmarkType = "5"> @@ -21,11 +21,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381943605.499617" + timestampString = "382289354.858739" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "65" - endingLineNumber = "65" + startingLineNumber = "69" + endingLineNumber = "69" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -86,11 +86,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381946527.011291" + timestampString = "382289354.858739" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "145" - endingLineNumber = "145" + startingLineNumber = "150" + endingLineNumber = "150" landmarkName = "-openDNADialog" landmarkType = "5"> @@ -112,11 +112,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381943605.499617" + timestampString = "382289354.858739" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "73" - endingLineNumber = "73" + startingLineNumber = "77" + endingLineNumber = "77" landmarkName = "-startEvolution:" landmarkType = "5"> @@ -134,11 +134,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381946527.011291" + timestampString = "382289354.858739" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "123" - endingLineNumber = "123" + startingLineNumber = "128" + endingLineNumber = "128" landmarkName = "-pause:" landmarkType = "5"> @@ -147,11 +147,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "iDNA/AppDelegate.m" - timestampString = "381946673.757993" + timestampString = "382289354.858739" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "92" - endingLineNumber = "92" + startingLineNumber = "96" + endingLineNumber = "96" landmarkName = "-startEvolution:" landmarkType = "5"> diff --git a/iDNA/iDNA/AppDelegate.m b/iDNA/iDNA/AppDelegate.m index 04fef4d..eadffb1 100644 --- a/iDNA/iDNA/AppDelegate.m +++ b/iDNA/iDNA/AppDelegate.m @@ -13,6 +13,8 @@ @implementation AppDelegate NSInteger maxPopulationSize; NSInteger maxDnaLength; NSInteger maxMutationRate; + + NSApplicationTerminateReply terminateReply; } - (id) init @@ -26,6 +28,8 @@ - (id) init dnaLength = maxDnaLength / 2; mutationRate = maxMutationRate / 2; populationSize = maxPopulationSize / 2; + + terminateReply = NSTerminateNow; } return self; @@ -95,11 +99,12 @@ - (IBAction)startEvolution:(id)sender if (populationSize == 0) [title appendFormat:NSLocalizedString(@"ALERT_PARAMETER_TITLE", nil), NSLocalizedString(@"POPULATION_SIZE", nil)]; - [[NSAlert alertWithMessageText : title + NSAlert *alert = [NSAlert alertWithMessageText : title defaultButton : NSLocalizedString(@"ALERT_PARAMETER_DEFAULT_BTN", nil) alternateButton : NSLocalizedString(@"ALERT_PARAMETER_ALT_BTN", nil) otherButton : NSLocalizedString(@"ALERT_PARAMETER_OTHER_BTN", nil) - informativeTextWithFormat : NSLocalizedString(@"ALERT_PARAMETER_MESSAGE", nil)] runModal]; + informativeTextWithFormat : NSLocalizedString(@"ALERT_PARAMETER_MESSAGE", nil)]; + [alert beginSheetModalForWindow:[self window] modalDelegate:self didEndSelector:nil contextInfo:nil]; } } @@ -227,9 +232,33 @@ - (void) setPopulationSize: (NSInteger) x } // Close app if window is closed. -- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication +- (BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication +{ + return NO; +} + +-(void) alertClose:(NSAlert *)alert code:(NSInteger) choice context:(void *) ctx { - return YES; + if (choice == NSAlertDefaultReturn) + terminateReply = NSTerminateNow; + else if (choice == NSAlertAlternateReturn) + terminateReply = NSTerminateLater; +} + +//- (void) applicationWillTerminate: (NSNotification *)aNotification +- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication *) sender +{ + NSAlert *alert = [NSAlert alertWithMessageText : NSLocalizedString(@"ALERT_CLOSE_TITLE", nil) + defaultButton : NSLocalizedString(@"ALERT_CLOSE_DEFAULT_BTN", nil) + alternateButton : NSLocalizedString(@"ALERT_CLOSE_ALT_BTN", nil) + otherButton : nil + informativeTextWithFormat : NSLocalizedString(@"ALERT_CLOSE_MESSAGE", nil)]; + //[alert beginSheetModalForWindow:[self window] modalDelegate:self didEndSelector:@selector(alertClose:code:context:) contextInfo:nil]; + NSInteger result = [alert runModal]; + if (result == NSAlertAlternateReturn) + return NSTerminateCancel; + else + return NSTerminateNow; } @end diff --git a/iDNA/iDNA/en.lproj/Localizable.strings b/iDNA/iDNA/en.lproj/Localizable.strings index e69de29..90e1ff4 100644 --- a/iDNA/iDNA/en.lproj/Localizable.strings +++ b/iDNA/iDNA/en.lproj/Localizable.strings @@ -0,0 +1,13 @@ +"ALERT_PARAMETER_TITLE" = "%@ is 0. "; +"ALERT_PARAMETER_MESSAGE" = "Should be fixed. Mkay?"; +"ALERT_PARAMETER_DEFAULT_BTN" = "Just close"; +"ALERT_PARAMETER_ALT_BTN" = "Got it"; +"ALERT_PARAMETER_OTHER_BTN" = "Other button"; + +"ALERT_CLOSE_TITLE" = "Do you really want to close this application?"; +"ALERT_CLOSE_MESSAGE" = "To be or not to be..."; +"ALERT_CLOSE_DEFAULT_BTN" = "Close now"; +"ALERT_CLOSE_ALT_BTN" = "No, bring me back"; + +"DNA_LENGTH" = "DNA length"; +"POPULATION_SIZE" = "Population size"; \ No newline at end of file diff --git a/iDNA/iDNA/en.lproj/MainMenu.xib b/iDNA/iDNA/en.lproj/MainMenu.xib index 23c1e3c..8f25f63 100644 --- a/iDNA/iDNA/en.lproj/MainMenu.xib +++ b/iDNA/iDNA/en.lproj/MainMenu.xib @@ -260,10 +260,10 @@ _NSMainMenu - 15 + 4103 2 {{335, 390}, {505, 310}} - 880279552 + 1954021376 iDNA NSWindow @@ -860,14 +860,6 @@ 493 - - - window - - - - 532 - tfGoalDNA @@ -3069,7 +3061,7 @@ - 1576 + 1580 @@ -3109,6 +3101,7 @@ NSTextField NSTextField NSTextField + Graph NSWindow @@ -3164,6 +3157,10 @@ tfPopulationSize NSTextField + + vwGraph + Graph + window NSWindow diff --git a/iDNA/iDNA/ru.lproj/Localizable.strings b/iDNA/iDNA/ru.lproj/Localizable.strings index 7cd7112..17b322e 100644 --- a/iDNA/iDNA/ru.lproj/Localizable.strings +++ b/iDNA/iDNA/ru.lproj/Localizable.strings @@ -4,5 +4,10 @@ "ALERT_PARAMETER_ALT_BTN" = "Я понял"; "ALERT_PARAMETER_OTHER_BTN" = "Другая кнопка"; +"ALERT_CLOSE_TITLE" = "Вы уверены, что хотите закрыть приложение?"; +"ALERT_CLOSE_MESSAGE" = "Нам было так весело!"; +"ALERT_CLOSE_DEFAULT_BTN" = "Закройся уже"; +"ALERT_CLOSE_ALT_BTN" = "Не надо, я передумал"; + "DNA_LENGTH" = "Размер ДНК"; "POPULATION_SIZE" = "Размер популяции"; \ No newline at end of file