From af10da4bbb0e862c243c5e30f5d714f1b402859c Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 11 Sep 2021 09:44:01 +0800 Subject: [PATCH 1/8] [CHG] clean file and modify ignore patterns --- .gitignore | 14 +- Example/.gitkeep | 0 Example/Gemfile | 4 + Example/Podfile.lock | 23 - Example/Pods/Aspects/Aspects.h | 83 -- Example/Pods/Aspects/Aspects.m | 890 ----------------- Example/Pods/Aspects/LICENSE | 21 - Example/Pods/Aspects/README.md | 230 ----- .../Pods/Headers/Private/Aspects/Aspects.h | 1 - .../Pods/Headers/Private/Stinger/STBlock.h | 1 - .../Pods/Headers/Private/Stinger/STDefines.h | 1 - .../Pods/Headers/Private/Stinger/STHookInfo.h | 1 - .../Headers/Private/Stinger/STHookInfoPool.h | 1 - .../Private/Stinger/STMethodSignature.h | 1 - .../Pods/Headers/Private/Stinger/Stinger.h | 1 - .../Headers/Private/Stinger/StingerParams.h | 1 - Example/Pods/Headers/Private/Stinger/ffi.h | 1 - .../Pods/Headers/Private/Stinger/ffi_arm.h | 1 - .../Pods/Headers/Private/Stinger/ffi_arm64.h | 1 - .../Pods/Headers/Private/Stinger/ffi_i386.h | 1 - .../Pods/Headers/Private/Stinger/ffi_x86_64.h | 1 - .../Pods/Headers/Private/Stinger/ffitarget.h | 1 - .../Headers/Private/Stinger/ffitarget_arm.h | 1 - .../Headers/Private/Stinger/ffitarget_arm64.h | 1 - .../Headers/Private/Stinger/ffitarget_i386.h | 1 - .../Private/Stinger/ffitarget_x86_64.h | 1 - Example/Pods/Headers/Public/Aspects/Aspects.h | 1 - Example/Pods/Headers/Public/Stinger/STBlock.h | 1 - .../Pods/Headers/Public/Stinger/STDefines.h | 1 - .../Pods/Headers/Public/Stinger/STHookInfo.h | 1 - .../Headers/Public/Stinger/STHookInfoPool.h | 1 - .../Public/Stinger/STMethodSignature.h | 1 - Example/Pods/Headers/Public/Stinger/Stinger.h | 1 - .../Headers/Public/Stinger/StingerParams.h | 1 - Example/Pods/Headers/Public/Stinger/ffi.h | 1 - Example/Pods/Headers/Public/Stinger/ffi_arm.h | 1 - .../Pods/Headers/Public/Stinger/ffi_arm64.h | 1 - .../Pods/Headers/Public/Stinger/ffi_i386.h | 1 - .../Pods/Headers/Public/Stinger/ffi_x86_64.h | 1 - .../Pods/Headers/Public/Stinger/ffitarget.h | 1 - .../Headers/Public/Stinger/ffitarget_arm.h | 1 - .../Headers/Public/Stinger/ffitarget_arm64.h | 1 - .../Headers/Public/Stinger/ffitarget_i386.h | 1 - .../Headers/Public/Stinger/ffitarget_x86_64.h | 1 - .../Pods/Local Podspecs/Stinger.podspec.json | 23 - Example/Pods/Manifest.lock | 23 - Example/Pods/Pods.xcodeproj/project.pbxproj | 901 ------------------ .../contents.xcworkspacedata | 7 - .../Aspects/Aspects-dummy.m | 5 - .../Aspects/Aspects-prefix.pch | 12 - .../Aspects/Aspects.xcconfig | 9 - .../Pods-Stinger_Example/Info.plist | 26 - ...-Stinger_Example-acknowledgements.markdown | 50 - ...ods-Stinger_Example-acknowledgements.plist | 88 -- .../Pods-Stinger_Example-dummy.m | 5 - .../Pods-Stinger_Example-frameworks.sh | 146 --- .../Pods-Stinger_Example-resources.sh | 118 --- .../Pods-Stinger_Example-umbrella.h | 16 - .../Pods-Stinger_Example.debug.xcconfig | 9 - .../Pods-Stinger_Example.modulemap | 6 - .../Pods-Stinger_Example.release.xcconfig | 9 - .../Pods-Stinger_Tests/Info.plist | 26 - ...ds-Stinger_Tests-acknowledgements.markdown | 3 - .../Pods-Stinger_Tests-acknowledgements.plist | 29 - .../Pods-Stinger_Tests-dummy.m | 5 - .../Pods-Stinger_Tests-frameworks.sh | 146 --- .../Pods-Stinger_Tests-resources.sh | 118 --- .../Pods-Stinger_Tests-umbrella.h | 16 - .../Pods-Stinger_Tests.debug.xcconfig | 9 - .../Pods-Stinger_Tests.modulemap | 6 - .../Pods-Stinger_Tests.release.xcconfig | 9 - .../Target Support Files/Stinger/Info.plist | 26 - .../Stinger/Stinger-dummy.m | 5 - .../Stinger/Stinger-prefix.pch | 12 - .../Stinger/Stinger-umbrella.h | 29 - .../Stinger/Stinger.modulemap | 6 - .../Stinger/Stinger.xcconfig | 11 - .../contents.xcworkspacedata | 7 - .../contents.xcworkspacedata | 10 - _Pods.xcodeproj | 1 - 80 files changed, 10 insertions(+), 3218 deletions(-) delete mode 100644 Example/.gitkeep create mode 100644 Example/Gemfile delete mode 100644 Example/Podfile.lock delete mode 100644 Example/Pods/Aspects/Aspects.h delete mode 100644 Example/Pods/Aspects/Aspects.m delete mode 100644 Example/Pods/Aspects/LICENSE delete mode 100644 Example/Pods/Aspects/README.md delete mode 120000 Example/Pods/Headers/Private/Aspects/Aspects.h delete mode 120000 Example/Pods/Headers/Private/Stinger/STBlock.h delete mode 120000 Example/Pods/Headers/Private/Stinger/STDefines.h delete mode 120000 Example/Pods/Headers/Private/Stinger/STHookInfo.h delete mode 120000 Example/Pods/Headers/Private/Stinger/STHookInfoPool.h delete mode 120000 Example/Pods/Headers/Private/Stinger/STMethodSignature.h delete mode 120000 Example/Pods/Headers/Private/Stinger/Stinger.h delete mode 120000 Example/Pods/Headers/Private/Stinger/StingerParams.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffi.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffi_arm.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffi_arm64.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffi_i386.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffi_x86_64.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffitarget.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffitarget_arm.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffitarget_arm64.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffitarget_i386.h delete mode 120000 Example/Pods/Headers/Private/Stinger/ffitarget_x86_64.h delete mode 120000 Example/Pods/Headers/Public/Aspects/Aspects.h delete mode 120000 Example/Pods/Headers/Public/Stinger/STBlock.h delete mode 120000 Example/Pods/Headers/Public/Stinger/STDefines.h delete mode 120000 Example/Pods/Headers/Public/Stinger/STHookInfo.h delete mode 120000 Example/Pods/Headers/Public/Stinger/STHookInfoPool.h delete mode 120000 Example/Pods/Headers/Public/Stinger/STMethodSignature.h delete mode 120000 Example/Pods/Headers/Public/Stinger/Stinger.h delete mode 120000 Example/Pods/Headers/Public/Stinger/StingerParams.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffi.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffi_arm.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffi_arm64.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffi_i386.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffi_x86_64.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffitarget.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffitarget_arm.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffitarget_arm64.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffitarget_i386.h delete mode 120000 Example/Pods/Headers/Public/Stinger/ffitarget_x86_64.h delete mode 100644 Example/Pods/Local Podspecs/Stinger.podspec.json delete mode 100644 Example/Pods/Manifest.lock delete mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj delete mode 100644 Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/Pods/Target Support Files/Aspects/Aspects-dummy.m delete mode 100644 Example/Pods/Target Support Files/Aspects/Aspects-prefix.pch delete mode 100644 Example/Pods/Target Support Files/Aspects/Aspects.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-frameworks.sh delete mode 100755 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-frameworks.sh delete mode 100755 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/Stinger/Info.plist delete mode 100644 Example/Pods/Target Support Files/Stinger/Stinger-dummy.m delete mode 100644 Example/Pods/Target Support Files/Stinger/Stinger-prefix.pch delete mode 100644 Example/Pods/Target Support Files/Stinger/Stinger-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Stinger/Stinger.modulemap delete mode 100644 Example/Pods/Target Support Files/Stinger/Stinger.xcconfig delete mode 100644 Example/Stinger.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/Stinger.xcworkspace/contents.xcworkspacedata delete mode 120000 _Pods.xcodeproj diff --git a/.gitignore b/.gitignore index e7b722d..875bea8 100644 --- a/.gitignore +++ b/.gitignore @@ -18,16 +18,14 @@ profile DerivedData *.hmap *.ipa +*.xcworkspace/ # Bundler .bundle Carthage -# We recommend against adding the Pods directory to your .gitignore. However -# you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control -# -# Note: if you ignore the Pods directory, make sure to uncomment -# `pod install` in .travis.yml -# -# Pods/ +Pods/ +_Pods* +Podfile.lock +Gemfile.lock + diff --git a/Example/.gitkeep b/Example/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/Example/Gemfile b/Example/Gemfile new file mode 100644 index 0000000..7341aec --- /dev/null +++ b/Example/Gemfile @@ -0,0 +1,4 @@ +source 'https://gems.ruby-china.com' + +gem 'cocoapods', '>= 1.8.4' + diff --git a/Example/Podfile.lock b/Example/Podfile.lock deleted file mode 100644 index b6c5c4c..0000000 --- a/Example/Podfile.lock +++ /dev/null @@ -1,23 +0,0 @@ -PODS: - - Aspects (1.4.1) - - Stinger (0.2.6) - -DEPENDENCIES: - - Aspects - - Stinger (from `../`) - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - Aspects - -EXTERNAL SOURCES: - Stinger: - :path: "../" - -SPEC CHECKSUMS: - Aspects: 7595ba96a6727a58ebcbfc954497fc5d2fdde546 - Stinger: 62ce4cd94935217a13a8db639b6f87364bba45e3 - -PODFILE CHECKSUM: 6df52b616ee208569510c4defb2313f601db9f5e - -COCOAPODS: 1.5.3 diff --git a/Example/Pods/Aspects/Aspects.h b/Example/Pods/Aspects/Aspects.h deleted file mode 100644 index 081dfe6..0000000 --- a/Example/Pods/Aspects/Aspects.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// Aspects.h -// Aspects - A delightful, simple library for aspect oriented programming. -// -// Copyright (c) 2014 Peter Steinberger. Licensed under the MIT license. -// - -#import - -typedef NS_OPTIONS(NSUInteger, AspectOptions) { - AspectPositionAfter = 0, /// Called after the original implementation (default) - AspectPositionInstead = 1, /// Will replace the original implementation. - AspectPositionBefore = 2, /// Called before the original implementation. - - AspectOptionAutomaticRemoval = 1 << 3 /// Will remove the hook after the first execution. -}; - -/// Opaque Aspect Token that allows to deregister the hook. -@protocol AspectToken - -/// Deregisters an aspect. -/// @return YES if deregistration is successful, otherwise NO. -- (BOOL)remove; - -@end - -/// The AspectInfo protocol is the first parameter of our block syntax. -@protocol AspectInfo - -/// The instance that is currently hooked. -- (id)instance; - -/// The original invocation of the hooked method. -- (NSInvocation *)originalInvocation; - -/// All method arguments, boxed. This is lazily evaluated. -- (NSArray *)arguments; - -@end - -/** - Aspects uses Objective-C message forwarding to hook into messages. This will create some overhead. Don't add aspects to methods that are called a lot. Aspects is meant for view/controller code that is not called a 1000 times per second. - - Adding aspects returns an opaque token which can be used to deregister again. All calls are thread safe. - */ -@interface NSObject (Aspects) - -/// Adds a block of code before/instead/after the current `selector` for a specific class. -/// -/// @param block Aspects replicates the type signature of the method being hooked. -/// The first parameter will be `id`, followed by all parameters of the method. -/// These parameters are optional and will be filled to match the block signature. -/// You can even use an empty block, or one that simple gets `id`. -/// -/// @note Hooking static methods is not supported. -/// @return A token which allows to later deregister the aspect. -+ (id)aspect_hookSelector:(SEL)selector - withOptions:(AspectOptions)options - usingBlock:(id)block - error:(NSError **)error; - -/// Adds a block of code before/instead/after the current `selector` for a specific instance. -- (id)aspect_hookSelector:(SEL)selector - withOptions:(AspectOptions)options - usingBlock:(id)block - error:(NSError **)error; - -@end - - -typedef NS_ENUM(NSUInteger, AspectErrorCode) { - AspectErrorSelectorBlacklisted, /// Selectors like release, retain, autorelease are blacklisted. - AspectErrorDoesNotRespondToSelector, /// Selector could not be found. - AspectErrorSelectorDeallocPosition, /// When hooking dealloc, only AspectPositionBefore is allowed. - AspectErrorSelectorAlreadyHookedInClassHierarchy, /// Statically hooking the same method in subclasses is not allowed. - AspectErrorFailedToAllocateClassPair, /// The runtime failed creating a class pair. - AspectErrorMissingBlockSignature, /// The block misses compile time signature info and can't be called. - AspectErrorIncompatibleBlockSignature, /// The block signature does not match the method or is too large. - - AspectErrorRemoveObjectAlreadyDeallocated = 100 /// (for removing) The object hooked is already deallocated. -}; - -extern NSString *const AspectErrorDomain; diff --git a/Example/Pods/Aspects/Aspects.m b/Example/Pods/Aspects/Aspects.m deleted file mode 100644 index aec5583..0000000 --- a/Example/Pods/Aspects/Aspects.m +++ /dev/null @@ -1,890 +0,0 @@ -// -// Aspects.m -// Aspects - A delightful, simple library for aspect oriented programming. -// -// Copyright (c) 2014 Peter Steinberger. Licensed under the MIT license. -// - -#import "Aspects.h" -#import -#import -#import - -#define AspectLog(...) -//#define AspectLog(...) do { NSLog(__VA_ARGS__); }while(0) -#define AspectLogError(...) do { NSLog(__VA_ARGS__); }while(0) - -// Block internals. -typedef NS_OPTIONS(int, AspectBlockFlags) { - AspectBlockFlagsHasCopyDisposeHelpers = (1 << 25), - AspectBlockFlagsHasSignature = (1 << 30) -}; -typedef struct _AspectBlock { - __unused Class isa; - AspectBlockFlags flags; - __unused int reserved; - void (__unused *invoke)(struct _AspectBlock *block, ...); - struct { - unsigned long int reserved; - unsigned long int size; - // requires AspectBlockFlagsHasCopyDisposeHelpers - void (*copy)(void *dst, const void *src); - void (*dispose)(const void *); - // requires AspectBlockFlagsHasSignature - const char *signature; - const char *layout; - } *descriptor; - // imported variables -} *AspectBlockRef; - -@interface AspectInfo : NSObject -- (id)initWithInstance:(__unsafe_unretained id)instance invocation:(NSInvocation *)invocation; -@property (nonatomic, unsafe_unretained, readonly) id instance; -@property (nonatomic, strong, readonly) NSArray *arguments; -@property (nonatomic, strong, readonly) NSInvocation *originalInvocation; -@end - -// Tracks a single aspect. -@interface AspectIdentifier : NSObject -+ (instancetype)identifierWithSelector:(SEL)selector object:(id)object options:(AspectOptions)options block:(id)block error:(NSError **)error; -- (BOOL)invokeWithInfo:(id)info; -@property (nonatomic, assign) SEL selector; -@property (nonatomic, strong) id block; -@property (nonatomic, strong) NSMethodSignature *blockSignature; -@property (nonatomic, weak) id object; -@property (nonatomic, assign) AspectOptions options; -@end - -// Tracks all aspects for an object/class. -@interface AspectsContainer : NSObject -- (void)addAspect:(AspectIdentifier *)aspect withOptions:(AspectOptions)injectPosition; -- (BOOL)removeAspect:(id)aspect; -- (BOOL)hasAspects; -@property (atomic, copy) NSArray *beforeAspects; -@property (atomic, copy) NSArray *insteadAspects; -@property (atomic, copy) NSArray *afterAspects; -@end - -@interface AspectTracker : NSObject -- (id)initWithTrackedClass:(Class)trackedClass parent:(AspectTracker *)parent; -@property (nonatomic, strong) Class trackedClass; -@property (nonatomic, strong) NSMutableSet *selectorNames; -@property (nonatomic, weak) AspectTracker *parentEntry; -@end - -@interface NSInvocation (Aspects) -- (NSArray *)aspects_arguments; -@end - -#define AspectPositionFilter 0x07 - -#define AspectError(errorCode, errorDescription) do { \ -AspectLogError(@"Aspects: %@", errorDescription); \ -if (error) { *error = [NSError errorWithDomain:AspectErrorDomain code:errorCode userInfo:@{NSLocalizedDescriptionKey: errorDescription}]; }}while(0) - -NSString *const AspectErrorDomain = @"AspectErrorDomain"; -static NSString *const AspectsSubclassSuffix = @"_Aspects_"; -static NSString *const AspectsMessagePrefix = @"aspects_"; - -@implementation NSObject (Aspects) - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Public Aspects API - -+ (id)aspect_hookSelector:(SEL)selector - withOptions:(AspectOptions)options - usingBlock:(id)block - error:(NSError **)error { - return aspect_add((id)self, selector, options, block, error); -} - -/// @return A token which allows to later deregister the aspect. -- (id)aspect_hookSelector:(SEL)selector - withOptions:(AspectOptions)options - usingBlock:(id)block - error:(NSError **)error { - return aspect_add(self, selector, options, block, error); -} - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Private Helper - -static id aspect_add(id self, SEL selector, AspectOptions options, id block, NSError **error) { - NSCParameterAssert(self); - NSCParameterAssert(selector); - NSCParameterAssert(block); - - __block AspectIdentifier *identifier = nil; - aspect_performLocked(^{ - if (aspect_isSelectorAllowedAndTrack(self, selector, options, error)) { - AspectsContainer *aspectContainer = aspect_getContainerForObject(self, selector); - identifier = [AspectIdentifier identifierWithSelector:selector object:self options:options block:block error:error]; - if (identifier) { - [aspectContainer addAspect:identifier withOptions:options]; - - // Modify the class to allow message interception. - aspect_prepareClassAndHookSelector(self, selector, error); - } - } - }); - return identifier; -} - -static BOOL aspect_remove(AspectIdentifier *aspect, NSError **error) { - NSCAssert([aspect isKindOfClass:AspectIdentifier.class], @"Must have correct type."); - - __block BOOL success = NO; - aspect_performLocked(^{ - id self = aspect.object; // strongify - if (self) { - AspectsContainer *aspectContainer = aspect_getContainerForObject(self, aspect.selector); - success = [aspectContainer removeAspect:aspect]; - - aspect_cleanupHookedClassAndSelector(self, aspect.selector); - // destroy token - aspect.object = nil; - aspect.block = nil; - aspect.selector = NULL; - }else { - NSString *errrorDesc = [NSString stringWithFormat:@"Unable to deregister hook. Object already deallocated: %@", aspect]; - AspectError(AspectErrorRemoveObjectAlreadyDeallocated, errrorDesc); - } - }); - return success; -} - -static void aspect_performLocked(dispatch_block_t block) { - static OSSpinLock aspect_lock = OS_SPINLOCK_INIT; - OSSpinLockLock(&aspect_lock); - block(); - OSSpinLockUnlock(&aspect_lock); -} - -static SEL aspect_aliasForSelector(SEL selector) { - NSCParameterAssert(selector); - return NSSelectorFromString([AspectsMessagePrefix stringByAppendingFormat:@"_%@", NSStringFromSelector(selector)]); -} - -static NSMethodSignature *aspect_blockMethodSignature(id block, NSError **error) { - AspectBlockRef layout = (__bridge void *)block; - if (!(layout->flags & AspectBlockFlagsHasSignature)) { - NSString *description = [NSString stringWithFormat:@"The block %@ doesn't contain a type signature.", block]; - AspectError(AspectErrorMissingBlockSignature, description); - return nil; - } - void *desc = layout->descriptor; - desc += 2 * sizeof(unsigned long int); - if (layout->flags & AspectBlockFlagsHasCopyDisposeHelpers) { - desc += 2 * sizeof(void *); - } - if (!desc) { - NSString *description = [NSString stringWithFormat:@"The block %@ doesn't has a type signature.", block]; - AspectError(AspectErrorMissingBlockSignature, description); - return nil; - } - const char *signature = (*(const char **)desc); - return [NSMethodSignature signatureWithObjCTypes:signature]; -} - -static BOOL aspect_isCompatibleBlockSignature(NSMethodSignature *blockSignature, id object, SEL selector, NSError **error) { - NSCParameterAssert(blockSignature); - NSCParameterAssert(object); - NSCParameterAssert(selector); - - BOOL signaturesMatch = YES; - NSMethodSignature *methodSignature = [[object class] instanceMethodSignatureForSelector:selector]; - if (blockSignature.numberOfArguments > methodSignature.numberOfArguments) { - signaturesMatch = NO; - }else { - if (blockSignature.numberOfArguments > 1) { - const char *blockType = [blockSignature getArgumentTypeAtIndex:1]; - if (blockType[0] != '@') { - signaturesMatch = NO; - } - } - // Argument 0 is self/block, argument 1 is SEL or id. We start comparing at argument 2. - // The block can have less arguments than the method, that's ok. - if (signaturesMatch) { - for (NSUInteger idx = 2; idx < blockSignature.numberOfArguments; idx++) { - const char *methodType = [methodSignature getArgumentTypeAtIndex:idx]; - const char *blockType = [blockSignature getArgumentTypeAtIndex:idx]; - // Only compare parameter, not the optional type data. - if (!methodType || !blockType || methodType[0] != blockType[0]) { - signaturesMatch = NO; break; - } - } - } - } - - if (!signaturesMatch) { - NSString *description = [NSString stringWithFormat:@"Blog signature %@ doesn't match %@.", blockSignature, methodSignature]; - AspectError(AspectErrorIncompatibleBlockSignature, description); - return NO; - } - return YES; -} - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Class + Selector Preparation - -static BOOL aspect_isMsgForwardIMP(IMP impl) { - return impl == _objc_msgForward -#if !defined(__arm64__) - || impl == (IMP)_objc_msgForward_stret -#endif - ; -} - -static IMP aspect_getMsgForwardIMP(NSObject *self, SEL selector) { - IMP msgForwardIMP = _objc_msgForward; -#if !defined(__arm64__) - // As an ugly internal runtime implementation detail in the 32bit runtime, we need to determine of the method we hook returns a struct or anything larger than id. - // https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/000-Introduction/introduction.html - // https://github.com/ReactiveCocoa/ReactiveCocoa/issues/783 - // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf (Section 5.4) - Method method = class_getInstanceMethod(self.class, selector); - const char *encoding = method_getTypeEncoding(method); - BOOL methodReturnsStructValue = encoding[0] == _C_STRUCT_B; - if (methodReturnsStructValue) { - @try { - NSUInteger valueSize = 0; - NSGetSizeAndAlignment(encoding, &valueSize, NULL); - - if (valueSize == 1 || valueSize == 2 || valueSize == 4 || valueSize == 8) { - methodReturnsStructValue = NO; - } - } @catch (NSException *e) {} - } - if (methodReturnsStructValue) { - msgForwardIMP = (IMP)_objc_msgForward_stret; - } -#endif - return msgForwardIMP; -} - -static void aspect_prepareClassAndHookSelector(NSObject *self, SEL selector, NSError **error) { - NSCParameterAssert(selector); - Class klass = aspect_hookClass(self, error); - Method targetMethod = class_getInstanceMethod(klass, selector); - IMP targetMethodIMP = method_getImplementation(targetMethod); - if (!aspect_isMsgForwardIMP(targetMethodIMP)) { - // Make a method alias for the existing method implementation, it not already copied. - const char *typeEncoding = method_getTypeEncoding(targetMethod); - SEL aliasSelector = aspect_aliasForSelector(selector); - if (![klass instancesRespondToSelector:aliasSelector]) { - __unused BOOL addedAlias = class_addMethod(klass, aliasSelector, method_getImplementation(targetMethod), typeEncoding); - NSCAssert(addedAlias, @"Original implementation for %@ is already copied to %@ on %@", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), klass); - } - - // We use forwardInvocation to hook in. - class_replaceMethod(klass, selector, aspect_getMsgForwardIMP(self, selector), typeEncoding); - AspectLog(@"Aspects: Installed hook for -[%@ %@].", klass, NSStringFromSelector(selector)); - } -} - -// Will undo the runtime changes made. -static void aspect_cleanupHookedClassAndSelector(NSObject *self, SEL selector) { - NSCParameterAssert(self); - NSCParameterAssert(selector); - - Class klass = object_getClass(self); - BOOL isMetaClass = class_isMetaClass(klass); - if (isMetaClass) { - klass = (Class)self; - } - - // Check if the method is marked as forwarded and undo that. - Method targetMethod = class_getInstanceMethod(klass, selector); - IMP targetMethodIMP = method_getImplementation(targetMethod); - if (aspect_isMsgForwardIMP(targetMethodIMP)) { - // Restore the original method implementation. - const char *typeEncoding = method_getTypeEncoding(targetMethod); - SEL aliasSelector = aspect_aliasForSelector(selector); - Method originalMethod = class_getInstanceMethod(klass, aliasSelector); - IMP originalIMP = method_getImplementation(originalMethod); - NSCAssert(originalMethod, @"Original implementation for %@ not found %@ on %@", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), klass); - - class_replaceMethod(klass, selector, originalIMP, typeEncoding); - AspectLog(@"Aspects: Removed hook for -[%@ %@].", klass, NSStringFromSelector(selector)); - } - - // Deregister global tracked selector - aspect_deregisterTrackedSelector(self, selector); - - // Get the aspect container and check if there are any hooks remaining. Clean up if there are not. - AspectsContainer *container = aspect_getContainerForObject(self, selector); - if (!container.hasAspects) { - // Destroy the container - aspect_destroyContainerForObject(self, selector); - - // Figure out how the class was modified to undo the changes. - NSString *className = NSStringFromClass(klass); - if ([className hasSuffix:AspectsSubclassSuffix]) { - Class originalClass = NSClassFromString([className stringByReplacingOccurrencesOfString:AspectsSubclassSuffix withString:@""]); - NSCAssert(originalClass != nil, @"Original class must exist"); - object_setClass(self, originalClass); - AspectLog(@"Aspects: %@ has been restored.", NSStringFromClass(originalClass)); - - // We can only dispose the class pair if we can ensure that no instances exist using our subclass. - // Since we don't globally track this, we can't ensure this - but there's also not much overhead in keeping it around. - //objc_disposeClassPair(object.class); - }else { - // Class is most likely swizzled in place. Undo that. - if (isMetaClass) { - aspect_undoSwizzleClassInPlace((Class)self); - } - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Hook Class - -static Class aspect_hookClass(NSObject *self, NSError **error) { - NSCParameterAssert(self); - Class statedClass = self.class; - Class baseClass = object_getClass(self); - NSString *className = NSStringFromClass(baseClass); - - // Already subclassed - if ([className hasSuffix:AspectsSubclassSuffix]) { - return baseClass; - - // We swizzle a class object, not a single object. - }else if (class_isMetaClass(baseClass)) { - return aspect_swizzleClassInPlace((Class)self); - // Probably a KVO'ed class. Swizzle in place. Also swizzle meta classes in place. - }else if (statedClass != baseClass) { - return aspect_swizzleClassInPlace(baseClass); - } - - // Default case. Create dynamic subclass. - const char *subclassName = [className stringByAppendingString:AspectsSubclassSuffix].UTF8String; - Class subclass = objc_getClass(subclassName); - - if (subclass == nil) { - subclass = objc_allocateClassPair(baseClass, subclassName, 0); - if (subclass == nil) { - NSString *errrorDesc = [NSString stringWithFormat:@"objc_allocateClassPair failed to allocate class %s.", subclassName]; - AspectError(AspectErrorFailedToAllocateClassPair, errrorDesc); - return nil; - } - - aspect_swizzleForwardInvocation(subclass); - aspect_hookedGetClass(subclass, statedClass); - aspect_hookedGetClass(object_getClass(subclass), statedClass); - objc_registerClassPair(subclass); - } - - object_setClass(self, subclass); - return subclass; -} - -static NSString *const AspectsForwardInvocationSelectorName = @"__aspects_forwardInvocation:"; -static void aspect_swizzleForwardInvocation(Class klass) { - NSCParameterAssert(klass); - // If there is no method, replace will act like class_addMethod. - IMP originalImplementation = class_replaceMethod(klass, @selector(forwardInvocation:), (IMP)__ASPECTS_ARE_BEING_CALLED__, "v@:@"); - if (originalImplementation) { - class_addMethod(klass, NSSelectorFromString(AspectsForwardInvocationSelectorName), originalImplementation, "v@:@"); - } - AspectLog(@"Aspects: %@ is now aspect aware.", NSStringFromClass(klass)); -} - -static void aspect_undoSwizzleForwardInvocation(Class klass) { - NSCParameterAssert(klass); - Method originalMethod = class_getInstanceMethod(klass, NSSelectorFromString(AspectsForwardInvocationSelectorName)); - Method objectMethod = class_getInstanceMethod(NSObject.class, @selector(forwardInvocation:)); - // There is no class_removeMethod, so the best we can do is to retore the original implementation, or use a dummy. - IMP originalImplementation = method_getImplementation(originalMethod ?: objectMethod); - class_replaceMethod(klass, @selector(forwardInvocation:), originalImplementation, "v@:@"); - - AspectLog(@"Aspects: %@ has been restored.", NSStringFromClass(klass)); -} - -static void aspect_hookedGetClass(Class class, Class statedClass) { - NSCParameterAssert(class); - NSCParameterAssert(statedClass); - Method method = class_getInstanceMethod(class, @selector(class)); - IMP newIMP = imp_implementationWithBlock(^(id self) { - return statedClass; - }); - class_replaceMethod(class, @selector(class), newIMP, method_getTypeEncoding(method)); -} - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Swizzle Class In Place - -static void _aspect_modifySwizzledClasses(void (^block)(NSMutableSet *swizzledClasses)) { - static NSMutableSet *swizzledClasses; - static dispatch_once_t pred; - dispatch_once(&pred, ^{ - swizzledClasses = [NSMutableSet new]; - }); - @synchronized(swizzledClasses) { - block(swizzledClasses); - } -} - -static Class aspect_swizzleClassInPlace(Class klass) { - NSCParameterAssert(klass); - NSString *className = NSStringFromClass(klass); - - _aspect_modifySwizzledClasses(^(NSMutableSet *swizzledClasses) { - if (![swizzledClasses containsObject:className]) { - aspect_swizzleForwardInvocation(klass); - [swizzledClasses addObject:className]; - } - }); - return klass; -} - -static void aspect_undoSwizzleClassInPlace(Class klass) { - NSCParameterAssert(klass); - NSString *className = NSStringFromClass(klass); - - _aspect_modifySwizzledClasses(^(NSMutableSet *swizzledClasses) { - if ([swizzledClasses containsObject:className]) { - aspect_undoSwizzleForwardInvocation(klass); - [swizzledClasses removeObject:className]; - } - }); -} - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Aspect Invoke Point - -// This is a macro so we get a cleaner stack trace. -#define aspect_invoke(aspects, info) \ -for (AspectIdentifier *aspect in aspects) {\ - [aspect invokeWithInfo:info];\ - if (aspect.options & AspectOptionAutomaticRemoval) { \ - aspectsToRemove = [aspectsToRemove?:@[] arrayByAddingObject:aspect]; \ - } \ -} - -// This is the swizzled forwardInvocation: method. -static void __ASPECTS_ARE_BEING_CALLED__(__unsafe_unretained NSObject *self, SEL selector, NSInvocation *invocation) { - NSCParameterAssert(self); - NSCParameterAssert(invocation); - SEL originalSelector = invocation.selector; - SEL aliasSelector = aspect_aliasForSelector(invocation.selector); - invocation.selector = aliasSelector; - AspectsContainer *objectContainer = objc_getAssociatedObject(self, aliasSelector); - AspectsContainer *classContainer = aspect_getContainerForClass(object_getClass(self), aliasSelector); - AspectInfo *info = [[AspectInfo alloc] initWithInstance:self invocation:invocation]; - NSArray *aspectsToRemove = nil; - - // Before hooks. - aspect_invoke(classContainer.beforeAspects, info); - aspect_invoke(objectContainer.beforeAspects, info); - - // Instead hooks. - BOOL respondsToAlias = YES; - if (objectContainer.insteadAspects.count || classContainer.insteadAspects.count) { - aspect_invoke(classContainer.insteadAspects, info); - aspect_invoke(objectContainer.insteadAspects, info); - }else { - Class klass = object_getClass(invocation.target); - do { - if ((respondsToAlias = [klass instancesRespondToSelector:aliasSelector])) { - [invocation invoke]; - break; - } - }while (!respondsToAlias && (klass = class_getSuperclass(klass))); - } - - // After hooks. - aspect_invoke(classContainer.afterAspects, info); - aspect_invoke(objectContainer.afterAspects, info); - - // If no hooks are installed, call original implementation (usually to throw an exception) - if (!respondsToAlias) { - invocation.selector = originalSelector; - SEL originalForwardInvocationSEL = NSSelectorFromString(AspectsForwardInvocationSelectorName); - if ([self respondsToSelector:originalForwardInvocationSEL]) { - ((void( *)(id, SEL, NSInvocation *))objc_msgSend)(self, originalForwardInvocationSEL, invocation); - }else { - [self doesNotRecognizeSelector:invocation.selector]; - } - } - - // Remove any hooks that are queued for deregistration. - [aspectsToRemove makeObjectsPerformSelector:@selector(remove)]; -} -#undef aspect_invoke - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Aspect Container Management - -// Loads or creates the aspect container. -static AspectsContainer *aspect_getContainerForObject(NSObject *self, SEL selector) { - NSCParameterAssert(self); - SEL aliasSelector = aspect_aliasForSelector(selector); - AspectsContainer *aspectContainer = objc_getAssociatedObject(self, aliasSelector); - if (!aspectContainer) { - aspectContainer = [AspectsContainer new]; - objc_setAssociatedObject(self, aliasSelector, aspectContainer, OBJC_ASSOCIATION_RETAIN); - } - return aspectContainer; -} - -static AspectsContainer *aspect_getContainerForClass(Class klass, SEL selector) { - NSCParameterAssert(klass); - AspectsContainer *classContainer = nil; - do { - classContainer = objc_getAssociatedObject(klass, selector); - if (classContainer.hasAspects) break; - }while ((klass = class_getSuperclass(klass))); - - return classContainer; -} - -static void aspect_destroyContainerForObject(id self, SEL selector) { - NSCParameterAssert(self); - SEL aliasSelector = aspect_aliasForSelector(selector); - objc_setAssociatedObject(self, aliasSelector, nil, OBJC_ASSOCIATION_RETAIN); -} - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - Selector Blacklist Checking - -static NSMutableDictionary *aspect_getSwizzledClassesDict() { - static NSMutableDictionary *swizzledClassesDict; - static dispatch_once_t pred; - dispatch_once(&pred, ^{ - swizzledClassesDict = [NSMutableDictionary new]; - }); - return swizzledClassesDict; -} - -static BOOL aspect_isSelectorAllowedAndTrack(NSObject *self, SEL selector, AspectOptions options, NSError **error) { - static NSSet *disallowedSelectorList; - static dispatch_once_t pred; - dispatch_once(&pred, ^{ - disallowedSelectorList = [NSSet setWithObjects:@"retain", @"release", @"autorelease", @"forwardInvocation:", nil]; - }); - - // Check against the blacklist. - NSString *selectorName = NSStringFromSelector(selector); - if ([disallowedSelectorList containsObject:selectorName]) { - NSString *errorDescription = [NSString stringWithFormat:@"Selector %@ is blacklisted.", selectorName]; - AspectError(AspectErrorSelectorBlacklisted, errorDescription); - return NO; - } - - // Additional checks. - AspectOptions position = options&AspectPositionFilter; - if ([selectorName isEqualToString:@"dealloc"] && position != AspectPositionBefore) { - NSString *errorDesc = @"AspectPositionBefore is the only valid position when hooking dealloc."; - AspectError(AspectErrorSelectorDeallocPosition, errorDesc); - return NO; - } - - if (![self respondsToSelector:selector] && ![self.class instancesRespondToSelector:selector]) { - NSString *errorDesc = [NSString stringWithFormat:@"Unable to find selector -[%@ %@].", NSStringFromClass(self.class), selectorName]; - AspectError(AspectErrorDoesNotRespondToSelector, errorDesc); - return NO; - } - - // Search for the current class and the class hierarchy IF we are modifying a class object - if (class_isMetaClass(object_getClass(self))) { - Class klass = [self class]; - NSMutableDictionary *swizzledClassesDict = aspect_getSwizzledClassesDict(); - Class currentClass = [self class]; - do { - AspectTracker *tracker = swizzledClassesDict[currentClass]; - if ([tracker.selectorNames containsObject:selectorName]) { - - // Find the topmost class for the log. - if (tracker.parentEntry) { - AspectTracker *topmostEntry = tracker.parentEntry; - while (topmostEntry.parentEntry) { - topmostEntry = topmostEntry.parentEntry; - } - NSString *errorDescription = [NSString stringWithFormat:@"Error: %@ already hooked in %@. A method can only be hooked once per class hierarchy.", selectorName, NSStringFromClass(topmostEntry.trackedClass)]; - AspectError(AspectErrorSelectorAlreadyHookedInClassHierarchy, errorDescription); - return NO; - }else if (klass == currentClass) { - // Already modified and topmost! - return YES; - } - } - }while ((currentClass = class_getSuperclass(currentClass))); - - // Add the selector as being modified. - currentClass = klass; - AspectTracker *parentTracker = nil; - do { - AspectTracker *tracker = swizzledClassesDict[currentClass]; - if (!tracker) { - tracker = [[AspectTracker alloc] initWithTrackedClass:currentClass parent:parentTracker]; - swizzledClassesDict[(id)currentClass] = tracker; - } - [tracker.selectorNames addObject:selectorName]; - // All superclasses get marked as having a subclass that is modified. - parentTracker = tracker; - }while ((currentClass = class_getSuperclass(currentClass))); - } - - return YES; -} - -static void aspect_deregisterTrackedSelector(id self, SEL selector) { - if (!class_isMetaClass(object_getClass(self))) return; - - NSMutableDictionary *swizzledClassesDict = aspect_getSwizzledClassesDict(); - NSString *selectorName = NSStringFromSelector(selector); - Class currentClass = [self class]; - do { - AspectTracker *tracker = swizzledClassesDict[currentClass]; - if (tracker) { - [tracker.selectorNames removeObject:selectorName]; - if (tracker.selectorNames.count == 0) { - [swizzledClassesDict removeObjectForKey:tracker]; - } - } - }while ((currentClass = class_getSuperclass(currentClass))); -} - -@end - -@implementation AspectTracker - -- (id)initWithTrackedClass:(Class)trackedClass parent:(AspectTracker *)parent { - if (self = [super init]) { - _trackedClass = trackedClass; - _parentEntry = parent; - _selectorNames = [NSMutableSet new]; - } - return self; -} -- (NSString *)description { - return [NSString stringWithFormat:@"<%@: %@, trackedClass: %@, selectorNames:%@, parent:%p>", self.class, self, NSStringFromClass(self.trackedClass), self.selectorNames, self.parentEntry]; -} - -@end - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - NSInvocation (Aspects) - -@implementation NSInvocation (Aspects) - -// Thanks to the ReactiveCocoa team for providing a generic solution for this. -- (id)aspect_argumentAtIndex:(NSUInteger)index { - const char *argType = [self.methodSignature getArgumentTypeAtIndex:index]; - // Skip const type qualifier. - if (argType[0] == _C_CONST) argType++; - -#define WRAP_AND_RETURN(type) do { type val = 0; [self getArgument:&val atIndex:(NSInteger)index]; return @(val); } while (0) - if (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) { - __autoreleasing id returnObj; - [self getArgument:&returnObj atIndex:(NSInteger)index]; - return returnObj; - } else if (strcmp(argType, @encode(SEL)) == 0) { - SEL selector = 0; - [self getArgument:&selector atIndex:(NSInteger)index]; - return NSStringFromSelector(selector); - } else if (strcmp(argType, @encode(Class)) == 0) { - __autoreleasing Class theClass = Nil; - [self getArgument:&theClass atIndex:(NSInteger)index]; - return theClass; - // Using this list will box the number with the appropriate constructor, instead of the generic NSValue. - } else if (strcmp(argType, @encode(char)) == 0) { - WRAP_AND_RETURN(char); - } else if (strcmp(argType, @encode(int)) == 0) { - WRAP_AND_RETURN(int); - } else if (strcmp(argType, @encode(short)) == 0) { - WRAP_AND_RETURN(short); - } else if (strcmp(argType, @encode(long)) == 0) { - WRAP_AND_RETURN(long); - } else if (strcmp(argType, @encode(long long)) == 0) { - WRAP_AND_RETURN(long long); - } else if (strcmp(argType, @encode(unsigned char)) == 0) { - WRAP_AND_RETURN(unsigned char); - } else if (strcmp(argType, @encode(unsigned int)) == 0) { - WRAP_AND_RETURN(unsigned int); - } else if (strcmp(argType, @encode(unsigned short)) == 0) { - WRAP_AND_RETURN(unsigned short); - } else if (strcmp(argType, @encode(unsigned long)) == 0) { - WRAP_AND_RETURN(unsigned long); - } else if (strcmp(argType, @encode(unsigned long long)) == 0) { - WRAP_AND_RETURN(unsigned long long); - } else if (strcmp(argType, @encode(float)) == 0) { - WRAP_AND_RETURN(float); - } else if (strcmp(argType, @encode(double)) == 0) { - WRAP_AND_RETURN(double); - } else if (strcmp(argType, @encode(BOOL)) == 0) { - WRAP_AND_RETURN(BOOL); - } else if (strcmp(argType, @encode(bool)) == 0) { - WRAP_AND_RETURN(BOOL); - } else if (strcmp(argType, @encode(char *)) == 0) { - WRAP_AND_RETURN(const char *); - } else if (strcmp(argType, @encode(void (^)(void))) == 0) { - __unsafe_unretained id block = nil; - [self getArgument:&block atIndex:(NSInteger)index]; - return [block copy]; - } else { - NSUInteger valueSize = 0; - NSGetSizeAndAlignment(argType, &valueSize, NULL); - - unsigned char valueBytes[valueSize]; - [self getArgument:valueBytes atIndex:(NSInteger)index]; - - return [NSValue valueWithBytes:valueBytes objCType:argType]; - } - return nil; -#undef WRAP_AND_RETURN -} - -- (NSArray *)aspects_arguments { - NSMutableArray *argumentsArray = [NSMutableArray array]; - for (NSUInteger idx = 2; idx < self.methodSignature.numberOfArguments; idx++) { - [argumentsArray addObject:[self aspect_argumentAtIndex:idx] ?: NSNull.null]; - } - return [argumentsArray copy]; -} - -@end - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - AspectIdentifier - -@implementation AspectIdentifier - -+ (instancetype)identifierWithSelector:(SEL)selector object:(id)object options:(AspectOptions)options block:(id)block error:(NSError **)error { - NSCParameterAssert(block); - NSCParameterAssert(selector); - NSMethodSignature *blockSignature = aspect_blockMethodSignature(block, error); // TODO: check signature compatibility, etc. - if (!aspect_isCompatibleBlockSignature(blockSignature, object, selector, error)) { - return nil; - } - - AspectIdentifier *identifier = nil; - if (blockSignature) { - identifier = [AspectIdentifier new]; - identifier.selector = selector; - identifier.block = block; - identifier.blockSignature = blockSignature; - identifier.options = options; - identifier.object = object; // weak - } - return identifier; -} - -- (BOOL)invokeWithInfo:(id)info { - NSInvocation *blockInvocation = [NSInvocation invocationWithMethodSignature:self.blockSignature]; - NSInvocation *originalInvocation = info.originalInvocation; - NSUInteger numberOfArguments = self.blockSignature.numberOfArguments; - - // Be extra paranoid. We already check that on hook registration. - if (numberOfArguments > originalInvocation.methodSignature.numberOfArguments) { - AspectLogError(@"Block has too many arguments. Not calling %@", info); - return NO; - } - - // The `self` of the block will be the AspectInfo. Optional. - if (numberOfArguments > 1) { - [blockInvocation setArgument:&info atIndex:1]; - } - - void *argBuf = NULL; - for (NSUInteger idx = 2; idx < numberOfArguments; idx++) { - const char *type = [originalInvocation.methodSignature getArgumentTypeAtIndex:idx]; - NSUInteger argSize; - NSGetSizeAndAlignment(type, &argSize, NULL); - - if (!(argBuf = reallocf(argBuf, argSize))) { - AspectLogError(@"Failed to allocate memory for block invocation."); - return NO; - } - - [originalInvocation getArgument:argBuf atIndex:idx]; - [blockInvocation setArgument:argBuf atIndex:idx]; - } - - [blockInvocation invokeWithTarget:self.block]; - - if (argBuf != NULL) { - free(argBuf); - } - return YES; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"<%@: %p, SEL:%@ object:%@ options:%tu block:%@ (#%tu args)>", self.class, self, NSStringFromSelector(self.selector), self.object, self.options, self.block, self.blockSignature.numberOfArguments]; -} - -- (BOOL)remove { - return aspect_remove(self, NULL); -} - -@end - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - AspectsContainer - -@implementation AspectsContainer - -- (BOOL)hasAspects { - return self.beforeAspects.count > 0 || self.insteadAspects.count > 0 || self.afterAspects.count > 0; -} - -- (void)addAspect:(AspectIdentifier *)aspect withOptions:(AspectOptions)options { - NSParameterAssert(aspect); - NSUInteger position = options&AspectPositionFilter; - switch (position) { - case AspectPositionBefore: self.beforeAspects = [(self.beforeAspects ?:@[]) arrayByAddingObject:aspect]; break; - case AspectPositionInstead: self.insteadAspects = [(self.insteadAspects?:@[]) arrayByAddingObject:aspect]; break; - case AspectPositionAfter: self.afterAspects = [(self.afterAspects ?:@[]) arrayByAddingObject:aspect]; break; - } -} - -- (BOOL)removeAspect:(id)aspect { - for (NSString *aspectArrayName in @[NSStringFromSelector(@selector(beforeAspects)), - NSStringFromSelector(@selector(insteadAspects)), - NSStringFromSelector(@selector(afterAspects))]) { - NSArray *array = [self valueForKey:aspectArrayName]; - NSUInteger index = [array indexOfObjectIdenticalTo:aspect]; - if (array && index != NSNotFound) { - NSMutableArray *newArray = [NSMutableArray arrayWithArray:array]; - [newArray removeObjectAtIndex:index]; - [self setValue:newArray forKey:aspectArrayName]; - return YES; - } - } - return NO; -} - -- (NSString *)description { - return [NSString stringWithFormat:@"<%@: %p, before:%@, instead:%@, after:%@>", self.class, self, self.beforeAspects, self.insteadAspects, self.afterAspects]; -} - -@end - -/////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - AspectInfo - -@implementation AspectInfo - -@synthesize arguments = _arguments; - -- (id)initWithInstance:(__unsafe_unretained id)instance invocation:(NSInvocation *)invocation { - NSCParameterAssert(instance); - NSCParameterAssert(invocation); - if (self = [super init]) { - _instance = instance; - _originalInvocation = invocation; - } - return self; -} - -- (NSArray *)arguments { - // Lazily evaluate arguments, boxing is expensive. - if (!_arguments) { - _arguments = self.originalInvocation.aspects_arguments; - } - return _arguments; -} - -@end diff --git a/Example/Pods/Aspects/LICENSE b/Example/Pods/Aspects/LICENSE deleted file mode 100644 index 57afcd9..0000000 --- a/Example/Pods/Aspects/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Peter Steinberger, steipete@gmail.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/Example/Pods/Aspects/README.md b/Example/Pods/Aspects/README.md deleted file mode 100644 index 0bacb77..0000000 --- a/Example/Pods/Aspects/README.md +++ /dev/null @@ -1,230 +0,0 @@ -Aspects v1.4.1 [![Build Status](https://travis-ci.org/steipete/Aspects.svg?branch=master)](https://travis-ci.org/steipete/Aspects) -============== - -Delightful, simple library for aspect oriented programming by [@steipete](http://twitter.com/steipete). - -**Think of Aspects as method swizzling on steroids. It allows you to add code to existing methods per class or per instance**, whilst thinking of the insertion point e.g. before/instead/after. Aspects automatically deals with calling super and is easier to use than regular method swizzling. - -This is stable and used in hundreds of apps since it's part of [PSPDFKit, an iOS PDF framework that ships with apps like Dropbox or Evernote](http://pspdfkit.com), and now I finally made it open source. - -Aspects extends `NSObject` with the following methods: - -``` objc -/// Adds a block of code before/instead/after the current `selector` for a specific class. -/// -/// @param block Aspects replicates the type signature of the method being hooked. -/// The first parameter will be `id`, followed by all parameters of the method. -/// These parameters are optional and will be filled to match the block signature. -/// You can even use an empty block, or one that simple gets `id`. -/// -/// @note Hooking static methods is not supported. -/// @return A token which allows to later deregister the aspect. -+ (id)aspect_hookSelector:(SEL)selector - withOptions:(AspectOptions)options - usingBlock:(id)block - error:(NSError **)error; - -/// Adds a block of code before/instead/after the current `selector` for a specific instance. -- (id)aspect_hookSelector:(SEL)selector - withOptions:(AspectOptions)options - usingBlock:(id)block - error:(NSError **)error; - -/// Deregister an aspect. -/// @return YES if deregistration is successful, otherwise NO. -id aspect = ...; -[aspect remove]; -``` - -Adding aspects returns an opaque token of type `AspectToken` which can be used to deregister again. All calls are thread-safe. - -Aspects uses Objective-C message forwarding to hook into messages. This will create some overhead. Don't add aspects to methods that are called a lot. Aspects is meant for view/controller code that is not called 1000 times per second. - -Aspects calls and matches block arguments. Blocks without arguments are supported as well. The first block argument will be of type `id`. - -When to use Aspects -------------------- -Aspect-oritented programming (AOP) is used to encapsulate "cross-cutting" concerns. These are the kind of requirements that *cut-accross* many modules in your system, and so cannot be encapsulated using normal Object Oriented programming. Some examples of these kinds of requirements: - -* *Whenever* a user invokes a method on the service client, security should be checked. -* *Whenever* a useer interacts with the store, a genius suggestion should be presented, based on their interaction. -* *All* calls should be logged. - -If we implemented the above requirements using regular OO there'd be some drawbacks: - - -Good OO says a class should have a single responsibility, however adding on extra *cross-cutting* requirements means a class that is taking on other responsibilites. For example you might have a **StoreClient** that supposed to be all about making purchases from an online store. Add in some cross-cutting requirements and it might also have to take on the roles of logging, security and recommendations. This is not great: - -* Our StoreClient is now harder to understand and maintain. -* These cross-cutting requirements are duplicated and spreading throughout our app. - -AOP lets us modularize these cross-cutting requirements, and then cleanly identify all of the places they should be applied. As shown in the examples above cross-cutting requirements can be eithe technical or business focused in nature. - -## Here are some concrete examples: - - -Aspects can be used to **dynamically add logging** for debug builds only: - -``` objc -[UIViewController aspect_hookSelector:@selector(viewWillAppear:) withOptions:AspectPositionAfter usingBlock:^(id aspectInfo, BOOL animated) { - NSLog(@"View Controller %@ will appear animated: %tu", aspectInfo.instance, animated); -} error:NULL]; -``` - -------------------- -It can be used to greatly simplify your analytics setup: -https://github.com/orta/ARAnalytics - -------------------- -You can check if methods are really being called in your test cases: -``` objc -- (void)testExample { - TestClass *testClass = [TestClass new]; - TestClass *testClass2 = [TestClass new]; - - __block BOOL testCallCalled = NO; - [testClass aspect_hookSelector:@selector(testCall) withOptions:AspectPositionAfter usingBlock:^{ - testCallCalled = YES; - } error:NULL]; - - [testClass2 testCallAndExecuteBlock:^{ - [testClass testCall]; - } error:NULL]; - XCTAssertTrue(testCallCalled, @"Calling testCallAndExecuteBlock must call testCall"); -} -``` -------------------- -It can be really useful for debugging. Here I was curious when exactly the tap gesture changed state: - -``` objc -[_singleTapGesture aspect_hookSelector:@selector(setState:) withOptions:AspectPositionAfter usingBlock:^(id aspectInfo) { - NSLog(@"%@: %@", aspectInfo.instance, aspectInfo.arguments); -} error:NULL]; -``` - -------------------- -Another convenient use case is adding handlers for classes that you don't own. I've written it for use in [PSPDFKit](http://pspdfkit.com), where we require notifications when a view controller is being dismissed modally. This includes UIKit view controllers like `MFMailComposeViewController` or `UIImagePickerController`. We could have created subclasses for each of these controllers, but this would be quite a lot of unnecessary code. Aspects gives you a simpler solution for this problem: - -``` objc -@implementation UIViewController (DismissActionHook) - -// Will add a dismiss action once the controller gets dismissed. -- (void)pspdf_addWillDismissAction:(void (^)(void))action { - PSPDFAssert(action != NULL); - - [self aspect_hookSelector:@selector(viewWillDisappear:) withOptions:AspectPositionAfter usingBlock:^(id aspectInfo) { - if ([aspectInfo.instance isBeingDismissed]) { - action(); - } - } error:NULL]; -} - -@end -``` - -Debugging ---------- -Aspects identifies itself nicely in the stack trace, so it's easy to see if a method has been hooked: - - - -Using Aspects with non-void return types ----------------------------------------- - -You can use the invocation object to customize the return value: - -``` objc - [PSPDFDrawView aspect_hookSelector:@selector(shouldProcessTouches:withEvent:) withOptions:AspectPositionInstead usingBlock:^(id info, NSSet *touches, UIEvent *event) { - // Call original implementation. - BOOL processTouches; - NSInvocation *invocation = info.originalInvocation; - [invocation invoke]; - [invocation getReturnValue:&processTouches]; - - if (processTouches) { - processTouches = pspdf_stylusShouldProcessTouches(touches, event); - [invocation setReturnValue:&processTouches]; - } - } error:NULL]; -``` - -Installation ------------- -The simplest option is to use `pod "Aspects"`. - -You can also add the two files `Aspects.h/m`. There are no further requirements. - -Compatibility and Limitations ------------------------------ -Aspects uses quite some runtime trickery to achieve what it does. You can mostly mix this with regular method swizzling. - -An important limitation is that for class-based hooking, a method can only be hooked once within the subclass hierarchy. [See #2](https://github.com/steipete/Aspects/issues/2) -This does not apply for objects that are hooked. Aspects creates a dynamic subclass here and has full control. - -KVO works if observers are created after your calls `aspect_hookSelector:` It most likely will crash the other way around. -Still looking for workarounds here - any help apprechiated. - -Because of ugly implementation details on the ObjC runtime, methods that return unions that also contain structs might not work correctly unless this code runs on the arm64 runtime. - -Credits -------- -The idea to use `_objc_msgForward` and parts of the `NSInvocation` argument selection is from the excellent [ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa) from the GitHub guys. [This article](http://codeshaker.blogspot.co.at/2012/01/aop-delivered.html) explains how it works under the hood. - - -Supported iOS & SDK Versions ------------------------------ - -* Aspects requires ARC. -* Aspects is tested with iOS 6+ and OS X 10.7 or higher. - -License -------- -MIT licensed, Copyright (c) 2014 Peter Steinberger, steipete@gmail.com, [@steipete](http://twitter.com/steipete) - - -Release Notes ------------------ - -Version 1.4.1 - -- Rename error codes. - -Version 1.4.0 - -- Add support for block signatures that match method signatures. (thanks to @nickynick) - -Version 1.3.1 - -- Add support for OS X 10.7 or higher. (thanks to @ashfurrow) - -Version 1.3.0 - -- Add automatic deregistration. -- Checks if the selector exists before trying to hook. -- Improved dealloc hooking. (no more unsafe_unretained needed) -- Better examples. -- Always log errors. - -Version 1.2.0 - -- Adds error parameter. -- Improvements in subclassing registration tracking. - -Version 1.1.0 - -- Renamed the files from NSObject+Aspects.m/h to just Aspects.m/h. -- Removing now works via calling `remove` on the aspect token. -- Allow hooking dealloc. -- Fixes infinite loop if the same method is hooked for multiple classes. Hooking will only work for one class in the hierarchy. -- Additional checks to prevent things like hooking retain/release/autorelease or forwardInvocation: -- The original implementation of forwardInvocation is now correctly preserved. -- Classes are properly cleaned up and restored to the original state after the last hook is deregistered. -- Lots and lots of new test cases! - -Version 1.0.1 - -- Minor tweaks and documentation improvements. - -Version 1.0.0 - -- Initial release diff --git a/Example/Pods/Headers/Private/Aspects/Aspects.h b/Example/Pods/Headers/Private/Aspects/Aspects.h deleted file mode 120000 index c89adfc..0000000 --- a/Example/Pods/Headers/Private/Aspects/Aspects.h +++ /dev/null @@ -1 +0,0 @@ -../../../Aspects/Aspects.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/STBlock.h b/Example/Pods/Headers/Private/Stinger/STBlock.h deleted file mode 120000 index ea12b85..0000000 --- a/Example/Pods/Headers/Private/Stinger/STBlock.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STBlock.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/STDefines.h b/Example/Pods/Headers/Private/Stinger/STDefines.h deleted file mode 120000 index bb6690a..0000000 --- a/Example/Pods/Headers/Private/Stinger/STDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STDefines.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/STHookInfo.h b/Example/Pods/Headers/Private/Stinger/STHookInfo.h deleted file mode 120000 index 7d29867..0000000 --- a/Example/Pods/Headers/Private/Stinger/STHookInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STHookInfo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/STHookInfoPool.h b/Example/Pods/Headers/Private/Stinger/STHookInfoPool.h deleted file mode 120000 index 5f61c13..0000000 --- a/Example/Pods/Headers/Private/Stinger/STHookInfoPool.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STHookInfoPool.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/STMethodSignature.h b/Example/Pods/Headers/Private/Stinger/STMethodSignature.h deleted file mode 120000 index b4c7497..0000000 --- a/Example/Pods/Headers/Private/Stinger/STMethodSignature.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STMethodSignature.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/Stinger.h b/Example/Pods/Headers/Private/Stinger/Stinger.h deleted file mode 120000 index 91491d8..0000000 --- a/Example/Pods/Headers/Private/Stinger/Stinger.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/Stinger.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/StingerParams.h b/Example/Pods/Headers/Private/Stinger/StingerParams.h deleted file mode 120000 index d45fba8..0000000 --- a/Example/Pods/Headers/Private/Stinger/StingerParams.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/StingerParams.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffi.h b/Example/Pods/Headers/Private/Stinger/ffi.h deleted file mode 120000 index adb03f2..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffi.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffi_arm.h b/Example/Pods/Headers/Private/Stinger/ffi_arm.h deleted file mode 120000 index 9928d60..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffi_arm.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_arm.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffi_arm64.h b/Example/Pods/Headers/Private/Stinger/ffi_arm64.h deleted file mode 120000 index e2cd46f..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffi_arm64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_arm64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffi_i386.h b/Example/Pods/Headers/Private/Stinger/ffi_i386.h deleted file mode 120000 index a360ab9..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffi_i386.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_i386.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffi_x86_64.h b/Example/Pods/Headers/Private/Stinger/ffi_x86_64.h deleted file mode 120000 index 36bbef8..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffi_x86_64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_x86_64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffitarget.h b/Example/Pods/Headers/Private/Stinger/ffitarget.h deleted file mode 120000 index 3aa110e..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffitarget.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffitarget_arm.h b/Example/Pods/Headers/Private/Stinger/ffitarget_arm.h deleted file mode 120000 index f82effb..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffitarget_arm.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_arm.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffitarget_arm64.h b/Example/Pods/Headers/Private/Stinger/ffitarget_arm64.h deleted file mode 120000 index 6d5bf37..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffitarget_arm64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_arm64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffitarget_i386.h b/Example/Pods/Headers/Private/Stinger/ffitarget_i386.h deleted file mode 120000 index 1eb737a..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffitarget_i386.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_i386.h \ No newline at end of file diff --git a/Example/Pods/Headers/Private/Stinger/ffitarget_x86_64.h b/Example/Pods/Headers/Private/Stinger/ffitarget_x86_64.h deleted file mode 120000 index 2298550..0000000 --- a/Example/Pods/Headers/Private/Stinger/ffitarget_x86_64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_x86_64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Aspects/Aspects.h b/Example/Pods/Headers/Public/Aspects/Aspects.h deleted file mode 120000 index c89adfc..0000000 --- a/Example/Pods/Headers/Public/Aspects/Aspects.h +++ /dev/null @@ -1 +0,0 @@ -../../../Aspects/Aspects.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/STBlock.h b/Example/Pods/Headers/Public/Stinger/STBlock.h deleted file mode 120000 index ea12b85..0000000 --- a/Example/Pods/Headers/Public/Stinger/STBlock.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STBlock.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/STDefines.h b/Example/Pods/Headers/Public/Stinger/STDefines.h deleted file mode 120000 index bb6690a..0000000 --- a/Example/Pods/Headers/Public/Stinger/STDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STDefines.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/STHookInfo.h b/Example/Pods/Headers/Public/Stinger/STHookInfo.h deleted file mode 120000 index 7d29867..0000000 --- a/Example/Pods/Headers/Public/Stinger/STHookInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STHookInfo.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/STHookInfoPool.h b/Example/Pods/Headers/Public/Stinger/STHookInfoPool.h deleted file mode 120000 index 5f61c13..0000000 --- a/Example/Pods/Headers/Public/Stinger/STHookInfoPool.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STHookInfoPool.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/STMethodSignature.h b/Example/Pods/Headers/Public/Stinger/STMethodSignature.h deleted file mode 120000 index b4c7497..0000000 --- a/Example/Pods/Headers/Public/Stinger/STMethodSignature.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/STMethodSignature.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/Stinger.h b/Example/Pods/Headers/Public/Stinger/Stinger.h deleted file mode 120000 index 91491d8..0000000 --- a/Example/Pods/Headers/Public/Stinger/Stinger.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/Stinger.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/StingerParams.h b/Example/Pods/Headers/Public/Stinger/StingerParams.h deleted file mode 120000 index d45fba8..0000000 --- a/Example/Pods/Headers/Public/Stinger/StingerParams.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/StingerParams.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffi.h b/Example/Pods/Headers/Public/Stinger/ffi.h deleted file mode 120000 index adb03f2..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffi.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffi_arm.h b/Example/Pods/Headers/Public/Stinger/ffi_arm.h deleted file mode 120000 index 9928d60..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffi_arm.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_arm.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffi_arm64.h b/Example/Pods/Headers/Public/Stinger/ffi_arm64.h deleted file mode 120000 index e2cd46f..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffi_arm64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_arm64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffi_i386.h b/Example/Pods/Headers/Public/Stinger/ffi_i386.h deleted file mode 120000 index a360ab9..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffi_i386.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_i386.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffi_x86_64.h b/Example/Pods/Headers/Public/Stinger/ffi_x86_64.h deleted file mode 120000 index 36bbef8..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffi_x86_64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffi_x86_64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffitarget.h b/Example/Pods/Headers/Public/Stinger/ffitarget.h deleted file mode 120000 index 3aa110e..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffitarget.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffitarget_arm.h b/Example/Pods/Headers/Public/Stinger/ffitarget_arm.h deleted file mode 120000 index f82effb..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffitarget_arm.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_arm.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffitarget_arm64.h b/Example/Pods/Headers/Public/Stinger/ffitarget_arm64.h deleted file mode 120000 index 6d5bf37..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffitarget_arm64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_arm64.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffitarget_i386.h b/Example/Pods/Headers/Public/Stinger/ffitarget_i386.h deleted file mode 120000 index 1eb737a..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffitarget_i386.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_i386.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/Stinger/ffitarget_x86_64.h b/Example/Pods/Headers/Public/Stinger/ffitarget_x86_64.h deleted file mode 120000 index 2298550..0000000 --- a/Example/Pods/Headers/Public/Stinger/ffitarget_x86_64.h +++ /dev/null @@ -1 +0,0 @@ -../../../../../Stinger/Classes/libffi/ffitarget_x86_64.h \ No newline at end of file diff --git a/Example/Pods/Local Podspecs/Stinger.podspec.json b/Example/Pods/Local Podspecs/Stinger.podspec.json deleted file mode 100644 index 33984f6..0000000 --- a/Example/Pods/Local Podspecs/Stinger.podspec.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "Stinger", - "version": "0.2.6", - "summary": "Implementing HOOK & AOP using libffi for Objective-C.", - "description": "TODO: Add long description of the pod here.", - "homepage": "https://github.com/eleme/Stinger", - "license": { - "type": "MIT", - "file": "LICENSE" - }, - "authors": { - "Assuner-Lee": "yongguang.li@ele.me" - }, - "source": { - "git": "https://github.com/eleme/Stinger.git", - "tag": "0.2.6" - }, - "platforms": { - "ios": "8.0" - }, - "source_files": "Stinger/Classes/**/*", - "vendored_libraries": "Stinger/Classes/libffi/libffi.a" -} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock deleted file mode 100644 index b6c5c4c..0000000 --- a/Example/Pods/Manifest.lock +++ /dev/null @@ -1,23 +0,0 @@ -PODS: - - Aspects (1.4.1) - - Stinger (0.2.6) - -DEPENDENCIES: - - Aspects - - Stinger (from `../`) - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - Aspects - -EXTERNAL SOURCES: - Stinger: - :path: "../" - -SPEC CHECKSUMS: - Aspects: 7595ba96a6727a58ebcbfc954497fc5d2fdde546 - Stinger: 62ce4cd94935217a13a8db639b6f87364bba45e3 - -PODFILE CHECKSUM: 6df52b616ee208569510c4defb2313f601db9f5e - -COCOAPODS: 1.5.3 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 6d5fde2..0000000 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,901 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 04D1945AB27402507FFCF59AA5403B83 /* Pods-Stinger_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A411BDEEDCAEF81AF43CFEA51C47B0E /* Pods-Stinger_Tests-dummy.m */; }; - 070F6EC1A65BBFDF0CE404059306DF82 /* STMethodSignature.m in Sources */ = {isa = PBXBuildFile; fileRef = B801D44AE7FBB292E0DE909B8312864D /* STMethodSignature.m */; }; - 10360D56B114A919246526C774B4125D /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = 67B15C5863A18D65A7604EEA1506E4E8 /* ffi_i386.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 1767038EC0FAE632A8C14E1EA5ABE78F /* libffi.a in Sources */ = {isa = PBXBuildFile; fileRef = 12F794ECB8E5CBF013B58B8E5D77E070 /* libffi.a */; }; - 19D9061F99D71554210DD5E2BAFE3B5B /* Aspects.h in Headers */ = {isa = PBXBuildFile; fileRef = 97D3777235F03FBDA4AA977C6831DA8F /* Aspects.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 30FEB424C3003BB47785750FFC58E949 /* Aspects-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A34252A47FBE0C2028C16CECE4F8D54 /* Aspects-dummy.m */; }; - 3B03B7D3969F28C400D9F1ACC79F3D3E /* STHookInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 7998DF3D4D5A6CD33D281058ADFEEE92 /* STHookInfo.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 40F449979A50B5AE3BCC718B9700D4A2 /* StingerParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 89C424EC716C5DB8B45453B4DC75FC82 /* StingerParams.m */; }; - 59B4C881D9B1EE5C45E40E298F66DA31 /* ffitarget_arm.h in Headers */ = {isa = PBXBuildFile; fileRef = B41F78C09EBB9BB3315FF1EBE4FB7B88 /* ffitarget_arm.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 610217EE26E0956A7190C1AF1D037E7F /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = 94D4DFE68AE2DD3E984E8ECA060519F7 /* ffitarget.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 732DBA4E450E0581760251D18E0BC614 /* STMethodSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = 245DC9F7CC20817E5A0D35495FF3164C /* STMethodSignature.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 89C5890D4E037BC74FE70FB568E13B5C /* STHookInfoPool.h in Headers */ = {isa = PBXBuildFile; fileRef = 90C7FD499EE0F0FB0EB85E78CE72D577 /* STHookInfoPool.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8B23EB67E33BF242EA8E2330C967857D /* StingerParams.h in Headers */ = {isa = PBXBuildFile; fileRef = 752D7385DF106A7E5BBE1246EC3DCA59 /* StingerParams.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 980873DCC17B646A6F7045F7D0616480 /* STHookInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = A4BB7E45BD89BD2BF250B2A2EEDC8D95 /* STHookInfo.m */; }; - 99C8C877EB7DF473A3A6C55A2F5BD7A2 /* Stinger.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBCF45E7E05352B6FB7AEE43D09C1D9 /* Stinger.m */; }; - 9A4F27EACE4034F52A208662E5685510 /* ffi_arm.h in Headers */ = {isa = PBXBuildFile; fileRef = B4BB7E6A68FF51DAB94A33FF5FEA877C /* ffi_arm.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AB8B0077FBB83610C96104E61BA08B7B /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = 339A1DC831D5B353E0D62AD377B28D02 /* ffi.h */; settings = {ATTRIBUTES = (Project, ); }; }; - ABDA83C95D0B493685130B19FDFC1381 /* Pods-Stinger_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93C66E08F1B604A83BD59D347B57D300 /* Pods-Stinger_Example-dummy.m */; }; - B54F90F7BBAC93522BB3F52F7AB7CEE3 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E8AE3ABAC1E9E27D79BD428BDC3479 /* ffi_x86_64.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B64720D437E38F3EF07B72D0A8FBA3CC /* ffi_arm64.h in Headers */ = {isa = PBXBuildFile; fileRef = 89B183362F3076C4EED653FB4EC7BA62 /* ffi_arm64.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BD50FB59BFC09C166AF943782A8196CF /* STDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = D21CFB90A875C4C62341E1289D4AB0BF /* STDefines.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BEF73979E59C8A3A5B8477895AB21BFA /* Aspects.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D2A4D67F352DB35F9635A81D2BD2897 /* Aspects.m */; }; - D356A6B8B60BB5622FF6D5F985FD0CCD /* ffitarget_arm64.h in Headers */ = {isa = PBXBuildFile; fileRef = EAE75F8E9C9FA477FF2C96774B58C5BD /* ffitarget_arm64.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E92B57869CD71931EA0D5A06E07C00C7 /* Stinger-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B5D7533A514671555098DD340C78A74F /* Stinger-dummy.m */; }; - EA13A561A6116A432FB7C8AD1480D305 /* STHookInfoPool.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F84556F1405447AA6D9DF4846FBDFE0 /* STHookInfoPool.m */; }; - F14DFDDDDF91B2DE107321634109B2CE /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FF75AB99CAFA7D6F369A5DB1F30FAC5 /* ffitarget_x86_64.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F72473388A9544BAFF5C3F307F40499F /* Stinger.h in Headers */ = {isa = PBXBuildFile; fileRef = 67C2BE2ED1CF227FF2183D3CDF22A74A /* Stinger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F77F65A32B8981D7015E1E7F56DDCABA /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = B6C21197287D3831B4ADDE0157561FA8 /* ffitarget_i386.h */; settings = {ATTRIBUTES = (Project, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 2C6C2A2DAB22DF72C1D375555F3BEE0B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5A1E40EE34940F236621D483AABFAC70; - remoteInfo = "Pods-Stinger_Example"; - }; - 5DA831D73BF724C74A41EB241B7B4E16 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = C59F61AF2E9665C1FF5FEA1BBC371369; - remoteInfo = Aspects; - }; - 8901EA5D987BB18CE9FE888CB2362063 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = FB4D4DDE7EF9B0F295BCE3AD4693A5AC; - remoteInfo = Stinger; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 01F1BA7210D9ECB06DF63CA51D409961 /* Stinger.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; path = Stinger.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 0CC4FD8676130A42855E081D1D9CC6B2 /* libPods-Stinger_Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Stinger_Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 12F794ECB8E5CBF013B58B8E5D77E070 /* libffi.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = ""; }; - 15EF62661C8F6FFAECE59DC0234759FA /* Pods-Stinger_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Stinger_Tests-acknowledgements.plist"; sourceTree = ""; }; - 164D82369A5BAAE7878CE8D28A358CEE /* Pods-Stinger_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Stinger_Tests-resources.sh"; sourceTree = ""; }; - 17AFDA5BDD3F5AD289BE78837D54C79E /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 1A82045B2A543F949A82C7E9D2707E4F /* Pods-Stinger_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Stinger_Tests.debug.xcconfig"; sourceTree = ""; }; - 1F84556F1405447AA6D9DF4846FBDFE0 /* STHookInfoPool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = STHookInfoPool.m; path = Stinger/Classes/STHookInfoPool.m; sourceTree = ""; }; - 24390EFD555DD124430DFF9724065945 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 245DC9F7CC20817E5A0D35495FF3164C /* STMethodSignature.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = STMethodSignature.h; path = Stinger/Classes/STMethodSignature.h; sourceTree = ""; }; - 318EF5271D33BDB2FC67CF23715C3611 /* libPods-Stinger_Tests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Stinger_Tests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 339A1DC831D5B353E0D62AD377B28D02 /* ffi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; - 39E89F53AD469B4C686B86D05AA0D316 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - 3EC37394409BE1ED92D10C1B6D430C72 /* Aspects-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Aspects-prefix.pch"; sourceTree = ""; }; - 414F804F6345B2BCF653286085BC3EC4 /* Pods-Stinger_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Stinger_Tests.release.xcconfig"; sourceTree = ""; }; - 4A34252A47FBE0C2028C16CECE4F8D54 /* Aspects-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Aspects-dummy.m"; sourceTree = ""; }; - 560082A7F00BF797939EA4ECE33A63A7 /* libAspects.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAspects.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 5D2A4D67F352DB35F9635A81D2BD2897 /* Aspects.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Aspects.m; sourceTree = ""; }; - 5FF75AB99CAFA7D6F369A5DB1F30FAC5 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - 6517CC03DFBB00A4B1CC09FA47FDBC81 /* Pods-Stinger_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Stinger_Tests-frameworks.sh"; sourceTree = ""; }; - 67B15C5863A18D65A7604EEA1506E4E8 /* ffi_i386.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; - 67C2BE2ED1CF227FF2183D3CDF22A74A /* Stinger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Stinger.h; path = Stinger/Classes/Stinger.h; sourceTree = ""; }; - 6F61C6262DA90E8B9E1C4033EC39488A /* Stinger.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Stinger.xcconfig; sourceTree = ""; }; - 752D7385DF106A7E5BBE1246EC3DCA59 /* StingerParams.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = StingerParams.h; path = Stinger/Classes/StingerParams.h; sourceTree = ""; }; - 7998DF3D4D5A6CD33D281058ADFEEE92 /* STHookInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = STHookInfo.h; path = Stinger/Classes/STHookInfo.h; sourceTree = ""; }; - 7A411BDEEDCAEF81AF43CFEA51C47B0E /* Pods-Stinger_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Stinger_Tests-dummy.m"; sourceTree = ""; }; - 7DD8C2D7442C13ABAE7458B7D8029FA9 /* Pods-Stinger_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Stinger_Example-acknowledgements.plist"; sourceTree = ""; }; - 89B183362F3076C4EED653FB4EC7BA62 /* ffi_arm64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = ""; }; - 89C424EC716C5DB8B45453B4DC75FC82 /* StingerParams.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = StingerParams.m; path = Stinger/Classes/StingerParams.m; sourceTree = ""; }; - 8EA94A02CAEE8329A14A9FFD66324148 /* Pods-Stinger_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Stinger_Tests-acknowledgements.markdown"; sourceTree = ""; }; - 90C7FD499EE0F0FB0EB85E78CE72D577 /* STHookInfoPool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = STHookInfoPool.h; path = Stinger/Classes/STHookInfoPool.h; sourceTree = ""; }; - 93C66E08F1B604A83BD59D347B57D300 /* Pods-Stinger_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Stinger_Example-dummy.m"; sourceTree = ""; }; - 93E8AE3ABAC1E9E27D79BD428BDC3479 /* ffi_x86_64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - 94D4DFE68AE2DD3E984E8ECA060519F7 /* ffitarget.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; - 97D3777235F03FBDA4AA977C6831DA8F /* Aspects.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Aspects.h; sourceTree = ""; }; - A44CB32F05C4567ABC089EE32440650C /* Pods-Stinger_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Stinger_Example-resources.sh"; sourceTree = ""; }; - A4BB7E45BD89BD2BF250B2A2EEDC8D95 /* STHookInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = STHookInfo.m; path = Stinger/Classes/STHookInfo.m; sourceTree = ""; }; - AC0FE6891D861C07E0537F874DB7E4A5 /* libStinger.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libStinger.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B41F78C09EBB9BB3315FF1EBE4FB7B88 /* ffitarget_arm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm.h; sourceTree = ""; }; - B4BB7E6A68FF51DAB94A33FF5FEA877C /* ffi_arm.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffi_arm.h; sourceTree = ""; }; - B5D7533A514671555098DD340C78A74F /* Stinger-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Stinger-dummy.m"; sourceTree = ""; }; - B6C21197287D3831B4ADDE0157561FA8 /* ffitarget_i386.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; - B801D44AE7FBB292E0DE909B8312864D /* STMethodSignature.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = STMethodSignature.m; path = Stinger/Classes/STMethodSignature.m; sourceTree = ""; }; - BEBCF45E7E05352B6FB7AEE43D09C1D9 /* Stinger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Stinger.m; path = Stinger/Classes/Stinger.m; sourceTree = ""; }; - D1BA2BF4C84B7FEF4CB40400F0E18CDE /* Pods-Stinger_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Stinger_Example-frameworks.sh"; sourceTree = ""; }; - D21CFB90A875C4C62341E1289D4AB0BF /* STDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = STDefines.h; path = Stinger/Classes/STDefines.h; sourceTree = ""; }; - D59D2A4E98E700FA12C7C9F051E634F7 /* Pods-Stinger_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Stinger_Example.debug.xcconfig"; sourceTree = ""; }; - DED52D74688B94E0545D258F1C1FDA1F /* Aspects.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Aspects.xcconfig; sourceTree = ""; }; - E15096DF921CBD2096FCBBA83732AF06 /* Pods-Stinger_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Stinger_Example-acknowledgements.markdown"; sourceTree = ""; }; - EAE75F8E9C9FA477FF2C96774B58C5BD /* ffitarget_arm64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = ""; }; - EBEE12C93F62C500D9EADCEA0D0EC038 /* Stinger-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Stinger-prefix.pch"; sourceTree = ""; }; - FC77216670E284FB7A82F55FA2DF6A12 /* Pods-Stinger_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Stinger_Example.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 592868212BE55C23E20B691D1337F9A0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A0215109DE12128CD9C48682A9406221 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D45922622142C50571DC23115D852394 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EB7822887905BC0B32D6801B6DDBE112 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0EF58B3595C39356E0654BD5C01A99DF /* Aspects */ = { - isa = PBXGroup; - children = ( - 97D3777235F03FBDA4AA977C6831DA8F /* Aspects.h */, - 5D2A4D67F352DB35F9635A81D2BD2897 /* Aspects.m */, - 4CF9A385E1DCB3D6BCB15F0FCA06837F /* Support Files */, - ); - path = Aspects; - sourceTree = ""; - }; - 0FB5841AF128AE7D4DA6A606201A6AD9 /* Pods-Stinger_Example */ = { - isa = PBXGroup; - children = ( - E15096DF921CBD2096FCBBA83732AF06 /* Pods-Stinger_Example-acknowledgements.markdown */, - 7DD8C2D7442C13ABAE7458B7D8029FA9 /* Pods-Stinger_Example-acknowledgements.plist */, - 93C66E08F1B604A83BD59D347B57D300 /* Pods-Stinger_Example-dummy.m */, - D1BA2BF4C84B7FEF4CB40400F0E18CDE /* Pods-Stinger_Example-frameworks.sh */, - A44CB32F05C4567ABC089EE32440650C /* Pods-Stinger_Example-resources.sh */, - D59D2A4E98E700FA12C7C9F051E634F7 /* Pods-Stinger_Example.debug.xcconfig */, - FC77216670E284FB7A82F55FA2DF6A12 /* Pods-Stinger_Example.release.xcconfig */, - ); - name = "Pods-Stinger_Example"; - path = "Target Support Files/Pods-Stinger_Example"; - sourceTree = ""; - }; - 3B5CDFB7E4F04A5BEA2C3D7B734E1FF8 /* Development Pods */ = { - isa = PBXGroup; - children = ( - 46AD34A25172E4B0921AC524B0F58F80 /* Stinger */, - ); - name = "Development Pods"; - sourceTree = ""; - }; - 46AD34A25172E4B0921AC524B0F58F80 /* Stinger */ = { - isa = PBXGroup; - children = ( - D21CFB90A875C4C62341E1289D4AB0BF /* STDefines.h */, - 7998DF3D4D5A6CD33D281058ADFEEE92 /* STHookInfo.h */, - A4BB7E45BD89BD2BF250B2A2EEDC8D95 /* STHookInfo.m */, - 90C7FD499EE0F0FB0EB85E78CE72D577 /* STHookInfoPool.h */, - 1F84556F1405447AA6D9DF4846FBDFE0 /* STHookInfoPool.m */, - 67C2BE2ED1CF227FF2183D3CDF22A74A /* Stinger.h */, - BEBCF45E7E05352B6FB7AEE43D09C1D9 /* Stinger.m */, - 752D7385DF106A7E5BBE1246EC3DCA59 /* StingerParams.h */, - 89C424EC716C5DB8B45453B4DC75FC82 /* StingerParams.m */, - 245DC9F7CC20817E5A0D35495FF3164C /* STMethodSignature.h */, - B801D44AE7FBB292E0DE909B8312864D /* STMethodSignature.m */, - E5C1178CEE96BA35D3C69E130B647CD9 /* Frameworks */, - DAD9CBED2CAC6B62288A8FA5C37297AA /* libffi */, - 87487C5E5C1BD13E5B71F0DF1616A4B8 /* Pod */, - 7197790FC79E2C7A4AC72AE1B2909810 /* Support Files */, - ); - name = Stinger; - path = ../..; - sourceTree = ""; - }; - 4CF9A385E1DCB3D6BCB15F0FCA06837F /* Support Files */ = { - isa = PBXGroup; - children = ( - DED52D74688B94E0545D258F1C1FDA1F /* Aspects.xcconfig */, - 4A34252A47FBE0C2028C16CECE4F8D54 /* Aspects-dummy.m */, - 3EC37394409BE1ED92D10C1B6D430C72 /* Aspects-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/Aspects"; - sourceTree = ""; - }; - 70AFCDF1753DFC36B0D89A300FF4FA34 /* Products */ = { - isa = PBXGroup; - children = ( - 560082A7F00BF797939EA4ECE33A63A7 /* libAspects.a */, - 0CC4FD8676130A42855E081D1D9CC6B2 /* libPods-Stinger_Example.a */, - 318EF5271D33BDB2FC67CF23715C3611 /* libPods-Stinger_Tests.a */, - AC0FE6891D861C07E0537F874DB7E4A5 /* libStinger.a */, - ); - name = Products; - sourceTree = ""; - }; - 7197790FC79E2C7A4AC72AE1B2909810 /* Support Files */ = { - isa = PBXGroup; - children = ( - 6F61C6262DA90E8B9E1C4033EC39488A /* Stinger.xcconfig */, - B5D7533A514671555098DD340C78A74F /* Stinger-dummy.m */, - EBEE12C93F62C500D9EADCEA0D0EC038 /* Stinger-prefix.pch */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Stinger"; - sourceTree = ""; - }; - 7E00CBD253A9071438E499A157578591 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 0FB5841AF128AE7D4DA6A606201A6AD9 /* Pods-Stinger_Example */, - DDA9824C985D37716E60CE77D1E4F5DA /* Pods-Stinger_Tests */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 87487C5E5C1BD13E5B71F0DF1616A4B8 /* Pod */ = { - isa = PBXGroup; - children = ( - 39E89F53AD469B4C686B86D05AA0D316 /* LICENSE */, - 17AFDA5BDD3F5AD289BE78837D54C79E /* README.md */, - 01F1BA7210D9ECB06DF63CA51D409961 /* Stinger.podspec */, - ); - name = Pod; - sourceTree = ""; - }; - CF1408CF629C7361332E53B88F7BD30C = { - isa = PBXGroup; - children = ( - 24390EFD555DD124430DFF9724065945 /* Podfile */, - 3B5CDFB7E4F04A5BEA2C3D7B734E1FF8 /* Development Pods */, - D89477F20FB1DE18A04690586D7808C4 /* Frameworks */, - D4235D072F0DC7818942872CBFF5FCF4 /* Pods */, - 70AFCDF1753DFC36B0D89A300FF4FA34 /* Products */, - 7E00CBD253A9071438E499A157578591 /* Targets Support Files */, - ); - sourceTree = ""; - }; - D4235D072F0DC7818942872CBFF5FCF4 /* Pods */ = { - isa = PBXGroup; - children = ( - 0EF58B3595C39356E0654BD5C01A99DF /* Aspects */, - ); - name = Pods; - sourceTree = ""; - }; - D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; - DAD9CBED2CAC6B62288A8FA5C37297AA /* libffi */ = { - isa = PBXGroup; - children = ( - 339A1DC831D5B353E0D62AD377B28D02 /* ffi.h */, - B4BB7E6A68FF51DAB94A33FF5FEA877C /* ffi_arm.h */, - 89B183362F3076C4EED653FB4EC7BA62 /* ffi_arm64.h */, - 67B15C5863A18D65A7604EEA1506E4E8 /* ffi_i386.h */, - 93E8AE3ABAC1E9E27D79BD428BDC3479 /* ffi_x86_64.h */, - 94D4DFE68AE2DD3E984E8ECA060519F7 /* ffitarget.h */, - B41F78C09EBB9BB3315FF1EBE4FB7B88 /* ffitarget_arm.h */, - EAE75F8E9C9FA477FF2C96774B58C5BD /* ffitarget_arm64.h */, - B6C21197287D3831B4ADDE0157561FA8 /* ffitarget_i386.h */, - 5FF75AB99CAFA7D6F369A5DB1F30FAC5 /* ffitarget_x86_64.h */, - 12F794ECB8E5CBF013B58B8E5D77E070 /* libffi.a */, - ); - name = libffi; - path = Stinger/Classes/libffi; - sourceTree = ""; - }; - DDA9824C985D37716E60CE77D1E4F5DA /* Pods-Stinger_Tests */ = { - isa = PBXGroup; - children = ( - 8EA94A02CAEE8329A14A9FFD66324148 /* Pods-Stinger_Tests-acknowledgements.markdown */, - 15EF62661C8F6FFAECE59DC0234759FA /* Pods-Stinger_Tests-acknowledgements.plist */, - 7A411BDEEDCAEF81AF43CFEA51C47B0E /* Pods-Stinger_Tests-dummy.m */, - 6517CC03DFBB00A4B1CC09FA47FDBC81 /* Pods-Stinger_Tests-frameworks.sh */, - 164D82369A5BAAE7878CE8D28A358CEE /* Pods-Stinger_Tests-resources.sh */, - 1A82045B2A543F949A82C7E9D2707E4F /* Pods-Stinger_Tests.debug.xcconfig */, - 414F804F6345B2BCF653286085BC3EC4 /* Pods-Stinger_Tests.release.xcconfig */, - ); - name = "Pods-Stinger_Tests"; - path = "Target Support Files/Pods-Stinger_Tests"; - sourceTree = ""; - }; - E5C1178CEE96BA35D3C69E130B647CD9 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 61A78E845D88CA8DC3C5F3326FF8B140 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 19D9061F99D71554210DD5E2BAFE3B5B /* Aspects.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6224F53A9019A8037A1B8BDC7EC491B4 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - C431D7FA501BCE3C15249ECDD1DC6BAC /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - AB8B0077FBB83610C96104E61BA08B7B /* ffi.h in Headers */, - 9A4F27EACE4034F52A208662E5685510 /* ffi_arm.h in Headers */, - B64720D437E38F3EF07B72D0A8FBA3CC /* ffi_arm64.h in Headers */, - 10360D56B114A919246526C774B4125D /* ffi_i386.h in Headers */, - B54F90F7BBAC93522BB3F52F7AB7CEE3 /* ffi_x86_64.h in Headers */, - 610217EE26E0956A7190C1AF1D037E7F /* ffitarget.h in Headers */, - 59B4C881D9B1EE5C45E40E298F66DA31 /* ffitarget_arm.h in Headers */, - D356A6B8B60BB5622FF6D5F985FD0CCD /* ffitarget_arm64.h in Headers */, - F77F65A32B8981D7015E1E7F56DDCABA /* ffitarget_i386.h in Headers */, - F14DFDDDDF91B2DE107321634109B2CE /* ffitarget_x86_64.h in Headers */, - BD50FB59BFC09C166AF943782A8196CF /* STDefines.h in Headers */, - 3B03B7D3969F28C400D9F1ACC79F3D3E /* STHookInfo.h in Headers */, - 89C5890D4E037BC74FE70FB568E13B5C /* STHookInfoPool.h in Headers */, - F72473388A9544BAFF5C3F307F40499F /* Stinger.h in Headers */, - 8B23EB67E33BF242EA8E2330C967857D /* StingerParams.h in Headers */, - 732DBA4E450E0581760251D18E0BC614 /* STMethodSignature.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FB78D77D3CAA08AFBB802EF3E8165411 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 1AC18FC38AE8C9C2CD60124A87E23C8D /* Pods-Stinger_Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = D9FEFFB08983E3761BA53748CB0806B4 /* Build configuration list for PBXNativeTarget "Pods-Stinger_Tests" */; - buildPhases = ( - 6224F53A9019A8037A1B8BDC7EC491B4 /* Headers */, - D8A95D99D71BECEAED64D1E3E8C1E0EF /* Sources */, - EB7822887905BC0B32D6801B6DDBE112 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - FECBA06278C17ECC09DC652631BFECA7 /* PBXTargetDependency */, - ); - name = "Pods-Stinger_Tests"; - productName = "Pods-Stinger_Tests"; - productReference = 318EF5271D33BDB2FC67CF23715C3611 /* libPods-Stinger_Tests.a */; - productType = "com.apple.product-type.library.static"; - }; - 5A1E40EE34940F236621D483AABFAC70 /* Pods-Stinger_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 128C3B2C383C8D839E558D6C3D0D4662 /* Build configuration list for PBXNativeTarget "Pods-Stinger_Example" */; - buildPhases = ( - FB78D77D3CAA08AFBB802EF3E8165411 /* Headers */, - 2FA27BE181DE1420F1D2FB14FF6811AB /* Sources */, - A0215109DE12128CD9C48682A9406221 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 002A40200154E8CDBD0C446C2506366C /* PBXTargetDependency */, - C3D04DADEF57F0712AC807CF2A9C5F25 /* PBXTargetDependency */, - ); - name = "Pods-Stinger_Example"; - productName = "Pods-Stinger_Example"; - productReference = 0CC4FD8676130A42855E081D1D9CC6B2 /* libPods-Stinger_Example.a */; - productType = "com.apple.product-type.library.static"; - }; - C59F61AF2E9665C1FF5FEA1BBC371369 /* Aspects */ = { - isa = PBXNativeTarget; - buildConfigurationList = 926BB87AF71503C64757F8405AFA5445 /* Build configuration list for PBXNativeTarget "Aspects" */; - buildPhases = ( - 61A78E845D88CA8DC3C5F3326FF8B140 /* Headers */, - 2C631B223B303E44B158E26EE4E10901 /* Sources */, - D45922622142C50571DC23115D852394 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Aspects; - productName = Aspects; - productReference = 560082A7F00BF797939EA4ECE33A63A7 /* libAspects.a */; - productType = "com.apple.product-type.library.static"; - }; - FB4D4DDE7EF9B0F295BCE3AD4693A5AC /* Stinger */ = { - isa = PBXNativeTarget; - buildConfigurationList = BEAF2F6C40D3B275168ADE26BC16D736 /* Build configuration list for PBXNativeTarget "Stinger" */; - buildPhases = ( - C431D7FA501BCE3C15249ECDD1DC6BAC /* Headers */, - 62A55ECBB1FEEE83B42939C1D1A69FBB /* Sources */, - 592868212BE55C23E20B691D1337F9A0 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Stinger; - productName = Stinger; - productReference = AC0FE6891D861C07E0537F874DB7E4A5 /* libStinger.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - BFDFE7DC352907FC980B868725387E98 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1100; - }; - buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 70AFCDF1753DFC36B0D89A300FF4FA34 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - C59F61AF2E9665C1FF5FEA1BBC371369 /* Aspects */, - 5A1E40EE34940F236621D483AABFAC70 /* Pods-Stinger_Example */, - 1AC18FC38AE8C9C2CD60124A87E23C8D /* Pods-Stinger_Tests */, - FB4D4DDE7EF9B0F295BCE3AD4693A5AC /* Stinger */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 2C631B223B303E44B158E26EE4E10901 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 30FEB424C3003BB47785750FFC58E949 /* Aspects-dummy.m in Sources */, - BEF73979E59C8A3A5B8477895AB21BFA /* Aspects.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2FA27BE181DE1420F1D2FB14FF6811AB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ABDA83C95D0B493685130B19FDFC1381 /* Pods-Stinger_Example-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 62A55ECBB1FEEE83B42939C1D1A69FBB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1767038EC0FAE632A8C14E1EA5ABE78F /* libffi.a in Sources */, - 980873DCC17B646A6F7045F7D0616480 /* STHookInfo.m in Sources */, - EA13A561A6116A432FB7C8AD1480D305 /* STHookInfoPool.m in Sources */, - E92B57869CD71931EA0D5A06E07C00C7 /* Stinger-dummy.m in Sources */, - 99C8C877EB7DF473A3A6C55A2F5BD7A2 /* Stinger.m in Sources */, - 40F449979A50B5AE3BCC718B9700D4A2 /* StingerParams.m in Sources */, - 070F6EC1A65BBFDF0CE404059306DF82 /* STMethodSignature.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D8A95D99D71BECEAED64D1E3E8C1E0EF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 04D1945AB27402507FFCF59AA5403B83 /* Pods-Stinger_Tests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 002A40200154E8CDBD0C446C2506366C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Aspects; - target = C59F61AF2E9665C1FF5FEA1BBC371369 /* Aspects */; - targetProxy = 5DA831D73BF724C74A41EB241B7B4E16 /* PBXContainerItemProxy */; - }; - C3D04DADEF57F0712AC807CF2A9C5F25 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Stinger; - target = FB4D4DDE7EF9B0F295BCE3AD4693A5AC /* Stinger */; - targetProxy = 8901EA5D987BB18CE9FE888CB2362063 /* PBXContainerItemProxy */; - }; - FECBA06278C17ECC09DC652631BFECA7 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Pods-Stinger_Example"; - target = 5A1E40EE34940F236621D483AABFAC70 /* Pods-Stinger_Example */; - targetProxy = 2C6C2A2DAB22DF72C1D375555F3BEE0B /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 0037FE14CACFFA6E97E04CBD389F902C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1A82045B2A543F949A82C7E9D2707E4F /* Pods-Stinger_Tests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 27465B813F63A58D41230096E29FC7FB /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D59D2A4E98E700FA12C7C9F051E634F7 /* Pods-Stinger_Example.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 2A506743CF140B1834F797F766E2A82E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - 76B4FD00D11FC949B9A82542079BF30E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DED52D74688B94E0545D258F1C1FDA1F /* Aspects.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Aspects/Aspects-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = Aspects; - PRODUCT_NAME = Aspects; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - A3D8F75E90F9269324EFFC4919E60B04 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DED52D74688B94E0545D258F1C1FDA1F /* Aspects.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Aspects/Aspects-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = Aspects; - PRODUCT_NAME = Aspects; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - A6A7DE9C902EFE38BE4A346301EA1DB9 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - AE15FD77E7385F4ABF15D6A9751011D5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6F61C6262DA90E8B9E1C4033EC39488A /* Stinger.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Stinger/Stinger-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = Stinger; - PRODUCT_NAME = Stinger; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - BE077B7E5AF4CF6C97B9899899B95002 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FC77216670E284FB7A82F55FA2DF6A12 /* Pods-Stinger_Example.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - D4A6347022F4E9AD6613ECDBEC5F2774 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 414F804F6345B2BCF653286085BC3EC4 /* Pods-Stinger_Tests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - F1BCEEF8ABA03A34C716E2654F2516C8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6F61C6262DA90E8B9E1C4033EC39488A /* Stinger.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/Stinger/Stinger-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = Stinger; - PRODUCT_NAME = Stinger; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 128C3B2C383C8D839E558D6C3D0D4662 /* Build configuration list for PBXNativeTarget "Pods-Stinger_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 27465B813F63A58D41230096E29FC7FB /* Debug */, - BE077B7E5AF4CF6C97B9899899B95002 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A6A7DE9C902EFE38BE4A346301EA1DB9 /* Debug */, - 2A506743CF140B1834F797F766E2A82E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 926BB87AF71503C64757F8405AFA5445 /* Build configuration list for PBXNativeTarget "Aspects" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 76B4FD00D11FC949B9A82542079BF30E /* Debug */, - A3D8F75E90F9269324EFFC4919E60B04 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BEAF2F6C40D3B275168ADE26BC16D736 /* Build configuration list for PBXNativeTarget "Stinger" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AE15FD77E7385F4ABF15D6A9751011D5 /* Debug */, - F1BCEEF8ABA03A34C716E2654F2516C8 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - D9FEFFB08983E3761BA53748CB0806B4 /* Build configuration list for PBXNativeTarget "Pods-Stinger_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0037FE14CACFFA6E97E04CBD389F902C /* Debug */, - D4A6347022F4E9AD6613ECDBEC5F2774 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; -} diff --git a/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a..0000000 --- a/Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Example/Pods/Target Support Files/Aspects/Aspects-dummy.m b/Example/Pods/Target Support Files/Aspects/Aspects-dummy.m deleted file mode 100644 index d07e3af..0000000 --- a/Example/Pods/Target Support Files/Aspects/Aspects-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Aspects : NSObject -@end -@implementation PodsDummy_Aspects -@end diff --git a/Example/Pods/Target Support Files/Aspects/Aspects-prefix.pch b/Example/Pods/Target Support Files/Aspects/Aspects-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/Example/Pods/Target Support Files/Aspects/Aspects-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/Aspects/Aspects.xcconfig b/Example/Pods/Target Support Files/Aspects/Aspects.xcconfig deleted file mode 100644 index 11977fa..0000000 --- a/Example/Pods/Target Support Files/Aspects/Aspects.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Aspects -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Aspects" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Aspects" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/Aspects -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Info.plist b/Example/Pods/Target Support Files/Pods-Stinger_Example/Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.markdown deleted file mode 100644 index 5364357..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.markdown +++ /dev/null @@ -1,50 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Aspects - -The MIT License (MIT) - -Copyright (c) 2014 Peter Steinberger, steipete@gmail.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -## Stinger - -Copyright (c) 2017 Assuner-Lee - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.plist deleted file mode 100644 index 780e2c3..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-acknowledgements.plist +++ /dev/null @@ -1,88 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2014 Peter Steinberger, steipete@gmail.com - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - License - MIT - Title - Aspects - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2017 Assuner-Lee <yongguang.li@ele.me> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - Stinger - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-dummy.m b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-dummy.m deleted file mode 100644 index 5718680..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_Stinger_Example : NSObject -@end -@implementation PodsDummy_Pods_Stinger_Example -@end diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-frameworks.sh deleted file mode 100755 index 08e3eaa..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-frameworks.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then - # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy - # frameworks to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -# Copies and strips a vendored framework -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Copies and strips a vendored dSYM -install_dsym() { - local source="$1" - if [ -r "$source" ]; then - # Copy the dSYM into a the targets temp dir. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" - - local basename - basename="$(basename -s .framework.dSYM "$source")" - binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then - strip_invalid_archs "$binary" - fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then - # Move the stripped file into its final destination. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" - else - # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. - touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" - fi - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current target binary - binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" - # Intersect them with the architectures we are building for - intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" - # If there are no archs supported by this binary then warn the user - if [[ -z "$intersected_archs" ]]; then - echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." - STRIP_BINARY_RETVAL=0 - return - fi - stripped="" - for arch in $binary_archs; do - if ! [[ "${ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi - STRIP_BINARY_RETVAL=1 -} - -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-resources.sh b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-resources.sh deleted file mode 100755 index 345301f..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-resources.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-umbrella.h deleted file mode 100644 index f81eb39..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_Stinger_ExampleVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_Stinger_ExampleVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.debug.xcconfig deleted file mode 100644 index 44d5cb2..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.debug.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Aspects" "${PODS_ROOT}/Headers/Public/Stinger" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Aspects" "${PODS_CONFIGURATION_BUILD_DIR}/Stinger" "${PODS_ROOT}/../../Stinger/Classes/libffi" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Aspects" -isystem "${PODS_ROOT}/Headers/Public/Stinger" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Aspects" -l"Stinger" -l"ffi" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.modulemap b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.modulemap deleted file mode 100644 index ab75cf1..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_Stinger_Example { - umbrella header "Pods-Stinger_Example-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.release.xcconfig deleted file mode 100644 index 44d5cb2..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Example/Pods-Stinger_Example.release.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Aspects" "${PODS_ROOT}/Headers/Public/Stinger" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Aspects" "${PODS_CONFIGURATION_BUILD_DIR}/Stinger" "${PODS_ROOT}/../../Stinger/Classes/libffi" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Aspects" -isystem "${PODS_ROOT}/Headers/Public/Stinger" -OTHER_LDFLAGS = $(inherited) -ObjC -l"Aspects" -l"Stinger" -l"ffi" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.markdown deleted file mode 100644 index 102af75..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.markdown +++ /dev/null @@ -1,3 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.plist deleted file mode 100644 index 7acbad1..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-acknowledgements.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-dummy.m deleted file mode 100644 index dbb619a..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_Stinger_Tests : NSObject -@end -@implementation PodsDummy_Pods_Stinger_Tests -@end diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-frameworks.sh deleted file mode 100755 index 08e3eaa..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-frameworks.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then - # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy - # frameworks to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -# Copies and strips a vendored framework -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Copies and strips a vendored dSYM -install_dsym() { - local source="$1" - if [ -r "$source" ]; then - # Copy the dSYM into a the targets temp dir. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" - - local basename - basename="$(basename -s .framework.dSYM "$source")" - binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then - strip_invalid_archs "$binary" - fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then - # Move the stripped file into its final destination. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" - else - # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. - touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" - fi - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current target binary - binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" - # Intersect them with the architectures we are building for - intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" - # If there are no archs supported by this binary then warn the user - if [[ -z "$intersected_archs" ]]; then - echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." - STRIP_BINARY_RETVAL=0 - return - fi - stripped="" - for arch in $binary_archs; do - if ! [[ "${ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi - STRIP_BINARY_RETVAL=1 -} - -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-resources.sh deleted file mode 100755 index 345301f..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-resources.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-umbrella.h deleted file mode 100644 index a9ad607..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_Stinger_TestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_Stinger_TestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.debug.xcconfig deleted file mode 100644 index 061f1e6..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.debug.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Aspects" "${PODS_ROOT}/Headers/Public/Stinger" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Aspects" "${PODS_CONFIGURATION_BUILD_DIR}/Stinger" "${PODS_ROOT}/../../Stinger/Classes/libffi" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Aspects" -isystem "${PODS_ROOT}/Headers/Public/Stinger" -OTHER_LDFLAGS = $(inherited) -ObjC -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.modulemap b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.modulemap deleted file mode 100644 index 3356b5a..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_Stinger_Tests { - umbrella header "Pods-Stinger_Tests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.release.xcconfig deleted file mode 100644 index 061f1e6..0000000 --- a/Example/Pods/Target Support Files/Pods-Stinger_Tests/Pods-Stinger_Tests.release.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Aspects" "${PODS_ROOT}/Headers/Public/Stinger" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Aspects" "${PODS_CONFIGURATION_BUILD_DIR}/Stinger" "${PODS_ROOT}/../../Stinger/Classes/libffi" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Aspects" -isystem "${PODS_ROOT}/Headers/Public/Stinger" -OTHER_LDFLAGS = $(inherited) -ObjC -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Stinger/Info.plist b/Example/Pods/Target Support Files/Stinger/Info.plist deleted file mode 100644 index 161a9d3..0000000 --- a/Example/Pods/Target Support Files/Stinger/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.1.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Stinger/Stinger-dummy.m b/Example/Pods/Target Support Files/Stinger/Stinger-dummy.m deleted file mode 100644 index b98961e..0000000 --- a/Example/Pods/Target Support Files/Stinger/Stinger-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Stinger : NSObject -@end -@implementation PodsDummy_Stinger -@end diff --git a/Example/Pods/Target Support Files/Stinger/Stinger-prefix.pch b/Example/Pods/Target Support Files/Stinger/Stinger-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/Example/Pods/Target Support Files/Stinger/Stinger-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/Stinger/Stinger-umbrella.h b/Example/Pods/Target Support Files/Stinger/Stinger-umbrella.h deleted file mode 100644 index 301b8df..0000000 --- a/Example/Pods/Target Support Files/Stinger/Stinger-umbrella.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - -#import "ffi.h" -#import "ffitarget.h" -#import "ffitarget_arm.h" -#import "ffitarget_arm64.h" -#import "ffitarget_i386.h" -#import "ffitarget_x86_64.h" -#import "ffi_arm.h" -#import "ffi_arm64.h" -#import "ffi_i386.h" -#import "ffi_x86_64.h" -#import "MABlockClosure.h" -#import "NSObject+Stinger.h" -#import "Stinger.h" - -FOUNDATION_EXPORT double StingerVersionNumber; -FOUNDATION_EXPORT const unsigned char StingerVersionString[]; - diff --git a/Example/Pods/Target Support Files/Stinger/Stinger.modulemap b/Example/Pods/Target Support Files/Stinger/Stinger.modulemap deleted file mode 100644 index c824a65..0000000 --- a/Example/Pods/Target Support Files/Stinger/Stinger.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Stinger { - umbrella header "Stinger-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Stinger/Stinger.xcconfig b/Example/Pods/Target Support Files/Stinger/Stinger.xcconfig deleted file mode 100644 index f5291ec..0000000 --- a/Example/Pods/Target Support Files/Stinger/Stinger.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Stinger -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Stinger" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Stinger" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../Stinger/Classes/libffi" -OTHER_LDFLAGS = -l"ffi" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Example/Stinger.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Stinger.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 73ac0ec..0000000 --- a/Example/Stinger.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Example/Stinger.xcworkspace/contents.xcworkspacedata b/Example/Stinger.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a6e3815..0000000 --- a/Example/Stinger.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj deleted file mode 120000 index 3c5a8e7..0000000 --- a/_Pods.xcodeproj +++ /dev/null @@ -1 +0,0 @@ -Example/Pods/Pods.xcodeproj \ No newline at end of file From 0e84605725589ad4191e4dccb5f8c1a7356a0f59 Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 11 Sep 2021 09:58:11 +0800 Subject: [PATCH 2/8] [ADD] add weak check signature feature --- Stinger/Classes/STDefines.h | 3 ++- Stinger/Classes/STMethodSignature.m | 2 ++ Stinger/Classes/Stinger.m | 16 ++++++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Stinger/Classes/STDefines.h b/Stinger/Classes/STDefines.h index e77102d..1cc06d2 100644 --- a/Stinger/Classes/STDefines.h +++ b/Stinger/Classes/STDefines.h @@ -18,7 +18,8 @@ typedef NS_OPTIONS(NSInteger, STOption) { STOptionAfter = 0, // Called after the original implementation (default) STOptionInstead = 1, // Will replace the original implementation. STOptionBefore = 2, // Called before the original implementation. - STOptionAutomaticRemoval = 1 << 3 // Will remove the hook after the first execution. + STOptionAutomaticRemoval = 1 << 3, // Will remove the hook after the first execution. + STOptionWeakCheckSignature = 1 << 16, // Original method's signature and the block's signature should be consistent by default. The return type only check when STOptionInstead is on. With STOptionWeakCheckSignature on, we will only check the first argument type(id) and the return type. }; diff --git a/Stinger/Classes/STMethodSignature.m b/Stinger/Classes/STMethodSignature.m index 9338ff8..63903d1 100644 --- a/Stinger/Classes/STMethodSignature.m +++ b/Stinger/Classes/STMethodSignature.m @@ -166,6 +166,8 @@ - (void)_genarateTypes { return &ffi_type_uint8; case '^': return &ffi_type_pointer; + case '*': + return &ffi_type_pointer; case '@': return &ffi_type_pointer; case '#': diff --git a/Stinger/Classes/Stinger.m b/Stinger/Classes/Stinger.m index 63b6591..19f2753 100644 --- a/Stinger/Classes/Stinger.m +++ b/Stinger/Classes/Stinger.m @@ -176,8 +176,9 @@ NS_INLINE void hookGetClassMessage(Class class, Class retClass) { NS_INLINE BOOL isMatched(STMethodSignature *methodSignature, STMethodSignature *blockSignature, STOption option, Class cls, SEL sel, NSString *identifier) { + BOOL strictCheck = ((option & STOptionWeakCheckSignature) == 0); //argument count - if (methodSignature.argumentTypes.count != blockSignature.argumentTypes.count) { + if (strictCheck && methodSignature.argumentTypes.count != blockSignature.argumentTypes.count) { NSCAssert(NO, @"count of arguments isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); return NO; }; @@ -186,11 +187,14 @@ NS_INLINE BOOL isMatched(STMethodSignature *methodSignature, STMethodSignature * NSCAssert(NO, @"argument 1 should be object type. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); return NO; } - // from loc 2. - for (NSInteger i = 2; i < methodSignature.argumentTypes.count; i++) { - if (![blockSignature.argumentTypes[i] isEqualToString:methodSignature.argumentTypes[i]]) { - NSCAssert(NO, @"argument (%zd) type isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", i, cls, NSStringFromSelector(sel), identifier); - return NO; + /// only strict check + if (strictCheck) { + // from loc 2. + for (NSInteger i = 2; i < methodSignature.argumentTypes.count; i++) { + if (![blockSignature.argumentTypes[i] isEqualToString:methodSignature.argumentTypes[i]]) { + NSCAssert(NO, @"argument (%zd) type isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", i, cls, NSStringFromSelector(sel), identifier); + return NO; + } } } // when STOptionInstead, returnType From f676749032dea11b71b280de93f96cb28c2ca440 Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 11 Sep 2021 15:16:49 +0800 Subject: [PATCH 3/8] [ADD] support get arguments --- Stinger/Classes/STDefines.h | 3 ++ Stinger/Classes/STHookInfoPool.m | 30 +++++++----- Stinger/Classes/Stinger.m | 3 +- Stinger/Classes/StingerParams.h | 2 +- Stinger/Classes/StingerParams.m | 84 +++++++++++++++++++++++++++++++- 5 files changed, 107 insertions(+), 15 deletions(-) diff --git a/Stinger/Classes/STDefines.h b/Stinger/Classes/STDefines.h index 1cc06d2..fe2cd3c 100644 --- a/Stinger/Classes/STDefines.h +++ b/Stinger/Classes/STDefines.h @@ -22,6 +22,7 @@ typedef NS_OPTIONS(NSInteger, STOption) { STOptionWeakCheckSignature = 1 << 16, // Original method's signature and the block's signature should be consistent by default. The return type only check when STOptionInstead is on. With STOptionWeakCheckSignature on, we will only check the first argument type(id) and the return type. }; +#define StingerPositionFilter 0x07 typedef NS_ENUM(NSInteger, STHookResult) { STHookResultSuccuss = 1, @@ -49,6 +50,8 @@ typedef NS_ENUM(NSInteger, STHookResult) { @required - (id)slf; - (SEL)sel; +- (NSArray *)arguments; +- (NSString *)typeEncoding; - (void)invokeAndGetOriginalRetValue:(void *)retLoc; @end diff --git a/Stinger/Classes/STHookInfoPool.m b/Stinger/Classes/STHookInfoPool.m index c8d7fdb..1815204 100644 --- a/Stinger/Classes/STHookInfoPool.m +++ b/Stinger/Classes/STHookInfoPool.m @@ -162,17 +162,23 @@ - (BOOL)addInfo:(id)info { NSParameterAssert(info); dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER); BOOL flag = NO; - if ((info.option & STOptionBefore) && ![[_beforeInfos valueForKey:@"identifier"] containsObject:info.identifier]) { - [_beforeInfos addObject:info]; - flag = YES; - } else if (info.option & STOptionInstead) { - _insteadInfo = info; - flag = YES; - } else if ((info.option == STOptionAfter || info.option == STOptionAutomaticRemoval) && ![[_afterInfos valueForKey:@"identifier"] containsObject:info.identifier]) { - [_afterInfos addObject:info]; - flag = YES; - } else { - flag = NO; + NSUInteger position = info.option & StingerPositionFilter; + switch (position) { + case STOptionBefore: + [_beforeInfos addObject:info]; + flag = YES; + break; + case STOptionInstead: + _insteadInfo = info; + flag = YES; + break; + case STOptionAfter: + [_afterInfos addObject:info]; + flag = YES; + break; + default: + flag = NO; + break; } dispatch_semaphore_signal(_semaphore); return flag; @@ -303,7 +309,7 @@ NS_INLINE void _st_ffi_function(ffi_cif *cif, void *ret, void **args, void *user instanceInfoPool = _st_fast_get_HookInfoPool((__bridge id)(*slf), hookedClassInfoPool->_uniqueKey); } - StingerParams *params = [[StingerParams alloc] initWithType:hookedClassInfoPool->_typeEncoding originalIMP:hookedClassInfoPool->_originalIMP sel:hookedClassInfoPool->_sel args:args]; + StingerParams *params = [[StingerParams alloc] initWithType:hookedClassInfoPool->_typeEncoding originalIMP:hookedClassInfoPool->_originalIMP sel:hookedClassInfoPool->_sel args:args argumentTypes:hookedClassInfoPool->_signature.argumentTypes]; innerArgs[1] = ¶ms; memcpy(innerArgs + 2, args + 2, (hookedClassInfoPool->_argsCount - 2) * sizeof(*args)); diff --git a/Stinger/Classes/Stinger.m b/Stinger/Classes/Stinger.m index 19f2753..a5eb1e0 100644 --- a/Stinger/Classes/Stinger.m +++ b/Stinger/Classes/Stinger.m @@ -198,7 +198,8 @@ NS_INLINE BOOL isMatched(STMethodSignature *methodSignature, STMethodSignature * } } // when STOptionInstead, returnType - if ((option & STOptionInstead) && ![blockSignature.returnType isEqualToString:methodSignature.returnType]) { + NSUInteger position = option & StingerPositionFilter; + if (position == STOptionInstead && ![blockSignature.returnType isEqualToString:methodSignature.returnType]) { NSCAssert(NO, @"return type isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); return NO; } diff --git a/Stinger/Classes/StingerParams.h b/Stinger/Classes/StingerParams.h index 8c45d84..9ef6e09 100644 --- a/Stinger/Classes/StingerParams.h +++ b/Stinger/Classes/StingerParams.h @@ -11,5 +11,5 @@ @interface StingerParams : NSObject -- (instancetype)initWithType:(NSString *)types originalIMP:(IMP)imp sel:(SEL)sel args:(void **)args; +- (instancetype)initWithType:(NSString *)types originalIMP:(IMP)imp sel:(SEL)sel args:(void **)args argumentTypes:(NSArray *)argumentTypes; @end diff --git a/Stinger/Classes/StingerParams.m b/Stinger/Classes/StingerParams.m index 6ecfa65..d3272c4 100644 --- a/Stinger/Classes/StingerParams.m +++ b/Stinger/Classes/StingerParams.m @@ -7,6 +7,7 @@ // #import "StingerParams.h" +#import @interface NSInvocation (STInvoke) - (void)invokeUsingIMP:(IMP)imp; @@ -17,16 +18,20 @@ @interface StingerParams () @property (nonatomic) SEL sel; @property (nonatomic) IMP originalIMP; @property (nonatomic) void **args; +@property (nonatomic) NSArray *argumentTypes; +@property (nonatomic) NSArray *arguments; @end @implementation StingerParams -- (instancetype)initWithType:(NSString *)types originalIMP:(IMP)imp sel:(SEL)sel args:(void **)args { +- (instancetype)initWithType:(NSString *)types originalIMP:(IMP)imp sel:(SEL)sel args:(void **)args argumentTypes:(NSArray *)argumentTypes { if (self = [super init]) { _types = types; _sel = sel; _originalIMP = imp; _args = args; + _argumentTypes = argumentTypes; + [self st_genarateArguments]; } return self; } @@ -40,6 +45,13 @@ - (SEL)sel { return _sel; } +- (NSArray *)arguments { + return _arguments; +} + +- (NSString *)typeEncoding { + return _types; +} - (void)invokeAndGetOriginalRetValue:(void *)retLoc { NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:_types.UTF8String]; @@ -54,4 +66,74 @@ - (void)invokeAndGetOriginalRetValue:(void *)retLoc { } } +#pragma - mark Private + +- (void)st_genarateArguments { + NSMutableArray *args = [[NSMutableArray alloc] initWithCapacity:_argumentTypes.count]; + for (NSUInteger i = 2; i < _argumentTypes.count; i++) { + id argument = [self st_argumentWithType:_argumentTypes[i] index:i]; + [args addObject:argument ?: NSNull.null]; + } + _arguments = [args copy]; +} + +- (id)st_argumentWithType:(NSString *)type index:(NSUInteger)index { + const char *argType = type.UTF8String; + // Skip const type qualifier. + if (argType[0] == _C_CONST) argType++; + +#define WRAP_AND_RETURN(type) do { type val = 0; val = *((type *)_args[index]); return @(val); } while (0) + if (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) { + void **objPointer = _args[index]; + return (__bridge id)(*objPointer); + } else if (strcmp(argType, @encode(SEL)) == 0) { + SEL selector = *((SEL *)_args[index]); + return NSStringFromSelector(selector); + } else if (strcmp(argType, @encode(char)) == 0) { + WRAP_AND_RETURN(char); + } else if (strcmp(argType, @encode(int)) == 0) { + WRAP_AND_RETURN(int); + } else if (strcmp(argType, @encode(short)) == 0) { + WRAP_AND_RETURN(short); + } else if (strcmp(argType, @encode(long)) == 0) { + WRAP_AND_RETURN(long); + } else if (strcmp(argType, @encode(long long)) == 0) { + WRAP_AND_RETURN(long long); + } else if (strcmp(argType, @encode(unsigned char)) == 0) { + WRAP_AND_RETURN(unsigned char); + } else if (strcmp(argType, @encode(unsigned int)) == 0) { + WRAP_AND_RETURN(unsigned int); + } else if (strcmp(argType, @encode(unsigned short)) == 0) { + WRAP_AND_RETURN(unsigned short); + } else if (strcmp(argType, @encode(unsigned long)) == 0) { + WRAP_AND_RETURN(unsigned long); + } else if (strcmp(argType, @encode(unsigned long long)) == 0) { + WRAP_AND_RETURN(unsigned long long); + } else if (strcmp(argType, @encode(float)) == 0) { + WRAP_AND_RETURN(float); + } else if (strcmp(argType, @encode(double)) == 0) { + WRAP_AND_RETURN(double); + } else if (strcmp(argType, @encode(BOOL)) == 0) { + WRAP_AND_RETURN(BOOL); + } else if (strcmp(argType, @encode(bool)) == 0) { + WRAP_AND_RETURN(BOOL); + } else if (strcmp(argType, @encode(char *)) == 0) { + WRAP_AND_RETURN(const char *); + } else if (strcmp(argType, @encode(void (^)(void))) == 0) { + void **blockPointer = _args[index]; + __unsafe_unretained id block = (__bridge id)(*blockPointer); + return [block copy]; + } else { + NSUInteger valueSize = 0; + NSGetSizeAndAlignment(argType, &valueSize, NULL); + + unsigned char valueBytes[valueSize]; + memcpy(valueBytes, _args[index], valueSize); + + return [NSValue valueWithBytes:valueBytes objCType:argType]; + } + return nil; +#undef WRAP_AND_RETURN +} + @end From f22ea51d4dd750333eec21c92594f88e867bc2df Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 11 Sep 2021 15:39:03 +0800 Subject: [PATCH 4/8] [CHG] replace STMethodSignature with NSMethodSignature --- Example/Stinger.xcodeproj/project.pbxproj | 4 - Example/Tests/MethodSignatureTests.m | 191 ------------------- Stinger/Classes/STHookInfo.m | 1 - Stinger/Classes/STHookInfoPool.h | 2 +- Stinger/Classes/STHookInfoPool.m | 135 ++++++++++++-- Stinger/Classes/STMethodSignature.h | 22 --- Stinger/Classes/STMethodSignature.m | 213 ---------------------- Stinger/Classes/Stinger.m | 30 +-- 8 files changed, 136 insertions(+), 462 deletions(-) delete mode 100644 Example/Tests/MethodSignatureTests.m delete mode 100644 Stinger/Classes/STMethodSignature.h delete mode 100644 Stinger/Classes/STMethodSignature.m diff --git a/Example/Stinger.xcodeproj/project.pbxproj b/Example/Stinger.xcodeproj/project.pbxproj index d806942..e964a14 100644 --- a/Example/Stinger.xcodeproj/project.pbxproj +++ b/Example/Stinger.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 243495F313045EB30CF94EB2 /* libPods-Stinger_Tests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F7D4EE6855E30149E51D1A /* libPods-Stinger_Tests.a */; }; 2937BBE624B85A0200D29B94 /* HookKVOObjectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2937BBE524B85A0200D29B94 /* HookKVOObjectTests.m */; }; 295C52A92398A6F400C3E9D5 /* HookForSpecificClassTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 295C52A82398A6F400C3E9D5 /* HookForSpecificClassTests.m */; }; - 295C52AC23991DAA00C3E9D5 /* MethodSignatureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 295C52AB23991DAA00C3E9D5 /* MethodSignatureTests.m */; }; 295D1B0D23A101C9001A882D /* PerformanceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 295D1B0C23A101C9001A882D /* PerformanceTests.m */; }; 2977986E239CF4AB00512AC7 /* HookForSpecificInstanceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 2977986D239CF4AB00512AC7 /* HookForSpecificInstanceTests.m */; }; 2979077B21E88D87002684DB /* README_中文.md in Resources */ = {isa = PBXBuildFile; fileRef = 2979077A21E88D87002684DB /* README_中文.md */; }; @@ -48,7 +47,6 @@ 26029EEE123E5F3DD35E00C4 /* libPods-Stinger_Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Stinger_Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 2937BBE524B85A0200D29B94 /* HookKVOObjectTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HookKVOObjectTests.m; sourceTree = ""; }; 295C52A82398A6F400C3E9D5 /* HookForSpecificClassTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HookForSpecificClassTests.m; sourceTree = ""; }; - 295C52AB23991DAA00C3E9D5 /* MethodSignatureTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MethodSignatureTests.m; sourceTree = ""; }; 295D1B0C23A101C9001A882D /* PerformanceTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PerformanceTests.m; sourceTree = ""; }; 2977986D239CF4AB00512AC7 /* HookForSpecificInstanceTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HookForSpecificInstanceTests.m; sourceTree = ""; }; 2979077A21E88D87002684DB /* README_中文.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = "README_中文.md"; path = "../README_中文.md"; sourceTree = ""; }; @@ -173,7 +171,6 @@ children = ( 6003F5B6195388D20070C39A /* Supporting Files */, 295C52A82398A6F400C3E9D5 /* HookForSpecificClassTests.m */, - 295C52AB23991DAA00C3E9D5 /* MethodSignatureTests.m */, 2977986D239CF4AB00512AC7 /* HookForSpecificInstanceTests.m */, 295D1B0C23A101C9001A882D /* PerformanceTests.m */, 298885D023A32A9000882BB3 /* CompatibilityTests.m */, @@ -371,7 +368,6 @@ files = ( 295C52A92398A6F400C3E9D5 /* HookForSpecificClassTests.m in Sources */, 298885D123A32A9000882BB3 /* CompatibilityTests.m in Sources */, - 295C52AC23991DAA00C3E9D5 /* MethodSignatureTests.m in Sources */, 295D1B0D23A101C9001A882D /* PerformanceTests.m in Sources */, 2937BBE624B85A0200D29B94 /* HookKVOObjectTests.m in Sources */, 2977986E239CF4AB00512AC7 /* HookForSpecificInstanceTests.m in Sources */, diff --git a/Example/Tests/MethodSignatureTests.m b/Example/Tests/MethodSignatureTests.m deleted file mode 100644 index a669d9b..0000000 --- a/Example/Tests/MethodSignatureTests.m +++ /dev/null @@ -1,191 +0,0 @@ -// -// MethodSignatureTests.m -// Stinger_Tests -// -// Created by 李永光 on 2019/12/5. -// Copyright © 2019 Assuner-Lee. All rights reserved. -// - -#import -#import -#import -#import - -@interface MethodSignatureTests : XCTestCase -@end - -NSString *getTpyeEncoding(Class cls, SEL sel) { - Method m = class_getInstanceMethod(cls, sel); - const char * typeEncoding = method_getTypeEncoding(m); - return [NSString stringWithUTF8String:typeEncoding]; -} - -BOOL stringArrayIsEqual(NSArray *a, NSArray *b) { - BOOL result = YES; - if (a.count == b.count) { - for (NSInteger i = 0; i < a.count; i++) { - if (![a[i] isEqualToString:b[i]]) { - result = NO; - } - } - } else { - result = NO; - } - return result; -} - -@implementation MethodSignatureTests - -#define GET_TYPE_ENCODING(sel) getTpyeEncoding(self.class, @selector(sel)) -- (void)testSignatureForMethod { - STMethodSignature *st_signature; - BOOL pass; - - st_signature = [[STMethodSignature alloc] initWithObjCTypes:GET_TYPE_ENCODING(methodA)]; - XCTAssertTrue([st_signature.types isEqualToString:GET_TYPE_ENCODING(methodA)], @"should equal"); - pass = [st_signature.returnType isEqualToString:@"v"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@", @":"]); - XCTAssertTrue(pass, @"should equal"); - - st_signature = [[STMethodSignature alloc] initWithObjCTypes:GET_TYPE_ENCODING(methodB:)]; - pass = [st_signature.returnType isEqualToString:@"@"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@", @":", @"@"]); - XCTAssertTrue(pass, @"should equal"); - - st_signature = [[STMethodSignature alloc] initWithObjCTypes:GET_TYPE_ENCODING(methodC:)]; - pass = [st_signature.returnType isEqualToString:@"v"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@", @":", @"@?"]); - XCTAssertTrue(pass, @"should equal"); - - st_signature = [[STMethodSignature alloc] initWithObjCTypes:GET_TYPE_ENCODING(methodD:)]; - pass = [st_signature.returnType isEqualToString:@"v"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@", @":", @"@?"]); - XCTAssertTrue(pass, @"should equal"); - - st_signature = [[STMethodSignature alloc] initWithObjCTypes:GET_TYPE_ENCODING(methodE:)]; - pass = [st_signature.returnType isEqualToString:@"{CGPoint=dd}"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@", @":", @"q"]); - XCTAssertTrue(pass, @"should equal"); - - - st_signature = [[STMethodSignature alloc] initWithObjCTypes:GET_TYPE_ENCODING(methodF:)]; - pass = [st_signature.returnType isEqualToString:@"{CGRect={CGPoint=dd}{CGSize=dd}}"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@", @":", @"{CGRect={CGPoint=dd}{CGSize=dd}}"]); - XCTAssertTrue(pass, @"should equal"); -} - - -- (void)testSignatureForBlock { - STMethodSignature *st_signature; - BOOL pass; - - id block = ^{ - - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"v"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?"]); - XCTAssertTrue(pass, @"should equal"); - - - block = ^NSString *(NSString *str){ - return @"xxx"; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"@"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"@"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSInteger (int a, float b) { - return a+b; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"i", @"f"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSInteger (id object) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"@"]); - XCTAssertTrue(pass, @"should equal"); - - - block = ^NSUInteger (void(^aBlock)(NSString *)) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"Q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"@?"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSUInteger (void(^aBlock)(void(^blockParams)(NSString *x))) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"Q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"@?"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSUInteger (void(^aBlock)(void(^blockParams)(NSString *x))) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"Q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"@?"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSUInteger (CGPoint point) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"Q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"{CGPoint=dd}"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^CGRect (CGPoint point) { - return CGRectMake(1, 2, 3, 4); - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"{CGRect={CGPoint=dd}{CGSize=dd}}"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"{CGPoint=dd}"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^CGRect (CGRect rect) { - return CGRectMake(1, 2, 3, 4); - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"{CGRect={CGPoint=dd}{CGSize=dd}}"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"{CGRect={CGPoint=dd}{CGSize=dd}}"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSUInteger (void *pointer) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"Q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @"^v"]); - XCTAssertTrue(pass, @"should equal"); - - block = ^NSUInteger (SEL sel) { - return 1; - }; - st_signature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; - pass = [st_signature.returnType isEqualToString:@"Q"] && stringArrayIsEqual(st_signature.argumentTypes, @[@"@?", @":"]); - XCTAssertTrue(pass, @"should equal"); -} - - - -#pragma mark - Example method - -- (void)methodA { - -} - -- (NSString *)methodB:(NSString *)str { - return @"xxx"; -} - -- (void)methodC:(void(^)(void))block { - -} - -- (void)methodD:(NSString *(^)(void(^aBlock)(NSString *str)))block { - -} - -- (CGPoint)methodE:(NSInteger)num { - return CGPointZero; -} - -- (CGRect)methodF:(CGRect)rect { - return CGRectZero; -} - -@end diff --git a/Stinger/Classes/STHookInfo.m b/Stinger/Classes/STHookInfo.m index b05d13a..7b98eec 100644 --- a/Stinger/Classes/STHookInfo.m +++ b/Stinger/Classes/STHookInfo.m @@ -7,7 +7,6 @@ // #import "STHookInfo.h" -#import "STMethodSignature.h" @implementation STHookInfo diff --git a/Stinger/Classes/STHookInfoPool.h b/Stinger/Classes/STHookInfoPool.h index 4fc11ae..a2fd4b9 100644 --- a/Stinger/Classes/STHookInfoPool.h +++ b/Stinger/Classes/STHookInfoPool.h @@ -9,7 +9,7 @@ #import #import -extern NSString *st_getSignatureForBlock(id block); +extern NSMethodSignature *st_getSignatureForBlock(id block); extern NSString * const STClassPrefix; extern NSString * const KVOClassPrefix; extern void st_setHookInfoPool(id obj, SEL key, id infoPool); diff --git a/Stinger/Classes/STHookInfoPool.m b/Stinger/Classes/STHookInfoPool.m index 1815204..4a9da33 100644 --- a/Stinger/Classes/STHookInfoPool.m +++ b/Stinger/Classes/STHookInfoPool.m @@ -8,7 +8,6 @@ #import "STHookInfoPool.h" #import "ffi.h" -#import "STMethodSignature.h" #import #import #import "StingerParams.h" @@ -60,7 +59,7 @@ }; -NSString *st_getSignatureForBlock(id block) { +NSMethodSignature *st_getSignatureForBlock(id block) { struct Block_layout *layout = (__bridge void *)block; if (!(layout->flags & BLOCK_HAS_SIGNATURE)) return nil; @@ -74,7 +73,7 @@ if (!descRef) return nil; const char *signature = (*(const char **)descRef); - return [NSString stringWithUTF8String:signature]; + return [NSMethodSignature signatureWithObjCTypes:signature]; } NS_INLINE void *_st_impForBlock(id block) { @@ -82,6 +81,107 @@ return layout->invoke; } +static ffi_type *st_ffiTypeWithType(const char *c) { + switch (c[0]) { + case 'v': + return &ffi_type_void; + case 'c': + return &ffi_type_schar; + case 'C': + return &ffi_type_uchar; + case 's': + return &ffi_type_sshort; + case 'S': + return &ffi_type_ushort; + case 'i': + return &ffi_type_sint; + case 'I': + return &ffi_type_uint; + case 'l': + return &ffi_type_slong; + case 'L': + return &ffi_type_ulong; + case 'q': + return &ffi_type_sint64; + case 'Q': + return &ffi_type_uint64; + case 'f': + return &ffi_type_float; + case 'd': + return &ffi_type_double; + case 'F': +#if CGFLOAT_IS_DOUBLE + return &ffi_type_double; +#else + return &ffi_type_float; +#endif + case 'B': + return &ffi_type_uint8; + case '^': + return &ffi_type_pointer; + case '*': + return &ffi_type_pointer; + case '@': + return &ffi_type_pointer; + case '#': + return &ffi_type_pointer; + case ':': + return &ffi_type_pointer; + case '{': { + // http://www.chiark.greenend.org.uk/doc/libffi-dev/html/Type-Example.html + ffi_type *type = malloc(sizeof(ffi_type)); + type->type = FFI_TYPE_STRUCT; + NSUInteger size = 0; + NSUInteger alignment = 0; + NSGetSizeAndAlignment(c, &size, &alignment); + type->alignment = alignment; + type->size = size; + while (c[0] != '=') ++c; ++c; + + NSPointerArray *pointArray = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsOpaqueMemory]; + while (c[0] != '}') { + ffi_type *elementType = NULL; + elementType = st_ffiTypeWithType(c); + if (elementType) { + [pointArray addPointer:elementType]; + c = NSGetSizeAndAlignment(c, NULL, NULL); + } else { + return NULL; + } + } + NSInteger count = pointArray.count; + ffi_type **types = malloc(sizeof(ffi_type *) * (count + 1)); + for (NSInteger i = 0; i < count; i++) { + types[i] = [pointArray pointerAtIndex:i]; + } + types[count] = NULL; // terminated element is NULL + + type->elements = types; + return type; + } + } + return NULL; +} + +@interface NSMethodSignature (ArgumentTypes) + +@property (nonatomic, copy, readonly) NSArray *argumentTypes; + +@end + +@implementation NSMethodSignature (ArgumentTypes) + +- (NSArray *)argumentTypes { + NSMutableArray *types = [NSMutableArray array]; + NSUInteger count = self.numberOfArguments; + for (NSUInteger i = 0; i < count; ++i) { + const char *type = [self getArgumentTypeAtIndex:i]; + [types addObject:[NSString stringWithUTF8String:type]]; + } + return [types copy]; +} + +@end #pragma mark - STHookInfoPool @@ -91,8 +191,7 @@ @interface STHookInfoPool () @property (nonatomic, strong) dispatch_semaphore_t semaphore; -@property (nonatomic, strong) STMethodSignature *signature; -@property (nonatomic, strong) NSMethodSignature *ns_signature; +@property (nonatomic, strong) NSMethodSignature *signature; @property (nonatomic, assign) NSUInteger argsCount; @property (nonatomic) SEL uniqueKey; @end @@ -140,9 +239,8 @@ - (instancetype)init { - (void)setTypeEncoding:(NSString *)typeEncoding { _typeEncoding = typeEncoding; - _signature = typeEncoding ? [[STMethodSignature alloc] initWithObjCTypes:typeEncoding] : nil; - _ns_signature = typeEncoding ? [NSMethodSignature signatureWithObjCTypes:[typeEncoding UTF8String]]: nil; - _argsCount = _signature.argumentTypes.count; + _signature = typeEncoding ? [NSMethodSignature signatureWithObjCTypes:[typeEncoding UTF8String]]: nil; + _argsCount = _signature.numberOfArguments; } @@ -208,15 +306,15 @@ - (BOOL)removeInfoForIdentifier:(STIdentifier)identifier { - (StingerIMP)stingerIMP { if (_stingerIMP == NULL) { - ffi_type *returnType = st_ffiTypeWithType(self.signature.returnType); - NSAssert(returnType, @"can't find a ffi_type of %@", self.signature.returnType); + ffi_type *returnType = st_ffiTypeWithType(self.signature.methodReturnType); + NSAssert(returnType, @"can't find a ffi_type of %s", self.signature.methodReturnType); NSUInteger argumentCount = self->_argsCount; _args = malloc(sizeof(ffi_type *) * argumentCount) ; for (int i = 0; i < argumentCount; i++) { - ffi_type* current_ffi_type = st_ffiTypeWithType(self.signature.argumentTypes[i]); - NSAssert(current_ffi_type, @"can't find a ffi_type of %@", self.signature.argumentTypes[i]); + ffi_type* current_ffi_type = st_ffiTypeWithType([self.signature getArgumentTypeAtIndex:i]); + NSAssert(current_ffi_type, @"can't find a ffi_type of %s", [self.signature getArgumentTypeAtIndex:i]); _args[i] = current_ffi_type; } @@ -260,27 +358,28 @@ - (BOOL)_removeInfoForIdentifier:(STIdentifier)identifier inInfos:(NSMutableArra } - (void)_genarateBlockCif { - ffi_type *returnType = st_ffiTypeWithType(self.signature.returnType); + ffi_type *returnType = st_ffiTypeWithType(self.signature.methodReturnType); NSUInteger argumentCount = self->_argsCount; _blockArgs = malloc(sizeof(ffi_type *) *argumentCount); - ffi_type *current_ffi_type_0 = st_ffiTypeWithType(@"@?"); + ffi_type *current_ffi_type_0 = st_ffiTypeWithType("@?"); _blockArgs[0] = current_ffi_type_0; - ffi_type *current_ffi_type_1 = st_ffiTypeWithType(@"@"); + ffi_type *current_ffi_type_1 = st_ffiTypeWithType("@"); _blockArgs[1] = current_ffi_type_1; for (int i = 2; i < argumentCount; i++){ - ffi_type* current_ffi_type = st_ffiTypeWithType(self.signature.argumentTypes[i]); - _blockArgs[i] = current_ffi_type; + ffi_type* current_ffi_type = st_ffiTypeWithType([self.signature getArgumentTypeAtIndex:i]); + _blockArgs[i] = current_ffi_type; } if(ffi_prep_cif(&_blockCif, FFI_DEFAULT_ABI, (unsigned int)argumentCount, returnType, _blockArgs) != FFI_OK) { - NSAssert(NO, @"FUCK"); + NSAssert(NO, @"FUCK"); } } + #pragma mark - _st_ffi_function #define REAL_STATED_CALSS_INFO_POOL (statedClassInfoPool ?: hookedClassInfoPool) diff --git a/Stinger/Classes/STMethodSignature.h b/Stinger/Classes/STMethodSignature.h deleted file mode 100644 index 9c98b5c..0000000 --- a/Stinger/Classes/STMethodSignature.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// STMethodSignature.h -// Stinger -// -// Created by Assuner on 2018/1/9. -// Copyright © 2018年 Assuner. All rights reserved. -// TODO: can be optimized - -#import -#import "ffi.h" - -@interface STMethodSignature : NSObject - -@property (nonatomic, readonly) NSString *types; -@property (nonatomic, readonly) NSArray *argumentTypes; -@property (nonatomic, readonly) NSString *returnType; - -- (instancetype)initWithObjCTypes:(NSString *)objCTypes; // type encoding of method or block - -ffi_type *st_ffiTypeWithType(NSString *type); - -@end diff --git a/Stinger/Classes/STMethodSignature.m b/Stinger/Classes/STMethodSignature.m deleted file mode 100644 index 63903d1..0000000 --- a/Stinger/Classes/STMethodSignature.m +++ /dev/null @@ -1,213 +0,0 @@ -// -// STMethodSignature.m -// Stinger -// -// Created by Assuner on 2018/1/9. -// Copyright © 2018年 Assuner. All rights reserved. -// - -#import "STMethodSignature.h" - -@implementation STMethodSignature { - NSString *_typeNames; - NSMutableArray *_argumentTypes; - NSString *_returnType; - NSString *_types; -} - -- (instancetype)initWithObjCTypes:(NSString *)objCTypes { - self = [super init]; - if (self) { - _types = objCTypes; - [self _genarateTypes]; - } - return self; -} - -- (NSArray *)argumentTypes { - return _argumentTypes; -} - -- (NSString *)types { - return _types; -} - -- (NSString *)returnType { - return _returnType; -} - -ffi_type *st_ffiTypeWithType(NSString *type) { - return _st_ffiTypeWithType(type.UTF8String); -} - - -#pragma mark - Private - -/* - * sel: v24@0:8@16 -> v,@,:,@ - * block: v24@?0@\"\"8@\"NSString\"16 -> v,@?,@,@ - */ -- (void)_genarateTypes { - _argumentTypes = [[NSMutableArray alloc] init]; - NSInteger descNum1 = 0; // num of '\"' in signature type encoding - NSInteger descNum2 = 0; // num of '<' in block signature type encoding - NSInteger descNum3 = 0; // num of '{' in signature type encoding - NSInteger structBLoc = 0; // loc of '{' in signature type encoding - NSInteger structELoc = 0; // loc of '}' in signature type encoding - BOOL skipNext; - NSString *arg; - NSMutableArray *argArray = [NSMutableArray array]; - - for (int i = 0; i < _types.length; i ++) { - unichar c = [_types characterAtIndex:i]; - skipNext = NO; - arg = nil; - - if (c == '\"') ++descNum1; - if ((descNum1 % 2) != 0 || c == '\"' || isdigit(c)) { - continue; - } - - - if (c == '<') ++descNum2; - if (descNum2 > 0) { - if (c == '>') { - --descNum2; - } - continue; - } - - - if (c == '{') { - if (descNum3 == 0) { - structBLoc = i; - } - ++descNum3; - } - if (descNum3 > 0) { - if (c == '}') { - --descNum3; - if (descNum3 == 0) { - structELoc = i; - arg = [_types substringWithRange:NSMakeRange(structBLoc, structELoc - structBLoc + 1)]; - structBLoc = 0; - structELoc = 0; - } - } - - if (descNum3 > 0) { - continue; - } - } - - - if (!arg) { - if (c == '^') { - skipNext = YES; - arg = [_types substringWithRange:NSMakeRange(i, 2)]; - } else if (c == '?') { - // @? is block - arg = [_types substringWithRange:NSMakeRange(i - 1, 2)]; - [argArray removeLastObject]; - } else { - arg = [_types substringWithRange:NSMakeRange(i, 1)]; - } - } - - if (arg) { - [argArray addObject:arg]; - } - if (skipNext) i++; - } - - if (argArray.count > 1) { - _returnType = argArray.firstObject; - [argArray removeObjectAtIndex:0]; - _argumentTypes = argArray; - } -} - - -NS_INLINE ffi_type *_st_ffiTypeWithType(const char *c) { - switch (c[0]) { - case 'v': - return &ffi_type_void; - case 'c': - return &ffi_type_schar; - case 'C': - return &ffi_type_uchar; - case 's': - return &ffi_type_sshort; - case 'S': - return &ffi_type_ushort; - case 'i': - return &ffi_type_sint; - case 'I': - return &ffi_type_uint; - case 'l': - return &ffi_type_slong; - case 'L': - return &ffi_type_ulong; - case 'q': - return &ffi_type_sint64; - case 'Q': - return &ffi_type_uint64; - case 'f': - return &ffi_type_float; - case 'd': - return &ffi_type_double; - case 'F': - #if CGFLOAT_IS_DOUBLE - return &ffi_type_double; - #else - return &ffi_type_float; - #endif - case 'B': - return &ffi_type_uint8; - case '^': - return &ffi_type_pointer; - case '*': - return &ffi_type_pointer; - case '@': - return &ffi_type_pointer; - case '#': - return &ffi_type_pointer; - case ':': - return &ffi_type_pointer; - case '{': { - // http://www.chiark.greenend.org.uk/doc/libffi-dev/html/Type-Example.html - ffi_type *type = malloc(sizeof(ffi_type)); - type->type = FFI_TYPE_STRUCT; - NSUInteger size = 0; - NSUInteger alignment = 0; - NSGetSizeAndAlignment(c, &size, &alignment); - type->alignment = alignment; - type->size = size; - while (c[0] != '=') ++c; ++c; - - NSPointerArray *pointArray = [NSPointerArray pointerArrayWithOptions:NSPointerFunctionsOpaqueMemory]; - while (c[0] != '}') { - ffi_type *elementType = NULL; - elementType = _st_ffiTypeWithType(c); - if (elementType) { - [pointArray addPointer:elementType]; - c = NSGetSizeAndAlignment(c, NULL, NULL); - } else { - return NULL; - } - } - NSInteger count = pointArray.count; - ffi_type **types = malloc(sizeof(ffi_type *) * (count + 1)); - for (NSInteger i = 0; i < count; i++) { - types[i] = [pointArray pointerAtIndex:i]; - } - types[count] = NULL; // terminated element is NULL - - type->elements = types; - return type; - } - } - return NULL; -} - -@end diff --git a/Stinger/Classes/Stinger.m b/Stinger/Classes/Stinger.m index a5eb1e0..8ae3ae3 100644 --- a/Stinger/Classes/Stinger.m +++ b/Stinger/Classes/Stinger.m @@ -10,7 +10,6 @@ #import #import "STHookInfo.h" #import "STHookInfoPool.h" -#import "STMethodSignature.h" static void *STSubClassKey = &STSubClassKey; @@ -101,8 +100,9 @@ NS_INLINE STHookResult hookMethod(Class hookedCls, SEL sel, STOption option, STI NSCAssert(m, @"SEL (%@) doesn't has a imp in Class (%@) originally", NSStringFromSelector(sel), hookedCls); if (!m) return STHookResultErrorMethodNotFound; const char * typeEncoding = method_getTypeEncoding(m); - STMethodSignature *methodSignature = [[STMethodSignature alloc] initWithObjCTypes:[NSString stringWithUTF8String:typeEncoding]]; - STMethodSignature *blockSignature = [[STMethodSignature alloc] initWithObjCTypes:st_getSignatureForBlock(block)]; + NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:typeEncoding]; + NSMethodSignature *blockSignature = st_getSignatureForBlock(block); + if (!isMatched(methodSignature, blockSignature, option, hookedCls, sel, identifier)) { return STHookResultErrorBlockNotMatched; } @@ -175,33 +175,39 @@ NS_INLINE void hookGetClassMessage(Class class, Class retClass) { } -NS_INLINE BOOL isMatched(STMethodSignature *methodSignature, STMethodSignature *blockSignature, STOption option, Class cls, SEL sel, NSString *identifier) { +NS_INLINE BOOL isMatched(NSMethodSignature *methodSignature, NSMethodSignature *blockSignature, STOption option, Class cls, SEL sel, NSString *identifier) { BOOL strictCheck = ((option & STOptionWeakCheckSignature) == 0); //argument count - if (strictCheck && methodSignature.argumentTypes.count != blockSignature.argumentTypes.count) { + if (strictCheck && methodSignature.numberOfArguments != blockSignature.numberOfArguments) { NSCAssert(NO, @"count of arguments isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); return NO; }; // loc 1 should be id. - if (![blockSignature.argumentTypes[1] isEqualToString:@"@"]) { + const char *firstArgumentType = [blockSignature getArgumentTypeAtIndex:1]; + if (!firstArgumentType || firstArgumentType[0] != '@') { NSCAssert(NO, @"argument 1 should be object type. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); return NO; } /// only strict check if (strictCheck) { // from loc 2. - for (NSInteger i = 2; i < methodSignature.argumentTypes.count; i++) { - if (![blockSignature.argumentTypes[i] isEqualToString:methodSignature.argumentTypes[i]]) { + for (NSInteger i = 2; i < methodSignature.numberOfArguments; i++) { + const char *methodType = [methodSignature getArgumentTypeAtIndex:i]; + const char *blockType = [blockSignature getArgumentTypeAtIndex:i]; + if (!methodType || !blockType || methodType[0] != blockType[0]) { NSCAssert(NO, @"argument (%zd) type isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", i, cls, NSStringFromSelector(sel), identifier); return NO; } } } // when STOptionInstead, returnType - NSUInteger position = option & StingerPositionFilter; - if (position == STOptionInstead && ![blockSignature.returnType isEqualToString:methodSignature.returnType]) { - NSCAssert(NO, @"return type isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); - return NO; + if ((option & StingerPositionFilter) == STOptionInstead) { + const char *methodReturnType = methodSignature.methodReturnType; + const char *blockReturnType = blockSignature.methodReturnType; + if (!methodReturnType || !blockReturnType || methodReturnType[0] != blockReturnType[0]) { + NSCAssert(NO, @"return type isn't equal. Class: (%@), SEL: (%@), Identifier: (%@)", cls, NSStringFromSelector(sel), identifier); + return NO; + } } return YES; From 9ba26934e98cf1dbf6b00a417a0a77c6ffb50e14 Mon Sep 17 00:00:00 2001 From: bob Date: Sat, 11 Sep 2021 16:53:48 +0800 Subject: [PATCH 5/8] [CHG] libffi use source code from https://github.com/libffi/libffi, version 3.3.0 --- Stinger.podspec | 25 +- Stinger/Classes/libffi/libffi.a | Bin 1471648 -> 0 bytes .../darwin_common/include}/ffi.h | 2 +- .../libffi/darwin_common/include/ffi_cfi.h | 55 + .../libffi/darwin_common/include/ffi_common.h | 153 + .../libffi/darwin_common/include/fficonfig.h | 24 + .../darwin_common/include}/ffitarget.h | 2 +- Stinger/libffi/darwin_common/src/closures.c | 1004 ++++ Stinger/libffi/darwin_common/src/debug.c | 64 + Stinger/libffi/darwin_common/src/dlmalloc.c | 5166 +++++++++++++++++ .../libffi/darwin_common/src/java_raw_api.c | 374 ++ Stinger/libffi/darwin_common/src/prep_cif.c | 263 + Stinger/libffi/darwin_common/src/raw_api.c | 267 + Stinger/libffi/darwin_common/src/types.c | 108 + .../darwin_ios/include}/ffi_arm64.h | 112 +- .../darwin_ios/include/ffi_armv7.h} | 112 +- .../darwin_ios/include}/ffi_i386.h | 194 +- .../darwin_ios/include}/ffi_x86_64.h | 112 +- .../darwin_ios/include/fficonfig_arm64.h | 223 + .../darwin_ios/include/fficonfig_armv7.h | 223 + .../darwin_ios/include/fficonfig_i386.h | 223 + .../darwin_ios/include/fficonfig_x86_64.h | 223 + .../darwin_ios/include}/ffitarget_arm64.h | 27 +- .../darwin_ios/include/ffitarget_armv7.h} | 14 +- .../darwin_ios/include}/ffitarget_i386.h | 104 +- .../darwin_ios/include}/ffitarget_x86_64.h | 32 +- .../libffi/darwin_ios/src/aarch64/ffi_arm64.c | 1030 ++++ .../darwin_ios/src/aarch64/internal_arm64.h | 73 + .../darwin_ios/src/aarch64/sysv_arm64.S | 456 ++ Stinger/libffi/darwin_ios/src/arm/ffi_armv7.c | 881 +++ .../darwin_ios/src/arm/internal_armv7.h | 12 + .../libffi/darwin_ios/src/arm/sysv_armv7.S | 390 ++ Stinger/libffi/darwin_ios/src/x86/asmnames.h | 35 + .../libffi/darwin_ios/src/x86/ffi64_x86_64.c | 900 +++ Stinger/libffi/darwin_ios/src/x86/ffi_i386.c | 775 +++ .../libffi/darwin_ios/src/x86/ffiw64_x86_64.c | 323 ++ .../libffi/darwin_ios/src/x86/internal32.h | 34 + .../libffi/darwin_ios/src/x86/internal64.h | 27 + Stinger/libffi/darwin_ios/src/x86/sysv_i386.S | 1143 ++++ .../libffi/darwin_ios/src/x86/unix64_x86_64.S | 626 ++ .../libffi/darwin_ios/src/x86/win64_x86_64.S | 246 + replace.rb | 23 + 42 files changed, 15833 insertions(+), 247 deletions(-) delete mode 100644 Stinger/Classes/libffi/libffi.a rename Stinger/{Classes/libffi => libffi/darwin_common/include}/ffi.h (88%) mode change 100755 => 100644 create mode 100644 Stinger/libffi/darwin_common/include/ffi_cfi.h create mode 100644 Stinger/libffi/darwin_common/include/ffi_common.h create mode 100644 Stinger/libffi/darwin_common/include/fficonfig.h rename Stinger/{Classes/libffi => libffi/darwin_common/include}/ffitarget.h (86%) mode change 100755 => 100644 create mode 100644 Stinger/libffi/darwin_common/src/closures.c create mode 100644 Stinger/libffi/darwin_common/src/debug.c create mode 100644 Stinger/libffi/darwin_common/src/dlmalloc.c create mode 100644 Stinger/libffi/darwin_common/src/java_raw_api.c create mode 100644 Stinger/libffi/darwin_common/src/prep_cif.c create mode 100644 Stinger/libffi/darwin_common/src/raw_api.c create mode 100644 Stinger/libffi/darwin_common/src/types.c rename Stinger/{Classes/libffi => libffi/darwin_ios/include}/ffi_arm64.h (83%) mode change 100755 => 100644 rename Stinger/{Classes/libffi/ffi_arm.h => libffi/darwin_ios/include/ffi_armv7.h} (83%) mode change 100755 => 100644 rename Stinger/{Classes/libffi => libffi/darwin_ios/include}/ffi_i386.h (73%) rename Stinger/{Classes/libffi => libffi/darwin_ios/include}/ffi_x86_64.h (83%) mode change 100755 => 100644 create mode 100644 Stinger/libffi/darwin_ios/include/fficonfig_arm64.h create mode 100644 Stinger/libffi/darwin_ios/include/fficonfig_armv7.h create mode 100644 Stinger/libffi/darwin_ios/include/fficonfig_i386.h create mode 100644 Stinger/libffi/darwin_ios/include/fficonfig_x86_64.h rename Stinger/{Classes/libffi => libffi/darwin_ios/include}/ffitarget_arm64.h (84%) mode change 100755 => 100644 rename Stinger/{Classes/libffi/ffitarget_arm.h => libffi/darwin_ios/include/ffitarget_armv7.h} (92%) mode change 100755 => 100644 rename Stinger/{Classes/libffi => libffi/darwin_ios/include}/ffitarget_i386.h (68%) rename Stinger/{Classes/libffi => libffi/darwin_ios/include}/ffitarget_x86_64.h (84%) mode change 100755 => 100644 create mode 100644 Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c create mode 100644 Stinger/libffi/darwin_ios/src/aarch64/internal_arm64.h create mode 100644 Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S create mode 100644 Stinger/libffi/darwin_ios/src/arm/ffi_armv7.c create mode 100644 Stinger/libffi/darwin_ios/src/arm/internal_armv7.h create mode 100644 Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S create mode 100644 Stinger/libffi/darwin_ios/src/x86/asmnames.h create mode 100644 Stinger/libffi/darwin_ios/src/x86/ffi64_x86_64.c create mode 100644 Stinger/libffi/darwin_ios/src/x86/ffi_i386.c create mode 100644 Stinger/libffi/darwin_ios/src/x86/ffiw64_x86_64.c create mode 100644 Stinger/libffi/darwin_ios/src/x86/internal32.h create mode 100644 Stinger/libffi/darwin_ios/src/x86/internal64.h create mode 100644 Stinger/libffi/darwin_ios/src/x86/sysv_i386.S create mode 100644 Stinger/libffi/darwin_ios/src/x86/unix64_x86_64.S create mode 100644 Stinger/libffi/darwin_ios/src/x86/win64_x86_64.S create mode 100644 replace.rb diff --git a/Stinger.podspec b/Stinger.podspec index 23c4715..e87bbc5 100644 --- a/Stinger.podspec +++ b/Stinger.podspec @@ -30,15 +30,22 @@ TODO: Add long description of the pod here. s.ios.deployment_target = '8.0' - s.source_files = 'Stinger/Classes/**/*' + s.pod_target_xcconfig = { + 'DEFINES_MODULE' => 'YES', + } + s.default_subspecs = 'Core', 'libffi' + # libffi source code from https://github.com/libffi/libffi + # version 3.3.0 + # how to fix libffi, you can see https://juejin.cn/post/6955652447670894606 + s.subspec 'libffi' do |d| + d.source_files = 'Stinger/libffi/**/*.{h,c,m,S}' + d.public_header_files = 'Stinger/libffi/**/*.{h}' + end - # s.resource_bundles = { - # 'Stinger' => ['Stinger/Assets/*.png'] - # } - - # s.public_header_files = 'Pod/Classes/**/*.h' - # s.frameworks = 'UIKit', 'MapKit' - # s.dependency 'AFNetworking', '~> 2.3' - s.vendored_libraries = 'Stinger/Classes/libffi/libffi.a' + s.subspec 'Core' do |d| + d.source_files = 'Stinger/Classes/**/*' + d.public_header_files = 'Stinger/Classes/**/*.{h}' + d.dependency 'Stinger/libffi' + end end diff --git a/Stinger/Classes/libffi/libffi.a b/Stinger/Classes/libffi/libffi.a deleted file mode 100644 index a9d7bb07e5ba4395c11a9c62158da574d26b0ebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1471648 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 z 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�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

  • S)5ai^BKOg6*|uXr^IucJ=6 zHutDb6So?kqQcgNyEC9Q9rv`iHe5cNGq=bR5@piXLbws_aP)&t$9lq^V^y?xZ$e_C|k}qad8-~&?^Xpzt-(>D`N{PTF&g))f$JlyjGzT## zJ|?Ml-OKIGOxNIb^w=zAYty&H56Pay4|zf6ug;@E$ToylJ1JWWuVO&+VH%GogjxT1 zCZ|sZ*j;x!ca8f$un~R-go8*4G9S2@ByC7BY&ONTY|dmHck38!mpnV>cI=b`ajNRMaGn%_~N!>Y5RnQE&EVH{E(Ps03ruS1_?x@Iv%GqyJTM$-Rn z_6*>L*L(j^_ZwbM-On%~fhTLI_GK!yCdg~R5kZ<3&nWWOO~`|PXODWC{|;JXwqoY$ zW?B%ce)M`5ry(~@yQ^`>UAH~gHiEsT+**Q~N^_EPwSi%cOgSq}D<>{#xN~;7F;3|d zR@*MlFaPo3-I5py$X%ySB?UPibOC*`TXFliB{cW-h`2!_Mg_EfE;bub0-B}|o*F^m zv2OcY5AU9~YD5TG(bC=a$aVk6Bbv+!R&QH95hpd`)S@ctD)n+lyHAMbX8@aVyK1xh zKL_@b&CbQQJ**qgF7Kn(;kmS~1jTGK(-tANA&SM`>_oBNiMaiHJKhRzsbb&O?gD;h zotPaR8E*R)PH}T-!++(#RO?Qg0r8y0<#hU1UsK{yM<%BCCC1)uMs5^BdB&}Ly(5vK6+P?aW*PCH2S$_^KS8-dm03{`b ztc<2UKf|rsfJkX_`qEOx=%>V31|p!FNkHB1f2Gb@?{LLncamz@f_y4R-@LT@-|HLV z>l}vT4a>vmx@U7%K&c_R$qqB~g626;aSK!*Mpx!PzrK5#oQ!|AL_0p3v%<8G&0hRYoG%)_k2ya6Px~(W}BsJ$5IZ7)!*Tx=#A1U zhiQMGJra6`X<>gpUx_ox1YJLWmFa6meR2n}jhOxRRD_T15`iMQxr4Gk{RyMeFX#=v z?LHJ*_OR^2rhlyl=|kTmWm6s(6+OcKipj;pj)?j8(f`s8R-aO;D7F-k-7wqBs_QSA z%!Vpu3@_2_?R?P^0h8;{i}?eQGPE06Pe=Xc?XI zM9sGupNV<}id3rW8%$Jc8tdEybCwU@P`Eajm_zH@uO4h_`(}P#S1;IOK8Gq|-)5eT z&8#A=$tOoZ9(pE9+1Gr4I(#z35p|H>YQpp{`0aa_E+;hQu4)Usqdxalya5%HdDLx# zG#O;(2cJTDWAJWK6f*!ap}#7$s>)6ADxePK%ZMw%k@}~J*dfdE{%4Q zUJ;k9TejX}F>%N(aESgvS^K#0%hrE6Uy3Vu(1N(l%lyCq9%u3wMy5(M%fg{d{1mLI@!LAI+*C`^`6E7^F_$**T}kB*>6c?*D`Ma+3o$zBQ6hnMc9L- zceWjL(L5Ue3bo8<_CMj1Pul<~!y=N3BcVY5FQBydfo@y0(2e)S5vJaX@4Y85 z_zXQKbGEH_eCLuxu`gSRVp^XkM6qIQNmiYy35-mQ2nv8SDsZ;_#`c{{8Q~5jx^AAS z`6E0v@O+)cA)4o>4-1@K90>~&8%w^Rt~7sG#H-9-viAb{GloruAL?bmeYFpY4n{lu zs&Bapw!*Cn`^eO6QaK_(eOcRvUP`x1H1=Hm{4|kiTM2D16}4jM$8C$7<$<4(!4TsX zfH_x7d!&V|bMq{ZDe?yP0js*$t^?Npy@i#Vti?imMd1!R1JD0F7@S>-3 zX|+W+tiFQ$lomg*W(^@JA}GDF{hnu&UL1*~PP4w@9T+S^nQw;^-}=#Wa8?zGix!{x zh>%9R?x?Q7cJ$mPJfSTNlwJ)NKZW-_)u|&)Gbx3PF3pwmi~0K`j`sflV6|)t{ghWSy@c zN*nozv;wdu4!of*Vy4tVq+qau)u$nrys<8WkF-ZD&h+y;qOGf*1ez#E+B!I0zld$6 z3-a!kCjI-7!D8$z6bb)1f1ZhOvLV}JEZUs^63AcDGCb@pXjPN2@;l+!yfUENU zw4)xWj=26b>N;9L+W(pp{yowtzNo_%-Sdzx?HHxh|gA4gq~`Z@66e zS44;H5LwrBnk|Au7J6^M`p{$+Eh9krC3^z7Nm!&y0$n9lSJ|wMx(puI9m2pg*lM`m zdQ@% z5fes}fYGVPTqAxrSbvDOyI`yFZH$^C13A@ZBY}MJBqbb(*-lRAG5i zGMw>c=IIYo1jIr_XcTqsZ!is zS}t?plzC_4XtVz_zIxiC+PHY?u~ zNXpeJb3MD!3Jy7?um*@1iy@Ntq0ME`EvPs$ux}pk35^&`MXQNC=BQP3hz;lNN$9zD zilE>>F(jbV+|W8ls2z58C##(P}SETx8y(DL1w@Wa9X z2C&_jP)EKSqqkwaM9Cx()yfkt5k-`~JGBZp!zX&tCulaGc~wPKJ}ozWg7HumpTw=8WoQgd3PePF$fpMio1!7zVzHaJRLz z!q8viTeO~*YskfiM8HEenFhUdw&rpe#IbfT9`j~2_@JXB=phC1b&xQEne2PC;Q&?s zBqa3YvY}Wu6}JRHJ{J#GLJ!yEx}g~GCWnv_NHLjqL?5bg;l%eT+0UREUF-x__UBN9 zIOVL9sUGN;{;o-Gp&`P|BmB0*0FF~Y+Ypg4qA%rCWW%W62n3q-1{;6yhjEjxkSlY_ zSY3)$56n}XAq$8!$Dn;Z!&juDV3714ypmKN=%Y;O+#XjgLX<3jawkK^PHk3%F_-wh_7rpH%!pR_Nu!AaR!llma z2(82HYrljB25x!kpHfQG;4uB30nGZL9E3U*ePJ4tJ1B@%wr@njoXQhJK;L z0j20{8g9FFI5n<&QFU!^%Vl5>v5J9g~+f3h&B!=;7%5%uAItWis~PA}UH z8qD1LwNCStnZqkfO$C`Vuy^l$C~jRhMmzWn0}NvMIV+z5yiI00cG0*k`|m& zp>^6!(-UG|Z<@E(!Rjwf2X4ULFAH90@y;bXIxj*Kh4tQ0IH#jt!xj&BI=k4k+N9Vx ze21)OZQdoC4d1`1pbH$l9x#r2qjG>~eR05MW)YH3O)(?Tu)|ujf;U>m$ zht2v7hrNsqMTK}-qV>h)Xh1$h!D?T!Y8B_SPHbY=HdC!A4@QOE@0k6B&+2aA5@xjz z7=?{XjY#QEbJYLMYTxTkWUdxmIkr3yW?JjZpJAv4F~;@YU}U%19jx~0MGcI({Sw-D z5YcL%u1f_~=0C0W)m5*gwUcNBGxP}`SqwP*6(@Qb`7`x4Bv@t-3!FoO(?5y~*n4qSzrG-nR6^+=X#vKsVaP7mWRCkQe9-{#i*m7jf*}Z}X__GR z&c9)7S{j|Ed3cbKN!eQk9|au>FINy}Ew)c>2s#uKx`_@h(n8ixY%jONoIhYEH zBlmv+dn#`g+(yP}A6o1psVRg`Z*h*Wi8fdy z^;cy~wZit0Kybt&=ZU7?ZVz0+!C!A}`L1mvy0PgSVu-F^Vq*OKCblmN|L{8aapo?I zGfGS|A9=k8w{$gP$WoFBvQ_o?yF!n}W1f%sn4FpWmKBhxUEECdr?ae9yC1nq+jy^7 z+V983RFtdLOpC$nF~fxeZD~N zV5V>-WsC8f<^tUn29FlNy0_q5MOu*6cb`r{8BL_|+H4rue3f${ZSEI7@^YJ;h0Xmf z-elPj$c8#!>pgT_I(PTDc0jjjakWtP9lNF_55*}6^l>fBBe|MveiduJipWjr;03$@ z+Pmd`n%Sj^Wd$QJtIc5dpl+J>Thu1fs=(&~491}7E90nxDZiir+u7gic)@to9YZ+N5qrVD z9_vw#pmd=_^AgKuQ{PYdg^v1(mQWQ2YUc$+x3YLhaKcaksZ{46g(j(IPd&nyk+XR@9NjJ4XYw*4mlNyC|b zi{Qg>yI7AKbgLlQKnnc^o0j{-?@1`G5&&3 zy+EjX{nVxu+SA1wy(#GOuush7PBlqAzK9zK1@{mExjnAY#$8!WUH>>Eg+|hm0y39OUih_f77#E zmwHq|T&;30(DQ4VyX(bzuIX{@x=L>ItoQC`u;c<_9qvJl%VvXRHhinGVa;2#)d)II zC#jTBLK_+!bZ3uNy87C^aEQA1@_YN>gyN{7^(k7+~K|8*#P`-Skq-*Zsn$7mVVhYF>Xo ztyaHlvKwdA;p{>|kr|&vYr>Ymcnhd~W6OOu717IUKn+ROOzlHA##U#Cs zj4K&z?gy)L6AxTwGaThyHpA(cJDoSuiALj%lleU1qb+pf#7~^FwZuxzN5XZbP2fk^ zM+Pq6SAN~os_&kdfdlyxU0l-i-D3kGBu#bnt~4HMf}H4(ak%+!J8sJ_eIS3&Tw;^QZ%D+lC*!@*dCZ9HEvD0jK;Pu+-^=e zd+)q{0F#iQ_@bQ^KOf-CT)>xHMcv-O@Wc$>&}G0NrnatM=nT~Q_n=ZMKdr2y+l-Rc z)2U0AcEae3_s)apGDdaZ&2(CHzM;zky5@!8pf)L*GLVLY@Ud&cuJgDdw}N{Xeq)X9 z_p4^ER$je55sO56 zO1|DW3O@RV>@eE~ceY%LwFeHAVXBu^+wuZk#(t%aSez%Z8kE@R#Usb_$g5(cf%5A# zQI#iisl3eL&$ShykG)4l3?FFuI*OQFHihk7O!R}hE3^=5L*rmcM=LuF-W3zrpNOvNxb%6Go-S{K!|?#Bu(Zb;sJRv}94F1TUjTROeoJfSCJSsmNcM z-LCb%I<6gmE$+|xi<^W)o2^WqxvwxDqsn8iE?I0W*u|#K8^?-Gvqx0txaZ3B57Co5 zZd?S#d%J#jL^KT@C8`^Y+V^oHa3v17!Z-k(6e?@ilFD-M{1ON=@f60;|0mSl{oXj& zxmamBrk9Mdpuz0zWJ{bB{j*O)Q;zKXbTTZgU8KH2GKcRr)y<$yt&vUJhBkeT(D6k? z;gFS84WIArD$RN(3(8r;mSP_$tya?-n+^etp4#_TFf$3K%^i>S#J&DUqP4^2X;apoEei*PUctzsvSa*A9nwMZUzi?z8%O{YcvcG`^D{ z3jWk)b1@A;xN1Ocsw$uxZ&=L5Q`55Tv*d2iBg?TW|W(xOi62x?}YBq)CI?x){< zNP9ALg_;KK=`@4jI|2{VYv>6QSAQRbi_Q=s2e-B#+jL|@bh*9RJ$4g3B8IM8H22Cp zw)Otx22!{QQRHdLPLUL;>uCc5kri7>&M>8e4J9vu?eK>7*T&$Z%Dv#l2J9}(ulhoe z`9l{-3f^zeP#O|Hwi>O4PMMx{&^6Nux`AY*g{p#7n0Yg0G})wKs>+76P3iNXeP)%G zbSf2DkXD-M9s;zw^e1gK6)Qg0d#+B657{W>G&{EYb0Nau}o~NPEvZokBYI@Xb zNdHbBJE-rG^&~Ab4H2ZI<}K1bqv=8llFoRNwxAiLIcV`ZQlgYaz&CwJi%lcfg+~f; z8oCm2NOu6&q>yeJKc)-s13OZ3G?0`8)kYE;-%-wG&IG)efb-{*?i@gIQE*>XyX!y$Lo{I`* zc@+VTjil?Ug#nMWC%tk}a^SpvtOhv;m@kJ$o}MyjwE4>m`m<_wD{lggZ6VNjwcj2J zv&yH)Gof&5JXBnnE;NTKqB@^Y0RPxyKd5nnaxUBv0@7(5pf1NFkyPgtN0F+gVso^b zA)xBRv~Gz#)jRs{Hg#j_?ZOH80x8Z@I1$%r_mDcLd87+3ej@>2 zWm@)zT9A&m(F7dPn}B;0upd*Lx1VX*+fFQcb&?iJg=ScgKC+1pug>dsqjw>idl=KQ zw~uiClN9I0?q(MQ>+HSKU$zsT4oT})%JA+@M|W}v{m?_0MfNGEqkX)8Cl^}QmWX=63kzg zK>R$lANpYaIs&dZOr#6$0^N=`&ypIl_0vdOR)7Q4lVv1R1uyqQ1;b0Jf|W;!8Y@U~ zUhY-ugJshx=a&h%VlL4+r9Vhl^8wR2_z?l0?gG+z+#u2w%^=_f1guXd;BWh*x$}<` z@cvH>5Cwntd*2hMZi%$;5x;50xtZNfCuyfaQPiV@Si?7iI~_`G+^Bzk0rCIcdoH&KEe>{6lEyPZNv&)fE+#Jts7p;|Pss zmJnYpE2ss-{78n><&kbIQl$r&CLQU<$~9xUv2>2qFC1$~H&%EzQ=<0Qexw_#Y!&Io zS{1~U+?|Uj-B{%|OgGjdN79W|S3|n7!rfVt5PuRry0xKYy&$9MU%W;T4&&>f9M?~c zuQ`57?_EE8ufAONlC@gWPxX4)Iqm8{1U%$^8uEc1U`YRyE51zslSPCw3hq>>Z;FFH zr>yvS3l_ldpbY5@ohNvue&6EkLC?w^S2A9?Ib)#pzEEF7>ajxxpU}F`pjJy`f5Sv* zg(?!mjw|{&4`>m2lI7IWHyc_+;wCCqtxR;0H;g}7dgi_bp1R}lsVvZz#;VFgEjKJN z%egA24WmPS6aSW92v9OzvWGGnEwS#oknfLSv0xbX&eB3^;gJ-{e$qfwEQM<+yEj2w zyf~11@R>Z{*H9Q*1--d@Lx&b(r|rS1uv}l^hnhJT0<7pL((qwX17+NREs*XQ8}oDx zrp+0hFgbW?arTrDVY}P^2SZaBAiS#R*3hHAWB!p}u(!fM`>)04r;x@3X^Ko+GVHOA z{MW*Sfz@(nS$N!JyvEprTT=V6H$)Nk2SIVJ^-?7_0N^CkL1J#n>Q~$gWwI;u@h?I>MUEj{(jpxR2?U31JVUR zwalz%Z=c>cZIsS;g?|FL*s$ZY=5Ru+UE}$<(t0RjX};~NYlcFRe;#)Ak4+mK);%yv z5u{TD-ARHjhkpZXWX(Oip8b3>tUIYaI9XU5cVb7X3W^yjc5H54_jld~8FUi-6=1qT z7FQ7pT?K|&$4={g>%F1dK_LA$o>hd3D+;tD>BS(W^^uaF;vt0pdR0%PbcUFoYBAQXUTFkR4qplwiQ5@o`XN! zR!{OEkvOcheh;`aKLgxZyC(jLe7&Q3JXXi9MW9AzLg^`it&{+5VCDDfY5D~GsHXGW z(t4*R;zy?1JA*D=tobyzErB=7-q95>=R@e#dS=4-Q$nCUi6le)VPf(!OM)>t9`hA; zvOeLr>Q}<7nU&@D*RPh^aJsy>{$)sqfKFr)SDIB{tr?4&1T1U;23kmK)2s%YD(j;tys2Zi9^Cg*6Euj@%Oh?Lk&VljKZ_t=lp9>p$Lw9uKgop>v{re!E{1UIoivst zfIL+|xv?JY9ro*xa8Edq!$Fm&CkeQ5SI?+fXL(hcW?SOnY6AuK6j_a&{yCpz{++` z8>RPMad-;)=(!!I8{SWV=D$(U{8tszY_A*+gqbF`AZX+I>$Y$8dqqn$xmF$liBCS% zJTxIKUk|$`eRS}RRi`VvHu!4SzLKYT2Ssge@DYSSDD*o0^z&)v7?Bd6$v-HH?5ixg zy927ld{^9@gz_ABo-RB9nb2@PuH;*2AZxkpJM%vB?D!*{Z!Kb6r zD3iEn)t^A5lm)DKFynL6?tx)7fs(}NH^4^LLK5Q;lNiD&NQ@iXn8YxU#5m3+Mk^#n z<`gC|gt*3=zQ4_#Wue13dA|SCQL|Q>3Tb{b?>O7s!;z$LDIMERzLvNG|dHtG5wzQc3MsneVC|ho9bE7eU z_il|PouH095&9ZFwjYYUdr^)>t6V*jt{WYmGMYxg(0()u9-cB0!IE=(<$7YtSF2Zj+sUbUwtS%%;j&b5seLAd9UzMIl=2 z0)Q93+^uE&>1K;dwjZnOaU0$v7K7ctVO5D(jvo(us_?No3aItl+yJHJcf;8zJ%;2* zVdom(e*?tL9E0WWRL@4)>r|Id#k!2hX&!$XL+NK+_ebw%mwh9c06BK`Z(q;ZG9Nv* zDzLraNw@fB-E-`=d1rd730=mSd9StWW<2-Ovgc@F@1D~qM!c&mghiQSVPWsaeW`+0 zi;%v`#3xDH<286*jRTGp^F%s#I-T{%q$DY2EjFrz4@Sl5b1ekVS^-%`jqlSc)k|sozm)pBEd^w@NSHq@FpOPD5@s(ZjQ^LOMI5+Y8z~8%@ zp@7vUb!8}RJe-02E;9Q|N7I8;*B%Pg_O58c;1UmOm0zv8i&@Te^EUozW_k|7`>@fa zh#dh#z)o4J#~kDiL}tO<9<7jM9IIpDD+rVKikLY3Ov36erZ?FRB#w`LOB1@>BbYzk z2pxGL)KQUmWkpx&m>|NAb@cWtI@0ddn$@165~bBxcmipZM7$O z?GW+W4TC{Jv(Jjp%dGs)>%G8_vKi;8{(M&VOoPZHqxM>b1j}&YLS#I~k{7yc#u`7D zCU=dYW7N2V7(L@Ga#wzZyLaT0#z3!fvlN}>*ayhz#7AwtL}%;8xG8J{;rxfxOOkHV zNYlb@ew_MdKd`Fs16DU@m=Tq!RVvIpH}5AzXPy00@ajT@D%f$%h)eERB?cTjie$KW zkn60Fbw=;~;V?tj1}me9s%E|3fPA87DNfgOk{&7G%STQvCXOj~I?voSqh{;!^lLnEx*T>=zDy=hfB^1<-wb5~ z#-IoqgSul3%6GVNVY|#CBN_b_x{n)3?YKU)2zweqsx&OjnM&V#q!2mZos=UFUTMJc zdB1uuwkbO2Wn;j?zj%!x(3%BmkcPpegW!fAn;Y5`bc0ja5iJNW8i$h77vlfI_^gHT zX*o%4W6_YMn>1zJ#j&U!V?&1Tip z0JcrzU6b83B#7aE6aRK1-dt1wra7-6#X>-cCJCcD<>@rH^B}95HfMRY_dn&yx?X7aM-4w@Ubu?$7albdd zd~K+7gi~+?*)c^Kd$i&ErUj3u94F>z}BnCBVtw5C!6Kdg`;a5 zW<5(N*qEux@SWY#^|8WPUJ`7;AXL&qnh;+`hu zX&P&kGTboCYXIT(UWAuK`wA|3oR5+69BJNsI4rrSOWUlNEf?!d`vSr^qphsl3JBIZ zV?OZ%xf5&mnn)v=+LDyIjI0bjPi=Ha?4v%}drh=ebcWt-SLk$MfSs()wj4As-b`7E zc3b+f3A|v|p9*8DEdX&sy9E%rGQGyJK<=Z=M9}_A48v*!JC_g-)pc~Pm!R*bQJJo&vy^Y4^9P*vAYF;vrwFAy*P5|grdP!=x$&aY4a-xQ zHdGM=6z0RO_3F&Lsao}7qUMX4zO4Z_)HnFFes81YsS5$BP$0U# zj$#tDen4Q7FNtCE&X4nak1C-Lhi2tBBS8z9Kj$~0KeY}0i`NJOE#Raz9rfN?Fca~Z zFWj8RY8B_;#(FL%9V@!5q-^jB&9c7Y3%3W!pTC#dYPnSQ?B}zsJyZsCc&1x4BJxhI zGN9mG(cJ;>S9XOa(i`XFYOfywKh^n3{AAcs)Vj{ylJQfkr~Qftv)}c=I!%a6xas@# z`XGU3UF-TkHF*QGE-2`G?ZA%H`T_OOm^bQl>-p3AsB=(~whT(!p7@38#wFw#T56P` z+BN3#3i~$REBguL4|mqHHI=kxn{C%NE>;wAh^HOaY_r|lL1>T#^0?7HkHZ_Qof=1> z4f%j+sHPFscAl1$K7@<1LOImprCE*V`%xPm+v5jttI2)|LKH2Ok~^Ogj{7Ss1iWcs zHh>x}B^yAiNVJd*pv}HVt@7zg`)}SU@ErG7A8o)BJAlIg(BrWGGysI`2PxO`#4rGa zf))NW9~cS~K8@$otw&E#b|T4+X79o}?BZhEyjIj8*v5$%XIXO-Lja5eUJGP?X= zoZ$*KJ*d+>lC2{==#4V1Uo$>tE8?fD>tudR3rw9$6`vwB%Z6$(EJx3=puL;33s>!7h_lxw000fUntTyc|u+?0cwSMxzrp=&LN!*_tg=BM55&H_1lrnV7fN zMH6wZam#5z{TAnw7ueP0_Kt>p8pDjn{u)a^21Tj?7cPdD-`#qGM*S8{OZ2J7jr$rdJ=& z<+^Dup@UBSxjsJLvEh>4OoRUXlEOQ?Rd*h*S*Ly`pH{dc#B+8_>FShcYjkhzu2kLh zEn3-X=Jl}0d)`IoM{G%0yFXIsSsk!E+;x8AU(XJ7xly{8wRQ3d?s@x}_zl3#lHgtb~GdQkH7Q6r8tGG8jPam@B-ZJl#nv6f| zZ@;=~WxW2EIG0clQwP7ob?UWMR(}6c&M!N?V!qh^PQtQPx&pI5+?{UzyE<~Q`=|3_ zD9fkcTMYg$_`UAkd}go$Z%i#sI^eiMWp!HKWv!omji%?@2f!!o|Mkz#O3g@15>f{Y z4(cDD0cZcz`3na5`1$w={gdXUX7`_;FjwfGn7SZ70dZ+*3+MI6x_xQ-0-^s)3xrTg zp^1u$ouFBml(isre!6BbrPX-PPK!^U(|@oZJU)Q|KK{K0-yj zkGO0hCw)Qcob;qbO=^0!kPW*96r0E_7YJmR03d1e)8}Y9!p+a1IDt$VWXHuPCT0n< zQ{uCbPM9}4B`5vWjO;9_VCEMvP%Vs0ovfjtHxBReGv2*xoVLgV5R+qMPEkzoFtTr_Lu{65;qX~0My z#}73a9S8?B5`9?CFPhJCioGa??O>%QE`H%Om?DMb9GIey&zd7-C1oVVXA28*!0L;I z1!4ndw{ek3Bx-g{dKfbc2}`n*7GUc}n3pt9pmG>rC!``{u(l8h#!LpUz{@xkE+JJw zHw1~YgoxM}{DiSWm@tkwUC0)@2naVP3HCqc@xHQ9$QGsw<5|P7ys{Rs9x_kJ$`&RG zQ?tktuUGKF~=!n|~0 zL56^KVu1{ZrN6ys2Wuz)3wM@V{dQu=JP#%wW`@W_f^ z1RoB@vKd3uAN2Hep}nOPUO#Rtg^352BgqLyG~!qE=R`0FH<$uRg=SOHs2R!&reJusUR#Mj%Y8TBrgO-P#_|h*k*r7bYx^f_JXm&yJ<=3bFxze zzP1wbu7fnSUVNNX-J(86dO&^YhR?0aIjzX3^ znm$y#OqfK;Yj{rPNJCj5v@LlwRpKZM#jXhdw-}#%{KVv+vE=R2OrkV(JSQ;;L!1|> zrE>gOtPwY&D36V$SQ{1_E2VwY7#mHoY8Gq6rU|hooB&b+^4fO{A}#uC-EtOV_F1&D|rn(}3QrZcAz=k9>-&(chxT$VEDq_*T!+LBL_ilj6|aZru` z<5@YA*5gAzned`C;{eamG-BQk-L^uEXb*vC0jb0G68xVUL)D-%B=^zMlAtyq@ z^b3Ujz@m+rT!i;q7G$gsd8tWIpD(e*xQQQ}QXc<%Y$MX%W7);hM?}C#UJBz`$5Pf8 zS=PonHXCE3DfSYJHDc-mlsG5HguzVASp3jw=%Z!M7%N*r=z^b2hzZ3fk~<~5UqkYh zyjD_B9=yDXjD@@)=o3I)W(kc@r{F!uf{ZnLK@dp^p3qpsc0s=*_A$%DnC;ib1lsT6 zY+$j*5?&DG4CWPC+4F5vez!_ipY zK4bD&O3u^7wxx+}OJk(+5o4O@wpb&MKOpulLrB|6DG1*9fsZ`FY;>jwr$nA#0rZ#y zNMBa%kD4O!{>d3TC#@Lv)5{zjn-83YS3u^W)V~LIJL(y}^X!`Qrq((2{ z|5hRX34ZOG^i6mzSuVzE97oW149ZBXv6DVV z2R)7-oD$$E0R7GYrx4&T3~)*tppn{?o2@yeH4^P_1ktZu5Zw{_lR+7Iq8q&a9TU33 z+k*ue@gT1^52DXz{4o55(Dw)nj;4<|D1}Jaha+qOi#BF79^Q#8D4IUg@k2&qX5%ZS z9wVi;0Z;W~;!7KfZRij1gA7Ro^xZBhDNEFj)5JusLDUDQuuQABjn(Gks0fW*Kl9e1$DM3AA{${bpY#+k=oCO&h zi@ZF@m~9{ALluV*vIe%D*=S?TV+>*vSga8>^3LxVL|z_b%yv71I4xt_2x!dXSH#L$ zNm{7_R4@%)?f57V-bo#yUWPZnW6&OWKVv~g8VA|Xek$c<3>pt_A`3F2xEJ1I9fJ(gp6!Mo;+a2LP|RU;H|kC8>h>OD&U8%hg)xD)ErF3f zDs)PB)-jDiU5!D;2A+hVSq#b;MBYpmq?KqL4=?@NVOt0<$+ULjJ634}>i#*azmZ@D#QtYTCLzl6iEc|_Y_7i%+fKIftc|fL7wBKai{|2-Bk@ah@QCg4^Li5TjYplsJ5nxKqk50$vJkmmmS&H9Ux< zJrT5B>+c?6%IxYM??AOzrtP%S>O+&K_O@xl1D<6dgH|BvK@QQW7jNG*N7 zW6mk`$zVll3tcdg#1B+&!KLO_{NU^hB>Wg6+BTfD5)C4eJe%bdO;tL{os{X%+)1_T z%M0)F>Ps#SWw;E@k29Hnpe0p0iPu9l&~Nmo_TazHb$CE zMQppYygXy!@kt&v0A;2n)0P1or=jz`mHB1(Y-&`Bg3 ziZCsUHdcUA@SrIPaHg=>DN=&}OMXiMUC=QFc}rPPtdz+Pc;8|{#zt*~*Mn8k2z3`h zE-c81TQ7LSS&*@^C;rqE{=b50_9ZQ@R;(DCpRDKPrbx;0(oLe?Oet(C!g!X^Z7Gb%Zbs}IEbHjDtc|gI5i`z-HxhltmWh(`{t)pe zS?btod{np`)Q&wUhQ}HySc{-mmcU4xv+(}Kf{a9MhL`6xg+5}b#v1)Y(5$Fv`iRk! zC8YWyEQ&?PCg798o%C78oRd62w4RJ`#u9xH!_#Of4F}Y=0UEI#Yy^yMi#5_~E@J27 zht8B~%*Gg-kDwhqR>IX1L=D2P9o00(AY;NT1g&FGMm)&7vttl>d5|&TaRi-bP?LVa z2e$Rvmvk9k3U1f+31TW^FC%Hx@b+dw#%%k+`*O#iZSWrG7&HlEMkX6KjLkn6-h38h z%xe|Ad~}Iv8(oYt`a{Hi#S&;EG45#j*dtM|5i!qLtPxxC+A=6(kTtwK$XI9~f+#<9 zvjTk9bElN;Ja{R%owOndLa*Jh`#!v%cZ51;gfg~MZ+AhMiC??C;^0l;LC5f^W=A;_T>RQeb0>Jmupna@l%#|OMH}#`=dpM3`I9>Z@!y;99^yd+L=eEs z*#kQ*__aeZ0N!c%K?-9v$^V7J{}Km_#wUh5rC5Ug9l!P|^5H+nz>Kxq0B;iuin)gm zrD#V|0=~n7V%uVkX$klli=9Frr6;8|vQ}GcY+J0c!3o%rCD8W9ryqAp$Wv^m|1mZI zF~d407zyvFjzKazSq~cr6NQc1)Y<0d3M)GqZKlfu1%=I6hhWR0CUUGZ6%I0mjim{B zQ2}dX++f6+bP>inC~SC~sTbl#SXyF05)v<)aum7~`c$%)rR-(w zRrRoB)x-dSir7*_FRBqay#F&tF~8oZ1%vEEN!oDgOSNnB_VW?(ZC9)Qu0nfy2#di} za>kWP)DTT6^kY7(`|)K##CGyk@C~7m5S58ST_O_{>)?ANlXX@pOW+CysH}@h-d#|B zB6+*Qt5lwbcLK#a!mCpLBze2RYo+`J-Z+YNf>*8l8{SvR>kMxvWluPn*9BfjWgmE1 zR<7{6Cr}F_k_Pfp?nAa z*Fg$dcleJflt{4V}|BO#R#YCGY_|_s=@e)wAp+l(i zz zoucy**%o+J%Hi<(koQA)tppY2Xf^}^W8shwFpa^-L}@z(AJ{||WW!bFad11z0#$9C zIS{NUDCZ%Z6%+)oQn^U-4uV&u%$K}_;k8n3k-S6TRV(S-ma%0pyqyGj1^kRH515!J z#&`miDufVTCJ$vMifjs@!!0V$!U$?2sI5#g1u(g`A6;iuJFVBv|wT@r>1tK@&7aYuH$FYU*1jF4~NrGKplevl_aEC zB`pPK)jsi}Zxx~^Jh90eftW4$_$Gt>!H}@p+3{;cH z9cH%$S)iK0+}zX1Ge}K6!##uCgViKA-Q1UwXM~!1viq_&x10NN@`SSpg42`tC6>s2 z4Y{@4y@lKpdB!ZSsCIdY?qY(Oz_EIR+&tXPy_7t&ScIE<8TSw-Zti=yhvEB9TLi~y zmWUPL=#)^TX?bGkbA3G)OGS~ z=Mg`WdmD?O{8-dc76l)p#3>uzHa7{fierAO&F$uXhkL#S3EbT8wt0+A!xJI0nMZ!l zAb)Gi!~H>Dw?IJs6kaU3cCD5!IwKS$Yq;02D!`$ z&zkt#c1`>ZuP$SdE1b-XK}0uWqN`#x82?}6)esx)hYpQ)yM3cIwQDr)78|X}rd^|P zkFmNOP-?U$k(jK}#Qa#JiC~nBb?e_m3|Y7SO~it=&2R0RlSgp6ayKKZi#bH2>=o+{ zo$D3rHrl-cCAH`{Fh4KI;<&pTxpmewV!2~zhG4NKG3>?#VX`#|LiiZ@KIKVz6Idm4 zySeu#&vBN9;QYvY$C_9kz5(R>)f&@Wc!J0yx1rpPIa>3^WKzb4^C;^yw#*G~7(t0P zS#_wMiLAf)b!QH4h6BJ#osgJt3GdadR?zgC~N)cjuf&v(mYF(|{ zbr9~MI3{1ZTK^yR-UTkIs_h%zGkf;T0K?262VvweASj+-P%}`pK|F_s$FLIv$_Rx@ z96aS=U{D~e(7cOIhGk`C_l-oLk z_k7Rqd-reFUhBHnwXSuo^I@-RjaNS=@ncOwbWC7X@UIiEdCa0mCH$ zy@Rlr!ljs4PZlnvoOSl${&Hu}dNPrN*ptb0tS1X+=|DtMv@DHGzU`EoX2uiVtYP_z z5EuRo`Q4^hQT3PW)oprKclU{2RLWu_Dby1cXWdU81N?jH;Q+DqvX(i3wXz5n$p98f z#G4{HYrXH2dk|}EQ6H0gFr$y^B=-f(WoXc0Qtl!?MzV&Ryi}pAVEYm zOA5luagJBf&k>1O8HjGV=;wGBy%dBM{T%P2pTi=Q#`!tDi(cd)7QIZzihfS7q8G`i zYGV6E zBaj^P;D{ne0USffQ3c15h}JFtSx&1E~da# zk5|GG>moFrN!maVU9xBS4O>C?QW!3F2f@@3A0s%{L!cQuSg!)KU`@%rA=23?u2FzL z1{@nt&{ROj2%?jbX0+fFvmYtm0kmqV*|HZrj{&y43CAgN_`>G`ImW@^i%g6w zgM$uATCi)u#R6lY?#V`8bgYsNO=fZGYCQ>Wh&9NSIcet7Fq_LleH2%-rhYA-QA3OJVF*m?p7p;)db zx?ONAfFqX1XbTUh2vFP!IOuGQB?PZE6po8sK@_QgH&Va@aMTlNG};>-OtE|f%o9W! zM<5+cv3vs*ogAYlj*cMG0Ygg&$|IM`gpR%~fk9PnFmZGMaV(7GTfF`O z49YtkDQO3}>ThPt3ZT*fTkePBI&#cHUfc*r97#(D|13N(`M`vJhnI|1IsGkr5GEJ` z#@#KG9s(wYFf{P6z@Gs_$B!)CaEyV2o>)8ajRxOk6ce3hTuhjez}y22;+h9iTBpAX zqw4e@z%8b*G1YiyfmHRSe}5zLoNyV8RTvx@#c95Ju!*4nf^+kO1$zg{h z4-OPEk>Y#9W{r_2Lh?c{YMFy9d-mX1GL9tB9%%F+hMFgRk*5!FgSqXES&?t@J;7|TXr zCIbVCcnbJWz$CooOE_|gls1m(Fo;Eko$aMW8fzxXAb@LFNG^^}G174#OF9sD6EZFg z-gM5G6)b675fRq2hE0%TYi;;`HUM;sgjLX!xju5BziUVvjN90R$z1hxXq zfg|P_Fli$ugZwS4fqa*Ev!Xsu*sJ~f2cYa(y|@5xv0k*Hz$~f29{`J3j-VnyUjssW zCeVe-5Ki(|K;C#bVy%R}0qCm$#oY)rCB;JZa6B-e$R~<>0nem>e}nJM6fl|4&jY%Z z$YL`IJP2?F3q>L0{E%66{L0b=d@Cfe`~=4ba4>H=WVIZoZv+xY8^ywWp8EYzN<4Wk zfdS591I#i2gB5o1In|?Pnwzm*qDQ4&A~w-^O4|KkQ=8r5wg@{u|AORUqtJVpM`TnA z0UpVR&0b$KdrhxJK%8F79&AGWn%QeYEdn%4W>X@O5D=UByk_>AUQ7Jg^jacAHb}GU z*Tiioi3cr+#OeQQ;ua3ku{Fb2lI(0=_O(}_uNk2jNOU6zOVroii4p-ZQL+b%R0I%) zCGl(TB#Houz!LSfccLVIEKw2*D%;2?HYe{Cx16Lo`G+#Zgg-3`&(;&CMd6tsqFWaJ zv?RQD5GKWGNeZ@}I4$K0TTh%8x75IattUhd;-pfhW0T6$ER7(OqLtSZ5I=kzRgK9; zaeq}>jZPN#KPHP_Y{h#mxu;0G1#<|PA+DwAtC{LL(aommGmTWUBco{gsLEm<6we|8 zm+5=OvrJr_uo?X_wjvQ%C(FgvNjOb4RZ&J2Ng%IiqL^$^OdhLOv@tB&DAxZ+OCr#I zzABb&0YtIJF+e1u$uho;5?g6;Fi7OYnpV8D4e~dNeW!>4d1oS9D9_sc4bYy!8q6voOX+ZB0WFzQ3K>rJnMT-IP1fe^?(J~#-If7_Nu-pbn z!0tO>jshhD4k9=^Y*}4hH2!)(pp8tbHVJv5{96L?~7&wT+2SRAV;0TAq3T5JTA5RtyD} zAdKlYfH56-Suv!jJ~I!B{}q5`AiQ)q920jH@-B?R&H^R~7>gSYI<#YX43432uyKY? zr#WF%GmVx!c(8FMHWN%OtpHO%$AwP8do_sYteNV1qvZwoEF~W{BIlC?Wyb#B0n0|@ zf5X8>WG-eksAy88T5Yr(Mk?+HY&i+X1%qk|Q0C56Is^ z{<(lU3E~JU2c)CCd;yL?IAZB^yXA90RzO(m5qKV80>C&Ia_4EvAq%p83=wd#$BAMX z;OhZf=&0rb(PIiluo7?yc{~HhIymAMBXT;qWSI@jM#5Ce7$-0fh=JoN@J7HpDDbOr z>?YFRKuYJ6EN#Fv5osKObUw-QB~b4WN_t|C6OZYr3*#U%l21))6F@qxWod?E4IHt0 zLf;1HPC#)#Nk@t-Yk{HjTcAiLitT`(q<|m7@lOh9B{Us&+)re2bUcVo4OxB#>Ma(M zLI+X%r-MPNxldEC_m+>?Psgp5@PpeMJDY_Cm~*P$@u7YNVThg%`l#ldz z*htj}l)%t-L&PJZn?eoYH;Vx6{0ynUtwJE{W*_Q?th0hZ1~}R|0x&xUlcs1eWPQ;o z#*hntmEwC?`X;D~Vga`@F5FPsP7tbPzaSEj&JL;Oeor2IWFd=XA@_I*xkv3Kjt# zlRdCTA6&$^Vj;lNOgeY=2qjUu)2RNz>MQ-#po0>3<<^^v*)IB$bfH(5ttrdPqK zP0&_S7(Itt&P8Ai5Cub;3$!Ys!AgGagJU0zj~ep}m?1DU%*#(X9J0SR-U#-z;*NqL z#WK<=lj9-nGWj98Kk|P774|V0+}U+mx)I<-t2g=S0xii(x^bVwB*2eoJVI-@1HlU073bpbC4C#)MX6G)id_0YC7h#C*AdLLT z_{;J0rW=4bDPCD)R1P17_~Kz~Fr-`~KQiA?Dct4w6TMPSQooVYL25Yi^XwJyTfOi; zNVojVgM;b?#=RA#hSxEY2fEL||N(ix3-Z^DosR9_g{Od5wYk%C!0%98R* ze!S(NtvUI*l035i5YYaS+%nxd$h;ngG7ufhm>wvdshyxMS2Y|K`^B7 zCO%&q09fOgd_u(h!Gi~k35AD2CzRL=4a(>JH-r8(bOQ|O=TpD&XZi_BH?>o_T)gZ1b;uxj{&Tr`7HI>Lo>wUhY5LIG zmJ}VjVP;@4F&l=|5$=XDVZqQBh87g^6NHsn6bywYg z?gVf@!2AqDYGm>w^OM!+y!jFx@sSmdrd~$AzZ#Cz14*w>R_c>A`jqla0F9hJl0&Au zl02jfN7`<(2AizDCi9((X*K!DX_4_8fg`0XS#3(*gOL4`QC?{wh&|fs{T9uauV*Z)B|-Io(%^{|oS;rR_j0lLo`c8zE0ic|ht=l-Ke@ zdsy<`#^Z3y&pU8y5hf6ZHd5q=_>i_3DUy-?6>Tish_yX!4v<>XDHz&DP{wl==ty-- zR>zY0GA0@22RaOlm#j!d{SwtFC7m~4iksq;`?1T>%l*p;ulD?(`a{x9rg**E4R1wV zg&7zv?oG&Yb5mxgO`-WZ`e_b+oIIuxPQ_uyh6i&-=AwBSjn6c1#jUg#iI&3Ae22zd z^o<$u^cT+FUH*yo)yu0?_^cQ$!nE;1{!J3B2OYt5sDd5`Y=WntV$nk<_6cs5 z_)*#j{y>6h*NEUb(Rkt607LLV0`Sm2KEYo|odEli2v~=PL=T)OQ2{?L$;G}O z0Ujj9&AxR3u9C`?_7RESuxPyS(DoX^9TI=JJra%{WqYJ{_g83W&w`?s#N{Zvs9i%@ z2zlVg+A&bfCf>+a_#p3KsGU=I$~Fp5RaI`^W3FE~{@GO%O8eye7J2;kjmyl2WxI8u zFDERp{%!U8N5((&$b{`Xt^H2kQ#yCj=d-5=mv+9!V- z@sQitc|+Xf>vkEcZLVs+u7A8=aqp?Nepg*A`e{~tVb#*9BPPsUz53a=?oIvYtE;d2 zbqX@&Mi|=MD2Les^AyZJn73d$U{1qmk%%yup)l9L%!0{-p*CC#vlWImvPgM{)Th3I z`3=U5%;^s^3T7(IO)#`!0+t+oV3e9F?HCfOAf^XJNSCu z9b;kRnTh~}B4rMV>J&giky468#k7WiB4H(}T8SzJwp8^vi5DeH3P>7D#ETS}q=2*w zN+{aqmQcx(sC0r+LXnOWQ9X))68mg836%kA3B`1{fa(NZ3dmHafTHu75{jLI2Z~O^ zNT^=`5-<7`FQK+cC{k~bP_v~NX(Lxk5bZnT$C1{UB*Z}}Anl_|0cm@esBVerK~(}K z6rBT>sG=nHw2vwAqQiznMXGQT>KTbW9ix?mcuPWMT|)g)lhmQPQPVo}fB1nEZ1^SK zDtrUe8#J0~h$Qv6hb=%%Mg)BNGz;Bh5?`WUnA z5B%vnNIv9IhL^h{`XoWahwLxQJsFdHgFaPlyG<24eyBl4$n!A=Nv+7sq z`Qn>0VyE&{{rS7XxkS2yykJ32DJ~x`Nz9^qV-s+Zd1Cs~C8f9|yCiW!-m<(x+&5dC zIA`h7LfqetJGVu;3F76@2`d(q%07u@CB=!jYdA3>A+fL^7dMg9b>-|%^TdKB3ku5? z=KYlzGYfM{olA=smn0Ts<}Y26H@jdl?yW9eTAWZM`FM#pd&0H9qf4?S3{NOocpH;T z5+D(mEhowsa{u>BLs!TD_e+61`Tv9viP?0OdkKaE=@RdR1yrL;N*CfP@`QZq^W~xw zDS<-^=)p-BvWr-+d+@=dhhF35#t@LrZbU{1^rD@O>4$L-=L-X~+ww&{xa< zfW-3fUsfiB0y9j@*Fuy){@m(mEX$1AvEZIS9#zN@6aUld1SD>&pwse(X)g+aZowyC z&^@P3O-*p7raCDxRs2qHIIy}^@JSN_uLhq~!3d$j2dUusRi%Ot?^`OwAw5H#f-V(4 z*X0Vq&k26{f{)0`308qxemAeL5DcQIK~8XSBJyj6uth@DB4mFml7O6mts^X7u#Yi3~tnRfvRogKFIg%+6qDUkr3(@3~va1Hwh8?MHvW# z63~to!mbelz#>*VMd&+47<7wp74j%w=mcBm|6s zq+e<3gh22ah!p#4M+gC^24nTn+6rev-6_g2{>#<+1ff6w@LD}8k=Ci*B=|!#{zX9# zf%rF9>H8p7_gYx~NC~f9C=BB()Ks?Ltw|Na_16kM*9yKi!MKPDk!ocenuia6r@BH2 z;D1`v3dt*VM>GO(Kjl?uRDf$N35a5O7o0v>f`;F6hkhTbW+{T-AoO_-ygyx&#dyc_ z+Yy%!{~2K4d=?31oE*s`ERrrn63RcSJ^~S)tWoIrN7kYi@<&x!i0A>~h!D$vwJL$C z4$3A`2pl75|0N6sb&&SnM9BH`8mADde@?)^m}=OMLp}piEBfdVA5~eL=_^2FGlV4;f-MSsK6Hp z{*^*>KGM~s%Hm&Nn;;0Ee5Bp!EUinOwvTEszlBF>`S9~mq67H9^HgK__f}8S>QnXB zovC$BXI56}w64@?&WhC13TNp)WE(PdzW$i|sJ0aTsnhCG^?lH|(Fk|&l!NW7_i0P@ z&Ye4V3WAouYmL4O$lb_Xfj_*Kyi)h=tV3$}(`tPydN&r3x}tW}F0FoRDFQHD1;Zt1 zD-uelZS88!a-#A<;%JorF#b1nm!RX_YeY%+IqND&Qm5VufkaUeEw#q^`UW>Dv9r|a z+=?WlQ~61)cOsQF2-}6`eGEr39z>sOI4T6AMWGnXT69{ikhgXX$*^06lt6X}*QZoZ z6%VKi2}QzHbhW0|okHv7_p0FUqpd?%?G{28p?rLgfY2rAr=e2o`2BhMR@CZ1{sG^8 zLhxwBj@m$#0lp?J|7}?*1V|86+8LmV(TK+o~ zGD631UQ1cfbt?6U(^SMW!2QSoO6|^_txo4oEuXC4$DdPYAt%eS(8y3S1Ib32 zpTwA=Ju%io@JWc4YjmF@;74cC`7%@#4mMX*~fB||%R7CU; z$NbRQpttLz-6dQN$^?wX74Ue45uk87{H7rv`|cC^pdSfA#2AdwQ^d2e>{E=KtlLFD zB6hppJ>tWdIt1`XSGV$Rw1`0)gpij7(;|JQSkda7JAt)m`IlCqqM@U=l%wK)!a0#0 zJJzAgwF$xFgb@9;88pxpSLkT+wXNtDuN6Ya3PJax|1UtA_>Van57P8jZC8aJl`%{2EJgkztFA$> z!lxx@>!?ZYYfW{YqGEEg{_s-{v!stuhF@#Cs2cDa@{XVqnD}4BN>F;FPQMkMNLJle zsS801+S-LdeW4IMRxsIwz>fsKlj!nFD^jOrp>q@~)A@z0QuCGlsAt<+x3g4VA^Xty za25aKLIh9&uIWcz(5funvx-_5`k2i^ z7UYhFo4<)r=r<%lM00%C?P!0#W0A~gYF;}1Sph93P!RHku=SX}w4${v!X%(V2v5KO zH(GlH17V(U6(8;trm|{xtuO+0D4j-#mmv?wf6Q3&eQ0RkjAr_GNQ{0fOGrSMpG7^U zPbu284_da4Ux~q0A1&xM2`Uf5Ze53|o3B0?@y24zPUrJ5*ccE`l$O5@eVK0A7y$}Q zdOpMnq)|(i*|496EuFTGMkno$i^d6kz`Tx_Q^hf29;MG0Qfe?RCx92`*n9zExsCVR zd6X|bf*cIqiOE9#Rw0hh+y@~xuiGi~_1z@sE5S8E@YN;>sz-sJi2=y>OSI&$or3YS z!0$f|LFQsY>-(`F%m<&r7};@Ppt_H^va(Pq6P`mGC;rR>PmR-DLkCtYWw}E4Q6) zqml71N%%*A_om+>;qO%7Z;|lR6nw@h=mr7ymM>fZ2Lj&iC7(e7e;?I5{AYl@<$DQf zrhNE2Y@|lmF2P$tM|bPs*_Hy_-z5J^ukeJw1F)PA1TTRhehVc#OR`fH;o>BG0Ptoh zA8*3Gkp^&(7knYIxBpqt5dUM6{kg)wUBbU9*)8NR)f?jfJYcIA|K}vSClqw`fDK-B zcPrp(DVz)VDN;TW|5bp!`IiC?_u{hzaHtoY4cI&V(rbZQNUdac$Wg+s(_*1(JTI&74S?29I1f64elNO za|QgC0^X&7pH{$=74VNiz4^bZfIS#2s2pk)czo{dm98)aEFc_>GrtA)raPm6zeAZ3 z|6_!g`gJPDgH)ElH%ay@lD$W=|0&teN%juOrq96?ZmVQJAlX|ady!ZC^obSMclM-% z;0t|v!)Fz6ivr%EfbUnpV-;|;0uEKc?*{aa|9%Brsenrq@O%ZFp@6?O_vXJ@0pF>B zD;02-0-lOv1C-xs3j8PqY?bH&6?lIIe9_cfzPAziy#uc!= z>Vu$w&l`LDL)E?){d)@dbp`yY0)9>bHz?pa3OH5)_ff#-{d>#vr2_u90-mpclNIm} zhTiR=`&&V7&tV*|#^p;|lm)1^k8rzFq;3 zQNY6$@Yg=Q<9l5Jc^yOHmnr-U74QNDe6s=`set1YaHszr#KCXbb;9DulwF-D|xtxII^&rW4 zy&~L9DI9Kp>LuS`1stM)FYvwTe^kKVE8wFF_+tfJu7FDw@Q>==@!?otFL|F(z|{&E zCzX29pHcOOI~4H83iu%f9HoHY<$CjbTmf%Zz&Iw=OP(SHJQig|^MmwM|g2AvDO#5YoA1T=} zl1=+(gg+Q9+Rc(pXJrUKSF)vjG0kKNK42C7J(3+I+5IG&m+Xt!$00r^B>OALeqXZR zk?aQ~TiQp`Tr0toB|BNNM@qK8Wcx_=ugE}(=O@YDBiY!`VR-R>l{n2AoLMBgcO?5w z$$m<*AD8UgBzuu$r%HCRWPgR@sKn<>$zCL`=QIl>Tl~WvPBTe@he$S^@27B|;j9?h zA4|5sWYd)jg#QI+p2?;w7sx&$+3!jAvy%OkWKWUo36eb%m5;(rm+TbDzDlwUlC78Q zU$A~)@k#bk$?lZwcO?5w$)@!N(bJs~Wamis&60hsWKWjtWXT>W+5VF4BiRMe-y%MA znFHBzl8yBQgL%omh%=+)e_XP=Bs)y9gC(1;WIuxjLhzH4eGkrb5lp&HWPdI8 zqne|VO;;=8n2P2O36_rMYC-|iPm7ltHr>^OpXLj^2yT<$e@XULoQUrao8m!rW%e1# z{y?%{k?e;hd$nZWB-yEw9WL27fIsn*kImBQX!1k#`jpHG@l5S z+%#9>B^o+k=P%)D4|EX4g>=yVDE-$nxoPit1-U^-`^HD5uyp2cj6_fS&hy9(8ru7A zBsa=~_PJM+8)4`SV5j7!zKo6?lMX!HvyQQYGr`caS8~&tMLPCt!dX&osEX;ro1m9q z27NnFI0s4O9O)Iy?nBJY(A?i($#~L>mfaOz?ouxrpnGVA`FYX%d$}L>qNk(E zGJpCL1lir+%e~agJ=V+3WiQTKyr5_$4r3MNEy2&dw_?URr$l07w@SbXy4}m&?Y9x3VRRbKsI~U__X`OG=9i^Og|H zlG2<7w`DKLzb)IDQ&7ldmn|tQSaO?EP+*rX_#IZn;ke&|rAwR~%jA-RRe4;tv$VKu z3C@ASN$2KZ6&5aAoUmZ=LNJ%1yv4bBIEl9~Ve!(1WrY;VS-{B4iu1Ca#d*MZi?^sO zr+A?li4(S%o@^2!51@D0oI+p`c+ui)q+iUvgsUz&M_zJ{xa1su$(eM?X+yt~lsMdG zz4RoFOul+l@`$Uiy4q^J%9aEV(L2dz8#QvI)tWRiWu!>&@Vzx>Sx$Cw&hqS>qJo5_ zton0r|MKkxG&|~3QLoVlz>LI1hqH?CD}=br^Y;-@jR76m6rK#ae)eReny;Y7Cq3EO zb0%iZks;BhK8M1iOF@Sy*&5Cz`eNOgom)^!XLcn-c6LU_yy>zp$GH&RgZ`(D28~PT zUastHxr{}$l7~GOY6bABL&tb!9t-nw%NC(#7BeQ<*%Pi$n>DE?o^{|sDlG3%=i2*W zNh4Htw#b7jf(ZBKkvI@KT}aP5OjZ@o?|9_o<`(BIBc8o^EX3dv3m&_NDL6=3OITTs zf+bE?`br+vNW(5vg!TlHhZ*HU-7}uw$x)2s&vcqq$s9*c7pFi|eY z14-fjmd-=*a&ctoRICjAK>Xn2f`QjWe!Vp22;Dd0inQV$-K0hy>{ zNE$s}`60Cz>Yni^dAtH1q&H%?ntY*~03K9d@bvJA1AwU~9_pDy51PBJ04-q-!=|~5 zA512U_e1F*)5FZ$Q*sv}{N?=T)*QWlUhQ0c?KDl2XX=WpYiH?`Jhj73dzNY47kt+S z-L>{d_eFJafct`fX{7stsmySquloXDCb&KN6TI7_aW`wGu6+BJ?3-JTpFn>PezU=_ zOkX=mv))r`t(|VJoolFFrcb(96ZBGT_`hoVUF&|6ziUpQYI4f!#V2mbzVYT3F_8PD z;W$ZqOYKB`tsS9Fl@9={z1dtlU0*v@Uo*Ws>0<5l?pni3rad#Y?&b^bUkuBGYq#9D z3uLNO7r&^TZh&X4&xv{NlbVZ3wG#~&NA8_{JPUHU514BwcGqh5)^bzat^8d#g{s78 zP9%zB4 z`;9+f9v+me553lRcy9HSx*%)%r0OTQu;JsorWor2`X9(ln_0fG(|z<#P0}RoOjN+v zQBnJCv~nR0pEw3Klg5w9rO9wjs!JbzI6b+VAG0OBUt4TEL}ZPRvl8^7)_p2;+xYSSL| z7{6{aE(Sq|ak0mE)NDM)nZN5cF0M0v=P;f|D9*H)A~hZ7>eG`U;TGP$w`I)k@-dZe z$k4BzPu-n1rjj4qz&nhc9+DG(YJSFS{IbzV!go_dU)oLITTP3t#vdKVV=Ug&b;e&n z8OdqJR=QIkPETn|@3)ap{eZ7CL6T0FkxMgmT1{VN8qYw6OcLNntLdoC?e-gmi~Xj+St4!q~knsg>>&WYOiMooS-HwVA$m zu(&+N@6EZvswkgW ztyoc2TBKVQuUnb#E_PIv=IdOMUE3lLsX{;PjQGS8-W47G$+qxMxX90=BR(yUJd_ss zNke#hbi^my{6X;PHvjf*;mu9qTywH%MMYIB5xc8uRDM-agRYc2939>cIaStU<&n)f;YXP8pCh82@Z+5kUEBN*Y>PbH z6i)FvBHv4kI;8UOu7;|jx~h_R-Ku=|?XId-+$l&B9p0w09*++1>I^?rPBI*V0Naq3 z@MEeh_wAmltjeqPaY>C$Xc<2e_gAy0@RB(o?y3yLy1Ve`|EavFLDA9|VM) z@0CY<;-G><@_Pd6m&I2>l2I<*%J{0=QR4Acqinhr$SdomQf66wI4!by8?ox>j6k*@ z-xiL%I#eF<-nIyCRb3Sd)bSq*nu=q2QPn8aD7~&kETAd6<+dvo5UURn%}uCjtWq^l zlG`rTt9l)(sH2XhMZ)pPwutU>|051m_;7&7 zP$FqWKn`5m{aECuIgzNDQWH>0yMyIzebsUsY7t-Js9LVqt?H?b?T%1&Bln?pbjk&k z;5shW5%YhG?|)M9S*hh+!}YN*wr?gUy3jgTfqUC|0=Ow2%~Xt$G)@Or+Uw1RzzweW z0fzGE4E^0cs^QU7254yhSz{IV(}u@X`&bvQ*97+8UWwP2mD}oq`eba}=vR3l!@Q*_ zTormaz&@d_sBYxMEw-Q6&9q*u9IJ_OSwr96^kj9P0sG_YvhBVLIS<$cPvi`vCvns2 z>Wck8w9fdluW)LzYrWc4pQ5e|U*)?g)PKUv=sx_d`Ga3Ooyyri3{T6{cD$tTr?2nN zt)CV9$&&>K0&Iev7e2_GLfe5{;FF~oSQ_1<^tu%;9lDQEQ>xH&jVa=j@oUE@+ot`t zL5DH8yFpiC)uAmGV^nkKN<|P3fG!<6Zw@T)I_e-7@C8*ycw_TNfswn6I$M z(fT;2vN9)D#&rYLoI?U!(eG$_Cdgd+R$skKp1E#F4K*|EKq57)Ot$u1Q_!Z*LHqv4 zH?ItRbpL^zpMEY|^X5m1JI+6saL?C?&Kn9xJ+a&e_idt0M!vOC`Je7xcGad*IHY3~Nrc80ER3T>G= za@H)}>zT1rW(N6eGUKv|>vo$Dr&;y48#GA@Pwp6e}Y?LMnNt%j1pl=bBeKbmraVZ3Hh{%l#^R9 zY0}i}NmFOdo|Bz6ekuX8=g*!;_S_j$vqp_1*PJO+XQ!uSWH8dS*>hy~>^T!;XJ#5v z5W%d8lc&y}GjSHVGe9h}oiK4y+T08V{=cp{ohWO;(uQ4jY2nf(i>zf!N(vS&$y;bG zSW^1eaxr_s(#4CHE=kCrJ9WmKO^zM3FSAhomGQ+oD91G>SRNd&KY_ zZ%9I(BZk8Om|0VtVDSEX^x%7UnD}VSA5k2LM@_Q-~~F3}tshJ(d|F!0l9kq?rATI8F%<^ICASiCV-K+ep5!Ef zSa|_1lW;&e3riQ~U^5qaTvS>NdXl{qi@88eN4=GUBH5Gyde`u@_WOLA4`!HObXGK` z1Xh0gfVHqqlT$k>O;zHT&T;lkV+<|qGb%Q`;Xh+Mx`c2Kj!dANaP%3O;hE~vaW1-i zYr06|m+TXy;%pqxd9Vg_rSWFHTkA68icQDiFs`$H1g9Ckh}*dEZO(e=VO8dRDZIy4 zqV*Jjpo<7TZs@8=IH^uNQ;~RHom}Zo&Zy8l<`J@R84!4eVpwwdt5SyMB3eAW4Pvx$ z_U1_5%KI2R9a#ssd8Nj+Tm$WA*z&mnIrpgQ($-sBW3-L&Wyf_6`c~wcXy}I3$cNGn z<{bu?AwiQAlH|&J+I3uqAe3HcIxFp6n z8|Tgq;Ip=luGTc*BOP{EwJTtqRT(^>AFH)%a}c9_XfEex_@Fb^wHBUSNRkIpbeOB9gWeU zT7P?(zBbe|+^3EW6+}xJVVnv8~vUBzuW=U_j&x4SnR;wWuViw{}KC z01wILdO|y}+{9t~OwN;hAC@PQ*gXLU_|M2iz&Hf7s}Rusymnw(}{&_Q7va@_aE z-*dxW%F;TLs%>}E)cVQ8KBWxI;yl^~aarmCx#I^ok%uFf7WFw}_xoBbpcrj_M@Q^8 zR6_iy3@r?8 z{$k(_IW6W8N2hN;Z6oJ5uie&FeqCephMdzr^V;k7rp<4xn7_MXeycibZ}W!Ep@+wZ zAnRVx4eX3@Nm=K4&wX!ufR!MrM0N;075F@IyMZcyREK&9S4a&Ob$EkmM$E**ZNucs z5E9?fJeXZ^OuolVGsaIW?CkNK9{=!xJKM)!Bi5GJxmHJz`9KyLY-4nN?bJFmctZEt z%GvQbpNb=3{k@KW8+Z8G?5w8w4|;e)ZF@zE7<^li-`;A!m-p8Cx6I!n49SnRrQO`# ze)5x>S`WN^)4^|^)cmup`mVSB{?-%U-nH}Y=MKNNaoEYiC5Nni`lt1o%jn)~J@o1E zCpB?M$}ZI28xZFRy(|1cXSg#+HMTlExw2*Bc&r6i=t}BuH()#DTWk-wj3W%=v9gK4 z`pIb%7@51@VSa3D`q+*9*uyI}VnKh0Ubk`zR@=H&Mf|cASUy&T9S$&_tTT4nOiOI0 zFT0K1nZ^<30}-EN{T&_AoD=D^)r@(CZQ<d0kZ;tjz z9qkgO)U)^AmgFtsc2r9uB0XO*<^$S`GQ3_;Rg_g#T;!(KjBSa~s?vt4u(xNMzGItG zU3Ijt(`hwgr)q>XKH}3RT2Q_h9gZ!EPdl&&5b=#F(iu84xiNk8!`LgzjFl3Cb>0dc zbvI8VztNR&e!j)=NQZ7!R#AOAHfsNt6}Ki$w};dHf~$nh4Tr?(opilAqqHb`6 z25LP+%i-1D#9KUep(tXCEi)-Y7hssfy%Vid`83ztxKT-(hpr|PTuLdF1ChYx9&|PG zx{yZo}H&ux)VeFuhm&4AwaZT`Tw}5?%8v794b0*Y_XkD)+V9s&o9t$FRKE z-jppD$pfmr2w=)_d{F-=#}&ZA@_v=3OhLx-HD({H^);sKM&C4RyP*@1715>UKx%jonqK+h<-Ic0PSq zIX5eJm_7G>E4MDms5+Z#Tv8r9D~3B5?YU)3^RUL|8}z8*?S8ZOf?B~X+8pmpT?8r5S1^ev;(^4lC0-1a6-PNv&Oy_=f3 zoVgQsQBAk)p?CMM$XjGpqdM$lPleX7s=R=`_ltS28S-hYN9(*9ldR}$H&!u+Y zPlC`+c$9JFH51mLofy&}>A4mU+KE>4AgbH-p0nQVgn8LtvuYl(Wvc4a>U{WMb8um^ zeWF{qx2R(823e9)kUiYiq zMis9|M{$AEu94F{S-YRIZ1q?4enskO_Nt%n>j}{eG$7zQoBLmAZ)U5e$u-2CP3$}! zpAzeOk#+U;MQ7FR_q0``5p~+Q%fc4{aRUM|u$2N1E@!+&Aq49Uov%j#WJ4 z6sVcO+6jHP(`*@^v?V=l%Y>Ohll`}-Ztf2pjR_NBU$)K2jU^im2Wu61JlLxDw|3(o z6KgZcVwJVW|$wm0R&yPG_EbD!nVCdqoV)!>}i8}|D-yQ z`7e6cNj2e&#;Xm6u*UNtd%uC=ME^J8I?tsxnAgY{ywaP&pi6D=ENg>Lcr(ysU222( ze~6G5?cY)xw4V~|%MXF94L*42!6fSewO1Pys10VZHaL>nVD)RP4eI}mI@{R04b}-= zeKA&L_A&G^%rOjVGB+_GQo{#NpJH>G4Rh>qO*_);m9_x}*K~s_bR+fWAs7>bG`Y=~ zZd8Zy6+lfXAt~(c@0^j<>Z-Tu%5YfNTa6yeg zKD=YZ_+k?C2J1Sxz3tId;ZviX4uB zx(n+1I0sxWS}&-rN5jDHrq%0InH`m3{P=_&`!TvMZ06cGb~Hlj=)SEz16GsjC5q!V z8|%*ACN~vWUGpv6Lt&Al92h*uCp?H$`BytaT?B03k1@6$iA|{9&wUrR{GhAN&vwqw zRZ)a~4|zfGH;FDk7y6`8{WFV^?Z<^vJq>!|#hk*Ruy7NwQAh4Hwi6)^O_j%F!22aR1`hp|+!7 z-qKqlkyVeCpO*)P@Tk2MQ<3f>W$D8h)M?l_qd|>pd?2TVPo?mW|Lo^zcj-5%2uT0M z&vBm%#Wux#&aY!s@gjr%L(aXQi|;;Isj{nV$mI`Fc%RL{YFZ^H8#8vt*q@G8#Pn#Ni5UVga&w zL`A>GW;CP7OL^E-u^%y*p0%;D;B#_c%EQlH!C9D%S?@V6SCD3o)%)sGsQ1aqE0!H} zWtqN65=plbKqZDaX?u~a?F#op~SuHFQ%HuF}i;h8}ip~qZL9G%>-!pZ)9V%)wdHBt$KaGOACb* zHs*820uWx~LGr{V6pl{&Q(F+tSgR*~(AP86-KL@b*05UDu~8Keg-&0UM90J~H%909 zzMcD~Ls+mYZ*Rr>?Zb;yw-$!I;u!j(A-l+OqjtDHbHSTM+NP|+ur}+IyN0Fr)9l!l z=W-Ll?dI(V?`txuKWHD`m1e`ZKUP0y!J8dA;xIls6m#Tw%`?05Z0otJUNk&yrujgy z`bhimz2iNW8#iR>F*mUK5$8f8PEXK4hW7OwW)c4)VpX{MmG$Zg@zd0-Ef;n`pFf?eJ`Z>R>nbvjcIi4uhk!w;ej+kf< zQq>1LK=QA^*h<^fDU;5%F8D6SU5G%E}Rc={MKi4!04iPToU4) zAk|Eb<6;+l!c?a(8k+Q`vwl@<#!nJq-C9~)fW26bHh+h)V`0MzmX=(N?+G?;Sl;4- z(qTBQ#tmCoP(r7)hS5pZVK|<Ga=c61e?|z`zRrQzhDr3 zz+evX3kGw_pD;vn=^KVfEq=scZt*JybIPAF7$ASgV1U<$3{L!>!2Rxn0>?fLa6LQw zv`@{kj{^w8zB(|B_<7(G8T%-}=#oZpA|QSuxI}_2a7HjA%#U{c#ly(V#UkwaB)~D8{84~opAk6r z9Rb4PLjs4bkpf~^!eL5$Ngf#>n?3?CANmR)<}zXEI{-ry7GDB5`V_#i93>f8#7Gv0 z?*a7nk~Xu|IIKtZI2aX|nFedJ=)}9{p#xbeZk7xaC{oS37S7DxzViXn2|r>@whKnZ zU5__=h`Inq#Z()5P`5GEOa|jcR4y2=SSgT5H4iTK+>iGNtVk#-vd6%9MYSH@55gc} zj2tgQH8RxfUty8PhKid#4AyYb2_$=-#XB7+HCI+7p*U3l{(v}8;EiT&KV#=QLx8Fe zQQ$sTqo3bszcGGb7|-#>aDS|YXcJxt!My~$QS{Qr!fTwLAEpfEuy6~!DJjZ|EX$+Vf^WiG!@rHUfcxXHH_0ExTgRWmThCv_ zTZOB2Y3GtOT-4*VA+U5BT_rHWJ$S_f=GSNwVChx5hY0;7Ua5p$s~rzZtJ3|G(68b( zgV5`=b7AS!x;F^@0bUCU?b6aM>w;R>LFf~B-A?FoEiHx-B{pH;3-@|LS7Ag7ID=M2P*D!6KHBhhEz`fi_9fElw4V&>BTa4rSO@IyiQ+yyX` zfh3mijQ|i!1PHE=P?qw4-<(?l6MrtTkve?0{Ys(h*yItrnCfr5GP z@*&3xGyQ$4K`1uSpOaFC3#Al!G$5)cLK#IqM242B`)f@$Kq@3rSPoG*+-V7}#8793 zDXG12ASYD9s{}YzhITb9L2Mm&66V^V$KV?wqQ8S)c&I{?bFc(ceIe(+ zC0LGA0)H1Lro(^fPdfa;+X52=Ll33nN`KNpegX`|f#kDxNNJ`HI{=1wK)ICrXLjz$ z^f1j6^yeAB?ysIW;q&63?#R>{pJ`n6zVI&p1pVR0hut@rZ~KIQq7b-)Z&gjCKkUfQ zZhL!8`Cudck;ki#B@c3alkoa4-$$Jt4E#f#x0~n>Is)J4pJ;gM&7bK{IiQ5cT>~=< zCJ%;sm0B3e!(A|M!h8<%1B?a*(HCYg%vcy|ZVO=O(|irg!!ZAVX@>a_<~Yo+Fr;xv zeH(tP8pp!MLv@i*R7b_BIg6c8)P5u?Y8Zr~mLgG6g(ei$a0x{nE1{^Tl~B}85~|}8 zidr7RGPO*N*t#WR>NSa&x-uzZ>UIf5J+XwM-hoimT}T0`>n0TSW~q=$wR zLecmlQPHSCC~D^tFB;GYMZJ$i#ab~y>Kr6gf<#4QofMFUKnh5sqJ;XRhW7iv)j&8i z47CjCT3+`5FldaC|8GM6--vMF=pjGS1D5^M75|q(#b&l|Cl!*vD%!l47BD~^4uarbZ*uJRo% zm~LVhi0Y={CTaa)y48FTe><*6$918&o;WZS_m-~0RUfxza9mS*69VXCCHfBp^9EcFi%VtcT77;1E?uQN#x=M> zdzzrtj}!DS;U@GK*OdxUcQT(St!P^nHZB>?PZjjIH5F`Dq_Q{>;X7P~dMxHR_}ece z5sfp^vrLP;8e+`I!XRgW71HMPh%N{BOKMm z36dKY)0-wd)nQtzn9$PfXheDBMv;&_H1(2okOB6%p(rZp8eef)$&QDy;#aOKan_LO z1osNcmW+Q!UG}f*rCybkG|Ebk!?&n7uP7S}Sy?9)N%}AArB;qW-XW98rcsp)ji&Vc z8NJkVl=oCfcs@uL!(+1IVhFtclU^z{H;)xO5V1xMq_F>!UMlIel3uDg{*QQwI&xRi zOT7plFF}^;z(er>D?YNW-j(!H_r~FW&OxmoB8TX)f5+oWdZ{xJKP_pu4eJRjJATLG zN_wg8LAb{infX3#IN~v+V1N^yzvFQwz0}{N_@|>@D4yT(xRPEf@u2qh$2>$`&MWDq zUI33)@R;$3a)>;xq?dXS`G78g3mK_Mi8!ZW$ZYiOJ^Hbi(M$bC;xYP9@SqKw5^z=O zVHy+B&X6Iu{0Sac(o5ZJ6Vvhq4cNUOuX6cgz0?=MgO;b-QN0=HAs%6nZN_wdt z@HhZEGk8$Mt5L_qH3tKMxx|BA8^GY+I@pzTC06VnuUW3Cxz3Q}shJ#epX1RnnaNb(ZJO*C%O!Hm!f7bbGh;4OX!( zjsFXJvEitA|4-`09)pbiPR5Fwd37$Iw*RYG`9DdqvbCn0R%^U107pPin~l&3gn|=P ze!uoWkCv2xp~2jvqpTUTr3H$){XFi}EiK90p_?nJ;if0o@jV*Do&P~WnWKZXTX-AO zJjTh@tXqkKN*i3UUfgneI;S2ZFun{cwI1`o5xiG*qJNTT*wIr+Cu) z?M_c_<40f8u_i@lXd8E2NzoYxdMjI!cQWB$K}0RdZ7pMJt50=y5b`9sokDnI6x$AQ=80-0zqqIX;S>BMMjt$-(z-`_! zSjd|*Z{kN&-wT@A+y$jQzuNvY1Inx4@C-gQO_i^m_wGD{eMI9kkNw@uS!2)mYYs!_ zY|xHOL%QWFeZ?ToLc`a8i>{v4Ln9?dIq2$Dsnm8j=y65g!*h1##49~g&$(n^Lu$XC z=>&B3Mq7K<7on$CUs@>Gy25y?JayqnjW6rZsqy(GB)07Ta`(qq-Pdl-oP#eLRzHYG z^N=g+@HLoyZLR}KJ-%vG40g`$JypMIY=@RXk1tbq@cENX?^=CZhWfUo{^FQ$*Oqvl zJ9fes=GM&Ei8Bp%<{F^E_u60hgU`gCW#fOV&YrYwLZ7*>yO!SL(bOQc=s0jFHHSH+NaFfk{nkBf&EpH)xG+$D>v^1xXTsds{gzc8UsC38T$3J+MJR9OS`x!oDK$lyV1b=t@@v-{SdAlo`zN6TrRcTsEg#OBwhX4YY`0A(d^ z88G!4-2Uj>q2d};TF!>uF3zpBnzjC1G_>9tpcYq=w1}%-&|>y|%;tNqwVbo7uEr|c zgKsiu$&NP8+WfGJ+mgathn8qvj$;Pby9jvTff3xH5sSFc{I|K}cOO={wu2y}-Z@U&vmSySG4|m*ZQe-_Sh$>8__!O9RYDSro{{MCG9YV^fag%DoMXAB-GUeO}CxT zgq-IZX~1!~?S6Y2b9T6&HI6crxjt^%&}sbV=ytOKieT^A%dd9L0ukwXy-;4Uien0C zqV^n)g3?GqN=doC=eSl{?KDEG2*>bj$)NwRTs@9kLxDwld$>%G-0>ufYDCql2Tei8 zx0#lBYrv&JjV|BA1%0#4bXeBs>aT5ZnASLqm-M+@<2W9fFKOysQUp851%0>8^Z_ws z`dr4ZT*ebn0kaI})^~UFMRKT-d7SSTow`oSA1&#KSw?W{f9U3mi9n!qy%pwCuRPa8 zqPloW1$5`OrJlD^LhNc%VY?SnMXog)!NH-zoiodDt%R#;MO{^ysxjK-_HXI;0Uucy z`h_R5+tFgxoptH@ZAfX|2T0qeEn_>HM3q1>L%6#% z19tfJd+6qe{2pk3;LWVhwm3|dUAsPh;icWLZu)T7-(ITUwf>Q}{x^GH0u|Mf_5WUX zLpRva%@S=Dq(KxgMjK;{h)c66A|fsrvltddF+oLW7L7|ov-o^=f{7DJq7yXB=gc@W zI64`VIHp-5M2WV`7+l6dLkt8=&=^H!^#8ln-H2ux=bZ0+|L;3z`oMd&-nw<`)~#Fh z>Q+tfpXJ}ru-%o?O&jp^8v~K7AL#xcyQ=?vc2zH+w|mLr*gkqJJCnUh*yf0k#8K!z zw10j9!q~Xpw~m%9xJ{lMu4P@4>==mgjUhXINlspB_L9_vOBO7lZ9rZ!;~U!bg(Rq! z6ltAL{&q>1bRBo6()W3Zq6Out>HEAPZLY`GI=_xu?4?h*sG4)JB1sl>MZPGsahT*+ zUD7?8MUPa+byq*_y=Q}Q$Q}J-ue-%E3tckA8(UucegyYinvY~_@qq4#@a{<3TK}5X zG$})#rN-9!EYG{0@^97dQk^@Wkmh!$8Rw&rLCe&tYClWVSZ^4#j1?a5G8Jg#QtaCg zI_A7it!l}_zWwGvYqJVx!*JNQzf~67%}>BrI|80%nzU1%4QpW6_`2fwM%na}#naEp z5?bm?BLX{k)tJ%#sj7l1ua#Mdkx*4+U)X@#pEWPan6KpSCAHTHKo?# zbwlqt(D~O*F0VD|I_nZP*U74@hAJ#iL~vCulJeaMH?I^#jl?U1PoL6fy*aqqNQ53h|zQ1>Gt>0D|cFK~u z*n-NNv;$c8DQ!3Iv~S$L;C^aqPZ7_2f*6(8eMNj%<=m@?ZY(=YiXVw&Jw;e*2lOi9 zGArW4-bHw*PTVWv%>z`#?8EeQ)Z$8F?;=tNc>M6*MKnrtJoS$`p~APDx65?r)Y!6` z%E5eXDqbCFS-Q-F#!h)lAniHNqCMxG@=Jln`N|mwKi8=58i8J>UUrB>{=3?3vMP~3 z{y~4KB(VH7+7(~fAG_iufm>hW@Y5FI#}0DOIdPEm3t*nMOfgZ1-NJJMrn#iN9-%FQCEJjfH^Z_< z8Q@&4f7+CRUFmbvrn;o;^H)eI<=ja3S(1u$4Vm{O3SS0taiyUP^cA1J>&XqVAinXU zat zJ~K^mQV&}^7(+ZGvF*{$in2JTfN(owPI+QO@d|7xu6suP7`Rjuqbw>clFP;{(C>0O z?rF)2YGx^SeL7&TOm{ddkT&D@?K6$bEkOQ?65m}toU50I5pLlVOW+5}c#GGw&OxohV^Z&~I@mR>CA+4S-RV`5HP|y9 zF(b48N0y)ul#A6JwXgfTQD9Sqed97pTse@^q_80@*yd2C`Y%z;k1ik5+p=wma2Y z_L3FyGPbxlHdAxW-w*PV^9=BSyj%^9q(ZAWCG-Dqs6wiVSHC);LaTfac=ZUZQ-_Ej zRG-uHMLdWr(zWuzJu-3LFbW<2I6ZgSW#Z;)zl{(gMkTT7yVVh3(^^lNm$PMP>B3R4 zyK|);xStmsU_awlzKH}#^8g5tBDXg;!6bHc zKXCV6eiRcR!Nfs(3jxSx&%2SoL3{k8O2{%I>Kq=hjHv5Bb}+B@hvi0*`|E%=P~t?^ zLF3j>M)ylB1+P|`QUhVI+U%|#r*Kiz50Z{LEluTD>%QAPnC;P zd!!KbL$cs-u2JCSAvLX!&?PomjPP72)hjJ2u)0VOejUK8Oz#D9FBnndYt?f+Ie)V3 zUE~66YTRFcm2(~@+g@1;qap88m4t&OxC%X~)%2S{qw5%?922U{D0e1{kZOpS=m_^X zGKuOh-JyE_Rc?5fUI)|T#ExPv+W^M4M&3~YI`;K7!Jr3x$oG-E$aWOKT2v%(YRE)j|E#@eB{@gxIb{PPpi_q z6FD0_gTbkKCvD&*Ev&I)i`*k!suMKaBO4`Twdx!_P{!m|bO<+1R#fB3O;h(r#D4WgnOZHy+7sD&KyJk}dp=tlRUkYT<=I;Mda6rG z+F`5gc2)XL5>XkE@tOTU(EEL$e6C9MtaGRWv02WA6EpiaY0HsipzKyvdbx=b7}UtV z-Ca`AG^#m*^Ln;)g5rAW;S|?G+5^shsanW6xV&T$OvXXnaWY6B(nW{BZMWr=VW!8n zxH$As*l()3`7YDn6)xIVHxBzJpf8OT+$J-n(XKJ-p)q!w26R_1vuTX$pfNVNF^#cP zmEI};*n??|cP=RJ7@s`IG{#ALtNl8i!@Mn}k%5zo0^@1|VSNcz?GG*z<8*a#W)Tj3 zvDxqIoaZpf^EtD+W41LQ<;VWccR8EAakVCKG#Y)<=yCLX*DilL4i4;=I&?Dq=cFoG zTj*JC*U5Gd+}^3`kr_jnv@o&f8KeRW$(G0WDuNA-qo3?uMCauGR790G)IRxQ?+CpT zMp_pJ9-72aV;>0ZmZGsiPnt1fobtnq{Zh3Yw;ZmYYKun^Zf^@G8sF}l6JR#rXpc^` z$5>3TS$pUOw<&fdexo!D=O}Q2P|7FmtoAFeA4%sZbje3`Nw08nvNFG0<-ATe=z@-v za=)f#Rl{H(1(fpc+Wy@UD>p{*7**C~m?r5|**c?JY3xSX)Xl|Hw?3#$%a#`DGJ&6? zjgnX!xgRCcy+A|)1umraYNI)hS<*Rsq&;15iT=$6+dKc;gF2f6I$-E z-B{Yu2C@TVT(Pzx*ba=@FB`6fT>*-~fib*GqT*Mtmb=W;vl7h%j5Rwq*NyC1KA9Y- zFPsxsG^A(w1s`q-CG*1u6HyjdlzP^5SUUXg!W=*dH6iI0TJGGT25rjy30 z>+Ae1@@YzNu1?t0W$LPQk~Ha?qZ3-|65`dPUo1*_&P%3zOFO53Pt(8p30hWln9bf6 zQzL`_zU7^V_KXs-|HQC1X?Os|Im}!4mo4bg8Vc*aLsYFNvz2BFFeJcgT`vH)831i> z0Cn|go|YquniX3y1)11w!C-2t!?^*izb(=fV*smAeHv(lqOty_CSIbTwR{^NRR)5R z?3b#=7DBilIGZ9YF>wHs&DgGE<15$b{%~@q0DyRi&bGsTrQ8LEWc#|N-A5~=Nav6f z-C7r|^`4w~I)?LHSLIi~D}WOwwZ5`IdaO^g&i$WNOVmaT+MG7Rd0n|*vl_C23%qkd zb#;Lc8QL3VzTFXPuhnvy8VKrywAxA)7PP!%mN&JEFJ%7JD9<4WPO>iOcAu=iiQS1k z?U2Z3&i4z_7P*h{-YkU8oUKj0W%VY%_c%{|e<>RE_JtDCYLxc5X%t55%(SuZz5s z;g+dsg0VRkrRkL`VB70 zyWwth-S>TBuRLzdQr5jAe_1tmruLJF_)q8z&VMG%jI9e?VtGkYGP+`C|q!f)u zD(AIbx>Ff%FJ0?II6wIN-)R@=&^Sgccqp4l`f4*{8naUD^_8f{kIzJ`pO8J@eP4T+ z?|*~Yf1WV6%9%c^8-Lrta|5MLT8bsdvjB}sG<&Uf_nZ@K1j;tCni{>1kZS12a z!^PodL+At6kQhz5p5YW*x0#HzOGVozHrW4>YSr^Ah6`cdJppipvme2+1@)v_fS^VAhutDef(IeBi3QE17wxf!d8H4A z5P$slvb3axudvuz^s*(K{WY8&EOhq0JUzhQM$CQ|`_#SI9t6Wsz;gV9CJH2Czg}Ua z?mQUQL(g96dg$3JjIDK3W`h6T17-9I>nWpGSWg+f!g|W+74}nQ(AIJGqcRUZP;RfV zo^pGI^_1HytfyRpMf;q4(~82#{sElPiP!fwrvrm~v9laOKWl{QFz~!*g4)|K)d}M| z=iFo8iSL5)d-kaRjv=a#>YiCC3{iWVss6|mb*dM$W_7cfyTS#28&7q!lK}mEnNep!X+5qR+fNSY{JKVLf&OE ziY4Cqg1pO_Hx=HolsAicNpjFfB-x6Al$hjH2PIz77hYGJRcQ{T>{EuQbV_Mp-Z$Z0 zOx|2d$1oP8#D=TO?-BeWB^$!vpMrNe^IjsDu1Ly&1Ti2AN7v?)mJyJ% zjtU3E$0~f5Rd_tStioqmg%jbOK|s&4DlLSURp}fnvH)IIrE|7299^4FB2z@!1xFcV zUB=3|z{;qEmz8mmm9ZCIM#V2#84d6~$k_-8vEL(T&GCDs2kyso}@-ULrgbL1sRJS$G-yqWM@nEwG({#2C}Cm zTV1lrCA(d+wIw@Vve*4!?a52Kke(#?ar}RU|1SLZK|v&?L-8Mt|EKUzmaEj(cyZMJ zfq3Iby@P^?vAtM`t$V>q!n?06h~zt^B9U*;XdBi!j=GyY73&U2LH)xXM17Pp5>wkV z(vU$x#rU_Uq8>&;)FJJuSdT^!^=_H1YuOXCZh%ng7xtiEYNsEYgpxu-E%0;ppoEyi z-qT^v=}@33?$5svPXof3Uhy%dvNGVw?svtD>3u&H@8BAey#BrNJHknLj_MUo%_gyF zxcqH*Hw>~oLWqd}#rhPB?%SV873ghk>X__dQcTs8_1KbL;drM( zu2PqeoRo?ZC(n^i?h__F<0OxUEoq#S+&RZ7Na_>kQr7-gxfn4#<3QvHW z39o|uBc0r)Ik_Ur!+C;J@P62(mOJ$&OIB&N0nkUl;#4}&;N&57IpyRg&DWA^gp<<* zC%y!Q74k(+uC9v3NU1P5LA`P@-0ycK|0artIjeIrs=CQZ-sI$3?Zm$=aYAc=wj0wvc)u%=&>OU+AH8Uf@Ke7~ z1nLk+ZyMp~pJXEa9>$KA(oy~geny8M_K7)59UireNw}eS{^$?@tUdK6aL>wwD}Mj(y}YBwjvei2H{!a~ z?4>19!Jbu~!d8r-76AuC7=kDd*WQXzeL%?7g_9mqp&8Ky$Pc+-q15&yk^6yL)n zy(1pN-P`Vzj1)*FMgALhr^Ij%Wp}EGVfV2{_uR)C@ZM_|_(AxAB*sdwq zJ#zl<;vPAF`#o~SxJNEJUagSwIkJ@h5gV~ekD3;%`}2QW`SiqfLhZNTx8HjGkI9KQ zpPfJGL~`Tarp$z>ua^HHzR~xs&)c?~-g>9>tEB@!f8vOQCz`@WOVR6|wcjcZl|R06 zPbCwdbhp}6q+#Fs2Po*XKbHraENiUG!+f^tbwQbZnEG!vxO!Nt9(2@{b4F7b)|#*F!ROutdPAK$Y3qmYQ>KXK`c zWpu(LlxWN7KaG0wqmXLpf9w+eciANnulD}^@B9vYPlJ2755c?#ci#z~sNq2T+k~u5 zCBOG|fRq#dzkTV826FoS)KcJsOEZoI4eD*Zm&a&9=E1bR;W?IZXo4qUYS52$Y6j9a z&m+B$bX7Lb!<&1UX%v$EqW(Qrt9?Qj3RQa)n<$0qbYn(C^A3G{l#bq7oIkWMb7^WO zCSU*R{2{j7r?u%o>oIQs)X(Khp7X(YJnRDBqklWd_b~eRs~ChSKmB6A=GihjlwczZ zzytbsPL9LF{Lv9}BJKqYN4bBuw{7n++tJ*V68bkjF)vxR*q$vpc}~o{Irm@?4)n?9 z4D$i28{A>p6dn-HVEAhiuwN4JRl1TBQy`#_yW#Y{fYb($_B%7i|1amRq97|`MG((4^xGiLSl{w07x zeXZmH7$lM$(@#f#`MI-{vH&9*^wn^KR2h@Yvs8-@Tv8bjUJt} z^8WygpPSQYQOr=JZRI6gBQo`#)6f)&{yp*UV|U~AlfN#M`Qs@SPB0a|noXzsjBllE z&*C_q!kgFN%1<^&^f5JenQrzuKyxisRHtyIx=kv6JP1-*=sMB5Q>rR<2Szunre>aR zFmJ4lM2xt(HjZA|im)rH;#9NLm6g*zv{ zHC^J(qvr~@Zk!S3H;P;L#Nn%E$yrsg3kt%COLzQ)+=dSs6s4HkaO~R;X%r8+BHR(y zoIG)8kLheabX$dj{A*#=5#GPn9Ks9YaO%lQ_^mPIGHiNM#h`76>T@%;m>VAb?ucEs>NKZ z%N23W$=p%2CeMk}8%{I})j+ITjH&Z)5a&0lisw-Us%=PisP@Nnh{YyGTZ>SuDxvRC zZO17uh~Cq3$jfB^E;TGJ&X~8Pal!;HPfl#MrI?@*rZfk1 z6FE$u@k0DWS^F??&nWWVQmcySLj_AfAp+w%;g~(4;4Lv7l?rQRZQW2|Tl@Q?K+|#b ziJiQv_#!ffeS8%@;g+iG9DL%(-@<2(ALn=DAO1(fz7UeYyEL|gcTF9#(CeXRr_G%^ zJ41pxydZsQZmSQzs^V}kp*rlet&f`{6sBhRM|9v$$RX23IXFJrDs+Wdg%hU3yx`+u zp4VwQED@gbkO_zR6Qsm&!W_*t!Jz39&ZDWr*AsDboCWrl?mI;2v1jQfBrUCCslA0E`!+N67?bf8j9t1&(e@f#}0QYA2e}OU2izNYy(> z%^O*F&3R0WP}urr&hWM+)YD?>ge&3-Z#oq2L!x7o`DsWjYg;WmF81<;24SW`NK^`u z3L#D@##l`j1)vMRrfP}P>x7qC%?`HF9SDpUSqsWkCDG8=MaCE<7BT6hVUT&xDbPrC z53A1aBTbNnRjbO1s9p1Lz+G;u@DCip_5#rU$=NG42Lr(MP&(^{tt|G6;Ub zTU~hTE|AUFRevKj?>)f=BsQ#o|JNTo(X4vsi<|;6K@l$6Mxz42HcwWxuL!*^d{OD!LWRZp2wC1jmRj6HM$If4N@>{Q+pH11hKuO}oX&b5zw5Os;I z0StsTtW!8>P=H&Zk+iQ6%a|BN?Exq*gl7uV1e;blkQ&2tvmTiilQ zL&5-UzsK*?%rqpb?U+f1=}n~fm^@eJ}14a+XV zv7zh|o}r%w^84oDr;4r?$|eH*J}tnQU!ewqnmko0OjVetDq?f5f!;#BslLe^MLNNU zOeZ*Py1;aT2D7YB$Wh^xP)ZmI2iTBs%XEkr=Jb)(N6Tfw04jXn{(`ttDI{5hTi0t8 zVv;5IMTm^>H4V87!p`I*ht*_1E6%s_=LJ+L@?Igw?iJ!1a#&o`D1Dp3FJood+~-Y4 zc){R`vNX1`Zi}YtL?Y8TAk?;%R5K`^ObZD+oTCsb7;R1qknHp8NcxZNV>U9P)`vZ5 zP>Snt+-vR+Z9foAXDF}Z4z!XsxJ?)M@aYYzlD|_pR0=;(g`Xn(Nt&R2AwNN@PZ+Ik zn7(GT>f&#pFyUs%6%2bJ7<~7emCn#FNn4p-2LcGu{bgZasEP-YG*5!UzMmASeM~ti z_M@6ik?oYIN*-q;opl09bye9&@~zn?)Ce&rA>qY*g}6=`c1Kk_-d1;Wv6b31?4ZFV zJQs@VU%+-@_3*5L=eO_(Yn4L2qKy@xSBQ$RWBE6vv9hpZd7b8n)2POQAQTjG#B_;O zqtk2%J!XznLsgEvD&$(kHFf4GRNDirws#!KKp?ZeDWp?~*=HXAq_Ac`Y40DirZZ79 zVu(UkA^J&-Qv1c+ef7~WWhd&cvGi`j`YAG6eZHzvo6e(Muc|zzsL4Z3Mjo6Ly}!;3cqJ<|#h)Y{k=Lk%cv6e@~h$bVXJ1I&>G~V%Z&`nl$Y=nILCW&404G z6=S7s0&E*A&qiT{`BL>xy~?zmu$)Y@5&MW@+KP}iJ+u%Ene{zG=3q8tPH>Ev=Tv`P zbIv?NF4UfAH+_i_^ChB4oR5(0Eo9qA%+R}2PJB({<@5IOk~DSrhOym2K-0Yc95psdwySs#=KD zw1?wd;`;Tc**LmFX1df3o*60Ju5M@J=o|KN^bPgBiWkKb^Qi^LINClEk{!_^TOy#z zTQm}2;h>0^k#u8d$V@%1kF<}VC+$fS}yvyDIPDNJF5f@Be=H~JS6A*oZY+1GXn1f&_kO>w3- zgtC))rFVND^GdbYFZ4S6K@f*s=C$79T*N|~T&ou6s^My7B@93b^#A~ovZjt8V(FoH zGrZyqAL{P=*E4+*Cnwk0=1`a{BTLvywIM)Q;oYtk_OcXEYWmw%N`@clTkSK16=)?x zEU}1@1RYInccR8L{YcP=GcX~yX_jm@n4lI`Xv8U`Sv~?F;e|E@FrP>?8ETvcf(mnb zzFxp&fprr$lL9@JuEL4Jn@p`7ON&Tr8qJ%Jl9&>xkZ)90r zY6J#W=-)mn^fTcG7I%)>waP9-sL)AT<#llmw94bXwaV-maef0pPSXg_Durj6MoCBb z^wKD^W5TMlBPiK3O5tggs}QCs>!W%!Nq;17UHcKwwXURxfga20@d7>4>5)Q@XX!DQ z9y9T9toQk}5>GvY^SNntDg=s}xu8pYb0U_ov8aO6&Cm|9-Pfxns$y@rF;!^pHjkEH zujW-H#9*Qd&fFJ6j#BEY7#8@3@Q)&qTUBfXU?I1~*50bJx5%5+O3j|H5Y}|qhno)& zEGD&@Hy)y8bIkP=Vdqsvzo*gWDBOU${oY{X3nnmKxMMab)FDT4YWUozgfCj(!qi&0 z3550SFT=>}u|KlqVF8L2-a3Op~?Er0#pi zwsI48!!Q90RxBe{Z91^DQAC@S1ZW~N6wpYJ_k0_1<40^Ap+=nE>c43OfC-1%x~Yz~ z%+!kw3Uh)tV6?lN(PwfyL=Q|Mj~j*xUkFFcGrYy8Y(0I3T6~K2bgFqhhJ$)g8dS+` zMyGsCOzIHhe8l;!;hV*0P%p#K@IBN#!WmW3yGSff?+8m!8+5{2@AeTQ=!z=mwzRLp z9Fmfk+!fB`4iLVuW9z?V6y?3uK1WzfGs)@V1_tZ|sr+<8y^yb=5@!J+booQ7qA?Ws zlv-G&K}q6NEXrXPOI`g;ILoRkQc;Q--Zb4r@wqKn`7*J^t>|+6&fP^Lt79T%?PWM!cz)h)JET^Okds+o|oCi>lrxNUf%W{LZwCH zh#I!%M}(Xsg^h`G-O-mf5Te2c;+OEEI6PIQv_~WKGgF-pjVEn%^_-OPlZ~qc)&U%l zsH|heV4%%h+uC4r*j2+5m^!0(P(5C@A$^<@u~}^U@&|c~s^JHO#kJmOv_}|QwX_dJ zuy6(xZxg_ajK^BUu+Za3@)(ryBjz}7aTPLPG>KD-tI*!Ltwg2WwgRJ2pq|*XYgCCgF0fuarkRD7Z&Tldd6Xtri z2Me2bQ)=N#$#JAacy9mRRU#g2pC!=vW|&4G1;U89?T^G+*&5VI%%d^MJ?x08=uH-= z7UqHlffra11J6Cek;RP==Pk_Cn7-`hn|cu*eZe7(Vv)$Eq=lj-NKe~ZL(C-piTW-S zC|U_ny>l?@c~<*aIB<|}7~gBWsbD;h(4sb>R(Tzr1W?KCIIiD~QYYa02~ zE;D?DWN!g$LT^%SL$6OhaY^;g;hgc})(wm_r)aE+L$+gWA2A*6PS9f6^Pg=y&V z9VG7ODQSs+nzGG|mN6Hzye{7h45%;`6Li~}M*9jt!q8X`&Esp-U?wfHht(J!6>e33 zLyFjQo7A+fZI0fg4lkv;Wls@vI|LoZcOg$H&*Px0eYtTYO1T0UxG>&$$OIlAB7(Bn65 z#H#*SFJO7ew2TtW?+Cq%X~~s*IZaEhV4bOx% zf%Nk`7_vDtFJ4r5utx`m`87NJhhZ$x2GIN+zsn=D)`hRz65pZgc$0{VmP7IB80%a!oLo;h(vPPWUGbqx%jSycXsixV)(Y;DvCUJyu zA3AbwGwxHtMD-kT$@f*%YPo@YE>Sb&FKK8s5zRE+iUmS6XN{^P3M|$}d!<4@6O$SR zYjrCPV1|I+i>QwXF_1YiomfQ0g4Ky{OcyaHjD&UzUX1bY6}M1zRPP+h=?CSO zs6pb!zelxg*FbTlU{YKusn8!vX#0dv3nsV_g_ppqvGg4jpFc61!zW*+zpf`erNtb- zUJbm$U$Ie_X+8agD7y{|K@v-7i(44|j;V^yqGj-XujmBcq&?4rKvM`&Jz8v13+O=F z+eGNH?Q%OSi!n`7tUkpw33qZm>PwFUN%Z%-4w12@iBtWGuC{SZ>q^eDeup*G`54Ho zIJYKbiY&xLWX387v?3G97EvUD5^~I(sK5s*+v3APT6{RJioR<0)?uCPHA*M2bod&5 zlowX(uu$Y-TV^o5Oz=#E4Mvx?B`Btq!>HAI`ww_r$AjIIgAeFnr=Ym;ELl_Oafkyw9UMd~)dyqkg8FmTbS)Or*6>Z!K-}i5nqI2BL(vM0mu6 zZs9NnN_???IhG=!97DUG0H=9wmypyMUS3#Do%c}+S^ap|^(itaain_FJxkerOqaS$ zxB7g9kAT<>a0)A2xtO+eUU%kmUlPuToXUv~-zN}&k`2@$_pO1O|3}Cdd27Y_o%{(G ze4La3T>)s^WZx%1V+0mzc}rMzUJ^CL_`p`Lf84z* zREJui@8l{Bk^3;raMve;;3_euQ{=FR!7MAGz>r!jl1BZ5Ixy%5nXC|wwrYP5JVyt% z{uRel30>_{y4T1t4BpyxZ+OFZJSAAbbW@Sa>UR_ zIAQi42z+l~SUUWng+{c~w9LB$D41jWm@eShtv;XFh<(!>?WZJg2>^#mfWhzqj}orv z0#h~I_#T4uCEOupj_wb&|Hc{r8gpb9zEVLQIT&&WG&LIrbg8Cv3RgpJiBES6P4wyA z3MC!aEY0r_2a+pNd|rliCYM_JQ2RVSrGm<0L^lZIQe!$K5oUIalV!9%GFjFh(8{6G zJxeLekS_GIb`^g@7-VXYAO+;unogkxGAdUddX{)(BuyZb)x!MF(6iw&oq2vCU1pz& zE?E4P;3g|1JtP(8OhmC7H12Z~u{>>15dTiQf@`wQ!tE2-Itgz3ijI=4=%CBl?vN5= z)L>E}sT*E%Qg`AD(pJpf&~r5GqAAvEh6_m@Y}Wfcl7e8K^)a1D!ruq_)^+YYVKKc7`5D`$K~miO~=O2I@vkhj0iJzz->ns53v` z$Mj{F=}sT)YvBKZMa0nSak;JSfwtsGEOO?=J~puS-8EN*8>&Cv1PF2dInmVd3D_;B z#ngO9U~aIeIeKh2vB0!*V1XJjre!B@kQ+rx$%Ctpi}RaFbtz_ps}-3=J=(5Yh&e~N zN(_(gqXWGjjp>vkWO@s+c66YkK01(i9y77d)`;JdXzK(NQw=t^82XB9&b9kHl%x|l zpZ6b-4S zy5SGBeUcKbj{C*%Sw)S3)Y0hJs6bVF9+$zj_Jsq9p1S)%-vbcW(?JVJRl7``n`ldD zI&k@~X#Cuy`qCfB!O6J#(woesujo%J&!fW#+~+&;vRA<(J*4^N=h0pN8_UZ9s;tn5?kNHiLm$Z zgkYK9w&&X2yI^~kd!A?DoggZR;&2;3{Lpt6OQN}C<6p&X*q;*0+5Uai?1g=8X9}$Q{!Wa)+upzeT|0 zNfvsS_5c-N9a{~RPKc$CltPw|IK5Md)nalh#0J_0c#W)Qa$*}-pA}7^SSh1^{#l8I zrUC4H15l%osA2kyQKMNjeaalI=7Oe2KOTY{X7Lz>00StIyiL)tY2CG?bwklO!`I?F z9DgwE`SM#9=b6@4t^3;u9eZO#{L>4iSk?Lx(v(%4KI z{+_x21+}02GkbKS(LT^R1oqs?r5>;xM-rgKUM7c0g2iq1Vo^iM2X0D5H;4kn(cXiyXxHPpuo3k>< zkiJx#w$hNEqn)4~5~|D0b>;30)#BF^vt*eTM~>Ok-xt%{W@~l0Z6Eu;W3zQ4;UR6d zd~7ybEj>0{**~(`+BCSA%~sfC=b4yR(*^MVxhv4OWxHG5_Cbx+K8GR({a?B(P*Vfh zO;^h$4qP9>z3%1=4Fy*RTAhu13llbw+s~+|_|N^1|CiddL9jLAf9`+$KXw0OvN1aON<~>-aM>7RS$?cMzp^a5ylhOcJTJB^FGHGNAkWW`A~s7W zH{$lH43i;Co>M`&3NlP6bd_Fi@u>lZ+kLni-}Bqu&iVVCOC5yLo4322@%L%veYqTk zJP&ws>sMBmWogQC8S+$+M!u>*j=HSaDbLZdax2OVR;29Yw5|R=Ef;(a6+*58)F9(( zV4{#4IK?W3eC61(>`LHJmJI}U%2x)Lt>jLn_;mWacNpDHS$sNE2elNsovK7l{hCtT zE`cWSrVIj-El9u|mpI(I;)|<=8bP9;#C8?Y*0i!fohJl?6=}wxvyitm7s2|+mPmEDl=zD0p8~E^e zp)Z&aOpeag!^{eFik0XHMqQk1Qj$B-{TL1il{%kt6d z)n%)6@*Gy~%2@fDU^#3-iy)B(9og>F3R%Pt`i5^HOtSQHBl>cA84|Ao4v-I(WvEMb zg**kx{BZX$`duUMcPU~J9A~!sb~-wsy+1}!0_vEl?%a++kQg;kqJA3Nos6~>W%)W* zR!SMhEIdpQ(MH{C@C8I9ceU7Q1Jc?4-QdJ-ce>w8+GG#YUIv&xUrH~ zU*EBCM@4+}Hc2Hv|1Wqt? zFIURHvpRQH%5$`G^qFj2{hT5<*t~GSYm}o;uF%R0tj^yW<*U^4JQllD*M|Ztzt=1K zkD3)N(+*x=Td|ch=IhSu+^2G!9*yFDaA1Q!_6sXGuBo~pDl8Ca<1bvJQx~LS^2Nfr zqJc^@B@5SQnNm3pRZWpg70Yzkn-3Cpq;S=4r95W@HGP#D#eRFZa^*pUaQ0v6_{E&e zX!meYzs51XDR!UH|L6dY*V}!T@*p=OJFkQSQW{QR(+5gnKV8d8skX;XPjj`7mneal zo+6biFWpyME+;c0j{Ty39nMMg%!xGqGX^;hNC6Sb7sDb2HD$k)hFW|#yI0&5sZ4`t zBSmVi8YQ+vP006P?Orr;Q3$35PSg%ZX=%xYABywoUECCJJHm)dX&8(x>sm^NpROeo zTmj=X_S0O&5;EtgfpVo5hk5lxRRWWHQ3p8%p~iltu?a+>RPWO+a3ZdCQ0waf5Y^R+WVR=ogt6aMSc_mfU8 z+K=Q;2LZ%8wz{-WzY*$m8E&`6g}Cn~y1t*~y0hH%t;#Al*K?ItH`nu(oo=q3M*Uze zQ0KI7BWF#K8I^;%cQxOn4B#@P7S;MtiGI-MXHv&!{QB(^hnJR*oiXxg#Dv5U=LKIp z^5*B?=dAkB&GYNFufh~EN#Ux>S;~Wdcy#o%k0X9q*+1~eiNiT+g#Vy_PqT6UQ`TiN zPCzjk+bl{k-0h9BbO{&keRzMeI(Y-MzWit@yel_@(d#~Z14Z? zsL^ShcHBl}z#cm_JAcVCJCd2pmo3)z+--nMSaWc3HEt%LYkS~Ynwpht=pDUuK}PPf z7m)yw3)2gd4F*TR(wy|gOVgJb5NA6fBiSC1mYS1JlvoCH_MAm@`2jtW4fa%q?DX_x z8<6buyyQj8mm4zDQx`5;nD*j=j3t>1vr@AGm6c}C!4fAgUYhJE2bXuJ=a2{J5;(jT z=24M`=8$7^>%6c(q(B`le4LwOQuEw-G6m;I5m0dvX$DbNn>HtLPLzQPNXyR2$xdI9lV!WJf)UqFhGeQ0 zjtLJ_;Ec_ssnpWhJq{Md8ayXw z73It!+QR8o>|CMcmg^$eJ-2n$vcg#NGX>4+v%vO`h` z;sS(aK3nt#Crt^`&nytMm2!e(sPZxdb6kdz=e9y)uzWD2LI~sXcBo1!6wsrcoEj5I zGvQ~{IT=yVt~X1!DdZ_Zr)E}d($1TL7`4kH375Tau7|ZQVedOST%-ABlaS|K`gBZ+ zSNO4)C6E73u`Dg<+{{>9tU0|yHs1BK-!5qqR&aS2pC}7;Df$9B1-B_>DAyd1+rYJ% z99{9Q9Kc02E#MX!an+R%?oA)Jx~QM=Z6u_7)03_h%Z<=4=!$XZKin3&U!1NjpZ8fp zcMeB}SnS?(eS~^}hjcuA3wh@hRBez{D|J>{nsIs8sXux7`*Mp&yBMCv{qD5OI(K%@ zJK$SDLk{IK_`??m>Bn(3G}zm&{L)WzMD1D}lrn)`6J?L$dZLDB1a(j3&h*Olj3XBi zHdfgXmU{JFFthLC!oEwk_szV}cRAm05-u4Vup}sDVv6u5N2NxeNT^$F@l2&E*ltyS zA!s2Id_W1sX9BfpCPp$E)%QH+i}wLx}uMc zLj~!o^~=S-kw50q7hpjgBsi9L5eeo|f<(?3qqJs*7k(2lZI_eA$dBbLZ}MuR8=o9s zR19LIJf`QBT;)hO0jl?hEo+7{C6%#Pn3`FCsZpLs;BcJ-&S?KmBB{7g0QMOlM*imWJ`k^ z?)v1gEuQcn*b%L99m%NLJdV}zd`eKAqmHL}YB;GpJhZfC+DW2AlRI^&;n?ALKxI3- z9tphU;VY1!%Q@D_w<5uXscwIp=XNT??TZ4pruF7CR`cJR&F8z!;1<;M2^w1H`kU1zNuPW{>thK)tdFMtZC{jiCEnnwYtT$ zy4AG0qjq&??dof_tGi6AyG^T&vem`1)$5B_Z!BJ29=&?AY)wU7>Gp{irG8@q-(KBp zTHR8+y0sR$N-s>j6y*n$LjAg{Qsgw32F`z1ejn=BRdwOR z7O7v$U_TUnX@Os}$?sCFU(1(3V`zZiO`zeld92`O5*o`UWoqIVPP`6k1bh!PoV_-^ zvJPmJ5$4+`A{Q|C@Efvw`*!I~i~MGT{H9fYvq^rlxvZ_y)+_%-cjy;L8n@#Q+?U# z-kIqBxVp~wJico9`_`lmTBH-g_nX44QDJ+f(sEXCKZLlzwLDYw%Pp$i+hJon$|!|vGf4|&vU6hhiq%U zsm`a$qrw`Z!YbHvU+vhLgz^FRLPI0#K`p3ZoUhR4vE-Isj`|vSprqFn3HwT3N8ED7fruNJ&kwuw!R2wgBE; z7cAnnF8B>eVDN8>hLzU*W_^I{w>yUg|4=wU8T`ueo#lsuD{l=O=-D*P5{n7+j_vO6 z^TsjUnUtNTC0wPOajboQ&H0v&t8nJda0MoNlE^e$5=@hAQ}9YhlEkv@o(xJix8Bs_ z)R);a9xq&&Q_Wk}*N$(Hh8y|*b^O3`-Y0mf=33$Ss>1Pmr31TaCzeNzYcPdXMUCAW zHL0p_Qimzbg7gkIh1ZV1R{LBQr@N?AU9z~R=$%(soELKPI8Wy_T2-c2b=l&4r%KgQ z?tV4Jy+iH(wN;hbth$}z-l9r~0S@asmg|T5r@ZucrDj;FZB@ZIrt0r` z&emLeUGp5|@XH9FQ!|>w2XsGnM=#xv>C2ZMOm8SGpkSRZl5VDylWGEO3-eO$^4Rq1@=i4rjOZ~>5B|$OAI+|)&)mg^xWCe zb1@-v%=lPZLmsAEOC3R&B0;OC83r^dxQy#dHJv%iYQ;?jj1vyy;n$a#>l)h|1dJZ`eKzwaQ4Ljae(`GKMBGciAM=lFB5{QQ;TFXv_)jqzA3ul(FcM!b2Uh5uQhP1t{LwW{r`& znIsF?<8>f*^qvj+^t>H?3GB|sgt~y;0K4V1Ffs6TOe{u)Z{Hvr{X0d%qM$jO6sD(R zjHAMLZy>O<76r}S)Vk;q{%}WKu;*vH0(5U|YmF*WBBZgS*q1^w-q=5!*F{%e5P183X`5iK`(5Yhe^-p9np_@9^Mtuxn)~t z%nkqOSRHf;Dr$9)-OL{a%%9G(M&em4FFd%Qo4CA))%NIT= z(tm)?tq-hl;i^L4kb5?$1EStPyeZ>Ce{hNQ^MtPJrAam?M3XgUa zzeFvOvTa+|cmAOJ@9lK2OwUX6rH--xNW$L1+rbm(P75anfnU|(;VaJ6qB$2X4oY~5 zc%q}DZV5GB<+g2OFQ)>?-aTIbHDNgVQhwgWy=7qfb4L=kUata>^L8NR4j=|QkcjW> zKs0aLfn3|;RY^cB`FWDPWua)!Pxg52n1H^-t zE#hWJbOu#W_x3i$WvbxUd%U(2V{vQq0```H>EAt?P)zM5xqEOo9&_tAuX*K`2uamHoKpwgrhRbJaA9no>ByN}31 zV8g)$RL671x6vVyU@!F?U1WISsVJ12vN-7crg^t~UA#OcXvaGpbwLR_Im9P zCwcdBUfLQtNZoiWq4Qho=fjG|opHJ1OXI|p@Q4Faj0)E?f}Y7ozvBm8j&66)gQ&Wd z5fq;fZZ8~kxwy@pgjdRvpxAuKMBeYRtj&E1LL!$0UCX01ewT~SyZ>!hfbqR;`_7V- ztlaCBAHKPIS3vB0+Z1On0KFZ1y;8#~5t8xVw&v5+Yu?@KH9kB8J$iHAj>W_Y6~_~< zb(90W*=Jnd_QhCej0?ZA$K(q-%su0>$rrp)85i#VCldxXAk&pg$UJ&k_KAD04ZTAY zQuyfQ=nvfuOt#K3ZfpG;WNYP94%yoD=RZtMyO3_g5Hjum@%80#OJ_vh|6$X-p|_NSfulXkHwI-2Z9Sc>A$`Kgl;T z*C&He>2$r{Q~m|}y9d1*cNYfTDZ-LZmpSzz9?3SOdnFM^-du~m(L%yMp?+DZ#|~J+ z=#UBD(E`WJ@~vZlfZ9J3qZK;~tM3urJ}+}>3n>64WA+vbe^i3nzm+*P4Tb)43e&xY zSp~+CpZ-7}-Tsi{BX8Vl#=Q8G+}~BQ(WN(j3Gu!$!N2?;d+T32kHu3En5DV!vUS&^ zTbpBm%))x>?jFnW3+>}W3_HWg9nSL2NP{uS9QKsI+8)Lve{W&q)gny&H<%dQ8BF{( zT{Aj20U?eV$X6yHYBP{mCLr=q6Og=pCLnK2K-Ak!K=N-yH#C#{FRfqZ<^l7{(F{UGpd6bR6jLlMYx~6cF?QBe0_*%2@(Kj zme68eLZN913iA>cn}L65S_0>Qi4IB=5Y9mpkQFysVp<$E0g;%2)R=%6rkH@p%s{+M zKxBtZKn|LLd}jjEXl84}Y*sc5pP1NMY?h5S6I*46O>C{XX%es#CfSghfwY)_WPWM_ z!Z}o^yGa7}Ww}!s37G6ix@Iy7Sj)}m+Q*Pmiy!K(<4H>OABV^fkd%&@+1Z4d!7KrA$35YJ<1SHA?By*Mti0V*b#!V8iedSI^f~UeumZvAg zl9xPqD|*FaDKNQJzifg>0eQ&^ix%x>`+;5gNx^0>d2f)7gRQFb*up)PBjQPk@EZ;aLDFBWLgcv-@f;L_)SE-=mIZsG5OmH{eW~U`bc1J+Ge>IAothJ! zZsD-(7)SkuP#?J9sMC^2oh4^QIArqBg0JnD2LavL+n z2E)2S^~n3E9=lttkNUPH!ru{l5Gau)hAELPuv7Hh=}S3M9Ib-0c{n9b>=bA6jnVC1 z>?+>u#uQzx%V>(m{zWB7nV40mmvqW5EE(;^OwneGRSaiWq5iBT(f5UEiocD%AHN9vGyTZ@^an8uzl(Dkwmm4;HS=e>a?oEph zb^WS*(^ubjU3_-a;>%sXzPah^dtI0Ox@pN=arN%0p!vNLV|4W^i5Is-8EM_vBmXtIV1BeEcNiu(_{ zAkJr};0yuLnunLr6zb!d*~kc#5yY3WasHHR^t8Yfin)nO`m#J|VtD zy2aNar>Y~?%kDH^h_3ik%&bD6G(O$ay-vhz^{$DtS?(_GUOuelov3!bo3)UGaU(SAmB_(jZF zGF6FCmR&{bA2x_@SyE?gkEuh@%aB_Ax88_ISn5SuR_E(Xk!>d~Y1xRQh~bCl3rUgN zHfJM{&SXffbLdN%2(t?H;z%W8)EI_P4<^|laOE+IETJi`vjU@UZ!jW7Vg+W=XlI11 zR*p19Z3wuz*Tl`A_GKgIVpq|!sxKvCj3RRus%Q#!6&2HMF$GJglESGp1zx}dfqAMm zO;KVHsr=8UrJT<=cz$uqdA)y4RZ30u!J3+unp*$MH&QOw9lYGoa=Fp}%7c_E%?Gcv zv|MTR|FJFQ$M%Ci4i-Mz(a%l0K)J~->{P`iSiD}7>y}OPi0~#}`2S;wZhI_twg90N z7h=2RcJRQeV-3Q0*;1HVbo!F>>cY8({;an7o+o@#;}sMuWP!+=d7fO z$3UsS3}L2LhsJLxth-ypN?ND=EfJ6Gm5ijV#?;XZ*{Q$U)h8tLBs)cQ&&hYJZ=0s@ zD8Cq8@VlCsqPe#_`{FtVYP_1o7@@N zs{4YrrysDiO|hPwZsEf&FlKD&QK!J6%W^f8QnBnVv;X3a{TI(3tw)u`4u8=r^mWk(Vc3V}MUqr6=$2i``H?k)yRIK> z(Pr3BhXKi%AAUUTZpSWZ1T!2J2Be5$UnYTf82tSZU8FuWa`;C1PV%vwC-d^6q5qgRFNPws$=k%~F4O zmZo6sL*y7J?U)6pXd!tl7~qMY~h)7R3CsN%r*H$0!l(fi10&vbPW@;KW)=Ex zQ)mj7P;KjNF-2t_X;8u57}FGk^W~>b+&yLZ}nU{hhntH+}NMqq{#m|K!YH zch6)_tzOnpy=Ll#%?%fdre56FaItjir4tR83=IO$X%A+EbMqpnXh(jE%`C-3uyszU zF}mOpyf8&RmtY5?a*v9kDUI>414+T!vm{!#FK#H5UN7n=gdM2Zc({eX#eN1ukn;2y zzSq*Qa|ePPKKnsP(H>SARedMlSvH7et9s7Mi_s;ISbd-R1j;y$Rfop-AC5Yu2D8d| z`}KyxjO(nvS8VLx!rx}kn03qoS z$B&(wu8CzOM;HH~#Hl2hjo)rsiGa_bY&Hk9N&IqJg$%%=FaF(&c$+@;4N^P2A#m2rZh{IX4Uk0 z-3(g_Uzt#(^}tk`f;Ib}LH?O3N<2lguRKh(|7~9MZ|SRkTXf~OCH5`G=$3P@K=o2U-=GmcF+fGA*aAlto};}`~Q92 zB|bMO*V;njjIzEz>i$zu_b)Gyh~@^!U4BZ?NUP5B<&u@w7W!^ZeElFFp?*%3Sa1ge z$}k{hx`vZ?p3n7LX>F|Sjse4cguJh##QaX1B^;kXIVU<%qu5o==O(YQ)=cP$DMtGU zM{SN0iw13$xXcWcS7#5w2Ngb84#kK0bR}f78|uX0xx`19^9FOtm--0Ly~T$je8_o6SF}FD6ER^<+Nr7{ zYfZo?Cw}-!(8q6_nDglt3FrHPa!%DOO}_1efpY1ySsG63b-riU$k`gs`Wt*h!9Ht^ zY_b!dbI3;+9*;+kZIKAS9wg_;=4hnaTYP!UA#016Pn`Ho-(f2y0|TC8z^g&>n5Yzu zuI)BoE-SURXiNZv^FBi3s&Qhq`&J2O`e3>EVv2^-aEC9iK4xuEGSi7KxdE*9jT37p zVZdPwP|Vdxs_L;@Qw|8JPW;B7FyM!A;`Qq>VE7O@N1v+ERo&yuRj0tUMVR6h$k+lL z8Zh7t2Hf~uBR%~yUzvXfQ!D|M_*vGPOpSqW$S^20ih~L%_~j-7#q0#2Pc>a^W-j)? z#S`Kj{Ayv>ThaoFOOXrM7mJJG{%A{+Ia7byH`pjDIj;aKr=$7pO+bO0PH`NW0;@;!#Ei<#jq@E zqj)=}DE<+{T4rL3gn@uIup7j{-45uL?8HLit`m@1w2)!ADEk)A?u;b_4jA~#>YE%+ zPk~UZQOImx#C(hGTwY)8GyEt16MrgKa7(kQx(v{(Dm}1^TH_*4j~v#QR};wJD`viU zOL?LpjdHhq!wT-2+^PqGvR^aZ^z@nUQ6Y*kxHfCK(tA2vgLJy=fv2HDBu!9rJcWWX zmBS;PjtYHX@d!t19MUmYC;%>qluCJVB~~s40g|@-*8shLrHns7KpTS>IlUY&Ty_y- zH!qMEt8g5q-2MKzmfOBkSY#0Oe{+F^o_)eM3&a&{sGqYP=P8-A%D&JaSA~} zuVkl-JUzZ*Cw7#;B~_9o6D5g+A9?Rt$4zo|+>90Ci-bg|O6IEvuj5AEALFXnXqc$M za=R=O%usjB3aoJD-S1*OD8^NnW)!8KQ)i6S*vATrzZC*wKhHXAo-U7s@ni1?vKi`5 zJibsa)n%8&T?H;m?{iSar5t>Gr(~X-=&I9uPBRk2a@R_J z#(#2p%MFRUv-KE2%`#fcrFp#J#FRMijcecQNHz12)jH-OCG(Iq&rF<5|2QHJeq@A* za}E%RI8)c?fPSMdmXbg6{shQ&UY+EdFaAfiw`G4rvfaDs2Rw+k`7^T3|G;s>MUw5r zfa$UtFVB7dCEK%}@4&#yF{epg)p(v{8x^HJB-`Bh0tg58kHh{;whvmapsD&6F;kI7 z{7bemK7nN02-(I~v+V`W0%wx#@<{)|yx07g*O0qzmjfPp^FE-!LCaIOY1i1j5$2fzl!b#xWuSIFZI}=YqMM}7x zhVi6IPL1QRo`MLR04xz4#j0<3l|B&Za9?JrcCb4J(}(^1VBY%m4nwBP>bwH>iDI~Z z&|&2_Rj$PyMzd=O))o4oihkn7;T4uhM)Oc)WFH>R&{SS=5ub`2=*3Gha_*g-`fvSM zqnIfYPV@F!!%de7BY|A8u^$%JJaR`TSA`Yd(2s0V1XK&lH!!MgFXRV8wH9&Wm_fPhAUOv4w|?V>#ch@A&nM?afVO5s zx_;DVqRUJ!y@-PMFSBR9@%)VGM(1P^=-lpgwOJH1k=URLS9DVln*t*y!r)uATVh=~&@G7Uvics&yIsV)Bz;o0Wak(0>pIs;ZAG;V-^@8M`$!#T#E z8}=8+1*$aEaq^FxN;|_`av&2{X>UWxvZAIkU#eW%NOFgfyU%wEEbZExfGDuk6o=`G zAqyu}c#?$Qt(<|+;lzbJ?hD4BraquqYrFQO2a@r?T!$6+8ZPI_n{c}-a~L_OxenoU ziG9N2bLNRg_KB1ZQ15T_B2X#7m<5$2_B-k}v=g-F#Bgc){2`rP&LL>ITbVFq;Q$lL zjc$ub+0;2Uz{TMn9MawJ>Hm9sRL5;z;*f>MI)&G|oq&cnzbdJ_d@qLM;v|q+4lAO+ zPsCVCszX5s-kOXyTB)p?KcS}u+2nV#2#2w17^l<2ML><$MXma}o~Rq)27<;YrMLHv zbK&s1t2>Y%Z>$9_Vu=A1pDrviGluXI2!YKU+=>CmhETKeL?8j4Wk z2+0BovH(o3fzG1w=E1|%$X@*E=hSH2sor|ZHC1d82nA*DB)N{sw1pD9=x%@N#8wZn zARo6bepT@BVQP+Bo*G_0?~m?lOHOQ^l5@B-Z2kSyxrwRIl6vMm9?_b>fXv%^sz^_2 z-ih}Bu2pCGPyS6HnmJ@KUj4NcEo3}J&zuiJ->{=q=Fv?#5+371JVmEr9f2DF-N}>x z;_weJK+{pym2z5Vru4WMVfE46RK+HC%?5a%Zebl}cN^ zl(i-?tQS<17%XzIY9M913jI4MFJQqeo<9U!PT_L}Ue|iO1*_3XRdV?rtnqjXYx5%y zlQn)gfntVAKlYi=O{xam41?dRT8!5T;`27EZp7zZU@bsZF=BX>5kt&>x8bsXmdgq` zSe?QT5cIO}>IDa7o@`qlGufj|nk=jL|8Fw2*GZbJ_&hV&-hWS4{_n|n-7p!0$!TD+ z{(;6*5arT&dI^cCSr-#r67*VmfWX!jG;@>l`%Lum31prr>mWo)6<%tM7y%avs+i92@k&((NBdMQRQ zU5pF46sDMkTsSPS00!Unie3b#3`dJzb?bYkVNDwiBgA?#l)@yDBP_whrXmA)+@PrY58|?06Q>s;I7bas&D9;`F4#U;<%lA_F zYXnMTPbJId6<6-XC}83dK!|PF0HVU+2LA+=$!#XZ3V@qtp2g4_$10Z3Zuu8ht1p0o zDKh?b^6SU=UtrYwo>v9Kc`HmwQ2s?mhdTu?+({Eu4(y>|Ar)M{R}CR4bzP{n| z1TuIaeC@;3>i#B!CoOz$@Yp*^uCEmKEW>_DAw%}TxEri(jD&3*EU_5M1UEf}u`%lc zC#+*Ala=-?2TY;ZFW;B)>H5Uaz_Z-0Q+~yNnI0@p%T8=<%8`Xq_5&f56rS2Vqkm=FxF8S$sj>=!<)L3+d(q|U5CiqU_#n3#bi z(T+_Ltyn%`l*u4*53>5c$7GP6+k9d4naeUrXJ(K&QYh560CPppQc|fJBo@G64NOsk zSSxg4;S|pwa!j;XZ9)$>=W8f_ZtHG;^MqT1odM+N$Z>~PXR*tUEIf5bxI^?TBKje# zNO52Qs5+ek!CUDf8g^kd8;@O4(3L3`BUquH_}hC8RLx)r7*oh-V3j%<*8djgV}{7~ zWhdN7c->Tn(bbqS@^{Z}TS4e%UMMAWZQY$qPi(!IeGR%1_I++*%CkKd;ydJl1fMoK z4cp9!y^LY7mG&bSAmAa^(B*#Or!XsA68J7{7npRs%9H>pY!J1SpIZiBV)!XMY%m2k zK`Sn9XW7AI-Z8&$`hd4(f9B_3zSpAW*y>=E-)9Xu6nUo0@-64%e`X>Q_-0BlIQy&= zpf!92vFJ^&zRR_%r`a4WvHb*aK3Jjo}aPG}yg7X9A(< z0C7k|AS$=&2!tLWWOe}>=80uLz7H2Q2O3ETIKIs!1Z7oPu0p=Q0T!W7l}kU`(QoO3@T9W0ts`!#u%3^d2vMn0nX+C59NwQf4OWCnUgY zdNAdNuO#lrAc|N(I~L%$!iXT}r*I==-pV5E19mM>5I0eoW~v000Ci*deyUK42Kg4rTvnhP@Iv68P_Il%v`keG%Xzc# zcHMV|*az^^OI^Nks-h$p_lma0@Rr{%d(*naifj1 zTy-}djK*ixXicVv&cdBMnW@UtH1#KB%u6G?(EILt)F3D;4%cM5sweWn=)AJ-EoyC4 za)oD5S8{Pbt*ICzESQnMES8jOp?8I&h1mjL8yPkE>~^4NRfd5R7rF2{1s0iHT6WqO zSsyh~F_7CAMnQ}P&7p_IfmA+dZZM3I(18xUW{OG z=CC*8OgCG5ICTr~+a~5`1^KNZS$U-7V7w`mRBbvzp`;?4mX`Y+q@qvcrma%Wm^>$Z z9%HRS(Lnua8vTWknnP3Nv}c4|@rE^o+yf9b`B7#kPp2)t6xj%wJ*)@#c`9@~@#M_Y z6S;-4s65n(EK(l!iY7m_CpTwlR378=6^j(@=e1@MxAgiPNLWoBO36`CKdf{kL&>Hb zMJzcP^&?Lah9|iu6m?+%g%j^G^-jdQ#6``o&ujM=blrwpL9~YAqw98mIf`HlJ~AM0 z2^^mM&-5^JLh|PRaZHkRWEZMj?@GEtA)_3k-WAlE{lyur=7`RG56vFqanC>V1K6&C z!#e{G^026KV>dlS{`o4c>w2*?hATcKwknZQD(^D!gT?G8PD-s!Cx76A2cpZv__nZa zqeQ&w)=S8NuZNe1`b4ls_zixIgwrJh@pN6AMDTY9roE=01d5d>P7^jV1n=5$4p-h5 z)S`AlG3giAd1+xj1247Olu&Jc$Z-FEJ?q0f%RBjio{gbr$2hDMZZ@w{b733Rk=6Zz zAOoT6kqehz%kl!W1}RRN0@~2ws@{oV$3*2ETTHd)dUzIY#&BJZa8CSd;mR2LPLXVt zCa`BX>HK(ynzsdFCMPw=>IYXmrg->i!gWlUH5zn0jbf;D`220pvVgFcuZ zh^ek#uRIFUFk!EmW&J9N5WLfGXfd^v#f)VZqvDl*K+dAQt+6=Y+HOc^3qpOw@Weie zVZA5>X>XJ6%eP)>N>HjqEriD(*9Z?@3Wg3CJ`5baZg-Ok10#k<;kin?vqz}5!MzoJ zEX*g3D}gYUbl><-K#|R~99S)*208*kG;~2h)-3NvY2V2)3JAMPF()Ili=N{Q+nQ+; zULMC4F_%+aY8VAB>%JC7p-Ip*m5H66D7$$&_3^BQZXB|j36b6?cTV;sRh)UPkug$% zj)6t@H%rJHX%G$AI9MR?yS6BghwJ9By5!M4EJ&VsjSOh}N>`rOA*)=*wza#Ge%x4; z|BRF;F~J$i6Lu(93&W!y1^m&CWVbY`I7h~qVETMw6)U}*!!nx@k>8fPw&tzkwat;Ax?sMRBYmvJ3ymoMw zy0FxG6WOpQnT8%tJM`pxk9T)|6Yzdj$GAV^A?}Q4gohvDu{(DZkx1KJqWV38uC8cR+sVwQY3SB@ujRUBTtF8kwx*~+6GkLdUkUVKdU#~HJm zN|BN%bXBrsZr5qb{n<6d#g#4=Lj5T|=$Pfu{xbV0*m*NfdH_Clf6qK|t zQr$nVP5zjJJfiVQkqBSsMP(U~)8*Ne_F}MjH#N!Ns6tMKsP z-t6cy^JrCgE1P4t+MXs1a5SeChABX{cTzBe?1jJo%dizk3jx<5L+reY(if*lL3?I>2wW(+*5d9L5%MLC=1Rb zz3dRt+n!Xy_e`CJ&C8{#H82-txm91A{4xOE>hQ~oTrGxLomle}|22(dKsgedb96Jw zfC1+zJ)E}8;N+@U;R~#r;!y|TGduRgy$pbp3;@qjEPy`)JZ(e}AogiTAf9!QDub2t*ssYXxKG88}uCyDnG7RdtB5Uw}xZSW+a+ z9qG=fgr+{Tu#N>-*Ri-%t8C1ad%BbsXBg!p;s7fq*t#fS8S{lO7rIp^)aVQE7z#Ur zAo;>rs$ev3Z6J*2B^o(8rYzW$!&yCL(K6F{Z$jvY-;MSt>fr_FTwA~Q*c_x%D;2Hn$ zV12k072@{J*oI+e|0rezHsSIwvOBi48&JYE1TrbqG5%{7Qt@i*LRTtvK~(m6I_=2s zL{-uXxv-kCd8*t66s^~GcXSObS}D1v{`yMp*Q~s|1(J+0+_F8wF01PnM*L=1 zYY`p0q!zppQ0*9yUQlfQwc0ezgdR@8V^CuPfiC=2Al|)#l2;g&U_dTy2K>iB!?(B|o3wB>EZR7UtsRxf#>FIj15%>PdtXYsaxUfitaWU9Qg*zFhr|r9&tfAc#;fn`fP}0>X9;VD~{?*#fu@-58`w z4iqgj1#p84vIr1xL}C~U;44h!x)s>6!`$;m`0S#>1@D7h4%9HSV|Y{}d8fbiL}<_Y z@IOL)Vh?egA<-*dm8e%+e^e42f|_;}$JTdX7$f$bgv8($b%{+Sd=oEBMwcyjAjUvd z71d3P&g`zNi-x6i0&+sXviw5$k}+S!84*tZ-_NNyDoe^Jo_R@a)X){w5T0L|I2TQ{l- zdM-_by;xeZ0ReGYZua7+YQF19s(ZTfd*91{%180%xg7~VPV*`f!#)Z>i|wpl%;x(L zeh8l_xn_mFAr-*!-u%_pp9WBagiQj3^Llq@X<(6(7na7X{go^zBl(;f=Yu`rcX|nz zF;iNuh)Q-itTQllY% z>@y^~?5?W(v52{Ji7v6bsv7s_^nMRncoI}GwCWPDk-Oc)->`pBiH-SN+=#zicetS# zZYdWFqJ)ncQl2mkoiUDwaZ=LZy;c< zJ;_Vd_)_@QSa6Rilt#!<03)1aj;evcNoU$||CYr`YV8D^`qiPpN_9`a0MtG8_Ch}c zqtBlL6Xfjyp@!e#BFi?kkagyyFbO^#0s27{%)%nD01g3?$_D$O5@F zm)C{!h2wa-;}#%1`d|zr3ARs}@BnUF91c5&%KdQDmh#wLCZ(xaW&KfRI4hrZtE}hp zzi3$NZ`mOVVg3Fhv`a?sCsAmufuvaVg#^9de;)gm_}kj)07f|sg)f7~H?Fc?LjeZl z)7BLMM!0$u8(S2M~d;vM6<>?pxUw5z0WrAd(B0@>7QWw0Al1e-FJA$EaO?(;y3(3I>u6fp>h zajjbWUfe!s7S-D%W}JSkrQ!B#{x^bZ2LT~3fu3!;oK$zv9qG$u3SHV<2$h+VxH0Pxz_)u-4`!ar#+A#-wX~BC?mT=8oOs_BOCE|Z} z6nW3P%+FD9_{w|R5^i<2VEQ?A#b~c5UCrnjwl601IKHO{z1Khww;y*!;2G010B~E^ zb=wy+1<2>}T7wIdum zpW%GedL5;&zazchShT1mt=HipGLu;k!PeusnKI&psYNR@5SBzXXnz?>U!jiHXV4bp z=hJHv^fm4tQJ||?>odcYsFa@WhV@=A#pc% z4;S}7LF)GGLn44xJ%Y*DwW=4Ey1;JKI^1iS|7Y)aAGWT2f-&6fvG}{RxRAN+_Zc;E zO_!B;KmV23*$4{@GPyDAEb+ejt8GkG6b#DMwN)GX!@wJ(pbmXM^!v-=y_dpHSb!vc zZN>{rzkv4Lg=nB$8}!1mPTN$sZ!3HR`2i-ccM@p#rp-nH=EEHqx;9!E;AYI-*`d41 zScFHG~ixp_{maUU2I#29_yP@si?$ra8R%1)ep0st+_l^_&%=elOgj@Xk z-pPF)_pV{1-il(Ost1j=*ZN)#Y|+M1)*5A>i<^0w7TFS);;^ZY*0n~T zUO&0-py{&e2kM*G`kITzB_GWKJcoX}sf1Md8cPWr>R+BV7RwE#04!h~ujkm~125^F zhEo7GV5m24R*j)7yY)$HDHiION6pRa!Y7VBUdA(u#{;u*_P71-U9(hU!=g{VFKhNI zC>GJ(pPh%lnnhH=IjKCXQFi!{;sduxs8h$#Z^c->hEONZQzbpxxZE1MFvS;&w(kC9 zKW7`og zIa*B4a$Qy+)&*y2B-=1#Xw0#+u_GI9!fXW%O~mIAiFg61)%ZYPbFJ^E=Dtxz?p5>h z047}~U4?S9Z|?Mssk5xKoFmZjLicLL#?(hluQoJFGLZ~q^MiZ=0G97^!bBlM-5KD1 zltA#p^dCbQqU}}EvB%TiTgXGCTJ+n*ysyxUz6wL0=i(fwy zQ|Wi+H)#8rZ9*&i;1WxUvMcSenzz9bhdPfnN8zU}CoXx3EfMzKyI?7E&$6>dAr<^m z4s5Eb?eF$Ed(B**{@g%=TR&ckzoD(Quog$dk1@uxtP2@W?-1E3ytYNOaE&u8j{Iol z(J`g5zse>7vGpzD=M()qE$c9inVbH{H2(6@&ww00i@K%XNk(D*Gxkv*oW16urc6Iw zwW#;T$g>=T)WwR^kp5ytEvyfAEc#0eD7?NE)|bRQF*j#Z!oEBUNX>eW{nM834m;w7 z0D#G*`p98}WOod90M$nfNs`_1d<-!&$$E1CcO>i6Y^fY>H5elKc7XySnPh#7c~1EV zV~aTl%fvUxmNBwl;Tib>HE+hI7c9m|*Sh=tfJNAh+`v`>?59J8DWIf3Ojz6<G*|AB_u`LGf+Rj~gU18?ri59h&34ZpB9V|RE$DlX9%@8wq4lO`W(Tx9 z7FyB=#38F7KwGjP28x#C`o@Cr+2KRI3g&u9dmk#oDZiVIzf09SVQfCjE#C02$!5>~ zF4=tV{%2NuHY6-dv>^+#+2h;KmiIatK-)`WdR(&sVQq5oxsMAmjGvM8RJ98HBP8B{}PRrcl;iV$QK3+kJU3^C=(vx|x@#7m5B3Tp&o04A5 zTw?pY+MZO=3V(Wy`r$jz)qt?XW8>uIy~1$BhsIX$RLgq>GACnF(m9rZ?IG3za>*T~ z1HhnzmP7Vrt4AYe+xrC@&P*mOIY%fd?D6`4sN34#nQrJWVbr_a5&xp@PyeEBQ;xBm zb{iV+GB_X>%(D$tpre9iMW&763)=w2H}ImeC~R>WQ*y@u zp$d8aA=(RFl&*>*Y=vjMu%}?0nQOfvVV{K@1)Xm_HckY=awpsBnCFwF= z?DE|xj*2n-J~MpQMtQ#$GP#S>lcRfY93z9sa_-8Y3Gg&4huIOw ziOyr0R)3Ooyi;z#5=uOFvCzwCb5MA<$dT4pV0(&6Z6zMx;%28T3mduAh1bmq<4ZmC ziuE1TJv)!6tL{&-*&}||Ikot%vKu1+#`f>I#&h4kr>R+m&P|*71GQHzRqqBD zKFi$=iQm}RkA#pydchb@V4iKD+BPuXR?`neX%c*Rn)s=>YjEA$!O!oA0ln6KK)(2X zdgM7+5>+X=Iy>P>Cb}=^rGL-n`^#=(9e9mGps+((OGB-iF$bPp#I(#$i|r@pirEAjf=$_K=*@D$oo($|)r z@x~8&|01D3*`d#Ky@?aDOi(4(v*yOw_P)0+mcGTDuhMJZ`n~tW87VaYX!Y(Q{=QRg z0#UyA*b+)2rT(4~>bnNdz3&ZWb3h=5^>}-!5eVS@6#R|vxm|SrB5|qxh=zcC=FvG0 z!ol{TXLsLv=$%&v7{|FShw<7nqn1$-mj019X!U;gG9T}Z+tRDKTgssz1MUV6U=C| z9c&Fzz3#CVH_gNibn4;6Jg8&}BpzFa|K~j-{X4oRyusdMr9NvAN&QWa;*R0jfs<%( zQx#_(XdS&U`4!QcHEVS%YJk>FkNq9PEe9~exo6chJcb#bCd%MuR0ubErQ%Y@yXbn2C*?fmrK3 zk5%*FEe?_EXj!PQA&aYVMLh?gM)Pl}qD+N_4o|Hqpc~*-T+;ytRL@U#T zbyXGv^l9O%f1M&_iWg;FL^z_%{ec$?fTn=9WM6s%CyZtaU<8fKEId=Q%)hELR z&DSyfTi(v-Cj-Yy&~FrxVP84)&~=%m>_>U>upP+lw7;t`-$$yM*w4)SO}hJf@La)~ z)WzR@Mrn&xm?Qx~R)&3S@S*FLbr73#^DC~+Dx_USChK?57X1j)KX+fB7QffF1WECV z-)eVV54OX;0afwT9$yPUEU#g?4u!YOp^Eax82IL;egh(QfyAxuE(_xKqCt+aB6ula z(B1`GX1Lg0rH%L<%{b_i_Z&apx~ju|+<5b(CSe(#&AaU$T&URVA@=XQH9(RuzaULh z*pKr7xwU*bZ80~9w{@d)3fZ&6@wZD!0kZ7tcKe;tP-o88Ee@1Z?Aw@htZX94lVZO- zy5zdO@KbQ2`l0?2Kjb4XI*`0Ie1}tunc|JJ>BvT?esf9N{VkMWo1lds?)AIlARMn*JnnTINfuj8pg??DS(G$bTL!j zX?`dM`j;Jxv4tA&LwEutCZ;H2x93G}G6oO&&|k`HIV-*qe~5CJkOHp9Sw~9^l8TnI z(uVqj%*86^BAttBQA;V4`P+UDUcxxAK`&r>>z;)yP9wSBGoc&8`KBK#<)cf>x>lCX zIWZVp`oBxAPVk?gqcq37Epy~05t}o6LG2_E`)_+ED1s_nlE5@d|1QS(%YnNDv)HMe zadVnz`H_`(uswN(_s6Kx2)55Ke=}31kylWaCMN61BP{Stmdoi0{z!V}bCC2@y|GVg z9aS0|t^?9<>}TWiz)Pxb`#MoM(=N4j1!W&+DqrAoL#rTz4ok=^HGq0dRJ^7eL5=B7 ztUQyI7)_cR$?WErB~US>?styhVMmJeWK`0j^zpM%Ksf!d_EAL0Tw{#Y8H)(qY_U zQ^>gO7;H5XW9!r+XZk9%5kzlqq$-G;K%W`_A`DlD6YR z{e!PYhu|P18Y#C{>YSdI@xr8^W2ve33VeHC*H9m$y2iZue!RkD-xotE4oaI}2Y85p z+->Q=aqVT#Ys=EN^oqe@jr&V-E4Lwih$18Y#zVRgu2}FfIwPP0KP%@^U=_3SCIymj zJh}xf->u|n&P`(q6#sYxV(=8rO-#_XFs`BZMnNC`_82>_K^Tm8Z*Dd2!;W!N7g(9M z9`ziUkd12G!WSvvWZGEn&AJ&EkC=i@)cWUe9>{Pmyz%FztetT?WK1)Aj+#T(eyLTU znt}q=%3Bn&zx8kggzsJQ*4Ul^RhL@XtV&pBakikNVJIq^scxk`$-V~1Sii8K*$=+M zVi4mymgZU$GEF1ns6DQIp}x^?lj+P5PPC`Jlx|Vc z;FGv}wFFOBc-C2xw-3uG$pS9jsGm}np`g!Ga&Bj=QNXO2vR2iJ^(0h{E8XMgAhvGu zT+8^oEuWD{BxtS109=2;-d`tT@sg&dHCQ|c%n&+u_Zte2s^?;E92IAd9+_e04gF~A z@i_G%00_+uQ1#vhDRobtiz?NRp7VNdJITo>ohsi0?N^0M=hHq|=gW35C9&!`*prJI zQa6=${X!(W!f~rbt$U7>qD|X*4<`mK;7YKAV6$i({=zT(#%vjW>xKxRn9~4y6r{GE zP=M5^-)CW!6$)&Rzc(>;&k?G;lg;~HJPo?P)PCjIrW@8&9(X%n%-dw#_X%gHlCxfn z4QlgNUQGH3JQ2FBp@05unDgyf_a_FG^TH~9P&~=AUo*BT)_N|sfAKo30>CnF72o-X z=Eah^MNFHRrk-ZAH_27eb1*d9 zYh-TaZq@QQJ0f})j~_M~_t}WBK&Z>dP?ruyCWjm)MowGhUI#|TT+N)-dmD5+!j5@E z#Yn3?yH)!w%I-p5N9OL|t(tA6Z>O6}44tFxhR7HT-#<83nmy^5=xBf&Oy=_)ygw!ejXWwqU7WwdzB`s|X-6hi zz&`|^(@~JBEu<2*!{EL4f50&6oAo6C=_W3IMGmsl&PwCNppOi9iB>zq4GgW?{+Cu( z{AHlQdlPhyJ#97%M^b8njv_{SX)g)9rzjE{gKxzU_{NiH(lEcXggr;v{U@SAQm#YK!6f1`LC+!Bt5jjH zQmrvyZRUJBdOX$SbIYze2Zy|>YDS7wrX=qx+XapBvY?d#TmGSQMuuJRbznA zB_6#T0xw7YAbXNIvORg6q6ps4hay&CKPyDiEPsS>1!MYTPwGk?6KoTsIj8(-4poAh zevj9j2M!+M*XrL`_plB+K|93ebC4=i*R0!VD!a1qLL^#?J1q3x{}*)27h4Isp)E0? z2GGq}(TjEL)uaSUN!M?$XJ;FhJqe+l zn(gi4B`kRW(V=b}W^dd-^Gg;(;MCL9UFkywRvq%9_D}Dx# z<>?@)nJzCY3CE(Bs<6u}j_ZxRnRZqPv|opIC_)=BtjE;PeQ%{O!X85!A$(y^g&8>6 zwIq$L!qsGny{LP|9PIu5D^)KzUxi#vLPWOG-fB!!XB?+6<7BQupZ<)>`wpeQIi(_M z1ir-#eHL3$9JkVb^oOugSzl^LvsBXI=K2Q~f4B)UIyaT(ornG#v%D#`O^}{Zsz-O~ z{tdk=04JKCpI`EnB|t&vX!B$>JxHe<%Kvnl2bDB4Uc88H)5sg0K^u9a#QcB0@A1#S zx=~*JMmaz4*|L#^xXQkWph2A9ojnBoOQ-InKzY=I2v%=5?t|Cr!FHSZIlQ3A1(zXh z=>8h|J%vVi4ftZ1f9o2=9-y|AsLgg7>J6-YY45#_cFuH_C0Re^S6BYZYsF(@GV&i# z6fxokMG^Fx?Om$b8|9%_D2f2gSew1+vc~M=6u+efMcV9TjHirC*#RUYA$!tR`9Wpl z(#3R~9v8ejbV}l~4J&*nSu*GOOtNDpKB>DvR&{a?)7r*cRBYlxK4Z>#l-`0xxp7T5 zRJ<1;BEvszmuN)sR*OMO*E+UjUDcUZ$OzbI8v_>CIJW^fX3NteU> z&ym!zi#w=VzBu|nP81r3-!d&#Z?ku>MwQiB6e*1~k<9OdZ8&}bB?R^D+3sb<>Q^S} zA0_H16j1C*;{Cz4Exj`6RBO+?Acdik&+AM^3~g;Xwx=lr2Of54tv*CxWNO1v+nGpy zkg-cmg4usk)eFGdeYc@b<Rf^{(8L2!787Ug^z(hFQWLiATD2XNPI~Hosn~*s_1;~hd*b4@@G@3ZN3sPV< zJ)=Y;?FA=I#>jz%OEQ6jj_tkV~wbv@XiMG^3B$7cU^ECVaw4yyk04~6w~4;E$(+iDr6}nVz2=_vf4rim@%+~;P0z>EGLpqPTnE8$)7*0z zn`-Wt^~^D}v;7b{0o&(c62elj%5?fuvK(O#NM)EDw3{()OdD;cpUE~wnpT&urEd42 z;K%`3orwIRi8<0rncN^5b`f!L>yJfWAg)N`SVLLor6niX>@|D(E7F*W(ssM~U|(2T z%v7=ruV5K!@hb(e48@#?#KC-e!v?GWfvL;+yd|HDpJRBdo%AtLuvh~tfXR%9RI}^Ut=}_^U3gE? zFt{CIcMqGTa61-a^bX+19U5%*zLLpa5FPOCC(ywK+ZSvTO6*ru)DR63a@j)*@3>xI zDSjHFse{X{->{dsA2VF0zS*~iHdrJYHa=(&`exsHzI^X%(x`9Ngab@Q`!Wh;&^J3O zKxR-Fk&he)MbXcsJxd`gB8ZVTWIru$Qw_i_PtR1&thA*;%;^7Wo!y0(E5uB%)o>B^ zfE=&2@57!0E+uj|!PBC7fTar8EoTCB4Ea-w0NvZmw5%fF+Ylq@<&wv)DHGo>$-H_x zvgF0!o`P&AjY4eo>k#(RUma5%cB$aH3x28Gxl4_~L-3b;K2~QhRAp+&rJ5ThBy0K$45oYgO7Jq7)(C>m4A9QZg|9iX@7>8qqdwq3S(x|mJ`ZwOO? zROX%c5W&9I<=k&ds6}Ojr6pgN20j1p-=1dqukf(0+M zlh}6+Lbljm*#jnT|BWsZ4jsR$Qsor=kv!KVkZsyYZgTfOTq>B?x0t#2(nW9VD;N;A z5QurSlHi!LYsG4=e`7*S&joO8fK}%d&9unkoypl#5jKR&Aji;>W1`;kOcE>~AGAPA zudM)EP8fSHGO&dh^Xu#6BPV;ae0@L`lszyukG40!yJnlc$o(p&A4h_^+J5AxO*f#2 z4NU47B561`l+nZg>XL0}uKc&wwwOk@obzKwo7zxyL)ge55)~^`WY9CGk9XEm)*dbY zk_nzWEWhM}u4_$zaNSj8bWDpZY>D#YpphXi)G4CMVzR9q8TH00Dl%Qp0R?tnd}Gnb zsip-!wB9>7A!uTt>Z}4)sjEd5A8b2mHZI%FlX2PGLe2*7>S$w)3cpQ#mKI}fBR6%) z>bf5$A~VSmjSe)8e${yX-=o#j*_UH7MS)(!BIi+=lRdlj1)T_ixMVQdg(%H$(u(%o zwcVEVu0VLRW>4j>@kh$LhD+BOqTm|Q!O|sK?~HQtbXoBu-HBUsknsFq>TR))*5C3E zU!f=As@SP(;-@@4E2~SCtb@H`dSm!0=#2r8E%wQcfXcIAn_$Ygcu*BC>Bn~1NCZLL zPmYNK9eXm*h0Sv+DeubLv5p%J1ehinAn@-dnYP3jhj%X39>2p-wfGGih^P7eVW_Ah zhM!_i5ZV%D7^SzSQL}=F9ex>a7V+V(HI<=)&y8O(s4biG{VlWZjTan$wK{Wa>rXg* zz9;KGgR`6h2g9E5hxok|(?(6>I>Rt^Vx!OZ(1eml`4zY3AT85Q2N}v9NkOAeIn`7Z z{zAl7FZ6-*5+R*2(1i+LI(Htt#~!zHfx;X}jLH2L`DZN-x}c7({v2C<*X3Uvx?RuZ zl0_Th(dYJ}LuRvbO!R`=ix=D*nYD3TZdLiTIZpfx>q`)-jO$JF58XaV2Tbsu9_IM! z^F2H;bI?6;e`-xS{iqd)nyFJfL+{}4+VJ6PQ0MbtZ%`*h!hcGZbI`M3}4{7zG|Fc@#v*6 zp|melh1K~`XW!AGs^CtaY!E`aYaZq|N4yuFh8YUSp{{QV{{eZ946V(?BRC4U94*HH zF_!^>p5<@k@ArkOCR@&PrS|!)mAjlu%Xvo0CWy@!TeFIsN|}llxij=ppHo*{R$g6J zSI;eyV1*6tfHLfL>u5>Uy_rr8WMi?t$x?sv0j7Nnfx*-UqXZpzm& z;)_M>vtO3-Jq$#NAQ5uA?Xg&J^kw{LQTlrr=8*id+NU-!V}m2njupfyIj%*W(0?Us zQZA$2^5&_`LCB9iHr`ltXo_IazBQN&KcoaygB|k0%Y*g>v%kM}K_r1&choS%Vw;a* z2UJ*pCz{sFk|b}k)u{4m-#AkglC;1t_DOl4+Ve6d5ZGZ&&ZM|$ASuXTWrgc4QOp2< zF?UlpUNrCXxlm@ZK42YrU;LKTo|o~JcIQ9D5|w!4XI=FwBs+LdeKxQ$TcZ@g@PJL+ zLwd^H@MBZDTXQz+w;1e@EnJqo8IX6G<3mMr$yXw3rl8-cI&^#gZP9YLDRd0LnWPG5 z4`5$k)-*~*jtIX?74xLL<2^z2`&6JbBzrX^8T!;+m^+t@?jd_i;NhRS3OYi+d-XE@ zD~aSdISza)dl}zZM4pdcnZwy~{y&|%=jb%kR7p?DN12@Z>jCWSv!9d`V#O7fmZJ;Y zs9l)B2zij@=w0-k6&gsGaxTdT7A1p>XgxVU>io&SqTE=Qgpd&VQk~DRte;J}K6^kx zTQs+7K+q-7`lO$KDPexY=p2TfGD^?Km-ad0e3-7 z05?<`Eh;Y6fPmU#p1;py$THtEXU?2Cb7tl<=M=p(gC)xpeabxxr+bovkQS*u#$0hU zvh3Fd7aS+l(3FHE0UDUmHcNJrk`vCh6bQ$#`w2~apqESZdd0|cH2w97Do#l6yqs=+ z@@%@gLi&9U`Hx!RdMQ@i`^^W0uup@eLb7E?m%)~)ZR+seYOx-Aw%MdgJ8y31>Ys)B zr&|W1XYA$E$pf@iKFNP*A9nAoXgBB_(R8L*jtLh^UzX-)D#3B#;`-#Sp{vPhIHKzK ze1kNDR!`QmY7x6KG}EK|)Of>F5~lT{jV6Vyq>lz$@2!1_K?_&+h*jCT&whQT+p*{s zWqW8L_f!{JfK&MFnp#)d zsT3-7kMr@1$;F^Mk)6*Eoh2Xl=0cEa57QzGkrD&BwXx1WffjF2uZ_Phm}5%Tb3=Z~ z$G0adKHDMn@B8ZIgPqdKN5`_So2dR<*(YATQa7}3y>yc_@GJ66pq;`6?@!8!=Lr9k z%!+Wel-mX^oL0h{71Y6Qt6{*U{ro}4;QuE|dgyEWxZzfXe&RPU^S|Q0sz3KNHZU!_ ze&!6CNm;k18Q8alJ)XBfWywWJx=v=T0ub}!R7M@AN(xcob;$p{NI0?bU1FiNk@J=`1tHfuAes==t6@+Z%5K zi9ON@W%TXs=~PC8v=8)2v*w++9=MAmL8HuFT~*+8@ttLW^+!3%^Uw-^$Ip&RSNDZI zAlHWzvN+-&*+;3NPV!wS!ftE5dKsZkPYBSs?AI|#i}Lb>fF@#wcsQIbinyD5{k^1d zKnMg?&k-LnekBM{kIJ`8n7JrU=QeC+)^M4_2l5%&BevPcZW{<1CjttT$$GtqK%f^1 z1PdjC=^aYj)mmEV~ET0|7_RoFM z5_&%>4TVc(PnI?|yAfrxFW4}|NnU{RPBSPkb9n(ahWPjUcWC`2weLddN3t1-ja_|& z1*x8s2P*driCiJ^uS_a=TY$nJ_}u^OfN*rKTWe^?WWDdg?RRCf6B`v?**j7_nPeRzyIhLu4^&SOxweLOPXXoaE_PEB8}+^sTT(q|`w`_rNpNM7agRRg zlH+Js6waQK^H)n~_tY-%tg`D`+NkoU!VOedd|2XFnH0B=3a7hL17oOxEz`h;G@K|~ z0;sTh5DFX0C4rSmV~VM81r@HILxs)J)WG?6+Qi1@;A}LoW>5<{rHVRb%t12>|LjVg z@@5V?<;rw3*jR7(0zEiP1JSAd(JA8VlHblJsSc4e0tZ4GWl1@|qwowP3YXZS2i3!~ z!A7dT1(ZLR{CPe}dBlRkYlc5-J&?Vcq)`>4gEa0C&s||8=k8_CFANdOY|ub$8L=_E z7o^d?orz9MY=qcD8rsR!z~-rA(7?VnXkf}aO2~OluX4zF7d6l_s|XDoZy%f3D2OJ? zGhQQU1QX?wcS#yme&E^XAW_bJ!-T@=_Fy9|h6=a5)(zbVv-#_MQvN@vfxl4UvSU=( z@&@(bW-6?lEd(1=qtV@lX~c&5G*KQph;-u=6|Rp(r))n$h0SkJ;Z0On97k*@&I-Wu zO81ib13vHNK%blDkUoE853MuJt484$K^;*3`SCL)#WXbkb5P ztj^5dnd|2yBD6k5*xM0G)A=X z7uJ^MWeP~OY=VI#{LGUKLdO?MNZznjT74+h^UvY3W*E8?%&NOOkt$ZCDDGpBPBQ4w z{1JU6<13RaUn=X-mfg~9)M6eXgY+!_V2o*imq4=0R(#;+*bW6#Y zG_Xg^pD>C2=EThJYR1?WR?9Q?NXxfWOXOctA!?aChHBB*ut(gT=@C;JF;>0JAV6Ej zv)Qw|o%*HL!EhIM1nPy(g8k#FLyBTAf`m?rtPYM(Hnr${7(T=5g z*3`fxHsASF$-hH$*DAY98IRGuQjkO(vO_U&fI5@WWUdve_{Y>vg$vi$+atNNs}Lh$rdCw>b}*O@yH*} zq%hrYkzdjNslhVilB3c~l2V!E@rWcQF0kEpXQgL!xa``>M%_J)dey@1Zt@(j)=*=X zqV3Ls?5j-2#(I%jwy;MGyP1&9;Uwg=ADECw%Sp)f>q*GjH<*w!y-3I{zc3*mXF~on zoP?}=Kth(zk^5iycc^6p2|502Cb5sbNXT8kl90uhnUI^tlaPxZl90Erlar7yZX_YM z-(ipZ?nOdYK4U^|U_y?aKti@WWk&w%NU_u__O+s#YMnV?1Fd<)?Ktk3& zWkS9vCm~mCrbnv(!-SmSErF#q|E|S*jlI$Q98$^F^A(*MGs|8J7ujYC z#G(1(QA+U`?Os)fc)d=%KE-xaSKel2UPh7aT3ue+n7l1I@zxgGwR)7dzGvUB@38%b zuU=`JG2nr&uOLON9I$;{iB#~7z+@|Uq!I{R;oJI7sV|!4oNFVE5C{@elhc!u($bSM z*Dl|{{!)AOy^yHwHRKha*jn(+@4);?X#rs&$Lm7R%DNH*e%Ke6?5;W1S+~ixvBI}` zUuntf35VuLHdMO(GHvjM9lF@egb4*nb6pV4yD8v2h|J=NbXke0lQ<&PNMFo|j6uR- zM&wzgTjjJ77k21lGb2V7j7QG%cX_gAE7_6;p6tBVf+v2*=1(dL3fpt6ZunVQY*N6@ zeObu9j$E}HT)(LBH5Qjnef=JIJ6GxU)3k7;aG#s$JHBAqT$d{iF((5afwu)b5k)Xh zB!MTAjnt`(h{a0e1D=S{N@PDc@h2jSS_@kJu7H!^FwK#u5ocu?Nde}4CUEjzXYP8} zn-#t-$m08YjbpNVHd1%4bWKp5mDMK&MDNQ-nfE)Rmb-pg;VU>;8aUJU@El2drQ5sH zqQLE&nI}dRq|9|GY>e6O@A7$&D5JIDrr(MAle9y_W*w%AZdr+3=825466xZJ=oV)t zFd`L=F@^p@Tgdj!%$yMg%jddWY>X-L7fLVeFk36S!dH~@mbIc`Vc7>sw)c|){@kla zzkkx1`=;yXknO=z({$e>b0oi4x~-Y!2O^6zeTNpL&UI;PjA!fKouajBHoMH>V;B~UZs*@8haEfhN#w)hjs@UgwA{OiDsOO1j zT6rSMBmC%C#uE{&HHU75>TVJcqO0u#!r5S**3fl1_Ak@CGeI+1IID!9x99pln6&(B7F`_~hqC>yys z8m-vCw_;8rRiR|9s0ejH6%v+>T<5;vWffFdY;yk3 ztzG|VbAEV#*TYWd|32CE-xto^xx2dy<iCc5lBbV==DC`%i5!5H<2(Db02#x#fMA`ti zT+Qpq`+6MJA)~K{DO96MPC}m821&K4*e+sdexsz?;~?Jb#~T&BDQ`sT*Kd+QzZ-=Y zCFkf`nk2%hN088UG}73v_Lu29ki_*XXl$znm(xjhHtePZUT7hosJhu_;_P))>9j0B)~TLm;tvS64Q1TTjjD}Z;Hh9 zL__xs2PkTcIFzvBWwD*;-bMGp0D&LI?ZO-7kzfGRQ=5a<;L(AN1N_IMh@VBy>m*msto z)MlfO1oW3$5|i9%i3IfxJaB!j4z7U^IXx z4z)vcEo;KljVVOWr%xTxGx7AsOuyHP{)_LRt85-KeHZl6A?j-p_u+6K{WTpSz;60g zWkM;rs1rB+&SXL7?+pe@7=ZWSY>>yr(>=8QX69Orl0RyNQcAWgo#v0dm6=0MD)2`Cx&3`_(aDL7h5B?;phyo120ZtTvjI*O7Zg0SsuI^E9t=lOQZJU^+ zD!+&qPPDngsnAvU;SWUYcuOzh(ok^%P7_fOE8ES@B;a-$OeA1iNvIi-{83%UBJMQR zdN+Z;l%k%*N$2EHpd(W(4j7}$U1xpBLAtE>UAW}C$I~bdxR2kTq>Ei-isI405H(9j z-Ce+}O@xRAN%*bXjjq$7#APU=WI~Ab7?9Vp z>cPpxxw^oWxTA0rWX7RU%{FK#)&)~d~a0w;y_NysiO*P%gLrPc3aq6462cSo~ zP^N)F7UN;8 zoD#f{Ib;2d2&2Ezy<@IX7aWhcbH8+mkbX}T={YBU$k*zEYVG7Xag86iM45Xp%kIre z@44K=%c?cRi+F~KcxlD}`wKCYty%Mg6S-L^Z9YsH((OI!z2Z@C2%XR49kJ*>X_Crq z7@nJG#@oLzDy%BhCFjm{b#w7$f8Q1+pYkP;kGcaTM)(Y z5-VN52&Rq;8s5rvMvSx>dW-uh;%N<2Pxf8aJy}G68ceZkUE1rZ+Bz60k8N4p zGxauAgliG7(Cv`zX-AW1?)v-N#^bmdqH}pEjEz2b(T2#^EhG#hwTBZ1C)PluZa4Cm zQX+q|u|A9#3b-%DbQp|%=B&Z^dGme6&S#}tRldL2bF zo}WnSxX~6h)O;?RuJxc<#lnsOe~;FBP2dPXJakQ#gqYxM`VoKTAZ7%WJs`9uttb(5 zb9arJFPonPOc!?%1(tCILWMGu{iz@CQg++`h5HUG+}Bd_J`Bix;2kpvor>V z2D~Zwdm80j?>wPwzwAPWaI>|k0P>l{B2hoCMNR*geQfI@(;GjGQmAb;bCO#_0Xi?x zO>Z(C$l0}hOdMs$W6iR#ARpjzgt&Ry-!md#6jI7W2=B`#+&MD}SGP%5ajc9KS!R*9F@g2)5`f`=bc$s$1@Q z{BsV9V-%1%yybV|h%iXyP>Lur`;_7%Xi5%i%DoYGV@*&nq4PZ@)Fo!0`5PNdbSr8G z5K2ltGv^~u0xQ8XUo#1@=-eZNS!=Xw|m?8 z{!g>SPrKNZ<8ve`G6+gxa^v0J z?(<)w?`w&~IBoS)E~557;}C4w&J8|jdGfxjXdB~k4}^lr8C4K750>wcjAjPo%$l3- zm>HZOlYmn8<)_;yFHru^6Qk@#cDWlxwro6#hU9RFNNx&${0@b`%DYoSL0N@zbip@% zgO`v~aXyVCYnplQF`j)6Lwj#j!58xYJ3IEG95>4Djk3EwkH)uxid9iDeNzHCfo*>KD)4OgZm8_FeOVh2PF6F}MRDjQ01^(- zO0d*(`J3IOxghyn8@B>WuQkVVKMU@e`*u`NxG$4eJI#GY1mMBXSA*3y-WXyX(_*iP za8*T3d40?452K*GQ$yoFG6+AjwaES-`U2sHP2F4esy5TRQtqD6Cbd1R%${R)wZTxu z73~x}2fMoG1bqnWW7Lr&YxVy7tf!@`&x9uU2V2u9_mXYyrL4CJ{`0>aa^=7^#AmZD z-8q+^$DCwkuU zbzHLQOL1Cam4swYRhLiZ>`e6-khxu7?*z?x;^%ctILe?b?sxia^coj7Ax-SYc@_fu zt>kcjO}Dz0w-kR%PvT*trA2c4_EX%j(oh0PmEZ>XDV+6 z6Q|aww-v1CK88RpNGH@2>lv#bq)h8ZMe--MX@_$*J z(LUZOt2sg`%KuUf^ug=IDlARWb&gYD;P$8(OCq;mVfk6-=gccXA~l>|*mzhMF34X2-UCu;;Q}-6)E^jGlvr%j zBJ{}u=8=<nJrqM>#__xbCi?Th5H*UxKU+5*;&BgNy@%s6lN#4FUqz zmpm=V^NPKyvB>@mY0^A~0p*t+&HLi;jCWQPrP;{a#BrR+`}1h;JfU^5{nYO^74ce5 zgIYt26X@*%nx1>H>?z|5ew>5pc^*p~3Dwx+t~2`e@rYH;F4JyHa+gLsO5F=%17qXo zZ+lyrGogB4IM;X`#KSLv+!hcoHFd;`Ev;a!&RU8K*Zp%f?i9sfpiC6|R1*7gpxewk zPbNQmMglZytBmpuZuy3iS(Bk{74-7Wfkk_HbMv2SmcbEYXcVsK zr|E*vCm;(g%D(e?W)9c7t7AGg2_kSVwuyc@E4 zPL{32g5{HR;lXsS(r+lyt~DQ${n}Zu5d@mAp?j3b_q>Etm)lYg-omI3aZOmsSr~O) z64!tI{tx?W8v26l@5P2Y)PxnB-8EsVRamTIT_uKCYlm@Sm7f&^5M~tmkljz89>s3- zTQC3l^f&u(%-of>$V5(UgWkNw)m_k!I4&eVZB&BlZc+?5hkUh6zC9YYzMqc2&u>ZM zx~ob^cMJG-WpV9VHiz0}KcFQEw-A5z^I9w%6+fmRYxzM=EG#ckrh1IsI#kx&e#oEQ-bJ)-LRN;b)sU0=FmM z)BT2IMd~lZHoKy7>xAJWW;^v&73kN$1btu5coFqxnnP4W&){{U9=AQz86wJuvdPuq zj^JOzUcLD}P)x)Ji^n1U(^55#`;GRv=7=rYpnNDUkOCc~lTZAZUn$QuB%-^X`Sp&) zmc(sX3$&}OpANZ_xbF{qD17D4cSgY9Eyn{BNggnSh|$&+WA!)aCZG;7*$~&RaflwL z>aa4R!iDdjlx4Lhp-&O>Jdda(Lx=OmVn6@Q{;Q1_o0zl3t&EPSN^F{LHK0#~{N3OZ zZWZ5x4L;+03y>Zea-Gy8cALX4*yj4HdT}~lx0b+L#LA|G<+w!a|CE#@W#wg(wMDCE z!KQ@HVTq&BHL;lg-b$n7Y>>h;HyxkQR2RFQRWYciifu=Hs0yDYnN)=dRTxEwF5@*f zE*q~O3LtL#6_e>T9|~`sg0rNwfoQwc1+Ra_k7g_!m<7S#jW>!FZPhngs?U8BKRo|d z`=Lb?zSFv?eta6$CQNL=>(&lxklXgl^`2`Ey)sJb$lp7nymj>k{Z+Nte9;9V_MqYQ z2WbGWvR>?dMCn2Vt@bpg&{>;By;}U}B8-CBWkrb-ZTent>{3vMGJ=@|sa+^u5X!zq z{^m!nga}V-;&WDY?_}m7zI$ioSfqTji2g%IJkqEx4mTc|QsHz31Zj}<r#fE-7 zkznzU684WLq5Imm8|B;#U6r?<)0qR|!ZYQ4aCCse-I5mBz2+kyzS>!z_`r|;t9luE zbX!|crE%9sP>mixd-YWMq5BYC|MKp}!VtRl$W1Sy+cF^8MbpY$KE33IB3>EW-7GQ+ zhzj|y7b`yc`(DW{1MTyXEw~G*ao371!`ayHa56$*1HR@){!<$HqBb`2-K1?@{hCRG ztUB=}(;!uc^rw^j@cW4EviLiGG;7>D!{IUXQwUd6kE*7dRy9xa9 zRMEKi(YA>dGjr%t{2ZDuNmf$jMoP|Tkyf+wzibt|ES)#OGk~g!{bF>a@eQ zc>B2FTr-|Hy-bgW)wxO#bD57&@FUOSk1k>FgTeo6Pj70_<`O1J>sew6v4Jc|KkQ(`?Q7f{IBXaf1^3kXy? zl5P%E`!l3<6yeU#6WUMPn+o6ZB^2O732^6GI|)v@h6=|IrNS+ACt>>)DlF(rz{)6g z&0slW<87jRjtaMrq{4OVPQt&bu(=-<-oy%L5gUr#1R;IkLiqmigtRtKAw2YRx<`@b ztpUnY?FSLn<`b52%pM~O2e|^Rn>~q;yH!)0!G;GywKOUR5{7$)AHjCtrh63TJ%lqJ z@7fK~%^=G8)6Ae8N;e16{HwvnEk8oEmlAllexDi*G`ijbL^YO>l;zRr9cdihc2EWr zzCUFU-OxBkg}aK0=XNdDyeL2o1c;eF_qEfmNC6LAi6vP zIzQ1GQ8@H)+pK5*aQ7p6rGL2bLnbC z?GPJ)N(KKQY25Ec7e$VeK9{rG4w?42DAE%YWxFCw19(&&Mp)brIZ_%3yeGlbcb#(=%3I&l z_bT}x>W_HZ_svhEJ=9+p>Ar?r5fCT65To@QWA&A^`K%x*1M>jmVWB_M3g4KZN>=e8Ei_W~MK z5EK^DSnGi@+E%*-UWeyTQU-+yZx{fGoDAgUdYNJVBy~`j=0+_Lt5Hb-DeD9AjV>r` zR%0!&j4??8tJY7&H_gDtHPnWjmCa5Hn7uv=-x!0!sv9El)ZCK4JyYqm|EpLo@@(83vYg!8?kU-O{L;ygKI zWG1{#MD91nR6H`;U)W(>l6kK%FLAC*C*YQkOu)LDQKm3&`M*YVMjaD`J*pMokyOj& zxZ*cewGiy)@BA?;F_sS;+tt~;+mOL%o8zNiL_aXH1b5U4)L;5@k9X5jlgBuGjOumQ%`iJwT?M{s2Aw=lZFm99Q`I#-CrV z&>#2A6P&BD4_nh<$d>?+m{Pp9rQi*(nh4143)Tz`@&ia zGQ1i@f>D9-14k{59F??m)H1`UnX@TA;Nh$^2b3{={%`Z=V=RQ4UmXZKD}^N_D%d@eazs{F2u!9|}mUUW<1%Imk3W!4nh{*$1KW`dWd zgfn=lU<=@-Q@`_Jo+?D4dL=}Qzl_scD5kVIPZyf@3@w;p$(kh1`q%*7v^_u`-KF{I+ zm=A#Q{PHsc!+4H42ms~;uNsDqyxdZQfv;n|cFhJb(%rTUsj3=!$pk%Ny{1pQzKxV8 ziZGt~>41@XQx*M2Tt40Jqs#rST<`aBYrju^>i6lhe$93RzVsY$^R)qAjU8}n+JJw} zA8>nlsgvmV6Ce|{91v2X_xG1Iygoy*-&CRu%m~p4Iuihdye82!@3hO&_H~m~kMNfX z{s+*-Z-JDwglM!km*yzzKLfULw_Q$xw_9#}6y}2hfDrot+c+F>#f(J273%?Dtizka z>v+?EHzoAuRw5vcD?_%D@8lAK_`|dd{LcYw#^nc4_b8 zkKqQr2VN~m9(@*j#X9vK+S_fY-HW~5NE17VYKS}#BtVjH>|;JQzf0R^75rZ3StV_p z1<9wJ6^xY9x$>ECzcW1*y$~%S;$=ow(HC4rb+5^jn}Y-++2!!Z<_aPwqqs_@$Le#~ z!beO^0O=YcPXq}LNoeu?UU)`D56OH3BYDz9BqLimlDWZh=d*%eOEs|yXArvbSYcZs ziq!&+@u;EJ!(^`&3b6_cmM=F4sco);U(N?ZkGLbQ<9u7kbrL zUhZ9OH5<|d4Ae!(wIoz8o6s!xI8W;_j%|p{_D^aD?JrYjKb(aluDMSWv@fdZ+-Os; z5eu^2?IqZ|X!%}q#vO;UdX#!Rt4h2eyLf&M_KnR`;)!CpHY;Lz3C`ya*mlHn8B_1S zQ`Br{SUmwU11? zI;}T@O9JvcolcC-H%5Blpqt+VvAF((ZJ>!}@h&hVCzvZ)s`Bu_b2#Zx&wg2ql1fZ8 z8{U4k*!$sQXr%Vi%5thbZbePUlRtzPX-@YrI!r@tjtp-mMlC#}@i%H?gCMHI)2kq= zH8*O13=r^%N6gg{BJyK+dG>Jui%N*YEILj8F}w)h)H+S3_$)lcCi)i3w{!rECoCw8+Ap}|RK zqc1q2N^IzgVPIBJ5%o3d?SYJuUWW3MIfR>%6WB=IMi9 zO;Es2uob<3A+8GR4ii@vo-1o7xrS(k^^pU^5ill>I@sq6adEJDu%Q=lak=4ghqHo> zAywIN-Dr8p7m@D-bLhLKUz9(=Cc8juO+qfuanTS0R%^a6ybJII2dtJ1mC!z@VlajJ znDvGDRIuQVh~|S|!}Zzk3EcfK9o_mxFa5A*Zm6&sd$H~g@kyuRB)#{?W{f)@JepbS z&*N_vyxE$Y9k=sh3AXgOR6XI`W^NTj@c!DHrRr%mVDs%Or!@==Zaq(5R7CRCx@{oJ zY@Zdftoy;(QTHCgonsQrO?5sR(;59*1ggC-)(_QMN8h?xw3x1)`2>ReOO5~Rq5);@ zse2Fmg`XgD2pUM4dp-(HRToC~L}=@bwn;k=oukY>oej=1@gmTs%suCWtq`b}nR{A_ z2PmwWd(cjyPYDiFSmvIBH!oWwdfl%TfCS6j(`o-qO46jvJ?De5?>7$O28bS+d+Oe6 za-E8L$IJ8H6NqQ(KbAcewQ3TF<$XNj>E4!|ONZ_Lc(64%%jS6b#B4ga6;s3DN7TvX zt1QEm!}+Kz&3)Rt+}6QJPNbA@bTL8y$k^>rZw=x4#AeJ3Nhv)_r#IAR@!{crib6*? z??C_NKQcahS+;x9PAaI=P<@g3PxZm=-TkS)$qL#peAEo;O`#`iXoM~ecLXi5yZW*1 z3t!yZco9D1FOg$x;B{|HK2o>i-B;eqn>gg^V^H+niV8a(b>%wNH@Rxj5D&Qlgw;0s z8SQ&);UGuJn@fPACrEP+?NnQpp(^ADaAH_oPUbcZ@=ghldLar8Q_3pQ>XVOjj~wb*a&Nte zQgjAY*|C!!F7Q=WEz9xuX$rv{;_2uLbJwak-nkI z3*s6v!7KaA9X`=Fu^song_07Ew_tc|)xNzDta#r*m$V2q5p-IL{fNctA6TR(Yia;L z4so5a099d|!s1X5&`~v|&;G1-Hahr!hjGu6hY{Tb!`Jv@I~rYMjYf9&9a9b)+;K)legz9{DJM=fa!xq5Fo)Th>|>uleIVq*KmPaFy(Q^ZcYTq1qF zyF%D$35QZ0%pk%j^{XhrL5tPNd}vSM#BP#iv(s97;vp0X`#jZsir~yfiwQ`M zJ)JD!q50DPI=~AKrZgQ^bJa2BIG&MTiDx)DFRp1%F#HLy1o^tYR3DQ!8_G{6e@IVk z=;;jjb>%{GCHl*$ErZ3Lo1h1HHUiIT_d0C+;qV~x!v$`NYYsS1y4s_ax z%o2ZOdq2Zif?(=j8pap46>X&pboUg!uZ> zR4HD6ksJqwJq|n>_5(bcgzStw(qj{R6fVC6x_+O~bAto75CP5v(wVhpce&P&zfrii?pZ68ND*^+fkhonYk^Ktzw{{X`c7 zROL>DFh`lYHi^KG8VS7)MYmz2d#v(p?i19Wg&l>j#>965!^l%|tRkOMxY0<0aIMC5 zr->|5m)CDJpiMQv24qw8IVfBp)Y2(c!I?uHhY82mU9ghUI)>;+&w%vsHa(6Vxo2Jz zhhA`8hC@0W$_3AEv)2Ab^-coymkD11_1C2^Cx#pApd`ZhTS+-4Xy7KPxBnTTf)LxS z5R+`Dn*;_%)3wsXQ8{{XzXBHuGKnu1NJ*91L46gE>%XOQ;v};zNu7+4`=^B5vnYy? zV`L;`3C`)clUMMVy%hrLu$)mS)xEytPb^)PhmrqzWIaGZ96xj%-!8QuPiQLi=zOx0 zX7Ok`)kWuHOt9<{P`--}_07v=oZv;nAswZJoJ;PPrqH%(f~Hd^e57xh>{zl}4}>|I ze{ZOAIMCed89>xoc1Dd5;V8AU@&7V<@iS`RF>MWWIe@Zckyf3FtzZ*wD&;_ z)9qvRyawXOv6Ob5DsCd5fXDhPZP$<|kA58{4(+GelqB*`;;c&@v&$MDD!=WJ@iRE& z;4q$XIJla&G`PpCX6Y37pqV#IB42;538?RX+wJ(7&D4aHJ#>`qee2aGbXl8lh%8OG z@&9PT=X%FG+y9Q>8*q!RqC(6~j`gXMZ0V}K{wp|!Zn2hd=5(^-wIg+WOL)+~khfLC z#XSc0eeS_#))Ezu`s)G)7UG-!k-m^k?A*o3ic067Q17ir%|=XYqa|w?@@s%RNskU~ zEVA7|;>AY$b5ZCA&Rqg{Wdr1~^*!THRB9&sq8rHF!^8qbc+GGR?#z85VHpO<d;Kl?U#2T9!Nt2wpW1IO|5RW-9)X%8O42?wD`ORA>3C#&{v#^-55a)h}`{x99*Luz$%+e z%5h-#mk_T7k$U=O{Rw(~HJ++5haNMOlu*07&~EH#?)(s3X}nPd=g4LVMBd%|yt=>e zf=NH3x#&>dNl9|RaQVy0AwT*PP>?6?rCVB&Q&BQZX^Py6zt%+r7gBYAqD?px1_D0Q z#6z!O9)J=>zc}%M>y48M1z`N0T~yeeH))aj)YL%?)}v+)qk0a91?duN$!bjS>b*{Q zh-Ejx2~Dar5w{2aWH&v=B=eanEd1RLOXM-)i4Uimvy6<@0L2sGWc+o=#2gFlTq*UzACa$w zT&;PJfzFx(HiN{(4uIlR(`go^1PJ;XKl_)f27%CicOc003z1#PA?PShJl?lD=ca)K zu^lZL#Lc;e*YYE{ZtS+Nj}`jkh5))W7yguFO|HZHwA;f^Y&BJFq*dCWlT?2`?)hl* z-hU+lf_ms^`k`b8-58WFh2sE1g>YeY76=*WRrFaJ z=AFrZzk4>7A=Ggw_kA*aDt!t9THdx077l_vD)fX;|F8vD#4%7#U}}Ih9l`9YvuwmH z!m(KaB}#S+)>d*v$6(=iU~k|d>fLD7k2SShdMLmurhlVD0ItknVSnf6Otem3E%{{| z4rXF*1dnFs<}m=#dN7lsSzJ$@X>@Nzv%T-(j&0R+g7%`pH}sCb=95jurT{66ESGMn z;2Lo}c{8peFrVxhBXq~aiU!&&QYR1G{@vmyiO4PaU3|M|(Pe861P+{M&4G|p$q+-f zxs}~L748sX3BD^`@U#m!n`?L z`3|X;tsuem_4~q4Us!!awaqE)Z)1Jh{PN!Xz(@uOyF7x{o5sh+i?q$2???vnukfi8 z0D3L238FcAqP*Y?$^B@46YUKs$H(GF*9u%^5#FqAA8uCL=@QPUPv#WZ_)DRpes1Kt zPL;==74#8c=i1{Z&2o3PsydlhHiv*dg*b;;DACWk? z#o8jlL=h8H`?enNjQ3m+s7^DAKoo700ixJ`hr<6g_ahk0mVr}&<;Y@D z(smO(aH8##3E6U=!ih?~sIX-q zQ8rWI+7be*s8~4Bl@uYgeI@}v>R33@aTJ=<$ij(sQ(?n#f*UDWIMLHoIG%+Qy%-HP zw$Gz*qQ+ptQ)LYz(Y-GTL+sIm*ViGiqbow5`79y)N#}Ipd5ax_Q7S{L0fU)J0GrzD zL|J=C2{{jOBRo|y6@D^9hr$;a8>0xw)G`_I`^0U;bIB0`1!cMc6y&p-KtWwIjbP(b zYM^=?1(J&iAkjS_(dkOnDEvMZ)?^ZNr!z+H4~4#Pnri>eBes)YVIILgr*eJq(PlvQrcW0?)uu51Rop=tvBhv40Fe z2Bn?31+FbPmETvYp5=>E`HV`pA<_N6Q|M!E#Rp8@FWX50Z89pI!$M9(#mR8EYjm5~ zV&^*OCY?kIN}nL0O`uC}fhoJ*ZG5ZS1jH5jQKb9c9q_29@Ix+r4ZfpSVVJI-1(LCEy!5j~`c1Hu_Td~v3g~L$VuckVRs*e%{b}0yh zeNc2@hG_p9?0jUO$X$mG<47HOIN2xaJlgD3jY>!MA$LHVoi;KQ)$VY;LDg!QleEM2 z-=#gf?WY869oe^yxYYtKM0=dGPUJ=eAcee!4iU3YL?wXBY8ZFN48aVut6qui``NH> z9t?$T3f$A&!)}p1+cK=EK1S?93E0k{U$kEa-8=9gD>fv0a2C!9`bR-z7XyXucGw~? zv+rkQiC*1gQrp0$<67oiZs({>Mb~R=bH#^wWH1-Q#Qh={awU5(zZC2bp1(X%r$KLJ zhip@Nv{jE&C84gWz*!dJQ;QA!bv&ryD<B^PyX(&!V5RH|53GU6(G}PyoTipi{;t&+C(DgIK zg98+3mT3M+r!b!Yb4-1p&rr4U9mqoI+9VN_09Kaw%}n^5 z@Gpo=SO3fitPo=4xqB19Cn)U8dt%_Dw7@=XqBw46I_ut+Z$=!t1xW$AO(}>&ccxQP zC{M;WD6?QwH_B9WN_NPvSNNtO+}I4 zVP_a`_jfjl?Gj~se7;JGR_X0QF)=CN=|-3h;knMbE%G}RzV*eW^^F8`x>V`5e(WOP zaOP#+8<15skW+U`ek4(=ErXFv9>H=$w#89>EUh6aR{ zeH*!etXfg=gciF$ylN5%6;pBRdW^nX&+ruqS7S1L>o`=5BKTHJzV-WU12PlpY+2wd zMKI7ZeiKfz;AHcj8A`Q}IP}QH9f6&>J2|wBe$F@X0STM9AY^CuI*0A~E|LYl(iVrc z+70mLpdDu{*JC>QDrO9NJu~4(9;-qfgt(0BCIH%zs=qPm&D-1F{O0PLcWoBmo3!|c zZHpgVUHs5y2}JRpsV1iUd!?_?l&yAf(d;y}jF6c>fe_w2y{{DVA0h!7q@%&RGk1Y= zdUo`s0k_j-4AXM?F~V^jzjp7C-1Y@m4*qvurqjYtX zsDUTZ#{sQz0dSG!AsR(@LXP05w8wmM7=y@ux7Z;bZ$5qAsTOb%VMbOhP) za`O6NjOqj9r6*t#)qTk%4v!vVgh`ap;-M*UO+HRqwNvSwvDvv9XAtj5#DH{YkQBQ) za26DtpBkF&uW|L7`Fg*6N8(2Ha_17k9;;P!%ph*W3oXC5$di@97jSMIl7M{y<(IA`;nKHTLc*0@W0EhRUE9Ulc zcT-NXzzKekTdmVFHA^{E-mUt$p`usc{gkA|-AGA1zH&N4IYO)*Su^$|DOZvGQc@tc zs{k>TcU!JBRKyN)#_3Q+x9MmD!47`plJM1*(MoeUWoF{B7;8DM<9Mt^FTz^P-4wU@ zrBuGDc3doE=Qx*88KGQ0=-&V*{RuVZw z@(lAb-&JH_n-td79#2RsEHVTHQai zqZkC1bcJ|PYq5P>JNuzcKt$qYbs(Z|tgb13^H5U$8IEFe@tdBj6ox$7sqXEqiai8a z4H87r2jd%uiu;NKL86bh**K?1{o1|Ks1@}#W2qILd@B}h(l1Dw3r}OL0<92T%Ug~o z4hYX+DTxoK<|J=x)6w=rKkrMZqBaNQ#?tP}y=!@+ zr$YM$PV5Jb(`+IxnofN7^M0r#;?)Hpe(##C>?Lny-W!OwZksUTt()g9eUm;mX>N2C zR&33W${g|Ds>d(NK0`s z26g0-Pvs;V!?tp83!d(oaXOpSO_!j?Pbkbj)6{@VY}o(Cu0yx(G*qjfVxx`@yW77L zp9~_a@T58fJ9u@w<@-^XnWo%lY30m>u$6BTy5lby7prD zy&8D$BuA)D!7tqR(iYC!a<{Wh4fz@k+`x;%g|tUr5m}kq@S}7HAs{!ORsugpE`eiz~N9G@RQas*NJMb|@!>GBOL6!lLN?Dc;!|Id+KtaR}qooO6hI zveVVbGc0x&9G+T(6YpL@5=OHbG_7Y^T~WutlKf8vUB$1ZBP3d4l*$#Sn;MX=&Y3p$ zTb>maHB`(PEo-N}uz}La?m4HH)-vwiRNXJHsah3(O#jlwGooZgBjQVvY;@&=$e{ z2s4(hX|zS4cBWN-vk#~l#!*ypTpdH<-xN=1-A4c7l>))f%r~FMd~+LoCn?X}5m;Cm zn7_B&tbZIx%TnfdpT}S3cl%C#jlPR^wYe6eB%d3ObA0OZWpK3dLN^F{{O*^(B*iBt zrDvqaFHcQMPg}hfR}q*S4mxfUfxC4ryPVdtCttI!Wvj53{WCG(`DQr22s#_}seC!y zR9qf-x)~7qY=oixME>szUk|w8zmkV-taSTm!j5^MGY}^&-DP+$F|zN;k}F9H;8{==ufV!5w2{+=9Xfm>{qKR`^}^uvL&Ip^+n4^ z4(jzpf=Jipm2M{{z@sIKw|I)C=S2Xc>*r*i_!s&07aL+OK35_{Fz!9P<&Ap}T|r^( z55=R;$`&UD+~1rAFTT7pw}CMCMa8AsXF|kh#^PYeM8e$9%{=jaUTS|)=k=qVQHNdQ zUEs#)UVp9&xVc~EAZ$^#G@OIO7Ynaf_N&$Fb>+O?H{tb`!|Qc<5Xsi^YIwZ`T5sm{ znoq;)J^Gw;@}j?&XGYxSyk2e4$0oN6g-2`Qsb{>3>#gz1G@+3)k!oh1a5YNGm0Rt`V}Z} zyF@9wEVROuPH73IB<}l!0iAeXaL=izOFjD)Ij=DglwKN+S!LpW-UmJT+Ii_l+OK#W zPT!Cc4qKdJWYCoByfG=4FVhE|4sA0j$e83mSDcPM!#k?^&(n<2XRPMaSc{#D!sq64 z{O%fusi9oH?aWD-p<3qV6g^j*qrzNWCq>7J{{OJL#B}qQ3|F~)4b^oAk-Jb=5hEW9 zcNY;{pIZ(^pFx-!?3p|;Boaf43K3b~QxiQvik9q%deW-k?F{HJFIXCuHEg)ykWiNq&a@FGzk}y!_TY5U)i&jVcA4;p_*I zYw$rU9Fs%GM2zl!Hz04SABd+gZsN$LHa%}HBJp@kVjnp1a4xk4RN5cZwxcjy>VI)A z^=-hMA4Jl3ZTeXx-}>i@VzhHEolgr-VV=mS^^$OgIvj@iqTYcmB091Uk;vEy0obXW zpn7+2kUJ4*dafk`MVP8Xem3;q|5D@~5e$X7DUD{dNWz9du7#GC!hB6anUdm z>0cJ^@lO8nmgmidFB$8~p(64vIyTi>89OKc95j&_cJxxU<+=9l=re7CdK?XXohOZ* z{jTUAaBkl89;2NGZ_M0>ys?&FeVo*T<|KO-k#C#1Id1ZxIhktJHTvnd>__`z8I(@I zFjY;iBhdEum#6Szniv2pXt;q@*(Xs2BZqI4Yr;u45gdnCUJy`fEB!Ca>f%!XkQ!)xYb$m((l*~iJkqu6@o#k=7siYH7;P_Bl$7~^wA23ldq(z z@7Ejy9XZ7VAe>+41a;Zoppo?kxN#3BjCg-<5CR^L=XT$WD(G%n=}Yg%?1d!~PHUbD z8R&#L=rYVD=(@fh=&8G#wc@yG#T%o-0Jr*GQ4PI91Uxz(uKP&dui|9%pcgm*l3bDN z1i_~(#Stf=w)o^yak9ahdR9lc713Q=hq<$p4j6H;bZ_%i9rb=mH=W!67GHpFu!fLC zv?~F5WW9QIQp=~|6|jL`?BqI3nMjaAafHeh9sNoOxtx6zFd9G&7I|i>7*2l9T`U-9 zznilk9-Hxs4o9f=3li`eFRpQ*gI0uJMz2`E6WP;uh$VDPArUVqDVPgUdOxWC8h>nC z={;5|3%w7|ng)b<@-@Bojfhq^9l|EqM(LV$Xi@j(sz3eaNXJRC)UnyKwgH6B7l~9m z)p>c`iepZ(qyz$ex>@(aZw_;fwO40w3s8%MTY%nhgBmW&$N3o_2VhkMSZ?3058%#z zvuG*P@>{%TaqQ_q{WGwR|E>M`zF2_g8Q*|UAIr#0?a$#nfDbb9VL$GVcKtGP`C_bO?l z#D}Z|0r$VPJq=Q}l4b4~>|4ESjIYmrH!i*vU41|AUA)gRah;OJIt2kkw*dprpX66EbTFywk6r}=Ee=9pC+NHoZgBmUU|kZ$(>m&Y-Wk-+?^;w3VSpCB z-6m@DH+Z3Kg;kqVU}Tc*PQWhR&pV0Y#>i&*6#bL$&||muYoAIyRyDs6V%aAv_Wu8f zdlUF5iZpJxCp|rx+%uDF7_JEh5)eWnC?Ek6K#qVgBtU|4BoM+ON5}z)2q6iltOgLp zU4?+Ias&iKMQ}AhQ1C>TMRe5#j4mpxc&v-c@%{f*-8~Z)clUk2@Avx}D)n6TRMk^Q zSJyR(V^Frs2IB^1AdjG+omG{gnWT%=^{v;EUpWoOGk!k1Vf{#a*j{DG6_2!T zcNashLP#J1A*)Wgq3qGtYss&ij*sl0&u(Qa-&}gj%)wf@5rk@diM;EwPM(73H6U}Ju+-xduN;l^R8bMww$}=&Xv0z zm=#P-`gV8ptgM%ha=_SQ$?_-W=kV7I)PkgWl}Y#R9j2`IkIU|>!2m5SPke54aVn1B zCyiM+B~)C^x8l$fs1{Mz*k7WLoSB6c8*`ShR^cL0mHRaNb7Mv6y{8*mzGW_)C~}== zMP?H-ZG}x{T`w(7 zbD-{ZZ(G^J!fJEoVfPoTHe#LcZfgeCNe0&HOM&7$tT8<+b3+Ro}(6am5vHZa15&2zTLoY7x%XF8M*8t;NRv(<>iueYh`| zB{nr28Fv1%f(_4+mdl01=1%;3@U01G9%tA*()+x8hXtQ$eKxOqBK24Kv2$tg6Bimj zl&b~x!!a*^Vv(GeUvw_G=bE4TiSMb4(Z16m&$m9o@2QGS`;QE(yCOf?E;kOFTltUW z;yCM>r1^WJXZDfDS^FGc_eAlpn^SlY^b)?OX7>@Fa!Q|OOP{FFqyBLvj=BEAsGGOB z`=!{i$79ER7(4#U*a<(!7Kg;oX%=77KE4!dyNPL;O4h_mWq*U!G9O=0`S^O`(a@k_ z_0BMlC3dtJ(oc=S)Q%fE~!-#5!KWxn1`;;xhcSK?&zc@oXktT0e;zxfQ31`toz5v`>pgn8hE-(f^4nHTZJD*8`?U_WY|~8%)b*CUB6wq^ia8xUYeN;c`4@$(!kDEt=;F!@udTyR_2EI?z1yd2 zh_V0T{6V;@)m|uvWXq0VznA^J){%WIc8+W&{usP{q&#Yep-pudhcPLbHGI1HB`+@_ z(vL+h9ea@}D~LM9k!C%6HjK7Xf8G3DbZyXZXnY?tujau#ZJdx^BBhV%(%mVY|A>P3 zW!7SMmge57Jl!v4)soONJ0{~eod)Ub#SV3(Y42l)#O!yD z_(73^3lQg9^c&jy>@sfzzcB_~Dd>xfe=R*QciZNl%g>F(RZB{j)st$2&V>J^yHRlO zSl(vfkrnKW59x}|vEYNA3Uu0Udyei6U z`eOHGD=s)X=H+&!+I?L)*!pMiTf-|t!=ZA<;z3}iB|n7@J8kO9e7|P=oEtTdU&7iH z`~qQEVIMUwYaTjR!3V*)pO)W*+c9lzId}e7Q4b=NNjT?tW%D4+NtVlDmai(G8~ert zO@{JW-m5%3y5i&3alEW>dt0QTWHAl|owjUV0hL?+wfx9%Yyw=}9gKyGYcE^PJKQk< z&j`i<+}I~^S`}}+{i)oC(C-uc;fLu*QNP=ytPlR77GL$3qTa$rr-&u`C&r0Xw5f!v zN6sc?d}8tNfZEl5hj2XDD&{v|i{boc+Sxkn6~`-DEcT~HKh#^yZw@(uX4=>%oR=Wh z9l|fAWA5^5)e-D&sQLjPuMIy(E#HJqmZ_(45bx@dlSvtE#~{F0eIC#BAKSZDFAgzv z-@rNHGaRvEPI$@Het%BF*fNM)z`pL2e}546zo98z34Ug{*-Ei_u_q7C}oHa9ejO_s(~PvUoCAkm|Nk*D$xBH!~goyeh{;*ps?$Z_B8ost}!`D{z<*0Xe zD9?u`^1$`wD0dw#KA09tyLKc9M*~%jyK?c;;aT&E#p0Iy6W1z^hhpO-rc{3DllUwS zXep^d_y0LVtIzmzS6{*j%foj*7yf>K#D#a$o}d{ON*K~R=bD-*4it*5lh0=0t2!fO zH}tOH6tUNtF}eDg7%)4tAiky&5&T&Ky&9JVT&c2NMP3LChuR_Oi4PS5-3yOkJk1w@u~jWA_9xcE8*=15@ke6wZ(0*!@xhwvefVt-o>%&Zoeu zC_~_5Y@W_}{RB8U9aYF?mJ07?amG9h1LhjL8#Q z&7C+bWWPBkFXNbehWkR}u#1IQZO8tsaBS4t9sH&Lo`gkWTb1fQ$v27kRTQqwJX77w zKcYSpT+G3Eg+=r)SM-5-X;x#vzVs2w%FNlo4qVM3BQxoqMcp2-EV`1UeOuk^6!yX@P|_) z8(kmpyQ4a$Du1`F4kMBC?bF^0$vCHQzy3zoN&iR5{UZ1g5nO#$2JgSo^#&!Dp%+aJ z-s|9;)FzTRgSs#)yp%hnxR4^p{eA0i0?entt0)WLM_UJoZ#jM_S(7s|YJ#lRnB?ER zpWuryZ=fmzk7NH<@OArGS;wZ~KBoyYiwjB$W|l@{r_kSFoH|H^=Tv z`T9~h4ErT(StOU}_V2ogt!r4I7jwzGZZ0h2E)0&}_U|e_9fI!naaCNkd?9o! z_Rra>d$i!9=&@b(eHO=gfo;)F53(dr)L9afE{M~_|oFrwNIu+Y2xVNMJ*_x9K zSl2HN+N|H~12^)X==_ZE5R?J>5`52P@VB`Wiq~~go%sFh%nzHSUaR_-n4Z^rnTBoLtcs&E=w%$iFYq+Ywyf@R zQFY~SCj6NB2lgkeALn0jkuxNo$!bv+#6^nT9nwyOI2@|%Kl7XPpX^VJ`5^AYv?hlc zQwGJ{Z^?dx+cEWbk>&zy+OBB!?6Tq#tl9eOTyEQQR{MCvcFIPG^NtAYk>63>MRe!Z zI=wp&=+`nFOb4F=uc9QvZ>tNB}(k9mA*Q%J5moPFJ0?BYFAe3m;B`!m;8NfT)j81_G^8k zDqgF?u75J}kX4fhPzlX$F`%GDaHV&RFQy+lbZO^lvx>yqo_;|IW?5#J6i%FRPig5) z{+(+4nOaybDMivN*Tsr-{~r7b^rYFP0W0jN|I|5a<}Ch1^i2LKE%)zyr9H{N-CIyH zrJPejUetx?>g?3zgHNQseSFx7Xr&_5tyDaVq;nCx28-au>o>%D>qo&*;)=Za6LIC* z8^c~cP|M#X=1RJDk67h?_yFc?Do1{}GCRIb+{!oStG<}C!L5A5#+~8J&?Vf;_hd@- z5Xb5RP%mbNzHDRM%D2lE`p2L;$M~beM~CnJzQdCUi97!a$IZXZ`p3PPei<{SL5X!t(puKMc9A!}{Hdnu>~-*P#3klPbDEMUc{QV#OC|+nci5cC1&z z>n%!LT1Hh;&o#sU=!(l%Y+j4+=g~X_=)q_l$o=wT60%erYiMq zY*T+KOuDpf=ScdA_%?v1`OvO|HzmanuC$-wT(#d#THCuM>T%T z_kf)0$-4tTtNoXy`b}+k{q9KFFK%iZnXvqcspS@Nt=QwC=@+bZVVu&bnGmotUT#H! zy6bML*a#El4ODtrT=}~nR2Bqvtj}+0`O!MH;?V6u=R+>B*Fa%pLpRSaHaLiyj_7bh~)B=W~6$N?)_KZVStyge8bqK^*SzGI-ePc^e0t z`?>a+>i^KKJIs%isF^}RKXD-jK6Y*xRQ#ITZv{QFifVo<=+^%j>wgR?e$VbVV_hj@ zRW#lv_VR&>&8v1`1z2ofeI_Mw$GHyAg%9G30Lb=pSX;L{D)TeKcBa03NGv>eL~z=4 zYfAUJa~%rV1v|e9dac8*>?JA&HrvAr>O1Vhx}&(e=3;1jTCl+)iX%l2x=jQ%G(TIz zRr`J|K4yl`=mW0JUsWCnR6}x~h9x2ehMFBILy>~#tel4X>hK|m`!=7>tO-Mk*6gUB z*r7f{%dkGnlV)mch4W=`Df~#~b_rcLnsKbMBl58`W$e~-9mM4!STHQcmukFHg56yC ze-6Pp#Dx7Ce-tD%ei{CDxG1LOPArwTZ)EToLucFa_+oti7nfW5#^xGVem#PTn+$PRtiJD%iu9KqNr=LBLEjRYnNiq*a{9o<$3?}Q$WOKE9bpcU-84#M z1ZTv~$k=@-by7xShs_&8Q%_jDT64#YR2Fs1ik#h+LpCh`?~Xs>X*|*khS@L77?X^j zBrsNc>Z8PwpG$|uy$$!VdO=WDDGa$=a>#w?tDpwdsyB=60ufbAuh=JK@XJBl5i+Wl zl^nsJN*TJ--(;@H@3PLdoZh)824=XNpqw9Y{htkU@7SNE4Mdk+4$Y#xf)aO_2sAtNDLCKQ7PSENB@LbrqfH>aE8QZnZJCM6v~JSet=NB$eqQmBxGR2 z!Pzpih@#O|J3yu=<1b*u~iU!`i;)W1qQ0!yDu49fi{hq#my?b{wF6qT)z{Z0d zF`mH!-QSi@>8D_2**g;Z1UK;*%RwAt!P42KYOHI0q7QbG%J)Y9BSo%X_1=TYi+OVC z?ELZc3;kaX6W6^e!;j(e*l{>$b2@)@=(dMfZF@X)JC>&wVubQbYNql_L1k?PQibt} zerpuQCt@zEgWm0Ym9jN+)1~9aUM*wvQO2fc95mT|u>Ru8O~%GMV+@kY#%K&;`X3An zzkwRjnhiDkg&JQfJE2#?+#4?)FYZ^n1pS-k+rDd)7NN7VO5`vQefQ9bP~IHY=Vf_x z(HH=Hmojw0xg;?FNcgt$DZls`xsYCeNaV4Tp2rI*sS9=Sv~LeT=@-8!#T%r!@pAu% zUp({M!+%U#lpVxPZGQ^ewDHnljaR(=n9?8d8#di5ETOh+f|I&)xrGFkTC|ek?WYIdobdA1pq*a+A-?U$u+0XWoil zMLC9rn#y5fgN=ecY8V`h6}NHW7$ukKPB$G7JRM(xmuCGu%i-ugHy#hX!ksgtCho`1 zprDJ@JJF2{bK?Z)oNo^=MQT4zbxcA+&Ky*b5d8j?7@7T?GHCv}q_$R!5Y8OTumOH9 z+~!1Q+SBVk%f9xYm&AbGFlU#Y5o=w?=A8|{*f6}P+3GfUIbR$%2uM~2U(P>{tH?My z91D--d^y*yxD~$zI`MByLq}dNJdiLo7@0UR@9fXfeYUk*fo?UpdJ4i{8aMxH1HuG7 z$lWjtnFuJPfrHtVQttFxLy_DBBq$(>qcE^&JV>%JTNw8orXekO7SCiNSa zRt~>h{Z?fc%;T?#_w@d5owG^}%S^3Vy2yT!gR}wTlP@(4w|AlnZxa=lmV2YPTTH01 zqPL&Wwz8+_?d3ei-PU@{xADBaEwKjk^{xh-w-3oHd^1Dqf#cj&+~z)yXY3C}@i=!y zUryYQun*$g2%iG4qD+Qw%)8=CSK+>Qc%rZM!k6o(bs?&B^u>-)CF#N~DO7G*Uf4l^Ef zFIbb?#FXKbMedg8qA|Kn6{GW_X0|pc`4s0rFut;Iz#seg;ZeTO=}X$z;|G>8=pNhG zu`H_+1^mYP(-*88+9um>SC*U!sYt41H7;vgc{_`eWr2GWP>ut*%PA@FyzmR)MOz1o zIT~3um6*YoWy7@s{XN*6w2+*xs{S46K0jqoH)4zGpXg1CrvGwHD$6sKMsod z4h$)8d)aC~X}kj~d_2Mn%MH7<`%F^inIni+Op`yn$~Y$bbyhMaw|Cet7A76etH(6^ z#tYTW!Z3?|8k;;OZH~gF>|5GR$ESWpZ+z;{pw*&h>%i-S7g zuJPet6ecaq^R46Y`}uv7dY(N}`FkEzt&hgt>aF9rdJ(?mmJUzhn_Qf&45$x_#g^ZG z?tScg&+q^f`rggE8p_Ol>xWxEEc#`exXyVZHEnFBcLX-?RHWXmsHnZS{l&Z)!Y_AB>AU zra*FL$6`o6XXSUmYkfB(6+ZP+zq3)*eXQ*gHZCLpK9Ulf2?s(kBk*Hn-|Ov})#! z2va*gaMR_bpA8*e-F2PC@#>+=qx%lZd@4_Sp=0c4Ju~~-*Hsr*KlJen*G|}<^}O+* z<O$*E5L z$}A_rn|dbyeRR`l4m=*?B867T=ixYKS%xU;?;gPy$sXs=`ORnNb4B0x%s0HS&r=%(N(5q+45we^-;$z zKHL4z(Ft!q)$H_2i!BH`x32hZaz&Sp;k!FNcyUN{>fi+ho!zzJVf|9;E8V|)@WgbR zPY>JHa;WcR*IMU*L(H8k4Y@-l!P5yp-cmecvNEkp_uD!Z6a(xuZFXt5l+=_|r4#Nr zDC;zP;&i1`;WY7T>NI1<+?kzb7nd!VRjPCvUaDj=gm>uB(RX_1PA(~(HhY%0JHvXD zC(S_D*r|Iekd&^sq@=Z1I*%%aNau;5cg~$%a!+Sp$?WNqCzW*`I&ET6(KKQ@*xC5< zNSXA%gi`eNNkxB+%GF9>Q>IN)xGQl&nKEGlb{)=}HcPx*fzOydYl^pgRw>SuO)m6u zd7`)gJvpV7DJ2E7%4ZamOe?!r5jQrJO~suJQ*mPh7ILP|oZv?bCl?i9RcOM@q8SBK zN)`Tv?j~v{Oqn^sNEknvCM%^(CN6?dCQh3L4*|+Jw+=$#ToJ#1b%cUrY^7xr3JMEL z6uf9kz*c68t(3)OC5B3YEBN7@xne~_nTn%tN>QOQ@g4b^x7D4 zue4G!c@AnUm<(20te{@W5VMqGsYdFRw}OD8%q}V_os1ePL+HPw#QHdG))Yn553x)y ziV}b1qCJZr^@7{8CrE|3g+xSzfJM`2f;mFr90kn)Ns&h;q0aa{CXtw8eAy#_OeZ$* z79vZ<%B-TvvnEY0MNDPNB%Q|yOA6)zD-(svKZMP-Kmc4oQm+3sC|HD5ee(4`2W8Mv z|M0_53X~bYHU&*`yEzlk7FZ4rD4O+w2xu7>d^2!X|sRmD8GsuZwFQn!9oRl!+RK@y26 zF`|~e5c)tv!*v^bWNFIX*oe8wCVXSlPvH!GsXuT72ZW6s07efh*0w>{+m^pco1~^~ z+q5?WaOqF9YypUcM@3&sM0dkgM@6hXioa6}6@B$l(U%_;WBn05iCnK#j1@>_)=bnf zRu(KbDq`JHLC3W~PpOEnNm6D{njj{m5C^JC5gHO_ru-R`OfypfUs~*2{eyURbpjzH`1*As`D{ zbatgkF!#c~Viyu_0fPyz9l3fKB(}1qTbFB6A~yc=_XxMHz7~ zJdPOwlFH|1xVzvi%IF8-g<%%bqU8GEl?rh5*YGY$>K*u)nFj~iFW`M6L4*xJ;#1VMZ1}Zh>iQpsrn#?ru8?C=TIOgk&FvCO`A9&))#a|guwqJR+ z&J@{_+|lG76KX~q+_7d@k+3%e*G$4w;2wqxu+*zS-x4G<2BMN=syzXcG-7rfRCW?- zbNxolrq%u_vXN`W=NM+85s9hsBLr_0k@%>ks|cRs5AO2^&w-eD7=~uHC_=D>P@Z!e zJUUqW24Sp_m&r6!9*|sr09sf)HzU9uA`;U^Hz19M1Z|BRv504i__O^*oP8eOE}@uK z4aoBSkYCkQa~04(2$EUUl#rT7P{$RxfU^0|T&mhE)zP~cttdfCxv82osoF=?7lmq* z`=rUuA=e=iZ`%F~a9KKN61CuL5nLa=X9PI8CK~mOU57()eGxCkj6sl zUJ=kNgGnaIOz;gz(@iNe;Q^%e;2x7|ui&dQ2%Aj;Oj~Y-&0YdkUW;A;A(y zH$ruqP?t-ul>kSVg(%8{a4^Z+D2n&tAZz6N6$E`#1ots`vAO{?@dy%itZBlABdA_=1{sOXH&y!lA8E>j%>hqu|Y@LrXm5otEi5o5`*Yzyd7vqgvvyt^2)P+%^RhzMn0XkEVOpD&2?JtHzm6W2# zek{Oz|D{{|1=4D`2+=nJ1r8Tr=-J>rD!E27%S@74@FyuD0-7m5XOc|YKLH6FHrhh{ zIqWI5I|TSEyey{xr@)&l!TIp+li(&gFx0*al8k?}KTs}f+gKa6RhPT+JCTpzca|J1fp5Ar37}^L$xPZOCdmw_K@atzq6~$XEkQ$V22hd%5>AOlf;9RecrQti zy#_56(3a)^m4apt*MjtlkjnN4$TlKlYil1v9cF-zK=()zy$=L9n%+!ovV!27*bx3X z9KcQ_!0FYL zI~yFTLhi}U65P@LRG4K_ZVKl51#|s^W=Sy#xV{h?bLq908mU-je6&AbrgEDpm`lMN z5hj5Hx(!& zL{ccYU4ryvm|TCD+%ZV<_@>Fe2ZB>U!b>gRP+1O|R5`*Q!n9W%xO?Exi2bTf?rCr? zNUou7JsQ+L(Wpinq@6%t6C^X>aiFs4<@lRkjuGH{a2?GUsc#v)wGuSAi9mY`k{JWh z5lugU`K=2OoSLgPiK!b*wjm< zX!+E;NP_g%3NSkp#Wnyg;60fMjtt{t7%AxU3z~)+VhWD%bIsaa0q#;bRH)^q8k74N zNINChNNW;o-48CHOH2nkN|5{kf$kL~GaW?ho05o1k{R$ENZ$*oY&*)yDay($n4iHR zIbdKxi8};o^que)O3+Acn#na|@R?F3$p+J=H#KjVNiwB!Kq`P^jiX-P0 z5Gd0b&~*|$BuHj&@Ga1rMVd{ceh1POA!XJ#X0VyenW8^5&LlzdO@()_1gqgKli4YMQvMspan2825$!-muURKO($Tj_QaYzl{R>6xe~ec=K+ zib>$i6x`eg;k6dr+*?dRvl6ZZca0Ddt>Qu zl<-vg2XwlT-fqBq!v(yHC~{hgnbrxQnbrxQnbu)AOWUTFEeF2sI@*K4x4;ENOOfZV z6Z;Z)`*w=rLT~3#)?p69|Bv*}aMAz9^R2Uz@iJV@zcI_luCtO;4;QQCtg|-NOEy`D z1$)Ge*km1pi&J!VHl^f01}E=rIClWQe1;)I33BN?H;^bVUS|!IX?6pdT))VlZ>VPU zI;$>Ylrs&I0f)h7CA=*XyaCrB^@PL}A(g!y-YXI`xD`O94zn)CB;k7-j&COVqu>I% zAF?xaHvIvD?Gs+Is4(UzhoaqdQTi6i&o?5^25m0s%7{P0+bcnXOX*~|fL7NH=tF{J zwy&Z8GpR-dH2V(fx{hRVTG~cNYigv!);#j;;&7+MWkHU*Dr)55=-b13YWNs#rRc8ro2mKbbdCp&w05QGO$P%0X1KAW_M< zg8_C{ItmQq2l#@t7Ihlb?)@wlb!Kt?cjZw5Mfa!u-X*=O+8k(%^>G7j0n}}+1u9gv1lq!Ho>oA;)*ayXfUVWm zKohO603AxyYgcco3$k7@0w)kxt-;_4Wo>}(R;{tXg@tYczE8DsTgs0Np9Flrssz(2 zy`V&0VhjB%d>iiRS8SHxZ{QV^zQ`8(1N{Z~<51_?tjht2DCXH{m^B7EAE?#(2vCMq z?*(eNK4zc`fQBn!G($KyrSw%Io(F6X4$A{3NM0ql5b)~^Jt8=C8k6}h5U<)V*dOa1 z!A)Wv093}xu9Rk#CWoplpI}~UOC5$YQo**Td z`TP-lwZayRl^4ZJxjzM~?cqDrhk~u$0f>^WL14w&3#hQo8lYBdU!VgJOkE4qZXF0z z6vhic`O_z02}2J9LtSi(6!{-b#1|aQfcb=92@cH#97@GeGe}t(X(7d8aV(H1&qz9| zBup_UH;Aaei)6l>s|Y_3Dd;tXS4HL_v~w-t)dF@oA11Obk~QAte1b@wK%7q#-XS!( zoLhm%Z? zOY4b>^SVfcR3~Am`&3HNmM&*t5E0Mokun}(qSpgW^tx_8my;W35RWJgVLe0cGs$3{ zj9f@DVOu45H5dyi)4?9f4lI-^LfMj{J}3G8rWNGWH%WCZIUK2`Ekp3%f@B!cgNPnl!F)5q{f^ix7>7yPDJq z5)LJtAHinrj3GQeg8hNZ=^;`S!FCF)6|qGTh47pSgcr-;Nrdm$gRnDEs|11|9muK` zVlHPYku8!%eWEyCk~+GQw_g|RPUN62=#p_A)p;Va*9A{1JSJe5vnK<+Bcw!XGl~C0 zq}Ju^Pb4Ukxnj)RzomW=LCYHHh>%r^TeH+iXV%l9|{+C z9ZRtq0lS=&h^!5l#w;T8u#}ofc)f&0l#hgq#2}thvhJ~4XlA2xyvHu%ku0initNp> zQ%Z?mLB^-y7DN71kuKTooe5_L>T<57%(?I(44_0mLhN0Ch<9a9L|WbzX>o`&zAMux z(*B-+m8eY&`)gB6{3^rmlq{yuA#DDu$h_>F7Z)EPyExGUOT;O9V1uEDrxe17 z{y07&plM5lJkc}8M+Ef1x<1jEB}^MbR3xy4OrS_q3znS_l5w$Kw87(~R>LXS!G z!7cQhi;lKMM7B;g+^lOkm< z5$+oCCcZ$NRx9Anl5QuQEMW)XjuIB_AXS=GbWmwB-Z;wKBI%+wbrG=3*@BGz0)a_H z1soxhAu5_r25Cd7Y(0o5laT?%I8q7;drH_S#*u-=s0R_nI5MypM~Vpb(Z%p{406<33eTJe~&R;t)r z-|8SSejF?>I{dB?ci6e-+3OVOBknxR(MT{^;IO@Sr;x^z67Q$qvsO;2s9<`2@f_1XPsSM+8`#zaY>D!1n;$V-dk5IL}20Ujs#Pb3^w^lEy(O z0`^zp_+92H2AT}i^DKa_0OAIbY(*u=B$i5yoArh3(mu= z#)1L~{3MCu;m2emaL*V3sQ}{aBvWHAk_P}7Eacrk1B@o~C*XOc#nlrHfwfC1I|#sH z0C7`Eej3$bH8CHtHn1+69Pk?AVccmON;<+36--Mix>`g#j z2ZqgpYp`m}p0zaU;ZB8RG9ohDaG@J~2uMFxwfS{~v@e3e+4V6V*EP|uLd;p9lQ`b8@8sMvNp6U1#3QK#o0^nxc z=AB^zzA5%ov?#)}3XIX9xxG5kV~5xzQU(~5cAyl4;^_fkApqKq=JVKrq=D#Z2cQ>$ zjQ|D%X#OYwV`DVN!Je-`d<8Vc{W(JVn7Rjmjs_VWBbB`mv=C^Vo!A$^=8y>j?eF2H z)+Hc#-URSF0B$$t@VIf+vlEox3)#3Dihc@w8}PXK#J&Ue0s~qhdzb+?1K{RUPaFJs zR|G_cShSfS{0)R=R}lSHgjRowXt4oAFS$zrbOfL@>w&-ZWNVS09iYx9I}ESkY67hQ z@U0Pdg4z5E^N-IHa}XO1-eC%H+VC9$TLF9o0F|8r-(vsbd5TvMy9t5+NvT`_7UU$Z zJIUq1B7vd(5M2k9eUf{*Q|@8&>;a`c1<>9o(E$7o;GPcvj1Ua4Sk@kHZk$9)Tm{jg zKp&yx{Q$NAh)X7!dnKO*=05I1Ck*H50m{n^r^N9mf;*OX*&kN8NLbb;M#4;$J)*J|N?}}wq3Oj~P4vb`D zzoI<)AfRH5vjQ)HCrBB8lNzTVaD+R7GKqf-!%y*b_IGI$c4hG{6oOFprBs#* zTqyfe1dbmATqu(`a>`I!K^2DkQW~y;#P>iHhLgm22jUZk(}j3kC_WKHT|Z5(xVf$E zDqMVDaD+*}6ee~5#bD%vAvd|TBABQOKZu;TTQ`$C+v5KM!R@TpKZsPgyBUo0V2H2FALPIl zZ!#*5gd*{kDPxPj54bM&C^P;c!gDiP{DWYK&y^p9ofS8!+>;i+85})JqHKi4l&D+T zI_KIg{Ngj_FXqbm4)HxVSIlw9`Hp#Vz9Wk7akX`%g;5(}T8sHX=XkQbaxzDJ8@7oo zAvlAoI*JKFeM+}W!0e!e z^^a|d;NwtKy)J=sg%U9*6uJb?4(j?u_0m;R7XU5lE4=) zwzyiVs|4zyx*}0(Zf+ao4#4>JU?h++RWRbW0_U4vou<$H#qDSKcR+rT(dUWimFCM) zd5fWdI|9|*NY6nC>;g?`&N0(>_)z9XF10+eMFyziHPi`!cnvAd4g$Ogz3Re9&sl^# z1>9pnQ$I(b1AuP;#C6BZ$jJ;kbLwvlx^&N!ejg)`D_c2HwrU`+;+Rr{_xmKLCi^Kyom$r@)Yk+t@ni z@qiRbl6+!Vskp_=GK!xXs_Hc6DOeDlSzxO3QOL&r9{BBkJU$1wm?_o-Kb{+9#p~Sa z6m!&3OQ`RcrV9tZ$c2Nol0`X(m<#zul)lTki402=BXo*dX^o!w8b_ zUeZ+oyPRSIB~%1|dbPi4pkMgiJeNK)NcZOO%2EHD6+%aN7sH0m1ml9F@?p8CS zn#}lTMlsEfM9E^Ek(DV^FV7S*2FfDSYe%-goTA?5NLbX_kx_D8AeBKz%R1MMaIS>K zuryDvXJXl-P=s*yq0m$b_al6d)GDgq3<-;pn{HG&@m^afI9U8(kVR5VRKLYW^@Fup zq})1Z8Fe?s+MC7N8@3U-ZZDf=EO1e*5^t8^#ry+`R_)+SaHIoq-v?FP(dZcq(NUnF zgWxB_Y@m~XdVU9BHUVzTz7Ig$eDaS2TR}3n5I;1j#b5s-lLlnnC4iU-YQ6iEb5y=qp>Ll($o8dWQ^%0{O&9=1Y zW7O2$td!i;Eh=Gmp~+dt1oY6$fg!k8(K3pcXsB<8$l;4SR;RZ)z5DE8Z3c_(-4M29 zq}kZpXc_e^!}Kv@vY}fLG4&DJ<2}GdY#B1Pm~GI??T(gFFEQi*r#_&K?F30NLK+|> zZ&IFPA_qEI#!4cCye5LZ&S1lx`j|G6#19066ToVY!HD{fXumK^Co=WT6aB*2D>-@k zUF{!6j>|cg$e=LsTAN5XOTtBj2TNFFen=Px$S!9C{;GG1-7PMssL?(lMZ>5nLM5wZ zLDp~p)Tx#SakGfaK<5IrT0I6j52)RmV4(AXhFg;i^j@G2Yl?v`02*Vx%|P!1>bCYa z(1k!-SO*&D{Xo4|&Jl@ZECQOS#L!e)63ssc95v6W+o#!!s5|@FFO6|}GEo%o1CKim zLQBiv0D2z4d+cih+W`EFz{>zssB_=f4mTgbc|HQAB`AEN7gGOpY|hhdKV8@!>#L;C zl6HNR@JtE+p70C-yPU${a{>)MPZ*q4GtP-PnssZ3Zj0$3?~F_4>;<># z4+qf`?!~p91iAs>*3LKw`MJQ#fbogp=1J~wM18hFM}bj`V#~b{Wq}unx3oJFLS5nH zWXL2Z2NHM%HZWAHP~+q5eTj2H46`8na%VsnoY!}z#!&NAvtlBb(3;UwY|8m5cN zAInZ&XpwmHM3f)*aW02b?{T&`1b!FLTI>SQ2Y}}f0EPg-lM8n*+z}-7B;03kygtWx z`T{Wcf%IezO5uz47fYs2Etu};VH-Gw^9I>oZP6^;uJyw+np+yOY=_`%CJuEMcw zc?l40V?3Jy81cSk5aEX*o*Tt)h@1oPpVDc_ai>ly9Md%(&Ug&^jnW?|$JJxz)406I z2)_rqUW9uUj@O_VkD+(49_~i^DSy2kTERZNDCJo=!){z=F`hdC8+PUWD8{n^FvA$v zpcr;G_<`XlN1cJ?VaU}Wy~g!Pp8+-=gJ!H}8Fb2UWr~*&@uigyXWTi&b!%QP!xf+Y za9qIo6I=p@23_EK;Cs3!9NY8-INE}3np4}x^A2=;q3ih}p#C5D4LW|f>o?PJIUqb? zri-^A@v;=-DFnO{&RB3V=uE#M%X}EmtH{R(a390*+7jbw3pfdG796kPFjh#oc*0u@ zxa{*B=BN+DB_hA=;dtJEBplD}^HzvJI~e*njY56AGGQ#7aqEW>Z&%RBGwxC_=rcew z;^mbI#=~DGjD(AW<0T2klcehj3`aio2BzzOl{3=+m2MA)Gt$HB7mR#dub;QI@TwMG zoM70g2Vmo=1JAG{*SL&_i&(UyaruEkzpCppZeTF%eZ5?uUdGKh1Iy=nd6o%R{@TLv zqLDRl#?3U*D0ALL!aG0)!13}Arp>7D%)9YW5ASE`3wI}+@st5x4fhb-i2!;Q;^F-$ zTzxa*;liKsRDfrshbvmf6B)VWwVqrYMP*bWW*2iE7i0>Zcu#&}q@IPPFS6(}DO z1G~e`!Nf2xUN9bm?z@g24V;%d7&ki@@;`%S!R%@X9PeWoi5EOC7%-kEz$cv-Y#0|0 zObXx|@flZGFkZ?tp8qf8c`FC+-RQ!!!x<1E4UDf9(!g0-rh`1=`72~OU1J=;XL>1TED~HVADAzmzrUW(s}pQU6E8_H@=*c( zHwqV+zCio^FY>P;4?HZ-Q}Xr%%#*-%gX;^&$x`DnPSH>C%G2i8)007e8SW6=IXL6F z0yt2wLI3IJpf$6Hi2+_&&wAuepmR-%<(bbd3Xm4I^J~($BG=EpwGtw{tp!|1xOBLoa6A-I23HODFx*pc``|d`coMD=j*~@Vdtje0})MbGKkaoz#KhtuZ7 zx8EdCg;UhThw16z1U>P5ozH~};(2YPJlFq;C!o{i!#P&sZ?_ew!W~w`|HejuN1S1S zp9b3;MIL{zhvQxk%7yB7TA}B2l^%}MjpVP<>i{S2iJ#Ha#kp7FPwRHzTsZMB^mK43 zhxpY5{K3O{RN`xNd85sf#^?Gr&$j-5BE#=oj9V1F7_nT;_-ybs)D3cF{K&Qv49EV1 zR2GxbcQ7ooKgqj(;rThM=Vm9*SU!AD_=?77|6KV*|EKD{U-a~qr1}}v=Pwt%_xzc5 z-!6Tk?;pDSp(^ssL!Wm4)52SSO|4iFcJ{8e17{EJ(*MzOqx+6pxNyhY>(ckG`~F1p zp1Fm6Ir+m4`5oYRNY)2832rXjN;sb6eHQL8++X0%!~F^ui8_@4*A;Fc++A?Ig}nl9 z9o$sN;J?BHw~6raaL$q>vD-~h#KBXN&Vxlu;b9_366Xg5Md1lql6YKJukuMc=|hlp zQlw7W2a>LfhfW!gr$+5)KgMm4pwt$BK=y7V{pgoksFNyCiF92L>H)jJ*AwxQ zPTC1y&o;XO>f*GxPAb+D!D)0|7mwRgij_py#YGj8xL~7`ctV*Z9#_^$u{x<9WL^Ch zfRuU^PFJ6=t1t9h;y=~oVAN99_8m6nHJ4#6ie;fa+-hBcr05M=@cH?d8EIb{ z)HgyKuuNNStx`=sc|1q(TYL_!KZ8Agi_f9lM8sn7`!2ICXR9;f=eC63BRvNH`uI6y z)dZPez#{2d~z3sTOT3(!$fV z2wRmFKSuKcYh@d%h1pWH=C-LI=h-@Ij&dzzuC4BX7GqPB>$LDUwcFH#3oEsF^)i}*fwe{ZPl8`mZ!DcsCf=(?QH5NYMB9>J+Fc*W9)mt&>fC z020yarG;6-WRZw01o4Bh92SXE|Ftj$ncJuZ+tl!^)mn6w7SdY_-f2ruPpK?QDPm@p ztM)ReXh42LGPUS#P?WCeijWOeT~MZlsG(U}TV$wXkrteSD27keVs~m`y|obP%Bv|# zFM^5Ged;MKTqZT92ug|&`4Fwy6s`3Xm_Hp^fFcDOwoeX z=mUuGc`=A!1o(VptIfVW&H7BU8MT`DiOG45jY+W?xPA#IBy_YSkD6i;1 zIt%8rg{Y4a>JzXE>=tHI=QRQiDbiZ28yDCsVaX!strjH`Yf~?lA45K2@hq(k!lN)y zTSJhl<~DU*Xp!dlTyw6`BJI7k*yCCXG&)mY$h)-W$F*B*-&6l8TOA7O>b*7EP4=l; zv(L3|wo_Wq6tb>qdFqM3fnX5$|)Vx(%>_L(5SQstrFpTzckR4^Bj)Ae- zsk>Br5s>#6X4&lN_Vl{+nxdk-yt1su^rE85^s>sLvIEFDLjI}ha~lXn=~;Q{2g+Cz zwyJrk)~6Su;n<66j^){lDkYh<{q({-n?0q>zEP4Y1u4Z=nNpTj*=SEmFG3nn%Mu{a zNxc$euR+49?*F$$WSNNwW0{Y!&qXqdvXC~IAJz6>LG~;pf93rtwnh#1-G9HxPT2Qa z%tBOxA({uRNc~8&A4AFRUT{iltCrRPj6kNRXfeCBSX7rcK$s6}v|zb~sjq7(=pq^x zAWb1?HEvs#+JZJJLj6}=$Fww*-_7Y->vYy_7n0@dsolgTjXnt&j=zSfFKBGxZ!SRP zh*zr?A+r%EWYt!P+*SrvqOyK-f4bHJ2@L6_g$~ssr)bfvgn20Kq3BLF1Rc;iRB3Ih zw6H48wG;9m-=8Pslhvn!P;=BzfQL@KE@1ObDC#04S=|(L3Q-n`&L~)YVo?zy{@lU> zdrWK864k#iV7p8~Z_2>Jc#9ppB?US`Oy*2k-&6%sI z=n8(;!tHJ?v|iNNVB0QRUEQgmL>C+LhjZ&Rk9r^ky@A>=mz|2J;j*R0V( z)@W_ik{YywC>V8`7SUTvn2M|&vgE0+FG|t0w?43yiMm?DdWNR44_VjLw-z0+m7%WI z<)NQdUs!B!)WSd4Vo_#DmS$6rDXgdaEOkOQ1)XnMqYPcCQ&@lN4jd~g`X1?0_gn0F zutX8w7eh4n6s^@1tpzk0-BvKDk?P+pm6}D}Dc&-_F4(BGQZL;Ptp_y?J(ztx`_{a? z^rFh3HZIgA^&1OnaIm^|5!*szW6=TG9_`-rtQxdN{BP9aY!7L!-de;EO-r>$+dwNy zPpL_7ETe)iEoDgTql+4m)ykT>O8Z8>*FZ)VLC&*%k0vb$MS`F=$~rd6I-A-ZEiy#? zM^GN>A{uBCeVFC~-d@3KKfvR(;2h8to4O(x^(oYzq{URB&a`5)pT&C9OY@9DKgr(u z=FVEHe9f7rMOSFC_zPP(ZEI|e>2??M8)s9?>a^%ynsW$x3-tL^6md#Ryd8D;0E{^V z-C=|A`muZM2khUYn{t&E!4{R@msQ$b=~UF3$G(mJSY&k@5&cdN>NQw zrM)aD#f4bQPSw~qBI3N7jj}Wt?Z!rQ?S)!wFD)uni~ayTtZk#Hd1dL1NT?U&li5b5AdR?MSGihN^{??xz=mlpg08$2nB~18#SUf zoe9g*df-juv8e;u+fC6tPoUTONI8aXb^Bs86VwMNjI+I{#onUD@x>gkE~wFB`)G0H z>|}Z%PaVooO#jrvmWx(_cM)n!0~=`AhfsE0LDL9RUtBC+6Iqog9PzHwOGCDe2-{k` z3Swk~j9G`5@idGz)DIQ(18Sz-Yiq2uXVsxl*pSc<^{F8}#a1I)c3vf$HmXVy-rXVU z#|kWnH*t(TRtv>=28|eF$=PU7_5>{sHKz)hs?n0gXy#)Ko{Szn)$GV*kKP;=8@WeM z^jXj;buJqf8qf(XPjiKCh5^QCx1qcIf7tsH_$Z33@#^Whl1yeMBtRfnCmaTZWD+0* zNMI%d$Ppw6YEaji$weYLh9p2ZTqg%43a*2q#$z?{T0nGzvWSZ7ghb3DvJn-t%DRa} z42T*LU0^-_?{!yCW*P!vcmLn_?e|Unru)^akDid)CcUD3;tV`>S1$u;?q$0n-%smc zr;gnqhbhCKePlh%vP)qpiH7+k4o1s##W;`|eOAlD~BHCC~= zKp$$@@!bl4_V>_pW7)Sr?+pVUI9T+CK#>|H8vrvt^x#nC(p1P=rHBQ!J{nZ;RM49~ zQVhC5;Rnh*NIA^pHK1!g3UuH<@BIBgPleU|D0U*wj9PzoD2!&TpPy1aQ!!|RLL(bF z1m?n-pq0RQ2v&}VUd%-4S-Vrgsi8es{Z3TQ{a%MvAXuRQJp~rF_Z1;Y3QdnfF(3F} zE4!9q{ZpV%Z^X4SP7Px>9;0+?74QK=KVIQ{U7;_4;j~nt0_)=iAX@<|Ec8|YuiKa7 z9PSSt&#*(`1#PwgbPs?3*Mavo;Qdww>))a9zXec80(IH40xIF33SvAM3=lR(76a-p zJK_l#s#&k0nmh?rAu}|cO4$J9eg`%Vk_cI<7{5#bda+{KJcWOpf<@{JpjiqOq!0i$ z)@u-y;NeeHg!;38FXJV+A`klLeodw#l&ve5#WRX%HXnnW8fev_?Afw7gIk#$F7Figk`@D040vyT7Cv5eMQt3ewYqbexcB-KT^cJz?U`{6mb2`d{GSw{n)io z3N&&ct7(Hibt={KdC~tQ0NbzzRz&DW(CEPWfDS@)m4SMb>CjN@o)zkOU^c2lSbvaI zc1;y1lQ7Sq`ad6dY1KMqYS?3dBQ>$)nIDD2t&Ou_Z=xLVa~^mh;QU!q*wDxL9Khwr zace@r7eE+bitk}h1ol`Ir>`N;9Dp#44~DQ#8vY@K@AL@&6AgDkI3A7_)4u|E!C`?u z=D!|r{D`9%KSzS6NN_kG>y>_p1aBSP7ymiz^X!%2aJ<-^ALBfQ$W%xE64cPsD$KeLJkjwXJjJh}_(@Jk*TMC* z>+7&5x&d%et`NUVg5M&+ub1F~61)p&Fi`#>fXGJ!g?G{L>nNT^VJd}&s6IYc!CvoJ zz{P$+JXjJRD8avs^v(}2bGhq<`9GH6@H&@Q{EZSkNrL|r;hp|_2@db3c+oo|!OJ9g zHavaA_L(IKA1uLH3I0vEcR3vryj_C-UV@iM@B#^*A;Bj}@HfJ|%YQ+FZ-pm%Sg+NR z@KhR}K%tz%!^0)?02jwS_S>V9_`4-|4y3{I@V!@rw@`Q^g&7pirx0KC!*nJJQz(r0 zp!+jCi|~`+@T#u6e=&ZS1m7;f?~&j|68ts^K1hQ9Bh)UoXMuNbocXo&v|aaNdZOgvUtma0xz0g3BfN&qKWVJ}1H3 zB={dBIJ_$E)$e5ze3=AKlHmUs?4AFV1piQizbL_>+tXg<-J-G zzCeQOB=~8Nam@Dxg`ZLQR|-2Qe4oO@6#j|ARtn#waBFZMpZJu!OoGpp;3*P3LV`0A z{HsCU^y?*fr37Cm!BZu;zXU%QE!Hz4@6W!J{SkPzmlQ z!CAmP`8lQWrVrnK@@oH2CHSu;c!dNvO7KY%96t5!*0-@eA|&x45xnC>(j*+Dvg zk%YHP@K+`H4hjCG1b%`TPr|;9 z{5*x9Q`kk}?%?YJ`U=e1yUWDa@cS zox-UUCQ%4>4WIukg(oQdjKcRQ#IHMIIh!cN*KiSENg@8!!le}6NFly*jOpK}@IzQD zWPrnP5$;;U}l3pXKQkA4g#bg=Z=KV-)VA z@No*)Q+OMNDHMiNxRKI99M6>^zZ_iAaKY3;upTf~@n=zk0-WqEwlix#r!ZA zBHtK}d)?1dKdz^Hs2_EeX6ncN^arUQZH?biI(Q~`5r)Hs=V0%lX>fl%2mCs?@LVqb zOB(v|jBhdZ<9XV6>c=y(_W?~zgJ(|hGYRNNHvum6G7=TW7Lo5e1}u|c#d`{_2c>AQPhuTbHB#)3V4eID)J-x7sIdf@Zas>uk`S{Jp6z5@Doc>Zc(;<4YAm=N=nO# zg&y0q_j$7|MYak{UP(#0y|kd%Gu$H#sFdY;#+8-Z%FBqQptzviQe?N4+KK?PSaM5C zOG?pGR-OZXJCwh&xX6Z(zYE0|6z7%jtmGEi3JaDM!^zS$WtQ^Nf+9DA*%U3yDqT)2 zc|2=*e7fwCV(^H^Pc19UY*~f5{LxfmDJ)!76qj9;Q&>=(OR?OdtlXTO+?=?glAM)= z5Smk%SDMR1`zl*uVM#Uy_4x{lb8_vua4RmiWS0PcG==CZaEFxUy1m(MpI3GoYFSof zfd&v-DQ;4qcVeG+LZ3IW&zsQaH4uMrBNE~h4P2i~n3y~{DS5)=Ns~Elk|6;igy;l= zA!*`7j+-z!ktVkKLmRKM*h-7yNs-x3oh(r&i;TP$&lmoAt&tB-Txtr=LFNQ0U$ ziia@$kiDR9BvNPtI0ph3Lj4e$DEu1@KTP2p6z-((Q3~&&a1DiXC`_buVkiuv5E~TB z`G%&;1-!xxd$tsU4MEfy!dpTJ_W>RYi_2jOVY%RO{Obk`$Ilcc{{xIK3d1OzL?PHT zd_2CHgXzHL;o&+8p9I*kgyBC}jPNCjw^A4jLSOfLh76_<{|W^0dnm+rj1b39(I8Bt z5NtCZ50GQ~%lN;LK=>C3M~GjoM%X~%UJ8Gr5dZ6;1DL;-!e|P?X63`dw&kIj!le|( z!@AN5uSDX9L=oa!bqI%2$Wr(ig1O|AKzyMDYt4a!T{(TKN&_>3k z%CdOr;+urZWEYl{tt`#$C&VI2RSxUCy#yyzOF6&n+HK2dAK6QD?Uqv8Y73<(ke7y9 z_|+6!)ef{uOKoc`aNtf13CL|<*R*BB)4?>eP(Nd9|WJ#JR>Xd&5eNr%y zss0GMfF0He!odX&wpYkGSYP^c-6Z3!*aZ$(A3Bd!_F==ul(i3rj4i7)j%PJ_x zR|9F_rSwgVGE&}=-esx*^h7H}ASk6L(z%J2hkwU(d3u5_3&WVtVX=7YvJcVBsI#FP zjjx7#JJ4qOoLe^r^9P-j9!J|>%+WMJdbX^r(p)fb`=bY@Jnsfdj~{E0LrM=nxrq+U zZ{D>GkiSw}@iKS=@*;XSNb2kP=|@_`CEE`sCSf{|^oK|fR9W6#nI6273TAAvtq9q> zh`+^@zmb&Q@hjF>pjVQ02j9Wc_FFBXr-J8~5+|vz2Y+^3wv-;~oajXUt{osf;f2(T z>-#39hxR49g#)Aqh9^%_${#)_LnrdL?uzs-Z#(MfJcWB@=$^a+y-|<`_mxCD5*rt` zjLAO8hpcH}(o6=3WWY4y9heKeU5;rf`$EK3+&^^<U=GfB{t;zb}AeS5-M;i>XaMSE)~& zaz9g}8KqDUiNmhr>_fL$eo8t`O%(LsBCBqWay60$}LD8)l zrbU&TyQ)9GM;hg-(HGA2~4)|3E+A_37?b@}y+9IcRl~J|Usw!_+p46*K z9jdkby{J=L#?kPX`HDuo)Z~X1UpMUpo^6BYszF2bpg5tq9Km0u5r?=8Ky?bKf zlAmvSv%X;0UmpMUBkvZ3eYNTBzx*-j(dCb$J&J9Y7+J3#7L@MX>^J(l19I~Y^+D%^ zH7_?nE5j#|pmXN|jJdAOxoCLXulO*7a(Vk4zpHrtI^JuE&5pmZEVr~QJ`3is_?t^g zm&a$6mfVq>T~1%tM$Ck>2#0$m+$u;5ue@`~afUbp7n@xO*~TXu0EwHJ7?&_+=4xAM z9(R+FY9{WKaC2c_P7KMIYv$7N&3F=AL+UwsvpiZq+r+%Afhmna(InMMPM<`=HdZGm zX|Ag*3>|d5L$4X`m!2^+De3j3p^3XDJiP0*F{UGR_rCk$yU%`g@6O-6aOkbg<4+eB zA9PK;elR9_c;ZWmlV2Ot%%XP&>j~yTbEAnAAFRa!t$TG>2+Ug{rK6h2{j& zeWll)b!aDO(jxaaM;vYp&oe0aWYuAZ*wi+2>Si|eP{rnQyK0?UwPsGO-L6_|XIE9! z+PT_chk~@Ho!TyguGpYE-mC4+&`!{|Mtm9_-Vq(K-xir?xO>{Z>S^ufDZAN}ebp&7 z?6gC@A*-yab@{5v`5x&k zr}lf7_OyY`YHJMdZVW%f-;deC4@QT#Rz@7ODUUkMQ`*c^>iPTLmgKGGy^OYPO=`6%q=p|#}=wZjfC)_qNMXELSW) z@Gp&pdZ^ZB+Uw1!z)q8SN;}`X5D9KP=%pZ01hx&6CXVOVfbj(-Ws^~+$oSl%g7WdO z#E|hh1^hPbc+@$^m)OhK7MDR@TPc_x<84_5B*#{|x}eye4WSFm$W=(`KR;Rql9Mn& zWRx~o!D{u&Fl`t9;UNFGKv?_K{OYaYH#xB}^5A0JANmrPcFcngar{^hPO+E!RLZ}S zhM$+A9PA;_4+CAPO!4z9sD8`%55Zi#dr1-?5}(P4?pnl!mf(YM4bwu&qV9@GbsjkC z<~on`1G3Ny%Zu!Z1n&v_-5~6nUaeg+DOubVxB3gRX2H*Hh-L}7lwH!~QCDo3WDgur zFBea-cA7@SMY}{CG6UWF7Kw}WL>!>Q!w-7kmG{9hy~z3{=<($EMG1Uvy&oTt@VK`f zA<~KCbHU%BhyfG_;Mv3c^TJE%HJAz$a&W_VPrU}i@j@p;0lSL(SU&SexL+*Eo&vB~ zpo#tDDce{rPucdCKzJV7-*c9J?czyE9(J+xG0P?8?`rJgYb18Dh>P;)vx_fp7jF>6 z;9s_j!z7CM^H;RP1UsTXyI7=$x;46i((BJI#{Y{#C)&k-93X%F*~JSa_5JGr>Gfw9 zi}b{4<;wIt>`thc)ULy46zFgwK!^WpEOA~_49uszo!y^ZTq>a_0V0_UxX|HRix+kTWgmQ3=RECV4i-mLpsvO)#fV=) z&>jP^iRVH(!6vS|4ZNiMpR$Sh<@LYI9QN76|A*~ilv#BDX?C$NV*dRmu?^bdf3ZpY zKgK2odn7?T$%S@?``lMQ_Q>QZiSFlg!WSG%c)7il9c;xlo8zPT=W{)mSyT_u9S8?q z=S5t!L*RHY@2=Jk7U|LK2pk@M(EH%nUs<_3sJ}C1991llo@kT1GkJKx4z`t}@KOhQ zrD=&t#GpAS9gYSyKn0QB95_tsr2x|Si}~}WXQcEDG`)+`%j}ol<)25|DLp&Yck!>S zK#l3wUFmrwyg$b~@p+^bI`Z=L1U<07=aETtS4>G8YmX=xeH?lr01mh2THF$y9?g;74%zgu@URrpWStoW)i5t zr?BB%pTu3VzWv!m&f7`q>%re8 z?5z5eX3Unsp6%F|r~q}QL_wVxXNVtv!#OuWQN>U(*+>jb6ONr~iLfnI-h zR}aW5JQ^VR@L+R2^sT4eg-1>C!mh_O|BMsmPlO^35oaV8U0*m|aA*dxab&#JAyVm^ zn`Jzwec|FFj5uAWCE=cSZU$8GYVF)QV0%Dzu3mWlTjPHIn|AT@-x!bQztO_;U*tP6 zM(xKx|Bb=tzcKXrZyh}Utx4C9ER#1Ft|LKP!bdI$8kPRDC8TYJO;@R|s}Irdm?ATT zs{g+{8=k7maYm1TBiE(*tg+M%R|Q-Sxa#0?!c`Af16PO_}IIiw;bBtQF#5E zJ!>k~d_8=Ap*~gv!_&!sPJ1-APh@?l$8+YYs@Tf3*eY3LY+YJxWlZdSL5>?@H{SfJfN$X?DDzw*H%~d_3rwTbNsfAAXk{HNFbgkP81qG%g>#$f^6JFdp~3 zijTc7DJdz;&bJkapQfLgn`c{DSRPlAT`tD(ACu22D2|Vdi!Ut5iszr?$McW%-QSpp z*KKlg^WyTcbW3?*N%1mnWpNq2T9cc@!LeihEgP(~JFqMtUI#+P#n!lF%kW33-Bt8H zntf5QcVgjKwmXq`Bt4Stj>QAnNfX_uaCF*@V(f%OH!7U8cB8^!Za0dt2}y1gW0Tz& ze+1i&;Q{OcpMrpIiOE|Y;X)6|O%0(89{7Hv{}%*aqw^;XxVC=skSj#p8FHv=aFtQx zD4K8e*W3L+@AWqsl&(Fa3>(zRin0y`$FbH=2Gv)|A5WWdTBhI1G!^-!+ho^w4PM2l z50Q>N^5=}q?>hZoC-P;a@K)L4ZH~p(4Zk9?iDb|C$}yR)G28aX5%_i$78lnUa)WKC z!x+dH7i#z4))ZiD5{lC#Z&(b)S%u=1k5`R>;&uzgvDY_-Kykv^K5O)Un)7cY{&#h%?sTcv zHK^7&RI9D3YGs3dNP;7GTiP_T5?Y6h%W{BWV;yW{K;O@tKx9qP`5Wdsan)#&&2h-c zUYJx|4a}UHRHacF5bM~#tBx6`81kd=AKca;c4FPwXUq|8vRFt=)@dA?;p(YF5{xa| zs-}Lxj5q3Ii7Q5#AAVzI?bHSZe20`|w&D_MjBvn z6RFK1E@jq`JDP`-+Je}6mfDslylwI7EWa~sKS&})$Ei@9*P+=F)RD!6Psv ziZcs4%s)O@t@*(|SnyZ1qy((^soJavu=!uVi2J1`wbe3CYk0)5nAdr}oj+&7w?jH< z#*icF`^KjT#r@Km(VUhkTOuTzp*@m5Ge@~lpb#JZZuuuS_4eg@rAXcvwdBhrkElNs zYi^Nniwq3g-^akoy%Ds~85<@(@SBU2*Z-(}QL14KL@6O&i-sE$UQ<9ign!LLSboVx z>o0LHz{Gn6CVXCT4R+JD@C#KR%CBO5sIbQM;ldKwhhsdvi{$1R<2`YVhgXxl;yrQk zjVX5m;gu>kN?*Bhl>?`8$3fZ zHDFqR49pvLG?@#QuzUyrR*RwVh%lI8wE+PFq73A7Ad(E}RU-kN9uNS@;0s`w)lVQP z67**n3=N2e$jOjOgBbz>rsLX;dt0c}LSC5u@xPPAr?T+!B4K3JaG!)ec7~sOps-UR zL_P~{Ti}uvDINt7DqE&}2H-{vDv*sJ%KhN0N9+#S2(|JP5nC=B;jioj>`9C(l#S36 zInvn<7c*Ve1VE)$9YP>eBSkfqBs&Q=ffKVIeyM_YvUBdxnSQK63{^p0gtW8#*g0b8 zPkeJ$#|j+*HGbF~n(N0J0YN8w(H)xS$D-+i&hG$tj={x3QjP}t z_kbthE4aZ<0(P0E3;b%8-zflmVxV9Ezu?64etJOhqPw326W}>LbSNq)255p~2q-qZ zA5D4;6CH>pzv&Q2!*N5wz9H>b?cw8Yx2bN4-M{DeBaSS{xIHVm`>EXg^BKJnPGT^epWrxcF zmlLiAxSHT{!PO2IHa+}E3Ese==%DvaM8K(N{D%Tcuv;R6is%)O#Z0F0Luouh^nM8! zx@#!T(0H+bDSA==V&7d&8qkILjV^H)8|6ZJo)h`N@-Pm!kuH1_^}|2jteb^@()f}k zYa;$3V-AF`hU*@qUP5Yt+-Lwy< z%4uH!)lTt@_ay$Dt>=67R2B734Z0|%p1|KdU(3hTUN6~G&GuhDKRzMB`~0rg;c@8O zOFcKgn)AD{AS>v^_fSO~l>oe8%Yk=S``lclN3$bvc=+MD`Q@J@i)oE8HqjwH>JfDydBIMeNKE%+uw6!kse)W$w2A#_Z&H% z@+T@PZw`>Z{+=U?=VQehUHN>h@SL%~=g1;Gm@avDWqKaZX(5O7{O&?p-;tEw->z8S z%Rfghlh9-7dPK=1ko2zyf0uZU{IG=HH3Ou_YYR}Aw7#!XdZMK`e}MG*dyf2tgum5S zq<8t}$N_Yo!u1;6V^^Rz3eup?Bg|q#JHLz1HUInGYyEQI=Xcj`eEHP_OF5wj zuk=pqTOw_?U9TD((BJ2IW6ID{T1n5-X76Q>=FLZj3_(;^q9?s z?^j>S9&rI5$eJFW%p?OuwlakLxIfEZNQkmeV+Ia9&sqAuvvcuxcD^65J@Wd!KfHCk z&=U6Uq{A|X-y6Gd8zoS?|5UqVQgSl9eTdHL@9{BU_gCdFWtZSV0@2}XGszyf7%sv@>cK+?=tNw! zOK`15ceT$+M0!GQ{_gPb1HJ#A@9dx)p!;XPvm*zk1@)GZa6`SvQ?J2rywHhIz^>vh zJW##{a$NK%pGX8?F(r$AaS?fYMYzOT?;`gxsE z6dvFQ<*@BCjq<|-kN}*O<`HpG4)M?qx&h0fgHO)W!$Sj^4-3!S;b9w%5#p~XhcvY~ zgsjyqZ~KYZj{ z^584rxk3i%d${=yA>1hd(njf306kRYK|b?o6c5DbYyH`u=Nv+6@ti?sjeu_hde|4> zB>Y|8KF+TaGQ|pjv~8fCK5%Jz)S#8xi%v?WH(ZjMko(^WVKSPp}I#tFOKGT_A=pLH(!igyJ3!SPt+dtFI-QGQP-u4qw^SA%P zvRgQ2#?hyPP21mO$(A?P8Mi~T>1*_4(6bu(rUnvq)WuqkMse(iRzl9B-zq2D5t2K( z4+a9Q4O}3fuYm|qPR8>%A#d>T85;kLJHCj<|Aa7G<4DEwv(y5F@?Q|*9jOROI9V+6 zhUrL(H{QvTv0m}v#s|Fc6bZiG8~k{3R^k9nc{Vc82Oo@DWFA40G!yf7aA zPhv}_$`9JsAKEqm+E%ljQ<}EN3^JZSZYEp0&GIduo7pWVSoID<$kr|t6=>sV4cT-Y z!Z~PXk=}Gl+e(b*r-9!pH*TK-5Zjxt-xXlC#`p%NOH&IF@{b>bbcpc{SUf@?{wIvj zQVS5`i=u`2pFoBn-bLG6fDr!z%+ZkFl{!>NH)SwDksqMD28M_y{wf@p^uQfc{Jils z3UB;XH4;FAHL4ESWgCj&ki@X3Hr27EH$lL4O$_+-E*13nq>$$(D=d@|sZ0iO)` zWWXl_J{j=IfKLW|GT@T|pA7h9z$XJf8Su$~PX>H4;FAHL4ESWgCj&ki@X3Hr27EH` zpC|)*^0PiD&A6S&gm=h&xUW5Y^57c}zWKm6AL4rETMvBefp0zVtp~pKz_%Xw)&t*q z=+g&$`hZU#@aY3SeZZ#=`1ApvKH$>_eENV-AMoh|K7GKa5BT%}pFZHz2YmW~Pap8< z13rDgrw{n_0iQnL(+7O|fKMOr=>tA}z^4!R^Z}nf;L`_u`hZU#@aY3SeZZ#=`1Apv zKH$>_eENV-AMoh|K7GKa5BT%}pFZHz2mWjI0r)?8FK1yKVhmenC z^pjst2{LPMAWTIhqt`@{SO`OU-M-#38`=8_RM_%i^Wy#Kt5u!+Y58K^z@q+ zaI2t@f|6n`InEGg;9|22p}g_Q20-E_CdMUj>8%d~?m)eT# zC4~jWxt4NUR$;EiZd;bi=NgMSjBud?X<>pGy)uXy#IWix^(b|)0-E0+kg3XP5PXdW z67gL+4wBP;;j_AL4!6(ClNf~QZ-+33`G+p@WGTsQ=8Q@iN6awIJJ3u)hkqA|UXy;HIp&IaTiX&74o&!XXP8@}S6!t(ohBs4) zn>>i)exN5TqWD7qwGbgXC*rvA;t)cHArA2kG|fGT!~T+*#@8SYjOSDQ*N8&}oK@ff z_ba$`9`p+-?x10FDQ>0sXfeGJJm4_cBRe4$etXVy^R1w`IJcB|?W1`my7Z=*R}$Rm zgH1dk%)Rw@Q4&&EUSyxh-zV_*ME;(@-wnhc+=ztuL<8675+){3PD-9IdD0|~n`B6U z2q8MbU`U!c5yFzi)K>r11;rB*Ed>*jlj2JF%ERr?7ry#gLz@8G0h*eZB{3fRC)ulk z#25j_QM8?=5pn1ulr!8a0Jt*XLWkjap%bBiUB!J2pLqn_FWNvQ9s;nKlEgmp9G_S% zetgn+F9C$GtChdR#N=cULvU9AQrl{a&0f$ad_Yesf3S~C9C+j40*CTX=-+|KUmF!zq=$XbdLto&k%pW&5QxrV$toz%F3HKI0aE#Er*vEi zLIS&=Ft)_}QfRSc7v+e;2a!^G&PhU!n`lPEv@6jQ zab6yym!vmyijey(EFS2(rwh>Ieo1<^tgO=9Rajqd{*sMC&R#msI%auL61UDSTVD1W$KqkHv={0a0*vhLtJSjrzWPoOhW0Hkpt_4ENr zeLeWI+p?wfMoH+sH9&ghYwVY-?_5eRh062E0n&p-i6<%LZv$OR#QKgBC(M59d-?Ta zJEgadw$fZm??;e7+UH*FHwwz}Tt9GKMO=O};h(c&Vq8zg0S=GMNJ=Ke10m1#1gA~B zK))lf#uJ#*uG;mmWQU)^_$tiGN5&|~B0t%=$!dl1ygy?+KYy@s&0Uko3L7Cy2uHTS z&eLCi($Qe>u=uQ*drM z(n=*OtUwECRsy`X#&~W%A?Jbr5EDQ?9nfD6^p^wuUx!oz{TQfkCmXy2I&NzZ@TLY_4fR(; z{nbqHCV23=1?vL+EYdrV^tQ&3Ek~7P%im<`<=N+dS@P35Gqgn-w25i^IZNv{Y$GE) zQ_q0Q3YQ%&2VD4^y@6g60k*@1@KWvhi|+-CSjP7;j1gxVAzO~Ka=siRA(M6=MtMksJSJ$17QP+& zubW7V+3^F&j36T*E3EPSUZ@}6Cs04X6p+8K*55yr@q6bNs9Pu0L8#AAzTEuZq-__% z216YojG1v1>!)V_UG*EhqZ`@~`RT8Y5XZYuT|;q-ARup~0dy1S+F#Plu1_aH0P0Lx z8pFt~4?Xwn-#?nM@crpu9p7X5Ww&0@hRI1ZOd_|z6;Q?Tx=}EMsVYZoF}2C(D)os| z?q_N=qZI04k@8Jhj?h`MwEF|nTJ?z`$?DMg{)t(2bDSZZd3N2iWLRQa_Z+P=Xhds< zX;J0ouIkV4ktfVnE`kP*hfWLI%#k4tA9L62NA7eaoD4EBgByano!am8+Rt3t&)bz} z_1cpzZIMCS<}{F0yK+jKIeE8v z%5ElQpLyzDHg#)t%5Kw?CiB$Y<}gUG*BsVlo>Egih15*jXAXO&dRl!;3gmK`!=TW1 zb}BicM-D$H`mcMnMV;ENPVIM4I?)xiYrBlP9#U^kZUR18;~_S+rX_hN&-^|ps3p0* zWm=m#tj?TTUp)oOZBBWndiqw@p&}+-7pMCoLwmMed7S9JC!5XFH?!0BRZjyt?dIgR zmML4=RA6H(@L-1OOgY3hDUWly^F(*HS6kSm{5nJXO(%LT7_?uxl*=1*#~XBHk?w1Q zuFHzeaw!f!;M?<1%d~o)cvH)?8aCBk!9s2$lbPi5`xd*6B`SwJ-7(u~o_fffT*pp> zjsV7(( zOoOIwH$(4)ZDprDW1dFNa=Py`w64x8bS`uORJ;hJNUuF1bc$2^wY9%a;bmZ2O*Kdt zFGwb=azmdiCFnpDk2h(N`CgQw<3`;#oUVw|es9&D;Dzctr}hF!T_lmG)>NlFZl2O^ z4%^J8e83vC=MCD^y;|rC&kluLAQ<0sy3Y+d*YM5NDcx)eNJ3Nd@V(|K(8b{CX-VGA zhV87JzPWljnVGt`B?Tmqin^4;MLKLxgYFwEO3MkC_8YzStXt}unq%cwW=CLg){oe2 zWR6RoFP{Pfr=~g?1ba7=T4SEt1Pp_e!Vv4Lc(WGR14-^hKD8%7!g-nbO0Vs96E|LA z1hGcwaTppJ92!>b8NK!^V3p{;fgUmHK8I$^(4KZ`ziL-Pg0I_^ASWQ4!uW+Tdjezz zWv@9In&r|X@jIig%b@*|XZ{-~$e@Km0mJ{Z4BZJ3ekj+VJJ|q?buu2K zsX5tYP9?{ky5rD>omv>t(Di5R+Ru&128h$y3>4t+$j;{EHuH2Bo4ODC2xg>ddxg$2 z)4uCrjUS*yCD%g>UvjSao^Q|ZdbKBb;vgg-67I1O*3o?qdy8>8?&fOC>uc?L)vDOq zq=s7i9M!7)>J@6$Dr@Z;aws~y!xnjv;W`?_PuLW110mUpfd7PQ{>0S@KepSKB43r1$=(^N zx|7tcwb!mutID8RF2&(fk=UNr$WNPj;*}AfMu+#fD`>5*q$7*`!L;Ch?6xRhuYt7u z5AU@`jZ3y9Z1Vwx3lHp^X3ORYkS(K>NEVGReb!=ZT`=ZIRTS2eLy^Q-L+ zRfV;-G{3sMqIS(*cCrJ0)qyrx9NM*OVXbg#R~c1nt*Y{Nl}29w#(;*P{h-#~{^6RX)9<>w zYRUh@5>M}|E1?#YK!*8j4xtKg%|tZL(;P$hAU zgW8}npBPymGAt?Ba4u7gL1h`bzQaLzKGC2Kc$;pu9~%Y+{Ww>Wwz#>Z;eOo$%mYp zSydskqDRe4;W9;H4Xe|^#G`e z9Ka)dtDrbOE-t>XAS<3fk{-{W zPmeDs&MsV;lN(=Fo|BWC7nfgFuoez}7nT$+<5m`z6)Y>x&EX1)%dfJU*(F6qCBJ4so7NohHzNl4CC6570~smC zc(^S5wjt(5PbuEA)|BU#-d38OpES`@oL5khn}a#{XMKDYXk%L;v~3Y^fC0IM zx#%q`qt!yN0USWA&VTr9A*}%55mzU05Z7a>=ZW3NOn2C?CxVfHl1IBntH}ftdDKtV znXY#%t0Kl=Irk_>j>wt%(P~qYiEQ(eWh|)LI7Zvu1v_OEjSTq#CMoNniRq4%Hkj)C zVZRL@^`=*C^mD3iWJo)sAV!${9CO?4%o$fCJpFDUWIL=P2EXB>jgc-nF)BhxCqCww zZDO9*nh7yFbo`^tosTM4+7-r#{naTBR|+K9;tD6$)V#sXQ?^yF3xD|@67fM->OCe_ zudY@)^d~gLdT1Ews-HmQiOWb$4%@8#3XDjD-=Mmzh;~>NaK#4>h%(R-11YVKOdzre z%Sc^bi$MoA!2__!byor>8W$m_fkkVzUiWuHJ_)zo$2b|ee}jEo7Wwi|su|=g#FETb zq65I!$ko8q)ubwo%HS$)Q>g3y3yo3aE{q(K;9?2s)ivN_|I-O1ahtvsG7kAr_cN)1 z-9XY*#~@Ezh#~_@go2tCrnh61O*?;mPUV25k2q#&dI4;e$2y>`*J&J@MD^Gq362fl zvvbHb$jG=X*l8eSl#zk`pN?#j(^ScXh65W%E<}$c4?+}WqiK+vjUH%?duC~@D}Lez z8DaO9kWHbTK+Nu!L0|(~VB00IP3e#3=>zi*U8B20wiT)+GXIFcd=Q)YWJ;ULsD&6; zjIshizAOZU1gc=ItW2p1FnB~23Q>XYPVZ&sY_6I6jC}sSndz?9^bcAWK#8L@-IX^U zsEiT|y*ISY{QPEihC_z!03ERj5=K{`1z~N~MRjIO;E-e91A*OLNv)<)(BnoH+RFHy@{A+w zvxY%dqJ%C7wkz2+?SU&Y{Gez(uw8r0&bMxL&AP4at=k~`Y;AXR#D1H*Bi;>ftDaiJ z&Nb>|`3CGUMjnk0pChZXGPEP~TCpQgEaOGC7eutN(`wAO3yc+Vr}oEvofiK?C>hqt z#5&S;)iFD#W!5H=b0Fqek$WTB%hi%hh(vb_HVQeNvj-^r1=Bq z|8i4w=uw4hqbnpy^K3@go+evQVGBh4&Ix8O({JOJtK{eU@cCtKKm6=i7yZ3GqT1&n# zC{J;bDbeJ(zBBx=G2+0}sX<-YhP;6ei0o> zUX?@0uGxi4_;hneTwC_^ zV}oEJBD-Kz-2ye4pmv0}c7^AKFsXIsu%gmqAx-&>ip9 z_GV}&=v#41p#w)tWS-$}+~$Ry&)sawKG+V0O}XBXRaVuyeAVQ9Fqu@79kpOb*{!f6 zq*`@O0c2M@YAx#86`{4I^|fp2E63qxTBr7V+&O2n+Hea+*hmRKW($W+o7T#RgEr++ zCvL7zfgLKi?`=tjon+j_ZHb3Mf2^AJ0dC=H-Y%%MXV#Y5tIPAzU@H%;EpMnDc6hPw zYkn^mOdHq^?c%hsaW{dBg-e{x+_?N~)JydHm?e%8Z@5H@HJY!+w2-yws!Sd_S9D*qho_TIH25w~) zlZaU2jajx?x9 z&wWd0aZ#rllr1}B>UAqKs%fDX&vyJtWyo@nXtlC90|S3C z{`NfF+fTu*Wizu#dCz(`fd_d4OCIqgkl)#+YPz?%!8wdg3w-K4iB%t{VKNwIg0g0K z=68%{vV6lZDCZ8>dn&^_`q1XhOrx@8J^3UwJ4OLSd~(fr>RTYdz!7! z4Xv{taO77%JKZsMdVKFA0_RbyegZ$FIB49Wvp&>- zX^l-f>rivF^25zckP27`AvycWHb<2o+aSB+8ja(II4Ewc9tx_Kz#ovh`tRVk9dN|5v!*+iR%JEF?8?fH>dt&@iD#HQ-L1Gh;|oYxJ^VDbv*ByF zK|5C}f3uz_Y=&&(w#rFSF1y+J2;WrUcaoPiRYBN-hC?bt2Gc2XgkXb~8`@NQJ*x&; zyj9Lk-=mr747+vX$o6~3R|lUy@DStw>+E;z3RpG;XX9YD1SD8K$6Kz=!<-qzKW9*` zQQzR@TG^_=XK|ujmzP+;I;~-`S1@DHGMys^e-N#^BaIx0ChNCVP3>mVH83C?_btk(P0jGb0nxk5 z|CCEr%#g5qe(JpM=id8%sprB!mRJ5|v|2aW#2vO)x%M^7D<7%$lYOTOuHiyPt7~G@ z^-nBO0uZ^S$KQs}cSsv;8Qs$*m|TAvGHaNIorE6TJ7-dvM%U4=8OXOC4 zYh^;lxAx}nPlF53nafb zce>*ZbLXH2i^tQ`)uTm}O+&u=qKN>Mfc zATMrTeZbM9Qp|AJ*qD5^bwA13(z`0yAIT3f889Zhbn0Kb#b#v#j%7AtE7rT6j%7hE##JV?H`g^c1f|(BhZ|w) zu&WGC_mtGBKm|DpVBGm2S=sOs;jz*@7(&zKG~^g!g5-Ka>zI6-^?_tv>+To zi4$-NYYyyow_96vDpKtw9|EYYKtHxy8?@WTFr|U39>(sEh&fO4hSiL~ytXll9D@>Y3g>K@H(m{XLaU`}B}U`{a!bIR+xa@(r@+L2h%TwFNJ#dX{}z9m!+ zfn2q9@*Yi|p11LEY}q(CKn^-`uzVpu=b)0!uchW;85#a>WoQ+P2F+SD{PRWOIrl;o zzqXnHO6MSP^0B}~1naCg2dN%x(s7x7bPno-wH4-|-a*0~RB^X32f1bnb5KrNhmoW( z!IO3s=p7eu)<{sEY8aFf1j{IyzQh!QWeb5RIz{$B##Y(H+g9MaA z67_t8c6`?mu(S5+er(hI)Nx;6by3GgP-53UJ-N`<(i!$gP+T{DvN!Nne)j2t*+&Dj z&!;f^^up}px4}gT@`rGO`!y5*Zb-%63Ro^17++ORK=F|nt)1pSJ z|2*9-VAdvnTDh4QvlpQ!VOpt~x4xIz9LgEhRh40mN`B6Y`Yp!or8C#qT}qD>CO*aA z9`{PosPag`@F^@_DaLp8O-)3JMbB7Yiu5~C)?th{$yu0kHugLQvh}d5n{D7iValG;z8$n>J*-^U>tS@qC$xf!P&tS#gaz7919O2I=7K|m)G$M)8$m}{B9DKMYc?tp zf&*d22c*qp$Y|a<^SH9v_||uW?hTjE)WCw=@s@rY6AAUu+Ht0T0!O0zjJ`4E{>Ef3r}F%y`pPd>pm?2n$HlrLC+mdR+Z8OBzPj=ezQNEQ&? z%0RA|o%rWb^1S z_Nme83uMlUHdxPtqd<+A2>O7_@1E(700Iik4>8F(&~Ba3$KtBd9B~$BPpfJNw(P!t zfFDw9tBJ(fvujuNM5vzqsYZTIQ_2uYdkU2nSPn|78g!kJ>y~NMPZ0J3iLL)r4Fi)l zOjb`c^sswLogZtBmpuzpiF~0)<<3@a!wRkE7cui2-jy3Wy#gzDjc4VqaaZmdsN9P$ z!Awd53=OapJpxNnh#Hm#63|!0d^=RYq420;?Bggfoc|uI;%Vbix2Z*W_L^VSX3rWm)USv=XH(8bIp_b2h*7Dj` zEUeT2Gpyy~pb&a?q~^Bh5a4=ueh(X(#8p)iM4UZr{iuBCuRn0mUlSUjVJkM>O;^g( zvohEWVDnQMbiSy@4#~%L!l@_&>QOgAL8!(qNz-+*9q%+LU&`>GplrQ$=2=D)rf)XF z;^i7=nviXDDNIqW7nnCd5Pp>o@=u&78C79UP`FJ)J(}$mJ1RESt2N(Fb^EZLrrK8>aC8P#O(#3pS}5uD&{M9V zS+@P8fpAdcx=IGLvDP1m3e^Yw8FI5}2=0haMr zsAkx>;)V{>XR5lf;d`ug<}R&#x@M(+7lA&V@9XlUKNiVbSclc=e}0< zbx5M?&A{$Ae~f;d`*yqheP!ZK`t~#VC@Do0_+hl z-NB5ygAH{Ds{+)7y|SM>678nD3Wx1OeZk_2x>cE|z5v#W5*3PeuJ^w2<}mqByK)`8 zLa{=B?(K(~wN;R-+tdX5NUHkh?00%qNMU9)Y9F!kUv}jhH#E%Hqj_ErWpxck^`tEg z6W^*{mHm!004bMa;_7%*Rn)au^l`ldD2HR>1~ZAgb>nJvDb@j7({yf2VxD$tYjuqg+7p|1794k2#UPCwT; z8n$XPqK@mi=?9Dvnbp_GK>cV{t>4BjZ?6UQ!*R|E>PO(OLqYw}M{RG=?pzcs2aD*l zrw4z~JjsgN#ec7iI^P)e58mpp+Ot3(UR>oW53a$lC5blw1H92O=uzy*=W%L+4&V9S zTW+JnumR+nGRqESnfAlX_e|xG@L?usu9MA=v*N~%qZvEdeiHAZ z@wy`N@Dv!*l`^z7)+P6lLy7V<;Ct`eE3~dimEu~M(9UHZVQ{^wf%Qs#Zrc&2<9Jif zTd+qGHGe8va85l;l0i{7P8D`Hc|Skx8(*KCyPI=~<7=E#9b zNI?>mIQGS{^gb`*_df=$=oa)nU44552Hte%{(#LajwM@ILEj!h^AcXtTX{*RW2v<$ zxla*K&p`>8vmEa`sURIws$ejh-h4!{U0`{Z!|u{GkGJ= zq$sSfHlr$Up9n+e$m$T#mYT!Z_2l)Sx;(Io@0EjkdgiwV5~~OGswu3i0+x_ZV__+a zt5^lgswH4F!*w7dXAcm5+W(_4?F;>kb3XR7@*2;6-pTj#rN`bFcfZS( zcpx16UHV8^+;7r9qT^zN=)CIEJ)#=arjIc{w_s*hsv~ei#WDH9t%@12b83X0Q?lMw zHMOQ~0q&eS?n}r}1$Fr`*!L@xrwlQ<34GtT8zbh_M5(Q;De8M$)ZY_K99vXnFASC^ zbdFYEKiOn=S*!G541*K=_TO@g#NfkQ%+w$Gb^iN1*migOyExPk`7b)(VbTkA=no+t1yPe9xh`=Sd7 zz{asZ+InAiHJI0X%uV0!dfU_t>bPwBL*;e%fr2vBp{cl%S8>M&4z>+BuF4Z zxhb0qBp_m<)JDtGE{YZ@Z3CjBrFC-=qoPKoG+KT(0i;n;!$k!}`F*};W;RQJiv9QZ z^!dMD&%Ac_+`s33=FFKh?`eIFFNC$-P;Wd{-?~Z2PeAh*l6%{&gWBy-wcReY;KdHq z`z)h5p|Em$v?aUk_|$Y;ZQZuvX>ZO-{=ppifRq%LZF&&}CcrHxLvNl(J z-@J`l^QFh|@?{ILd4q92<#22ZDp@dm;gYhk#G7Qp7c5>_J{+&`vEhXa%Lw2&yrksb z#lx4Bman>}j18AJJq^b$7KTkJcpJF10Jb-m{Un0rPuLAa4_WAi--2t|9>#|gN*Zm2 z^6tXoCJxFZYjqzMxAobG#mzU*;EK@XW^?JdE8t!3K3L`BImnw*}?{*~C*FxT(#IQk04hNOW zhVMQ?1a*MkU5~DzVGADlzPMV%{xJJPKOH zqy0(TKpT|gVk8^dqQtGq7MqlCVwV!yS9w0;1xM-OiNLa;D$KVWe70RN-+fnJzdS?g z{2fb*>hdD@pc>S*M%5q9^JNcL*t5hP`pj4;pt5nPpoA$qnV4cjj(x9mOn!98klBTd z3W)YhvGP)e+Y5Q)6q9#Oc{?zTUvvn}p=$ATlOF=hRdilO^^&C6Xt2(!>gleH4oJ$D zbzX=7tP~rsqDG=RTp_YKiswQ_71+$}idI!&<&~&t)KL4pp=R~RJ#FrYn z!z;z1YJ0p^3oZ!)gBt3P*UL;*tFj&hrpD?GtcGg$hMJ{nd*dqD&ZiNK?NU^M-;#KR zkfvKP^@h6Z5_cF3bnk*ANl{TVs&+ZFZgZ2Kaf)c%6W~$l}uT`O{UE#I5 ztiDu1gS=j5soGMnRe`GQ6?9pxs)FwDhMKKv3%ypCML$Pz>dk%8<+(5F&9|&m3ueDp zutU{$daW*N9%`tAUN4s=NAt&XzJ>s>xtOco|_Ika{R<*sM=nnRhLk-oN9JTLw zy{S&ey@DNHH$|g51&Xo-T9m3S_gWRLQM9gJtE&kzc)iS2wGOY<0#%#qwYsbf)f8#H zUS_FU^-X;ALRFjX^>tN2%+xD$*2vUQd@m$&D6rY8wl`Ek->hFlid8TFB*m(i zf0A!CbelH^mo-)J!3P^dCDCZsMH#!+1`;Y9?_OvH(HIagE?|5Bw(2A@(HM=j0j*Y0 z?W71cEmSnh9(04?VM0Iv{OV~b!eD|UV}4#g5@Y_Ma#&~sg5Z5xD8fo<*b^J5xFB?p z*Cl{ljG;cMFoknkxmn_}gZp`t5+Vo`TWCBS#zIIKr6wR?0<_^Hki8JW<}au8y1;3n z69bV+Y#5c8Mkm`+;C`u>7$Z|5g7QXg{rd`0L=1okMKF1bN@dZe-cZqMsARasP;8`$ zrFcjar#h=CqIm(gJ5`!theDW7-sDQx_(e} zg5h^$P1AsZWW82LV0*pB&`Q?t;4hu5T{;^SNn`jMS)ah)6tb?+-AKN*hSOwC(cMng zmAZWLtu@dVP{T@C8$zM;i^JanoSI>Rf1<`B1T2MtoHYr8W*}apSB(QvtrO>TcdTtS~e_YIj2BdVY;q2oUPikO1FQcWG2fzd(VsiqGpT4^K%Qr!t7 z3>4mQ0e_MnX?qD8&0=FSlt|58c+-D8%2J2FwNCw{KY-BS?mjgws4LJ`b zlwtHUFdZdRCxqPr1&xue$9|FcTL`lzU+_=UO!uky98{i9#oq{{PsPuK(HyW6A$i5m zg)uUq7Dk@D+hMfuW>EwAnxDa#*xM}fV6-yBCOBPEX!jtvTxj7aLw=}J4`IpA;V2Ch zsGX1x%-8MSK9`WNxIYjbdEpcxs9LF5quEIb~36tiLMy2$^sQi(jB9 zHX@1$>SsKXjXaWDVB}IalGKO?@yFxbNO3BWY~qm|f)kJAAvqFtTC2|1gvD=ABnK%H zYVACdgFF&y4>wZ!4tDDh$p#o5+(=aw@g9sk&Vv+ZKbl+JMy_vDideKNU!6S(i%()G zjhO&1-;stUb2^BP`2{q=qCbr24QgzB9#s!(bM3G zC;Bi?^dm6xR37H3{2PosS%2jPH3(6MP{_ZMYrn-X@;rP%d59z^qx7L3|IG4N^3^3w zK=de@c<$6iPVqdlqZC=ZkvtuvrW((s9w({s!6fEm(nj_t?LSBef6If3Fl*Wq)NH7i z3SqH@JR%}FzJX66VLVDfpg0G905gwQBT&QxFOWM$E(#R;Kq@7k0d8&|!b86&hw?}|@bU9|y!>ABs! z=tJ@864)Pjt7ft#>g2=4dF^lCUop&BVEOr)KRuZ?^xH4vzW((O9Tmf1|H1=@PW-ZK zsp-+v?NOoci%+|M^XB}q!3`2^q z6R=i%Q9{TUU7ZzQGz%iD$8aiEG^Zgen&c=}6gyc_S5vIk!HCEhUHMTNG`~<>Xx2lX z=^~&+Y*VagCZ$->{DgebghdHRQ!lcjxtLDO9@Dk zlNHSZ6)UhnD@G@Nzb)tWz#2iwjznChB zH@z$cilgBjp~H3GO8&a(y7f}P49WkLWSAk15KE^^!4zz|Bv=_WuSz*8Pq%5P^%Q)0~O(N_RDJKR;U!d94g-L z9PWgQ?Zd;ZP$_(ptlmjaea)~xNj*kj+et-yIo*nxRG2eg#2>us{-CI{6m`0yR^hTp z?yD7bw4x4I)VH*<`>Tpttf)>!l@#@RIzol{%BBU2=Pv+Zp>V|FC56lJ@HWp^ z@?FdGmlevQ`#xf#_v?LJl!u4hmPp~3(!sG7_Al_kQ${6^9z%F$@R=3)WxjysEAg32 z(O;MaCyxF&yU{?~-;458yom z&AjlQyA;oTdFU35C3I|)71oIK`5sD_^;-QXk6MveXO)9Eu>h!8d1d%&evC)$qzxB1 zZj}|*Gyccq6>`4%)p*n|DDr5mq+<%b+;-`4NtS<%M}2#`9GK>SbbLBdR(<}jDDP@K z>e)(qey&vHu}MCXWbGB@U5!WGohb)0DSc-}wrqByK$WV#qP(l|sJ~It(y6Hqf}xmmhslk@uBSN_SkNysPo3oA@B-y(3^VZ~C$P%Kc46%J)s* z$BMk?l=in=k=Ka!r_}i+^*b2RVUC4E&;Li@pUnH^~NbF4lb=I6mM z#n8;En4o@H(-5qB;F9h4_ zyP{-2N5v5CW)oOyBIJGjJ_8S!f$MAlCs<|#M}kA$t!F71W`K0Cy(GenOWLf9q3op# zOW3nrEfh~k%E!pp39x?kaHIHK;AqDMvZWS*%^}$f!(6kz{!OoZR6$+5l7F6Fqz%`o zIs?i zGa#+Fg+A|RWA)>OxN~vmO{XvipJM=C+|;C~hx059*j zAhy&7zYSkq-1}9i?RtyaL;+Fvs$pa@f`3xx%^2O5 zy#DMwspKaSe$@8r*4SREK)&VnYCGQyJ>|`fc1Q6Us7!G#OmNNmBmngVyP*QB@4SwK zlXyE(%Y(~8Szk@Y(1AZL!xbXO-wC!ir30t8Y2z+g+RnNh)RbZ@?T?H)LOdQ)IV37cfOEBD^4++~Ek87zB<^;dYj4Gk8)-#7j`=khmQ5v^Es}@2SY@awcY>B%L%f&< zZ&+3d1PrjYL7fE2rHTgXm*~Cm(QUnz%hA1MV9gMBMqII?2Bp0!5k*wB3@n&py$iTu z(1#;`q<&Eggy;=ILuzh{X1rd&6h3&Bdf}YnQb2R4U7;;EF}|HmWmH?!O^k+m$z_I%S+Wo&ePXiKEdHj%xr zoA2iu)o}?vSnh@k#V&)Ve~E$*-oox`tf&p^4CMS^nj43%w?z&yXp-%QjUWfx(>D4w zC+9>Ow>Ovvg=!X5Hd;d~iz+*~n#f8~g>%-4kf==CRYcx-MHz#<#HoG$NMGhm*qjx0OnY4iS z%onxVfC?jX*G)}|*xN9WiObBL12~`fVxIpFji2s@;Aq_=Va@s0wAxt)m(Xc>GxNQ$ zna#&9zH)ZM)BPR}X4S7(*mT;r>j^k~@#51rCuL^$kKQ~f{-`x)*e|9JI@Vs2U}Q^o zJUT@9cKeO4Nz+2y!TnPP*`7&>WP>L?#J1QaYx_=vjy=Dz)6)K1!!Yqx|E^NTQh!_Z zRDt{Uq0vTz$Npk-TC|yYx>#DQN&oR1PR5GI0#AI4sr|G1C7Ue`8n-swfJ@;26E^WU zQ)^xPz{yjXvAKWX7tRPFNT*>gL^e*trq~$!z>k4(AN8IE6E)1=I-07R+&WD9;N&qD z1+E`G6?a|u6&v91K%j1nVqTw7%soL8j;vpeW*QqbbbwhL#RSYV_~EJhN05tI6qB

    m$e>WDO&gwS8|R#y-P4tT>J=Jc@(O;ytO`~47YStNOWZVY8=yaaxF#oP7D)l ziV28hlW%m-Av#Q7_+dSM3elMrQ@bI5+3os2e7ZmB*RQnZe{+8M{crwt?08~j%JH0!k`jfGO{|?sySBe-VE6A0Jo)*^m!gZF z`};BLpEgaeIM|i?#}Okxvkgv3%+de+#LFRb?eV{>x^4N-9(yP6XybPmUjFmPpY@yb z!>zw~?QFkM!^iyceL$SQpa0COMP=WPE_&r3%U7=aV!-=TU-NwQ!}aA8)+*xi$Ldn#Wrf-h1cI4p&SsbTk-;y|sMs z9u4O=??lP-_b=bj3_J8Ro~(NL%~P#IcJIgzsn@p5IdnR4a7EgN6Xxoa*IUKVj$15- zcc*Tc5ZRiqpD`0q=fKw;gQm_5oArpf?R0i_{Pyfo|Jtnh8XhhZ&v=1_zRzg6SBBME zIDgoZSWtq`s|`=H;^n0gsVO6phhBp;bz+X^fR{cuYm%VODv|Sad5Mi8}?pcr>Dz?kfrl z@j6LaUinXW0Q+xE4IZ{$nxZ8|MP&eF|0fbuwz6!bTs9-~==CBz#K|ikQS8-T_6pa3 zs?bnz3-2jjuxuex*Q?Jf_r6Pp#8a#6`*K&=l`IREfEImMUTHqKf|CU5a_d_RbsjhkoF(rxzhm2JLRJP#E8MKZgf3av|!miSPd&* zz6@Uj@G<0-(>tS>Q&$gZu$VpCrr;{S%29xz)&veQ*v8ng0<3Ag(ai3tWPp2keraKU zA5`2huH1k}51@#%#}T$c8#H^JaSvl|(VuxjVDq=fT+xXv=5SYBr85Fpc#dt07?{Bt+)7v$W<|(IOhcY+c~b9L_SuI_ORi zEb+!CRu)UdxaYw0;iv0#9{%{SN@ocn%yo{F=?Lwscr472>zY%iMlwo$+~QJjeXqJfh+e<&9FQhcM&Fpk1uo42HB=(Ar{6Q+3JE+F^GBaK$K>h$8&=hm85PcIt(X%-e zJ#O4tP1*$!Oza&T`t4ycYlP?@z_k_%nX^R*iJuvgSRXQMcSuzA3I+mCdx%_mUY@)y zRM%}azS1Kj=)o1&1-4g2KhQ;KunBC8!5SP|rE>;W+eL@28Krd4HRPyZrpH*Ivga0B zLt`DNQRYG6SEVB3i6EI*=~7SmA1w{#ym6xI=Zf0o!-3c$6Q%htne}bE$%V}}<58uY zvhMcFHS2%HVzgo4lej`Ncjxbr#_Rw(d-&c8PzUd63c5Q#%NjVqHP(z0lk^2$dK<4q zIXksf=GY4qYj^oFlZ89;AUB-UDT;#IfOEs=p*YXMVIy@lQ$B7bOq*huMUr zx(T-Lc~5+<6JmP9?(&9xU3@O>(K07-=IhW%Bu~UCN5m;Y9=)g_k9zU%nbv^Rbp1YR z2|+|n4~lD;{KVF*3>Wb423C^z-lX9lCX6@^?tSj$ar=ZGBO)a3{kNW^qL%1x4K;Ye zo}a6j+rB;>EG{C_Q)9L@C4DF)D&>#oUF<$;9^^z15__m^@PHR8<{ny~ew-4Y$R$r| zN-AlI<{k#|#`B~z;>CR9w@l}hTh|jatpP`@_+Xc4#q%Xf^U#KM_cT;ZK-84xG?3xX z&L4U1$&nY3?9`>sh)*2GLN)f{oTj8h+oGqSRTFUDR_0%{8{fDKF>3>;iqZXC%cwLc zYD)G~-hhs#B&=Od6_IizOcVxeiy!dx?h$N^_P34s4(X5w&0yGe-H4LNIa#AYQ1|#h zTLJjwty6>U=;)cVt0G`meZcRw1?=1%u(K&(=eq$ryTDiftK*?NF*y9eLd~yMva%{F z>P8l|gtgLUn#O!5mW?4fiAyf78Ux9l10V-sosewZr(1Nqd41F9IaU3}g#Fjuot1aP zXdgRgAVBE9-!|aSjrpZPf9YNq^kC8s-H07iM(kKWV#k3IJ9HyUBG>SAc1G>24;bK= z1IKHTbxlH{ZOoxl6?U%X>+Y&!{p)7Vr%Qy)>S}?? z*C~e7t|GhOZSnE-mRxxUZ^@D}JeQLns1a?U&*Yy^yA;>u%K%?k@*kVZ;LeVs=eKyI z$tz!+zk*x&Obh9@Ew6k5KCFZ1jtgmS^D!nfEHcNu(V9CtsM{RN#x>|RuqL>%1R&LZc?Y?_JdwvE0 z6EzWjmG?o4p-o_=g|`Op*N9`Mw?Gj5ez&+JDQf)+%Y%D5QVpJ3VDG-J70azbdknzdwZ|TZvD+Z!xNLzC^;cV5Z5 zo3%|{AO+9y53PO;obq?bLurGBeQdSoz6TGDEn1-zq~H{qVT=lPW$CtCLxr?LoBycb z%~`sq0M`R!)?Xo3>6dnL)L2v(KCO*ywxhxO24#S_OaO?&8mh2sTBn?e^(3`ew2)FV=S!jFfTi6I z;(zObZ(^C`my*wrfL3*U@E8AN&_k+LM9!qp{+n&xy z;PobCKZm zO>v!6fbIGnlsAu(w~nmQNYWAW8Y;k^sxlbfbaKR->CH7A`nM+4AW=WGch=m$DRNMd zq0%0+Ws)oCgRup+b7BQ$#+e2x+@d=FwRQ05p4mF+*BKT%8>AlN{rlrSM_3(;N`qqN@()CHoSUZ1%JgUb3%=l}@XE zr`fO=vbJbP^~UV_$53MwAo6 zIpm=SP$%~HQ2K|2>$M*--2#YrYqvrC3)=h)e;1{zTdBs@?9{lg?SG~`X>YRnw3eNnytNE#qt;TVK-%mf za%Lb)HlyONZmZjO3=>uXDQ5!cWA?3%h+Y9*1$;T=F zI${nkX94y|L!pbxI@j_8b+9+kLL%0$?a*(iDnL?-l26s#?}%h5_56q;PjAY5{MS-y z_fF!#V5br>?_}+1viCCXy)*+6l{o^c2smD3@2R=}U`Pf!^jz}=>UsyzKpORXT>9n6 z+OAj8K$bSm$A>+F#X`Yu?Wvk;{tB|=BRm9HwonD-A8@&9HcdELpx1VV1AqBKDMpSF zkzZ5`))JfcJ{!2a+IfY@Z?%pgzk8*zy{UEvY^PMWYxY5q=`PpWyVM<_~1az;dblV{W)z4$}Ws!IV-CH?m2g1gfH{T8# z^O5GqP2cTfdqQ=dMj<#*OBKJ4C&WqRvAQw9?F>Mv-(f&P$6FGghlkd6lzaO^jE4KV zktdmA?k751*<71B@PfPFEF^wy$GSYk8h3>B#C_I0ftZ9k)bgFtJ^67r47&G#YhOTG z9c&YJtG0KsWd{IfJ~r`W!DBA4mOnk}GJO}hgVjw2=eqWT6`zVQ*a{XtL5SsB_hE>u z?^j}p`+BBbgovMQtw2AK3>cD6H$!m8Mj<{2_27AMGU@@)X?)cIkm=?}AoHHYIYJO* z{>kw}%Y>r-1FnP1*P43Mch+O!d?=h8b)n||l67ueOtg7(F6PJ0OSVoW-0_-s;eZjk zf>&YQR5*cboK%Oz%AnNA(*?3E7Hwy3qFF>IX1^9}` zw*VjOM3!w&xhcz~j;vFDcj4O?5B+9>t74;+8aAO6AE^iy3(($j#Wn4mdoFuUwnmt> zRii!nI~%J|509}Yk}XBYo;5k$&BB9KD-f(=`onjvOt01rI%TZGVQ>DAJr>1rx)}aPxK84-F1UabzrltsU@@f>_kM9C@j5Dn z#D}+Kq7*dsZG_s+*!wk0OvEQvp3G=-XS)2~7Enj|;(P;v%|X|#yOYYNIpbH97=P4m zXVA}@uS0xiBR>?=bbBy}t(y9|;NW=kcSUM;UrqgxIP#hb22t;?I{-H5$#Ssej(IS6^CDiV$B%BJJquwgk}4osV@6=(gS=mIh55xeFgqGMqDfNFV+f zgE{3qtqUC2>FxpZ)?Zf&Ty{ho*xdoe1#g;l6?d2Pf7?+2Fa++;QNs_z2Ah9Vv$WGPJ+ny&!ReZS)I)*98+ce6Z%Dj+DLGB>5MHI{*m}tpLh< zSpuc)ChgAM3pzKrA$daZAtd8E4N%^-lj{b~)9o?Lf#isaB_;jeOE@R*49~YPR*UsD z^?M}#$nPAwO|{%GG_1v7>%V2F{q>MAP5<@dCRh_)foL^O2cKH2PtyR7bl zTZ1?0$6YXt`mN!h7~|RAaEtbMg)wmt?u<^`YQpChg$pa)S(}oc+vv(@@0x-etJ2tR z+mJVPLM?shZZAG`muNa=t2tj=L-!^h$LqTtam55Rc4vIbV$L4p_a<9vV%#kcY~}YR zr%R>s6~Q0i-sIKQo*UM*y|yOD95@EI9;>YOsoy#)J9}{J5wG{&7v$UcT;n(NU$q~9 znESP^Df}2SzOd<-@kQ+tV$s6BN#3F_y|Dlvq4?fWb($sS(zgZV&lOy71?JGz)LeB7 zg2#PIdi3721FttZ^NGc3iMq z*E&ANT}9mvJKaQBp4_6h*(*pl>F0WfpyOB3WUbc9Z!~hr&!9&h(%YVC#N0M}L*g;I z12U5JV2$pWaLA0?h?xnmtzcv6vKRU2rx~ufy1_Kigrpx3J2u5XA|g$;V82Y}AAwXx z-eWk(sK151)GnscwN(3H`6oz_L--mduWQ=y77)raK99mjmy`r zwn?#`qQFUUTXDr}O1OCy>qi5bGk91g4ZRNedkcw3W<>CNqGetw!FH#NIgNqyoQVk!uyh5J5<|*3V+ z4Lo@?-}Xt~I7;5pDO)LdA%l>-dnkFWJbBS`4||j6US~1t(i-4db3-*H?-5>QV^^$8 zN1zqe38v1<_inFG{%)%JLN?ZZ74AFVs;>4#!` z@&@B+$l8hv#0~iDWl{gF>!{CBq3QcXt>kf4p zp;bt4pbz{F$y&+MFiV~0h_%_US!*E1QCxE}UI@(U#06pCIb2>s_8oYv$*&wAd7!I7 zZ6&TPIrhaR{aXyynJWL*k#f>*!RH_xbXjot3%G{l#&;sF>*;e44eLnq^X4724$jz83m_O!FXum} znYoMi}fUbZ%0V-gLoO%xtEJ)?Ejg%_;DXS{kY zV3s+w+5G2J;oU+;aON=K;IX8sSpY#Nj#(OZb9L(MeDk||=4^V!A|=NMc7?v>?DsZ| z6SeE}gn-GpRcCW<$Yw3?I6{|xk04*$GT#pl_VkQ8lzqpF*AGmH%CrYuff=G&sKz_a$rBCSfZ-t9v?7;W9@WmL=LYVXdRD<(-{QTNJav~Ne2 zOFMq}b{I2CPSua!Em&QS)~E0pCfMYb9(;k6Y3Y8;f~YQ@g&6~0Ib=vB@tI@K#a z81HpcHF#pe4^@nYZBm_j)ytx~tSZ$V;A;M^K-jKTvh427x~j#yo%|43L2sn8u2J#b z>!t8&UOZmGm(^;j5&<3+@dL%aLecK%wdyPQDyUjwwQ`zlfCe|7q8BkZV!_xn`B$IxQ4DR|`@Q>`Rgj z2|&$-UIK9KCB5REN-w~bb7#XZWzt3v&-E4^Xs!_3FF?2jb1G~*ka4p82|i0)*#Ui} zE3n$A08YZiJKtWZoDv)3EiMUMnO;UOUibB7^jdluz40=KH$mp`vH*mWE84)DWiL;5 zK8i_csmzP<(5#0o4K(82eqyIm*W%5vcmk&;R=gd`PMpG0Z3`5eaFg^msB6jUX3an* zeF_~35gb5rGF=z6l0p9n6a(!yOJlk-P;`PHbtM2w@xm^99$ImcpQyq={9h)ESMf)@ zG4W1PD~6lo(;8cy9%aSD{lIHeoKnNaA|#_Hxl(HpRyDKDz%<8<|8qw!w? zMO=lyouqMSNimE0(yLH^O;!bzXo`*}tdPpbe>;o;zr|l53o?EJRcpWs2UKRdh=0Lk zK<#Nv;rJJr*a54-(E82bOjW(sJP{`G9?Fd%1m8}EQZj@DQ&EY_sd$2&WPLArvteuefGHW0=xZlvuL;d5c+*=VP1gb#uXkNX(K z9ejd3zW#f7jQG2p7AC&muM|Eb*Wm9Q>>@vhMufjest>|AMZN@0f71LPXh>qDfWMJA z`_n5zbPP~atG0PzaVuQJGr(nr-2j~%af)Xs3*q;}$dmXjPof(}p2Y8ZllT=SG3p## z=-3Yf9nmeY;FVz#(4jAkudIqx{`5g1RCk@Jq@9#cKbykq}xIEfbg4S_?@5ldpwdqA);RzpFE zcPypAL=7#7c*jy2OplNo@s6d%F#Uo|#5Kqe)gTG1e7qnPA14?AjT@tknY8OGoJC<&NjyhTp@s6cD)kM5wi7rmvloZZ8 z_Wzuul0g4&@E0#6P?021F(pvL;yNsQ$~D0$prk#nnAKU26aMK?r#uacxm8iIh{+G? z#dN3_@LVMOO2>b9d|sR?hJD%x>3uJZ(o1+yI!I6HMFDY4=+h?qXBm^<`E%#5<~(p) z|96gW{>IsK2i&k@mr=K(Db7}$G}chq4kfdEn1^{JPCBTclRJ$GbWjf>^K~eHI%udT zvzrV!{uz!@MZf+OKY@@*GXOrsK&5DXk*F~8_{pB~PFp8wEu2=#%{XcIGZw*s3Xx?H z+SDF5Zy}*iL-N0mC4}j`d25dUv2xNnTvA~&IfSP^@OeqFXDUy zCta_;!Re3kjKOKenT7LKoP^q3gY#jWPvU$YXB$ppV|F1Q2*xkYgP`J|%NbeGRStLy zI;dB|Gov1gQlW7`aiL2-dCtbESkYKTR@6lms}{u<%?y;mpRNt$iv~HxR~pP@MOPNZ zicce8MY9Xl3a*qE8oFUc7gI%KiXyTDR!UyzLI@LkOZE&MqiZu+(WP4PMTJRLG>j-# ztsb2Kt((aWn@Kzk&^man8}K2 zSqVtv9$C>qs92qWk*sL4q{yO)49ltYfGw(?4JY(6G-bCgD3{5dNtP zQXIlhc;DpT^?sc13qe2O9m$`yNI%SOUBBm0RlL zy~}nZis{nrvk(UhS){ywmR!9gUtGj!MNNhL(qN$#ec8PS1VI`AYHgS#{#lCulN9$y z$s|6z_GL*U#-5gf3Ds)=nHNahB4BmJ#V<>yniWQenmozsaQSmQJG2+j_`@KnuxKT3PC=IXToZ)az7Sr0 z#jr{#-jFVZi{KCww>L~zEyd(W6K;}*&yWVeLPU~DHR=8+i8)fppTH@eF2%q$NPJ{1 zWqG|ns~3gUp5ad$r`LPD1BlZO3CibR6A%o*SmzamlOfjaUPx=xB+NAZM+`IS;k zl}s1bbg}W(HIWPqzb5@3cat@QF|dzVQh=p9+=IpDn9*(maLY zO@)eXmP7LusF{IKu{(PBA@nbD-v^b#)4UjS&f(S6@8I7htC=gHq6l)zWi^xTQK|fB zPEF-UOSeGpmlVqCow-n{+~&yYoi?bHj|^GOOoK}0l?oL}$+606<{+ry6h9(^y^iXa zRH`3RseVXZ1!1HvQ`Fxf9GrBDeBE`jJTFuEf)Y+Ewrbim2Q_+)H5CkHty^o*%*i!q z3X2Vzl2W~BgrctvOzS^`0wOVnXZokf>(~1{#E`7CLuW?J;@o}5|dJpsm zb?u-r*Xg(D4Vo>w2IxC<_|`M$GaEG9b@Ic=A|%$A(fl){k8b8WkuEym%$dyUlF^;y z9~CeKCmpC0Znh}qiHf^hG2f(^*C^)O$m}DZ+6Bo|!>5xO4WV7}KZ?v~m@2=Oc+YgI z2dzSoxfU|%cm}7*$Nye3`^clW4Sj+$Jq*6)H~P4j^)a9CV@~K3{$d~Z>3z&fyMnEJ zJPyS-{*8UiYxQyZj#hWUp83%T;KkDXKcf^2i?|GhWMW;cbwp_=KQn@)^@ z{J2(L^(Lj?lRWBDk+&$fO_%Yi=PxYhPZ3r5#7mL&^iS7AI(kORs@0E=+p^&b|3AiW zc8!t)-KvDOr2m+_f6i|{tjK#&N$0(g*XK}16xsI2_{|TEmHn;5*h9x~{;sU7SN^Xk z?`r(!kO^`qx(?H^Creg+{;w$SYW(IgHaXA0f2tMQw)Q{_PF z|8}3cSM07R51o-Gu`l0Om8Xt{KQ1qyC_Pu@H%m(Tx|PH{{iErV6{JA1;kRtD) zo79|p)js+4N#7Ot&B4>;aH_oB*CC8rO`rV!bAGd*QvQpTP|qsza?zocI=@8TV8lXeh4LuI*a*c;yzxZn$urG8 zYGKCwjy2pSuX*92pqJlF!zP^uoU~@C43W@X`|G!{=(KGu1?hsvLUyAqF`7w@P~_YJYwEqH9xBS9a67+q^}NZ zqxCt6XA|Pt=THze#^kItmrJQQEFQV6+ zj&VhCbEV@tr21Qlx=`&`;3p#&`rHnk?WIpp|Atfdzi-HddjFb7#t4Qt{|=^hmniN$Dn{(2vg`!ox(nRkqhK)~ zQ|xwB-Epp4V|Wu|(DSdf5IZ;vaZf@T?BFxEdh59_oB0gno<*7{J!m6!lNhT%CTe*+ zHlX76zD?<$1X*^-YTWr7mmS!K}1ear~C7sP?S1?c(^o zO=;EQ_{NqDcEW5tX*GS!%qJbjGgi}LW;*RK9;-8+aTpgnjXmwgE}PMn4$lX((pmNR z{aH~BRToA^f*M00Ue$sAS3=f^g#UA6wX5$HF{-VdYxX$>6(|87xlbCTxv>MM_jVF7IU%=IF>av*r;V_;>G8~kK zuPmmIttQWaO;s7k#f>ZKkd|FpYG_(7(`1y>)GC%t}AllCf9FXv<39L>)7IZ$-K%3r#w` zw=+_Ya2ijWjh{mlGkuBPVKaSmj#ldG?f$J97(F(%jHAT2P{-dSX6~=b*jtfys4BgI zj{^s@#&siME0`Hw@^q>3W1DHQ)!5@OdD4!zpgWI8_wnt62!+0Us48O%#-c@5Sgw@9>`W@pri}en)WI7>luuf_ zccAd-MyKPIPaxTc{4bAv%>Q&AdkPD1EVhPda$R>=pCq($OyH6O*s|>@cm!$jV7CM?$ZvVZlmG)b<1qQ*|!hfA}+HW zz2{MaJ-?DzH&GbY`7ryeU&IYhCTL>J6K1@mm#Dr-u1KFhdyIOS?vJt{oY1#Tya&Y zOTU5`_*LaAYF6$O$GY&V3d%<}Y&WjLU{zDE7~B zo2*!$#hmpS0luJQ+>a_N7+@$n)O#@8TOHpm-*}-On6s@)5S*mL;i=Q3QWIqZoU(K_ zerHA&*5mIoXPVckfM)oL$$EU6Xi;wQu-prPa>KO&lxM`eQ1i;^p6{d9|K`qu4MCd8 zt1)NaV}n?__X9&Y%$K1&h52u@_-}Xm|HifPNw@!|%7nzMw~xP784@XQHt|5*Xz+I~ zKhz9sEyS10y=>x`$aj|MC(lk=Ul67%2)rRbJD@D1ZgjM9)S#?-%jB6;{kEB=OtNSz z&9B+aSpx?PJ=p=t=F0qX|H1U(>uY$wLj?n0vMg9|4FT={v-!lglmVJNaz04OBX3)> zY|%)^vL$yfC@5F5OC~kvJ`YrXUbh9R*T?DqDN|B->dHI(vyEngN`2wu*! zF-)H1^8E7UoU7c|M?ncKtHT>U<_Rwt(?YA=Pgt~vwekCg7(6L<*5IdU&oQ&RDp^LT zmOWu%?`nm*AqHWLojv2HvE5j?exdP;u4sHZz$UPpFu*xOQgb|+Z93-iPh_q^v z^Wi}jQnOSR(t#Bo*Dde&7-B1;0Q z)OjM1y;~C56CZarKV*>Eli7%T2|zW{ig}6oWJO#=vIk)pVHg=urP28h3w1)Zr41~{ zU#;!d^F3b*rm|YgF_lCO9i&YL=ra8Ks)=kMT-0@agZ@8vI zZ*MYE6>#DQ6Kl0Sv@)-7CY>^8GE-;MMWa|KC7;LLq^a{s$tW4{NKjUj3}wCb8`D7H z5UqjAKuGpWUm)ZUysj1br7FkLdH*-=A+~V{qoluGPCpfn?i))SQ=B}Ss@3OAuIu1W z$;DYY7eIQ3RIN7j>qHAwoi3=2@??2COv% ztOYvGHcxI3p5ZDg_QnB6s{XLGg#e^3e`+mLg1+dw?d>LF)!KAyOmu-g;;!8hB|^WY zR9TwXBdn1gzJSJ=x~SCjT)weP&^dYi7I$>U7Pmy_5`#35JmlU}YWkef-V(Lq{-_p3 z2JE~5(&7(0WA9cFqhVa~l2X$P`9|&`gu)I;+gI~9tNt+t#3;w2-WYvEyr)5&fi8pg zP02QXVIO<2Vlbk%X_4&mnf+F7>$ke8-~H&PpW0BokHuVA7so~`onpQ5i+Fr(2xAMT za&Ubs=1A4JEmhNO02iYz758+;9^Mw6qp5Tfm6Up-!|0~{ze7NfTZA6m~ail3Z_$J5sgU z-Qsn9V&cAc+?V)P^Cc*8)IXj13gvr{{|RCbClb~ z%Y4AheKqH7Y75NTHelDg1NJ0Gq0RKKT5W!`yhrBWB4C#88|#oyI!(xVVVRjbn; zEw?JrS`cNoH)Xn~joU%3u9z3mq0ZR%2E|-JJ0YrY*376EmPYNXkBVA9FLK?y4(k!k z(9Y)d@%^TEMU2t5ybQ|V_U83MxF-u7)Z15dgNYj641LCL%&{+9V*hB3-EWQklO^`g zme^M;v7L?i7SpMYbwT3FO?r?~4-{mS=eIQacM)gxdg!xK^xfM6K4}X0B-nWDU08lK z_2E(!;A2Tg#1j4uZqyW86!ArVo@+VEMybU1SYC-GiR`%^{jYln6SDs`8G(!M<=F&~ zKXj}2)y!?JnRt$vh{p@i&I?LSAMcU7EzfvcXY9cRa>nK6x}enb*&bsN4P3mrJ~3)v z&C0p@=c%>J6yE_y#6Rt-nn;brKuu^!&=*49;rI#E%Ot9}r*z-cjr@$4zeQwG#&353 z8D+ZAX8IoFl9RT8FU{9~5e#yPE9Q;Pn8H_+w4f?BW)0Ziva9tqqAK3&sJhP`zSaUB zq{sMtkMa4VCJ7M7j;4r@x^C?d*_g-+@5cRbD$Wv;5cR9sk)}H%O+Sl#_-B!(yhu}N z_2qA($|HY=^VWz!^= zp1zyburv_Mv+|Px#?{n4U8ETeB@^9xgR3u^P?2At0R~{^D zi}TyIMdLGM2l@YzeEKk1YXv^mraN3mt5x!vRrsdwM1&Oq|^_94fz$G-m7TF}Tni&pWfDDJ(vh zvb+Q{I{5qTGhHz`+7&fpRs>s05r=J%L(kmxb0^m&d}-6S>`HLd-{-CZM|D@*_(OKk zO>>XOoOJ)q;#xnqWPsK)8HCb}Tbi&QKUWKg=+yeql{I70ThQEx&iDV4=|>W%$1>S* zJmxqXNqpyl$q55TrP$N<_-XQit@nTt>WRuR*W%7xM&i`zZhH{RG^WSsv6|^Atlkj7 zZ*lw62J3tm18`$u={8!@alU#E|5gPPcuF^YqgOybF5oc#R|PEV+-_)mNZ7pvNG@YS zxR7W#P%StF4NxF4xx+M|$86}2c*;G$Gg#j=TL>4TuiD7|78w}?MA>mRBiN-OZqIXC zpgr>SrU#iA-n87(WRsF(vaJpwLm#Id6bSN7$E#*n#pnWCN7JhbOsZ_KvJr;)2V9L} z&16^p6Bg^fZBhHX2725erJU?^2D|;OL^3fw79q$88B5R`me-Ioeabodl3n~^{1Kxi zXiFFvWShY`G1Zda+Cd=DECu(Znat%t?j&0t0X*haLd7{Ow`<$|M0a2^@yNn_gdgO> zaVa|kx%SJ1SB7nl5Ol*>lVyFT;dNxA-9BKKx8z;Aaa12$g$4vR?N#cAiq`R_)LW7b zy(MY!mZTW&N@8vGDA=X`SsR&<%-i}rEt~v8V74uG-ugj_4-c;jZFuc5!Jp>Ya(n+2 zYN&Q9Z|`KO-C_%N@b><(K%A;n*zvZm)9TTEE^X`OOR$k_S^lzR`74!nuD`W7*iwuc zFmLA#Xy>H~Uv`?%&TaMg_0*u9Z*LoaAq(w%&heN@^Z#bUj16-^K;9$z*Rbnm>Av*% z7tsjbnVs7eliPG1jo@3SUcXCfV+-$yI zN7mQ-HP_#0j$T}8UL2}z2IJTm4d!iHgGF0zwOc-QR+>MciH+J1I(P%V?I9{_4p~I| z+-1{UrvbIp29V_d=Lo8SJ5uSNV{gHsX>5+!+FM`GQy(dPi~eQE6%aiBPn9Mpq}uJm zfunG02|tE^k;7d9P`WyO_K0MS~{EUnuT8L9)>){7aAb9h6j z@U{y53rg>Y*BK)GeTD=~OVN`zui`>#L{yGTCyWDQK1!z(W_tgVbU%7M|le z7{O(0?jSv4zcq4QsIWdtw~-)SYinm|8y1*1JAoCe5hk;($(Hhjv|x)xN4IqIw4Ur2 z0;iyl>IS2aiec!ZcK<_Q&PgYBFF2<;13z@+TNpc!1{|uriT78!mdX9q|5b-kni(>A zCS9oL-DrND%7%KyzN>cHJak|zX{gtzU!m{zAVI!;*AgN3UGsx--`zA>?z?YH>OkME z2%X^DciTgizI%ID%qorCcMaF?&${`Xx9^_w>+QSF3g5mPl(nL|2A?5l7c()5t&9DH zCb6f?raL>VrF=pg-4y(P**g>XD5`wlpX%x@TX$yxvZoUQguN3W1_;od1PllmFf!mq zcOVdyCF}%HI_W^dq9zzMqBC|7H6YGJhjGAV>?~rgW}G1Ci^_O|0xv3RSagDe@_zqQ zRo%_vHt&7z-1qt1`gGM<>YV@CmpXmwTX)u)V?R(QzT02_PP)z90n}V)qq^}k`b0}$ zxOxCE*zXLMFxVL{TWrN1M_Ff8vpO-OB0yDY2ro~G^S1qudE5W{11K%yJ}PCjnQ=D1 zw!ewf)jJsqJU4J8I1fer?}eingEFo45UG)byRy3MBgBzn(k!uXkdFD#6 z3Chd}^~H7h>d5{3nkRl(aVmX^*)anF=i>p=01;F=M$$wfxK+O0|g3--2+gH?Im zuUw_g8`OU4EN+u(un1Rd|q6ztqj~;GDh-B-qVWOKg;;t0$NPVSaEF)aZ=PiEZ~YUg~}uCm#oo$)2; zT3%x=%wN|1N4a1vr5t(9JxhI%A%pBUs8$nr_%6T1b=e-H#FgazZz!%qr1vFmUnXbF z4fjvnaBt#MVN{)1L^M%a}rZNh~4^b*0uXi7EAz#BLpjQ8!$f zM8`ixLd4}f<(I^qY$b`gE+p|KO5%GwiL)t*HVcyYo?j9p+fdc&qW!w{XS%86vImw^ zJ21-(MX9bY-C{}6WFp9X{~+_dLC&Tio9rK>RMS27i7apyYH6Mc9Kft}US()TcfVa* zLIvrc%E9fF%7(yasUSPAOy!B-S&c;J`=Ce~14!epo@lEX)V50sx6!TUvQAJ{+ z{!tB#Z)r@+Huk3W0&f1L@p*i?b83GgNTz`osXdV7S*p!&Z@vW?v$3yK792Rdu^EON zvSN2&l6yABFN^=o>FuteoXu^K>H1O@4-rPpvpRJcIo}XoLwhaBL!&c21Y)7eiH_i8 z>ht=Bm^woq+J@OU-#dc3?qoD-+WIUeT4o02CR}s{%*;RxTyb4lgURzX$(j+5WQn&v zFjn8vlrlR>TNx9(-d>xP7^EH^{IIS8FBey5)$U4R71ZHkiJ3 z67Bj0i{ChWpN(^<=X&^vehQJo+*>u|iEtr3`J|1aRB%E&(A#x5U9{QH__~MY65`vW zr*iQ$Ze;*1rx0ja?i91aKD&{ zyHiIJvJx$rW2dOoUo6bn?40yc@IDj9az`&!><4MDW;wx19uLx06HC%q7{V5#?6Gjma>xg*>= zj)w^Nh>|m6P7A#t;M^uHsnxNzf{B+J2jHt!o}^DrY$6s+&b16tVY=;Z-TG?w@Ag;H zf=NWl=C!Tin<6pYb|&rbHmv_7T#W^jJazAnOK&b#vGj;x=aMX8ebb~T&ZnlC+)K(j zi^I$Hh_o`#erOw&TNr=daU_MYVXIIT;PVGu(i_r!3XM?qDsL zBZmvZ+!VBAC5n&oDE7YMk$B^7ia>D+;OFmF&}R^i3=pZ_)2A1l%Ud0wT$Vo>oTBQ) z*C_@G{E3Ud|AqS2iTT__E3FsM;V|PpSE%9YY(8(JRm_N*tW+p`o<{Sy@bcl0n`1vz z*L{RfdE8)gz8sKcB6}r*@AH|;t&dUCc2hnf4__$Iongwe%4|MU$)8X6D&_e~Yv3CO zOUVVZ|zkD{JjYEK`(`WNm5cER=oE zTa5RKxSF0u3%dJPPB^!MdW~--ZY;EB5V65I`gpOLL zyXCA-h1Ht@O@UuK2Z2&SkGe%C;=p0Tx7kXQ2JTK8+>|s_YEFBmnRYKJW6QBeMns&H zx^R@wU3c>5R;4{Xo#r=poyzB~xug8sQ_Z#*-`v&0=dR`>{_V*z=$)&d#1r4cH{gk{tcd8$ zW=tJW-3|IO;l`0|sT`*)Qsf^sSd0QeM}eDYD&s}=F^FdIrx5^yg-gsJTq4DJX_nF#x`ufTp@>rkABk(Dk@k z?LhcSJ?O=YC!f~?TC$@);Y^awx44kcd(=F>e!=H%Xj=z@R(X3(+bQZV#ZkOr^MMw5 z`HJ5YO8!t1o5xot6alZ^geR1!c9iznq(C0l&9qiBJC&T~^CxDd|7qD4*C1{~kx4Er z+{HCLR7zTbGn3XG?XOW?$-AGr2tKPojY%CGHrCx*DV#&UvZs{CH@lyI7ot&yI6Jqg15-aARTv+ls1fII>G;QJ4- z@Uvod;v8Wn*u(7Y-2o5uo+F8RlJ)Ao(fLi#_P#Sh>r_WWX3sFoq9%;KJYu3XLa5b5 zSUYnbQr(e8@LmYqq@GPQ->|Ofeim%VcEhFdb~#Ayv17t$I7O;_$NyJ+U+;pyqj=G< zdB0>27#~yqRRFEDXNoDiq~uLgUNd%0F~0xF2dAa2FpTej0tnW-1&X^$P4_vIAiL5o zC?*-CeNa9p*k!{7jY#9{T6r%NgQ)V+@c-AOS^hq< zv~P%cHxB*ZQ)m6>*E}g$Cqq6WC-{yY>;m#}m1!H2RJgFkMkGc%kr>Z^iWu!;0?T=Y zB1YLBMEqU9OwHdT zuam7d%IbB(S8na_I?0oDUPW>Px2M6lmITswgS6G z${G2V&k6k>eZ|4|-N2@sR+Vv}92Bhr=mS^TPR}$r=F94JP|J#-GhRV66fMEm=m4@; z(PnzBuE`xmP?uNGOhr4=>ua8(^$EHr^@<>~*ViqIHpOdoP4JQOEnn&vT$}m@Qi6O} zC1adk!Fh^ykJqZu=U&n&zN)-Vu8EG~WTV%~OhxPVS}FD2D_`-o&g$7dzo^Ia7|#KEBhm}*5E;q_Ih zXk)!r*W{rhsMRZIrlMtDU-K2M-fQ)vf?B+SZc(%&y}ssMo3wdS0({pCvVcsluZ7q8 zTIh2x>6E;(dwu08+Dfn0HI+>9waV+{nsg~n?(jO9sc6f+R@YQA#n)`FlUo$6&)2-G z6Y&dTtT_3J7%NVGBHfDb9p30&Q&j+shz653#sIu^s1SxuN97N~78MY-S}g zAM|aM2-PNuP#xOG8i_y99u3SS%#J4rkq#;miN<03F1!rUoFL(D+7o|PBj2La+Fz0FNQ@4 z&_uCjE45ZVACP=Ba2f>UF$%y}xt6K6!B#D#h&!P&(T$5B?!{FlzC?PaR;${?!_YGE zuVf+q9ak08XqQ0c`&eR|LcfCAS(PS(%hLc}C-lfE|; zol5&6S-*x$KeBe}hd=>R?LWx+7%pjKU8*NElTNMeB4!gtDv7j z))o3WP}FKIv88lTxXdMMmwo}6^;!x^OMR6Vo0V7qVN%!OR1FdWQ&eUls2m2mt>Pr+ zpobMBCou=@hj9lv=OpH!6l8S?P8BCH2MvLi`;|z{5;h!L%~=C^IgZuYcS87|%BiCH%s0;ybu zVOsL9r8$DGFD^92P%SYKD?L)RFoXcxG>EE*#2oSkOjJTDA~A=2qnL=q9P%AZ%g7}s zG4otK2`lw@?JC%6Nw${IsYby>xnrVCFi}o(9nAo|q~law)-^!MChfUUz3NQJ zP0;?6j9*ej3ZM%?{ZxHLCLSy#slF!DO5BU2d);K(0u#^gvoJB87B})>CG^wJfdVK! z75_rANe)ZK&G5mv=$W1-7g`~LFyDHe_6Ar6WaF|8W|cz-%ur47s|QmB2=~>4X)x-2 z^>us0tFIx1ea$hcB6&EI+&y3bgyKl5{sJ$ zGY@x+Kmo@;hD!t8&lD(LEI|pS9yjO^mJHCM|Nk3|H;_gH$JwMwf#zn?+y%|;q^W^s zAvB3p;wzzHNs1I@aw04lgnOEa6!j0G<58a|MZK?Dj_O2#M|CmGJZh78)Z+dGGxb24 zN&J5N4>0qj$-!ipAqY-H1A+D9H)jajVeH2Poyi03M?IY879j|E z)sG9$=fe9HlK)$|zV8y!|AvcV*qkmA-&O6}DhLaB0+&2EP;H=wHP5eM6{7n4HLL|N z`ZcV3VDxKPD`E6&SgT-^8WzP&wGKwVhE)P18kPySu4q_PqEf@^uVlC~5DH6Z0;XB4 zB4PE0FE0$OzwPCPS>OI}SNWH-Hjc2a!u@ibwK(f>9>m#-vx8I!Bl$y6 zf9Rm9Lh|hpUP+O_K`o5joRi&9ttIpCDFQgCiIcfnzE2$%nUBgjL77eF0kS+Lon%MH z_0suk+|ZPlfQu0%3| zd|~}jg1-~+onY^a8`d9H!0-f=f3N#C(>~Y{G(I~@{q(pvp*82@75_N=*NTY*ns`em3KlwvPY4}m`X@bt*TRO<#9(m}oL37*R*^s9-Jbq%i@wMF<0|_u+1UmxCyPtjg z;vLAKWjM=l($u6L=PNkh!FdAb1)Mr0jJma}04oXqHG;&)}4;=0FBn(O55A4Ut{ZJW{rzc_X=^iKHxk zv}{E~i0mp`mPLcC>`Gy_Q@1Ev(UgT`?ee+elMGnVoJDp;^DUUL>mAb~X@)1?p;;;U zr)jEeMH5%DqET3m3(Y;qiY6nnD?V|7Rfx}uCSBx;1|iuMO~1*C=Hs#zb+=?i{jY3A zV;5P`gj=?v2|8Jo`>f{3u4pnX$BX9g*QtQ+hr)vy=Q0s_5t+MnM1Ijc5#pP3Q zpGetaIC$9N`Z7FTg2^2jD5eVH3{bnpv?+?WK<&30J!sfH0C!IT)>>Ra9;avotr$z5 zi-FJ7~!s zh|^&+@0_M@pen_r=}!*VY68y7Y0+bl5|g-laS@bW`VGKyhfYzMP{HtS9xAK}y(e{l zFiy2g>NqP@3`;}RP}NX7Q9@{7LytiX!TZ0oY6$ht9Z<=CIaKoRl+FoeLX_I_El$ZCqL z{ux6u-KS4Qkh(}#9kTjQ2qpXTvbsxFcgpH0Ssf~?$EEzx9+TAphzI$X`NrB%7|5(s zoe{bPwb(6Q5PL+O%Bd+w6>8TU({z9o-Kjl^%%fuv9Q$*iGhs(&Won#E_mNjs2#=0< zGDEL$Sz};F!-?{oajR^mQHPFloOE9~NK598vc;paIY*XH9V*>dCi>K68vVlakl8Oj zD`55$&)&bvO#hYp-!Hn#OzSlM_a)Y_x9$7?w>FnL4}RzBKiB3u3YM){<>&RPKh1nT zz5l*(E843kp_(1@?wLEU=$^R?9E)J%4TzlcKm54W_5Vei%ikrOw`Bg}MN0uj=BC0W z1%>nH7tSBHWZC@Hi(!kezXFILg|Tq8W5s+akn2k1|Nr>{RJhCZmmVRM6-YAaEv#?q z@HC6rcchNYxFJ1b#0{fHna!gtskkBCPPJIlM~*a`Q`6H(!C?>Nq2q(1!;v`A6LI|bp$Bv)lBAfe3K4-}S8V3EGyr1SGuaV_FD#ueh_?no> zcO?6t<06NoNbbIo6ZzYrzf9hbagkNB|2}eK-I?~we~gR#*j4cvnDNWv_hVdSMV`_({k%Ls?l6MBniITBj$f-BtwBE3wpH zWcIsWx4!UB8IGf3kLLN0w%xiE^PbT$6kx+NY^>r~QC^ToG zN9a79bWqi%lYEf9Jj6ox%a89Cz5-^g0N$($+*z=5H>kly7OMXtYWJN7oAv^jwcpCj z+6ij5JQ3XEE|I0xPiF)F{0Q6odOSN+&#V{g0hj3kBR2p~_MKuv8k%2(0KRdjsM&|u z)Zj0iQGb5Ky7wTsyY&&)k_0f6yZSsC9ko2}mL9N>JHh4EOLG21{>YD0WTUvf$y%ZZ zM>#-<3LKpa}x_#k$Jq0A@V|hVYDm0W3`~1O!ECSm-~JSal@at^5A+s6)~0 z5HWmvBMgP(`~8L-q%|99&O+L4d%s)w2BJ^#W@*>EC-If9@8@d9FY$)YgU5SR%?>OI zv|ii_b(4x++!V%2%wQ{9Vb&vkqriqn+%Mu8ny2@x%aB@$h#BpE0sk; z8s$5c38}E-hd(Fyj-+4D3Eqyx2bG!mSRW3Fy3)SYwpR6IttoBvPN6)wpGF@QuijqZ z{1-XFosb!GJefAPUKXmH0qyz~xfLaP-Et!QiR<+htLzo&k({zntMkM*mByW}i)Cd1 zC&Ztw3+c4QzvYO1*Af3#T}Yb{|6yWmt6+iSijowav$$eyk+>3s2BI~H>(*6(1F=3u zS5o9!0fIu2&KZBQF8(bc^7x6k4?VFb6JtNDi~W$rf1DTxYQkH#_z&HLg7~m51P+eZ zg>=-#HZ{hwrnrymLf&nRYjecIS7%)a0__sw*h;-_O>M;rre6!7K`~Gh6(tDWS&?2; zQS8>OVr>9RAfAF5T&E^S?E5_OA0r?~Y}bjnlXW32b@6SDu@tU7{#{$bTY^V)x`{Bc zGDWw($hF*Au^xNo6AqWgecTA{jJYcjT!+}VN+}wENp#gAIkBgO*{{jb9cmp}mJoc8(?kY+|Oj~da!>C2#HWE=pNL&$tJd(1&`Tn(_Vw$UJ49LSD=gM-;IU{-*C zEFq%zxW?8tg9{6;ZOj28u#UMBZQE%$0gUVQVb6ewls9MW=aGLE0X1iUy9~l~W%jsQ z@Rbp6W9A;$_!`lv^9MG6%8cLO1)=dfzaV{5r^Ky87r^(Jt! zWeb&50t;}bn{wC_joRH(L#s`XJWO|p$;}w?Na^txyTr51Q}tT{R5PaPw}Fu{mEKfh zY^xdkFsMJt9o-M$Xk=Tcv*|kAQG6Ts3ht;5->JqUZG@U8N!l_~;9D#>aOh@CG~LhW zJ+_-uog%Dvub`1yv>lBVvfk6PIZq!n1pP5(?BrcZQ)(~mw%+Gho;)Zi&oQTB!I4>k z&aor6zg)nM*UjmD?`Gz-)fJoF5&tW4N8jp|>c$8rbL22orA*ETvu3IHiwcuAsXGC94WoE?De=<@%@Ja?~|518{TBCW|e5k@P|n@ zIA&{R6#=aln_JxAaJmK>(t}r68ymOS!B3m@CtZW!gk;VqyvMjsY^4V+(EMmE^#G^C zfsfa)Gp|_eq<=L*O|;*+p`E^nfJ0(M9t8Ic({CwIXAnoO5%laM*D8jO2*SLbPbrBpk=xETrRINKmNt0lM zsU5D5TE$r;fz#Xm8hJ)odQuqdg$-^A{?>ZKIcF~qlVF3NSPUog45y0?T@Axny8505 zN1khStt&)~X=sjJ9QmO$?zFwRQ+vjuiwSFsJKY)A)d>_<+~@XYh6#c$M!RmEZfu9; zK=#lzRx)Ul#ui|x*ijx!(L(c1FP9fv=EM!lxJ^8Ua6{;yAedH?s!aWo>9L*Me;u^w*P)Cwy!YuhO2M(v2Ko8qiR%| zetCG0@N&W_Yu2KwG-`vysagt^kJG(dFiPXE(l91c533BWbLTBvQMhR38pn!7j`@q` zEuvR;!qx7_%<6a5iS_;UrK4>6-v_8V_wUkXd6`a zP`m3D6TDC9vfX9o-tFlRgtQJhRyMRjHMl`F>}1n3Ha5E;R#l!8)nyxdEQ>H#Roxfd zaf|5%Vr%YkSNuV7Fug#m4;azzT5H$P3&e@bwdQ^_S0xR&k3M1yFYo)fnSH1hI{NF`4L0_2KvU;5Q{}QU>+wdl(BKMCnSwBC z^Z}P{*i@7LE^J)T>P=;Kt2W^+ny&w^cj&qa7kZ!dOS3Lfklt|@qBag7+dIb4^%AHS z#0faioKUW|6gY`oH^2Ka`fx$fvqAF6$<0U<7SD4ZEIjOt3`kCP;`LR% zi+oHXAAQ7Qn-NA`*s)yTQvhm-T&f>$!QK3%m;n1DHgg%+cl{oyW|M-0leCTYQrG0i zQq8jpq5|v(6H`QTIV;OBNmW}I`2^mH&D+{HnT^q=&9io@v%}axH5|7U3<_{Y*iq06 zmSdxETbK!NAWw-!6!Te=S%=Uay%*+%d8`@-z#HT&^w;d^p)Z& zJAuN)m?y}&RdznZINi@hp5%fHR9x7Mc_@z%T`Zy69KDO}VV)t)Gl>*2C%7LHWxCg$ z(PGt9>9*w{g{$3Wb%=;;IJVn{?9MjnR-;DOYc_{5jR3&WmY6bpbOxxLp=mX2K~!)u za`gQ&Yk%al`;r< z3tjnbLk1uk!A&P3V7PnaK+3*uH()xIuU6(G`^?BbjTISPQeCgM3o%XwZ55ZKvYMrU7|KA~S*d8>spEIfKw-z=iMN?}*y)c>8jn3ei ziC-cYEAqN29}_7@0evZmudQMW0>F#R0$GNEiI|uu&hOKl6!;8f!lZ}fOc+!tLe!v2 z7sURa=ty}X{ra(>&ly1@C@oQ7wyO2McX!Bc~#gZHGg{Je7?Oy!}4%b!Xty)csDt(aF9qM}fwNTo zCyuu}wWXPhqdLvbilMGJ^|^+^c9%W=rQl~xp5{kR^e%gnhF|6|V`mi~zo+`f?-~It zRaNp1)^1T*Tl8#TUvkRF?+mDX{5IrZ;*S4ZI~iU!UbJcvo`~>G0LQ|GD+(9l`v-V% zDZu}6_{#6v!bJ;<@B~70gibtzwC`KgE^c5K+`&0X`Zidb0=~j#j)GaCXI$}n8iB3* z)@J=cEfSPkh{* z@}aua3^v_4UAQ`_mv5Yl;=@m92da&+1Q)7mg=XD9WtNK&HJ=YZITPsKNqL;BX-qgH zT8>u*+fj~t8XJx1Si;n3t;4hvvxq#UN5}fAaKK2tAN4-fTHOQ;BipIhTvU8UY}j76 z_eCJpLaOd%Agy_lKrSr{*>x{llbZ2b=n-rmkAbt_GJ^e&;ItI}qf-RW_{aAJ!)*kf;E zwS_5*Wgk>U%D$BZmdL}$4m02GEM!z1^hscGxnThOmWyzizscv2eBJiAF#X*`Dl5LZyoo-pKlu&1k95U(EbRD#k;U`>`fi4!5;VY<5MAQdBG zk>Z-rp~FyK%jt7JxG(CQ2b>V@CgC@cZjk1U>yt>GWl*m^iV@EfjCsIWm zypN^mTM@q;jN$5(obMS1bi2uf$XcJYq8Mg$e%F-ywP?&He<8 z@mawtnn&a`ey+0{v))9PlQS^odvEP4SMfqFu~WyHO^c~Yf#+HL3Ot?0n=-@hdoeQY zOoY5Hdxy?#$UwFFq}T6Y8&DG<+TB@sVRKC=!P0Hc+*VsgA~1R$)fm=@=r=ZmYpt5q z43)S+IHKj5{D*d`<)%s%u{I8xO4Y>zrUW^|BFyOWhQOsYz#LxcZdIGZa}aU$aP>bK zk-lh8((P(%0=P@|u-ms}XKWps9fl6c5pde^c02V_ygw^aO<5fE5<_=&huL_$HdT+i z#aaRVS%*0nUSibU4TV)Ma*(qW_T? zUG#q~@58ieHTALn&mYe{V>6x++FgHd)tS4n>CBpZP-Hz7A%~?00qH5A+Yzfeo*mWI zxKw%y*wB5!egl6B@QmBIz9DA6g)lMknC-6<`{*&-KQ2ah3Cm7q35!!MI1+m55-vH) zisxf?jT!hyYDZ^(eGZmfl==00f1|RT_5od2<3jz;D~WiUOPOEik0;xa^XYm_?sv`{ zjybMCoaX0!L*r=s4!V~o&#zyIsVnyO6}C61ugLC8eMR=)aY5BlFPrKY#8_BP80ny^ z5=8f;C<>w>0#o?P-0@j9Cm-$^XI7 z%lWS{LGPdcbMfS-ltDMjAOo9%cp0#*A#chLW1U&UKKb=gp&VC2)W?NT+s-W{C5q;OYO!V zy03mBihMahbpk`9w_M)m=08wtB^fn(d}Y`Zr;1b=V?uif9YgbT8C@IXBD?et91zU{_$soT^Gd3 z2-m5lFCr{R_|`n_ySiTVMFf1nBVs^l*uc85!Knt}Qfa~k&p2xmmJFN|Pm{DJ#3s>jx z`6iWGa*dYHEeAl)`-Q+9+DgdYhi9rw3kz3aNq)uZd8_8i%h|Gt7RKRD=`SvI>dfsZ zf4RSyGtp^W-;jW{ACGQa*MsxK)S#D~LEjK$5&uB5p3cu~_jS-J4%>)XWUKKG6VVfC z7I|@oQEYH@={EHMNL)3|q(#=F15^6veBKXC zwth+dv*!|Bt#Ut5o$$01lR`0+uPr3pH6D|~MibT+UWu&S0`&fOu6K1#l?@inA%Z}Y zflc$j1Bp+cjqJYgW+_Uw)YbxEx4k$Lo%z<39#DpZNf+G1f>*IJ{DT>zrk=WASSRnP zsjmhD5o72i6S9pT%gxgNtJgBD`u!xsO67?mjuaSHuR9}N@60KWeqyXuwrI!*>lJ!i z)qk>HnsXCE&t6i^ywuC|0lPJ#^>R+j`JmjhBb>#-El=q$8E4HfziylQ`pAhjmhY#} z$Zbh}jLo{z)%o98_XwSV5$~GARYP(oU2-~d%7v-rVe`{1-r(h=u>Y?(RmuYBuwTZg zqQBv8zRAm#x*lhWn$Ew9v64Ye*ZiY)C2Y#q@h@7y7jCcnDCjpnELw1dfd+d&3z<=L z{U*=d$=D+NQO1p=QVRM1Y=kJ1{%GU(c;Ddt&kjha^@V=isVo1s`&TejzBOv*`_qp3 z{;y_yFsbi z50Ps>_&aaA$(UMOl+ipc+X7hmVMTIrVf9_g8e9{x_@6vu1NKmkMM2U65JJrsUe zl?J~g2s-r=LBym}5CZ6?i`&o(YXRvnKFE!m$w-}p4yCSMS^{0bgSdo|aTzzh0b?8) zi@EWiFn&UQmlMk)fL?-2p}WhgU<{-#tc&ihB*%eILOY!9uHwe`U`!?BYI4kil;|eI zjt*f-9Qo}hMLU4Hu~Fo_9}mg~?PzZN2L(khDsy22xG=pUL}@m{vNRI*k(>v?LLSe7 zk0=L%g&92kAMx~iAn76QmZ$Jr7?t1XJQ#Vfr=?((;FQKJEX$){zw!l3`J?{ol9W82 z)~}^F%p|^yy8A9j3>I!FCBs=Kz!G?^K*_391U_-{oV4^e% z1RKI1_7WvVAlQ(R>JoQJupuMueBdU64H+*eCJr0YOoBjaLaJdQ6u%Ho9C;eLr{GRl zV%iTSQdnqw2`UZi0>Ori#4I>XffH=VcuX-7Y{>WlOkdJH4jaYoVtzm@IK17@S%TjliQXKNNdNW3T;v`*SZ% z{33OK=u?^h@y0hJ9R=dry*KYUN;A84I4g11;;hGc5GS=xl9@pl98_6Idk8V6gK8w1 zl~Ix!2ARL43l3_Kq}?o=sgojYDc!{JQ!n8w>G(Bn&{bmv3AsnYaZsAChHp^#lrfY9 zQppYSm$snsUAxqG5@dtm83e%~n1%w}Ac%$n+#q;{8*cxI^Dxd2a8fUQ8D|&*8G@7Y zVab-i-h5z1?Mb$x{vQ5$BS?mdgQ_)IQH>1eHd2L$mRf-9 zkv9xjQ6oX1)D-1A6i4z;gNrPZDmqzFyO6DD*dZ&b^0LRDDhP#`5QJP+G5p_%LFk`` z5L^Y4Lh^t4PT+qNF+th+OR>c>@|9b5$FgC5I7+Apj5t zf*O&5_ki+{7etC{3i$iw&jThuqJX)h5Zm_GMXJBCCb6`Yjyer=^jC)CXjB zi>%sYb+oK*ljLg4WOab7(gG@+Xup@$&!HM%p&W~3vsJb`NoK^M0Vf?F-TOvR)6N=72Trwg~fa!$?vsz+@YnVD{W-ASK6|<*W10|??zssxl$JGQk384 z|CzV@eQRWrApQpbweRW&;`p`i>yOIFFiVF$aP`tf>#&)8T}Jxc^pWyQ``3G4zrn8% zs0@^m6WVKzRN1Co_M@0}u%{En&5vLDzP{|7De@FERHvUF@8ddFF7dONJ9p~TS=0P1 zWUZ2v>&W9S)UrG8`|t!|z;X5azKR@+?EZ*iA)BGdtw^%y2ZjE(lyX7383~gbuE-&^ zA-a!#!~4E3+0#jfqDrP;aUH@v_s8{`(F+T+{uRKxnn2~`-%n7|I2;fvKd36Ea(Dz! z{!iA!^y_mYMvfYlid#7BfmGckh|e-51a@^j)ZmVjE@sII)x)3SMjU)ba_1&LI25x| z59z6$j$c|2@1TOgLGq|9X72}Ug)Dw0H^MH<>0C&jafI@@jHJKL_2;+|)|HZ{S+d{G zbw4NXr@0Z2$nuC+Lq~dvr21X2sEXcp0-6XNSGSWC#D|VNIm27;mCSzE>&p8vZp69@ z$tTS|>4>D&hbxck%KI^H1U@#$kDD-%)8TkfQtO}hu3leP-j8u3f(d|w!zp)k`=5}^ ze%I^D`!R0Bj$M*ZrF$9T_LC%OuaYNm6gZaw_pdIG`(=48vcRFgP~NhFyLka$EpLXL zzGOLCXX|8*Px3> z;1$eV6Ky>dfaQ^a0;^6bsXqvA!*(Vl;9dV-`w(u;1^BB03!xs2gU`T{NJwO7r|6wC zzW@thO6d0J1RFa$P}mmzRuT*SLX1gEn8?nKOx+&+e%iKZ#6JT5(=gADxL{033xryu zBGv(m$QPY6k*yKOU`BTqaUm$4-YJQ=po>det#uxHUCWl=1HMHcFcsEmtryvbwLKIc zH&*Qap=H&VRlUBr=kjG*L5Iw!v{o%x6d~YFfH_e#QyjP{i5)^qpZWcUY~({0^1}wc zL`%KQFQ|C}PvXTm&3@-P=$$w#aaQ51#Yt|8?V!0J= zHyPM+OxmTm1cD!;X8FA@XB|xl>itEX$nvQidSA{ynqchxMIy}q8HVsxEPoZa7#Ip8 zDExmwKE**lj)hSi8aXQ>0<4H|9uF!XD(Cv~xG#j?a{~7%?)VnkpSr|&a6x+Cqz?$E z=k^H7lTI)zu2)7EZvG4EuCVv}Y^u8g*e9G-QS*?uTx}@VCZ#+hE-iZ*><|HEtU_6f zxCeI11`YfR)t6nuk#E7m*zM}oQ|Ic_g9XKX#Ql)!z4hWil*L|GbkAplvIl;FHnIff z=fz$U_k5pqbgB>)HW%Bar-tr`E()#OMf&H2CwI*iVpeQJ-QSnp2kmD2u0eu+ z`;^zj>M37t+==#4eYX(!_C7HZNEcQ;MG&j^iBUb1(Z2SIy?X|hvg!nZolOZX+g0!C z-P46SUoS@YBxu<3=X$gJ7{o6c`4fqg;#%*D>IsLwUYy;d7gW{tuE-wDv#LfToG!GF zUL_lPl(ya4hvmPDJU@mrWdpV8sO_IoJ@ISTP8}PmSF^CsP$poG+@u#GgA)3&QYy^22VL7e;F{PWqiT|M=+5c3p@}F%t`D@nhUZzXkB6FI z7T>E$T7Qs2L2lZ(V>?@J>B(6FSnW26r_TKkoHaq(n z+EWV3_X2n+(Xg)vqh+saPR~HFR|0WT|2BV&b$wS5`jXIXyU-tU-b;WGyL~UpV6Ql* z$Bc6B5#!P_rEo@5e}?c%C~lQ1X9>j%Dy?3V{h_%DY0jBU*JxqaE$N;zC}h<-ce@4p%zh2bCO z1|8~MlJ(FgQU663`n+)Aq3ABSi4qWA<+jo|OBHhnOXOx43#Q$)|p+-gR4#f7?X;d^=ZQe|kMzIP(35iD=t7Xye&v z>se^?w!N2@9aj2*8uCy3XoIo&I~H5ylyfo6Zh~-#}(P zGy!ctVMh!P+4ZBrMpTD`{#mb^VJ)i$jv2!a_AwbwGhO&z^ z))0S*)Sv91MB&KOkKeHOBA7kApQ^~%EA>&VipB{#>(M`I-?M0u`3+9M>tq+|+IZeB?edbpvrH zEgx0-@UEkqABxtOZrhbBvWo?%XIsUZnP@wKXh$PE#TZ_$o!~wxea=AiIr~sQy2QXi zgKUGg&qcdS!FaR}@of#$Zx1lD855$|@}dBiFXcI_o?No`Akw?tj6TRT(fWMYG~4s0 zI&(-C!b`Z3opoW%qWJ0qtS<)iW7X8}T^&zKJH<8k;Yze^>qUyMk}o46rzjl#0m(pL zptSv7a+=94)p6>l`@^l?+up(ljj)Z_jyVT!Z>e;Jxc4-<`C)!y>6f8#AM0sW^;&tS}2`QppD+vmsLM0Mtt#H_vQSa zc?JpPS zMx6OLsXfxZO8+rE0CSrE5ZHkfltCrb5s9ptVLlYV64EAMULo+gjeZ}twLj{{yru|q z8vW(Vf1*AW?J?~84ZiW;UoOoR`20!*8~|i{AUguG0Usy{5G2`n49chZ3bx5U>co77 z@|5N(WbZ^cZp>9W(N^TJFo*Poh5m*4bFW$!{(A1!DGc1dh)T04NDtBc7V01tjSDrnlAv%&*d3UvEZ+|4NL5Xb0))=d4?s-_;r=xE35I8*|;Rn zaHh)eWxEy*zG~N=$uj^##5kwvvrfZlixIxM+qDSvg45uIJ(Z7rH9O{DcE-UUBQBk{ z8c$dZU+~C(jesl$z>m(gYd^^|o(ALy;aZHJxe>8W!H=5MnBmDD$3Cqxe(E7c(kW&F zZR%XH;gpr4aSCzBLvjq~+5X0i*6i^faonq7%>Gi4r^X&6&G;SJV;dTyyP7k)MC&ov z*tYD9TIBF`nNZ*G{5;=nIL(Eh={B6O`e;@$I}%xM_lImi3zZq+ldPKmDYgIhrPi^h zhssN+bZ#|QtOEPYq+63xkq*3Cu5Jz3YGAj48RuiPf%SG8d^bi&wZn;ooa3xFaL{7C z95fDkv*=3n6(q`8u{Kw?)?KlpsvAilj-8uxA;*mDGQ1K|S@w>H5{G&*zK@y1x-?Feb-Ciq(WRaCpRdLp=`TXgG+ zTx;~Y^;RDmuOJ>^xWkS(iu?%*=x}NL$F}$nt+Ags#DTLZB^ebf z+(7K<*469mvF9AIz`Y&E-Lm*5Tl_n9;L3%-7vk`_4XnC&=cq_sNvm$1yJ9VHa>W%Z z*6BzCu3V9XnbY0ND%S&kr`N4Swp=fUyFu=Y1?2AIMlKvYJJ9RA3ABrj2+xbc^arTG z5?BUHwyQ>#5#z7P7K?KE&>7#97}rr3au`6p(zw%Jk4_K+YYDoyuBu{1B$cv+w?qD{ z@RjV(!2SfcuB09mKP^%Gexh)T#I;Cxk%*!%wn(T!*Q#RO${#5d4h=k>7<(L*%5xoP zU}XuaVr0c?9(k%ok;LyqT9()AR)W)qN>y92svQyQW`5v5J4D4hm$z0dw*&KsyM6@< zU#J-Mx{?%B?Dy@lCleDoQ4>l--uJ}4g(8N=nsB%-uEQR3!4Z2wFn`_{cN#TNuIg7~ z4J+4Ee!5E5=~kk)SafUF5!O%vGCD)viKkHLUg zDUJo15v0OB;@AU?8RgNVJsQkMX|i!ZntQm$vz&355dldlvoEiX;S3|?r^WcS-EaXp zgGmmiG~T&fL*r~r*e`El$<7b0^j_KJ3GAqL&qdM+l`Nn(-87xpj-N_4RnA4CfG1>{ zQpQvkv3EG%5$n4wyxdxA4sI!TLfRVRk_SHD$mf6QbFFI!O7iR;2FHqEpf z^KG`(%-Bs((~?>P%=0&^AL_fO9G6ea>#8EcrarJEsQlzqQw@NRUhZRbZ1S|wep7## z8__z!VJxk5TCEv3D!fKvApSHqVFAV&JdwrfXQ(~Sh`y|!J?|+K{_U|oI9gSnlsr)L zX=l~c%9(+OZE4k2r;-*kyl2Xpne1Y1uRSLf!g)W2t*{^?~g zP&LqVD2E60dX{ZKXy#VaK~9O>D9nCjZt)v_=flcNSMyCWi&w{}z_`>+=J* z=7j0n7d>E3$+qrHx^;A9($;KMmFXUUBZGhAIkmfwkZaLcg(N9W<4sYoj}*eOHf(0* zn9{E7-(}^puz)X9vJGR}pAHV*T3)uNZ}fi!V=_<`jE4s+3Pxf~B1icF#-#7ROUp?- zDVgOv_SWn~j}->2dVw){qsZLQ(BVwHSyVd($pFTrR?p-=df1js{9)zs-ipU}S70!c z(=C~WPUeCJt5rm%9D%=0WQWeg2cwx#MfNy6RTUvl&JHD$z4g4-s%$1>?$D-_?S{MF zE15HX)7Iv%&VTXUBY&8ick%W+; z^+<;~FCtxJ<{%^`3o^m2jExGNTD2pf|BZ*$*{TRz)QbMgde>O%B5rDon06xKW}%nE zqqo+5*XzZ(jsJZ3#N5=&y%OzKhe}(MZnq|CwGj*L))JkzW~1F28mO)LgWWngNE>m; zZhg$4jp(skj~KNzLmk$~!nHNy9oDnGwGpcv)~$WC5zjiTjnUeg28T5?UR(3E!#X)Z z8_}=88roMIkzQb3)L&b3Pk~h!psl&Dz&d&mTozbA7_6=Nyui9VqIkY_?~U4;q(bYF zncAAMh1R`yX(PTVv^om35qB@NPF}06xwO!_yi8j&s>nL|0d2(BMOI;__87w!*T6b+ z;2wM6v(9a0$$ivLvC=Jf6NR%%25@SHWKfYM-_iQRm_loh7mvOIQTs5&Rh)Y76ZHRsUBsn{>y ztvB4aCEGtH49X~3<9&&7UXf$PuWS(WmMvMbZ0WF~ zTPIJ?&$xvyD;F(XS~%ZKvdA(u-7B7hM9EERI@i+e5ozArh!x!&kp>OjN+0=e$Rq#y zMA?IvE|r|(+69Z3IabYIwz^<(A*JwNromoAb*0{gHZ1%s-PQXpDphkYKbE{I#8_-- zT(orMucW-LDw*e4I)Bl8Fqc*>Sh`}3WAW-j2fxbina*3bbQN|$@NW#!`?G~b`1%ku zcw3emmo8kfbm>Yu9S(f+XxTi+szpl|(*8+KV5ILL;oV*?W6ip`YtTF-M}>3o0VXch zAKwtJX1mPnh+3%XuNS}#EW4xDtbW;I)30%qnYx?QiCvomvO0sp%R31ym~K1hDvs1> zc4P));1F{6&<-z4K=dr7k7$_w9NrnV;p)2@*6@n^&d7n+lE%{w<*5jX&>jJC~om^+&% zz{`#JKzmgKn6_4xCJ#(oXRod5fvhi$phF7S7XblAGyX+VV6`m8iE&RN(pmyILslE& zNj{T`?|GQib6QyM&0z^u_eO$B$Y>)K3JbQP7vj)~O$F^N!Uy%1! zQwtCly$^@|z+R*1j+4&(x&E7+7Rpv9-|+G z_`mUjI+u--;*bA}nWsNNX<5fSHov=6h>S%v&dp9rW>3Jg9F3}QH@y%+(a->oO5TkUK|DWW|jjRhGa{W1-otac+Fpb5LukpE_x z`_bDQsD)^}2o$qbR_Jp)!fKi)SuT_;w>+CX^^@dTP5lbW`Y+8Iu>O+)EoDR6R72B) zUvp|-11nnH}1(+(9k}2cNXZFLlKgtAagjBnJntv=|RI8Zrc}9nYS~ z%;+(-y1(0XPf*aItfRQ~jXREO?mD^ot}}0dJA4KohH%79Q9^G&-k4e6Jf>Bx#>+zB zpJ7}xW<&FsaxG$xh-r5Zzx2uQoOyS$#d@ow zxm)+NV2Igbv4j+NSjx*5Ih(hfHj{%J0D{P32>QHVgg+5;@?D!I12q7*AN zz)pfPOPODm*?!~LPPJ03)tZv}2mOk*y{#;>34*|?S&PYGp0E_ILeS|59oC87zRgANV+ zuR~kKcu#YQ)0E=0BO&VZ)(1z4W)`FRrdAz*`sN(#R3r5Da8BUqUMFpak4wi{Rn&w{ z2Z(Kbhb_Lt6Sq++^vP8wxIBqC3v55Nb~yOXiZ#VJ>@o5{Tu9S~mN&-;7G5-;G&qXy zf8SIgRn!9_&rBe3<7eCAXSIx1*|QyC-#Wtj%?Nv3D|j9R3D@|X**Lf$jBtLRoG_d$ zoj9d{FuR!@rI`)6lTBdeR94KX()GdDgF5n#SKN0-x9P&0TU5@VhcW^l0w2(`38|na zm&1FZ_FQ|}%MCAl@TWsnTYr0K$9vNP-mMFbdHl}DZ~7=^PTcK}ZI8OW9p6R`^-gmIPG8RgA8vYa|vgsfd2jPGGce?N@~ z&WdkpjKgB}0*i(_bH(7(9r$F(4sl%Dx*b@U-GGJeTzr&8x4u}UrAu=~R9h(h!*#-9 zTxv0X+HL60GmJ2`&{{M;`qJcxUtrlvU+=*B)d4Z{RV-@ZKe+CQHFn*GBHa!2MH$@< zPWn1au^oRU=+^XTAa<>@Vy?boc_d$mt}Pux|DAOjzM&7Ihy|^*_Aaf!V;z`2+0s&q z&)8_+uc9Tg(fC6O*MrR&_&^A)#WnvIGN)^oPd#tuf38`mo7;=Lr$vRJz!ms>3_c|@ zySO$RD_HcmWIL+9!_3(8sJ!9oS)3d(3hzd)x1B+9a=KGZvL#$W0jc=?JwAhgAP({ zzJEtH>vKdb$&EWmw9C$<!2nXjqf(T>F@@0=RVUiD;!?J&SIoxw`L|7yD+u+jsoAzTxHBvHkU~%&8`}5i_=b zT5K$__P8`Un?5<8nTCmTqSsSu!6RG0(dHfzwI&V0M}U zcWsQRa_uK~kN=*ov^SC%RnHwg_2Ld*>l<4XSm-PKoL=Nz#AIoa8pz= zR5VSE87_*7ifA4wFT+Ivui&My?1W~89xE*KSXm8-M(QavJBNx>XdJV&LXLH`)8+qt z*6cllSm*Tq-v9r7KmYxiJ?r+YXFcm#_vcw_ZL!fU<>**kPIPVV5Je_Ox7iMHO?ki_ zH%MJehmW4F2Ub~dTj4_smg`J)aa`Gg@-yM-nxqi*3jKTgYPLLVXuniYdD2@O9Z*>j z?D>cEws2e$`OtzQovDT6leMm&>O-zW^thfYe+cP@eFeGYdfUZG5zHjh{8-4db z?C!_UcdEzDn`^iE@V483JKZiM3BSdvj~Tl9Ok8HX>rn%4uKb~7rqVyoXwfRmM`c#d zAqF>F{{}Ec5)eakn<$0?KuV zefemy#z~M1tv;lfGNu=@2~UqyXx}VYsKZ^=qChugc26il37XBgu~)Ia#@9}N$G%Sy zr!rnk7iuMaOLi%*F-MSadzfatWwxT=w52ml7;iCeGZn4kFKn2P8%LkMk|x~-y1M)i zoG{FvFqnH|VBAtvxCYo$`;?`o`E^*GkmHnOD7b}-L=*Pqrg69uS^X6k)#Roe<^EU0 z+-EFq$s^StYYQU{ZpIP59R-;uFS*UHcW?A`IpTh{(Rp*DdUB(}MeqBkBf*;kBsN!7 zy1KOzZ?68Es5@;b2ze*Xvcx}ecoFiMyrD6GkLI>GIB5!9L(rM!#Q+ccS+4#Aiiwj6 znqlB%RJRaDZO>S3!d)B@eAlno3nz@7sx{lh}ZJ6SmX9gN&5$%fm z#Usgr8^|i0H}G3=P1$rGwCb4Q=S19xdMo*8`lEU+?iW0gJaa4O?TQOf4LO<7aiV(C zB)TEax&H`->nLS6hnrn3KEZSytxw>5kWmxO60R6;dE~@XXsF^5d-LoJyFhtqEH9zF z%*3CgDc7SZ&rNUCnd${?w83IE#)uxsPfd7hn#H-zG{Dv3{4P0hk(7m)=pwsqp$ z0dUoYx1`Z^>d|WEU_qBnET};WYSqv!tcwa(==A>th1PvdX%-8HCAQywjW-g&?2^kvxo5Q+zOXRh2YuDn*pwLMp(FXTHW)`9bA3U3PL`3gv8$Pl zUDNLzyS86wP&n^026!j+_YQU1RG(O2py?cqUD&HC-I1qMPlo5h71^ui7cmJ0#0XfZ zKfHA1E1Nn~yUe37q!=T58iO#TMC(dAx8_I#RJZ4Gozj4G?E}=5)X*aKErbY<<;yWZ zdDT|FkucwU==&%NTn*76Lj2XUFF*GEDLrf>A6grbO5dXHgK zJ!t@(l85|8*#^MsU1f$`ONyc=OSEbc&WT9%EW_PO{GAx6wKb%{*doE0@MOD|4E0{{daN zJ1ZkvVY?Q#DX8J(3rNGm+|35)zmpwpG$VL`VwS!X)myt+NW%@yoe|~eB_0dkQ3k_r zW1*`Rwc6tHMJng4K!caN^&-tYqWFxy1BT{JvV+b&nNySvMs&RqL+ZVG+$TNJb`|tO zx(a%p|Lem#0rYy!6lJ}|2p^rG6q5|Ag%UOZg}c!$lN*$d@5oq zM${mW%|niR@zGjbK-{UI8}3)#*egmOj#y^$=tTE3?r78Nl)L@-qX|X)^1WiF;ut!Y zc{Qb*=zc^sIv3pgY^IC1tCIHNTEys|On`iJ`D=DuH6E7H+r)szwMhj!KZ0jmEwq|%#(2OYRps&GYJlCPP7=ywkC`Id>1K5u7sYL!!8c3F)V!MtiC}el> zFLmvwI2WIqVK8&9Sz<^(&Dkyd`JlbkD6%Bw!It>UxQv?6!E&oMu<60cffcmzz)IQ0 zM<&h(ZLa1p)3F!LhU!tu=d2!;HlZHvD!tG3!WNznZQF{9)-=(A8?p^& z^D3|YSxzBaf)Q*Le*mEId;Fnh>&9=Z#v09gJL+1ME+>LMAK*=&52!jnKf-vd86Q{~ zUtZ1eIN*;zHQ*UvrsNO4XI?$@Tq^)!+8|Ln%tj02R`e+CDtc-hJw6u}=+p>6SWH0WqwWm7` zzjp4uq*C{SC}R-s-NE0N`fGYYBr}L@cS86$Gl)s9Ww;B8-F}=}=oYEy+`@;?X{rJ@ zY0ieb?o(l~$E?SFH<6XW%k?mC;r4(G}C8t(KhV>gH%;X;1Xl;^<8;H*|8& z7mcHL8Fk*>M&8}K9-q`wIysk3i{x6Ky!KStz0Ml!#H(=aw76M0_j5@Tu^qHEJX}aH zLCkIYFHgwy#P@drV=NWMrni>{cZTn�GAB5ul{1{2oBItK#d*AIkJxrPr)ZzY^}= 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

    budCj#J;AR%+wb}wzw6ihuJZ@9 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%0AZ)0)H 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%0Aj918XbAJtXMfZz?4ZQyBK<8TP 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 b0AW7<dp&dT`8ONGJjVv+Vnk!lB98wDG!qIY diff --git a/Stinger/Classes/libffi/ffi.h b/Stinger/libffi/darwin_common/include/ffi.h old mode 100755 new mode 100644 similarity index 88% rename from Stinger/Classes/libffi/ffi.h rename to Stinger/libffi/darwin_common/include/ffi.h index b051596..fca61d9 --- a/Stinger/Classes/libffi/ffi.h +++ b/Stinger/libffi/darwin_common/include/ffi.h @@ -12,7 +12,7 @@ #endif #ifdef __arm__ -#include "ffi_arm.h" +#include "ffi_armv7.h" #endif diff --git a/Stinger/libffi/darwin_common/include/ffi_cfi.h b/Stinger/libffi/darwin_common/include/ffi_cfi.h new file mode 100644 index 0000000..244ce57 --- /dev/null +++ b/Stinger/libffi/darwin_common/include/ffi_cfi.h @@ -0,0 +1,55 @@ +/* ----------------------------------------------------------------------- + ffi_cfi.h - Copyright (c) 2014 Red Hat, Inc. + + Conditionally assemble cfi directives. Only necessary for building libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_CFI_H +#define FFI_CFI_H + +#ifdef HAVE_AS_CFI_PSEUDO_OP + +# define cfi_startproc .cfi_startproc +# define cfi_endproc .cfi_endproc +# define cfi_def_cfa(reg, off) .cfi_def_cfa reg, off +# define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg +# define cfi_def_cfa_offset(off) .cfi_def_cfa_offset off +# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off +# define cfi_offset(reg, off) .cfi_offset reg, off +# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off +# define cfi_register(r1, r2) .cfi_register r1, r2 +# define cfi_return_column(reg) .cfi_return_column reg +# define cfi_restore(reg) .cfi_restore reg +# define cfi_same_value(reg) .cfi_same_value reg +# define cfi_undefined(reg) .cfi_undefined reg +# define cfi_remember_state .cfi_remember_state +# define cfi_restore_state .cfi_restore_state +# define cfi_window_save .cfi_window_save +# define cfi_personality(enc, exp) .cfi_personality enc, exp +# define cfi_lsda(enc, exp) .cfi_lsda enc, exp +# define cfi_escape(...) .cfi_escape __VA_ARGS__ + +#else + +# define cfi_startproc +# define cfi_endproc +# define cfi_def_cfa(reg, off) +# define cfi_def_cfa_register(reg) +# define cfi_def_cfa_offset(off) +# define cfi_adjust_cfa_offset(off) +# define cfi_offset(reg, off) +# define cfi_rel_offset(reg, off) +# define cfi_register(r1, r2) +# define cfi_return_column(reg) +# define cfi_restore(reg) +# define cfi_same_value(reg) +# define cfi_undefined(reg) +# define cfi_remember_state +# define cfi_restore_state +# define cfi_window_save +# define cfi_personality(enc, exp) +# define cfi_lsda(enc, exp) +# define cfi_escape(...) + +#endif /* HAVE_AS_CFI_PSEUDO_OP */ +#endif /* FFI_CFI_H */ diff --git a/Stinger/libffi/darwin_common/include/ffi_common.h b/Stinger/libffi/darwin_common/include/ffi_common.h new file mode 100644 index 0000000..42939d7 --- /dev/null +++ b/Stinger/libffi/darwin_common/include/ffi_common.h @@ -0,0 +1,153 @@ +/* ----------------------------------------------------------------------- + ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green + Copyright (C) 2007 Free Software Foundation, Inc + Copyright (c) 1996 Red Hat, Inc. + + Common internal definitions and macros. Only necessary for building + libffi. + ----------------------------------------------------------------------- */ + +#ifndef FFI_COMMON_H +#define FFI_COMMON_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "fficonfig.h" + +/* Do not move this. Some versions of AIX are very picky about where + this is positioned. */ +#ifdef __GNUC__ +# if HAVE_ALLOCA_H +# include <alloca.h> +# else + /* mingw64 defines this already in malloc.h. */ +# ifndef alloca +# define alloca __builtin_alloca +# endif +# endif +# define MAYBE_UNUSED __attribute__((__unused__)) +#else +# define MAYBE_UNUSED +# if HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef _AIX +# pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +# ifdef _MSC_VER +# define alloca _alloca +# else +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +/* Check for the existence of memcpy. */ +#if STDC_HEADERS +# include <string.h> +#else +# ifndef HAVE_MEMCPY +# define memcpy(d, s, n) bcopy ((s), (d), (n)) +# endif +#endif + +#if defined(FFI_DEBUG) +#include <stdio.h> +#endif + +#ifdef FFI_DEBUG +void ffi_assert(char *expr, char *file, int line); +void ffi_stop_here(void); +void ffi_type_test(ffi_type *a, char *file, int line); + +#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) +#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) +#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) +#else +#define FFI_ASSERT(x) +#define FFI_ASSERT_AT(x, f, l) +#define FFI_ASSERT_VALID_TYPE(x) +#endif + +/* v cast to size_t and aligned up to a multiple of a */ +#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) +/* v cast to size_t and aligned down to a multiple of a */ +#define FFI_ALIGN_DOWN(v, a) (((size_t) (v)) & -a) + +/* Perform machine dependent cif processing */ +ffi_status ffi_prep_cif_machdep(ffi_cif *cif); +ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, + unsigned int nfixedargs, unsigned int ntotalargs); + + +#if HAVE_LONG_DOUBLE_VARIANT +/* Used to adjust size/alignment of ffi types. */ +void ffi_prep_types (ffi_abi abi); +#endif + +/* Used internally, but overridden by some architectures */ +ffi_status ffi_prep_cif_core(ffi_cif *cif, + ffi_abi abi, + unsigned int isvariadic, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes); + +/* Translate a data pointer to a code pointer. Needed for closures on + some targets. */ +void *ffi_data_to_code_pointer (void *data) FFI_HIDDEN; + +/* Extended cif, used in callback from assembly routine */ +typedef struct +{ + ffi_cif *cif; + void *rvalue; + void **avalue; +} extended_cif; + +/* Terse sized type definitions. */ +#if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) +typedef unsigned char UINT8; +typedef signed char SINT8; +typedef unsigned short UINT16; +typedef signed short SINT16; +typedef unsigned int UINT32; +typedef signed int SINT32; +# ifdef _MSC_VER +typedef unsigned __int64 UINT64; +typedef signed __int64 SINT64; +# else +# include <inttypes.h> +typedef uint64_t UINT64; +typedef int64_t SINT64; +# endif +#else +typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); +typedef signed int SINT8 __attribute__((__mode__(__QI__))); +typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); +typedef signed int SINT16 __attribute__((__mode__(__HI__))); +typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); +typedef signed int SINT32 __attribute__((__mode__(__SI__))); +typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); +typedef signed int SINT64 __attribute__((__mode__(__DI__))); +#endif + +typedef float FLOAT32; + +#ifndef __GNUC__ +#define __builtin_expect(x, expected_value) (x) +#endif +#define LIKELY(x) __builtin_expect(!!(x),1) +#define UNLIKELY(x) __builtin_expect((x)!=0,0) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Stinger/libffi/darwin_common/include/fficonfig.h b/Stinger/libffi/darwin_common/include/fficonfig.h new file mode 100644 index 0000000..575970b --- /dev/null +++ b/Stinger/libffi/darwin_common/include/fficonfig.h @@ -0,0 +1,24 @@ +#ifdef __arm64__ + +#include "fficonfig_arm64.h" + + +#endif +#ifdef __i386__ + +#include "fficonfig_i386.h" + + +#endif +#ifdef __arm__ + +#include "fficonfig_armv7.h" + + +#endif +#ifdef __x86_64__ + +#include "fficonfig_x86_64.h" + + +#endif diff --git a/Stinger/Classes/libffi/ffitarget.h b/Stinger/libffi/darwin_common/include/ffitarget.h old mode 100755 new mode 100644 similarity index 86% rename from Stinger/Classes/libffi/ffitarget.h rename to Stinger/libffi/darwin_common/include/ffitarget.h index ec9d1e3..6da8477 --- a/Stinger/Classes/libffi/ffitarget.h +++ b/Stinger/libffi/darwin_common/include/ffitarget.h @@ -12,7 +12,7 @@ #endif #ifdef __arm__ -#include "ffitarget_arm.h" +#include "ffitarget_armv7.h" #endif diff --git a/Stinger/libffi/darwin_common/src/closures.c b/Stinger/libffi/darwin_common/src/closures.c new file mode 100644 index 0000000..c377a24 --- /dev/null +++ b/Stinger/libffi/darwin_common/src/closures.c @@ -0,0 +1,1004 @@ +/* ----------------------------------------------------------------------- + closures.c - Copyright (c) 2019 Anthony Green + Copyright (c) 2007, 2009, 2010 Red Hat, Inc. + Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + Code to allocate and deallocate memory for closures. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined __linux__ && !defined _GNU_SOURCE +#define _GNU_SOURCE 1 +#endif + +#include "fficonfig.h" +#include "ffi.h" +#include "ffi_common.h" + +#ifdef __NetBSD__ +#include <sys/param.h> +#endif + +#if __NetBSD_Version__ - 0 >= 799007200 +/* NetBSD with PROT_MPROTECT */ +#include <sys/mman.h> + +#include <stddef.h> +#include <unistd.h> + +static const size_t overhead = + (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ? + sizeof(max_align_t) + : sizeof(void *) + sizeof(size_t); + +#define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d))) + +void * +ffi_closure_alloc (size_t size, void **code) +{ + static size_t page_size; + size_t rounded_size; + void *codeseg, *dataseg; + int prot; + + /* Expect that PAX mprotect is active and a separate code mapping is necessary. */ + if (!code) + return NULL; + + /* Obtain system page size. */ + if (!page_size) + page_size = sysconf(_SC_PAGESIZE); + + /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */ + rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1); + + /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */ + prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC); + dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0); + if (dataseg == MAP_FAILED) + return NULL; + + /* Create secondary mapping and switch it to RX. */ + codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP); + if (codeseg == MAP_FAILED) { + munmap(dataseg, rounded_size); + return NULL; + } + if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) { + munmap(codeseg, rounded_size); + munmap(dataseg, rounded_size); + return NULL; + } + + /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */ + memcpy(dataseg, &rounded_size, sizeof(rounded_size)); + memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *)); + *code = ADD_TO_POINTER(codeseg, overhead); + return ADD_TO_POINTER(dataseg, overhead); +} + +void +ffi_closure_free (void *ptr) +{ + void *codeseg, *dataseg; + size_t rounded_size; + + dataseg = ADD_TO_POINTER(ptr, -overhead); + memcpy(&rounded_size, dataseg, sizeof(rounded_size)); + memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *)); + munmap(dataseg, rounded_size); + munmap(codeseg, rounded_size); +} +#else /* !NetBSD with PROT_MPROTECT */ + +#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE +# if __linux__ && !defined(__ANDROID__) +/* This macro indicates it may be forbidden to map anonymous memory + with both write and execute permission. Code compiled when this + option is defined will attempt to map such pages once, but if it + fails, it falls back to creating a temporary file in a writable and + executable filesystem and mapping pages from it into separate + locations in the virtual memory space, one location writable and + another executable. */ +# define FFI_MMAP_EXEC_WRIT 1 +# define HAVE_MNTENT 1 +# endif +# if defined(_WIN32) || defined(__OS2__) +/* Windows systems may have Data Execution Protection (DEP) enabled, + which requires the use of VirtualMalloc/VirtualFree to alloc/free + executable memory. */ +# define FFI_MMAP_EXEC_WRIT 1 +# endif +#endif + +#if FFI_MMAP_EXEC_WRIT && !defined FFI_MMAP_EXEC_SELINUX +# if defined(__linux__) && !defined(__ANDROID__) +/* When defined to 1 check for SELinux and if SELinux is active, + don't attempt PROT_EXEC|PROT_WRITE mapping at all, as that + might cause audit messages. */ +# define FFI_MMAP_EXEC_SELINUX 1 +# endif +#endif + +#if FFI_CLOSURES + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ + +#include <mach/mach.h> +#include <pthread.h> +#ifdef HAVE_PTRAUTH +#include <ptrauth.h> +#endif +#include <stdio.h> +#include <stdlib.h> + +extern void *ffi_closure_trampoline_table_page; + +typedef struct ffi_trampoline_table ffi_trampoline_table; +typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; + +struct ffi_trampoline_table +{ + /* contiguous writable and executable pages */ + vm_address_t config_page; + vm_address_t trampoline_page; + + /* free list tracking */ + uint16_t free_count; + ffi_trampoline_table_entry *free_list; + ffi_trampoline_table_entry *free_list_pool; + + ffi_trampoline_table *prev; + ffi_trampoline_table *next; +}; + +struct ffi_trampoline_table_entry +{ + void *(*trampoline) (void); + ffi_trampoline_table_entry *next; +}; + +/* Total number of trampolines that fit in one trampoline table */ +#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE) + +static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; +static ffi_trampoline_table *ffi_trampoline_tables = NULL; + +static ffi_trampoline_table * +ffi_trampoline_table_alloc (void) +{ + ffi_trampoline_table *table; + vm_address_t config_page; + vm_address_t trampoline_page; + vm_address_t trampoline_page_template; + vm_prot_t cur_prot; + vm_prot_t max_prot; + kern_return_t kt; + uint16_t i; + + /* Allocate two pages -- a config page and a placeholder page */ + config_page = 0x0; + kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2, + VM_FLAGS_ANYWHERE); + if (kt != KERN_SUCCESS) + return NULL; + + /* Remap the trampoline table on top of the placeholder page */ + trampoline_page = config_page + PAGE_MAX_SIZE; + trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page; +#ifdef __arm__ + /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */ + trampoline_page_template &= ~1UL; +#endif + kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, + VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template, + FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); + if (kt != KERN_SUCCESS) + { + vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2); + return NULL; + } + + /* We have valid trampoline and config pages */ + table = calloc (1, sizeof (ffi_trampoline_table)); + table->free_count = FFI_TRAMPOLINE_COUNT; + table->config_page = config_page; + table->trampoline_page = trampoline_page; + + /* Create and initialize the free list */ + table->free_list_pool = + calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry)); + + for (i = 0; i < table->free_count; i++) + { + ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; + entry->trampoline = + (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); + + if (i < table->free_count - 1) + entry->next = &table->free_list_pool[i + 1]; + } + + table->free_list = table->free_list_pool; + + return table; +} + +static void +ffi_trampoline_table_free (ffi_trampoline_table *table) +{ + /* Remove from the list */ + if (table->prev != NULL) + table->prev->next = table->next; + + if (table->next != NULL) + table->next->prev = table->prev; + + /* Deallocate pages */ + vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2); + + /* Deallocate free list */ + free (table->free_list_pool); + free (table); +} + +void * +ffi_closure_alloc (size_t size, void **code) +{ + /* Create the closure */ + ffi_closure *closure = malloc (size); + if (closure == NULL) + return NULL; + + pthread_mutex_lock (&ffi_trampoline_lock); + + /* Check for an active trampoline table with available entries. */ + ffi_trampoline_table *table = ffi_trampoline_tables; + if (table == NULL || table->free_list == NULL) + { + table = ffi_trampoline_table_alloc (); + if (table == NULL) + { + pthread_mutex_unlock (&ffi_trampoline_lock); + free (closure); + return NULL; + } + + /* Insert the new table at the top of the list */ + table->next = ffi_trampoline_tables; + if (table->next != NULL) + table->next->prev = table; + + ffi_trampoline_tables = table; + } + + /* Claim the free entry */ + ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list; + ffi_trampoline_tables->free_list = entry->next; + ffi_trampoline_tables->free_count--; + entry->next = NULL; + + pthread_mutex_unlock (&ffi_trampoline_lock); + + /* Initialize the return values */ + *code = entry->trampoline; +#ifdef HAVE_PTRAUTH + *code = ptrauth_sign_unauthenticated (*code, ptrauth_key_asia, 0); +#endif + closure->trampoline_table = table; + closure->trampoline_table_entry = entry; + + return closure; +} + +void +ffi_closure_free (void *ptr) +{ + ffi_closure *closure = ptr; + + pthread_mutex_lock (&ffi_trampoline_lock); + + /* Fetch the table and entry references */ + ffi_trampoline_table *table = closure->trampoline_table; + ffi_trampoline_table_entry *entry = closure->trampoline_table_entry; + + /* Return the entry to the free list */ + entry->next = table->free_list; + table->free_list = entry; + table->free_count++; + + /* If all trampolines within this table are free, and at least one other table exists, deallocate + * the table */ + if (table->free_count == FFI_TRAMPOLINE_COUNT + && ffi_trampoline_tables != table) + { + ffi_trampoline_table_free (table); + } + else if (ffi_trampoline_tables != table) + { + /* Otherwise, bump this table to the top of the list */ + table->prev = NULL; + table->next = ffi_trampoline_tables; + if (ffi_trampoline_tables != NULL) + ffi_trampoline_tables->prev = table; + + ffi_trampoline_tables = table; + } + + pthread_mutex_unlock (&ffi_trampoline_lock); + + /* Free the closure */ + free (closure); +} + +#endif + +// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations. + +#elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */ + +#define USE_LOCKS 1 +#define USE_DL_PREFIX 1 +#ifdef __GNUC__ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 1 +#endif +#endif + +/* We need to use mmap, not sbrk. */ +#define HAVE_MORECORE 0 + +/* We could, in theory, support mremap, but it wouldn't buy us anything. */ +#define HAVE_MREMAP 0 + +/* We have no use for this, so save some code and data. */ +#define NO_MALLINFO 1 + +/* We need all allocations to be in regular segments, otherwise we + lose track of the corresponding code address. */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T + +/* Don't allocate more than a page unless needed. */ +#define DEFAULT_GRANULARITY ((size_t)malloc_getpagesize) + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#ifndef _MSC_VER +#include <unistd.h> +#endif +#include <string.h> +#include <stdio.h> +#if !defined(_WIN32) +#ifdef HAVE_MNTENT +#include <mntent.h> +#endif /* HAVE_MNTENT */ +#include <sys/param.h> +#include <pthread.h> + +/* We don't want sys/mman.h to be included after we redefine mmap and + dlmunmap. */ +#include <sys/mman.h> +#define LACKS_SYS_MMAN_H 1 + +#if FFI_MMAP_EXEC_SELINUX +#include <sys/statfs.h> +#include <stdlib.h> + +static int selinux_enabled = -1; + +static int +selinux_enabled_check (void) +{ + struct statfs sfs; + FILE *f; + char *buf = NULL; + size_t len = 0; + + if (statfs ("/selinux", &sfs) >= 0 + && (unsigned int) sfs.f_type == 0xf97cff8cU) + return 1; + f = fopen ("/proc/mounts", "r"); + if (f == NULL) + return 0; + while (getline (&buf, &len, f) >= 0) + { + char *p = strchr (buf, ' '); + if (p == NULL) + break; + p = strchr (p + 1, ' '); + if (p == NULL) + break; + if (strncmp (p + 1, "selinuxfs ", 10) == 0) + { + free (buf); + fclose (f); + return 1; + } + } + free (buf); + fclose (f); + return 0; +} + +#define is_selinux_enabled() (selinux_enabled >= 0 ? selinux_enabled \ + : (selinux_enabled = selinux_enabled_check ())) + +#else + +#define is_selinux_enabled() 0 + +#endif /* !FFI_MMAP_EXEC_SELINUX */ + +/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ +#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX +#include <stdlib.h> + +static int emutramp_enabled = -1; + +static int +emutramp_enabled_check (void) +{ + char *buf = NULL; + size_t len = 0; + FILE *f; + int ret; + f = fopen ("/proc/self/status", "r"); + if (f == NULL) + return 0; + ret = 0; + + while (getline (&buf, &len, f) != -1) + if (!strncmp (buf, "PaX:", 4)) + { + char emutramp; + if (sscanf (buf, "%*s %*c%c", &emutramp) == 1) + ret = (emutramp == 'E'); + break; + } + free (buf); + fclose (f); + return ret; +} + +#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ + : (emutramp_enabled = emutramp_enabled_check ())) +#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +#elif defined (__CYGWIN__) || defined(__INTERIX) + +#include <sys/mman.h> + +/* Cygwin is Linux-like, but not quite that Linux-like. */ +#define is_selinux_enabled() 0 + +#endif /* !defined(X86_WIN32) && !defined(X86_WIN64) */ + +#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX +#define is_emutramp_enabled() 0 +#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Declare all functions defined in dlmalloc.c as static. */ +static void *dlmalloc(size_t); +static void dlfree(void*); +static void *dlcalloc(size_t, size_t) MAYBE_UNUSED; +static void *dlrealloc(void *, size_t) MAYBE_UNUSED; +static void *dlmemalign(size_t, size_t) MAYBE_UNUSED; +static void *dlvalloc(size_t) MAYBE_UNUSED; +static int dlmallopt(int, int) MAYBE_UNUSED; +static size_t dlmalloc_footprint(void) MAYBE_UNUSED; +static size_t dlmalloc_max_footprint(void) MAYBE_UNUSED; +static void** dlindependent_calloc(size_t, size_t, void**) MAYBE_UNUSED; +static void** dlindependent_comalloc(size_t, size_t*, void**) MAYBE_UNUSED; +static void *dlpvalloc(size_t) MAYBE_UNUSED; +static int dlmalloc_trim(size_t) MAYBE_UNUSED; +static size_t dlmalloc_usable_size(void*) MAYBE_UNUSED; +static void dlmalloc_stats(void) MAYBE_UNUSED; + +#if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) +/* Use these for mmap and munmap within dlmalloc.c. */ +static void *dlmmap(void *, size_t, int, int, int, off_t); +static int dlmunmap(void *, size_t); +#endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + +#define mmap dlmmap +#define munmap dlmunmap + +#include "dlmalloc.c" + +#undef mmap +#undef munmap + +#if !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) + +/* A mutex used to synchronize access to *exec* variables in this file. */ +static pthread_mutex_t open_temp_exec_file_mutex = PTHREAD_MUTEX_INITIALIZER; + +/* A file descriptor of a temporary file from which we'll map + executable pages. */ +static int execfd = -1; + +/* The amount of space already allocated from the temporary file. */ +static size_t execsize = 0; + +/* Open a temporary file name, and immediately unlink it. */ +static int +open_temp_exec_file_name (char *name, int flags) +{ + int fd; + +#ifdef HAVE_MKOSTEMP + fd = mkostemp (name, flags); +#else + fd = mkstemp (name); +#endif + + if (fd != -1) + unlink (name); + + return fd; +} + +/* Open a temporary file in the named directory. */ +static int +open_temp_exec_file_dir (const char *dir) +{ + static const char suffix[] = "/ffiXXXXXX"; + int lendir, flags; + char *tempname; +#ifdef O_TMPFILE + int fd; +#endif + +#ifdef O_CLOEXEC + flags = O_CLOEXEC; +#else + flags = 0; +#endif + +#ifdef O_TMPFILE + fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700); + /* If the running system does not support the O_TMPFILE flag then retry without it. */ + if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) { + return fd; + } else { + errno = 0; + } +#endif + + lendir = (int) strlen (dir); + tempname = __builtin_alloca (lendir + sizeof (suffix)); + + if (!tempname) + return -1; + + memcpy (tempname, dir, lendir); + memcpy (tempname + lendir, suffix, sizeof (suffix)); + + return open_temp_exec_file_name (tempname, flags); +} + +/* Open a temporary file in the directory in the named environment + variable. */ +static int +open_temp_exec_file_env (const char *envvar) +{ + const char *value = getenv (envvar); + + if (!value) + return -1; + + return open_temp_exec_file_dir (value); +} + +#ifdef HAVE_MNTENT +/* Open a temporary file in an executable and writable mount point + listed in the mounts file. Subsequent calls with the same mounts + keep searching for mount points in the same file. Providing NULL + as the mounts file closes the file. */ +static int +open_temp_exec_file_mnt (const char *mounts) +{ + static const char *last_mounts; + static FILE *last_mntent; + + if (mounts != last_mounts) + { + if (last_mntent) + endmntent (last_mntent); + + last_mounts = mounts; + + if (mounts) + last_mntent = setmntent (mounts, "r"); + else + last_mntent = NULL; + } + + if (!last_mntent) + return -1; + + for (;;) + { + int fd; + struct mntent mnt; + char buf[MAXPATHLEN * 3]; + + if (getmntent_r (last_mntent, &mnt, buf, sizeof (buf)) == NULL) + return -1; + + if (hasmntopt (&mnt, "ro") + || hasmntopt (&mnt, "noexec") + || access (mnt.mnt_dir, W_OK)) + continue; + + fd = open_temp_exec_file_dir (mnt.mnt_dir); + + if (fd != -1) + return fd; + } +} +#endif /* HAVE_MNTENT */ + +/* Instructions to look for a location to hold a temporary file that + can be mapped in for execution. */ +static struct +{ + int (*func)(const char *); + const char *arg; + int repeat; +} open_temp_exec_file_opts[] = { + { open_temp_exec_file_env, "TMPDIR", 0 }, + { open_temp_exec_file_dir, "/tmp", 0 }, + { open_temp_exec_file_dir, "/var/tmp", 0 }, + { open_temp_exec_file_dir, "/dev/shm", 0 }, + { open_temp_exec_file_env, "HOME", 0 }, +#ifdef HAVE_MNTENT + { open_temp_exec_file_mnt, "/etc/mtab", 1 }, + { open_temp_exec_file_mnt, "/proc/mounts", 1 }, +#endif /* HAVE_MNTENT */ +}; + +/* Current index into open_temp_exec_file_opts. */ +static int open_temp_exec_file_opts_idx = 0; + +/* Reset a current multi-call func, then advances to the next entry. + If we're at the last, go back to the first and return nonzero, + otherwise return zero. */ +static int +open_temp_exec_file_opts_next (void) +{ + if (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) + open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func (NULL); + + open_temp_exec_file_opts_idx++; + if (open_temp_exec_file_opts_idx + == (sizeof (open_temp_exec_file_opts) + / sizeof (*open_temp_exec_file_opts))) + { + open_temp_exec_file_opts_idx = 0; + return 1; + } + + return 0; +} + +/* Return a file descriptor of a temporary zero-sized file in a + writable and executable filesystem. */ +static int +open_temp_exec_file (void) +{ + int fd; + + do + { + fd = open_temp_exec_file_opts[open_temp_exec_file_opts_idx].func + (open_temp_exec_file_opts[open_temp_exec_file_opts_idx].arg); + + if (!open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat + || fd == -1) + { + if (open_temp_exec_file_opts_next ()) + break; + } + } + while (fd == -1); + + return fd; +} + +/* We need to allocate space in a file that will be backing a writable + mapping. Several problems exist with the usual approaches: + - fallocate() is Linux-only + - posix_fallocate() is not available on all platforms + - ftruncate() does not allocate space on filesystems with sparse files + Failure to allocate the space will cause SIGBUS to be thrown when + the mapping is subsequently written to. */ +static int +allocate_space (int fd, off_t offset, off_t len) +{ + static size_t page_size; + + /* Obtain system page size. */ + if (!page_size) + page_size = sysconf(_SC_PAGESIZE); + + unsigned char buf[page_size]; + memset (buf, 0, page_size); + + while (len > 0) + { + off_t to_write = (len < page_size) ? len : page_size; + if (write (fd, buf, to_write) < to_write) + return -1; + len -= to_write; + } + + return 0; +} + +/* Map in a chunk of memory from the temporary exec file into separate + locations in the virtual memory address space, one writable and one + executable. Returns the address of the writable portion, after + storing an offset to the corresponding executable portion at the + last word of the requested chunk. */ +static void * +dlmmap_locked (void *start, size_t length, int prot, int flags, off_t offset) +{ + void *ptr; + + if (execfd == -1) + { + open_temp_exec_file_opts_idx = 0; + retry_open: + execfd = open_temp_exec_file (); + if (execfd == -1) + return MFAIL; + } + + offset = execsize; + + if (allocate_space (execfd, offset, length)) + return MFAIL; + + flags &= ~(MAP_PRIVATE | MAP_ANONYMOUS); + flags |= MAP_SHARED; + + ptr = mmap (NULL, length, (prot & ~PROT_WRITE) | PROT_EXEC, + flags, execfd, offset); + if (ptr == MFAIL) + { + if (!offset) + { + close (execfd); + goto retry_open; + } + if (ftruncate (execfd, offset) != 0) + { + /* Fixme : Error logs can be added here. Returning an error for + * ftruncte() will not add any advantage as it is being + * validating in the error case. */ + } + + return MFAIL; + } + else if (!offset + && open_temp_exec_file_opts[open_temp_exec_file_opts_idx].repeat) + open_temp_exec_file_opts_next (); + + start = mmap (start, length, prot, flags, execfd, offset); + + if (start == MFAIL) + { + munmap (ptr, length); + if (ftruncate (execfd, offset) != 0) + { + /* Fixme : Error logs can be added here. Returning an error for + * ftruncte() will not add any advantage as it is being + * validating in the error case. */ + } + return start; + } + + mmap_exec_offset ((char *)start, length) = (char*)ptr - (char*)start; + + execsize += length; + + return start; +} + +/* Map in a writable and executable chunk of memory if possible. + Failing that, fall back to dlmmap_locked. */ +static void * +dlmmap (void *start, size_t length, int prot, + int flags, int fd, off_t offset) +{ + void *ptr; + + assert (start == NULL && length % malloc_getpagesize == 0 + && prot == (PROT_READ | PROT_WRITE) + && flags == (MAP_PRIVATE | MAP_ANONYMOUS) + && fd == -1 && offset == 0); + + if (execfd == -1 && is_emutramp_enabled ()) + { + ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); + return ptr; + } + + if (execfd == -1 && !is_selinux_enabled ()) + { + ptr = mmap (start, length, prot | PROT_EXEC, flags, fd, offset); + + if (ptr != MFAIL || (errno != EPERM && errno != EACCES)) + /* Cool, no need to mess with separate segments. */ + return ptr; + + /* If MREMAP_DUP is ever introduced and implemented, try mmap + with ((prot & ~PROT_WRITE) | PROT_EXEC) and mremap with + MREMAP_DUP and prot at this point. */ + } + + if (execsize == 0 || execfd == -1) + { + pthread_mutex_lock (&open_temp_exec_file_mutex); + ptr = dlmmap_locked (start, length, prot, flags, offset); + pthread_mutex_unlock (&open_temp_exec_file_mutex); + + return ptr; + } + + return dlmmap_locked (start, length, prot, flags, offset); +} + +/* Release memory at the given address, as well as the corresponding + executable page if it's separate. */ +static int +dlmunmap (void *start, size_t length) +{ + /* We don't bother decreasing execsize or truncating the file, since + we can't quite tell whether we're unmapping the end of the file. + We don't expect frequent deallocation anyway. If we did, we + could locate pages in the file by writing to the pages being + deallocated and checking that the file contents change. + Yuck. */ + msegmentptr seg = segment_holding (gm, start); + void *code; + + if (seg && (code = add_segment_exec_offset (start, seg)) != start) + { + int ret = munmap (code, length); + if (ret) + return ret; + } + + return munmap (start, length); +} + +#if FFI_CLOSURE_FREE_CODE +/* Return segment holding given code address. */ +static msegmentptr +segment_holding_code (mstate m, char* addr) +{ + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= add_segment_exec_offset (sp->base, sp) + && addr < add_segment_exec_offset (sp->base, sp) + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} +#endif + +#endif /* !(defined(_WIN32) || defined(__OS2__)) || defined (__CYGWIN__) || defined(__INTERIX) */ + +/* Allocate a chunk of memory with the given size. Returns a pointer + to the writable address, and sets *CODE to the executable + corresponding virtual address. */ +void * +ffi_closure_alloc (size_t size, void **code) +{ + void *ptr; + + if (!code) + return NULL; + + ptr = FFI_CLOSURE_PTR (dlmalloc (size)); + + if (ptr) + { + msegmentptr seg = segment_holding (gm, ptr); + + *code = add_segment_exec_offset (ptr, seg); + } + + return ptr; +} + +void * +ffi_data_to_code_pointer (void *data) +{ + msegmentptr seg = segment_holding (gm, data); + /* We expect closures to be allocated with ffi_closure_alloc(), in + which case seg will be non-NULL. However, some users take on the + burden of managing this memory themselves, in which case this + we'll just return data. */ + if (seg) + return add_segment_exec_offset (data, seg); + else + return data; +} + +/* Release a chunk of memory allocated with ffi_closure_alloc. If + FFI_CLOSURE_FREE_CODE is nonzero, the given address can be the + writable or the executable address given. Otherwise, only the + writable address can be provided here. */ +void +ffi_closure_free (void *ptr) +{ +#if FFI_CLOSURE_FREE_CODE + msegmentptr seg = segment_holding_code (gm, ptr); + + if (seg) + ptr = sub_segment_exec_offset (ptr, seg); +#endif + + dlfree (FFI_RESTORE_PTR (ptr)); +} + +# else /* ! FFI_MMAP_EXEC_WRIT */ + +/* On many systems, memory returned by malloc is writable and + executable, so just use it. */ + +#include <stdlib.h> + +void * +ffi_closure_alloc (size_t size, void **code) +{ + if (!code) + return NULL; + + return *code = FFI_CLOSURE_PTR (malloc (size)); +} + +void +ffi_closure_free (void *ptr) +{ + free (FFI_RESTORE_PTR (ptr)); +} + +void * +ffi_data_to_code_pointer (void *data) +{ + return data; +} + +# endif /* ! FFI_MMAP_EXEC_WRIT */ +#endif /* FFI_CLOSURES */ + +#endif /* NetBSD with PROT_MPROTECT */ diff --git a/Stinger/libffi/darwin_common/src/debug.c b/Stinger/libffi/darwin_common/src/debug.c new file mode 100644 index 0000000..11b6728 --- /dev/null +++ b/Stinger/libffi/darwin_common/src/debug.c @@ -0,0 +1,64 @@ +/* ----------------------------------------------------------------------- + debug.c - Copyright (c) 1996 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include "ffi.h" +#include "ffi_common.h" +#include <stdlib.h> +#include <stdio.h> + +/* General debugging routines */ + +void ffi_stop_here(void) +{ + /* This function is only useful for debugging purposes. + Place a breakpoint on ffi_stop_here to be notified of + significant events. */ +} + +/* This function should only be called via the FFI_ASSERT() macro */ + +void ffi_assert(char *expr, char *file, int line) +{ + fprintf(stderr, "ASSERTION FAILURE: %s at %s:%d\n", expr, file, line); + ffi_stop_here(); + abort(); +} + +/* Perform a sanity check on an ffi_type structure */ + +void ffi_type_test(ffi_type *a, char *file, int line) +{ + FFI_ASSERT_AT(a != NULL, file, line); + + FFI_ASSERT_AT(a->type <= FFI_TYPE_LAST, file, line); + FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->size > 0, file, line); + FFI_ASSERT_AT(a->type == FFI_TYPE_VOID || a->alignment > 0, file, line); + FFI_ASSERT_AT((a->type != FFI_TYPE_STRUCT && a->type != FFI_TYPE_COMPLEX) + || a->elements != NULL, file, line); + FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX + || (a->elements != NULL + && a->elements[0] != NULL && a->elements[1] == NULL), + file, line); + +} diff --git a/Stinger/libffi/darwin_common/src/dlmalloc.c b/Stinger/libffi/darwin_common/src/dlmalloc.c new file mode 100644 index 0000000..1aba657 --- /dev/null +++ b/Stinger/libffi/darwin_common/src/dlmalloc.c @@ -0,0 +1,5166 @@ +/* + This is a version (aka dlmalloc) of malloc/free/realloc written by + Doug Lea and released to the public domain, as explained at + http://creativecommons.org/licenses/publicdomain. Send questions, + comments, complaints, performance data, etc to dl@cs.oswego.edu + +* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) + + Note: There may be an updated version of this malloc obtainable at + ftp://gee.cs.oswego.edu/pub/misc/malloc.c + Check before installing! + +* Quickstart + + This library is all in one file to simplify the most common usage: + ftp it, compile it (-O3), and link it into another program. All of + the compile-time options default to reasonable values for use on + most platforms. You might later want to step through various + compile-time and dynamic tuning options. + + For convenience, an include file for code using this malloc is at: + ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h + You don't really need this .h file unless you call functions not + defined in your system include files. The .h file contains only the + excerpts from this file needed for using this malloc on ANSI C/C++ + systems, so long as you haven't changed compile-time options about + naming and tuning parameters. If you do, then you can create your + own malloc.h that does include all settings by cutting at the point + indicated below. Note that you may already by default be using a C + library containing a malloc that is based on some version of this + malloc (for example in linux). You might still want to use the one + in this file to customize settings or to avoid overheads associated + with library versions. + +* Vital statistics: + + Supported pointer/size_t representation: 4 or 8 bytes + size_t MUST be an unsigned type of the same width as + pointers. (If you are using an ancient system that declares + size_t as a signed type, or need it to be a different width + than pointers, you can use a previous release of this malloc + (e.g. 2.7.2) supporting these.) + + Alignment: 8 bytes (default) + This suffices for nearly all current machines and C compilers. + However, you can define MALLOC_ALIGNMENT to be wider than this + if necessary (up to 128bytes), at the expense of using more space. + + Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) + 8 or 16 bytes (if 8byte sizes) + Each malloced chunk has a hidden word of overhead holding size + and status information, and additional cross-check word + if FOOTERS is defined. + + Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) + 8-byte ptrs: 32 bytes (including overhead) + + Even a request for zero bytes (i.e., malloc(0)) returns a + pointer to something of the minimum allocatable size. + The maximum overhead wastage (i.e., number of extra bytes + allocated than were requested in malloc) is less than or equal + to the minimum size, except for requests >= mmap_threshold that + are serviced via mmap(), where the worst case wastage is about + 32 bytes plus the remainder from a system page (the minimal + mmap unit); typically 4096 or 8192 bytes. + + Security: static-safe; optionally more or less + The "security" of malloc refers to the ability of malicious + code to accentuate the effects of errors (for example, freeing + space that is not currently malloc'ed or overwriting past the + ends of chunks) in code that calls malloc. This malloc + guarantees not to modify any memory locations below the base of + heap, i.e., static variables, even in the presence of usage + errors. The routines additionally detect most improper frees + and reallocs. All this holds as long as the static bookkeeping + for malloc itself is not corrupted by some other means. This + is only one aspect of security -- these checks do not, and + cannot, detect all possible programming errors. + + If FOOTERS is defined nonzero, then each allocated chunk + carries an additional check word to verify that it was malloced + from its space. These check words are the same within each + execution of a program using malloc, but differ across + executions, so externally crafted fake chunks cannot be + freed. This improves security by rejecting frees/reallocs that + could corrupt heap memory, in addition to the checks preventing + writes to statics that are always on. This may further improve + security at the expense of time and space overhead. (Note that + FOOTERS may also be worth using with MSPACES.) + + By default detected errors cause the program to abort (calling + "abort()"). You can override this to instead proceed past + errors by defining PROCEED_ON_ERROR. In this case, a bad free + has no effect, and a malloc that encounters a bad address + caused by user overwrites will ignore the bad address by + dropping pointers and indices to all known memory. This may + be appropriate for programs that should continue if at all + possible in the face of programming errors, although they may + run out of memory because dropped memory is never reclaimed. + + If you don't like either of these options, you can define + CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything + else. And if if you are sure that your program using malloc has + no errors or vulnerabilities, you can define INSECURE to 1, + which might (or might not) provide a small performance improvement. + + Thread-safety: NOT thread-safe unless USE_LOCKS defined + When USE_LOCKS is defined, each public call to malloc, free, + etc is surrounded with either a pthread mutex or a win32 + spinlock (depending on WIN32). This is not especially fast, and + can be a major bottleneck. It is designed only to provide + minimal protection in concurrent environments, and to provide a + basis for extensions. If you are using malloc in a concurrent + program, consider instead using ptmalloc, which is derived from + a version of this malloc. (See http://www.malloc.de). + + System requirements: Any combination of MORECORE and/or MMAP/MUNMAP + This malloc can use unix sbrk or any emulation (invoked using + the CALL_MORECORE macro) and/or mmap/munmap or any emulation + (invoked using CALL_MMAP/CALL_MUNMAP) to get and release system + memory. On most unix systems, it tends to work best if both + MORECORE and MMAP are enabled. On Win32, it uses emulations + based on VirtualAlloc. It also uses common C library functions + like memset. + + Compliance: I believe it is compliant with the Single Unix Specification + (See http://www.unix.org). Also SVID/XPG, ANSI C, and probably + others as well. + +* Overview of algorithms + + This is not the fastest, most space-conserving, most portable, or + most tunable malloc ever written. However it is among the fastest + while also being among the most space-conserving, portable and + tunable. Consistent balance across these factors results in a good + general-purpose allocator for malloc-intensive programs. + + In most ways, this malloc is a best-fit allocator. Generally, it + chooses the best-fitting existing chunk for a request, with ties + broken in approximately least-recently-used order. (This strategy + normally maintains low fragmentation.) However, for requests less + than 256bytes, it deviates from best-fit when there is not an + exactly fitting available chunk by preferring to use space adjacent + to that used for the previous small request, as well as by breaking + ties in approximately most-recently-used order. (These enhance + locality of series of small allocations.) And for very large requests + (>= 256Kb by default), it relies on system memory mapping + facilities, if supported. (This helps avoid carrying around and + possibly fragmenting memory used only for large chunks.) + + All operations (except malloc_stats and mallinfo) have execution + times that are bounded by a constant factor of the number of bits in + a size_t, not counting any clearing in calloc or copying in realloc, + or actions surrounding MORECORE and MMAP that have times + proportional to the number of non-contiguous regions returned by + system allocation routines, which is often just 1. + + The implementation is not very modular and seriously overuses + macros. Perhaps someday all C compilers will do as good a job + inlining modular code as can now be done by brute-force expansion, + but now, enough of them seem not to. + + Some compilers issue a lot of warnings about code that is + dead/unreachable only on some platforms, and also about intentional + uses of negation on unsigned types. All known cases of each can be + ignored. + + For a longer but out of date high-level description, see + http://gee.cs.oswego.edu/dl/html/malloc.html + +* MSPACES + If MSPACES is defined, then in addition to malloc, free, etc., + this file also defines mspace_malloc, mspace_free, etc. These + are versions of malloc routines that take an "mspace" argument + obtained using create_mspace, to control all internal bookkeeping. + If ONLY_MSPACES is defined, only these versions are compiled. + So if you would like to use this allocator for only some allocations, + and your system malloc for others, you can compile with + ONLY_MSPACES and then do something like... + static mspace mymspace = create_mspace(0,0); // for example + #define mymalloc(bytes) mspace_malloc(mymspace, bytes) + + (Note: If you only need one instance of an mspace, you can instead + use "USE_DL_PREFIX" to relabel the global malloc.) + + You can similarly create thread-local allocators by storing + mspaces as thread-locals. For example: + static __thread mspace tlms = 0; + void* tlmalloc(size_t bytes) { + if (tlms == 0) tlms = create_mspace(0, 0); + return mspace_malloc(tlms, bytes); + } + void tlfree(void* mem) { mspace_free(tlms, mem); } + + Unless FOOTERS is defined, each mspace is completely independent. + You cannot allocate from one and free to another (although + conformance is only weakly checked, so usage errors are not always + caught). If FOOTERS is defined, then each chunk carries around a tag + indicating its originating mspace, and frees are directed to their + originating spaces. + + ------------------------- Compile-time options --------------------------- + +Be careful in setting #define values for numerical constants of type +size_t. On some systems, literal values are not automatically extended +to size_t precision unless they are explicitly casted. + +WIN32 default: defined if _WIN32 defined + Defining WIN32 sets up defaults for MS environment and compilers. + Otherwise defaults are for unix. + +MALLOC_ALIGNMENT default: (size_t)8 + Controls the minimum alignment for malloc'ed chunks. It must be a + power of two and at least 8, even on machines for which smaller + alignments would suffice. It may be defined as larger than this + though. Note however that code and data structures are optimized for + the case of 8-byte alignment. + +MSPACES default: 0 (false) + If true, compile in support for independent allocation spaces. + This is only supported if HAVE_MMAP is true. + +ONLY_MSPACES default: 0 (false) + If true, only compile in mspace versions, not regular versions. + +USE_LOCKS default: 0 (false) + Causes each call to each public routine to be surrounded with + pthread or WIN32 mutex lock/unlock. (If set true, this can be + overridden on a per-mspace basis for mspace versions.) + +FOOTERS default: 0 + If true, provide extra checking and dispatching by placing + information in the footers of allocated chunks. This adds + space and time overhead. + +INSECURE default: 0 + If true, omit checks for usage errors and heap space overwrites. + +USE_DL_PREFIX default: NOT defined + Causes compiler to prefix all public routines with the string 'dl'. + This can be useful when you only want to use this malloc in one part + of a program, using your regular system malloc elsewhere. + +ABORT default: defined as abort() + Defines how to abort on failed checks. On most systems, a failed + check cannot die with an "assert" or even print an informative + message, because the underlying print routines in turn call malloc, + which will fail again. Generally, the best policy is to simply call + abort(). It's not very useful to do more than this because many + errors due to overwriting will show up as address faults (null, odd + addresses etc) rather than malloc-triggered checks, so will also + abort. Also, most compilers know that abort() does not return, so + can better optimize code conditionally calling it. + +PROCEED_ON_ERROR default: defined as 0 (false) + Controls whether detected bad addresses cause them to bypassed + rather than aborting. If set, detected bad arguments to free and + realloc are ignored. And all bookkeeping information is zeroed out + upon a detected overwrite of freed heap space, thus losing the + ability to ever return it from malloc again, but enabling the + application to proceed. If PROCEED_ON_ERROR is defined, the + static variable malloc_corruption_error_count is compiled in + and can be examined to see if errors have occurred. This option + generates slower code than the default abort policy. + +DEBUG default: NOT defined + The DEBUG setting is mainly intended for people trying to modify + this code or diagnose problems when porting to new platforms. + However, it may also be able to better isolate user errors than just + using runtime checks. The assertions in the check routines spell + out in more detail the assumptions and invariants underlying the + algorithms. The checking is fairly extensive, and will slow down + execution noticeably. Calling malloc_stats or mallinfo with DEBUG + set will attempt to check every non-mmapped allocated and free chunk + in the course of computing the summaries. + +ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) + Debugging assertion failures can be nearly impossible if your + version of the assert macro causes malloc to be called, which will + lead to a cascade of further failures, blowing the runtime stack. + ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), + which will usually make debugging easier. + +MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 + The action to take before "return 0" when malloc fails to be able to + return memory because there is none available. + +HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES + True if this system supports sbrk or an emulation of it. + +MORECORE default: sbrk + The name of the sbrk-style system routine to call to obtain more + memory. See below for guidance on writing custom MORECORE + functions. The type of the argument to sbrk/MORECORE varies across + systems. It cannot be size_t, because it supports negative + arguments, so it is normally the signed type of the same width as + size_t (sometimes declared as "intptr_t"). It doesn't much matter + though. Internally, we only call it with arguments less than half + the max value of a size_t, which should work across all reasonable + possibilities, although sometimes generating compiler warnings. See + near the end of this file for guidelines for creating a custom + version of MORECORE. + +MORECORE_CONTIGUOUS default: 1 (true) + If true, take advantage of fact that consecutive calls to MORECORE + with positive arguments always return contiguous increasing + addresses. This is true of unix sbrk. It does not hurt too much to + set it true anyway, since malloc copes with non-contiguities. + Setting it false when definitely non-contiguous saves time + and possibly wasted space it would take to discover this though. + +MORECORE_CANNOT_TRIM default: NOT defined + True if MORECORE cannot release space back to the system when given + negative arguments. This is generally necessary only if you are + using a hand-crafted MORECORE function that cannot handle negative + arguments. + +HAVE_MMAP default: 1 (true) + True if this system supports mmap or an emulation of it. If so, and + HAVE_MORECORE is not true, MMAP is used for all system + allocation. If set and HAVE_MORECORE is true as well, MMAP is + primarily used to directly allocate very large blocks. It is also + used as a backup strategy in cases where MORECORE fails to provide + space from system. Note: A single call to MUNMAP is assumed to be + able to unmap memory that may have be allocated using multiple calls + to MMAP, so long as they are adjacent. + +HAVE_MREMAP default: 1 on linux, else 0 + If true realloc() uses mremap() to re-allocate large blocks and + extend or shrink allocation spaces. + +MMAP_CLEARS default: 1 on unix + True if mmap clears memory so calloc doesn't need to. This is true + for standard unix mmap using /dev/zero. + +USE_BUILTIN_FFS default: 0 (i.e., not used) + Causes malloc to use the builtin ffs() function to compute indices. + Some compilers may recognize and intrinsify ffs to be faster than the + supplied C version. Also, the case of x86 using gcc is special-cased + to an asm instruction, so is already as fast as it can be, and so + this setting has no effect. (On most x86s, the asm version is only + slightly faster than the C version.) + +malloc_getpagesize default: derive from system includes, or 4096. + The system page size. To the extent possible, this malloc manages + memory from the system in page-size units. This may be (and + usually is) a function rather than a constant. This is ignored + if WIN32, where page size is determined using getSystemInfo during + initialization. + +USE_DEV_RANDOM default: 0 (i.e., not used) + Causes malloc to use /dev/random to initialize secure magic seed for + stamping footers. Otherwise, the current time is used. + +NO_MALLINFO default: 0 + If defined, don't compile "mallinfo". This can be a simple way + of dealing with mismatches between system declarations and + those in this file. + +MALLINFO_FIELD_TYPE default: size_t + The type of the fields in the mallinfo struct. This was originally + defined as "int" in SVID etc, but is more usefully defined as + size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set + +REALLOC_ZERO_BYTES_FREES default: not defined + This should be set if a call to realloc with zero bytes should + be the same as a call to free. Some people think it should. Otherwise, + since this malloc returns a unique pointer for malloc(0), so does + realloc(p, 0). + +LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H +LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H +LACKS_STDLIB_H default: NOT defined unless on WIN32 + Define these if your system does not have these header files. + You might need to manually insert some of the declarations they provide. + +DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, + system_info.dwAllocationGranularity in WIN32, + otherwise 64K. + Also settable using mallopt(M_GRANULARITY, x) + The unit for allocating and deallocating memory from the system. On + most systems with contiguous MORECORE, there is no reason to + make this more than a page. However, systems with MMAP tend to + either require or encourage larger granularities. You can increase + this value to prevent system allocation functions to be called so + often, especially if they are slow. The value must be at least one + page and must be a power of two. Setting to 0 causes initialization + to either page size or win32 region size. (Note: In previous + versions of malloc, the equivalent of this option was called + "TOP_PAD") + +DEFAULT_TRIM_THRESHOLD default: 2MB + Also settable using mallopt(M_TRIM_THRESHOLD, x) + The maximum amount of unused top-most memory to keep before + releasing via malloc_trim in free(). Automatic trimming is mainly + useful in long-lived programs using contiguous MORECORE. Because + trimming via sbrk can be slow on some systems, and can sometimes be + wasteful (in cases where programs immediately afterward allocate + more large chunks) the value should be high enough so that your + overall system performance would improve by releasing this much + memory. As a rough guide, you might set to a value close to the + average size of a process (program) running on your system. + Releasing this much memory would allow such a process to run in + memory. Generally, it is worth tuning trim thresholds when a + program undergoes phases where several large chunks are allocated + and released in ways that can reuse each other's storage, perhaps + mixed with phases where there are no such chunks at all. The trim + value must be greater than page size to have any useful effect. To + disable trimming completely, you can set to MAX_SIZE_T. Note that the trick + some people use of mallocing a huge space and then freeing it at + program startup, in an attempt to reserve system memory, doesn't + have the intended effect under automatic trimming, since that memory + will immediately be returned to the system. + +DEFAULT_MMAP_THRESHOLD default: 256K + Also settable using mallopt(M_MMAP_THRESHOLD, x) + The request size threshold for using MMAP to directly service a + request. Requests of at least this size that cannot be allocated + using already-existing space will be serviced via mmap. (If enough + normal freed space already exists it is used instead.) Using mmap + segregates relatively large chunks of memory so that they can be + individually obtained and released from the host system. A request + serviced through mmap is never reused by any other request (at least + not directly; the system may just so happen to remap successive + requests to the same locations). Segregating space in this way has + the benefits that: Mmapped space can always be individually released + back to the system, which helps keep the system level memory demands + of a long-lived program low. Also, mapped memory doesn't become + `locked' between other chunks, as can happen with normally allocated + chunks, which means that even trimming via malloc_trim would not + release them. However, it has the disadvantage that the space + cannot be reclaimed, consolidated, and then used to service later + requests, as happens with normal chunks. The advantages of mmap + nearly always outweigh disadvantages for "large" chunks, but the + value of "large" may vary across systems. The default is an + empirically derived value that works well in most systems. You can + disable mmap by setting to MAX_SIZE_T. + +*/ + +#if defined __linux__ && !defined _GNU_SOURCE +/* mremap() on Linux requires this via sys/mman.h */ +#define _GNU_SOURCE 1 +#endif + +#ifndef WIN32 +#ifdef _WIN32 +#define WIN32 1 +#endif /* _WIN32 */ +#endif /* WIN32 */ +#ifdef WIN32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_UNISTD_H +#define LACKS_SYS_PARAM_H +#define LACKS_SYS_MMAN_H +#define LACKS_STRING_H +#define LACKS_STRINGS_H +#define LACKS_SYS_TYPES_H +#define LACKS_ERRNO_H +#define MALLOC_FAILURE_ACTION +#define MMAP_CLEARS 0 /* WINCE and some others apparently don't clear */ +#endif /* WIN32 */ + +#ifdef __OS2__ +#define INCL_DOS +#include <os2.h> +#define HAVE_MMAP 1 +#define HAVE_MORECORE 0 +#define LACKS_SYS_MMAN_H +#endif /* __OS2__ */ + +#if defined(DARWIN) || defined(_DARWIN) +/* Mac OSX docs advise not to use sbrk; it seems better to use mmap */ +#ifndef HAVE_MORECORE +#define HAVE_MORECORE 0 +#define HAVE_MMAP 1 +#endif /* HAVE_MORECORE */ +#endif /* DARWIN */ + +#ifndef LACKS_SYS_TYPES_H +#include <sys/types.h> /* For size_t */ +#endif /* LACKS_SYS_TYPES_H */ + +/* The maximum possible size_t value has all bits set */ +#define MAX_SIZE_T (~(size_t)0) + +#ifndef ONLY_MSPACES +#define ONLY_MSPACES 0 +#endif /* ONLY_MSPACES */ +#ifndef MSPACES +#if ONLY_MSPACES +#define MSPACES 1 +#else /* ONLY_MSPACES */ +#define MSPACES 0 +#endif /* ONLY_MSPACES */ +#endif /* MSPACES */ +#ifndef MALLOC_ALIGNMENT +#define MALLOC_ALIGNMENT ((size_t)8U) +#endif /* MALLOC_ALIGNMENT */ +#ifndef FOOTERS +#define FOOTERS 0 +#endif /* FOOTERS */ +#ifndef ABORT +#define ABORT abort() +#endif /* ABORT */ +#ifndef ABORT_ON_ASSERT_FAILURE +#define ABORT_ON_ASSERT_FAILURE 1 +#endif /* ABORT_ON_ASSERT_FAILURE */ +#ifndef PROCEED_ON_ERROR +#define PROCEED_ON_ERROR 0 +#endif /* PROCEED_ON_ERROR */ +#ifndef USE_LOCKS +#define USE_LOCKS 0 +#endif /* USE_LOCKS */ +#ifndef INSECURE +#define INSECURE 0 +#endif /* INSECURE */ +#ifndef HAVE_MMAP +#define HAVE_MMAP 1 +#endif /* HAVE_MMAP */ +#ifndef MMAP_CLEARS +#define MMAP_CLEARS 1 +#endif /* MMAP_CLEARS */ +#ifndef HAVE_MREMAP +#ifdef linux +#define HAVE_MREMAP 1 +#else /* linux */ +#define HAVE_MREMAP 0 +#endif /* linux */ +#endif /* HAVE_MREMAP */ +#ifndef MALLOC_FAILURE_ACTION +#define MALLOC_FAILURE_ACTION errno = ENOMEM; +#endif /* MALLOC_FAILURE_ACTION */ +#ifndef HAVE_MORECORE +#if ONLY_MSPACES +#define HAVE_MORECORE 0 +#else /* ONLY_MSPACES */ +#define HAVE_MORECORE 1 +#endif /* ONLY_MSPACES */ +#endif /* HAVE_MORECORE */ +#if !HAVE_MORECORE +#define MORECORE_CONTIGUOUS 0 +#else /* !HAVE_MORECORE */ +#ifndef MORECORE +#define MORECORE sbrk +#endif /* MORECORE */ +#ifndef MORECORE_CONTIGUOUS +#define MORECORE_CONTIGUOUS 1 +#endif /* MORECORE_CONTIGUOUS */ +#endif /* HAVE_MORECORE */ +#ifndef DEFAULT_GRANULARITY +#if MORECORE_CONTIGUOUS +#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ +#else /* MORECORE_CONTIGUOUS */ +#define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U) +#endif /* MORECORE_CONTIGUOUS */ +#endif /* DEFAULT_GRANULARITY */ +#ifndef DEFAULT_TRIM_THRESHOLD +#ifndef MORECORE_CANNOT_TRIM +#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) +#else /* MORECORE_CANNOT_TRIM */ +#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T +#endif /* MORECORE_CANNOT_TRIM */ +#endif /* DEFAULT_TRIM_THRESHOLD */ +#ifndef DEFAULT_MMAP_THRESHOLD +#if HAVE_MMAP +#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) +#else /* HAVE_MMAP */ +#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T +#endif /* HAVE_MMAP */ +#endif /* DEFAULT_MMAP_THRESHOLD */ +#ifndef USE_BUILTIN_FFS +#define USE_BUILTIN_FFS 0 +#endif /* USE_BUILTIN_FFS */ +#ifndef USE_DEV_RANDOM +#define USE_DEV_RANDOM 0 +#endif /* USE_DEV_RANDOM */ +#ifndef NO_MALLINFO +#define NO_MALLINFO 0 +#endif /* NO_MALLINFO */ +#ifndef MALLINFO_FIELD_TYPE +#define MALLINFO_FIELD_TYPE size_t +#endif /* MALLINFO_FIELD_TYPE */ + +/* + mallopt tuning options. SVID/XPG defines four standard parameter + numbers for mallopt, normally defined in malloc.h. None of these + are used in this malloc, so setting them has no effect. But this + malloc does support the following options. +*/ + +#define M_TRIM_THRESHOLD (-1) +#define M_GRANULARITY (-2) +#define M_MMAP_THRESHOLD (-3) + +/* ------------------------ Mallinfo declarations ------------------------ */ + +#if !NO_MALLINFO +/* + This version of malloc supports the standard SVID/XPG mallinfo + routine that returns a struct containing usage properties and + statistics. It should work on any system that has a + /usr/include/malloc.h defining struct mallinfo. The main + declaration needed is the mallinfo struct that is returned (by-copy) + by mallinfo(). The malloinfo struct contains a bunch of fields that + are not even meaningful in this version of malloc. These fields are + are instead filled by mallinfo() with other numbers that might be of + interest. + + HAVE_USR_INCLUDE_MALLOC_H should be set if you have a + /usr/include/malloc.h file that includes a declaration of struct + mallinfo. If so, it is included; else a compliant version is + declared below. These must be precisely the same for mallinfo() to + work. The original SVID version of this struct, defined on most + systems with mallinfo, declares all fields as ints. But some others + define as unsigned long. If your system defines the fields using a + type of different width than listed here, you MUST #include your + system version and #define HAVE_USR_INCLUDE_MALLOC_H. +*/ + +/* #define HAVE_USR_INCLUDE_MALLOC_H */ + +#ifdef HAVE_USR_INCLUDE_MALLOC_H +#include "/usr/include/malloc.h" +#else /* HAVE_USR_INCLUDE_MALLOC_H */ + +/* HP-UX's stdlib.h redefines mallinfo unless _STRUCT_MALLINFO is defined */ +#define _STRUCT_MALLINFO + +struct mallinfo { + MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ + MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ + MALLINFO_FIELD_TYPE smblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblks; /* always 0 */ + MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ + MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ + MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ + MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ + MALLINFO_FIELD_TYPE fordblks; /* total free space */ + MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ +}; + +#endif /* HAVE_USR_INCLUDE_MALLOC_H */ +#endif /* NO_MALLINFO */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if !ONLY_MSPACES + +/* ------------------- Declarations of public routines ------------------- */ + +#ifndef USE_DL_PREFIX +#define dlcalloc calloc +#define dlfree free +#define dlmalloc malloc +#define dlmemalign memalign +#define dlrealloc realloc +#define dlvalloc valloc +#define dlpvalloc pvalloc +#define dlmallinfo mallinfo +#define dlmallopt mallopt +#define dlmalloc_trim malloc_trim +#define dlmalloc_stats malloc_stats +#define dlmalloc_usable_size malloc_usable_size +#define dlmalloc_footprint malloc_footprint +#define dlmalloc_max_footprint malloc_max_footprint +#define dlindependent_calloc independent_calloc +#define dlindependent_comalloc independent_comalloc +#endif /* USE_DL_PREFIX */ + + +/* + malloc(size_t n) + Returns a pointer to a newly allocated chunk of at least n bytes, or + null if no space is available, in which case errno is set to ENOMEM + on ANSI C systems. + + If n is zero, malloc returns a minimum-sized chunk. (The minimum + size is 16 bytes on most 32bit systems, and 32 bytes on 64bit + systems.) Note that size_t is an unsigned type, so calls with + arguments that would be negative if signed are interpreted as + requests for huge amounts of space, which will often fail. The + maximum supported value of n differs across systems, but is in all + cases less than the maximum representable value of a size_t. +*/ +void* dlmalloc(size_t); + +/* + free(void* p) + Releases the chunk of memory pointed to by p, that had been previously + allocated using malloc or a related routine such as realloc. + It has no effect if p is null. If p was not malloced or already + freed, free(p) will by default cause the current program to abort. +*/ +void dlfree(void*); + +/* + calloc(size_t n_elements, size_t element_size); + Returns a pointer to n_elements * element_size bytes, with all locations + set to zero. +*/ +void* dlcalloc(size_t, size_t); + +/* + realloc(void* p, size_t n) + Returns a pointer to a chunk of size n that contains the same data + as does chunk p up to the minimum of (n, p's size) bytes, or null + if no space is available. + + The returned pointer may or may not be the same as p. The algorithm + prefers extending p in most cases when possible, otherwise it + employs the equivalent of a malloc-copy-free sequence. + + If p is null, realloc is equivalent to malloc. + + If space is not available, realloc returns null, errno is set (if on + ANSI) and p is NOT freed. + + if n is for fewer bytes than already held by p, the newly unused + space is lopped off and freed if possible. realloc with a size + argument of zero (re)allocates a minimum-sized chunk. + + The old unix realloc convention of allowing the last-free'd chunk + to be used as an argument to realloc is not supported. +*/ + +void* dlrealloc(void*, size_t); + +/* + memalign(size_t alignment, size_t n); + Returns a pointer to a newly allocated chunk of n bytes, aligned + in accord with the alignment argument. + + The alignment argument should be a power of two. If the argument is + not a power of two, the nearest greater power is used. + 8-byte alignment is guaranteed by normal malloc calls, so don't + bother calling memalign with an argument of 8 or less. + + Overreliance on memalign is a sure way to fragment space. +*/ +void* dlmemalign(size_t, size_t); + +/* + valloc(size_t n); + Equivalent to memalign(pagesize, n), where pagesize is the page + size of the system. If the pagesize is unknown, 4096 is used. +*/ +void* dlvalloc(size_t); + +/* + mallopt(int parameter_number, int parameter_value) + Sets tunable parameters The format is to provide a + (parameter-number, parameter-value) pair. mallopt then sets the + corresponding parameter to the argument value if it can (i.e., so + long as the value is meaningful), and returns 1 if successful else + 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, + normally defined in malloc.h. None of these are use in this malloc, + so setting them has no effect. But this malloc also supports other + options in mallopt. See below for details. Briefly, supported + parameters are as follows (listed defaults are for "typical" + configurations). + + Symbol param # default allowed param values + M_TRIM_THRESHOLD -1 2*1024*1024 any (MAX_SIZE_T disables) + M_GRANULARITY -2 page size any power of 2 >= page size + M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) +*/ +int dlmallopt(int, int); + +/* + malloc_footprint(); + Returns the number of bytes obtained from the system. The total + number of bytes allocated by malloc, realloc etc., is less than this + value. Unlike mallinfo, this function returns only a precomputed + result, so can be called frequently to monitor memory consumption. + Even if locks are otherwise defined, this function does not use them, + so results might not be up to date. +*/ +size_t dlmalloc_footprint(void); + +/* + malloc_max_footprint(); + Returns the maximum number of bytes obtained from the system. This + value will be greater than current footprint if deallocated space + has been reclaimed by the system. The peak number of bytes allocated + by malloc, realloc etc., is less than this value. Unlike mallinfo, + this function returns only a precomputed result, so can be called + frequently to monitor memory consumption. Even if locks are + otherwise defined, this function does not use them, so results might + not be up to date. +*/ +size_t dlmalloc_max_footprint(void); + +#if !NO_MALLINFO +/* + mallinfo() + Returns (by copy) a struct containing various summary statistics: + + arena: current total non-mmapped bytes allocated from system + ordblks: the number of free chunks + smblks: always zero. + hblks: current number of mmapped regions + hblkhd: total bytes held in mmapped regions + usmblks: the maximum total allocated space. This will be greater + than current total if trimming has occurred. + fsmblks: always zero + uordblks: current total allocated space (normal or mmapped) + fordblks: total free space + keepcost: the maximum number of bytes that could ideally be released + back to system via malloc_trim. ("ideally" means that + it ignores page restrictions etc.) + + Because these fields are ints, but internal bookkeeping may + be kept as longs, the reported values may wrap around zero and + thus be inaccurate. +*/ +struct mallinfo dlmallinfo(void); +#endif /* NO_MALLINFO */ + +/* + independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); + + independent_calloc is similar to calloc, but instead of returning a + single cleared space, it returns an array of pointers to n_elements + independent elements that can hold contents of size elem_size, each + of which starts out cleared, and can be independently freed, + realloc'ed etc. The elements are guaranteed to be adjacently + allocated (this is not guaranteed to occur with multiple callocs or + mallocs), which may also improve cache locality in some + applications. + + The "chunks" argument is optional (i.e., may be null, which is + probably the most typical usage). If it is null, the returned array + is itself dynamically allocated and should also be freed when it is + no longer needed. Otherwise, the chunks array must be of at least + n_elements in length. It is filled in with the pointers to the + chunks. + + In either case, independent_calloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and "chunks" + is null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use regular calloc and assign pointers into this + space to represent elements. (In this case though, you cannot + independently free elements.) + + independent_calloc simplifies and speeds up implementations of many + kinds of pools. It may also be useful when constructing large data + structures that initially have a fixed number of fixed-sized nodes, + but the number is not known at compile time, and some of the nodes + may later need to be freed. For example: + + struct Node { int item; struct Node* next; }; + + struct Node* build_list() { + struct Node** pool; + int n = read_number_of_nodes_needed(); + if (n <= 0) return 0; + pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); + if (pool == 0) die(); + // organize into a linked list... + struct Node* first = pool[0]; + for (i = 0; i < n-1; ++i) + pool[i]->next = pool[i+1]; + free(pool); // Can now free the array (or not, if it is needed later) + return first; + } +*/ +void** dlindependent_calloc(size_t, size_t, void**); + +/* + independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); + + independent_comalloc allocates, all at once, a set of n_elements + chunks with sizes indicated in the "sizes" array. It returns + an array of pointers to these elements, each of which can be + independently freed, realloc'ed etc. The elements are guaranteed to + be adjacently allocated (this is not guaranteed to occur with + multiple callocs or mallocs), which may also improve cache locality + in some applications. + + The "chunks" argument is optional (i.e., may be null). If it is null + the returned array is itself dynamically allocated and should also + be freed when it is no longer needed. Otherwise, the chunks array + must be of at least n_elements in length. It is filled in with the + pointers to the chunks. + + In either case, independent_comalloc returns this pointer array, or + null if the allocation failed. If n_elements is zero and chunks is + null, it returns a chunk representing an array with zero elements + (which should be freed if not wanted). + + Each element must be individually freed when it is no longer + needed. If you'd like to instead be able to free all at once, you + should instead use a single regular malloc, and assign pointers at + particular offsets in the aggregate space. (In this case though, you + cannot independently free elements.) + + independent_comallac differs from independent_calloc in that each + element may have a different size, and also that it does not + automatically clear elements. + + independent_comalloc can be used to speed up allocation in cases + where several structs or objects must always be allocated at the + same time. For example: + + struct Head { ... } + struct Foot { ... } + + void send_message(char* msg) { + int msglen = strlen(msg); + size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; + void* chunks[3]; + if (independent_comalloc(3, sizes, chunks) == 0) + die(); + struct Head* head = (struct Head*)(chunks[0]); + char* body = (char*)(chunks[1]); + struct Foot* foot = (struct Foot*)(chunks[2]); + // ... + } + + In general though, independent_comalloc is worth using only for + larger values of n_elements. For small values, you probably won't + detect enough difference from series of malloc calls to bother. + + Overuse of independent_comalloc can increase overall memory usage, + since it cannot reuse existing noncontiguous small chunks that + might be available for some of the elements. +*/ +void** dlindependent_comalloc(size_t, size_t*, void**); + + +/* + pvalloc(size_t n); + Equivalent to valloc(minimum-page-that-holds(n)), that is, + round up n to nearest pagesize. + */ +void* dlpvalloc(size_t); + +/* + malloc_trim(size_t pad); + + If possible, gives memory back to the system (via negative arguments + to sbrk) if there is unused memory at the `high' end of the malloc + pool or in unused MMAP segments. You can call this after freeing + large blocks of memory to potentially reduce the system-level memory + requirements of a program. However, it cannot guarantee to reduce + memory. Under some allocation patterns, some large free blocks of + memory will be locked between two used chunks, so they cannot be + given back to the system. + + The `pad' argument to malloc_trim represents the amount of free + trailing space to leave untrimmed. If this argument is zero, only + the minimum amount of memory to maintain internal data structures + will be left. Non-zero arguments can be supplied to maintain enough + trailing space to service future expected allocations without having + to re-obtain memory from the system. + + Malloc_trim returns 1 if it actually released any memory, else 0. +*/ +int dlmalloc_trim(size_t); + +/* + malloc_usable_size(void* p); + + Returns the number of bytes you can actually use in + an allocated chunk, which may be more than you requested (although + often not) due to alignment and minimum size constraints. + You can use this many bytes without worrying about + overwriting other allocated objects. This is not a particularly great + programming practice. malloc_usable_size can be more useful in + debugging and assertions, for example: + + p = malloc(n); + assert(malloc_usable_size(p) >= 256); +*/ +size_t dlmalloc_usable_size(void*); + +/* + malloc_stats(); + Prints on stderr the amount of space obtained from the system (both + via sbrk and mmap), the maximum amount (which may be more than + current if malloc_trim and/or munmap got called), and the current + number of bytes allocated via malloc (or realloc, etc) but not yet + freed. Note that this is the number of bytes allocated, not the + number requested. It will be larger than the number requested + because of alignment and bookkeeping overhead. Because it includes + alignment wastage as being in use, this figure may be greater than + zero even when no user-level chunks are allocated. + + The reported current and maximum system memory can be inaccurate if + a program makes other calls to system memory allocation functions + (normally sbrk) outside of malloc. + + malloc_stats prints only the most commonly interesting statistics. + More information can be obtained by calling mallinfo. +*/ +void dlmalloc_stats(void); + +#endif /* ONLY_MSPACES */ + +#if MSPACES + +/* + mspace is an opaque type representing an independent + region of space that supports mspace_malloc, etc. +*/ +typedef void* mspace; + +/* + create_mspace creates and returns a new independent space with the + given initial capacity, or, if 0, the default granularity size. It + returns null if there is no system memory available to create the + space. If argument locked is non-zero, the space uses a separate + lock to control access. The capacity of the space will grow + dynamically as needed to service mspace_malloc requests. You can + control the sizes of incremental increases of this space by + compiling with a different DEFAULT_GRANULARITY or dynamically + setting with mallopt(M_GRANULARITY, value). +*/ +mspace create_mspace(size_t capacity, int locked); + +/* + destroy_mspace destroys the given space, and attempts to return all + of its memory back to the system, returning the total number of + bytes freed. After destruction, the results of access to all memory + used by the space become undefined. +*/ +size_t destroy_mspace(mspace msp); + +/* + create_mspace_with_base uses the memory supplied as the initial base + of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this + space is used for bookkeeping, so the capacity must be at least this + large. (Otherwise 0 is returned.) When this initial space is + exhausted, additional memory will be obtained from the system. + Destroying this space will deallocate all additionally allocated + space (if possible) but not the initial base. +*/ +mspace create_mspace_with_base(void* base, size_t capacity, int locked); + +/* + mspace_malloc behaves as malloc, but operates within + the given space. +*/ +void* mspace_malloc(mspace msp, size_t bytes); + +/* + mspace_free behaves as free, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_free is not actually needed. + free may be called instead of mspace_free because freed chunks from + any space are handled by their originating spaces. +*/ +void mspace_free(mspace msp, void* mem); + +/* + mspace_realloc behaves as realloc, but operates within + the given space. + + If compiled with FOOTERS==1, mspace_realloc is not actually + needed. realloc may be called instead of mspace_realloc because + realloced chunks from any space are handled by their originating + spaces. +*/ +void* mspace_realloc(mspace msp, void* mem, size_t newsize); + +/* + mspace_calloc behaves as calloc, but operates within + the given space. +*/ +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); + +/* + mspace_memalign behaves as memalign, but operates within + the given space. +*/ +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); + +/* + mspace_independent_calloc behaves as independent_calloc, but + operates within the given space. +*/ +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]); + +/* + mspace_independent_comalloc behaves as independent_comalloc, but + operates within the given space. +*/ +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]); + +/* + mspace_footprint() returns the number of bytes obtained from the + system for this space. +*/ +size_t mspace_footprint(mspace msp); + +/* + mspace_max_footprint() returns the peak number of bytes obtained from the + system for this space. +*/ +size_t mspace_max_footprint(mspace msp); + + +#if !NO_MALLINFO +/* + mspace_mallinfo behaves as mallinfo, but reports properties of + the given space. +*/ +struct mallinfo mspace_mallinfo(mspace msp); +#endif /* NO_MALLINFO */ + +/* + mspace_malloc_stats behaves as malloc_stats, but reports + properties of the given space. +*/ +void mspace_malloc_stats(mspace msp); + +/* + mspace_trim behaves as malloc_trim, but + operates within the given space. +*/ +int mspace_trim(mspace msp, size_t pad); + +/* + An alias for mallopt. +*/ +int mspace_mallopt(int, int); + +#endif /* MSPACES */ + +#ifdef __cplusplus +}; /* end of extern "C" */ +#endif /* __cplusplus */ + +/* + ======================================================================== + To make a fully customizable malloc.h header file, cut everything + above this line, put into file malloc.h, edit to suit, and #include it + on the next line, as well as in programs that use this malloc. + ======================================================================== +*/ + +/* #include "malloc.h" */ + +/*------------------------------ internal #includes ---------------------- */ + +#ifdef _MSC_VER +#pragma warning( disable : 4146 ) /* no "unsigned" warnings */ +#endif /* _MSC_VER */ + +#include <stdio.h> /* for printing in malloc_stats */ + +#ifndef LACKS_ERRNO_H +#include <errno.h> /* for MALLOC_FAILURE_ACTION */ +#endif /* LACKS_ERRNO_H */ +#if FOOTERS +#include <time.h> /* for magic initialization */ +#endif /* FOOTERS */ +#ifndef LACKS_STDLIB_H +#include <stdlib.h> /* for abort() */ +#endif /* LACKS_STDLIB_H */ +#ifdef DEBUG +#if ABORT_ON_ASSERT_FAILURE +#define assert(x) if(!(x)) ABORT +#else /* ABORT_ON_ASSERT_FAILURE */ +#include <assert.h> +#endif /* ABORT_ON_ASSERT_FAILURE */ +#else /* DEBUG */ +#define assert(x) +#endif /* DEBUG */ +#ifndef LACKS_STRING_H +#include <string.h> /* for memset etc */ +#endif /* LACKS_STRING_H */ +#if USE_BUILTIN_FFS +#ifndef LACKS_STRINGS_H +#include <strings.h> /* for ffs */ +#endif /* LACKS_STRINGS_H */ +#endif /* USE_BUILTIN_FFS */ +#if HAVE_MMAP +#ifndef LACKS_SYS_MMAN_H +#include <sys/mman.h> /* for mmap */ +#endif /* LACKS_SYS_MMAN_H */ +#ifndef LACKS_FCNTL_H +#include <fcntl.h> +#endif /* LACKS_FCNTL_H */ +#endif /* HAVE_MMAP */ +#if HAVE_MORECORE +#ifndef LACKS_UNISTD_H +#include <unistd.h> /* for sbrk */ +#else /* LACKS_UNISTD_H */ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) +extern void* sbrk(ptrdiff_t); +#endif /* FreeBSD etc */ +#endif /* LACKS_UNISTD_H */ +#endif /* HAVE_MMAP */ + +#ifndef WIN32 +#ifndef malloc_getpagesize +# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ +# ifndef _SC_PAGE_SIZE +# define _SC_PAGE_SIZE _SC_PAGESIZE +# endif +# endif +# ifdef _SC_PAGE_SIZE +# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) +# else +# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) + extern size_t getpagesize(); +# define malloc_getpagesize getpagesize() +# else +# ifdef WIN32 /* use supplied emulation of getpagesize */ +# define malloc_getpagesize getpagesize() +# else +# ifndef LACKS_SYS_PARAM_H +# include <sys/param.h> +# endif +# ifdef EXEC_PAGESIZE +# define malloc_getpagesize EXEC_PAGESIZE +# else +# ifdef NBPG +# ifndef CLSIZE +# define malloc_getpagesize NBPG +# else +# define malloc_getpagesize (NBPG * CLSIZE) +# endif +# else +# ifdef NBPC +# define malloc_getpagesize NBPC +# else +# ifdef PAGESIZE +# define malloc_getpagesize PAGESIZE +# else /* just guess */ +# define malloc_getpagesize ((size_t)4096U) +# endif +# endif +# endif +# endif +# endif +# endif +# endif +#endif +#endif + +/* ------------------- size_t and alignment properties -------------------- */ + +/* The byte and bit size of a size_t */ +#define SIZE_T_SIZE (sizeof(size_t)) +#define SIZE_T_BITSIZE (sizeof(size_t) << 3) + +/* Some constants coerced to size_t */ +/* Annoying but necessary to avoid errors on some platforms */ +#define SIZE_T_ZERO ((size_t)0) +#define SIZE_T_ONE ((size_t)1) +#define SIZE_T_TWO ((size_t)2) +#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) +#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) +#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) +#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) + +/* The bit mask value corresponding to MALLOC_ALIGNMENT */ +#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) + +/* True if address a has acceptable alignment */ +#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) + +/* the number of bytes to offset an address to align it */ +#define align_offset(A)\ + ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ + ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) + +/* -------------------------- MMAP preliminaries ------------------------- */ + +/* + If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and + checks to fail so compiler optimizer can delete code rather than + using so many "#if"s. +*/ + + +/* MORECORE and MMAP must return MFAIL on failure */ +#define MFAIL ((void*)(MAX_SIZE_T)) +#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ + +#if !HAVE_MMAP +#define IS_MMAPPED_BIT (SIZE_T_ZERO) +#define USE_MMAP_BIT (SIZE_T_ZERO) +#define CALL_MMAP(s) MFAIL +#define CALL_MUNMAP(a, s) (-1) +#define DIRECT_MMAP(s) MFAIL + +#else /* HAVE_MMAP */ +#define IS_MMAPPED_BIT (SIZE_T_ONE) +#define USE_MMAP_BIT (SIZE_T_ONE) + +#if !defined(WIN32) && !defined (__OS2__) +#define CALL_MUNMAP(a, s) munmap((a), (s)) +#define MMAP_PROT (PROT_READ|PROT_WRITE) +#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) +#define MAP_ANONYMOUS MAP_ANON +#endif /* MAP_ANON */ +#ifdef MAP_ANONYMOUS +#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) +#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) +#else /* MAP_ANONYMOUS */ +/* + Nearly all versions of mmap support MAP_ANONYMOUS, so the following + is unlikely to be needed, but is supplied just in case. +*/ +#define MMAP_FLAGS (MAP_PRIVATE) +static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ +#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ + (dev_zero_fd = open("/dev/zero", O_RDWR), \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ + mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) +#endif /* MAP_ANONYMOUS */ + +#define DIRECT_MMAP(s) CALL_MMAP(s) + +#elif defined(__OS2__) + +/* OS/2 MMAP via DosAllocMem */ +static void* os2mmap(size_t size) { + void* ptr; + if (DosAllocMem(&ptr, size, OBJ_ANY|PAG_COMMIT|PAG_READ|PAG_WRITE) && + DosAllocMem(&ptr, size, PAG_COMMIT|PAG_READ|PAG_WRITE)) + return MFAIL; + return ptr; +} + +#define os2direct_mmap(n) os2mmap(n) + +/* This function supports releasing coalesed segments */ +static int os2munmap(void* ptr, size_t size) { + while (size) { + ULONG ulSize = size; + ULONG ulFlags = 0; + if (DosQueryMem(ptr, &ulSize, &ulFlags) != 0) + return -1; + if ((ulFlags & PAG_BASE) == 0 ||(ulFlags & PAG_COMMIT) == 0 || + ulSize > size) + return -1; + if (DosFreeMem(ptr) != 0) + return -1; + ptr = ( void * ) ( ( char * ) ptr + ulSize ); + size -= ulSize; + } + return 0; +} + +#define CALL_MMAP(s) os2mmap(s) +#define CALL_MUNMAP(a, s) os2munmap((a), (s)) +#define DIRECT_MMAP(s) os2direct_mmap(s) + +#else /* WIN32 */ + +/* Win32 MMAP via VirtualAlloc */ +static void* win32mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ +static void* win32direct_mmap(size_t size) { + void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, + PAGE_EXECUTE_READWRITE); + return (ptr != 0)? ptr: MFAIL; +} + +/* This function supports releasing coalesed segments */ +static int win32munmap(void* ptr, size_t size) { + MEMORY_BASIC_INFORMATION minfo; + char* cptr = ptr; + while (size) { + if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) + return -1; + if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || + minfo.State != MEM_COMMIT || minfo.RegionSize > size) + return -1; + if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) + return -1; + cptr += minfo.RegionSize; + size -= minfo.RegionSize; + } + return 0; +} + +#define CALL_MMAP(s) win32mmap(s) +#define CALL_MUNMAP(a, s) win32munmap((a), (s)) +#define DIRECT_MMAP(s) win32direct_mmap(s) +#endif /* WIN32 */ +#endif /* HAVE_MMAP */ + +#if HAVE_MMAP && HAVE_MREMAP +#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) +#else /* HAVE_MMAP && HAVE_MREMAP */ +#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL +#endif /* HAVE_MMAP && HAVE_MREMAP */ + +#if HAVE_MORECORE +#define CALL_MORECORE(S) MORECORE(S) +#else /* HAVE_MORECORE */ +#define CALL_MORECORE(S) MFAIL +#endif /* HAVE_MORECORE */ + +/* mstate bit set if contiguous morecore disabled or failed */ +#define USE_NONCONTIGUOUS_BIT (4U) + +/* segment bit set in create_mspace_with_base */ +#define EXTERN_BIT (8U) + + +/* --------------------------- Lock preliminaries ------------------------ */ + +#if USE_LOCKS + +/* + When locks are defined, there are up to two global locks: + + * If HAVE_MORECORE, morecore_mutex protects sequences of calls to + MORECORE. In many cases sys_alloc requires two calls, that should + not be interleaved with calls by other threads. This does not + protect against direct calls to MORECORE by other threads not + using this lock, so there is still code to cope the best we can on + interference. + + * magic_init_mutex ensures that mparams.magic and other + unique mparams values are initialized only once. +*/ + +#if !defined(WIN32) && !defined(__OS2__) +/* By default use posix locks */ +#include <pthread.h> +#define MLOCK_T pthread_mutex_t +#define INITIAL_LOCK(l) pthread_mutex_init(l, NULL) +#define ACQUIRE_LOCK(l) pthread_mutex_lock(l) +#define RELEASE_LOCK(l) pthread_mutex_unlock(l) + +#if HAVE_MORECORE +static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif /* HAVE_MORECORE */ + +static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER; + +#elif defined(__OS2__) +#define MLOCK_T HMTX +#define INITIAL_LOCK(l) DosCreateMutexSem(0, l, 0, FALSE) +#define ACQUIRE_LOCK(l) DosRequestMutexSem(*l, SEM_INDEFINITE_WAIT) +#define RELEASE_LOCK(l) DosReleaseMutexSem(*l) +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +static MLOCK_T magic_init_mutex; + +#else /* WIN32 */ +/* + Because lock-protected regions have bounded times, and there + are no recursive lock calls, we can use simple spinlocks. +*/ + +#define MLOCK_T long +static int win32_acquire_lock (MLOCK_T *sl) { + for (;;) { +#ifdef InterlockedCompareExchangePointer + if (!InterlockedCompareExchange(sl, 1, 0)) + return 0; +#else /* Use older void* version */ + if (!InterlockedCompareExchange((void**)sl, (void*)1, (void*)0)) + return 0; +#endif /* InterlockedCompareExchangePointer */ + Sleep (0); + } +} + +static void win32_release_lock (MLOCK_T *sl) { + InterlockedExchange (sl, 0); +} + +#define INITIAL_LOCK(l) *(l)=0 +#define ACQUIRE_LOCK(l) win32_acquire_lock(l) +#define RELEASE_LOCK(l) win32_release_lock(l) +#if HAVE_MORECORE +static MLOCK_T morecore_mutex; +#endif /* HAVE_MORECORE */ +static MLOCK_T magic_init_mutex; +#endif /* WIN32 */ + +#define USE_LOCK_BIT (2U) +#else /* USE_LOCKS */ +#define USE_LOCK_BIT (0U) +#define INITIAL_LOCK(l) +#endif /* USE_LOCKS */ + +#if USE_LOCKS && HAVE_MORECORE +#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); +#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); +#else /* USE_LOCKS && HAVE_MORECORE */ +#define ACQUIRE_MORECORE_LOCK() +#define RELEASE_MORECORE_LOCK() +#endif /* USE_LOCKS && HAVE_MORECORE */ + +#if USE_LOCKS +#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); +#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); +#else /* USE_LOCKS */ +#define ACQUIRE_MAGIC_INIT_LOCK() +#define RELEASE_MAGIC_INIT_LOCK() +#endif /* USE_LOCKS */ + + +/* ----------------------- Chunk representations ------------------------ */ + +/* + (The following includes lightly edited explanations by Colin Plumb.) + + The malloc_chunk declaration below is misleading (but accurate and + necessary). It declares a "view" into memory allowing access to + necessary fields at known offsets from a given base. + + Chunks of memory are maintained using a `boundary tag' method as + originally described by Knuth. (See the paper by Paul Wilson + ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such + techniques.) Sizes of free chunks are stored both in the front of + each chunk and at the end. This makes consolidating fragmented + chunks into bigger chunks fast. The head fields also hold bits + representing whether chunks are free or in use. + + Here are some pictures to make it clearer. They are "exploded" to + show that the state of a chunk can be thought of as extending from + the high 31 bits of the head field of its header through the + prev_foot and PINUSE_BIT bit of the following chunk header. + + A chunk that's in use looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk (if P = 1) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 1| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + +- -+ + | | + +- -+ + | : + +- size - sizeof(size_t) available payload bytes -+ + : | + chunk-> +- -+ + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| + | Size of next chunk (may or may not be in use) | +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + And if it's free, it looks like this: + + chunk-> +- -+ + | User payload (must be in use, or we would have merged!) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| + | Size of this chunk 0| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Next pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Prev pointer | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- size - sizeof(struct chunk) unused bytes -+ + : | + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| + | Size of next chunk (must be in use, or we would have merged)| +-+ + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | : + +- User payload -+ + : | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |0| + +-+ + Note that since we always merge adjacent free chunks, the chunks + adjacent to a free chunk must be in use. + + Given a pointer to a chunk (which can be derived trivially from the + payload pointer) we can, in O(1) time, find out whether the adjacent + chunks are free, and if so, unlink them from the lists that they + are on and merge them with the current chunk. + + Chunks always begin on even word boundaries, so the mem portion + (which is returned to the user) is also on an even word boundary, and + thus at least double-word aligned. + + The P (PINUSE_BIT) bit, stored in the unused low-order bit of the + chunk size (which is always a multiple of two words), is an in-use + bit for the *previous* chunk. If that bit is *clear*, then the + word before the current chunk size contains the previous chunk + size, and can be used to find the front of the previous chunk. + The very first chunk allocated always has this bit set, preventing + access to non-existent (or non-owned) memory. If pinuse is set for + any given chunk, then you CANNOT determine the size of the + previous chunk, and might even get a memory addressing fault when + trying to do so. + + The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of + the chunk size redundantly records whether the current chunk is + inuse. This redundancy enables usage checks within free and realloc, + and reduces indirection when freeing and consolidating chunks. + + Each freshly allocated chunk must have both cinuse and pinuse set. + That is, each allocated chunk borders either a previously allocated + and still in-use chunk, or the base of its memory arena. This is + ensured by making all allocations from the the `lowest' part of any + found chunk. Further, no free chunk physically borders another one, + so each free chunk is known to be preceded and followed by either + inuse chunks or the ends of memory. + + Note that the `foot' of the current chunk is actually represented + as the prev_foot of the NEXT chunk. This makes it easier to + deal with alignments etc but can be very confusing when trying + to extend or adapt this code. + + The exceptions to all this are + + 1. The special chunk `top' is the top-most available chunk (i.e., + the one bordering the end of available memory). It is treated + specially. Top is never included in any bin, is used only if + no other chunk is available, and is released back to the + system if it is very large (see M_TRIM_THRESHOLD). In effect, + the top chunk is treated as larger (and thus less well + fitting) than any other available chunk. The top chunk + doesn't update its trailing size field since there is no next + contiguous chunk that would have to index off it. However, + space is still allocated for it (TOP_FOOT_SIZE) to enable + separation or merging when space is extended. + + 3. Chunks allocated via mmap, which have the lowest-order bit + (IS_MMAPPED_BIT) set in their prev_foot fields, and do not set + PINUSE_BIT in their head fields. Because they are allocated + one-by-one, each must carry its own prev_foot field, which is + also used to hold the offset this chunk has within its mmapped + region, which is needed to preserve alignment. Each mmapped + chunk is trailed by the first two fields of a fake next-chunk + for sake of usage checks. + +*/ + +struct malloc_chunk { + size_t prev_foot; /* Size of previous chunk (if free). */ + size_t head; /* Size and inuse bits. */ + struct malloc_chunk* fd; /* double links -- used only if free. */ + struct malloc_chunk* bk; +}; + +typedef struct malloc_chunk mchunk; +typedef struct malloc_chunk* mchunkptr; +typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ +typedef size_t bindex_t; /* Described below */ +typedef unsigned int binmap_t; /* Described below */ +typedef unsigned int flag_t; /* The type of various bit flag sets */ + +/* ------------------- Chunks sizes and alignments ----------------------- */ + +#define MCHUNK_SIZE (sizeof(mchunk)) + +#if FOOTERS +#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +#else /* FOOTERS */ +#define CHUNK_OVERHEAD (SIZE_T_SIZE) +#endif /* FOOTERS */ + +/* MMapped chunks need a second word of overhead ... */ +#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) +/* ... and additional padding for fake next-chunk at foot */ +#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) + +/* The smallest size we can malloc is an aligned minimal chunk */ +#define MIN_CHUNK_SIZE\ + ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* conversion from malloc headers to user pointers, and back */ +#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) +#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) +/* chunk associated with aligned address A */ +#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) + +/* Bounds on request (not chunk) sizes. */ +#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) +#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) + +/* pad request bytes into a usable size */ +#define pad_request(req) \ + (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) + +/* pad request, checking for minimum (but not maximum) */ +#define request2size(req) \ + (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) + + +/* ------------------ Operations on head and foot fields ----------------- */ + +/* + The head field of a chunk is or'ed with PINUSE_BIT when previous + adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in + use. If the chunk was obtained with mmap, the prev_foot field has + IS_MMAPPED_BIT set, otherwise holding the offset of the base of the + mmapped region to the base of the chunk. +*/ + +#define PINUSE_BIT (SIZE_T_ONE) +#define CINUSE_BIT (SIZE_T_TWO) +#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) + +/* Head value for fenceposts */ +#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) + +/* extraction of fields from head words */ +#define cinuse(p) ((p)->head & CINUSE_BIT) +#define pinuse(p) ((p)->head & PINUSE_BIT) +#define chunksize(p) ((p)->head & ~(INUSE_BITS)) + +#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) +#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) + +/* Treat space at ptr +/- offset as a chunk */ +#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) +#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) + +/* Ptr to next or previous physical malloc_chunk. */ +#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) +#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) + +/* extract next chunk's pinuse bit */ +#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) + +/* Get/set size at footer */ +#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) +#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) + +/* Set size, pinuse bit, and foot */ +#define set_size_and_pinuse_of_free_chunk(p, s)\ + ((p)->head = (s|PINUSE_BIT), set_foot(p, s)) + +/* Set size, pinuse bit, foot, and clear next pinuse */ +#define set_free_with_pinuse(p, s, n)\ + (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) + +#define is_mmapped(p)\ + (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) + +/* Get the internal overhead associated with chunk p */ +#define overhead_for(p)\ + (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) + +/* Return true if malloced space is not necessarily cleared */ +#if MMAP_CLEARS +#define calloc_must_clear(p) (!is_mmapped(p)) +#else /* MMAP_CLEARS */ +#define calloc_must_clear(p) (1) +#endif /* MMAP_CLEARS */ + +/* ---------------------- Overlaid data structures ----------------------- */ + +/* + When chunks are not in use, they are treated as nodes of either + lists or trees. + + "Small" chunks are stored in circular doubly-linked lists, and look + like this: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk in list | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space (may be 0 bytes long) . + . . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Larger chunks are kept in a form of bitwise digital trees (aka + tries) keyed on chunksizes. Because malloc_tree_chunks are only for + free chunks greater than 256 bytes, their size doesn't impose any + constraints on user chunk sizes. Each node looks like: + + chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Size of previous chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `head:' | Size of chunk, in bytes |P| + mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Forward pointer to next chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Back pointer to previous chunk of same size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to left child (child[0]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to right child (child[1]) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Pointer to parent | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | bin index of this chunk | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Unused space . + . | +nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + `foot:' | Size of chunk, in bytes | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Each tree holding treenodes is a tree of unique chunk sizes. Chunks + of the same size are arranged in a circularly-linked list, with only + the oldest chunk (the next to be used, in our FIFO ordering) + actually in the tree. (Tree members are distinguished by a non-null + parent pointer.) If a chunk with the same size an an existing node + is inserted, it is linked off the existing node using pointers that + work in the same way as fd/bk pointers of small chunks. + + Each tree contains a power of 2 sized range of chunk sizes (the + smallest is 0x100 <= x < 0x180), which is is divided in half at each + tree level, with the chunks in the smaller half of the range (0x100 + <= x < 0x140 for the top nose) in the left subtree and the larger + half (0x140 <= x < 0x180) in the right subtree. This is, of course, + done by inspecting individual bits. + + Using these rules, each node's left subtree contains all smaller + sizes than its right subtree. However, the node at the root of each + subtree has no particular ordering relationship to either. (The + dividing line between the subtree sizes is based on trie relation.) + If we remove the last chunk of a given size from the interior of the + tree, we need to replace it with a leaf node. The tree ordering + rules permit a node to be replaced by any leaf below it. + + The smallest chunk in a tree (a common operation in a best-fit + allocator) can be found by walking a path to the leftmost leaf in + the tree. Unlike a usual binary tree, where we follow left child + pointers until we reach a null, here we follow the right child + pointer any time the left one is null, until we reach a leaf with + both child pointers null. The smallest chunk in the tree will be + somewhere along that path. + + The worst case number of steps to add, find, or remove a node is + bounded by the number of bits differentiating chunks within + bins. Under current bin calculations, this ranges from 6 up to 21 + (for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case + is of course much better. +*/ + +struct malloc_tree_chunk { + /* The first four fields must be compatible with malloc_chunk */ + size_t prev_foot; + size_t head; + struct malloc_tree_chunk* fd; + struct malloc_tree_chunk* bk; + + struct malloc_tree_chunk* child[2]; + struct malloc_tree_chunk* parent; + bindex_t index; +}; + +typedef struct malloc_tree_chunk tchunk; +typedef struct malloc_tree_chunk* tchunkptr; +typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ + +/* A little helper macro for trees */ +#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) + +/* ----------------------------- Segments -------------------------------- */ + +/* + Each malloc space may include non-contiguous segments, held in a + list headed by an embedded malloc_segment record representing the + top-most space. Segments also include flags holding properties of + the space. Large chunks that are directly allocated by mmap are not + included in this list. They are instead independently created and + destroyed without otherwise keeping track of them. + + Segment management mainly comes into play for spaces allocated by + MMAP. Any call to MMAP might or might not return memory that is + adjacent to an existing segment. MORECORE normally contiguously + extends the current space, so this space is almost always adjacent, + which is simpler and faster to deal with. (This is why MORECORE is + used preferentially to MMAP when both are available -- see + sys_alloc.) When allocating using MMAP, we don't use any of the + hinting mechanisms (inconsistently) supported in various + implementations of unix mmap, or distinguish reserving from + committing memory. Instead, we just ask for space, and exploit + contiguity when we get it. It is probably possible to do + better than this on some systems, but no general scheme seems + to be significantly better. + + Management entails a simpler variant of the consolidation scheme + used for chunks to reduce fragmentation -- new adjacent memory is + normally prepended or appended to an existing segment. However, + there are limitations compared to chunk consolidation that mostly + reflect the fact that segment processing is relatively infrequent + (occurring only when getting memory from system) and that we + don't expect to have huge numbers of segments: + + * Segments are not indexed, so traversal requires linear scans. (It + would be possible to index these, but is not worth the extra + overhead and complexity for most programs on most platforms.) + * New segments are only appended to old ones when holding top-most + memory; if they cannot be prepended to others, they are held in + different segments. + + Except for the top-most segment of an mstate, each segment record + is kept at the tail of its segment. Segments are added by pushing + segment records onto the list headed by &mstate.seg for the + containing mstate. + + Segment flags control allocation/merge/deallocation policies: + * If EXTERN_BIT set, then we did not allocate this segment, + and so should not try to deallocate or merge with others. + (This currently holds only for the initial segment passed + into create_mspace_with_base.) + * If IS_MMAPPED_BIT set, the segment may be merged with + other surrounding mmapped segments and trimmed/de-allocated + using munmap. + * If neither bit is set, then the segment was obtained using + MORECORE so can be merged with surrounding MORECORE'd segments + and deallocated/trimmed using MORECORE with negative arguments. +*/ + +struct malloc_segment { + char* base; /* base address */ + size_t size; /* allocated size */ + struct malloc_segment* next; /* ptr to next segment */ +#if FFI_MMAP_EXEC_WRIT + /* The mmap magic is supposed to store the address of the executable + segment at the very end of the requested block. */ + +# define mmap_exec_offset(b,s) (*(ptrdiff_t*)((b)+(s)-sizeof(ptrdiff_t))) + + /* We can only merge segments if their corresponding executable + segments are at identical offsets. */ +# define check_segment_merge(S,b,s) \ + (mmap_exec_offset((b),(s)) == (S)->exec_offset) + +# define add_segment_exec_offset(p,S) ((char*)(p) + (S)->exec_offset) +# define sub_segment_exec_offset(p,S) ((char*)(p) - (S)->exec_offset) + + /* The removal of sflags only works with HAVE_MORECORE == 0. */ + +# define get_segment_flags(S) (IS_MMAPPED_BIT) +# define set_segment_flags(S,v) \ + (((v) != IS_MMAPPED_BIT) ? (ABORT, (v)) : \ + (((S)->exec_offset = \ + mmap_exec_offset((S)->base, (S)->size)), \ + (mmap_exec_offset((S)->base + (S)->exec_offset, (S)->size) != \ + (S)->exec_offset) ? (ABORT, (v)) : \ + (mmap_exec_offset((S)->base, (S)->size) = 0), (v))) + + /* We use an offset here, instead of a pointer, because then, when + base changes, we don't have to modify this. On architectures + with segmented addresses, this might not work. */ + ptrdiff_t exec_offset; +#else + +# define get_segment_flags(S) ((S)->sflags) +# define set_segment_flags(S,v) ((S)->sflags = (v)) +# define check_segment_merge(S,b,s) (1) + + flag_t sflags; /* mmap and extern flag */ +#endif +}; + +#define is_mmapped_segment(S) (get_segment_flags(S) & IS_MMAPPED_BIT) +#define is_extern_segment(S) (get_segment_flags(S) & EXTERN_BIT) + +typedef struct malloc_segment msegment; +typedef struct malloc_segment* msegmentptr; + +/* ---------------------------- malloc_state ----------------------------- */ + +/* + A malloc_state holds all of the bookkeeping for a space. + The main fields are: + + Top + The topmost chunk of the currently active segment. Its size is + cached in topsize. The actual size of topmost space is + topsize+TOP_FOOT_SIZE, which includes space reserved for adding + fenceposts and segment records if necessary when getting more + space from the system. The size at which to autotrim top is + cached from mparams in trim_check, except that it is disabled if + an autotrim fails. + + Designated victim (dv) + This is the preferred chunk for servicing small requests that + don't have exact fits. It is normally the chunk split off most + recently to service another small request. Its size is cached in + dvsize. The link fields of this chunk are not maintained since it + is not kept in a bin. + + SmallBins + An array of bin headers for free chunks. These bins hold chunks + with sizes less than MIN_LARGE_SIZE bytes. Each bin contains + chunks of all the same size, spaced 8 bytes apart. To simplify + use in double-linked lists, each bin header acts as a malloc_chunk + pointing to the real first node, if it exists (else pointing to + itself). This avoids special-casing for headers. But to avoid + waste, we allocate only the fd/bk pointers of bins, and then use + repositioning tricks to treat these as the fields of a chunk. + + TreeBins + Treebins are pointers to the roots of trees holding a range of + sizes. There are 2 equally spaced treebins for each power of two + from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything + larger. + + Bin maps + There is one bit map for small bins ("smallmap") and one for + treebins ("treemap). Each bin sets its bit when non-empty, and + clears the bit when empty. Bit operations are then used to avoid + bin-by-bin searching -- nearly all "search" is done without ever + looking at bins that won't be selected. The bit maps + conservatively use 32 bits per map word, even if on 64bit system. + For a good description of some of the bit-based techniques used + here, see Henry S. Warren Jr's book "Hacker's Delight" (and + supplement at http://hackersdelight.org/). Many of these are + intended to reduce the branchiness of paths through malloc etc, as + well as to reduce the number of memory locations read or written. + + Segments + A list of segments headed by an embedded malloc_segment record + representing the initial space. + + Address check support + The least_addr field is the least address ever obtained from + MORECORE or MMAP. Attempted frees and reallocs of any address less + than this are trapped (unless INSECURE is defined). + + Magic tag + A cross-check field that should always hold same value as mparams.magic. + + Flags + Bits recording whether to use MMAP, locks, or contiguous MORECORE + + Statistics + Each space keeps track of current and maximum system memory + obtained via MORECORE or MMAP. + + Locking + If USE_LOCKS is defined, the "mutex" lock is acquired and released + around every public call using this mspace. +*/ + +/* Bin types, widths and sizes */ +#define NSMALLBINS (32U) +#define NTREEBINS (32U) +#define SMALLBIN_SHIFT (3U) +#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) +#define TREEBIN_SHIFT (8U) +#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) +#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) +#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) + +struct malloc_state { + binmap_t smallmap; + binmap_t treemap; + size_t dvsize; + size_t topsize; + char* least_addr; + mchunkptr dv; + mchunkptr top; + size_t trim_check; + size_t magic; + mchunkptr smallbins[(NSMALLBINS+1)*2]; + tbinptr treebins[NTREEBINS]; + size_t footprint; + size_t max_footprint; + flag_t mflags; +#if USE_LOCKS + MLOCK_T mutex; /* locate lock among fields that rarely change */ +#endif /* USE_LOCKS */ + msegment seg; +}; + +typedef struct malloc_state* mstate; + +/* ------------- Global malloc_state and malloc_params ------------------- */ + +/* + malloc_params holds global properties, including those that can be + dynamically set using mallopt. There is a single instance, mparams, + initialized in init_mparams. +*/ + +struct malloc_params { + size_t magic; + size_t page_size; + size_t granularity; + size_t mmap_threshold; + size_t trim_threshold; + flag_t default_mflags; +}; + +static struct malloc_params mparams; + +/* The global malloc_state used for all non-"mspace" calls */ +static struct malloc_state _gm_; +#define gm (&_gm_) +#define is_global(M) ((M) == &_gm_) +#define is_initialized(M) ((M)->top != 0) + +/* -------------------------- system alloc setup ------------------------- */ + +/* Operations on mflags */ + +#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) +#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) +#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) + +#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) +#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) +#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) + +#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) +#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) + +#define set_lock(M,L)\ + ((M)->mflags = (L)?\ + ((M)->mflags | USE_LOCK_BIT) :\ + ((M)->mflags & ~USE_LOCK_BIT)) + +/* page-align a size */ +#define page_align(S)\ + (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) + +/* granularity-align a size */ +#define granularity_align(S)\ + (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) + +#define is_page_aligned(S)\ + (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) +#define is_granularity_aligned(S)\ + (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) + +/* True if segment S holds address A */ +#define segment_holds(S, A)\ + ((char*)(A) >= S->base && (char*)(A) < S->base + S->size) + +/* Return segment holding given address */ +static msegmentptr segment_holding(mstate m, char* addr) { + msegmentptr sp = &m->seg; + for (;;) { + if (addr >= sp->base && addr < sp->base + sp->size) + return sp; + if ((sp = sp->next) == 0) + return 0; + } +} + +/* Return true if segment contains a segment link */ +static int has_segment_link(mstate m, msegmentptr ss) { + msegmentptr sp = &m->seg; + for (;;) { + if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) + return 1; + if ((sp = sp->next) == 0) + return 0; + } +} + +#ifndef MORECORE_CANNOT_TRIM +#define should_trim(M,s) ((s) > (M)->trim_check) +#else /* MORECORE_CANNOT_TRIM */ +#define should_trim(M,s) (0) +#endif /* MORECORE_CANNOT_TRIM */ + +/* + TOP_FOOT_SIZE is padding at the end of a segment, including space + that may be needed to place segment records and fenceposts when new + noncontiguous segments are added. +*/ +#define TOP_FOOT_SIZE\ + (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) + + +/* ------------------------------- Hooks -------------------------------- */ + +/* + PREACTION should be defined to return 0 on success, and nonzero on + failure. If you are not using locking, you can redefine these to do + anything you like. +*/ + +#if USE_LOCKS + +/* Ensure locks are initialized */ +#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) + +#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) +#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } +#else /* USE_LOCKS */ + +#ifndef PREACTION +#define PREACTION(M) (0) +#endif /* PREACTION */ + +#ifndef POSTACTION +#define POSTACTION(M) +#endif /* POSTACTION */ + +#endif /* USE_LOCKS */ + +/* + CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. + USAGE_ERROR_ACTION is triggered on detected bad frees and + reallocs. The argument p is an address that might have triggered the + fault. It is ignored by the two predefined actions, but might be + useful in custom actions that try to help diagnose errors. +*/ + +#if PROCEED_ON_ERROR + +/* A count of the number of corruption errors causing resets */ +int malloc_corruption_error_count; + +/* default corruption action */ +static void reset_on_error(mstate m); + +#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) +#define USAGE_ERROR_ACTION(m, p) + +#else /* PROCEED_ON_ERROR */ + +#ifndef CORRUPTION_ERROR_ACTION +#define CORRUPTION_ERROR_ACTION(m) ABORT +#endif /* CORRUPTION_ERROR_ACTION */ + +#ifndef USAGE_ERROR_ACTION +#define USAGE_ERROR_ACTION(m,p) ABORT +#endif /* USAGE_ERROR_ACTION */ + +#endif /* PROCEED_ON_ERROR */ + +/* -------------------------- Debugging setup ---------------------------- */ + +#if ! DEBUG + +#define check_free_chunk(M,P) +#define check_inuse_chunk(M,P) +#define check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) +#define check_malloc_state(M) +#define check_top_chunk(M,P) + +#else /* DEBUG */ +#define check_free_chunk(M,P) do_check_free_chunk(M,P) +#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) +#define check_top_chunk(M,P) do_check_top_chunk(M,P) +#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) +#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) +#define check_malloc_state(M) do_check_malloc_state(M) + +static void do_check_any_chunk(mstate m, mchunkptr p); +static void do_check_top_chunk(mstate m, mchunkptr p); +static void do_check_mmapped_chunk(mstate m, mchunkptr p); +static void do_check_inuse_chunk(mstate m, mchunkptr p); +static void do_check_free_chunk(mstate m, mchunkptr p); +static void do_check_malloced_chunk(mstate m, void* mem, size_t s); +static void do_check_tree(mstate m, tchunkptr t); +static void do_check_treebin(mstate m, bindex_t i); +static void do_check_smallbin(mstate m, bindex_t i); +static void do_check_malloc_state(mstate m); +static int bin_find(mstate m, mchunkptr x); +static size_t traverse_and_check(mstate m); +#endif /* DEBUG */ + +/* ---------------------------- Indexing Bins ---------------------------- */ + +#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) +#define small_index(s) ((s) >> SMALLBIN_SHIFT) +#define small_index2size(i) ((i) << SMALLBIN_SHIFT) +#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) + +/* addressing by index. See above about smallbin repositioning */ +#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) +#define treebin_at(M,i) (&((M)->treebins[i])) + +/* assign tree index for size S to variable I */ +#if defined(__GNUC__) && defined(__i386__) +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int K;\ + __asm__("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ + I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ + }\ +} +#else /* GNUC */ +#define compute_tree_index(S, I)\ +{\ + size_t X = S >> TREEBIN_SHIFT;\ + if (X == 0)\ + I = 0;\ + else if (X > 0xFFFF)\ + I = NTREEBINS-1;\ + else {\ + unsigned int Y = (unsigned int)X;\ + unsigned int N = ((Y - 0x100) >> 16) & 8;\ + unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ + N += K;\ + N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ + K = 14 - N + ((Y <<= K) >> 15);\ + I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ + }\ +} +#endif /* GNUC */ + +/* Bit representing maximum resolved size in a treebin at i */ +#define bit_for_tree_index(i) \ + (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) + +/* Shift placing maximum resolved bit in a treebin at i as sign bit */ +#define leftshift_for_tree_index(i) \ + ((i == NTREEBINS-1)? 0 : \ + ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) + +/* The size of the smallest chunk held in bin with index i */ +#define minsize_for_tree_index(i) \ + ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ + (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) + + +/* ------------------------ Operations on bin maps ----------------------- */ + +/* bit corresponding to given index */ +#define idx2bit(i) ((binmap_t)(1) << (i)) + +/* Mark/Clear bits with given index */ +#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) +#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) +#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) + +#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) +#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) +#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) + +/* index corresponding to given bit */ + +#if defined(__GNUC__) && defined(__i386__) +#define compute_bit2idx(X, I)\ +{\ + unsigned int J;\ + __asm__("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ + I = (bindex_t)J;\ +} + +#else /* GNUC */ +#if USE_BUILTIN_FFS +#define compute_bit2idx(X, I) I = __builtin_ffs(X)-1 + +#else /* USE_BUILTIN_FFS */ +#define compute_bit2idx(X, I)\ +{\ + unsigned int Y = X - 1;\ + unsigned int K = Y >> (16-4) & 16;\ + unsigned int N = K; Y >>= K;\ + N += K = Y >> (8-3) & 8; Y >>= K;\ + N += K = Y >> (4-2) & 4; Y >>= K;\ + N += K = Y >> (2-1) & 2; Y >>= K;\ + N += K = Y >> (1-0) & 1; Y >>= K;\ + I = (bindex_t)(N + Y);\ +} +#endif /* USE_BUILTIN_FFS */ +#endif /* GNUC */ + +/* isolate the least set bit of a bitmap */ +#define least_bit(x) ((x) & -(x)) + +/* mask with all bits to left of least bit of x on */ +#define left_bits(x) ((x<<1) | -(x<<1)) + +/* mask with all bits to left of or equal to least bit of x on */ +#define same_or_left_bits(x) ((x) | -(x)) + + +/* ----------------------- Runtime Check Support ------------------------- */ + +/* + For security, the main invariant is that malloc/free/etc never + writes to a static address other than malloc_state, unless static + malloc_state itself has been corrupted, which cannot occur via + malloc (because of these checks). In essence this means that we + believe all pointers, sizes, maps etc held in malloc_state, but + check all of those linked or offsetted from other embedded data + structures. These checks are interspersed with main code in a way + that tends to minimize their run-time cost. + + When FOOTERS is defined, in addition to range checking, we also + verify footer fields of inuse chunks, which can be used guarantee + that the mstate controlling malloc/free is intact. This is a + streamlined version of the approach described by William Robertson + et al in "Run-time Detection of Heap-based Overflows" LISA'03 + http://www.usenix.org/events/lisa03/tech/robertson.html The footer + of an inuse chunk holds the xor of its mstate and a random seed, + that is checked upon calls to free() and realloc(). This is + (probablistically) unguessable from outside the program, but can be + computed by any code successfully malloc'ing any chunk, so does not + itself provide protection against code that has already broken + security through some other means. Unlike Robertson et al, we + always dynamically check addresses of all offset chunks (previous, + next, etc). This turns out to be cheaper than relying on hashes. +*/ + +#if !INSECURE +/* Check if address a is at least as high as any from MORECORE or MMAP */ +#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) +/* Check if address of next chunk n is higher than base chunk p */ +#define ok_next(p, n) ((char*)(p) < (char*)(n)) +/* Check if p has its cinuse bit on */ +#define ok_cinuse(p) cinuse(p) +/* Check if p has its pinuse bit on */ +#define ok_pinuse(p) pinuse(p) + +#else /* !INSECURE */ +#define ok_address(M, a) (1) +#define ok_next(b, n) (1) +#define ok_cinuse(p) (1) +#define ok_pinuse(p) (1) +#endif /* !INSECURE */ + +#if (FOOTERS && !INSECURE) +/* Check if (alleged) mstate m has expected magic field */ +#define ok_magic(M) ((M)->magic == mparams.magic) +#else /* (FOOTERS && !INSECURE) */ +#define ok_magic(M) (1) +#endif /* (FOOTERS && !INSECURE) */ + + +/* In gcc, use __builtin_expect to minimize impact of checks */ +#if !INSECURE +#if defined(__GNUC__) && __GNUC__ >= 3 +#define RTCHECK(e) __builtin_expect(e, 1) +#else /* GNUC */ +#define RTCHECK(e) (e) +#endif /* GNUC */ +#else /* !INSECURE */ +#define RTCHECK(e) (1) +#endif /* !INSECURE */ + +/* macros to set up inuse chunks with or without footers */ + +#if !FOOTERS + +#define mark_inuse_foot(M,p,s) + +/* Set cinuse bit and pinuse bit of next chunk */ +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + ((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) + +/* Set size, cinuse and pinuse bit of this chunk */ +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) + +#else /* FOOTERS */ + +/* Set foot of inuse chunk to be xor of mstate and seed */ +#define mark_inuse_foot(M,p,s)\ + (((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) + +#define get_mstate_for(p)\ + ((mstate)(((mchunkptr)((char*)(p) +\ + (chunksize(p))))->prev_foot ^ mparams.magic)) + +#define set_inuse(M,p,s)\ + ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ + mark_inuse_foot(M,p,s)) + +#define set_inuse_and_pinuse(M,p,s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + (((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ + mark_inuse_foot(M,p,s)) + +#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ + ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ + mark_inuse_foot(M, p, s)) + +#endif /* !FOOTERS */ + +/* ---------------------------- setting mparams -------------------------- */ + +/* Initialize mparams */ +static int init_mparams(void) { + if (mparams.page_size == 0) { + size_t s; + + mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; + mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; +#if MORECORE_CONTIGUOUS + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; +#else /* MORECORE_CONTIGUOUS */ + mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; +#endif /* MORECORE_CONTIGUOUS */ + +#if (FOOTERS && !INSECURE) + { +#if USE_DEV_RANDOM + int fd; + unsigned char buf[sizeof(size_t)]; + /* Try to use /dev/urandom, else fall back on using time */ + if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && + read(fd, buf, sizeof(buf)) == sizeof(buf)) { + s = *((size_t *) buf); + close(fd); + } + else +#endif /* USE_DEV_RANDOM */ + s = (size_t)(time(0) ^ (size_t)0x55555555U); + + s |= (size_t)8U; /* ensure nonzero */ + s &= ~(size_t)7U; /* improve chances of fault for bad values */ + + } +#else /* (FOOTERS && !INSECURE) */ + s = (size_t)0x58585858U; +#endif /* (FOOTERS && !INSECURE) */ + ACQUIRE_MAGIC_INIT_LOCK(); + if (mparams.magic == 0) { + mparams.magic = s; + /* Set up lock for main malloc area */ + INITIAL_LOCK(&gm->mutex); + gm->mflags = mparams.default_mflags; + } + RELEASE_MAGIC_INIT_LOCK(); + +#if !defined(WIN32) && !defined(__OS2__) + mparams.page_size = malloc_getpagesize; + mparams.granularity = ((DEFAULT_GRANULARITY != 0)? + DEFAULT_GRANULARITY : mparams.page_size); +#elif defined (__OS2__) + /* if low-memory is used, os2munmap() would break + if it were anything other than 64k */ + mparams.page_size = 4096u; + mparams.granularity = 65536u; +#else /* WIN32 */ + { + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + mparams.page_size = system_info.dwPageSize; + mparams.granularity = system_info.dwAllocationGranularity; + } +#endif /* WIN32 */ + + /* Sanity-check configuration: + size_t must be unsigned and as wide as pointer type. + ints must be at least 4 bytes. + alignment must be at least 8. + Alignment, min chunk size, and page size must all be powers of 2. + */ + if ((sizeof(size_t) != sizeof(char*)) || + (MAX_SIZE_T < MIN_CHUNK_SIZE) || + (sizeof(int) < 4) || + (MALLOC_ALIGNMENT < (size_t)8U) || + ((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || + ((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || + ((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || + ((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) + ABORT; + } + return 0; +} + +/* support for mallopt */ +static int change_mparam(int param_number, int value) { + size_t val = (size_t)value; + init_mparams(); + switch(param_number) { + case M_TRIM_THRESHOLD: + mparams.trim_threshold = val; + return 1; + case M_GRANULARITY: + if (val >= mparams.page_size && ((val & (val-1)) == 0)) { + mparams.granularity = val; + return 1; + } + else + return 0; + case M_MMAP_THRESHOLD: + mparams.mmap_threshold = val; + return 1; + default: + return 0; + } +} + +#if DEBUG +/* ------------------------- Debugging Support --------------------------- */ + +/* Check properties of any chunk, whether free, inuse, mmapped etc */ +static void do_check_any_chunk(mstate m, mchunkptr p) { + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); +} + +/* Check properties of top chunk */ +static void do_check_top_chunk(mstate m, mchunkptr p) { + msegmentptr sp = segment_holding(m, (char*)p); + size_t sz = chunksize(p); + assert(sp != 0); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(sz == m->topsize); + assert(sz > 0); + assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); + assert(pinuse(p)); + assert(!next_pinuse(p)); +} + +/* Check properties of (inuse) mmapped chunks */ +static void do_check_mmapped_chunk(mstate m, mchunkptr p) { + size_t sz = chunksize(p); + size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); + assert(is_mmapped(p)); + assert(use_mmap(m)); + assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); + assert(ok_address(m, p)); + assert(!is_small(sz)); + assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); + assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); + assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); +} + +/* Check properties of inuse chunks */ +static void do_check_inuse_chunk(mstate m, mchunkptr p) { + do_check_any_chunk(m, p); + assert(cinuse(p)); + assert(next_pinuse(p)); + /* If not pinuse and not mmapped, previous chunk has OK offset */ + assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); + if (is_mmapped(p)) + do_check_mmapped_chunk(m, p); +} + +/* Check properties of free chunks */ +static void do_check_free_chunk(mstate m, mchunkptr p) { + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + mchunkptr next = chunk_plus_offset(p, sz); + do_check_any_chunk(m, p); + assert(!cinuse(p)); + assert(!next_pinuse(p)); + assert (!is_mmapped(p)); + if (p != m->dv && p != m->top) { + if (sz >= MIN_CHUNK_SIZE) { + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(is_aligned(chunk2mem(p))); + assert(next->prev_foot == sz); + assert(pinuse(p)); + assert (next == m->top || cinuse(next)); + assert(p->fd->bk == p); + assert(p->bk->fd == p); + } + else /* markers are always of size SIZE_T_SIZE */ + assert(sz == SIZE_T_SIZE); + } +} + +/* Check properties of malloced chunks at the point they are malloced */ +static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); + do_check_inuse_chunk(m, p); + assert((sz & CHUNK_ALIGN_MASK) == 0); + assert(sz >= MIN_CHUNK_SIZE); + assert(sz >= s); + /* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ + assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); + } +} + +/* Check a tree and its subtrees. */ +static void do_check_tree(mstate m, tchunkptr t) { + tchunkptr head = 0; + tchunkptr u = t; + bindex_t tindex = t->index; + size_t tsize = chunksize(t); + bindex_t idx; + compute_tree_index(tsize, idx); + assert(tindex == idx); + assert(tsize >= MIN_LARGE_SIZE); + assert(tsize >= minsize_for_tree_index(idx)); + assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); + + do { /* traverse through chain of same-sized nodes */ + do_check_any_chunk(m, ((mchunkptr)u)); + assert(u->index == tindex); + assert(chunksize(u) == tsize); + assert(!cinuse(u)); + assert(!next_pinuse(u)); + assert(u->fd->bk == u); + assert(u->bk->fd == u); + if (u->parent == 0) { + assert(u->child[0] == 0); + assert(u->child[1] == 0); + } + else { + assert(head == 0); /* only one node on chain has parent */ + head = u; + assert(u->parent != u); + assert (u->parent->child[0] == u || + u->parent->child[1] == u || + *((tbinptr*)(u->parent)) == u); + if (u->child[0] != 0) { + assert(u->child[0]->parent == u); + assert(u->child[0] != u); + do_check_tree(m, u->child[0]); + } + if (u->child[1] != 0) { + assert(u->child[1]->parent == u); + assert(u->child[1] != u); + do_check_tree(m, u->child[1]); + } + if (u->child[0] != 0 && u->child[1] != 0) { + assert(chunksize(u->child[0]) < chunksize(u->child[1])); + } + } + u = u->fd; + } while (u != t); + assert(head != 0); +} + +/* Check all the chunks in a treebin. */ +static void do_check_treebin(mstate m, bindex_t i) { + tbinptr* tb = treebin_at(m, i); + tchunkptr t = *tb; + int empty = (m->treemap & (1U << i)) == 0; + if (t == 0) + assert(empty); + if (!empty) + do_check_tree(m, t); +} + +/* Check all the chunks in a smallbin. */ +static void do_check_smallbin(mstate m, bindex_t i) { + sbinptr b = smallbin_at(m, i); + mchunkptr p = b->bk; + unsigned int empty = (m->smallmap & (1U << i)) == 0; + if (p == b) + assert(empty); + if (!empty) { + for (; p != b; p = p->bk) { + size_t size = chunksize(p); + mchunkptr q; + /* each chunk claims to be free */ + do_check_free_chunk(m, p); + /* chunk belongs in bin */ + assert(small_index(size) == i); + assert(p->bk == b || chunksize(p->bk) == chunksize(p)); + /* chunk is followed by an inuse chunk */ + q = next_chunk(p); + if (q->head != FENCEPOST_HEAD) + do_check_inuse_chunk(m, q); + } + } +} + +/* Find x in a bin. Used in other check functions. */ +static int bin_find(mstate m, mchunkptr x) { + size_t size = chunksize(x); + if (is_small(size)) { + bindex_t sidx = small_index(size); + sbinptr b = smallbin_at(m, sidx); + if (smallmap_is_marked(m, sidx)) { + mchunkptr p = b; + do { + if (p == x) + return 1; + } while ((p = p->fd) != b); + } + } + else { + bindex_t tidx; + compute_tree_index(size, tidx); + if (treemap_is_marked(m, tidx)) { + tchunkptr t = *treebin_at(m, tidx); + size_t sizebits = size << leftshift_for_tree_index(tidx); + while (t != 0 && chunksize(t) != size) { + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + sizebits <<= 1; + } + if (t != 0) { + tchunkptr u = t; + do { + if (u == (tchunkptr)x) + return 1; + } while ((u = u->fd) != t); + } + } + } + return 0; +} + +/* Traverse each chunk and check it; return total */ +static size_t traverse_and_check(mstate m) { + size_t sum = 0; + if (is_initialized(m)) { + msegmentptr s = &m->seg; + sum += m->topsize + TOP_FOOT_SIZE; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + mchunkptr lastq = 0; + assert(pinuse(q)); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + sum += chunksize(q); + if (cinuse(q)) { + assert(!bin_find(m, q)); + do_check_inuse_chunk(m, q); + } + else { + assert(q == m->dv || bin_find(m, q)); + assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ + do_check_free_chunk(m, q); + } + lastq = q; + q = next_chunk(q); + } + s = s->next; + } + } + return sum; +} + +/* Check all properties of malloc_state. */ +static void do_check_malloc_state(mstate m) { + bindex_t i; + size_t total; + /* check bins */ + for (i = 0; i < NSMALLBINS; ++i) + do_check_smallbin(m, i); + for (i = 0; i < NTREEBINS; ++i) + do_check_treebin(m, i); + + if (m->dvsize != 0) { /* check dv chunk */ + do_check_any_chunk(m, m->dv); + assert(m->dvsize == chunksize(m->dv)); + assert(m->dvsize >= MIN_CHUNK_SIZE); + assert(bin_find(m, m->dv) == 0); + } + + if (m->top != 0) { /* check top chunk */ + do_check_top_chunk(m, m->top); + assert(m->topsize == chunksize(m->top)); + assert(m->topsize > 0); + assert(bin_find(m, m->top) == 0); + } + + total = traverse_and_check(m); + assert(total <= m->footprint); + assert(m->footprint <= m->max_footprint); +} +#endif /* DEBUG */ + +/* ----------------------------- statistics ------------------------------ */ + +#if !NO_MALLINFO +static struct mallinfo internal_mallinfo(mstate m) { + struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + if (!PREACTION(m)) { + check_malloc_state(m); + if (is_initialized(m)) { + size_t nfree = SIZE_T_ONE; /* top always free */ + size_t mfree = m->topsize + TOP_FOOT_SIZE; + size_t sum = mfree; + msegmentptr s = &m->seg; + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + size_t sz = chunksize(q); + sum += sz; + if (!cinuse(q)) { + mfree += sz; + ++nfree; + } + q = next_chunk(q); + } + s = s->next; + } + + nm.arena = sum; + nm.ordblks = nfree; + nm.hblkhd = m->footprint - sum; + nm.usmblks = m->max_footprint; + nm.uordblks = m->footprint - mfree; + nm.fordblks = mfree; + nm.keepcost = m->topsize; + } + + POSTACTION(m); + } + return nm; +} +#endif /* !NO_MALLINFO */ + +static void internal_malloc_stats(mstate m) { + if (!PREACTION(m)) { + size_t maxfp = 0; + size_t fp = 0; + size_t used = 0; + check_malloc_state(m); + if (is_initialized(m)) { + msegmentptr s = &m->seg; + maxfp = m->max_footprint; + fp = m->footprint; + used = fp - (m->topsize + TOP_FOOT_SIZE); + + while (s != 0) { + mchunkptr q = align_as_chunk(s->base); + while (segment_holds(s, q) && + q != m->top && q->head != FENCEPOST_HEAD) { + if (!cinuse(q)) + used -= chunksize(q); + q = next_chunk(q); + } + s = s->next; + } + } + + fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); + fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); + fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); + + POSTACTION(m); + } +} + +/* ----------------------- Operations on smallbins ----------------------- */ + +/* + Various forms of linking and unlinking are defined as macros. Even + the ones for trees, which are very long but have very short typical + paths. This is ugly but reduces reliance on inlining support of + compilers. +*/ + +/* Link a free chunk into a smallbin */ +#define insert_small_chunk(M, P, S) {\ + bindex_t I = small_index(S);\ + mchunkptr B = smallbin_at(M, I);\ + mchunkptr F = B;\ + assert(S >= MIN_CHUNK_SIZE);\ + if (!smallmap_is_marked(M, I))\ + mark_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, B->fd)))\ + F = B->fd;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + B->fd = P;\ + F->bk = P;\ + P->fd = F;\ + P->bk = B;\ +} + +/* Unlink a chunk from a smallbin */ +#define unlink_small_chunk(M, P, S) {\ + mchunkptr F = P->fd;\ + mchunkptr B = P->bk;\ + bindex_t I = small_index(S);\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (F == B)\ + clear_smallmap(M, I);\ + else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ + (B == smallbin_at(M,I) || ok_address(M, B)))) {\ + F->bk = B;\ + B->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Unlink the first chunk from a smallbin */ +#define unlink_first_small_chunk(M, B, P, I) {\ + mchunkptr F = P->fd;\ + assert(P != B);\ + assert(P != F);\ + assert(chunksize(P) == small_index2size(I));\ + if (B == F)\ + clear_smallmap(M, I);\ + else if (RTCHECK(ok_address(M, F))) {\ + B->fd = F;\ + F->bk = B;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ +} + +/* Replace dv node, binning the old one */ +/* Used only when dvsize known to be small */ +#define replace_dv(M, P, S) {\ + size_t DVS = M->dvsize;\ + if (DVS != 0) {\ + mchunkptr DV = M->dv;\ + assert(is_small(DVS));\ + insert_small_chunk(M, DV, DVS);\ + }\ + M->dvsize = S;\ + M->dv = P;\ +} + +/* ------------------------- Operations on trees ------------------------- */ + +/* Insert chunk into tree */ +#define insert_large_chunk(M, X, S) {\ + tbinptr* H;\ + bindex_t I;\ + compute_tree_index(S, I);\ + H = treebin_at(M, I);\ + X->index = I;\ + X->child[0] = X->child[1] = 0;\ + if (!treemap_is_marked(M, I)) {\ + mark_treemap(M, I);\ + *H = X;\ + X->parent = (tchunkptr)H;\ + X->fd = X->bk = X;\ + }\ + else {\ + tchunkptr T = *H;\ + size_t K = S << leftshift_for_tree_index(I);\ + for (;;) {\ + if (chunksize(T) != S) {\ + tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ + K <<= 1;\ + if (*C != 0)\ + T = *C;\ + else if (RTCHECK(ok_address(M, C))) {\ + *C = X;\ + X->parent = T;\ + X->fd = X->bk = X;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + else {\ + tchunkptr F = T->fd;\ + if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ + T->fd = F->bk = X;\ + X->fd = F;\ + X->bk = T;\ + X->parent = 0;\ + break;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + break;\ + }\ + }\ + }\ + }\ +} + +/* + Unlink steps: + + 1. If x is a chained node, unlink it from its same-sized fd/bk links + and choose its bk node as its replacement. + 2. If x was the last node of its size, but not a leaf node, it must + be replaced with a leaf node (not merely one with an open left or + right), to make sure that lefts and rights of descendants + correspond properly to bit masks. We use the rightmost descendant + of x. We could use any other leaf, but this is easy to locate and + tends to counteract removal of leftmosts elsewhere, and so keeps + paths shorter than minimally guaranteed. This doesn't loop much + because on average a node in a tree is near the bottom. + 3. If x is the base of a chain (i.e., has parent links) relink + x's parent and children to x's replacement (or null if none). +*/ + +#define unlink_large_chunk(M, X) {\ + tchunkptr XP = X->parent;\ + tchunkptr R;\ + if (X->bk != X) {\ + tchunkptr F = X->fd;\ + R = X->bk;\ + if (RTCHECK(ok_address(M, F))) {\ + F->bk = R;\ + R->fd = F;\ + }\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else {\ + tchunkptr* RP;\ + if (((R = *(RP = &(X->child[1]))) != 0) ||\ + ((R = *(RP = &(X->child[0]))) != 0)) {\ + tchunkptr* CP;\ + while ((*(CP = &(R->child[1])) != 0) ||\ + (*(CP = &(R->child[0])) != 0)) {\ + R = *(RP = CP);\ + }\ + if (RTCHECK(ok_address(M, RP)))\ + *RP = 0;\ + else {\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + }\ + if (XP != 0) {\ + tbinptr* H = treebin_at(M, X->index);\ + if (X == *H) {\ + if ((*H = R) == 0) \ + clear_treemap(M, X->index);\ + }\ + else if (RTCHECK(ok_address(M, XP))) {\ + if (XP->child[0] == X) \ + XP->child[0] = R;\ + else \ + XP->child[1] = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + if (R != 0) {\ + if (RTCHECK(ok_address(M, R))) {\ + tchunkptr C0, C1;\ + R->parent = XP;\ + if ((C0 = X->child[0]) != 0) {\ + if (RTCHECK(ok_address(M, C0))) {\ + R->child[0] = C0;\ + C0->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + if ((C1 = X->child[1]) != 0) {\ + if (RTCHECK(ok_address(M, C1))) {\ + R->child[1] = C1;\ + C1->parent = R;\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ + else\ + CORRUPTION_ERROR_ACTION(M);\ + }\ + }\ +} + +/* Relays to large vs small bin operations */ + +#define insert_chunk(M, P, S)\ + if (is_small(S)) insert_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } + +#define unlink_chunk(M, P, S)\ + if (is_small(S)) unlink_small_chunk(M, P, S)\ + else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } + + +/* Relays to internal calls to malloc/free from realloc, memalign etc */ + +#if ONLY_MSPACES +#define internal_malloc(m, b) mspace_malloc(m, b) +#define internal_free(m, mem) mspace_free(m,mem); +#else /* ONLY_MSPACES */ +#if MSPACES +#define internal_malloc(m, b)\ + (m == gm)? dlmalloc(b) : mspace_malloc(m, b) +#define internal_free(m, mem)\ + if (m == gm) dlfree(mem); else mspace_free(m,mem); +#else /* MSPACES */ +#define internal_malloc(m, b) dlmalloc(b) +#define internal_free(m, mem) dlfree(mem) +#endif /* MSPACES */ +#endif /* ONLY_MSPACES */ + +/* ----------------------- Direct-mmapping chunks ----------------------- */ + +/* + Directly mmapped chunks are set up with an offset to the start of + the mmapped region stored in the prev_foot field of the chunk. This + allows reconstruction of the required argument to MUNMAP when freed, + and also allows adjustment of the returned chunk to meet alignment + requirements (especially in memalign). There is also enough space + allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain + the PINUSE bit so frees can be checked. +*/ + +/* Malloc using mmap */ +static void* mmap_alloc(mstate m, size_t nb) { + size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + if (mmsize > nb) { /* Check for wrap around 0 */ + char* mm = (char*)(DIRECT_MMAP(mmsize)); + if (mm != CMFAIL) { + size_t offset = align_offset(chunk2mem(mm)); + size_t psize = mmsize - offset - MMAP_FOOT_PAD; + mchunkptr p = (mchunkptr)(mm + offset); + p->prev_foot = offset | IS_MMAPPED_BIT; + (p)->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, p, psize); + chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; + + if (mm < m->least_addr) + m->least_addr = mm; + if ((m->footprint += mmsize) > m->max_footprint) + m->max_footprint = m->footprint; + assert(is_aligned(chunk2mem(p))); + check_mmapped_chunk(m, p); + return chunk2mem(p); + } + } + return 0; +} + +/* Realloc using mmap */ +static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { + size_t oldsize = chunksize(oldp); + if (is_small(nb)) /* Can't shrink mmap regions below small size */ + return 0; + /* Keep old chunk if big enough but not too big */ + if (oldsize >= nb + SIZE_T_SIZE && + (oldsize - nb) <= (mparams.granularity << 1)) + return oldp; + else { + size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; + size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; + size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + + CHUNK_ALIGN_MASK); + char* cp = (char*)CALL_MREMAP((char*)oldp - offset, + oldmmsize, newmmsize, 1); + if (cp != CMFAIL) { + mchunkptr newp = (mchunkptr)(cp + offset); + size_t psize = newmmsize - offset - MMAP_FOOT_PAD; + newp->head = (psize|CINUSE_BIT); + mark_inuse_foot(m, newp, psize); + chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; + chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; + + if (cp < m->least_addr) + m->least_addr = cp; + if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) + m->max_footprint = m->footprint; + check_mmapped_chunk(m, newp); + return newp; + } + } + return 0; +} + +/* -------------------------- mspace management -------------------------- */ + +/* Initialize top chunk and its size */ +static void init_top(mstate m, mchunkptr p, size_t psize) { + /* Ensure alignment */ + size_t offset = align_offset(chunk2mem(p)); + p = (mchunkptr)((char*)p + offset); + psize -= offset; + + m->top = p; + m->topsize = psize; + p->head = psize | PINUSE_BIT; + /* set size of fake trailing chunk holding overhead space only once */ + chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; + m->trim_check = mparams.trim_threshold; /* reset on each update */ +} + +/* Initialize bins for a new mstate that is otherwise zeroed out */ +static void init_bins(mstate m) { + /* Establish circular links for smallbins */ + bindex_t i; + for (i = 0; i < NSMALLBINS; ++i) { + sbinptr bin = smallbin_at(m,i); + bin->fd = bin->bk = bin; + } +} + +#if PROCEED_ON_ERROR + +/* default corruption action */ +static void reset_on_error(mstate m) { + int i; + ++malloc_corruption_error_count; + /* Reinitialize fields to forget about all memory */ + m->smallbins = m->treebins = 0; + m->dvsize = m->topsize = 0; + m->seg.base = 0; + m->seg.size = 0; + m->seg.next = 0; + m->top = m->dv = 0; + for (i = 0; i < NTREEBINS; ++i) + *treebin_at(m, i) = 0; + init_bins(m); +} +#endif /* PROCEED_ON_ERROR */ + +/* Allocate chunk and prepend remainder with chunk in successor base. */ +static void* prepend_alloc(mstate m, char* newbase, char* oldbase, + size_t nb) { + mchunkptr p = align_as_chunk(newbase); + mchunkptr oldfirst = align_as_chunk(oldbase); + size_t psize = (char*)oldfirst - (char*)p; + mchunkptr q = chunk_plus_offset(p, nb); + size_t qsize = psize - nb; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + + assert((char*)oldfirst > (char*)q); + assert(pinuse(oldfirst)); + assert(qsize >= MIN_CHUNK_SIZE); + + /* consolidate remainder with first chunk of old base */ + if (oldfirst == m->top) { + size_t tsize = m->topsize += qsize; + m->top = q; + q->head = tsize | PINUSE_BIT; + check_top_chunk(m, q); + } + else if (oldfirst == m->dv) { + size_t dsize = m->dvsize += qsize; + m->dv = q; + set_size_and_pinuse_of_free_chunk(q, dsize); + } + else { + if (!cinuse(oldfirst)) { + size_t nsize = chunksize(oldfirst); + unlink_chunk(m, oldfirst, nsize); + oldfirst = chunk_plus_offset(oldfirst, nsize); + qsize += nsize; + } + set_free_with_pinuse(q, qsize, oldfirst); + insert_chunk(m, q, qsize); + check_free_chunk(m, q); + } + + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); +} + + +/* Add a segment to hold a new noncontiguous region */ +static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { + /* Determine locations and sizes of segment, fenceposts, old top */ + char* old_top = (char*)m->top; + msegmentptr oldsp = segment_holding(m, old_top); + char* old_end = oldsp->base + oldsp->size; + size_t ssize = pad_request(sizeof(struct malloc_segment)); + char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); + size_t offset = align_offset(chunk2mem(rawsp)); + char* asp = rawsp + offset; + char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; + mchunkptr sp = (mchunkptr)csp; + msegmentptr ss = (msegmentptr)(chunk2mem(sp)); + mchunkptr tnext = chunk_plus_offset(sp, ssize); + mchunkptr p = tnext; + int nfences = 0; + + /* reset top to new space */ + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + + /* Set up segment record */ + assert(is_aligned(ss)); + set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); + *ss = m->seg; /* Push current record */ + m->seg.base = tbase; + m->seg.size = tsize; + (void)set_segment_flags(&m->seg, mmapped); + m->seg.next = ss; + + /* Insert trailing fenceposts */ + for (;;) { + mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); + p->head = FENCEPOST_HEAD; + ++nfences; + if ((char*)(&(nextp->head)) < old_end) + p = nextp; + else + break; + } + assert(nfences >= 2); + + /* Insert the rest of old top into a bin as an ordinary free chunk */ + if (csp != old_top) { + mchunkptr q = (mchunkptr)old_top; + size_t psize = csp - old_top; + mchunkptr tn = chunk_plus_offset(q, psize); + set_free_with_pinuse(q, psize, tn); + insert_chunk(m, q, psize); + } + + check_top_chunk(m, m->top); +} + +/* -------------------------- System allocation -------------------------- */ + +/* Get memory from system using MORECORE or MMAP */ +static void* sys_alloc(mstate m, size_t nb) { + char* tbase = CMFAIL; + size_t tsize = 0; + flag_t mmap_flag = 0; + + init_mparams(); + + /* Directly map large chunks */ + if (use_mmap(m) && nb >= mparams.mmap_threshold) { + void* mem = mmap_alloc(m, nb); + if (mem != 0) + return mem; + } + + /* + Try getting memory in any of three ways (in most-preferred to + least-preferred order): + 1. A call to MORECORE that can normally contiguously extend memory. + (disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or + or main space is mmapped or a previous contiguous call failed) + 2. A call to MMAP new space (disabled if not HAVE_MMAP). + Note that under the default settings, if MORECORE is unable to + fulfill a request, and HAVE_MMAP is true, then mmap is + used as a noncontiguous system allocator. This is a useful backup + strategy for systems with holes in address spaces -- in this case + sbrk cannot contiguously expand the heap, but mmap may be able to + find space. + 3. A call to MORECORE that cannot usually contiguously extend memory. + (disabled if not HAVE_MORECORE) + */ + + if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { + char* br = CMFAIL; + msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); + size_t asize = 0; + ACQUIRE_MORECORE_LOCK(); + + if (ss == 0) { /* First time through or recovery */ + char* base = (char*)CALL_MORECORE(0); + if (base != CMFAIL) { + asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Adjust to end on a page boundary */ + if (!is_page_aligned(base)) + asize += (page_align((size_t)base) - (size_t)base); + /* Can't call MORECORE if size is negative when treated as signed */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == base) { + tbase = base; + tsize = asize; + } + } + } + else { + /* Subtract out existing available top space from MORECORE request. */ + asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); + /* Use mem here only if it did continuously extend old space */ + if (asize < HALF_MAX_SIZE_T && + (br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { + tbase = br; + tsize = asize; + } + } + + if (tbase == CMFAIL) { /* Cope with partial failure */ + if (br != CMFAIL) { /* Try to use/extend the space we did get */ + if (asize < HALF_MAX_SIZE_T && + asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { + size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); + if (esize < HALF_MAX_SIZE_T) { + char* end = (char*)CALL_MORECORE(esize); + if (end != CMFAIL) + asize += esize; + else { /* Can't use; try to release */ + (void)CALL_MORECORE(-asize); + br = CMFAIL; + } + } + } + } + if (br != CMFAIL) { /* Use the space we did get */ + tbase = br; + tsize = asize; + } + else + disable_contiguous(m); /* Don't try contiguous path in the future */ + } + + RELEASE_MORECORE_LOCK(); + } + + if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ + size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; + size_t rsize = granularity_align(req); + if (rsize > nb) { /* Fail if wraps around zero */ + char* mp = (char*)(CALL_MMAP(rsize)); + if (mp != CMFAIL) { + tbase = mp; + tsize = rsize; + mmap_flag = IS_MMAPPED_BIT; + } + } + } + + if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ + size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); + if (asize < HALF_MAX_SIZE_T) { + char* br = CMFAIL; + char* end = CMFAIL; + ACQUIRE_MORECORE_LOCK(); + br = (char*)(CALL_MORECORE(asize)); + end = (char*)(CALL_MORECORE(0)); + RELEASE_MORECORE_LOCK(); + if (br != CMFAIL && end != CMFAIL && br < end) { + size_t ssize = end - br; + if (ssize > nb + TOP_FOOT_SIZE) { + tbase = br; + tsize = ssize; + } + } + } + } + + if (tbase != CMFAIL) { + + if ((m->footprint += tsize) > m->max_footprint) + m->max_footprint = m->footprint; + + if (!is_initialized(m)) { /* first-time initialization */ + m->seg.base = m->least_addr = tbase; + m->seg.size = tsize; + (void)set_segment_flags(&m->seg, mmap_flag); + m->magic = mparams.magic; + init_bins(m); + if (is_global(m)) + init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); + else { + /* Offset top by embedded malloc_state */ + mchunkptr mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); + } + } + + else { + /* Try to merge with an existing segment */ + msegmentptr sp = &m->seg; + while (sp != 0 && tbase != sp->base + sp->size) + sp = sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + check_segment_merge(sp, tbase, tsize) && + (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag && + segment_holds(sp, m->top)) { /* append */ + sp->size += tsize; + init_top(m, m->top, m->topsize + tsize); + } + else { + if (tbase < m->least_addr) + m->least_addr = tbase; + sp = &m->seg; + while (sp != 0 && sp->base != tbase + tsize) + sp = sp->next; + if (sp != 0 && + !is_extern_segment(sp) && + check_segment_merge(sp, tbase, tsize) && + (get_segment_flags(sp) & IS_MMAPPED_BIT) == mmap_flag) { + char* oldbase = sp->base; + sp->base = tbase; + sp->size += tsize; + return prepend_alloc(m, tbase, oldbase, nb); + } + else + add_segment(m, tbase, tsize, mmap_flag); + } + } + + if (nb < m->topsize) { /* Allocate from new or extended top space */ + size_t rsize = m->topsize -= nb; + mchunkptr p = m->top; + mchunkptr r = m->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(m, p, nb); + check_top_chunk(m, m->top); + check_malloced_chunk(m, chunk2mem(p), nb); + return chunk2mem(p); + } + } + + MALLOC_FAILURE_ACTION; + return 0; +} + +/* ----------------------- system deallocation -------------------------- */ + +/* Unmap and unlink any mmapped segments that don't contain used chunks */ +static size_t release_unused_segments(mstate m) { + size_t released = 0; + msegmentptr pred = &m->seg; + msegmentptr sp = pred->next; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + msegmentptr next = sp->next; + if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { + mchunkptr p = align_as_chunk(base); + size_t psize = chunksize(p); + /* Can unmap if first chunk holds entire segment and not pinned */ + if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { + tchunkptr tp = (tchunkptr)p; + assert(segment_holds(sp, (char*)sp)); + if (p == m->dv) { + m->dv = 0; + m->dvsize = 0; + } + else { + unlink_large_chunk(m, tp); + } + if (CALL_MUNMAP(base, size) == 0) { + released += size; + m->footprint -= size; + /* unlink obsoleted record */ + sp = pred; + sp->next = next; + } + else { /* back out if cannot unmap */ + insert_large_chunk(m, tp, psize); + } + } + } + pred = sp; + sp = next; + } + return released; +} + +static int sys_trim(mstate m, size_t pad) { + size_t released = 0; + if (pad < MAX_REQUEST && is_initialized(m)) { + pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ + + if (m->topsize > pad) { + /* Shrink top space in granularity-size units, keeping at least one */ + size_t unit = mparams.granularity; + size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - + SIZE_T_ONE) * unit; + msegmentptr sp = segment_holding(m, (char*)m->top); + + if (!is_extern_segment(sp)) { + if (is_mmapped_segment(sp)) { + if (HAVE_MMAP && + sp->size >= extra && + !has_segment_link(m, sp)) { /* can't shrink if pinned */ + size_t newsize = sp->size - extra; + /* Prefer mremap, fall back to munmap */ + if ((CALL_MREMAP(sp->base, sp->size, newsize, 0) != MFAIL) || + (CALL_MUNMAP(sp->base + newsize, extra) == 0)) { + released = extra; + } + } + } + else if (HAVE_MORECORE) { + if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ + extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; + ACQUIRE_MORECORE_LOCK(); + { + /* Make sure end of memory is where we last set it. */ + char* old_br = (char*)(CALL_MORECORE(0)); + if (old_br == sp->base + sp->size) { + char* rel_br = (char*)(CALL_MORECORE(-extra)); + char* new_br = (char*)(CALL_MORECORE(0)); + if (rel_br != CMFAIL && new_br < old_br) + released = old_br - new_br; + } + } + RELEASE_MORECORE_LOCK(); + } + } + + if (released != 0) { + sp->size -= released; + m->footprint -= released; + init_top(m, m->top, m->topsize - released); + check_top_chunk(m, m->top); + } + } + + /* Unmap any unused mmapped segments */ + if (HAVE_MMAP) + released += release_unused_segments(m); + + /* On failure, disable autotrim to avoid repeated failed future calls */ + if (released == 0) + m->trim_check = MAX_SIZE_T; + } + + return (released != 0)? 1 : 0; +} + +/* ---------------------------- malloc support --------------------------- */ + +/* allocate a large request from the best fitting chunk in a treebin */ +static void* tmalloc_large(mstate m, size_t nb) { + tchunkptr v = 0; + size_t rsize = -nb; /* Unsigned negation */ + tchunkptr t; + bindex_t idx; + compute_tree_index(nb, idx); + + if ((t = *treebin_at(m, idx)) != 0) { + /* Traverse tree for this bin looking for node with size == nb */ + size_t sizebits = nb << leftshift_for_tree_index(idx); + tchunkptr rst = 0; /* The deepest untaken right subtree */ + for (;;) { + tchunkptr rt; + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + v = t; + if ((rsize = trem) == 0) + break; + } + rt = t->child[1]; + t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; + if (rt != 0 && rt != t) + rst = rt; + if (t == 0) { + t = rst; /* set t to least subtree holding sizes > nb */ + break; + } + sizebits <<= 1; + } + } + + if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ + binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; + if (leftbits != 0) { + bindex_t i; + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + t = *treebin_at(m, i); + } + } + + while (t != 0) { /* find smallest of tree or subtree */ + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + t = leftmost_child(t); + } + + /* If dv is a better fit, return 0 so malloc will use it */ + if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { + if (RTCHECK(ok_address(m, v))) { /* split */ + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + insert_chunk(m, r, rsize); + } + return chunk2mem(v); + } + } + CORRUPTION_ERROR_ACTION(m); + } + return 0; +} + +/* allocate a small request from the best fitting chunk in a treebin */ +static void* tmalloc_small(mstate m, size_t nb) { + tchunkptr t, v; + size_t rsize; + bindex_t i; + binmap_t leastbit = least_bit(m->treemap); + compute_bit2idx(leastbit, i); + + v = t = *treebin_at(m, i); + rsize = chunksize(t) - nb; + + while ((t = leftmost_child(t)) != 0) { + size_t trem = chunksize(t) - nb; + if (trem < rsize) { + rsize = trem; + v = t; + } + } + + if (RTCHECK(ok_address(m, v))) { + mchunkptr r = chunk_plus_offset(v, nb); + assert(chunksize(v) == rsize + nb); + if (RTCHECK(ok_next(v, r))) { + unlink_large_chunk(m, v); + if (rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(m, v, (rsize + nb)); + else { + set_size_and_pinuse_of_inuse_chunk(m, v, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(m, r, rsize); + } + return chunk2mem(v); + } + } + + CORRUPTION_ERROR_ACTION(m); + return 0; +} + +/* --------------------------- realloc support --------------------------- */ + +static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { + if (bytes >= MAX_REQUEST) { + MALLOC_FAILURE_ACTION; + return 0; + } + if (!PREACTION(m)) { + mchunkptr oldp = mem2chunk(oldmem); + size_t oldsize = chunksize(oldp); + mchunkptr next = chunk_plus_offset(oldp, oldsize); + mchunkptr newp = 0; + void* extra = 0; + + /* Try to either shrink or extend into top. Else malloc-copy-free */ + + if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && + ok_next(oldp, next) && ok_pinuse(next))) { + size_t nb = request2size(bytes); + if (is_mmapped(oldp)) + newp = mmap_resize(m, oldp, nb); + else if (oldsize >= nb) { /* already big enough */ + size_t rsize = oldsize - nb; + newp = oldp; + if (rsize >= MIN_CHUNK_SIZE) { + mchunkptr remainder = chunk_plus_offset(newp, nb); + set_inuse(m, newp, nb); + set_inuse(m, remainder, rsize); + extra = chunk2mem(remainder); + } + } + else if (next == m->top && oldsize + m->topsize > nb) { + /* Expand into top */ + size_t newsize = oldsize + m->topsize; + size_t newtopsize = newsize - nb; + mchunkptr newtop = chunk_plus_offset(oldp, nb); + set_inuse(m, oldp, nb); + newtop->head = newtopsize |PINUSE_BIT; + m->top = newtop; + m->topsize = newtopsize; + newp = oldp; + } + } + else { + USAGE_ERROR_ACTION(m, oldmem); + POSTACTION(m); + return 0; + } + + POSTACTION(m); + + if (newp != 0) { + if (extra != 0) { + internal_free(m, extra); + } + check_inuse_chunk(m, newp); + return chunk2mem(newp); + } + else { + void* newmem = internal_malloc(m, bytes); + if (newmem != 0) { + size_t oc = oldsize - overhead_for(oldp); + memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); + internal_free(m, oldmem); + } + return newmem; + } + } + return 0; +} + +/* --------------------------- memalign support -------------------------- */ + +static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { + if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ + return internal_malloc(m, bytes); + if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ + alignment = MIN_CHUNK_SIZE; + if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ + size_t a = MALLOC_ALIGNMENT << 1; + while (a < alignment) a <<= 1; + alignment = a; + } + + if (bytes >= MAX_REQUEST - alignment) { + if (m != 0) { /* Test isn't needed but avoids compiler warning */ + MALLOC_FAILURE_ACTION; + } + } + else { + size_t nb = request2size(bytes); + size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; + char* mem = (char*)internal_malloc(m, req); + if (mem != 0) { + void* leader = 0; + void* trailer = 0; + mchunkptr p = mem2chunk(mem); + + if (PREACTION(m)) return 0; + if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ + /* + Find an aligned spot inside chunk. Since we need to give + back leading space in a chunk of at least MIN_CHUNK_SIZE, if + the first calculation places us at a spot with less than + MIN_CHUNK_SIZE leader, we can move to the next aligned spot. + We've allocated enough total room so that this is always + possible. + */ + char* br = (char*)mem2chunk((size_t)(((size_t)(mem + + alignment - + SIZE_T_ONE)) & + -alignment)); + char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? + br : br+alignment; + mchunkptr newp = (mchunkptr)pos; + size_t leadsize = pos - (char*)(p); + size_t newsize = chunksize(p) - leadsize; + + if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ + newp->prev_foot = p->prev_foot + leadsize; + newp->head = (newsize|CINUSE_BIT); + } + else { /* Otherwise, give back leader, use the rest */ + set_inuse(m, newp, newsize); + set_inuse(m, p, leadsize); + leader = chunk2mem(p); + } + p = newp; + } + + /* Give back spare room at the end */ + if (!is_mmapped(p)) { + size_t size = chunksize(p); + if (size > nb + MIN_CHUNK_SIZE) { + size_t remainder_size = size - nb; + mchunkptr remainder = chunk_plus_offset(p, nb); + set_inuse(m, p, nb); + set_inuse(m, remainder, remainder_size); + trailer = chunk2mem(remainder); + } + } + + assert (chunksize(p) >= nb); + assert((((size_t)(chunk2mem(p))) % alignment) == 0); + check_inuse_chunk(m, p); + POSTACTION(m); + if (leader != 0) { + internal_free(m, leader); + } + if (trailer != 0) { + internal_free(m, trailer); + } + return chunk2mem(p); + } + } + return 0; +} + +/* ------------------------ comalloc/coalloc support --------------------- */ + +static void** ialloc(mstate m, + size_t n_elements, + size_t* sizes, + int opts, + void* chunks[]) { + /* + This provides common support for independent_X routines, handling + all of the combinations that can result. + + The opts arg has: + bit 0 set if all elements are same size (using sizes[0]) + bit 1 set if elements should be zeroed + */ + + size_t element_size; /* chunksize of each element, if all same */ + size_t contents_size; /* total size of elements */ + size_t array_size; /* request size of pointer array */ + void* mem; /* malloced aggregate space */ + mchunkptr p; /* corresponding chunk */ + size_t remainder_size; /* remaining bytes while splitting */ + void** marray; /* either "chunks" or malloced ptr array */ + mchunkptr array_chunk; /* chunk for malloced ptr array */ + flag_t was_enabled; /* to disable mmap */ + size_t size; + size_t i; + + /* compute array length, if needed */ + if (chunks != 0) { + if (n_elements == 0) + return chunks; /* nothing to do */ + marray = chunks; + array_size = 0; + } + else { + /* if empty req, must still return chunk representing empty array */ + if (n_elements == 0) + return (void**)internal_malloc(m, 0); + marray = 0; + array_size = request2size(n_elements * (sizeof(void*))); + } + + /* compute total element size */ + if (opts & 0x1) { /* all-same-size */ + element_size = request2size(*sizes); + contents_size = n_elements * element_size; + } + else { /* add up all the sizes */ + element_size = 0; + contents_size = 0; + for (i = 0; i != n_elements; ++i) + contents_size += request2size(sizes[i]); + } + + size = contents_size + array_size; + + /* + Allocate the aggregate chunk. First disable direct-mmapping so + malloc won't use it, since we would not be able to later + free/realloc space internal to a segregated mmap region. + */ + was_enabled = use_mmap(m); + disable_mmap(m); + mem = internal_malloc(m, size - CHUNK_OVERHEAD); + if (was_enabled) + enable_mmap(m); + if (mem == 0) + return 0; + + if (PREACTION(m)) return 0; + p = mem2chunk(mem); + remainder_size = chunksize(p); + + assert(!is_mmapped(p)); + + if (opts & 0x2) { /* optionally clear the elements */ + memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); + } + + /* If not provided, allocate the pointer array as final part of chunk */ + if (marray == 0) { + size_t array_chunk_size; + array_chunk = chunk_plus_offset(p, contents_size); + array_chunk_size = remainder_size - contents_size; + marray = (void**) (chunk2mem(array_chunk)); + set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); + remainder_size = contents_size; + } + + /* split out elements */ + for (i = 0; ; ++i) { + marray[i] = chunk2mem(p); + if (i != n_elements-1) { + if (element_size != 0) + size = element_size; + else + size = request2size(sizes[i]); + remainder_size -= size; + set_size_and_pinuse_of_inuse_chunk(m, p, size); + p = chunk_plus_offset(p, size); + } + else { /* the final element absorbs any overallocation slop */ + set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); + break; + } + } + +#if DEBUG + if (marray != chunks) { + /* final element must have exactly exhausted chunk */ + if (element_size != 0) { + assert(remainder_size == element_size); + } + else { + assert(remainder_size == request2size(sizes[i])); + } + check_inuse_chunk(m, mem2chunk(marray)); + } + for (i = 0; i != n_elements; ++i) + check_inuse_chunk(m, mem2chunk(marray[i])); + +#endif /* DEBUG */ + + POSTACTION(m); + return marray; +} + + +/* -------------------------- public routines ---------------------------- */ + +#if !ONLY_MSPACES + +void* dlmalloc(size_t bytes) { + /* + Basic algorithm: + If a small request (< 256 bytes minus per-chunk overhead): + 1. If one exists, use a remainderless chunk in associated smallbin. + (Remainderless means that there are too few excess bytes to + represent as a chunk.) + 2. If it is big enough, use the dv chunk, which is normally the + chunk adjacent to the one used for the most recent small request. + 3. If one exists, split the smallest available chunk in a bin, + saving remainder in dv. + 4. If it is big enough, use the top chunk. + 5. If available, get memory from system and use it + Otherwise, for a large request: + 1. Find the smallest available binned chunk that fits, and use it + if it is better fitting than dv chunk, splitting if necessary. + 2. If better fitting than any binned chunk, use the dv chunk. + 3. If it is big enough, use the top chunk. + 4. If request size >= mmap threshold, try to directly mmap this chunk. + 5. If available, get memory from system and use it + + The ugly goto's here ensure that postaction occurs along all paths. + */ + + if (!PREACTION(gm)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = gm->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(gm, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(gm, b, p, idx); + set_inuse_and_pinuse(gm, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb > gm->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(gm, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(gm, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(gm, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(gm, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + } + + if (nb <= gm->dvsize) { + size_t rsize = gm->dvsize - nb; + mchunkptr p = gm->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = gm->dv = chunk_plus_offset(p, nb); + gm->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + } + else { /* exhaust dv */ + size_t dvs = gm->dvsize; + gm->dvsize = 0; + gm->dv = 0; + set_inuse_and_pinuse(gm, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + else if (nb < gm->topsize) { /* Split top */ + size_t rsize = gm->topsize -= nb; + mchunkptr p = gm->top; + mchunkptr r = gm->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(gm, p, nb); + mem = chunk2mem(p); + check_top_chunk(gm, gm->top); + check_malloced_chunk(gm, mem, nb); + goto postaction; + } + + mem = sys_alloc(gm, nb); + + postaction: + POSTACTION(gm); + return mem; + } + + return 0; +} + +void dlfree(void* mem) { + /* + Consolidate freed chunks with preceding or succeeding bordering + free chunks, if they exist, and then place in a bin. Intermixed + with special cases for top, dv, mmapped chunks, and usage errors. + */ + + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } +#else /* FOOTERS */ +#define fm gm +#endif /* FOOTERS */ + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + insert_chunk(fm, p, psize); + check_free_chunk(fm, p); + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +#if !FOOTERS +#undef fm +#endif /* FOOTERS */ +} + +void* dlcalloc(size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = dlmalloc(req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* dlrealloc(void* oldmem, size_t bytes) { + if (oldmem == 0) + return dlmalloc(bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + dlfree(oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if ! FOOTERS + mstate m = gm; +#else /* FOOTERS */ + mstate m = get_mstate_for(mem2chunk(oldmem)); + if (!ok_magic(m)) { + USAGE_ERROR_ACTION(m, oldmem); + return 0; + } +#endif /* FOOTERS */ + return internal_realloc(m, oldmem, bytes); + } +} + +void* dlmemalign(size_t alignment, size_t bytes) { + return internal_memalign(gm, alignment, bytes); +} + +void** dlindependent_calloc(size_t n_elements, size_t elem_size, + void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + return ialloc(gm, n_elements, &sz, 3, chunks); +} + +void** dlindependent_comalloc(size_t n_elements, size_t sizes[], + void* chunks[]) { + return ialloc(gm, n_elements, sizes, 0, chunks); +} + +void* dlvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, bytes); +} + +void* dlpvalloc(size_t bytes) { + size_t pagesz; + init_mparams(); + pagesz = mparams.page_size; + return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); +} + +int dlmalloc_trim(size_t pad) { + int result = 0; + if (!PREACTION(gm)) { + result = sys_trim(gm, pad); + POSTACTION(gm); + } + return result; +} + +size_t dlmalloc_footprint(void) { + return gm->footprint; +} + +size_t dlmalloc_max_footprint(void) { + return gm->max_footprint; +} + +#if !NO_MALLINFO +struct mallinfo dlmallinfo(void) { + return internal_mallinfo(gm); +} +#endif /* NO_MALLINFO */ + +void dlmalloc_stats() { + internal_malloc_stats(gm); +} + +size_t dlmalloc_usable_size(void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); + if (cinuse(p)) + return chunksize(p) - overhead_for(p); + } + return 0; +} + +int dlmallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* !ONLY_MSPACES */ + +/* ----------------------------- user mspaces ---------------------------- */ + +#if MSPACES + +static mstate init_user_mstate(char* tbase, size_t tsize) { + size_t msize = pad_request(sizeof(struct malloc_state)); + mchunkptr mn; + mchunkptr msp = align_as_chunk(tbase); + mstate m = (mstate)(chunk2mem(msp)); + memset(m, 0, msize); + INITIAL_LOCK(&m->mutex); + msp->head = (msize|PINUSE_BIT|CINUSE_BIT); + m->seg.base = m->least_addr = tbase; + m->seg.size = m->footprint = m->max_footprint = tsize; + m->magic = mparams.magic; + m->mflags = mparams.default_mflags; + disable_contiguous(m); + init_bins(m); + mn = next_chunk(mem2chunk(m)); + init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); + check_top_chunk(m, m->top); + return m; +} + +mspace create_mspace(size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + size_t rs = ((capacity == 0)? mparams.granularity : + (capacity + TOP_FOOT_SIZE + msize)); + size_t tsize = granularity_align(rs); + char* tbase = (char*)(CALL_MMAP(tsize)); + if (tbase != CMFAIL) { + m = init_user_mstate(tbase, tsize); + set_segment_flags(&m->seg, IS_MMAPPED_BIT); + set_lock(m, locked); + } + } + return (mspace)m; +} + +mspace create_mspace_with_base(void* base, size_t capacity, int locked) { + mstate m = 0; + size_t msize = pad_request(sizeof(struct malloc_state)); + init_mparams(); /* Ensure pagesize etc initialized */ + + if (capacity > msize + TOP_FOOT_SIZE && + capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { + m = init_user_mstate((char*)base, capacity); + set_segment_flags(&m->seg, EXTERN_BIT); + set_lock(m, locked); + } + return (mspace)m; +} + +size_t destroy_mspace(mspace msp) { + size_t freed = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + msegmentptr sp = &ms->seg; + while (sp != 0) { + char* base = sp->base; + size_t size = sp->size; + flag_t flag = get_segment_flags(sp); + sp = sp->next; + if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && + CALL_MUNMAP(base, size) == 0) + freed += size; + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return freed; +} + +/* + mspace versions of routines are near-clones of the global + versions. This is not so nice but better than the alternatives. +*/ + + +void* mspace_malloc(mspace msp, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (!PREACTION(ms)) { + void* mem; + size_t nb; + if (bytes <= MAX_SMALL_REQUEST) { + bindex_t idx; + binmap_t smallbits; + nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); + idx = small_index(nb); + smallbits = ms->smallmap >> idx; + + if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ + mchunkptr b, p; + idx += ~smallbits & 1; /* Uses next bin if idx empty */ + b = smallbin_at(ms, idx); + p = b->fd; + assert(chunksize(p) == small_index2size(idx)); + unlink_first_small_chunk(ms, b, p, idx); + set_inuse_and_pinuse(ms, p, small_index2size(idx)); + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb > ms->dvsize) { + if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ + mchunkptr b, p, r; + size_t rsize; + bindex_t i; + binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); + binmap_t leastbit = least_bit(leftbits); + compute_bit2idx(leastbit, i); + b = smallbin_at(ms, i); + p = b->fd; + assert(chunksize(p) == small_index2size(i)); + unlink_first_small_chunk(ms, b, p, i); + rsize = small_index2size(i) - nb; + /* Fit here cannot be remainderless if 4byte sizes */ + if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) + set_inuse_and_pinuse(ms, p, small_index2size(i)); + else { + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + r = chunk_plus_offset(p, nb); + set_size_and_pinuse_of_free_chunk(r, rsize); + replace_dv(ms, r, rsize); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + } + else if (bytes >= MAX_REQUEST) + nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ + else { + nb = pad_request(bytes); + if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + } + + if (nb <= ms->dvsize) { + size_t rsize = ms->dvsize - nb; + mchunkptr p = ms->dv; + if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ + mchunkptr r = ms->dv = chunk_plus_offset(p, nb); + ms->dvsize = rsize; + set_size_and_pinuse_of_free_chunk(r, rsize); + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + } + else { /* exhaust dv */ + size_t dvs = ms->dvsize; + ms->dvsize = 0; + ms->dv = 0; + set_inuse_and_pinuse(ms, p, dvs); + } + mem = chunk2mem(p); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + else if (nb < ms->topsize) { /* Split top */ + size_t rsize = ms->topsize -= nb; + mchunkptr p = ms->top; + mchunkptr r = ms->top = chunk_plus_offset(p, nb); + r->head = rsize | PINUSE_BIT; + set_size_and_pinuse_of_inuse_chunk(ms, p, nb); + mem = chunk2mem(p); + check_top_chunk(ms, ms->top); + check_malloced_chunk(ms, mem, nb); + goto postaction; + } + + mem = sys_alloc(ms, nb); + + postaction: + POSTACTION(ms); + return mem; + } + + return 0; +} + +void mspace_free(mspace msp, void* mem) { + if (mem != 0) { + mchunkptr p = mem2chunk(mem); +#if FOOTERS + mstate fm = get_mstate_for(p); +#else /* FOOTERS */ + mstate fm = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(fm)) { + USAGE_ERROR_ACTION(fm, p); + return; + } + if (!PREACTION(fm)) { + check_inuse_chunk(fm, p); + if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { + size_t psize = chunksize(p); + mchunkptr next = chunk_plus_offset(p, psize); + if (!pinuse(p)) { + size_t prevsize = p->prev_foot; + if ((prevsize & IS_MMAPPED_BIT) != 0) { + prevsize &= ~IS_MMAPPED_BIT; + psize += prevsize + MMAP_FOOT_PAD; + if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) + fm->footprint -= psize; + goto postaction; + } + else { + mchunkptr prev = chunk_minus_offset(p, prevsize); + psize += prevsize; + p = prev; + if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ + if (p != fm->dv) { + unlink_chunk(fm, p, prevsize); + } + else if ((next->head & INUSE_BITS) == INUSE_BITS) { + fm->dvsize = psize; + set_free_with_pinuse(p, psize, next); + goto postaction; + } + } + else + goto erroraction; + } + } + + if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { + if (!cinuse(next)) { /* consolidate forward */ + if (next == fm->top) { + size_t tsize = fm->topsize += psize; + fm->top = p; + p->head = tsize | PINUSE_BIT; + if (p == fm->dv) { + fm->dv = 0; + fm->dvsize = 0; + } + if (should_trim(fm, tsize)) + sys_trim(fm, 0); + goto postaction; + } + else if (next == fm->dv) { + size_t dsize = fm->dvsize += psize; + fm->dv = p; + set_size_and_pinuse_of_free_chunk(p, dsize); + goto postaction; + } + else { + size_t nsize = chunksize(next); + psize += nsize; + unlink_chunk(fm, next, nsize); + set_size_and_pinuse_of_free_chunk(p, psize); + if (p == fm->dv) { + fm->dvsize = psize; + goto postaction; + } + } + } + else + set_free_with_pinuse(p, psize, next); + insert_chunk(fm, p, psize); + check_free_chunk(fm, p); + goto postaction; + } + } + erroraction: + USAGE_ERROR_ACTION(fm, p); + postaction: + POSTACTION(fm); + } + } +} + +void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { + void* mem; + size_t req = 0; + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + if (n_elements != 0) { + req = n_elements * elem_size; + if (((n_elements | elem_size) & ~(size_t)0xffff) && + (req / n_elements != elem_size)) + req = MAX_SIZE_T; /* force downstream failure on overflow */ + } + mem = internal_malloc(ms, req); + if (mem != 0 && calloc_must_clear(mem2chunk(mem))) + memset(mem, 0, req); + return mem; +} + +void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { + if (oldmem == 0) + return mspace_malloc(msp, bytes); +#ifdef REALLOC_ZERO_BYTES_FREES + if (bytes == 0) { + mspace_free(msp, oldmem); + return 0; + } +#endif /* REALLOC_ZERO_BYTES_FREES */ + else { +#if FOOTERS + mchunkptr p = mem2chunk(oldmem); + mstate ms = get_mstate_for(p); +#else /* FOOTERS */ + mstate ms = (mstate)msp; +#endif /* FOOTERS */ + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_realloc(ms, oldmem, bytes); + } +} + +void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return internal_memalign(ms, alignment, bytes); +} + +void** mspace_independent_calloc(mspace msp, size_t n_elements, + size_t elem_size, void* chunks[]) { + size_t sz = elem_size; /* serves as 1-element array */ + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, &sz, 3, chunks); +} + +void** mspace_independent_comalloc(mspace msp, size_t n_elements, + size_t sizes[], void* chunks[]) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + return 0; + } + return ialloc(ms, n_elements, sizes, 0, chunks); +} + +int mspace_trim(mspace msp, size_t pad) { + int result = 0; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + if (!PREACTION(ms)) { + result = sys_trim(ms, pad); + POSTACTION(ms); + } + } + else { + USAGE_ERROR_ACTION(ms,ms); + } + return result; +} + +void mspace_malloc_stats(mspace msp) { + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + internal_malloc_stats(ms); + } + else { + USAGE_ERROR_ACTION(ms,ms); + } +} + +size_t mspace_footprint(mspace msp) { + size_t result; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->footprint; + } + USAGE_ERROR_ACTION(ms,ms); + return result; +} + + +size_t mspace_max_footprint(mspace msp) { + size_t result; + mstate ms = (mstate)msp; + if (ok_magic(ms)) { + result = ms->max_footprint; + } + USAGE_ERROR_ACTION(ms,ms); + return result; +} + + +#if !NO_MALLINFO +struct mallinfo mspace_mallinfo(mspace msp) { + mstate ms = (mstate)msp; + if (!ok_magic(ms)) { + USAGE_ERROR_ACTION(ms,ms); + } + return internal_mallinfo(ms); +} +#endif /* NO_MALLINFO */ + +int mspace_mallopt(int param_number, int value) { + return change_mparam(param_number, value); +} + +#endif /* MSPACES */ + +/* -------------------- Alternative MORECORE functions ------------------- */ + +/* + Guidelines for creating a custom version of MORECORE: + + * For best performance, MORECORE should allocate in multiples of pagesize. + * MORECORE may allocate more memory than requested. (Or even less, + but this will usually result in a malloc failure.) + * MORECORE must not allocate memory when given argument zero, but + instead return one past the end address of memory from previous + nonzero call. + * For best performance, consecutive calls to MORECORE with positive + arguments should return increasing addresses, indicating that + space has been contiguously extended. + * Even though consecutive calls to MORECORE need not return contiguous + addresses, it must be OK for malloc'ed chunks to span multiple + regions in those cases where they do happen to be contiguous. + * MORECORE need not handle negative arguments -- it may instead + just return MFAIL when given negative arguments. + Negative arguments are always multiples of pagesize. MORECORE + must not misinterpret negative args as large positive unsigned + args. You can suppress all such calls from even occurring by defining + MORECORE_CANNOT_TRIM, + + As an example alternative MORECORE, here is a custom allocator + kindly contributed for pre-OSX macOS. It uses virtually but not + necessarily physically contiguous non-paged memory (locked in, + present and won't get swapped out). You can use it by uncommenting + this section, adding some #includes, and setting up the appropriate + defines above: + + #define MORECORE osMoreCore + + There is also a shutdown routine that should somehow be called for + cleanup upon program exit. + + #define MAX_POOL_ENTRIES 100 + #define MINIMUM_MORECORE_SIZE (64 * 1024U) + static int next_os_pool; + void *our_os_pools[MAX_POOL_ENTRIES]; + + void *osMoreCore(int size) + { + void *ptr = 0; + static void *sbrk_top = 0; + + if (size > 0) + { + if (size < MINIMUM_MORECORE_SIZE) + size = MINIMUM_MORECORE_SIZE; + if (CurrentExecutionLevel() == kTaskLevel) + ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); + if (ptr == 0) + { + return (void *) MFAIL; + } + // save ptrs so they can be freed during cleanup + our_os_pools[next_os_pool] = ptr; + next_os_pool++; + ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); + sbrk_top = (char *) ptr + size; + return ptr; + } + else if (size < 0) + { + // we don't currently support shrink behavior + return (void *) MFAIL; + } + else + { + return sbrk_top; + } + } + + // cleanup any allocated memory pools + // called as last thing before shutting down driver + + void osCleanupMem(void) + { + void **ptr; + + for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) + if (*ptr) + { + PoolDeallocate(*ptr); + *ptr = 0; + } + } + +*/ + + +/* ----------------------------------------------------------------------- +History: + V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) + * Add max_footprint functions + * Ensure all appropriate literals are size_t + * Fix conditional compilation problem for some #define settings + * Avoid concatenating segments with the one provided + in create_mspace_with_base + * Rename some variables to avoid compiler shadowing warnings + * Use explicit lock initialization. + * Better handling of sbrk interference. + * Simplify and fix segment insertion, trimming and mspace_destroy + * Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x + * Thanks especially to Dennis Flanagan for help on these. + + V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) + * Fix memalign brace error. + + V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) + * Fix improper #endif nesting in C++ + * Add explicit casts needed for C++ + + V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) + * Use trees for large bins + * Support mspaces + * Use segments to unify sbrk-based and mmap-based system allocation, + removing need for emulation on most platforms without sbrk. + * Default safety checks + * Optional footer checks. Thanks to William Robertson for the idea. + * Internal code refactoring + * Incorporate suggestions and platform-specific changes. + Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, + Aaron Bachmann, Emery Berger, and others. + * Speed up non-fastbin processing enough to remove fastbins. + * Remove useless cfree() to avoid conflicts with other apps. + * Remove internal memcpy, memset. Compilers handle builtins better. + * Remove some options that no one ever used and rename others. + + V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) + * Fix malloc_state bitmap array misdeclaration + + V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) + * Allow tuning of FIRST_SORTED_BIN_SIZE + * Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. + * Better detection and support for non-contiguousness of MORECORE. + Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger + * Bypass most of malloc if no frees. Thanks To Emery Berger. + * Fix freeing of old top non-contiguous chunk im sysmalloc. + * Raised default trim and map thresholds to 256K. + * Fix mmap-related #defines. Thanks to Lubos Lunak. + * Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. + * Branch-free bin calculation + * Default trim and mmap thresholds now 256K. + + V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) + * Introduce independent_comalloc and independent_calloc. + Thanks to Michael Pachos for motivation and help. + * Make optional .h file available + * Allow > 2GB requests on 32bit systems. + * new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>. + Thanks also to Andreas Mueller <a.mueller at paradatec.de>, + and Anonymous. + * Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for + helping test this.) + * memalign: check alignment arg + * realloc: don't try to shift chunks backwards, since this + leads to more fragmentation in some programs and doesn't + seem to help in any others. + * Collect all cases in malloc requiring system memory into sysmalloc + * Use mmap as backup to sbrk + * Place all internal state in malloc_state + * Introduce fastbins (although similar to 2.5.1) + * Many minor tunings and cosmetic improvements + * Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK + * Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS + Thanks to Tony E. Bennett <tbennett@nvidia.com> and others. + * Include errno.h to support default failure action. + + V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) + * return null for negative arguments + * Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com> + * Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' + (e.g. WIN32 platforms) + * Cleanup header file inclusion for WIN32 platforms + * Cleanup code to avoid Microsoft Visual C++ compiler complaints + * Add 'USE_DL_PREFIX' to quickly allow co-existence with existing + memory allocation routines + * Set 'malloc_getpagesize' for WIN32 platforms (needs more work) + * Use 'assert' rather than 'ASSERT' in WIN32 code to conform to + usage of 'assert' in non-WIN32 code + * Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to + avoid infinite loop + * Always call 'fREe()' rather than 'free()' + + V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) + * Fixed ordering problem with boundary-stamping + + V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) + * Added pvalloc, as recommended by H.J. Liu + * Added 64bit pointer support mainly from Wolfram Gloger + * Added anonymously donated WIN32 sbrk emulation + * Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen + * malloc_extend_top: fix mask error that caused wastage after + foreign sbrks + * Add linux mremap support code from HJ Liu + + V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) + * Integrated most documentation with the code. + * Add support for mmap, with help from + Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Use last_remainder in more cases. + * Pack bins using idea from colin@nyx10.cs.du.edu + * Use ordered bins instead of best-fit threshold + * Eliminate block-local decls to simplify tracing and debugging. + * Support another case of realloc via move into top + * Fix error occurring when initial sbrk_base not word-aligned. + * Rely on page size for units instead of SBRK_UNIT to + avoid surprises about sbrk alignment conventions. + * Add mallinfo, mallopt. Thanks to Raymond Nijssen + (raymond@es.ele.tue.nl) for the suggestion. + * Add `pad' argument to malloc_trim and top_pad mallopt parameter. + * More precautions for cases where other routines call sbrk, + courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). + * Added macros etc., allowing use in linux libc from + H.J. Lu (hjl@gnu.ai.mit.edu) + * Inverted this history list + + V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) + * Re-tuned and fixed to behave more nicely with V2.6.0 changes. + * Removed all preallocation code since under current scheme + the work required to undo bad preallocations exceeds + the work saved in good cases for most test programs. + * No longer use return list or unconsolidated bins since + no scheme using them consistently outperforms those that don't + given above changes. + * Use best fit for very large chunks to prevent some worst-cases. + * Added some support for debugging + + V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) + * Removed footers when chunks are in use. Thanks to + Paul Wilson (wilson@cs.texas.edu) for the suggestion. + + V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) + * Added malloc_trim, with help from Wolfram Gloger + (wmglo@Dent.MED.Uni-Muenchen.DE). + + V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) + + V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) + * realloc: try to expand in both directions + * malloc: swap order of clean-bin strategy; + * realloc: only conditionally expand backwards + * Try not to scavenge used bins + * Use bin counts as a guide to preallocation + * Occasionally bin return list chunks in first scan + * Add a few optimizations from colin@nyx10.cs.du.edu + + V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) + * faster bin computation & slightly different binning + * merged all consolidations to one part of malloc proper + (eliminating old malloc_find_space & malloc_clean_bin) + * Scan 2 returns chunks (not just 1) + * Propagate failure in realloc if malloc returns 0 + * Add stuff to allow compilation on non-ANSI compilers + from kpv@research.att.com + + V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) + * removed potential for odd address access in prev_chunk + * removed dependency on getpagesize.h + * misc cosmetics and a bit more internal documentation + * anticosmetics: mangled names in macros to evade debugger strangeness + * tested on sparc, hp-700, dec-mips, rs6000 + with gcc & native cc (hp, dec only) allowing + Detlefs & Zorn comparison study (in SIGPLAN Notices.) + + Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) + * Based loosely on libg++-1.2X malloc. (It retains some of the overall + structure of old version, but most details differ.) + +*/ diff --git a/Stinger/libffi/darwin_common/src/java_raw_api.c b/Stinger/libffi/darwin_common/src/java_raw_api.c new file mode 100644 index 0000000..35ca89a --- /dev/null +++ b/Stinger/libffi/darwin_common/src/java_raw_api.c @@ -0,0 +1,374 @@ +/* ----------------------------------------------------------------------- + java_raw_api.c - Copyright (c) 1999, 2007, 2008 Red Hat, Inc. + + Cloned from raw_api.c + + Raw_api.c author: Kresten Krab Thorup <krab@gnu.org> + Java_raw_api.c author: Hans-J. Boehm <hboehm@hpl.hp.com> + + $Id $ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* This defines a Java- and 64-bit specific variant of the raw API. */ +/* It assumes that "raw" argument blocks look like Java stacks on a */ +/* 64-bit machine. Arguments that can be stored in a single stack */ +/* stack slots (longs, doubles) occupy 128 bits, but only the first */ +/* 64 bits are actually used. */ + +#include "ffi.h" +#include "ffi_common.h" +#include <stdlib.h> + +#if !defined(NO_JAVA_RAW_API) + +size_t +ffi_java_raw_size (ffi_cif *cif) +{ + size_t result = 0; + int i; + + ffi_type **at = cif->arg_types; + + for (i = cif->nargs-1; i >= 0; i--, at++) + { + switch((*at) -> type) { + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + result += 2 * FFI_SIZEOF_JAVA_RAW; + break; + case FFI_TYPE_STRUCT: + /* No structure parameters in Java. */ + abort(); + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + default: + result += FFI_SIZEOF_JAVA_RAW; + } + } + + return result; +} + + +void +ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + +#if WORDS_BIGENDIAN + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + *args = (void*) ((char*)(raw++) + 3); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + *args = (void*) ((char*)(raw++) + 2); + break; + +#if FFI_SIZEOF_JAVA_RAW == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + *args = (void *)raw; + raw += 2; + break; +#endif + + case FFI_TYPE_POINTER: + *args = (void*) &(raw++)->ptr; + break; + + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + + default: + *args = raw; + raw += + FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); + } + } + +#else /* WORDS_BIGENDIAN */ + +#if !PDP + + /* then assume little endian */ + for (i = 0; i < cif->nargs; i++, tp++, args++) + { +#if FFI_SIZEOF_JAVA_RAW == 8 + switch((*tp)->type) { + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + *args = (void*) raw; + raw += 2; + break; + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + default: + *args = (void*) raw++; + } +#else /* FFI_SIZEOF_JAVA_RAW != 8 */ + *args = (void*) raw; + raw += + FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); +#endif /* FFI_SIZEOF_JAVA_RAW == 8 */ + } + +#else +#error "pdp endian not supported" +#endif /* ! PDP */ + +#endif /* WORDS_BIGENDIAN */ +} + +void +ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT8*) (*args); +#else + (raw++)->uint = *(UINT8*) (*args); +#endif + break; + + case FFI_TYPE_SINT8: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT8*) (*args); +#else + (raw++)->sint = *(SINT8*) (*args); +#endif + break; + + case FFI_TYPE_UINT16: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT16*) (*args); +#else + (raw++)->uint = *(UINT16*) (*args); +#endif + break; + + case FFI_TYPE_SINT16: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT16*) (*args); +#else + (raw++)->sint = *(SINT16*) (*args); +#endif + break; + + case FFI_TYPE_UINT32: +#if WORDS_BIGENDIAN + *(UINT32*)(raw++) = *(UINT32*) (*args); +#else + (raw++)->uint = *(UINT32*) (*args); +#endif + break; + + case FFI_TYPE_SINT32: +#if WORDS_BIGENDIAN + *(SINT32*)(raw++) = *(SINT32*) (*args); +#else + (raw++)->sint = *(SINT32*) (*args); +#endif + break; + + case FFI_TYPE_FLOAT: + (raw++)->flt = *(FLOAT32*) (*args); + break; + +#if FFI_SIZEOF_JAVA_RAW == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_DOUBLE: + raw->uint = *(UINT64*) (*args); + raw += 2; + break; +#endif + + case FFI_TYPE_POINTER: + (raw++)->ptr = **(void***) args; + break; + + default: +#if FFI_SIZEOF_JAVA_RAW == 8 + FFI_ASSERT(0); /* Should have covered all cases */ +#else + memcpy ((void*) raw->data, (void*)*args, (*tp)->size); + raw += + FFI_ALIGN ((*tp)->size, sizeof(ffi_java_raw)) / sizeof(ffi_java_raw); +#endif + } + } +} + +#if !FFI_NATIVE_RAW_API + +static void +ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) +{ +#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 + switch (cif->rtype->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT32: + *(UINT64 *)rvalue <<= 32; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_INT: +#if FFI_SIZEOF_JAVA_RAW == 4 + case FFI_TYPE_POINTER: +#endif + *(SINT64 *)rvalue <<= 32; + break; + + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + + default: + break; + } +#endif +} + +static void +ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) +{ +#if WORDS_BIGENDIAN && FFI_SIZEOF_ARG == 8 + switch (cif->rtype->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_UINT32: + *(UINT64 *)rvalue >>= 32; + break; + + case FFI_TYPE_SINT8: + case FFI_TYPE_SINT16: + case FFI_TYPE_SINT32: + case FFI_TYPE_INT: + *(SINT64 *)rvalue >>= 32; + break; + + case FFI_TYPE_COMPLEX: + /* Not supported yet. */ + abort(); + + default: + break; + } +#endif +} + +/* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. + * Having this, allows code to be written for the raw API, without + * the need for system-specific code to handle input in that format; + * these following couple of functions will handle the translation forth + * and back automatically. */ + +void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, + ffi_java_raw *raw) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_java_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); + ffi_java_rvalue_to_raw (cif, rvalue); +} + +#if FFI_CLOSURES /* base system provides closures */ + +static void +ffi_java_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) +{ + ffi_java_raw *raw = (ffi_java_raw*)alloca (ffi_java_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_java_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, (ffi_raw*)raw, cl->user_data); + ffi_java_raw_to_rvalue (cif, rvalue); +} + +ffi_status +ffi_prep_java_raw_closure_loc (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data, + void *codeloc) +{ + ffi_status status; + + status = ffi_prep_closure_loc ((ffi_closure*) cl, + cif, + &ffi_java_translate_args, + codeloc, + codeloc); + if (status == FFI_OK) + { + cl->fun = fun; + cl->user_data = user_data; + } + + return status; +} + +/* Again, here is the generic version of ffi_prep_raw_closure, which + * will install an intermediate "hub" for translation of arguments from + * the pointer-array format, to the raw format */ + +ffi_status +ffi_prep_java_raw_closure (ffi_java_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), + void *user_data) +{ + return ffi_prep_java_raw_closure_loc (cl, cif, fun, user_data, cl); +} + +#endif /* FFI_CLOSURES */ +#endif /* !FFI_NATIVE_RAW_API */ +#endif /* !NO_JAVA_RAW_API */ diff --git a/Stinger/libffi/darwin_common/src/prep_cif.c b/Stinger/libffi/darwin_common/src/prep_cif.c new file mode 100644 index 0000000..c49c7b3 --- /dev/null +++ b/Stinger/libffi/darwin_common/src/prep_cif.c @@ -0,0 +1,263 @@ +/* ----------------------------------------------------------------------- + prep_cif.c - Copyright (c) 2011, 2012 Anthony Green + Copyright (c) 1996, 1998, 2007 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include "ffi.h" +#include "ffi_common.h" +#include <stdlib.h> + +/* Round up to FFI_SIZEOF_ARG. */ + +#define STACK_ARG_SIZE(x) FFI_ALIGN(x, FFI_SIZEOF_ARG) + +/* Perform machine independent initialization of aggregate type + specifications. */ + +static ffi_status initialize_aggregate(ffi_type *arg, size_t *offsets) +{ + ffi_type **ptr; + + if (UNLIKELY(arg == NULL || arg->elements == NULL)) + return FFI_BAD_TYPEDEF; + + arg->size = 0; + arg->alignment = 0; + + ptr = &(arg->elements[0]); + + if (UNLIKELY(ptr == 0)) + return FFI_BAD_TYPEDEF; + + while ((*ptr) != NULL) + { + if (UNLIKELY(((*ptr)->size == 0) + && (initialize_aggregate((*ptr), NULL) != FFI_OK))) + return FFI_BAD_TYPEDEF; + + /* Perform a sanity check on the argument type */ + FFI_ASSERT_VALID_TYPE(*ptr); + + arg->size = FFI_ALIGN(arg->size, (*ptr)->alignment); + if (offsets) + *offsets++ = arg->size; + arg->size += (*ptr)->size; + + arg->alignment = (arg->alignment > (*ptr)->alignment) ? + arg->alignment : (*ptr)->alignment; + + ptr++; + } + + /* Structure size includes tail padding. This is important for + structures that fit in one register on ABIs like the PowerPC64 + Linux ABI that right justify small structs in a register. + It's also needed for nested structure layout, for example + struct A { long a; char b; }; struct B { struct A x; char y; }; + should find y at an offset of 2*sizeof(long) and result in a + total size of 3*sizeof(long). */ + arg->size = FFI_ALIGN (arg->size, arg->alignment); + + /* On some targets, the ABI defines that structures have an additional + alignment beyond the "natural" one based on their elements. */ +#ifdef FFI_AGGREGATE_ALIGNMENT + if (FFI_AGGREGATE_ALIGNMENT > arg->alignment) + arg->alignment = FFI_AGGREGATE_ALIGNMENT; +#endif + + if (arg->size == 0) + return FFI_BAD_TYPEDEF; + else + return FFI_OK; +} + +#ifndef __CRIS__ +/* The CRIS ABI specifies structure elements to have byte + alignment only, so it completely overrides this functions, + which assumes "natural" alignment and padding. */ + +/* Perform machine independent ffi_cif preparation, then call + machine dependent routine. */ + +/* For non variadic functions isvariadic should be 0 and + nfixedargs==ntotalargs. + + For variadic calls, isvariadic should be 1 and nfixedargs + and ntotalargs set as appropriate. nfixedargs must always be >=1 */ + + +ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, + unsigned int isvariadic, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, ffi_type **atypes) +{ + unsigned bytes = 0; + unsigned int i; + ffi_type **ptr; + + FFI_ASSERT(cif != NULL); + FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); + FFI_ASSERT(nfixedargs <= ntotalargs); + + if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) + return FFI_BAD_ABI; + + cif->abi = abi; + cif->arg_types = atypes; + cif->nargs = ntotalargs; + cif->rtype = rtype; + + cif->flags = 0; +#if (defined(_M_ARM64) || defined(__aarch64__)) && defined(_WIN32) + cif->is_variadic = isvariadic; +#endif +#if HAVE_LONG_DOUBLE_VARIANT + ffi_prep_types (abi); +#endif + + /* Initialize the return type if necessary */ + if ((cif->rtype->size == 0) + && (initialize_aggregate(cif->rtype, NULL) != FFI_OK)) + return FFI_BAD_TYPEDEF; + +#ifndef FFI_TARGET_HAS_COMPLEX_TYPE + if (rtype->type == FFI_TYPE_COMPLEX) + abort(); +#endif + /* Perform a sanity check on the return type */ + FFI_ASSERT_VALID_TYPE(cif->rtype); + + /* x86, x86-64 and s390 stack space allocation is handled in prep_machdep. */ +#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT +#ifdef TILE + && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) +#endif +#ifdef XTENSA + && (cif->rtype->size > 16) +#endif +#ifdef NIOS2 + && (cif->rtype->size > 8) +#endif + ) + bytes = STACK_ARG_SIZE(sizeof(void*)); +#endif + + for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) + { + + /* Initialize any uninitialized aggregate type definitions */ + if (((*ptr)->size == 0) + && (initialize_aggregate((*ptr), NULL) != FFI_OK)) + return FFI_BAD_TYPEDEF; + +#ifndef FFI_TARGET_HAS_COMPLEX_TYPE + if ((*ptr)->type == FFI_TYPE_COMPLEX) + abort(); +#endif + /* Perform a sanity check on the argument type, do this + check after the initialization. */ + FFI_ASSERT_VALID_TYPE(*ptr); + +#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION + { + /* Add any padding if necessary */ + if (((*ptr)->alignment - 1) & bytes) + bytes = (unsigned)FFI_ALIGN(bytes, (*ptr)->alignment); + +#ifdef TILE + if (bytes < 10 * FFI_SIZEOF_ARG && + bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) + { + /* An argument is never split between the 10 parameter + registers and the stack. */ + bytes = 10 * FFI_SIZEOF_ARG; + } +#endif +#ifdef XTENSA + if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) + bytes = 6*4; +#endif + + bytes += (unsigned int)STACK_ARG_SIZE((*ptr)->size); + } +#endif + } + + cif->bytes = bytes; + + /* Perform machine dependent cif processing */ +#ifdef FFI_TARGET_SPECIFIC_VARIADIC + if (isvariadic) + return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); +#endif + + return ffi_prep_cif_machdep(cif); +} +#endif /* not __CRIS__ */ + +ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, + ffi_type *rtype, ffi_type **atypes) +{ + return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); +} + +ffi_status ffi_prep_cif_var(ffi_cif *cif, + ffi_abi abi, + unsigned int nfixedargs, + unsigned int ntotalargs, + ffi_type *rtype, + ffi_type **atypes) +{ + return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); +} + +#if FFI_CLOSURES + +ffi_status +ffi_prep_closure (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data) +{ + return ffi_prep_closure_loc (closure, cif, fun, user_data, closure); +} + +#endif + +ffi_status +ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets) +{ + if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) + return FFI_BAD_ABI; + if (struct_type->type != FFI_TYPE_STRUCT) + return FFI_BAD_TYPEDEF; + +#if HAVE_LONG_DOUBLE_VARIANT + ffi_prep_types (abi); +#endif + + return initialize_aggregate(struct_type, offsets); +} diff --git a/Stinger/libffi/darwin_common/src/raw_api.c b/Stinger/libffi/darwin_common/src/raw_api.c new file mode 100644 index 0000000..3c6b7f0 --- /dev/null +++ b/Stinger/libffi/darwin_common/src/raw_api.c @@ -0,0 +1,267 @@ +/* ----------------------------------------------------------------------- + raw_api.c - Copyright (c) 1999, 2008 Red Hat, Inc. + + Author: Kresten Krab Thorup <krab@gnu.org> + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* This file defines generic functions for use with the raw api. */ + +#include "ffi.h" +#include "ffi_common.h" + +#if !FFI_NO_RAW_API + +size_t +ffi_raw_size (ffi_cif *cif) +{ + size_t result = 0; + int i; + + ffi_type **at = cif->arg_types; + + for (i = cif->nargs-1; i >= 0; i--, at++) + { +#if !FFI_NO_STRUCTS + if ((*at)->type == FFI_TYPE_STRUCT) + result += FFI_ALIGN (sizeof (void*), FFI_SIZEOF_ARG); + else +#endif + result += FFI_ALIGN ((*at)->size, FFI_SIZEOF_ARG); + } + + return result; +} + + +void +ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + +#if WORDS_BIGENDIAN + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 1); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 2); + break; + +#if FFI_SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + *args = (void*) ((char*)(raw++) + FFI_SIZEOF_ARG - 4); + break; +#endif + +#if !FFI_NO_STRUCTS + case FFI_TYPE_STRUCT: + *args = (raw++)->ptr; + break; +#endif + + case FFI_TYPE_COMPLEX: + *args = (raw++)->ptr; + break; + + case FFI_TYPE_POINTER: + *args = (void*) &(raw++)->ptr; + break; + + default: + *args = raw; + raw += FFI_ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } + +#else /* WORDS_BIGENDIAN */ + +#if !PDP + + /* then assume little endian */ + for (i = 0; i < cif->nargs; i++, tp++, args++) + { +#if !FFI_NO_STRUCTS + if ((*tp)->type == FFI_TYPE_STRUCT) + { + *args = (raw++)->ptr; + } + else +#endif + if ((*tp)->type == FFI_TYPE_COMPLEX) + { + *args = (raw++)->ptr; + } + else + { + *args = (void*) raw; + raw += FFI_ALIGN ((*tp)->size, sizeof (void*)) / sizeof (void*); + } + } + +#else +#error "pdp endian not supported" +#endif /* ! PDP */ + +#endif /* WORDS_BIGENDIAN */ +} + +void +ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw) +{ + unsigned i; + ffi_type **tp = cif->arg_types; + + for (i = 0; i < cif->nargs; i++, tp++, args++) + { + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: + (raw++)->uint = *(UINT8*) (*args); + break; + + case FFI_TYPE_SINT8: + (raw++)->sint = *(SINT8*) (*args); + break; + + case FFI_TYPE_UINT16: + (raw++)->uint = *(UINT16*) (*args); + break; + + case FFI_TYPE_SINT16: + (raw++)->sint = *(SINT16*) (*args); + break; + +#if FFI_SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: + (raw++)->uint = *(UINT32*) (*args); + break; + + case FFI_TYPE_SINT32: + (raw++)->sint = *(SINT32*) (*args); + break; +#endif + +#if !FFI_NO_STRUCTS + case FFI_TYPE_STRUCT: + (raw++)->ptr = *args; + break; +#endif + + case FFI_TYPE_COMPLEX: + (raw++)->ptr = *args; + break; + + case FFI_TYPE_POINTER: + (raw++)->ptr = **(void***) args; + break; + + default: + memcpy ((void*) raw->data, (void*)*args, (*tp)->size); + raw += FFI_ALIGN ((*tp)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; + } + } +} + +#if !FFI_NATIVE_RAW_API + + +/* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. + * Having this, allows code to be written for the raw API, without + * the need for system-specific code to handle input in that format; + * these following couple of functions will handle the translation forth + * and back automatically. */ + +void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *raw) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); +} + +#if FFI_CLOSURES /* base system provides closures */ + +static void +ffi_translate_args (ffi_cif *cif, void *rvalue, + void **avalue, void *user_data) +{ + ffi_raw *raw = (ffi_raw*)alloca (ffi_raw_size (cif)); + ffi_raw_closure *cl = (ffi_raw_closure*)user_data; + + ffi_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, raw, cl->user_data); +} + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + ffi_status status; + + status = ffi_prep_closure_loc ((ffi_closure*) cl, + cif, + &ffi_translate_args, + codeloc, + codeloc); + if (status == FFI_OK) + { + cl->fun = fun; + cl->user_data = user_data; + } + + return status; +} + +#endif /* FFI_CLOSURES */ +#endif /* !FFI_NATIVE_RAW_API */ + +#if FFI_CLOSURES + +/* Again, here is the generic version of ffi_prep_raw_closure, which + * will install an intermediate "hub" for translation of arguments from + * the pointer-array format, to the raw format */ + +ffi_status +ffi_prep_raw_closure (ffi_raw_closure* cl, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data) +{ + return ffi_prep_raw_closure_loc (cl, cif, fun, user_data, cl); +} + +#endif /* FFI_CLOSURES */ + +#endif /* !FFI_NO_RAW_API */ diff --git a/Stinger/libffi/darwin_common/src/types.c b/Stinger/libffi/darwin_common/src/types.c new file mode 100644 index 0000000..b640761 --- /dev/null +++ b/Stinger/libffi/darwin_common/src/types.c @@ -0,0 +1,108 @@ +/* ----------------------------------------------------------------------- + types.c - Copyright (c) 1996, 1998 Red Hat, Inc. + + Predefined ffi_types needed by libffi. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +/* Hide the basic type definitions from the header file, so that we + can redefine them here as "const". */ +#define LIBFFI_HIDE_BASIC_TYPES + +#include "ffi.h" +#include "ffi_common.h" + +/* Type definitions */ + +#define FFI_TYPEDEF(name, type, id, maybe_const)\ +struct struct_align_##name { \ + char c; \ + type x; \ +}; \ +FFI_EXTERN \ +maybe_const ffi_type ffi_type_##name = { \ + sizeof(type), \ + offsetof(struct struct_align_##name, x), \ + id, NULL \ +} + +#define FFI_COMPLEX_TYPEDEF(name, type, maybe_const) \ +static ffi_type *ffi_elements_complex_##name [2] = { \ + (ffi_type *)(&ffi_type_##name), NULL \ +}; \ +struct struct_align_complex_##name { \ + char c; \ + _Complex type x; \ +}; \ +FFI_EXTERN \ +maybe_const ffi_type ffi_type_complex_##name = { \ + sizeof(_Complex type), \ + offsetof(struct struct_align_complex_##name, x), \ + FFI_TYPE_COMPLEX, \ + (ffi_type **)ffi_elements_complex_##name \ +} + +/* Size and alignment are fake here. They must not be 0. */ +FFI_EXTERN const ffi_type ffi_type_void = { + 1, 1, FFI_TYPE_VOID, NULL +}; + +FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8, const); +FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8, const); +FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16, const); +FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16, const); +FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32, const); +FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32, const); +FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64, const); +FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64, const); + +FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER, const); + +FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT, const); +FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE, const); + +#if !defined HAVE_LONG_DOUBLE_VARIANT || defined __alpha__ +#define FFI_LDBL_CONST const +#else +#define FFI_LDBL_CONST +#endif + +#ifdef __alpha__ +/* Even if we're not configured to default to 128-bit long double, + maintain binary compatibility, as -mlong-double-128 can be used + at any time. */ +/* Validate the hard-coded number below. */ +# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +const ffi_type ffi_type_longdouble = { 16, 16, 4, NULL }; +#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE, FFI_LDBL_CONST); +#endif + +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE +FFI_COMPLEX_TYPEDEF(float, float, const); +FFI_COMPLEX_TYPEDEF(double, double, const); +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST); +#endif +#endif diff --git a/Stinger/Classes/libffi/ffi_arm64.h b/Stinger/libffi/darwin_ios/include/ffi_arm64.h old mode 100755 new mode 100644 similarity index 83% rename from Stinger/Classes/libffi/ffi_arm64.h rename to Stinger/libffi/darwin_ios/include/ffi_arm64.h index 935ab3e..40d9bc8 --- a/Stinger/Classes/libffi/ffi_arm64.h +++ b/Stinger/libffi/darwin_ios/include/ffi_arm64.h @@ -1,5 +1,7 @@ +#ifdef __arm64__ + /* -----------------------------------------------------------------*-C-*- - libffi 3.99999 - Copyright (c) 2011, 2014 Anthony Green + libffi 3.3 - Copyright (c) 2011, 2014, 2019 Anthony Green - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person @@ -108,6 +110,32 @@ typedef struct _ffi_type struct _ffi_type **elements; } ffi_type; +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + #ifndef LIBFFI_HIDE_BASIC_TYPES #if SCHAR_MAX == 127 # define ffi_type_uchar ffi_type_uint8 @@ -157,19 +185,6 @@ typedef struct _ffi_type #error "long size not supported" #endif -/* Need minimal decorations for DLLs to works on Windows. GCC has - autoimport and autoexport. Rely on Libtool to help MSVC export - from a DLL, but always declare data to be imported for MSVC - clients. This costs an extra indirection for MSVC clients using - the static version of the library, but don't worry about that. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER && !defined FFI_BUILDING -#define FFI_EXTERN extern __declspec(dllimport) -#else -#define FFI_EXTERN extern -#endif - /* These are defined in types.c. */ FFI_EXTERN ffi_type ffi_type_void; FFI_EXTERN ffi_type ffi_type_uint8; @@ -256,27 +271,34 @@ typedef ffi_raw ffi_java_raw; #endif +FFI_API void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue); -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); /* This is analogous to the raw API, except it uses Java parameter packing, even on 64-bit machines. I.e. on 64-bit machines longs and doubles are followed by an empty 64-bit word. */ +#if !FFI_NATIVE_RAW_API +FFI_API void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, - ffi_java_raw *avalue); + ffi_java_raw *avalue) __attribute__((deprecated)); +#endif -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); /* ---- Definitions for closures ----------------------------------------- */ @@ -307,17 +329,30 @@ typedef struct { # endif #endif -void *ffi_closure_alloc (size_t size, void **code); -void ffi_closure_free (void *); +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); + +#if defined(PA_LINUX) || defined(PA_HPUX) +#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) +#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) +#else +#define FFI_CLOSURE_PTR(X) (X) +#define FFI_RESTORE_PTR(X) (X) +#endif -ffi_status +FFI_API ffi_status ffi_prep_closure (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))); +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; -ffi_status +FFI_API ffi_status ffi_prep_closure_loc (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), @@ -378,31 +413,33 @@ typedef struct { } ffi_java_raw_closure; -ffi_status +FFI_API ffi_status ffi_prep_raw_closure (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data); -ffi_status +FFI_API ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc); -ffi_status +#if !FFI_NATIVE_RAW_API +FFI_API ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data); + void *user_data) __attribute__((deprecated)); -ffi_status +FFI_API ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, - void *codeloc); + void *codeloc) __attribute__((deprecated)); +#endif #endif /* FFI_CLOSURES */ @@ -414,22 +451,24 @@ typedef struct { void (*fun)(ffi_cif*,void*,void**,void*); } ffi_go_closure; -ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*)); -void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue, void *closure); #endif /* FFI_GO_CLOSURES */ /* ---- Public interface definition -------------------------------------- */ +FFI_API ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes); +FFI_API ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, @@ -437,11 +476,13 @@ ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_type *rtype, ffi_type **atypes); +FFI_API void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); +FFI_API ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets); @@ -482,3 +523,6 @@ ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, #endif #endif + + +#endif diff --git a/Stinger/Classes/libffi/ffi_arm.h b/Stinger/libffi/darwin_ios/include/ffi_armv7.h old mode 100755 new mode 100644 similarity index 83% rename from Stinger/Classes/libffi/ffi_arm.h rename to Stinger/libffi/darwin_ios/include/ffi_armv7.h index 56a8be2..12f72b7 --- a/Stinger/Classes/libffi/ffi_arm.h +++ b/Stinger/libffi/darwin_ios/include/ffi_armv7.h @@ -1,5 +1,7 @@ +#ifdef __arm__ + /* -----------------------------------------------------------------*-C-*- - libffi 3.99999 - Copyright (c) 2011, 2014 Anthony Green + libffi 3.3 - Copyright (c) 2011, 2014, 2019 Anthony Green - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person @@ -108,6 +110,32 @@ typedef struct _ffi_type struct _ffi_type **elements; } ffi_type; +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + #ifndef LIBFFI_HIDE_BASIC_TYPES #if SCHAR_MAX == 127 # define ffi_type_uchar ffi_type_uint8 @@ -157,19 +185,6 @@ typedef struct _ffi_type #error "long size not supported" #endif -/* Need minimal decorations for DLLs to works on Windows. GCC has - autoimport and autoexport. Rely on Libtool to help MSVC export - from a DLL, but always declare data to be imported for MSVC - clients. This costs an extra indirection for MSVC clients using - the static version of the library, but don't worry about that. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER && !defined FFI_BUILDING -#define FFI_EXTERN extern __declspec(dllimport) -#else -#define FFI_EXTERN extern -#endif - /* These are defined in types.c. */ FFI_EXTERN ffi_type ffi_type_void; FFI_EXTERN ffi_type ffi_type_uint8; @@ -256,27 +271,34 @@ typedef ffi_raw ffi_java_raw; #endif +FFI_API void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue); -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); /* This is analogous to the raw API, except it uses Java parameter packing, even on 64-bit machines. I.e. on 64-bit machines longs and doubles are followed by an empty 64-bit word. */ +#if !FFI_NATIVE_RAW_API +FFI_API void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, - ffi_java_raw *avalue); + ffi_java_raw *avalue) __attribute__((deprecated)); +#endif -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); /* ---- Definitions for closures ----------------------------------------- */ @@ -307,17 +329,30 @@ typedef struct { # endif #endif -void *ffi_closure_alloc (size_t size, void **code); -void ffi_closure_free (void *); +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); + +#if defined(PA_LINUX) || defined(PA_HPUX) +#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) +#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) +#else +#define FFI_CLOSURE_PTR(X) (X) +#define FFI_RESTORE_PTR(X) (X) +#endif -ffi_status +FFI_API ffi_status ffi_prep_closure (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))); +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; -ffi_status +FFI_API ffi_status ffi_prep_closure_loc (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), @@ -378,31 +413,33 @@ typedef struct { } ffi_java_raw_closure; -ffi_status +FFI_API ffi_status ffi_prep_raw_closure (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data); -ffi_status +FFI_API ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc); -ffi_status +#if !FFI_NATIVE_RAW_API +FFI_API ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data); + void *user_data) __attribute__((deprecated)); -ffi_status +FFI_API ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, - void *codeloc); + void *codeloc) __attribute__((deprecated)); +#endif #endif /* FFI_CLOSURES */ @@ -414,22 +451,24 @@ typedef struct { void (*fun)(ffi_cif*,void*,void**,void*); } ffi_go_closure; -ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*)); -void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue, void *closure); #endif /* FFI_GO_CLOSURES */ /* ---- Public interface definition -------------------------------------- */ +FFI_API ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes); +FFI_API ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, @@ -437,11 +476,13 @@ ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_type *rtype, ffi_type **atypes); +FFI_API void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); +FFI_API ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets); @@ -482,3 +523,6 @@ ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, #endif #endif + + +#endif diff --git a/Stinger/Classes/libffi/ffi_i386.h b/Stinger/libffi/darwin_ios/include/ffi_i386.h similarity index 73% rename from Stinger/Classes/libffi/ffi_i386.h rename to Stinger/libffi/darwin_ios/include/ffi_i386.h index 331c685..0042912 100644 --- a/Stinger/Classes/libffi/ffi_i386.h +++ b/Stinger/libffi/darwin_ios/include/ffi_i386.h @@ -1,7 +1,7 @@ #ifdef __i386__ /* -----------------------------------------------------------------*-C-*- - libffi 3.2.1 - Copyright (c) 2011, 2014 Anthony Green + libffi 3.3 - Copyright (c) 2011, 2014, 2019 Anthony Green - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person @@ -27,23 +27,14 @@ ----------------------------------------------------------------------- */ /* ------------------------------------------------------------------- - The basic API is described in the README file. + Most of the API is documented in doc/libffi.texi. - The raw API is designed to bypass some of the argument packing - and unpacking on architectures for which it can be avoided. + The raw API is designed to bypass some of the argument packing and + unpacking on architectures for which it can be avoided. Routines + are provided to emulate the raw API if the underlying platform + doesn't allow faster implementation. - The closure API allows interpreted functions to be packaged up - inside a C function pointer, so that they can be called as C functions, - with no understanding on the client side that they are interpreted. - It can also be used in other cases in which it is necessary to package - up a user specified parameter and a function pointer as a single - function pointer. - - The closure API must be implemented in order to get its functionality, - e.g. for use by gij. Routines are provided to emulate the raw API - if the underlying platform doesn't allow faster implementation. - - More details on the raw and cloure API can be found in: + More details on the raw API can be found in: http://gcc.gnu.org/ml/java/1999-q3/msg00138.html @@ -108,8 +99,8 @@ extern "C" { # endif #endif -/* The closure code assumes that this works on pointers, i.e. a size_t */ -/* can hold a pointer. */ +/* The closure code assumes that this works on pointers, i.e. a size_t + can hold a pointer. */ typedef struct _ffi_type { @@ -119,6 +110,32 @@ typedef struct _ffi_type struct _ffi_type **elements; } ffi_type; +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + #ifndef LIBFFI_HIDE_BASIC_TYPES #if SCHAR_MAX == 127 # define ffi_type_uchar ffi_type_uint8 @@ -168,21 +185,7 @@ typedef struct _ffi_type #error "long size not supported" #endif -/* Need minimal decorations for DLLs to works on Windows. */ -/* GCC has autoimport and autoexport. Rely on Libtool to */ -/* help MSVC export from a DLL, but always declare data */ -/* to be imported for MSVC clients. This costs an extra */ -/* indirection for MSVC clients using the static version */ -/* of the library, but don't worry about that. Besides, */ -/* as a workaround, they can define FFI_BUILDING if they */ -/* *know* they are going to link with the static library. */ -#if defined _MSC_VER && !defined FFI_BUILDING -#define FFI_EXTERN extern __declspec(dllimport) -#else -#define FFI_EXTERN extern -#endif - -/* These are defined in types.c */ +/* These are defined in types.c. */ FFI_EXTERN ffi_type ffi_type_void; FFI_EXTERN ffi_type ffi_type_uint8; FFI_EXTERN ffi_type ffi_type_sint8; @@ -219,8 +222,6 @@ typedef enum { FFI_BAD_ABI } ffi_status; -typedef unsigned FFI_TYPE; - typedef struct { ffi_abi abi; unsigned nargs; @@ -233,20 +234,6 @@ typedef struct { #endif } ffi_cif; -#if 0 -/* Used to adjust size/alignment of ffi types. */ -void ffi_prep_types (ffi_abi abi); -#endif - -/* Used internally, but overridden by some architectures */ -ffi_status ffi_prep_cif_core(ffi_cif *cif, - ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - /* ---- Definitions for the raw API -------------------------------------- */ #ifndef FFI_SIZEOF_ARG @@ -284,27 +271,34 @@ typedef ffi_raw ffi_java_raw; #endif +FFI_API void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue); -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); -/* This is analogous to the raw API, except it uses Java parameter */ -/* packing, even on 64-bit machines. I.e. on 64-bit machines */ -/* longs and doubles are followed by an empty 64-bit word. */ +/* This is analogous to the raw API, except it uses Java parameter + packing, even on 64-bit machines. I.e. on 64-bit machines longs + and doubles are followed by an empty 64-bit word. */ +#if !FFI_NATIVE_RAW_API +FFI_API void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, - ffi_java_raw *avalue); + ffi_java_raw *avalue) __attribute__((deprecated)); +#endif -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); /* ---- Definitions for closures ----------------------------------------- */ @@ -323,25 +317,42 @@ typedef struct { ffi_cif *cif; void (*fun)(ffi_cif*,void*,void**,void*); void *user_data; +} ffi_closure #ifdef __GNUC__ -} ffi_closure __attribute__((aligned (8))); -#else -} ffi_closure; + __attribute__((aligned (8))) +#endif + ; + +#ifndef __GNUC__ # ifdef __sgi # pragma pack 0 # endif #endif -void *ffi_closure_alloc (size_t size, void **code); -void ffi_closure_free (void *); +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); -ffi_status +#if defined(PA_LINUX) || defined(PA_HPUX) +#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) +#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) +#else +#define FFI_CLOSURE_PTR(X) (X) +#define FFI_RESTORE_PTR(X) (X) +#endif + +FFI_API ffi_status ffi_prep_closure (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data); + void *user_data) +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; -ffi_status +FFI_API ffi_status ffi_prep_closure_loc (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), @@ -362,9 +373,9 @@ typedef struct { #if !FFI_NATIVE_RAW_API - /* if this is enabled, then a raw closure has the same layout + /* If this is enabled, then a raw closure has the same layout as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ + handler to do the transaltion, void** -> ffi_raw*. */ void (*translate_args)(ffi_cif*,void*,void**,void*); void *this_closure; @@ -388,9 +399,9 @@ typedef struct { #if !FFI_NATIVE_RAW_API - /* if this is enabled, then a raw closure has the same layout + /* If this is enabled, then a raw closure has the same layout as a regular closure. We use this to install an intermediate - handler to do the transaltion, void** -> ffi_raw*. */ + handler to do the translation, void** -> ffi_raw*. */ void (*translate_args)(ffi_cif*,void*,void**,void*); void *this_closure; @@ -402,42 +413,62 @@ typedef struct { } ffi_java_raw_closure; -ffi_status +FFI_API ffi_status ffi_prep_raw_closure (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data); -ffi_status +FFI_API ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc); -ffi_status +#if !FFI_NATIVE_RAW_API +FFI_API ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data); + void *user_data) __attribute__((deprecated)); -ffi_status +FFI_API ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, - void *codeloc); + void *codeloc) __attribute__((deprecated)); +#endif #endif /* FFI_CLOSURES */ +#if FFI_GO_CLOSURES + +typedef struct { + void *tramp; + ffi_cif *cif; + void (*fun)(ffi_cif*,void*,void**,void*); +} ffi_go_closure; + +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, + void (*fun)(ffi_cif*,void*,void**,void*)); + +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure); + +#endif /* FFI_GO_CLOSURES */ + /* ---- Public interface definition -------------------------------------- */ +FFI_API ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes); +FFI_API ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, @@ -445,12 +476,17 @@ ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_type *rtype, ffi_type **atypes); +FFI_API void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); -/* Useful for eliminating compiler warnings */ +FFI_API +ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, + size_t *offsets); + +/* Useful for eliminating compiler warnings. */ #define FFI_FN(f) ((void (*)(void))f) /* ---- Definitions shared with assembly code ---------------------------- */ @@ -479,7 +515,7 @@ void ffi_call(ffi_cif *cif, #define FFI_TYPE_POINTER 14 #define FFI_TYPE_COMPLEX 15 -/* This should always refer to the last type code (for sanity checks) */ +/* This should always refer to the last type code (for sanity checks). */ #define FFI_TYPE_LAST FFI_TYPE_COMPLEX #ifdef __cplusplus diff --git a/Stinger/Classes/libffi/ffi_x86_64.h b/Stinger/libffi/darwin_ios/include/ffi_x86_64.h old mode 100755 new mode 100644 similarity index 83% rename from Stinger/Classes/libffi/ffi_x86_64.h rename to Stinger/libffi/darwin_ios/include/ffi_x86_64.h index 6683a34..8b3e4bb --- a/Stinger/Classes/libffi/ffi_x86_64.h +++ b/Stinger/libffi/darwin_ios/include/ffi_x86_64.h @@ -1,5 +1,7 @@ +#ifdef __x86_64__ + /* -----------------------------------------------------------------*-C-*- - libffi 3.99999 - Copyright (c) 2011, 2014 Anthony Green + libffi 3.3 - Copyright (c) 2011, 2014, 2019 Anthony Green - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. Permission is hereby granted, free of charge, to any person @@ -108,6 +110,32 @@ typedef struct _ffi_type struct _ffi_type **elements; } ffi_type; +/* Need minimal decorations for DLLs to work on Windows. GCC has + autoimport and autoexport. Always mark externally visible symbols + as dllimport for MSVC clients, even if it means an extra indirection + when using the static version of the library. + Besides, as a workaround, they can define FFI_BUILDING if they + *know* they are going to link with the static library. */ +#if defined _MSC_VER +# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ +# define FFI_API __declspec(dllexport) +# elif !defined FFI_BUILDING /* Importing libffi.DLL */ +# define FFI_API __declspec(dllimport) +# else /* Building/linking static library */ +# define FFI_API +# endif +#else +# define FFI_API +#endif + +/* The externally visible type declarations also need the MSVC DLL + decorations, or they will not be exported from the object file. */ +#if defined LIBFFI_HIDE_BASIC_TYPES +# define FFI_EXTERN FFI_API +#else +# define FFI_EXTERN extern FFI_API +#endif + #ifndef LIBFFI_HIDE_BASIC_TYPES #if SCHAR_MAX == 127 # define ffi_type_uchar ffi_type_uint8 @@ -157,19 +185,6 @@ typedef struct _ffi_type #error "long size not supported" #endif -/* Need minimal decorations for DLLs to works on Windows. GCC has - autoimport and autoexport. Rely on Libtool to help MSVC export - from a DLL, but always declare data to be imported for MSVC - clients. This costs an extra indirection for MSVC clients using - the static version of the library, but don't worry about that. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER && !defined FFI_BUILDING -#define FFI_EXTERN extern __declspec(dllimport) -#else -#define FFI_EXTERN extern -#endif - /* These are defined in types.c. */ FFI_EXTERN ffi_type ffi_type_void; FFI_EXTERN ffi_type ffi_type_uint8; @@ -256,27 +271,34 @@ typedef ffi_raw ffi_java_raw; #endif +FFI_API void ffi_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue); -void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -size_t ffi_raw_size (ffi_cif *cif); +FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); +FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); +FFI_API size_t ffi_raw_size (ffi_cif *cif); /* This is analogous to the raw API, except it uses Java parameter packing, even on 64-bit machines. I.e. on 64-bit machines longs and doubles are followed by an empty 64-bit word. */ +#if !FFI_NATIVE_RAW_API +FFI_API void ffi_java_raw_call (ffi_cif *cif, void (*fn)(void), void *rvalue, - ffi_java_raw *avalue); + ffi_java_raw *avalue) __attribute__((deprecated)); +#endif -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -size_t ffi_java_raw_size (ffi_cif *cif); +FFI_API +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw) __attribute__((deprecated)); +FFI_API +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args) __attribute__((deprecated)); +FFI_API +size_t ffi_java_raw_size (ffi_cif *cif) __attribute__((deprecated)); /* ---- Definitions for closures ----------------------------------------- */ @@ -307,17 +329,30 @@ typedef struct { # endif #endif -void *ffi_closure_alloc (size_t size, void **code); -void ffi_closure_free (void *); +FFI_API void *ffi_closure_alloc (size_t size, void **code); +FFI_API void ffi_closure_free (void *); + +#if defined(PA_LINUX) || defined(PA_HPUX) +#define FFI_CLOSURE_PTR(X) ((void *)((unsigned int)(X) | 2)) +#define FFI_RESTORE_PTR(X) ((void *)((unsigned int)(X) & ~3)) +#else +#define FFI_CLOSURE_PTR(X) (X) +#define FFI_RESTORE_PTR(X) (X) +#endif -ffi_status +FFI_API ffi_status ffi_prep_closure (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), void *user_data) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))); +#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) + __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) +#elif defined(__GNUC__) && __GNUC__ >= 3 + __attribute__((deprecated)) +#endif + ; -ffi_status +FFI_API ffi_status ffi_prep_closure_loc (ffi_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*), @@ -378,31 +413,33 @@ typedef struct { } ffi_java_raw_closure; -ffi_status +FFI_API ffi_status ffi_prep_raw_closure (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data); -ffi_status +FFI_API ffi_status ffi_prep_raw_closure_loc (ffi_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_raw*,void*), void *user_data, void *codeloc); -ffi_status +#if !FFI_NATIVE_RAW_API +FFI_API ffi_status ffi_prep_java_raw_closure (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), - void *user_data); + void *user_data) __attribute__((deprecated)); -ffi_status +FFI_API ffi_status ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, ffi_cif *cif, void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), void *user_data, - void *codeloc); + void *codeloc) __attribute__((deprecated)); +#endif #endif /* FFI_CLOSURES */ @@ -414,22 +451,24 @@ typedef struct { void (*fun)(ffi_cif*,void*,void**,void*); } ffi_go_closure; -ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, +FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, void (*fun)(ffi_cif*,void*,void**,void*)); -void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, +FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue, void *closure); #endif /* FFI_GO_CLOSURES */ /* ---- Public interface definition -------------------------------------- */ +FFI_API ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, ffi_type *rtype, ffi_type **atypes); +FFI_API ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_abi abi, unsigned int nfixedargs, @@ -437,11 +476,13 @@ ffi_status ffi_prep_cif_var(ffi_cif *cif, ffi_type *rtype, ffi_type **atypes); +FFI_API void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); +FFI_API ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets); @@ -482,3 +523,6 @@ ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, #endif #endif + + +#endif diff --git a/Stinger/libffi/darwin_ios/include/fficonfig_arm64.h b/Stinger/libffi/darwin_ios/include/fficonfig_arm64.h new file mode 100644 index 0000000..da8730e --- /dev/null +++ b/Stinger/libffi/darwin_ios/include/fficonfig_arm64.h @@ -0,0 +1,223 @@ +#ifdef __arm64__ + +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "a" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +#define FFI_EXEC_TRAMPOLINE_TABLE 1 + +/* Define this if you want to enable pax emulated trampolines */ +/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +/* #undef FFI_MMAP_EXEC_WRIT */ + +/* Define this if you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .cfi_* directives. */ +/* #undef HAVE_AS_CFI_PSEUDO_OP */ + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if the compiler uses zarch features. */ +/* #undef HAVE_AS_S390_ZARCH */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports unwind section type. */ +/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ + +/* Define if your assembler supports PC relative relocs. */ +/* #undef HAVE_AS_X86_PCREL */ + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +/* #undef HAVE_LONG_DOUBLE */ + +/* Define if you support more than one size of the long double type */ +/* #undef HAVE_LONG_DOUBLE_VARIANT */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkostemp' function. */ +#define HAVE_MKOSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if your compiler supports pointer authentication. */ +/* #undef HAVE_PTRAUTH */ + +/* Define if .eh_frame sections should be read-only. */ +#define HAVE_RO_EH_FRAME 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if GNU symbol versioning is used for libatomic. */ +/* #undef LIBFFI_GNU_SYMBOL_VERSIONING */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.3" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 8 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 8 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if symbols are underscored. */ +#define SYMBOL_UNDERSCORE 1 + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.3" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#ifdef __APPLE__ +#define FFI_HIDDEN(name) .private_extern name +#else +#define FFI_HIDDEN(name) .hidden name +#endif +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + + + +#endif diff --git a/Stinger/libffi/darwin_ios/include/fficonfig_armv7.h b/Stinger/libffi/darwin_ios/include/fficonfig_armv7.h new file mode 100644 index 0000000..d8589a7 --- /dev/null +++ b/Stinger/libffi/darwin_ios/include/fficonfig_armv7.h @@ -0,0 +1,223 @@ +#ifdef __arm__ + +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "a" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +#define FFI_EXEC_TRAMPOLINE_TABLE 1 + +/* Define this if you want to enable pax emulated trampolines */ +/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +/* #undef FFI_MMAP_EXEC_WRIT */ + +/* Define this if you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .cfi_* directives. */ +/* #undef HAVE_AS_CFI_PSEUDO_OP */ + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if the compiler uses zarch features. */ +/* #undef HAVE_AS_S390_ZARCH */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports unwind section type. */ +/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ + +/* Define if your assembler supports PC relative relocs. */ +/* #undef HAVE_AS_X86_PCREL */ + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +/* #undef HAVE_LONG_DOUBLE */ + +/* Define if you support more than one size of the long double type */ +/* #undef HAVE_LONG_DOUBLE_VARIANT */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkostemp' function. */ +#define HAVE_MKOSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if your compiler supports pointer authentication. */ +/* #undef HAVE_PTRAUTH */ + +/* Define if .eh_frame sections should be read-only. */ +#define HAVE_RO_EH_FRAME 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if GNU symbol versioning is used for libatomic. */ +/* #undef LIBFFI_GNU_SYMBOL_VERSIONING */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.3" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 8 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 4 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if symbols are underscored. */ +#define SYMBOL_UNDERSCORE 1 + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.3" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#ifdef __APPLE__ +#define FFI_HIDDEN(name) .private_extern name +#else +#define FFI_HIDDEN(name) .hidden name +#endif +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + + + +#endif diff --git a/Stinger/libffi/darwin_ios/include/fficonfig_i386.h b/Stinger/libffi/darwin_ios/include/fficonfig_i386.h new file mode 100644 index 0000000..1786313 --- /dev/null +++ b/Stinger/libffi/darwin_ios/include/fficonfig_i386.h @@ -0,0 +1,223 @@ +#ifdef __i386__ + +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "a" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +/* #undef FFI_EXEC_TRAMPOLINE_TABLE */ + +/* Define this if you want to enable pax emulated trampolines */ +/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +#define FFI_MMAP_EXEC_WRIT 1 + +/* Define this if you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .cfi_* directives. */ +/* #undef HAVE_AS_CFI_PSEUDO_OP */ + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if the compiler uses zarch features. */ +/* #undef HAVE_AS_S390_ZARCH */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports unwind section type. */ +/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ + +/* Define if your assembler supports PC relative relocs. */ +#define HAVE_AS_X86_PCREL 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +#define HAVE_LONG_DOUBLE 1 + +/* Define if you support more than one size of the long double type */ +/* #undef HAVE_LONG_DOUBLE_VARIANT */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkostemp' function. */ +#define HAVE_MKOSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if your compiler supports pointer authentication. */ +/* #undef HAVE_PTRAUTH */ + +/* Define if .eh_frame sections should be read-only. */ +#define HAVE_RO_EH_FRAME 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if GNU symbol versioning is used for libatomic. */ +/* #undef LIBFFI_GNU_SYMBOL_VERSIONING */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.3" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 4 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if symbols are underscored. */ +#define SYMBOL_UNDERSCORE 1 + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.3" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#ifdef __APPLE__ +#define FFI_HIDDEN(name) .private_extern name +#else +#define FFI_HIDDEN(name) .hidden name +#endif +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + + + +#endif diff --git a/Stinger/libffi/darwin_ios/include/fficonfig_x86_64.h b/Stinger/libffi/darwin_ios/include/fficonfig_x86_64.h new file mode 100644 index 0000000..583b9a2 --- /dev/null +++ b/Stinger/libffi/darwin_ios/include/fficonfig_x86_64.h @@ -0,0 +1,223 @@ +#ifdef __x86_64__ + +/* fficonfig.h. Generated from fficonfig.h.in by configure. */ +/* fficonfig.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to the flags needed for the .section .eh_frame directive. */ +#define EH_FRAME_FLAGS "a" + +/* Define this if you want extra debugging. */ +/* #undef FFI_DEBUG */ + +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */ +/* #undef FFI_EXEC_TRAMPOLINE_TABLE */ + +/* Define this if you want to enable pax emulated trampolines */ +/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */ + +/* Cannot use malloc on this target, so, we revert to alternative means */ +#define FFI_MMAP_EXEC_WRIT 1 + +/* Define this if you do not want support for the raw API. */ +/* #undef FFI_NO_RAW_API */ + +/* Define this if you do not want support for aggregate types. */ +/* #undef FFI_NO_STRUCTS */ + +/* Define to 1 if you have `alloca', as a function or macro. */ +#define HAVE_ALLOCA 1 + +/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix). + */ +#define HAVE_ALLOCA_H 1 + +/* Define if your assembler supports .cfi_* directives. */ +/* #undef HAVE_AS_CFI_PSEUDO_OP */ + +/* Define if your assembler supports .register. */ +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ + +/* Define if the compiler uses zarch features. */ +/* #undef HAVE_AS_S390_ZARCH */ + +/* Define if your assembler and linker support unaligned PC relative relocs. + */ +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports unwind section type. */ +/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ + +/* Define if your assembler supports PC relative relocs. */ +#define HAVE_AS_X86_PCREL 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define HAVE_DLFCN_H 1 + +/* Define if __attribute__((visibility("hidden"))) is supported. */ +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1 + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define if you have the long double type and it is bigger than a double */ +#define HAVE_LONG_DOUBLE 1 + +/* Define if you support more than one size of the long double type */ +/* #undef HAVE_LONG_DOUBLE_VARIANT */ + +/* Define to 1 if you have the `memcpy' function. */ +#define HAVE_MEMCPY 1 + +/* Define to 1 if you have the <memory.h> header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkostemp' function. */ +#define HAVE_MKOSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define if mmap with MAP_ANON(YMOUS) works. */ +#define HAVE_MMAP_ANON 1 + +/* Define if mmap of /dev/zero works. */ +/* #undef HAVE_MMAP_DEV_ZERO */ + +/* Define if read-only mmap of a plain file works. */ +#define HAVE_MMAP_FILE 1 + +/* Define if your compiler supports pointer authentication. */ +/* #undef HAVE_PTRAUTH */ + +/* Define if .eh_frame sections should be read-only. */ +#define HAVE_RO_EH_FRAME 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the <sys/mman.h> header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if GNU symbol versioning is used for libatomic. */ +/* #undef LIBFFI_GNU_SYMBOL_VERSIONING */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "libffi" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libffi" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libffi 3.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libffi" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "3.3" + +/* The size of `double', as computed by sizeof. */ +#define SIZEOF_DOUBLE 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* The size of `size_t', as computed by sizeof. */ +#define SIZEOF_SIZE_T 8 + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if symbols are underscored. */ +#define SYMBOL_UNDERSCORE 1 + +/* Define this if you are using Purify and want to suppress spurious messages. + */ +/* #undef USING_PURIFY */ + +/* Version number of package */ +#define VERSION "3.3" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to `unsigned int' if <sys/types.h> does not define. */ +/* #undef size_t */ + + +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +#ifdef LIBFFI_ASM +#ifdef __APPLE__ +#define FFI_HIDDEN(name) .private_extern name +#else +#define FFI_HIDDEN(name) .hidden name +#endif +#else +#define FFI_HIDDEN __attribute__ ((visibility ("hidden"))) +#endif +#else +#ifdef LIBFFI_ASM +#define FFI_HIDDEN(name) +#else +#define FFI_HIDDEN +#endif +#endif + + + +#endif diff --git a/Stinger/Classes/libffi/ffitarget_arm64.h b/Stinger/libffi/darwin_ios/include/ffitarget_arm64.h old mode 100755 new mode 100644 similarity index 84% rename from Stinger/Classes/libffi/ffitarget_arm64.h rename to Stinger/libffi/darwin_ios/include/ffitarget_arm64.h index 65086cd..ec9b582 --- a/Stinger/Classes/libffi/ffitarget_arm64.h +++ b/Stinger/libffi/darwin_ios/include/ffitarget_arm64.h @@ -1,3 +1,5 @@ +#ifdef __arm64__ + /* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. Permission is hereby granted, free of charge, to any person obtaining @@ -32,6 +34,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #define FFI_SIZEOF_JAVA_RAW 4 typedef unsigned long long ffi_arg; typedef signed long long ffi_sarg; +#elif defined(_WIN32) +#define FFI_SIZEOF_ARG 8 +typedef unsigned long long ffi_arg; +typedef signed long long ffi_sarg; #else typedef unsigned long ffi_arg; typedef signed long ffi_sarg; @@ -41,8 +47,13 @@ typedef enum ffi_abi { FFI_FIRST_ABI = 0, FFI_SYSV, + FFI_WIN64, FFI_LAST_ABI, +#if defined(_WIN32) + FFI_DEFAULT_ABI = FFI_WIN64 +#else FFI_DEFAULT_ABI = FFI_SYSV +#endif } ffi_abi; #endif @@ -65,17 +76,27 @@ typedef enum ffi_abi #define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE #endif +#ifdef _WIN32 +#define FFI_EXTRA_CIF_FIELDS unsigned is_variadic +#endif +#define FFI_TARGET_SPECIFIC_VARIADIC + /* ---- Internal ---- */ #if defined (__APPLE__) -#define FFI_TARGET_SPECIFIC_VARIADIC #define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs -#else -/* iOS reserves x18 for the system. Disable Go closures until +#elif !defined(_WIN32) +/* iOS and Windows reserve x18 for the system. Disable Go closures until a new static chain is chosen. */ #define FFI_GO_CLOSURES 1 #endif +#ifndef _WIN32 +/* No complex type on Windows */ #define FFI_TARGET_HAS_COMPLEX_TYPE +#endif + +#endif + #endif diff --git a/Stinger/Classes/libffi/ffitarget_arm.h b/Stinger/libffi/darwin_ios/include/ffitarget_armv7.h old mode 100755 new mode 100644 similarity index 92% rename from Stinger/Classes/libffi/ffitarget_arm.h rename to Stinger/libffi/darwin_ios/include/ffitarget_armv7.h index 1cf1036..4af193c --- a/Stinger/Classes/libffi/ffitarget_arm.h +++ b/Stinger/libffi/darwin_ios/include/ffitarget_armv7.h @@ -1,3 +1,5 @@ +#ifdef __arm__ + /* -----------------------------------------------------------------*-C-*- ffitarget.h - Copyright (c) 2012 Anthony Green Copyright (c) 2010 CodeSourcery @@ -43,7 +45,7 @@ typedef enum ffi_abi { FFI_SYSV, FFI_VFP, FFI_LAST_ABI, -#ifdef __ARM_PCS_VFP +#if defined(__ARM_PCS_VFP) || defined(_M_ARM) FFI_DEFAULT_ABI = FFI_VFP, #else FFI_DEFAULT_ABI = FFI_SYSV, @@ -57,7 +59,9 @@ typedef enum ffi_abi { signed char vfp_args[16] \ #define FFI_TARGET_SPECIFIC_VARIADIC +#ifndef _M_ARM #define FFI_TARGET_HAS_COMPLEX_TYPE +#endif /* ---- Definitions for closures ----------------------------------------- */ @@ -74,9 +78,17 @@ typedef enum ffi_abi { #error "No trampoline table implementation" #endif +#else +#ifdef _MSC_VER +#define FFI_TRAMPOLINE_SIZE 16 +#define FFI_TRAMPOLINE_CLOSURE_FUNCTION 12 #else #define FFI_TRAMPOLINE_SIZE 12 +#endif #define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE #endif #endif + + +#endif diff --git a/Stinger/Classes/libffi/ffitarget_i386.h b/Stinger/libffi/darwin_ios/include/ffitarget_i386.h similarity index 68% rename from Stinger/Classes/libffi/ffitarget_i386.h rename to Stinger/libffi/darwin_ios/include/ffitarget_i386.h index 52235c2..1d35b2a 100644 --- a/Stinger/Classes/libffi/ffitarget_i386.h +++ b/Stinger/libffi/darwin_ios/include/ffitarget_i386.h @@ -1,7 +1,7 @@ #ifdef __i386__ /* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2014 Anthony Green + ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green Copyright (c) 1996-2003, 2010 Red Hat, Inc. Copyright (C) 2008 Free Software Foundation, Inc. @@ -52,7 +52,9 @@ #endif #define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION +#ifndef _MSC_VER #define FFI_TARGET_HAS_COMPLEX_TYPE +#endif /* ---- Generic type definitions ----------------------------------------- */ @@ -78,44 +80,48 @@ typedef signed long ffi_sarg; #endif typedef enum ffi_abi { +#if defined(X86_WIN64) FFI_FIRST_ABI = 0, - - /* ---- Intel x86 Win32 ---------- */ -#ifdef X86_WIN32 - FFI_SYSV, - FFI_STDCALL, - FFI_THISCALL, - FFI_FASTCALL, - FFI_MS_CDECL, - FFI_PASCAL, - FFI_REGISTER, + FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ + FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ FFI_LAST_ABI, -#ifdef _MSC_VER - FFI_DEFAULT_ABI = FFI_MS_CDECL -#else - FFI_DEFAULT_ABI = FFI_SYSV -#endif +#ifdef __GNUC__ + FFI_DEFAULT_ABI = FFI_GNUW64 +#else + FFI_DEFAULT_ABI = FFI_WIN64 +#endif -#elif defined(X86_WIN64) +#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) + FFI_FIRST_ABI = 1, + FFI_UNIX64, FFI_WIN64, + FFI_EFI64 = FFI_WIN64, + FFI_GNUW64, FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_WIN64 + FFI_DEFAULT_ABI = FFI_UNIX64 +#elif defined(X86_WIN32) + FFI_FIRST_ABI = 0, + FFI_SYSV = 1, + FFI_STDCALL = 2, + FFI_THISCALL = 3, + FFI_FASTCALL = 4, + FFI_MS_CDECL = 5, + FFI_PASCAL = 6, + FFI_REGISTER = 7, + FFI_LAST_ABI, + FFI_DEFAULT_ABI = FFI_MS_CDECL #else - /* ---- Intel x86 and AMD x86-64 - */ - FFI_SYSV, - FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ - FFI_THISCALL, - FFI_FASTCALL, - FFI_STDCALL, - FFI_PASCAL, - FFI_REGISTER, + FFI_FIRST_ABI = 0, + FFI_SYSV = 1, + FFI_THISCALL = 3, + FFI_FASTCALL = 4, + FFI_STDCALL = 5, + FFI_PASCAL = 6, + FFI_REGISTER = 7, + FFI_MS_CDECL = 8, FFI_LAST_ABI, -#if defined(__i386__) || defined(__i386) FFI_DEFAULT_ABI = FFI_SYSV -#else - FFI_DEFAULT_ABI = FFI_UNIX64 -#endif #endif } ffi_abi; #endif @@ -123,33 +129,37 @@ typedef enum ffi_abi { /* ---- Definitions for closures ----------------------------------------- */ #define FFI_CLOSURES 1 +#define FFI_GO_CLOSURES 1 + #define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) #define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) #define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) #define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) -#if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 -#else -#ifdef X86_WIN32 -#define FFI_TRAMPOLINE_SIZE 52 +#if defined (X86_64) || defined(X86_WIN64) \ + || (defined (__x86_64__) && defined (X86_DARWIN)) +/* 4 bytes of ENDBR64 + 7 bytes of LEA + 6 bytes of JMP + 7 bytes of NOP + + 8 bytes of pointer. */ +# define FFI_TRAMPOLINE_SIZE 32 +# define FFI_NATIVE_RAW_API 0 #else -#ifdef X86_WIN64 -#define FFI_TRAMPOLINE_SIZE 29 -#define FFI_NATIVE_RAW_API 0 -#define FFI_NO_RAW_API 1 -#else -#define FFI_TRAMPOLINE_SIZE 10 -#endif -#endif -#ifndef X86_WIN64 -#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ +/* 4 bytes of ENDBR32 + 5 bytes of MOV + 5 bytes of JMP + 2 unused + bytes. */ +# define FFI_TRAMPOLINE_SIZE 16 +# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ #endif + +#if !defined(GENERATE_LIBFFI_MAP) && defined(__ASSEMBLER__) \ + && defined(__CET__) +# include <cet.h> +# define _CET_NOTRACK notrack +#else +# define _CET_ENDBR +# define _CET_NOTRACK #endif #endif -#endif \ No newline at end of file +#endif diff --git a/Stinger/Classes/libffi/ffitarget_x86_64.h b/Stinger/libffi/darwin_ios/include/ffitarget_x86_64.h old mode 100755 new mode 100644 similarity index 84% rename from Stinger/Classes/libffi/ffitarget_x86_64.h rename to Stinger/libffi/darwin_ios/include/ffitarget_x86_64.h index 25e3f4f..75ba6b4 --- a/Stinger/Classes/libffi/ffitarget_x86_64.h +++ b/Stinger/libffi/darwin_ios/include/ffitarget_x86_64.h @@ -1,5 +1,7 @@ +#ifdef __x86_64__ + /* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2014 Anthony Green + ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green Copyright (c) 1996-2003, 2010 Red Hat, Inc. Copyright (C) 2008 Free Software Foundation, Inc. @@ -80,15 +82,21 @@ typedef signed long ffi_sarg; typedef enum ffi_abi { #if defined(X86_WIN64) FFI_FIRST_ABI = 0, - FFI_WIN64, + FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ + FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ FFI_LAST_ABI, +#ifdef __GNUC__ + FFI_DEFAULT_ABI = FFI_GNUW64 +#else FFI_DEFAULT_ABI = FFI_WIN64 +#endif #elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) FFI_FIRST_ABI = 1, FFI_UNIX64, FFI_WIN64, FFI_EFI64 = FFI_WIN64, + FFI_GNUW64, FFI_LAST_ABI, FFI_DEFAULT_ABI = FFI_UNIX64 @@ -130,12 +138,28 @@ typedef enum ffi_abi { #if defined (X86_64) || defined(X86_WIN64) \ || (defined (__x86_64__) && defined (X86_DARWIN)) -# define FFI_TRAMPOLINE_SIZE 24 +/* 4 bytes of ENDBR64 + 7 bytes of LEA + 6 bytes of JMP + 7 bytes of NOP + + 8 bytes of pointer. */ +# define FFI_TRAMPOLINE_SIZE 32 # define FFI_NATIVE_RAW_API 0 #else -# define FFI_TRAMPOLINE_SIZE 12 +/* 4 bytes of ENDBR32 + 5 bytes of MOV + 5 bytes of JMP + 2 unused + bytes. */ +# define FFI_TRAMPOLINE_SIZE 16 # define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ #endif +#if !defined(GENERATE_LIBFFI_MAP) && defined(__ASSEMBLER__) \ + && defined(__CET__) +# include <cet.h> +# define _CET_NOTRACK notrack +#else +# define _CET_ENDBR +# define _CET_NOTRACK +#endif + #endif + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c b/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c new file mode 100644 index 0000000..2fe699b --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c @@ -0,0 +1,1030 @@ +#ifdef __arm64__ + +/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined(__aarch64__) || defined(__arm64__)|| defined (_M_ARM64) +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> +#include "fficonfig.h" +#include "ffi.h" +#include "ffi_common.h" +#include "internal_arm64.h" +#ifdef _WIN32 +#include <windows.h> /* FlushInstructionCache */ +#endif + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 128-bit type. */ +#if FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +union _d +{ + UINT64 d; + UINT32 s[2]; +}; + +struct _v +{ + union _d d[2] __attribute__((aligned(16))); +}; + +struct call_context +{ + struct _v v[N_V_ARG_REG]; + UINT64 x[N_X_ARG_REG]; +}; + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#ifdef HAVE_PTRAUTH +#include <ptrauth.h> +#endif +#include <mach/vm_param.h> +#endif + +#else + +#if defined (__clang__) && defined (__APPLE__) +extern void sys_icache_invalidate (void *start, size_t len); +#endif + +static inline void +ffi_clear_cache (void *start, void *end) +{ +#if defined (__clang__) && defined (__APPLE__) + sys_icache_invalidate (start, (char *)end - (char *)start); +#elif defined (__GNUC__) + __builtin___clear_cache (start, end); +#elif defined (_WIN32) + FlushInstructionCache(GetCurrentProcess(), start, (char*)end - (char*)start); +#else +#error "Missing builtin to flush instruction cache" +#endif +} + +#endif + +/* A subroutine of is_vfp_type. Given a structure type, return the type code + of the first non-structure element. Recurse for structure elements. + Return -1 if the structure is in fact empty, i.e. no nested elements. */ + +static int +is_hfa0 (const ffi_type *ty) +{ + ffi_type **elements = ty->elements; + int i, ret = -1; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + ret = elements[i]->type; + if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) + { + ret = is_hfa0 (elements[i]); + if (ret < 0) + continue; + } + break; + } + + return ret; +} + +/* A subroutine of is_vfp_type. Given a structure type, return true if all + of the non-structure elements are the same as CANDIDATE. */ + +static int +is_hfa1 (const ffi_type *ty, int candidate) +{ + ffi_type **elements = ty->elements; + int i; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + return 1; +} + +/* Determine if TY may be allocated to the FP registers. This is both an + fp scalar type as well as an homogenous floating point aggregate (HFA). + That is, a structure consisting of 1 to 4 members of all the same type, + where that type is an fp scalar. + + Returns non-zero iff TY is an HFA. The result is the AARCH64_RET_* + constant for the type. */ + +static int +is_vfp_type (const ffi_type *ty) +{ + ffi_type **elements; + int candidate, i; + size_t size, ele_count; + + /* Quickest tests first. */ + candidate = ty->type; + switch (candidate) + { + default: + return 0; + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + ele_count = 1; + goto done; + case FFI_TYPE_COMPLEX: + candidate = ty->elements[0]->type; + switch (candidate) + { + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + ele_count = 2; + goto done; + } + return 0; + case FFI_TYPE_STRUCT: + break; + } + + /* No HFA types are smaller than 4 bytes, or larger than 64 bytes. */ + size = ty->size; + if (size < 4 || size > 64) + return 0; + + /* Find the type of the first non-structure member. */ + elements = ty->elements; + candidate = elements[0]->type; + if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) + { + for (i = 0; ; ++i) + { + candidate = is_hfa0 (elements[i]); + if (candidate >= 0) + break; + } + } + + /* If the first member is not a floating point type, it's not an HFA. + Also quickly re-check the size of the structure. */ + switch (candidate) + { + case FFI_TYPE_FLOAT: + ele_count = size / sizeof(float); + if (size != ele_count * sizeof(float)) + return 0; + break; + case FFI_TYPE_DOUBLE: + ele_count = size / sizeof(double); + if (size != ele_count * sizeof(double)) + return 0; + break; + case FFI_TYPE_LONGDOUBLE: + ele_count = size / sizeof(long double); + if (size != ele_count * sizeof(long double)) + return 0; + break; + default: + return 0; + } + if (ele_count > 4) + return 0; + + /* Finally, make sure that all scalar elements are the same type. */ + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + /* All tests succeeded. Encode the result. */ + done: + return candidate * 4 + (4 - (int)ele_count); +} + +/* Representation of the procedure call argument marshalling + state. + + The terse state variable names match the names used in the AARCH64 + PCS. */ + +struct arg_state +{ + unsigned ngrn; /* Next general-purpose register number. */ + unsigned nsrn; /* Next vector register number. */ + size_t nsaa; /* Next stack offset. */ + +#if defined (__APPLE__) + unsigned allocating_variadic; +#endif +}; + +/* Initialize a procedure call argument marshalling state. */ +static void +arg_init (struct arg_state *state) +{ + state->ngrn = 0; + state->nsrn = 0; + state->nsaa = 0; +#if defined (__APPLE__) + state->allocating_variadic = 0; +#endif +} + +/* Allocate an aligned slot on the stack and return a pointer to it. */ +static void * +allocate_to_stack (struct arg_state *state, void *stack, + size_t alignment, size_t size) +{ + size_t nsaa = state->nsaa; + + /* Round up the NSAA to the larger of 8 or the natural + alignment of the argument's type. */ +#if defined (__APPLE__) + if (state->allocating_variadic && alignment < 8) + alignment = 8; +#else + if (alignment < 8) + alignment = 8; +#endif + + nsaa = FFI_ALIGN (nsaa, alignment); + state->nsaa = nsaa + size; + + return (char *)stack + nsaa; +} + +static ffi_arg +extend_integer_type (void *source, int type) +{ + switch (type) + { + case FFI_TYPE_UINT8: + return *(UINT8 *) source; + case FFI_TYPE_SINT8: + return *(SINT8 *) source; + case FFI_TYPE_UINT16: + return *(UINT16 *) source; + case FFI_TYPE_SINT16: + return *(SINT16 *) source; + case FFI_TYPE_UINT32: + return *(UINT32 *) source; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + return *(SINT32 *) source; + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + return *(UINT64 *) source; + break; + case FFI_TYPE_POINTER: + return *(uintptr_t *) source; + default: + abort(); + } +} + +#if defined(_MSC_VER) +void extend_hfa_type (void *dest, void *src, int h); +#else +static void +extend_hfa_type (void *dest, void *src, int h) +{ + ssize_t f = h - AARCH64_RET_S4; + void *x0; + + asm volatile ( + "adr %0, 0f\n" +" add %0, %0, %1\n" +" br %0\n" +"0: ldp s16, s17, [%3]\n" /* S4 */ +" ldp s18, s19, [%3, #8]\n" +" b 4f\n" +" ldp s16, s17, [%3]\n" /* S3 */ +" ldr s18, [%3, #8]\n" +" b 3f\n" +" ldp s16, s17, [%3]\n" /* S2 */ +" b 2f\n" +" nop\n" +" ldr s16, [%3]\n" /* S1 */ +" b 1f\n" +" nop\n" +" ldp d16, d17, [%3]\n" /* D4 */ +" ldp d18, d19, [%3, #16]\n" +" b 4f\n" +" ldp d16, d17, [%3]\n" /* D3 */ +" ldr d18, [%3, #16]\n" +" b 3f\n" +" ldp d16, d17, [%3]\n" /* D2 */ +" b 2f\n" +" nop\n" +" ldr d16, [%3]\n" /* D1 */ +" b 1f\n" +" nop\n" +" ldp q16, q17, [%3]\n" /* Q4 */ +" ldp q18, q19, [%3, #32]\n" +" b 4f\n" +" ldp q16, q17, [%3]\n" /* Q3 */ +" ldr q18, [%3, #32]\n" +" b 3f\n" +" ldp q16, q17, [%3]\n" /* Q2 */ +" b 2f\n" +" nop\n" +" ldr q16, [%3]\n" /* Q1 */ +" b 1f\n" +"4: str q19, [%2, #48]\n" +"3: str q18, [%2, #32]\n" +"2: str q17, [%2, #16]\n" +"1: str q16, [%2]" + : "=&r"(x0) + : "r"(f * 12), "r"(dest), "r"(src) + : "memory", "v16", "v17", "v18", "v19"); +} +#endif + +#if defined(_MSC_VER) +void* compress_hfa_type (void *dest, void *src, int h); +#else +static void * +compress_hfa_type (void *dest, void *reg, int h) +{ + switch (h) + { + case AARCH64_RET_S1: + if (dest == reg) + { +#ifdef __AARCH64EB__ + dest += 12; +#endif + } + else + *(float *)dest = *(float *)reg; + break; + case AARCH64_RET_S2: + asm ("ldp q16, q17, [%1]\n\t" + "st2 { v16.s, v17.s }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); + break; + case AARCH64_RET_S3: + asm ("ldp q16, q17, [%1]\n\t" + "ldr q18, [%1, #32]\n\t" + "st3 { v16.s, v17.s, v18.s }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); + break; + case AARCH64_RET_S4: + asm ("ldp q16, q17, [%1]\n\t" + "ldp q18, q19, [%1, #32]\n\t" + "st4 { v16.s, v17.s, v18.s, v19.s }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); + break; + + case AARCH64_RET_D1: + if (dest == reg) + { +#ifdef __AARCH64EB__ + dest += 8; +#endif + } + else + *(double *)dest = *(double *)reg; + break; + case AARCH64_RET_D2: + asm ("ldp q16, q17, [%1]\n\t" + "st2 { v16.d, v17.d }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); + break; + case AARCH64_RET_D3: + asm ("ldp q16, q17, [%1]\n\t" + "ldr q18, [%1, #32]\n\t" + "st3 { v16.d, v17.d, v18.d }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); + break; + case AARCH64_RET_D4: + asm ("ldp q16, q17, [%1]\n\t" + "ldp q18, q19, [%1, #32]\n\t" + "st4 { v16.d, v17.d, v18.d, v19.d }[0], [%0]" + : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); + break; + + default: + if (dest != reg) + return memcpy (dest, reg, 16 * (4 - (h & 3))); + break; + } + return dest; +} +#endif + +/* Either allocate an appropriate register for the argument type, or if + none are available, allocate a stack slot and return a pointer + to the allocated space. */ + +static void * +allocate_int_to_reg_or_stack (struct call_context *context, + struct arg_state *state, + void *stack, size_t size) +{ + if (state->ngrn < N_X_ARG_REG) + return &context->x[state->ngrn++]; + + state->ngrn = N_X_ARG_REG; + return allocate_to_stack (state, stack, size, size); +} + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ + ffi_type *rtype = cif->rtype; + size_t bytes = cif->bytes; + int flags, i, n; + + switch (rtype->type) + { + case FFI_TYPE_VOID: + flags = AARCH64_RET_VOID; + break; + case FFI_TYPE_UINT8: + flags = AARCH64_RET_UINT8; + break; + case FFI_TYPE_UINT16: + flags = AARCH64_RET_UINT16; + break; + case FFI_TYPE_UINT32: + flags = AARCH64_RET_UINT32; + break; + case FFI_TYPE_SINT8: + flags = AARCH64_RET_SINT8; + break; + case FFI_TYPE_SINT16: + flags = AARCH64_RET_SINT16; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + flags = AARCH64_RET_SINT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = AARCH64_RET_INT64; + break; + case FFI_TYPE_POINTER: + flags = (sizeof(void *) == 4 ? AARCH64_RET_UINT32 : AARCH64_RET_INT64); + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + flags = is_vfp_type (rtype); + if (flags == 0) + { + size_t s = rtype->size; + if (s > 16) + { + flags = AARCH64_RET_VOID | AARCH64_RET_IN_MEM; + bytes += 8; + } + else if (s == 16) + flags = AARCH64_RET_INT128; + else if (s == 8) + flags = AARCH64_RET_INT64; + else + flags = AARCH64_RET_INT128 | AARCH64_RET_NEED_COPY; + } + break; + + default: + abort(); + } + + for (i = 0, n = cif->nargs; i < n; i++) + if (is_vfp_type (cif->arg_types[i])) + { + flags |= AARCH64_FLAG_ARG_V; + break; + } + + /* Round the stack up to a multiple of the stack alignment requirement. */ + cif->bytes = (unsigned) FFI_ALIGN(bytes, 16); + cif->flags = flags; +#if defined (__APPLE__) + cif->aarch64_nfixedargs = 0; +#endif + + return FFI_OK; +} + +#if defined (__APPLE__) +/* Perform Apple-specific cif processing for variadic calls */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, + unsigned int ntotalargs) +{ + ffi_status status = ffi_prep_cif_machdep (cif); + cif->aarch64_nfixedargs = nfixedargs; + return status; +} +#else +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) +{ + ffi_status status = ffi_prep_cif_machdep (cif); + cif->flags |= AARCH64_FLAG_VARARG; + return status; +} +#endif /* __APPLE__ */ + +extern void ffi_call_SYSV (struct call_context *context, void *frame, + void (*fn)(void), void *rvalue, int flags, + void *closure) FFI_HIDDEN; + +/* Call a function with the provided arguments and capture the return + value. */ +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue, + void **avalue, void *closure) +{ + struct call_context *context; + void *stack, *frame, *rvalue; + struct arg_state state; + size_t stack_bytes, rtype_size, rsize; + int i, nargs, flags, isvariadic = 0; + ffi_type *rtype; + + flags = cif->flags; + rtype = cif->rtype; + rtype_size = rtype->size; + stack_bytes = cif->bytes; + + if (flags & AARCH64_FLAG_VARARG) + { + isvariadic = 1; + flags &= ~AARCH64_FLAG_VARARG; + } + + /* If the target function returns a structure via hidden pointer, + then we cannot allow a null rvalue. Otherwise, mash a null + rvalue to void return type. */ + rsize = 0; + if (flags & AARCH64_RET_IN_MEM) + { + if (orig_rvalue == NULL) + rsize = rtype_size; + } + else if (orig_rvalue == NULL) + flags &= AARCH64_FLAG_ARG_V; + else if (flags & AARCH64_RET_NEED_COPY) + rsize = 16; + + /* Allocate consectutive stack for everything we'll need. */ + context = alloca (sizeof(struct call_context) + stack_bytes + 32 + rsize); + stack = context + 1; + frame = (void*)((uintptr_t)stack + (uintptr_t)stack_bytes); + rvalue = (rsize ? (void*)((uintptr_t)frame + 32) : orig_rvalue); + + arg_init (&state); + for (i = 0, nargs = cif->nargs; i < nargs; i++) + { + ffi_type *ty = cif->arg_types[i]; + size_t s = ty->size; + void *a = avalue[i]; + int h, t; + + t = ty->type; + switch (t) + { + case FFI_TYPE_VOID: + FFI_ASSERT (0); + break; + + /* If the argument is a basic type the argument is allocated to an + appropriate register, or if none are available, to the stack. */ + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + do_pointer: + { + ffi_arg ext = extend_integer_type (a, t); + if (state.ngrn < N_X_ARG_REG) + context->x[state.ngrn++] = ext; + else + { + void *d = allocate_to_stack (&state, stack, ty->alignment, s); + state.ngrn = N_X_ARG_REG; + /* Note that the default abi extends each argument + to a full 64-bit slot, while the iOS abi allocates + only enough space. */ +#ifdef __APPLE__ + memcpy(d, a, s); +#else + *(ffi_arg *)d = ext; +#endif + } + } + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + { + void *dest; + + h = is_vfp_type (ty); + if (h) + { + int elems = 4 - (h & 3); + if (cif->abi == FFI_WIN64 && isvariadic) + { + if (state.ngrn + elems <= N_X_ARG_REG) + { + dest = &context->x[state.ngrn]; + state.ngrn += elems; + extend_hfa_type(dest, a, h); + break; + } + state.nsrn = N_X_ARG_REG; + dest = allocate_to_stack(&state, stack, ty->alignment, s); + } + else + { + if (state.nsrn + elems <= N_V_ARG_REG) + { + dest = &context->v[state.nsrn]; + state.nsrn += elems; + extend_hfa_type (dest, a, h); + break; + } + state.nsrn = N_V_ARG_REG; + dest = allocate_to_stack (&state, stack, ty->alignment, s); + } + } + else if (s > 16) + { + /* If the argument is a composite type that is larger than 16 + bytes, then the argument has been copied to memory, and + the argument is replaced by a pointer to the copy. */ + a = &avalue[i]; + t = FFI_TYPE_POINTER; + s = sizeof (void *); + goto do_pointer; + } + else + { + size_t n = (s + 7) / 8; + if (state.ngrn + n <= N_X_ARG_REG) + { + /* If the argument is a composite type and the size in + double-words is not more than the number of available + X registers, then the argument is copied into + consecutive X registers. */ + dest = &context->x[state.ngrn]; + state.ngrn += (unsigned int)n; + } + else + { + /* Otherwise, there are insufficient X registers. Further + X register allocations are prevented, the NSAA is + adjusted and the argument is copied to memory at the + adjusted NSAA. */ + state.ngrn = N_X_ARG_REG; + dest = allocate_to_stack (&state, stack, ty->alignment, s); + } + } + memcpy (dest, a, s); + } + break; + + default: + abort(); + } + +#if defined (__APPLE__) + if (i + 1 == cif->aarch64_nfixedargs) + { + state.ngrn = N_X_ARG_REG; + state.nsrn = N_V_ARG_REG; + state.allocating_variadic = 1; + } +#endif + } + + ffi_call_SYSV (context, frame, fn, rvalue, flags, closure); + + if (flags & AARCH64_RET_NEED_COPY) + memcpy (orig_rvalue, rvalue, rtype_size); +} + +void +ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} +#endif /* FFI_GO_CLOSURES */ + +/* Build a trampoline. */ + +extern void ffi_closure_SYSV (void) FFI_HIDDEN; +extern void ffi_closure_SYSV_V (void) FFI_HIDDEN; + +ffi_status +ffi_prep_closure_loc (ffi_closure *closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + void (*start)(void); + + if (cif->flags & AARCH64_FLAG_ARG_V) + start = ffi_closure_SYSV_V; + else + start = ffi_closure_SYSV; + +#if FFI_EXEC_TRAMPOLINE_TABLE +#ifdef __MACH__ +#ifdef HAVE_PTRAUTH + codeloc = ptrauth_strip (codeloc, ptrauth_key_asia); +#endif + void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); + config[0] = closure; + config[1] = start; +#endif +#else + static const unsigned char trampoline[16] = { + 0x90, 0x00, 0x00, 0x58, /* ldr x16, tramp+16 */ + 0xf1, 0xff, 0xff, 0x10, /* adr x17, tramp+0 */ + 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ + }; + char *tramp = closure->tramp; + + memcpy (tramp, trampoline, sizeof(trampoline)); + + *(UINT64 *)(tramp + 16) = (uintptr_t)start; + + ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE); + + /* Also flush the cache for code mapping. */ +#ifdef _WIN32 + // Not using dlmalloc.c for Windows ARM64 builds + // so calling ffi_data_to_code_pointer() isn't necessary + unsigned char *tramp_code = tramp; + #else + unsigned char *tramp_code = ffi_data_to_code_pointer (tramp); + #endif + ffi_clear_cache (tramp_code, tramp_code + FFI_TRAMPOLINE_SIZE); +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES +extern void ffi_go_closure_SYSV (void) FFI_HIDDEN; +extern void ffi_go_closure_SYSV_V (void) FFI_HIDDEN; + +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*)) +{ + void (*start)(void); + + if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + if (cif->flags & AARCH64_FLAG_ARG_V) + start = ffi_go_closure_SYSV_V; + else + start = ffi_go_closure_SYSV; + + closure->tramp = start; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} +#endif /* FFI_GO_CLOSURES */ + +/* Primary handler to setup and invoke a function within a closure. + + A closure when invoked enters via the assembler wrapper + ffi_closure_SYSV(). The wrapper allocates a call context on the + stack, saves the interesting registers (from the perspective of + the calling convention) into the context then passes control to + ffi_closure_SYSV_inner() passing the saved context and a pointer to + the stack at the point ffi_closure_SYSV() was invoked. + + On the return path the assembler wrapper will reload call context + registers. + + ffi_closure_SYSV_inner() marshalls the call context into ffi value + descriptors, invokes the wrapped function, then marshalls the return + value back into the call context. */ + +int FFI_HIDDEN +ffi_closure_SYSV_inner (ffi_cif *cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + struct call_context *context, + void *stack, void *rvalue, void *struct_rvalue) +{ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + int i, h, nargs, flags; + struct arg_state state; + + arg_init (&state); + + for (i = 0, nargs = cif->nargs; i < nargs; i++) + { + ffi_type *ty = cif->arg_types[i]; + int t = ty->type; + size_t n, s = ty->size; + + switch (t) + { + case FFI_TYPE_VOID: + FFI_ASSERT (0); + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + avalue[i] = allocate_int_to_reg_or_stack (context, &state, stack, s); + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + h = is_vfp_type (ty); + if (h) + { + n = 4 - (h & 3); +#ifdef _WIN32 /* for handling armasm calling convention */ + if (cif->is_variadic) + { + if (state.ngrn + n <= N_X_ARG_REG) + { + void *reg = &context->x[state.ngrn]; + state.ngrn += (unsigned int)n; + + /* Eeek! We need a pointer to the structure, however the + homogeneous float elements are being passed in individual + registers, therefore for float and double the structure + is not represented as a contiguous sequence of bytes in + our saved register context. We don't need the original + contents of the register storage, so we reformat the + structure into the same memory. */ + avalue[i] = compress_hfa_type(reg, reg, h); + } + else + { + state.ngrn = N_X_ARG_REG; + state.nsrn = N_V_ARG_REG; + avalue[i] = allocate_to_stack(&state, stack, + ty->alignment, s); + } + } + else + { +#endif /* for handling armasm calling convention */ + if (state.nsrn + n <= N_V_ARG_REG) + { + void *reg = &context->v[state.nsrn]; + state.nsrn += (unsigned int)n; + avalue[i] = compress_hfa_type(reg, reg, h); + } + else + { + state.nsrn = N_V_ARG_REG; + avalue[i] = allocate_to_stack(&state, stack, + ty->alignment, s); + } +#ifdef _WIN32 /* for handling armasm calling convention */ + } +#endif /* for handling armasm calling convention */ + } + else if (s > 16) + { + /* Replace Composite type of size greater than 16 with a + pointer. */ + avalue[i] = *(void **) + allocate_int_to_reg_or_stack (context, &state, stack, + sizeof (void *)); + } + else + { + n = (s + 7) / 8; + if (state.ngrn + n <= N_X_ARG_REG) + { + avalue[i] = &context->x[state.ngrn]; + state.ngrn += (unsigned int)n; + } + else + { + state.ngrn = N_X_ARG_REG; + avalue[i] = allocate_to_stack(&state, stack, + ty->alignment, s); + } + } + break; + + default: + abort(); + } + +#if defined (__APPLE__) + if (i + 1 == cif->aarch64_nfixedargs) + { + state.ngrn = N_X_ARG_REG; + state.nsrn = N_V_ARG_REG; + state.allocating_variadic = 1; + } +#endif + } + + flags = cif->flags; + if (flags & AARCH64_RET_IN_MEM) + rvalue = struct_rvalue; + + fun (cif, rvalue, avalue, user_data); + + return flags; +} + +#endif /* (__aarch64__) || defined(__arm64__)|| defined (_M_ARM64)*/ + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/aarch64/internal_arm64.h b/Stinger/libffi/darwin_ios/src/aarch64/internal_arm64.h new file mode 100644 index 0000000..e0ad2af --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/aarch64/internal_arm64.h @@ -0,0 +1,73 @@ +#ifdef __arm64__ + +/* +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#define AARCH64_RET_VOID 0 +#define AARCH64_RET_INT64 1 +#define AARCH64_RET_INT128 2 + +#define AARCH64_RET_UNUSED3 3 +#define AARCH64_RET_UNUSED4 4 +#define AARCH64_RET_UNUSED5 5 +#define AARCH64_RET_UNUSED6 6 +#define AARCH64_RET_UNUSED7 7 + +/* Note that FFI_TYPE_FLOAT == 2, _DOUBLE == 3, _LONGDOUBLE == 4, + so _S4 through _Q1 are layed out as (TYPE * 4) + (4 - COUNT). */ +#define AARCH64_RET_S4 8 +#define AARCH64_RET_S3 9 +#define AARCH64_RET_S2 10 +#define AARCH64_RET_S1 11 + +#define AARCH64_RET_D4 12 +#define AARCH64_RET_D3 13 +#define AARCH64_RET_D2 14 +#define AARCH64_RET_D1 15 + +#define AARCH64_RET_Q4 16 +#define AARCH64_RET_Q3 17 +#define AARCH64_RET_Q2 18 +#define AARCH64_RET_Q1 19 + +/* Note that each of the sub-64-bit integers gets two entries. */ +#define AARCH64_RET_UINT8 20 +#define AARCH64_RET_UINT16 22 +#define AARCH64_RET_UINT32 24 + +#define AARCH64_RET_SINT8 26 +#define AARCH64_RET_SINT16 28 +#define AARCH64_RET_SINT32 30 + +#define AARCH64_RET_MASK 31 + +#define AARCH64_RET_IN_MEM (1 << 5) +#define AARCH64_RET_NEED_COPY (1 << 6) + +#define AARCH64_FLAG_ARG_V_BIT 7 +#define AARCH64_FLAG_ARG_V (1 << AARCH64_FLAG_ARG_V_BIT) +#define AARCH64_FLAG_VARARG (1 << 8) + +#define N_X_ARG_REG 8 +#define N_V_ARG_REG 8 +#define CALL_CONTEXT_SIZE (N_V_ARG_REG * 16 + N_X_ARG_REG * 8) + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S b/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S new file mode 100644 index 0000000..05a612f --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S @@ -0,0 +1,456 @@ +#ifdef __arm64__ + +/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +``Software''), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#if defined(__aarch64__) || defined(__arm64__) +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal_arm64.h" + +#ifdef HAVE_MACHINE_ASM_H +#include <machine/asm.h> +#else +#ifdef __USER_LABEL_PREFIX__ +#define CONCAT1(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +/* Use the right prefix for global labels. */ +#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) +#else +#define CNAME(x) x +#endif +#endif + +#ifdef __AARCH64EB__ +# define BE(X) X +#else +# define BE(X) 0 +#endif + +#ifdef __ILP32__ +#define PTR_REG(n) w##n +#else +#define PTR_REG(n) x##n +#endif + +#ifdef __ILP32__ +#define PTR_SIZE 4 +#else +#define PTR_SIZE 8 +#endif + +#if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH) +# define BR(r) braaz r +# define BLR(r) blraaz r +#else +# define BR(r) br r +# define BLR(r) blr r +#endif + + .text + .align 4 + +/* ffi_call_SYSV + extern void ffi_call_SYSV (void *stack, void *frame, + void (*fn)(void), void *rvalue, + int flags, void *closure); + + Therefore on entry we have: + + x0 stack + x1 frame + x2 fn + x3 rvalue + x4 flags + x5 closure +*/ + + cfi_startproc +CNAME(ffi_call_SYSV): + /* Use a stack frame allocated by our caller. */ + cfi_def_cfa(x1, 32); + stp x29, x30, [x1] + mov x29, x1 + mov sp, x0 + cfi_def_cfa_register(x29) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) + + mov x9, x2 /* save fn */ + mov x8, x3 /* install structure return */ +#ifdef FFI_GO_CLOSURES + mov x18, x5 /* install static chain */ +#endif + stp x3, x4, [x29, #16] /* save rvalue and flags */ + + /* Load the vector argument passing registers, if necessary. */ + tbz w4, #AARCH64_FLAG_ARG_V_BIT, 1f + ldp q0, q1, [sp, #0] + ldp q2, q3, [sp, #32] + ldp q4, q5, [sp, #64] + ldp q6, q7, [sp, #96] +1: + /* Load the core argument passing registers, including + the structure return pointer. */ + ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] + ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] + ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] + ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] + + /* Deallocate the context, leaving the stacked arguments. */ + add sp, sp, #CALL_CONTEXT_SIZE + + BLR(x9) /* call fn */ + + ldp x3, x4, [x29, #16] /* reload rvalue and flags */ + + /* Partially deconstruct the stack frame. */ + mov sp, x29 + cfi_def_cfa_register (sp) + ldp x29, x30, [x29] + + /* Save the return value as directed. */ + adr x5, 0f + and w4, w4, #AARCH64_RET_MASK + add x5, x5, x4, lsl #3 + br x5 + + /* Note that each table entry is 2 insns, and thus 8 bytes. + For integer data, note that we're storing into ffi_arg + and therefore we want to extend to 64 bits; these types + have two consecutive entries allocated for them. */ + .align 4 +0: ret /* VOID */ + nop +1: str x0, [x3] /* INT64 */ + ret +2: stp x0, x1, [x3] /* INT128 */ + ret +3: brk #1000 /* UNUSED */ + ret +4: brk #1000 /* UNUSED */ + ret +5: brk #1000 /* UNUSED */ + ret +6: brk #1000 /* UNUSED */ + ret +7: brk #1000 /* UNUSED */ + ret +8: st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ + ret +9: st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ + ret +10: stp s0, s1, [x3] /* S2 */ + ret +11: str s0, [x3] /* S1 */ + ret +12: st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ + ret +13: st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ + ret +14: stp d0, d1, [x3] /* D2 */ + ret +15: str d0, [x3] /* D1 */ + ret +16: str q3, [x3, #48] /* Q4 */ + nop +17: str q2, [x3, #32] /* Q3 */ + nop +18: stp q0, q1, [x3] /* Q2 */ + ret +19: str q0, [x3] /* Q1 */ + ret +20: uxtb w0, w0 /* UINT8 */ + str x0, [x3] +21: ret /* reserved */ + nop +22: uxth w0, w0 /* UINT16 */ + str x0, [x3] +23: ret /* reserved */ + nop +24: mov w0, w0 /* UINT32 */ + str x0, [x3] +25: ret /* reserved */ + nop +26: sxtb x0, w0 /* SINT8 */ + str x0, [x3] +27: ret /* reserved */ + nop +28: sxth x0, w0 /* SINT16 */ + str x0, [x3] +29: ret /* reserved */ + nop +30: sxtw x0, w0 /* SINT32 */ + str x0, [x3] +31: ret /* reserved */ + nop + + cfi_endproc + + .globl CNAME(ffi_call_SYSV) + FFI_HIDDEN(CNAME(ffi_call_SYSV)) +#ifdef __ELF__ + .type CNAME(ffi_call_SYSV), #function + .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV) +#endif + +/* ffi_closure_SYSV + + Closure invocation glue. This is the low level code invoked directly by + the closure trampoline to setup and call a closure. + + On entry x17 points to a struct ffi_closure, x16 has been clobbered + all other registers are preserved. + + We allocate a call context and save the argument passing registers, + then invoked the generic C ffi_closure_SYSV_inner() function to do all + the real work, on return we load the result passing registers back from + the call context. +*/ + +#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) + + .align 4 +CNAME(ffi_closure_SYSV_V): + cfi_startproc + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + b 0f + cfi_endproc + + .globl CNAME(ffi_closure_SYSV_V) + FFI_HIDDEN(CNAME(ffi_closure_SYSV_V)) +#ifdef __ELF__ + .type CNAME(ffi_closure_SYSV_V), #function + .size CNAME(ffi_closure_SYSV_V), . - CNAME(ffi_closure_SYSV_V) +#endif + + .align 4 + cfi_startproc +CNAME(ffi_closure_SYSV): + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) +0: + mov x29, sp + + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ + ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ +.Ldo_closure: + add x3, sp, #16 /* load context */ + add x4, sp, #ffi_closure_SYSV_FS /* load stack */ + add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ + mov x6, x8 /* load struct_rval */ + bl CNAME(ffi_closure_SYSV_inner) + + /* Load the return value as directed. */ +#if FFI_EXEC_TRAMPOLINE_TABLE && defined(__MACH__) && defined(HAVE_PTRAUTH) + autiza x1 +#endif + adr x1, 0f + and w0, w0, #AARCH64_RET_MASK + add x1, x1, x0, lsl #3 + add x3, sp, #16+CALL_CONTEXT_SIZE + br x1 + + /* Note that each table entry is 2 insns, and thus 8 bytes. */ + .align 4 +0: b 99f /* VOID */ + nop +1: ldr x0, [x3] /* INT64 */ + b 99f +2: ldp x0, x1, [x3] /* INT128 */ + b 99f +3: brk #1000 /* UNUSED */ + nop +4: brk #1000 /* UNUSED */ + nop +5: brk #1000 /* UNUSED */ + nop +6: brk #1000 /* UNUSED */ + nop +7: brk #1000 /* UNUSED */ + nop +8: ldr s3, [x3, #12] /* S4 */ + nop +9: ldr s2, [x3, #8] /* S3 */ + nop +10: ldp s0, s1, [x3] /* S2 */ + b 99f +11: ldr s0, [x3] /* S1 */ + b 99f +12: ldr d3, [x3, #24] /* D4 */ + nop +13: ldr d2, [x3, #16] /* D3 */ + nop +14: ldp d0, d1, [x3] /* D2 */ + b 99f +15: ldr d0, [x3] /* D1 */ + b 99f +16: ldr q3, [x3, #48] /* Q4 */ + nop +17: ldr q2, [x3, #32] /* Q3 */ + nop +18: ldp q0, q1, [x3] /* Q2 */ + b 99f +19: ldr q0, [x3] /* Q1 */ + b 99f +20: ldrb w0, [x3, #BE(7)] /* UINT8 */ + b 99f +21: brk #1000 /* reserved */ + nop +22: ldrh w0, [x3, #BE(6)] /* UINT16 */ + b 99f +23: brk #1000 /* reserved */ + nop +24: ldr w0, [x3, #BE(4)] /* UINT32 */ + b 99f +25: brk #1000 /* reserved */ + nop +26: ldrsb x0, [x3, #BE(7)] /* SINT8 */ + b 99f +27: brk #1000 /* reserved */ + nop +28: ldrsh x0, [x3, #BE(6)] /* SINT16 */ + b 99f +29: brk #1000 /* reserved */ + nop +30: ldrsw x0, [x3, #BE(4)] /* SINT32 */ + nop +31: /* reserved */ +99: ldp x29, x30, [sp], #ffi_closure_SYSV_FS + cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) + cfi_restore (x29) + cfi_restore (x30) + ret + cfi_endproc + + .globl CNAME(ffi_closure_SYSV) + FFI_HIDDEN(CNAME(ffi_closure_SYSV)) +#ifdef __ELF__ + .type CNAME(ffi_closure_SYSV), #function + .size CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV) +#endif + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#include <mach/machine/vm_param.h> + .align PAGE_MAX_SHIFT +CNAME(ffi_closure_trampoline_table_page): + .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE + adr x16, -PAGE_MAX_SIZE + ldp x17, x16, [x16] + BR(x16) + nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller than 16 bytes */ + .endr + + .globl CNAME(ffi_closure_trampoline_table_page) + FFI_HIDDEN(CNAME(ffi_closure_trampoline_table_page)) + #ifdef __ELF__ + .type CNAME(ffi_closure_trampoline_table_page), #function + .size CNAME(ffi_closure_trampoline_table_page), . - CNAME(ffi_closure_trampoline_table_page) + #endif +#endif + +#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ + +#ifdef FFI_GO_CLOSURES + .align 4 +CNAME(ffi_go_closure_SYSV_V): + cfi_startproc + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) + + /* Save the argument passing vector registers. */ + stp q0, q1, [sp, #16 + 0] + stp q2, q3, [sp, #16 + 32] + stp q4, q5, [sp, #16 + 64] + stp q6, q7, [sp, #16 + 96] + b 0f + cfi_endproc + + .globl CNAME(ffi_go_closure_SYSV_V) + FFI_HIDDEN(CNAME(ffi_go_closure_SYSV_V)) +#ifdef __ELF__ + .type CNAME(ffi_go_closure_SYSV_V), #function + .size CNAME(ffi_go_closure_SYSV_V), . - CNAME(ffi_go_closure_SYSV_V) +#endif + + .align 4 + cfi_startproc +CNAME(ffi_go_closure_SYSV): + stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! + cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) + cfi_rel_offset (x29, 0) + cfi_rel_offset (x30, 8) +0: + mov x29, sp + + /* Save the argument passing core registers. */ + stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] + stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] + stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] + stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] + + /* Load ffi_closure_inner arguments. */ + ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ + mov x2, x18 /* load user_data */ + b .Ldo_closure + cfi_endproc + + .globl CNAME(ffi_go_closure_SYSV) + FFI_HIDDEN(CNAME(ffi_go_closure_SYSV)) +#ifdef __ELF__ + .type CNAME(ffi_go_closure_SYSV), #function + .size CNAME(ffi_go_closure_SYSV), . - CNAME(ffi_go_closure_SYSV) +#endif +#endif /* FFI_GO_CLOSURES */ +#endif /* __arm64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits +#endif + + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/arm/ffi_armv7.c b/Stinger/libffi/darwin_ios/src/arm/ffi_armv7.c new file mode 100644 index 0000000..dcc0f9d --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/arm/ffi_armv7.c @@ -0,0 +1,881 @@ +#ifdef __arm__ + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2011 Timothy Wall + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + Copyright (c) 2011 Anthony Green + Copyright (c) 2011 Free Software Foundation + Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined(__arm__) || defined(_M_ARM) +#include "fficonfig.h" +#include "ffi.h" +#include "ffi_common.h" +#include <stdint.h> +#include <stdlib.h> +#include "internal_armv7.h" + +#if defined(_MSC_VER) && defined(_M_ARM) +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#include <mach/machine/vm_param.h> +#endif + +#else +#ifndef _M_ARM +extern unsigned int ffi_arm_trampoline[2] FFI_HIDDEN; +#else +extern unsigned int ffi_arm_trampoline[3] FFI_HIDDEN; +#endif +#endif + +#if defined(__FreeBSD__) && defined(__arm__) +#include <sys/types.h> +#include <machine/sysarch.h> +#endif + +/* Forward declares. */ +static int vfp_type_p (const ffi_type *); +static void layout_vfp_args (ffi_cif *); + +static void * +ffi_align (ffi_type *ty, void *p) +{ + /* Align if necessary */ + size_t alignment; +#ifdef _WIN32_WCE + alignment = 4; +#else + alignment = ty->alignment; + if (alignment < 4) + alignment = 4; +#endif + return (void *) FFI_ALIGN (p, alignment); +} + +static size_t +ffi_put_arg (ffi_type *ty, void *src, void *dst) +{ + size_t z = ty->size; + + switch (ty->type) + { + case FFI_TYPE_SINT8: + *(UINT32 *)dst = *(SINT8 *)src; + break; + case FFI_TYPE_UINT8: + *(UINT32 *)dst = *(UINT8 *)src; + break; + case FFI_TYPE_SINT16: + *(UINT32 *)dst = *(SINT16 *)src; + break; + case FFI_TYPE_UINT16: + *(UINT32 *)dst = *(UINT16 *)src; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: +#ifndef _MSC_VER + case FFI_TYPE_FLOAT: +#endif + *(UINT32 *)dst = *(UINT32 *)src; + break; + +#ifdef _MSC_VER + // casting a float* to a UINT32* doesn't work on Windows + case FFI_TYPE_FLOAT: + *(uintptr_t *)dst = 0; + *(float *)dst = *(float *)src; + break; +#endif + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + case FFI_TYPE_DOUBLE: + *(UINT64 *)dst = *(UINT64 *)src; + break; + + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + memcpy (dst, src, z); + break; + + default: + abort(); + } + + return FFI_ALIGN (z, 4); +} + +/* ffi_prep_args is called once stack space has been allocated + for the function's arguments. + + The vfp_space parameter is the load area for VFP regs, the return + value is cif->vfp_used (word bitset of VFP regs used for passing + arguments). These are only used for the VFP hard-float ABI. +*/ +static void +ffi_prep_args_SYSV (ffi_cif *cif, int flags, void *rvalue, + void **avalue, char *argp) +{ + ffi_type **arg_types = cif->arg_types; + int i, n; + + if (flags == ARM_TYPE_STRUCT) + { + *(void **) argp = rvalue; + argp += 4; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + argp = ffi_align (ty, argp); + argp += ffi_put_arg (ty, avalue[i], argp); + } +} + +static void +ffi_prep_args_VFP (ffi_cif *cif, int flags, void *rvalue, + void **avalue, char *stack, char *vfp_space) +{ + ffi_type **arg_types = cif->arg_types; + int i, n, vi = 0; + char *argp, *regp, *eo_regp; + char stack_used = 0; + char done_with_regs = 0; + + /* The first 4 words on the stack are used for values + passed in core registers. */ + regp = stack; + eo_regp = argp = regp + 16; + + /* If the function returns an FFI_TYPE_STRUCT in memory, + that address is passed in r0 to the function. */ + if (flags == ARM_TYPE_STRUCT) + { + *(void **) regp = rvalue; + regp += 4; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + void *a = avalue[i]; + int is_vfp_type = vfp_type_p (ty); + + /* Allocated in VFP registers. */ + if (vi < cif->vfp_nargs && is_vfp_type) + { + char *vfp_slot = vfp_space + cif->vfp_args[vi++] * 4; + ffi_put_arg (ty, a, vfp_slot); + continue; + } + /* Try allocating in core registers. */ + else if (!done_with_regs && !is_vfp_type) + { + char *tregp = ffi_align (ty, regp); + size_t size = ty->size; + size = (size < 4) ? 4 : size; // pad + /* Check if there is space left in the aligned register + area to place the argument. */ + if (tregp + size <= eo_regp) + { + regp = tregp + ffi_put_arg (ty, a, tregp); + done_with_regs = (regp == argp); + // ensure we did not write into the stack area + FFI_ASSERT (regp <= argp); + continue; + } + /* In case there are no arguments in the stack area yet, + the argument is passed in the remaining core registers + and on the stack. */ + else if (!stack_used) + { + stack_used = 1; + done_with_regs = 1; + argp = tregp + ffi_put_arg (ty, a, tregp); + FFI_ASSERT (eo_regp < argp); + continue; + } + } + /* Base case, arguments are passed on the stack */ + stack_used = 1; + argp = ffi_align (ty, argp); + argp += ffi_put_arg (ty, a, argp); + } +} + +/* Perform machine dependent cif processing */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ + int flags = 0, cabi = cif->abi; + size_t bytes = cif->bytes; + + /* Map out the register placements of VFP register args. The VFP + hard-float calling conventions are slightly more sophisticated + than the base calling conventions, so we do it here instead of + in ffi_prep_args(). */ + if (cabi == FFI_VFP) + layout_vfp_args (cif); + + /* Set the return type flag */ + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + flags = ARM_TYPE_VOID; + break; + + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_POINTER: + flags = ARM_TYPE_INT; + break; + + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = ARM_TYPE_INT64; + break; + + case FFI_TYPE_FLOAT: + flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_S : ARM_TYPE_INT); + break; + case FFI_TYPE_DOUBLE: + flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_D : ARM_TYPE_INT64); + break; + + case FFI_TYPE_STRUCT: + case FFI_TYPE_COMPLEX: + if (cabi == FFI_VFP) + { + int h = vfp_type_p (cif->rtype); + + flags = ARM_TYPE_VFP_N; + if (h == 0x100 + FFI_TYPE_FLOAT) + flags = ARM_TYPE_VFP_S; + if (h == 0x100 + FFI_TYPE_DOUBLE) + flags = ARM_TYPE_VFP_D; + if (h != 0) + break; + } + + /* A Composite Type not larger than 4 bytes is returned in r0. + A Composite Type larger than 4 bytes, or whose size cannot + be determined statically ... is stored in memory at an + address passed [in r0]. */ + if (cif->rtype->size <= 4) + flags = ARM_TYPE_INT; + else + { + flags = ARM_TYPE_STRUCT; + bytes += 4; + } + break; + + default: + abort(); + } + + /* Round the stack up to a multiple of 8 bytes. This isn't needed + everywhere, but it is on some platforms, and it doesn't harm anything + when it isn't needed. */ + bytes = FFI_ALIGN (bytes, 8); + + /* Minimum stack space is the 4 register arguments that we pop. */ + if (bytes < 4*4) + bytes = 4*4; + + cif->bytes = bytes; + cif->flags = flags; + + return FFI_OK; +} + +/* Perform machine dependent cif processing for variadic calls */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep_var (ffi_cif * cif, + unsigned int nfixedargs, unsigned int ntotalargs) +{ + /* VFP variadic calls actually use the SYSV ABI */ + if (cif->abi == FFI_VFP) + cif->abi = FFI_SYSV; + + return ffi_prep_cif_machdep (cif); +} + +/* Prototypes for assembly functions, in sysv.S. */ + +struct call_frame +{ + void *fp; + void *lr; + void *rvalue; + int flags; + void *closure; +}; + +extern void ffi_call_SYSV (void *stack, struct call_frame *, + void (*fn) (void)) FFI_HIDDEN; +extern void ffi_call_VFP (void *vfp_space, struct call_frame *, + void (*fn) (void), unsigned vfp_used) FFI_HIDDEN; + +static void +ffi_call_int (ffi_cif * cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + int flags = cif->flags; + ffi_type *rtype = cif->rtype; + size_t bytes, rsize, vfp_size; + char *stack, *vfp_space, *new_rvalue; + struct call_frame *frame; + + rsize = 0; + if (rvalue == NULL) + { + /* If the return value is a struct and we don't have a return + value address then we need to make one. Otherwise the return + value is in registers and we can ignore them. */ + if (flags == ARM_TYPE_STRUCT) + rsize = rtype->size; + else + flags = ARM_TYPE_VOID; + } + else if (flags == ARM_TYPE_VFP_N) + { + /* Largest case is double x 4. */ + rsize = 32; + } + else if (flags == ARM_TYPE_INT && rtype->type == FFI_TYPE_STRUCT) + rsize = 4; + + /* Largest case. */ + vfp_size = (cif->abi == FFI_VFP && cif->vfp_used ? 8*8: 0); + + bytes = cif->bytes; + stack = alloca (vfp_size + bytes + sizeof(struct call_frame) + rsize); + + vfp_space = NULL; + if (vfp_size) + { + vfp_space = stack; + stack += vfp_size; + } + + frame = (struct call_frame *)(stack + bytes); + + new_rvalue = rvalue; + if (rsize) + new_rvalue = (void *)(frame + 1); + + frame->rvalue = new_rvalue; + frame->flags = flags; + frame->closure = closure; + + if (vfp_space) + { + ffi_prep_args_VFP (cif, flags, new_rvalue, avalue, stack, vfp_space); + ffi_call_VFP (vfp_space, frame, fn, cif->vfp_used); + } + else + { + ffi_prep_args_SYSV (cif, flags, new_rvalue, avalue, stack); + ffi_call_SYSV (stack, frame, fn); + } + + if (rvalue && rvalue != new_rvalue) + memcpy (rvalue, new_rvalue, rtype->size); +} + +void +ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES +void +ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} +#endif + +static void * +ffi_prep_incoming_args_SYSV (ffi_cif *cif, void *rvalue, + char *argp, void **avalue) +{ + ffi_type **arg_types = cif->arg_types; + int i, n; + + if (cif->flags == ARM_TYPE_STRUCT) + { + rvalue = *(void **) argp; + argp += 4; + } + else + { + if (cif->rtype->size && cif->rtype->size < 4) + *(uint32_t *) rvalue = 0; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + size_t z = ty->size; + + argp = ffi_align (ty, argp); + avalue[i] = (void *) argp; + argp += z; + } + + return rvalue; +} + +static void * +ffi_prep_incoming_args_VFP (ffi_cif *cif, void *rvalue, char *stack, + char *vfp_space, void **avalue) +{ + ffi_type **arg_types = cif->arg_types; + int i, n, vi = 0; + char *argp, *regp, *eo_regp; + char done_with_regs = 0; + char stack_used = 0; + + regp = stack; + eo_regp = argp = regp + 16; + + if (cif->flags == ARM_TYPE_STRUCT) + { + rvalue = *(void **) regp; + regp += 4; + } + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + int is_vfp_type = vfp_type_p (ty); + size_t z = ty->size; + + if (vi < cif->vfp_nargs && is_vfp_type) + { + avalue[i] = vfp_space + cif->vfp_args[vi++] * 4; + continue; + } + else if (!done_with_regs && !is_vfp_type) + { + char *tregp = ffi_align (ty, regp); + + z = (z < 4) ? 4 : z; // pad + + /* If the arguments either fits into the registers or uses registers + and stack, while we haven't read other things from the stack */ + if (tregp + z <= eo_regp || !stack_used) + { + /* Because we're little endian, this is what it turns into. */ + avalue[i] = (void *) tregp; + regp = tregp + z; + + /* If we read past the last core register, make sure we + have not read from the stack before and continue + reading after regp. */ + if (regp > eo_regp) + { + FFI_ASSERT (!stack_used); + argp = regp; + } + if (regp >= eo_regp) + { + done_with_regs = 1; + stack_used = 1; + } + continue; + } + } + + stack_used = 1; + argp = ffi_align (ty, argp); + avalue[i] = (void *) argp; + argp += z; + } + + return rvalue; +} + +struct closure_frame +{ + char vfp_space[8*8] __attribute__((aligned(8))); + char result[8*4]; + char argp[]; +}; + +int FFI_HIDDEN +ffi_closure_inner_SYSV (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + struct closure_frame *frame) +{ + void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); + void *rvalue = ffi_prep_incoming_args_SYSV (cif, frame->result, + frame->argp, avalue); + fun (cif, rvalue, avalue, user_data); + return cif->flags; +} + +int FFI_HIDDEN +ffi_closure_inner_VFP (ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, + struct closure_frame *frame) +{ + void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); + void *rvalue = ffi_prep_incoming_args_VFP (cif, frame->result, frame->argp, + frame->vfp_space, avalue); + fun (cif, rvalue, avalue, user_data); + return cif->flags; +} + +void ffi_closure_SYSV (void) FFI_HIDDEN; +void ffi_closure_VFP (void) FFI_HIDDEN; + +#ifdef FFI_GO_CLOSURES +void ffi_go_closure_SYSV (void) FFI_HIDDEN; +void ffi_go_closure_VFP (void) FFI_HIDDEN; +#endif + +/* the cif must already be prep'ed */ + +#if defined(__FreeBSD__) && defined(__arm__) +#define __clear_cache(start, end) do { \ + struct arm_sync_icache_args ua; \ + \ + ua.addr = (uintptr_t)(start); \ + ua.len = (char *)(end) - (char *)start; \ + sysarch(ARM_SYNC_ICACHE, &ua); \ + } while (0); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure * closure, + ffi_cif * cif, + void (*fun) (ffi_cif *, void *, void **, void *), + void *user_data, void *codeloc) +{ + void (*closure_func) (void) = ffi_closure_SYSV; + + if (cif->abi == FFI_VFP) + { + /* We only need take the vfp path if there are vfp arguments. */ + if (cif->vfp_used) + closure_func = ffi_closure_VFP; + } + else if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + +#if FFI_EXEC_TRAMPOLINE_TABLE + void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); + config[0] = closure; + config[1] = closure_func; +#else + +#ifndef _M_ARM + memcpy(closure->tramp, ffi_arm_trampoline, 8); +#else + // cast away function type so MSVC doesn't set the lower bit of the function pointer + memcpy(closure->tramp, (void*)((uintptr_t)ffi_arm_trampoline & 0xFFFFFFFE), FFI_TRAMPOLINE_CLOSURE_OFFSET); +#endif + +#if defined (__QNX__) + msync(closure->tramp, 8, 0x1000000); /* clear data map */ + msync(codeloc, 8, 0x1000000); /* clear insn map */ +#elif defined(_MSC_VER) + FlushInstructionCache(GetCurrentProcess(), closure->tramp, FFI_TRAMPOLINE_SIZE); +#else + __clear_cache(closure->tramp, closure->tramp + 8); /* clear data map */ + __clear_cache(codeloc, codeloc + 8); /* clear insn map */ +#endif +#ifdef _M_ARM + *(void(**)(void))(closure->tramp + FFI_TRAMPOLINE_CLOSURE_FUNCTION) = closure_func; +#else + *(void (**)(void))(closure->tramp + 8) = closure_func; +#endif +#endif + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES +ffi_status +ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, + void (*fun) (ffi_cif *, void *, void **, void *)) +{ + void (*closure_func) (void) = ffi_go_closure_SYSV; + + if (cif->abi == FFI_VFP) + { + /* We only need take the vfp path if there are vfp arguments. */ + if (cif->vfp_used) + closure_func = ffi_go_closure_VFP; + } + else if (cif->abi != FFI_SYSV) + return FFI_BAD_ABI; + + closure->tramp = closure_func; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} +#endif + +/* Below are routines for VFP hard-float support. */ + +/* A subroutine of vfp_type_p. Given a structure type, return the type code + of the first non-structure element. Recurse for structure elements. + Return -1 if the structure is in fact empty, i.e. no nested elements. */ + +static int +is_hfa0 (const ffi_type *ty) +{ + ffi_type **elements = ty->elements; + int i, ret = -1; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + ret = elements[i]->type; + if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) + { + ret = is_hfa0 (elements[i]); + if (ret < 0) + continue; + } + break; + } + + return ret; +} + +/* A subroutine of vfp_type_p. Given a structure type, return true if all + of the non-structure elements are the same as CANDIDATE. */ + +static int +is_hfa1 (const ffi_type *ty, int candidate) +{ + ffi_type **elements = ty->elements; + int i; + + if (elements != NULL) + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + return 1; +} + +/* Determine if TY is an homogenous floating point aggregate (HFA). + That is, a structure consisting of 1 to 4 members of all the same type, + where that type is a floating point scalar. + + Returns non-zero iff TY is an HFA. The result is an encoded value where + bits 0-7 contain the type code, and bits 8-10 contain the element count. */ + +static int +vfp_type_p (const ffi_type *ty) +{ + ffi_type **elements; + int candidate, i; + size_t size, ele_count; + + /* Quickest tests first. */ + candidate = ty->type; + switch (ty->type) + { + default: + return 0; + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + ele_count = 1; + goto done; + case FFI_TYPE_COMPLEX: + candidate = ty->elements[0]->type; + if (candidate != FFI_TYPE_FLOAT && candidate != FFI_TYPE_DOUBLE) + return 0; + ele_count = 2; + goto done; + case FFI_TYPE_STRUCT: + break; + } + + /* No HFA types are smaller than 4 bytes, or larger than 32 bytes. */ + size = ty->size; + if (size < 4 || size > 32) + return 0; + + /* Find the type of the first non-structure member. */ + elements = ty->elements; + candidate = elements[0]->type; + if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) + { + for (i = 0; ; ++i) + { + candidate = is_hfa0 (elements[i]); + if (candidate >= 0) + break; + } + } + + /* If the first member is not a floating point type, it's not an HFA. + Also quickly re-check the size of the structure. */ + switch (candidate) + { + case FFI_TYPE_FLOAT: + ele_count = size / sizeof(float); + if (size != ele_count * sizeof(float)) + return 0; + break; + case FFI_TYPE_DOUBLE: + ele_count = size / sizeof(double); + if (size != ele_count * sizeof(double)) + return 0; + break; + default: + return 0; + } + if (ele_count > 4) + return 0; + + /* Finally, make sure that all scalar elements are the same type. */ + for (i = 0; elements[i]; ++i) + { + int t = elements[i]->type; + if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) + { + if (!is_hfa1 (elements[i], candidate)) + return 0; + } + else if (t != candidate) + return 0; + } + + /* All tests succeeded. Encode the result. */ + done: + return (ele_count << 8) | candidate; +} + +static int +place_vfp_arg (ffi_cif *cif, int h) +{ + unsigned short reg = cif->vfp_reg_free; + int align = 1, nregs = h >> 8; + + if ((h & 0xff) == FFI_TYPE_DOUBLE) + align = 2, nregs *= 2; + + /* Align register number. */ + if ((reg & 1) && align == 2) + reg++; + + while (reg + nregs <= 16) + { + int s, new_used = 0; + for (s = reg; s < reg + nregs; s++) + { + new_used |= (1 << s); + if (cif->vfp_used & (1 << s)) + { + reg += align; + goto next_reg; + } + } + /* Found regs to allocate. */ + cif->vfp_used |= new_used; + cif->vfp_args[cif->vfp_nargs++] = (signed char)reg; + + /* Update vfp_reg_free. */ + if (cif->vfp_used & (1 << cif->vfp_reg_free)) + { + reg += nregs; + while (cif->vfp_used & (1 << reg)) + reg += 1; + cif->vfp_reg_free = reg; + } + return 0; + next_reg:; + } + // done, mark all regs as used + cif->vfp_reg_free = 16; + cif->vfp_used = 0xFFFF; + return 1; +} + +static void +layout_vfp_args (ffi_cif * cif) +{ + unsigned int i; + /* Init VFP fields */ + cif->vfp_used = 0; + cif->vfp_nargs = 0; + cif->vfp_reg_free = 0; + memset (cif->vfp_args, -1, 16); /* Init to -1. */ + + for (i = 0; i < cif->nargs; i++) + { + int h = vfp_type_p (cif->arg_types[i]); + if (h && place_vfp_arg (cif, h) == 1) + break; + } +} + +#endif /* __arm__ or _M_ARM */ + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/arm/internal_armv7.h b/Stinger/libffi/darwin_ios/src/arm/internal_armv7.h new file mode 100644 index 0000000..e430cb0 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/arm/internal_armv7.h @@ -0,0 +1,12 @@ +#ifdef __arm__ + +#define ARM_TYPE_VFP_S 0 +#define ARM_TYPE_VFP_D 1 +#define ARM_TYPE_VFP_N 2 +#define ARM_TYPE_INT64 3 +#define ARM_TYPE_INT 4 +#define ARM_TYPE_VOID 5 +#define ARM_TYPE_STRUCT 6 + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S b/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S new file mode 100644 index 0000000..45be58d --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S @@ -0,0 +1,390 @@ +#ifdef __arm__ + +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc. + Copyright (c) 2011 Plausible Labs Cooperative, Inc. + + ARM Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __arm__ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "internal_armv7.h" + +/* GCC 4.8 provides __ARM_ARCH; construct it otherwise. */ +#ifndef __ARM_ARCH +# if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ + || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ + || defined(__ARM_ARCH_7EM__) +# define __ARM_ARCH 7 +# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \ + || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) \ + || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) \ + || defined(__ARM_ARCH_6M__) +# define __ARM_ARCH 6 +# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ + || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ + || defined(__ARM_ARCH_5TEJ__) +# define __ARM_ARCH 5 +# else +# define __ARM_ARCH 4 +# endif +#endif + +/* Conditionally compile unwinder directives. */ +#ifdef __ARM_EABI__ +# define UNWIND(...) __VA_ARGS__ +#else +# define UNWIND(...) +#endif + +#if defined(HAVE_AS_CFI_PSEUDO_OP) && defined(__ARM_EABI__) + .cfi_sections .debug_frame +#endif + +#define CONCAT(a, b) CONCAT2(a, b) +#define CONCAT2(a, b) a ## b + +#ifdef __USER_LABEL_PREFIX__ +# define CNAME(X) CONCAT (__USER_LABEL_PREFIX__, X) +#else +# define CNAME(X) X +#endif +#ifdef __ELF__ +# define SIZE(X) .size CNAME(X), . - CNAME(X) +# define TYPE(X, Y) .type CNAME(X), Y +#else +# define SIZE(X) +# define TYPE(X, Y) +#endif + +#define ARM_FUNC_START_LOCAL(name) \ + .align 3; \ + TYPE(CNAME(name), %function); \ + CNAME(name): + +#define ARM_FUNC_START(name) \ + .globl CNAME(name); \ + FFI_HIDDEN(CNAME(name)); \ + ARM_FUNC_START_LOCAL(name) + +#define ARM_FUNC_END(name) \ + SIZE(name) + +/* Aid in defining a jump table with 8 bytes between entries. */ +/* ??? The clang assembler doesn't handle .if with symbolic expressions. */ +#ifdef __clang__ +# define E(index) +#else +# define E(index) \ + .if . - 0b - 8*index; \ + .error "type table out of sync"; \ + .endif +#endif + + .text + .syntax unified + .arm + +#ifndef __clang__ + /* We require interworking on LDM, which implies ARMv5T, + which implies the existance of BLX. */ + .arch armv5t +#endif + + /* Note that we use STC and LDC to encode VFP instructions, + so that we do not need ".fpu vfp", nor get that added to + the object file attributes. These will not be executed + unless the FFI_VFP abi is used. */ + + @ r0: stack + @ r1: frame + @ r2: fn + @ r3: vfp_used + +ARM_FUNC_START(ffi_call_VFP) + UNWIND(.fnstart) + cfi_startproc + + cmp r3, #3 @ load only d0 if possible +#ifdef __clang__ + vldrle d0, [r0] + vldmgt r0, {d0-d7} +#else + ldcle p11, cr0, [r0] @ vldrle d0, [r0] + ldcgt p11, cr0, [r0], {16} @ vldmgt r0, {d0-d7} +#endif + add r0, r0, #64 @ discard the vfp register args + /* FALLTHRU */ +ARM_FUNC_END(ffi_call_VFP) + +ARM_FUNC_START(ffi_call_SYSV) + stm r1, {fp, lr} + mov fp, r1 + + @ This is a bit of a lie wrt the origin of the unwind info, but + @ now we've got the usual frame pointer and two saved registers. + UNWIND(.save {fp,lr}) + UNWIND(.setfp fp, sp) + cfi_def_cfa(fp, 8) + cfi_rel_offset(fp, 0) + cfi_rel_offset(lr, 4) + + mov sp, r0 @ install the stack pointer + mov lr, r2 @ move the fn pointer out of the way + ldr ip, [fp, #16] @ install the static chain + ldmia sp!, {r0-r3} @ move first 4 parameters in registers. + blx lr @ call fn + + @ Load r2 with the pointer to storage for the return value + @ Load r3 with the return type code + ldr r2, [fp, #8] + ldr r3, [fp, #12] + + @ Deallocate the stack with the arguments. + mov sp, fp + cfi_def_cfa_register(sp) + + @ Store values stored in registers. + .align 3 + add pc, pc, r3, lsl #3 + nop +0: +E(ARM_TYPE_VFP_S) +#ifdef __clang__ + vstr s0, [r2] +#else + stc p10, cr0, [r2] @ vstr s0, [r2] +#endif + pop {fp,pc} +E(ARM_TYPE_VFP_D) +#ifdef __clang__ + vstr d0, [r2] +#else + stc p11, cr0, [r2] @ vstr d0, [r2] +#endif + pop {fp,pc} +E(ARM_TYPE_VFP_N) +#ifdef __clang__ + vstm r2, {d0-d3} +#else + stc p11, cr0, [r2], {8} @ vstm r2, {d0-d3} +#endif + pop {fp,pc} +E(ARM_TYPE_INT64) + str r1, [r2, #4] + nop +E(ARM_TYPE_INT) + str r0, [r2] + pop {fp,pc} +E(ARM_TYPE_VOID) + pop {fp,pc} + nop +E(ARM_TYPE_STRUCT) + pop {fp,pc} + + cfi_endproc + UNWIND(.fnend) +ARM_FUNC_END(ffi_call_SYSV) + + +/* + int ffi_closure_inner_* (cif, fun, user_data, frame) +*/ + +ARM_FUNC_START(ffi_go_closure_SYSV) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + ldr r0, [ip, #4] @ load cif + ldr r1, [ip, #8] @ load fun + mov r2, ip @ load user_data + b 0f + cfi_endproc +ARM_FUNC_END(ffi_go_closure_SYSV) + +ARM_FUNC_START(ffi_closure_SYSV) + UNWIND(.fnstart) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + +#if FFI_EXEC_TRAMPOLINE_TABLE + ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* +#endif + ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif + ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun + ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data +0: + add ip, sp, #16 @ compute entry sp + sub sp, sp, #64+32 @ allocate frame + cfi_adjust_cfa_offset(64+32) + stmdb sp!, {ip,lr} + + /* Remember that EABI unwind info only applies at call sites. + We need do nothing except note the save of the stack pointer + and the link registers. */ + UNWIND(.save {sp,lr}) + cfi_adjust_cfa_offset(8) + cfi_rel_offset(lr, 4) + + add r3, sp, #8 @ load frame + bl CNAME(ffi_closure_inner_SYSV) + + @ Load values returned in registers. + add r2, sp, #8+64 @ load result + adr r3, CNAME(ffi_closure_ret) + add pc, r3, r0, lsl #3 + cfi_endproc + UNWIND(.fnend) +ARM_FUNC_END(ffi_closure_SYSV) + +ARM_FUNC_START(ffi_go_closure_VFP) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + ldr r0, [ip, #4] @ load cif + ldr r1, [ip, #8] @ load fun + mov r2, ip @ load user_data + b 0f + cfi_endproc +ARM_FUNC_END(ffi_go_closure_VFP) + +ARM_FUNC_START(ffi_closure_VFP) + UNWIND(.fnstart) + cfi_startproc + stmdb sp!, {r0-r3} @ save argument regs + cfi_adjust_cfa_offset(16) + +#if FFI_EXEC_TRAMPOLINE_TABLE + ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* +#endif + ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif + ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun + ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data +0: + add ip, sp, #16 + sub sp, sp, #64+32 @ allocate frame + cfi_adjust_cfa_offset(64+32) +#ifdef __clang__ + vstm sp, {d0-d7} +#else + stc p11, cr0, [sp], {16} @ vstm sp, {d0-d7} +#endif + stmdb sp!, {ip,lr} + + /* See above. */ + UNWIND(.save {sp,lr}) + cfi_adjust_cfa_offset(8) + cfi_rel_offset(lr, 4) + + add r3, sp, #8 @ load frame + bl CNAME(ffi_closure_inner_VFP) + + @ Load values returned in registers. + add r2, sp, #8+64 @ load result + adr r3, CNAME(ffi_closure_ret) + add pc, r3, r0, lsl #3 + cfi_endproc + UNWIND(.fnend) +ARM_FUNC_END(ffi_closure_VFP) + +/* Load values returned in registers for both closure entry points. + Note that we use LDM with SP in the register set. This is deprecated + by ARM, but not yet unpredictable. */ + +ARM_FUNC_START_LOCAL(ffi_closure_ret) + cfi_startproc + cfi_rel_offset(sp, 0) + cfi_rel_offset(lr, 4) +0: +E(ARM_TYPE_VFP_S) +#ifdef __clang__ + vldr s0, [r2] +#else + ldc p10, cr0, [r2] @ vldr s0, [r2] +#endif + ldm sp, {sp,pc} +E(ARM_TYPE_VFP_D) +#ifdef __clang__ + vldr d0, [r2] +#else + ldc p11, cr0, [r2] @ vldr d0, [r2] +#endif + ldm sp, {sp,pc} +E(ARM_TYPE_VFP_N) +#ifdef __clang__ + vldm r2, {d0-d3} +#else + ldc p11, cr0, [r2], {8} @ vldm r2, {d0-d3} +#endif + ldm sp, {sp,pc} +E(ARM_TYPE_INT64) + ldr r1, [r2, #4] + nop +E(ARM_TYPE_INT) + ldr r0, [r2] + ldm sp, {sp,pc} +E(ARM_TYPE_VOID) + ldm sp, {sp,pc} + nop +E(ARM_TYPE_STRUCT) + ldm sp, {sp,pc} + cfi_endproc +ARM_FUNC_END(ffi_closure_ret) + +#if FFI_EXEC_TRAMPOLINE_TABLE + +#ifdef __MACH__ +#include <mach/machine/vm_param.h> + +.align PAGE_MAX_SHIFT +ARM_FUNC_START(ffi_closure_trampoline_table_page) +.rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE + adr ip, #-PAGE_MAX_SIZE @ the config page is PAGE_MAX_SIZE behind the trampoline page + sub ip, #8 @ account for pc bias + ldr pc, [ip, #4] @ jump to ffi_closure_SYSV or ffi_closure_VFP +.endr +ARM_FUNC_END(ffi_closure_trampoline_table_page) +#endif + +#else + +ARM_FUNC_START(ffi_arm_trampoline) +0: adr ip, 0b + ldr pc, 1f +1: .long 0 +ARM_FUNC_END(ffi_arm_trampoline) + +#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ +#endif /* __arm__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",%progbits +#endif + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/asmnames.h b/Stinger/libffi/darwin_ios/src/x86/asmnames.h new file mode 100644 index 0000000..0327c8f --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/asmnames.h @@ -0,0 +1,35 @@ +#ifdef __x86_64__ + +#ifndef ASMNAMES_H +#define ASMNAMES_H + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) +#ifdef __USER_LABEL_PREFIX__ +# define C(X) C1(__USER_LABEL_PREFIX__, X) +#else +# define C(X) X +#endif + +#ifdef __APPLE__ +# define L(X) C1(L, X) +#else +# define L(X) C1(.L, X) +#endif + +#if defined(__ELF__) && defined(__PIC__) +# define PLT(X) X@PLT +#else +# define PLT(X) X +#endif + +#ifdef __ELF__ +# define ENDF(X) .type X,@function; .size X, . - X +#else +# define ENDF(X) +#endif + +#endif /* ASMNAMES_H */ + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/ffi64_x86_64.c b/Stinger/libffi/darwin_ios/src/x86/ffi64_x86_64.c new file mode 100644 index 0000000..7156c94 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/ffi64_x86_64.c @@ -0,0 +1,900 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + ffi64.c - Copyright (c) 2011, 2018 Anthony Green + Copyright (c) 2013 The Written Word, Inc. + Copyright (c) 2008, 2010 Red Hat, Inc. + Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de> + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#include "ffi.h" +#include "ffi_common.h" + +#include <stdlib.h> +#include <stdarg.h> +#include <stdint.h> +#include "internal64.h" + +#ifdef __x86_64__ + +#define MAX_GPR_REGS 6 +#define MAX_SSE_REGS 8 + +#if defined(__INTEL_COMPILER) +#include "xmmintrin.h" +#define UINT128 __m128 +#else +#if defined(__SUNPRO_C) +#include <sunmedia_types.h> +#define UINT128 __m128i +#else +#define UINT128 __int128_t +#endif +#endif + +union big_int_union +{ + UINT32 i32; + UINT64 i64; + UINT128 i128; +}; + +struct register_args +{ + /* Registers for argument passing. */ + UINT64 gpr[MAX_GPR_REGS]; + union big_int_union sse[MAX_SSE_REGS]; + UINT64 rax; /* ssecount */ + UINT64 r10; /* static chain */ +}; + +extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)) FFI_HIDDEN; + +/* All reference to register classes here is identical to the code in + gcc/config/i386/i386.c. Do *not* change one without the other. */ + +/* Register class used for passing given 64bit part of the argument. + These represent classes as documented by the PS ABI, with the + exception of SSESF, SSEDF classes, that are basically SSE class, + just gcc will use SF or DFmode move instead of DImode to avoid + reformatting penalties. + + Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves + whenever possible (upper half does contain padding). */ +enum x86_64_reg_class + { + X86_64_NO_CLASS, + X86_64_INTEGER_CLASS, + X86_64_INTEGERSI_CLASS, + X86_64_SSE_CLASS, + X86_64_SSESF_CLASS, + X86_64_SSEDF_CLASS, + X86_64_SSEUP_CLASS, + X86_64_X87_CLASS, + X86_64_X87UP_CLASS, + X86_64_COMPLEX_X87_CLASS, + X86_64_MEMORY_CLASS + }; + +#define MAX_CLASSES 4 + +#define SSE_CLASS_P(X) ((X) >= X86_64_SSE_CLASS && X <= X86_64_SSEUP_CLASS) + +/* x86-64 register passing implementation. See x86-64 ABI for details. Goal + of this code is to classify each 8bytes of incoming argument by the register + class and assign registers accordingly. */ + +/* Return the union class of CLASS1 and CLASS2. + See the x86-64 PS ABI for details. */ + +static enum x86_64_reg_class +merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) +{ + /* Rule #1: If both classes are equal, this is the resulting class. */ + if (class1 == class2) + return class1; + + /* Rule #2: If one of the classes is NO_CLASS, the resulting class is + the other class. */ + if (class1 == X86_64_NO_CLASS) + return class2; + if (class2 == X86_64_NO_CLASS) + return class1; + + /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ + if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ + if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) + || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) + return X86_64_INTEGERSI_CLASS; + if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS + || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) + return X86_64_INTEGER_CLASS; + + /* Rule #5: If one of the classes is X87, X87UP, or COMPLEX_X87 class, + MEMORY is used. */ + if (class1 == X86_64_X87_CLASS + || class1 == X86_64_X87UP_CLASS + || class1 == X86_64_COMPLEX_X87_CLASS + || class2 == X86_64_X87_CLASS + || class2 == X86_64_X87UP_CLASS + || class2 == X86_64_COMPLEX_X87_CLASS) + return X86_64_MEMORY_CLASS; + + /* Rule #6: Otherwise class SSE is used. */ + return X86_64_SSE_CLASS; +} + +/* Classify the argument of type TYPE and mode MODE. + CLASSES will be filled by the register class used to pass each word + of the operand. The number of words is returned. In case the parameter + should be passed in memory, 0 is returned. As a special case for zero + sized containers, classes[0] will be NO_CLASS and 1 is returned. + + See the x86-64 PS ABI for details. +*/ +static size_t +classify_argument (ffi_type *type, enum x86_64_reg_class classes[], + size_t byte_offset) +{ + switch (type->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + case FFI_TYPE_POINTER: + do_integer: + { + size_t size = byte_offset + type->size; + + if (size <= 4) + { + classes[0] = X86_64_INTEGERSI_CLASS; + return 1; + } + else if (size <= 8) + { + classes[0] = X86_64_INTEGER_CLASS; + return 1; + } + else if (size <= 12) + { + classes[0] = X86_64_INTEGER_CLASS; + classes[1] = X86_64_INTEGERSI_CLASS; + return 2; + } + else if (size <= 16) + { + classes[0] = classes[1] = X86_64_INTEGER_CLASS; + return 2; + } + else + FFI_ASSERT (0); + } + case FFI_TYPE_FLOAT: + if (!(byte_offset % 8)) + classes[0] = X86_64_SSESF_CLASS; + else + classes[0] = X86_64_SSE_CLASS; + return 1; + case FFI_TYPE_DOUBLE: + classes[0] = X86_64_SSEDF_CLASS; + return 1; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_X87_CLASS; + classes[1] = X86_64_X87UP_CLASS; + return 2; +#endif + case FFI_TYPE_STRUCT: + { + const size_t UNITS_PER_WORD = 8; + size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; + ffi_type **ptr; + unsigned int i; + enum x86_64_reg_class subclasses[MAX_CLASSES]; + + /* If the struct is larger than 32 bytes, pass it on the stack. */ + if (type->size > 32) + return 0; + + for (i = 0; i < words; i++) + classes[i] = X86_64_NO_CLASS; + + /* Zero sized arrays or structures are NO_CLASS. We return 0 to + signalize memory class, so handle it as special case. */ + if (!words) + { + case FFI_TYPE_VOID: + classes[0] = X86_64_NO_CLASS; + return 1; + } + + /* Merge the fields of structure. */ + for (ptr = type->elements; *ptr != NULL; ptr++) + { + size_t num; + + byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment); + + num = classify_argument (*ptr, subclasses, byte_offset % 8); + if (num == 0) + return 0; + for (i = 0; i < num; i++) + { + size_t pos = byte_offset / 8; + classes[i + pos] = + merge_classes (subclasses[i], classes[i + pos]); + } + + byte_offset += (*ptr)->size; + } + + if (words > 2) + { + /* When size > 16 bytes, if the first one isn't + X86_64_SSE_CLASS or any other ones aren't + X86_64_SSEUP_CLASS, everything should be passed in + memory. */ + if (classes[0] != X86_64_SSE_CLASS) + return 0; + + for (i = 1; i < words; i++) + if (classes[i] != X86_64_SSEUP_CLASS) + return 0; + } + + /* Final merger cleanup. */ + for (i = 0; i < words; i++) + { + /* If one class is MEMORY, everything should be passed in + memory. */ + if (classes[i] == X86_64_MEMORY_CLASS) + return 0; + + /* The X86_64_SSEUP_CLASS should be always preceded by + X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */ + if (i > 1 && classes[i] == X86_64_SSEUP_CLASS + && classes[i - 1] != X86_64_SSE_CLASS + && classes[i - 1] != X86_64_SSEUP_CLASS) + { + /* The first one should never be X86_64_SSEUP_CLASS. */ + FFI_ASSERT (i != 0); + classes[i] = X86_64_SSE_CLASS; + } + + /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS, + everything should be passed in memory. */ + if (i > 1 && classes[i] == X86_64_X87UP_CLASS + && (classes[i - 1] != X86_64_X87_CLASS)) + { + /* The first one should never be X86_64_X87UP_CLASS. */ + FFI_ASSERT (i != 0); + return 0; + } + } + return words; + } + case FFI_TYPE_COMPLEX: + { + ffi_type *inner = type->elements[0]; + switch (inner->type) + { + case FFI_TYPE_INT: + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + goto do_integer; + + case FFI_TYPE_FLOAT: + classes[0] = X86_64_SSE_CLASS; + if (byte_offset % 8) + { + classes[1] = X86_64_SSESF_CLASS; + return 2; + } + return 1; + case FFI_TYPE_DOUBLE: + classes[0] = classes[1] = X86_64_SSEDF_CLASS; + return 2; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + classes[0] = X86_64_COMPLEX_X87_CLASS; + return 1; +#endif + } + } + } + abort(); +} + +/* Examine the argument and return set number of register required in each + class. Return zero iff parameter should be passed in memory, otherwise + the number of registers. */ + +static size_t +examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], + _Bool in_return, int *pngpr, int *pnsse) +{ + size_t n; + unsigned int i; + int ngpr, nsse; + + n = classify_argument (type, classes, 0); + if (n == 0) + return 0; + + ngpr = nsse = 0; + for (i = 0; i < n; ++i) + switch (classes[i]) + { + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + ngpr++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSESF_CLASS: + case X86_64_SSEDF_CLASS: + nsse++; + break; + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + case X86_64_X87_CLASS: + case X86_64_X87UP_CLASS: + case X86_64_COMPLEX_X87_CLASS: + return in_return != 0; + default: + abort (); + } + + *pngpr = ngpr; + *pnsse = nsse; + + return n; +} + +/* Perform machine dependent cif processing. */ + +#ifndef __ILP32__ +extern ffi_status +ffi_prep_cif_machdep_efi64(ffi_cif *cif); +#endif + +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep (ffi_cif *cif) +{ + int gprcount, ssecount, i, avn, ngpr, nsse; + unsigned flags; + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t bytes, n, rtype_size; + ffi_type *rtype; + +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + return ffi_prep_cif_machdep_efi64(cif); +#endif + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + gprcount = ssecount = 0; + + rtype = cif->rtype; + rtype_size = rtype->size; + switch (rtype->type) + { + case FFI_TYPE_VOID: + flags = UNIX64_RET_VOID; + break; + case FFI_TYPE_UINT8: + flags = UNIX64_RET_UINT8; + break; + case FFI_TYPE_SINT8: + flags = UNIX64_RET_SINT8; + break; + case FFI_TYPE_UINT16: + flags = UNIX64_RET_UINT16; + break; + case FFI_TYPE_SINT16: + flags = UNIX64_RET_SINT16; + break; + case FFI_TYPE_UINT32: + flags = UNIX64_RET_UINT32; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + flags = UNIX64_RET_SINT32; + break; + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags = UNIX64_RET_INT64; + break; + case FFI_TYPE_POINTER: + flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); + break; + case FFI_TYPE_FLOAT: + flags = UNIX64_RET_XMM32; + break; + case FFI_TYPE_DOUBLE: + flags = UNIX64_RET_XMM64; + break; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags = UNIX64_RET_X87; + break; +#endif + case FFI_TYPE_STRUCT: + n = examine_argument (cif->rtype, classes, 1, &ngpr, &nsse); + if (n == 0) + { + /* The return value is passed in memory. A pointer to that + memory is the first argument. Allocate a register for it. */ + gprcount++; + /* We don't have to do anything in asm for the return. */ + flags = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM; + } + else + { + _Bool sse0 = SSE_CLASS_P (classes[0]); + + if (rtype_size == 4 && sse0) + flags = UNIX64_RET_XMM32; + else if (rtype_size == 8) + flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64; + else + { + _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); + if (sse0 && sse1) + flags = UNIX64_RET_ST_XMM0_XMM1; + else if (sse0) + flags = UNIX64_RET_ST_XMM0_RAX; + else if (sse1) + flags = UNIX64_RET_ST_RAX_XMM0; + else + flags = UNIX64_RET_ST_RAX_RDX; + flags |= rtype_size << UNIX64_SIZE_SHIFT; + } + } + break; + case FFI_TYPE_COMPLEX: + switch (rtype->elements[0]->type) + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: + case FFI_TYPE_INT: + case FFI_TYPE_UINT32: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: + flags = UNIX64_RET_ST_RAX_RDX | ((unsigned) rtype_size << UNIX64_SIZE_SHIFT); + break; + case FFI_TYPE_FLOAT: + flags = UNIX64_RET_XMM64; + break; + case FFI_TYPE_DOUBLE: + flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT); + break; +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + case FFI_TYPE_LONGDOUBLE: + flags = UNIX64_RET_X87_2; + break; +#endif + default: + return FFI_BAD_TYPEDEF; + } + break; + default: + return FFI_BAD_TYPEDEF; + } + + /* Go over all arguments and determine the way they should be passed. + If it's in a register and there is space for it, let that be so. If + not, add it's size to the stack byte count. */ + for (bytes = 0, i = 0, avn = cif->nargs; i < avn; i++) + { + if (examine_argument (cif->arg_types[i], classes, 0, &ngpr, &nsse) == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = cif->arg_types[i]->alignment; + + if (align < 8) + align = 8; + + bytes = FFI_ALIGN (bytes, align); + bytes += cif->arg_types[i]->size; + } + else + { + gprcount += ngpr; + ssecount += nsse; + } + } + if (ssecount) + flags |= UNIX64_FLAG_XMM_ARGS; + + cif->flags = flags; + cif->bytes = (unsigned) FFI_ALIGN (bytes, 8); + + return FFI_OK; +} + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + enum x86_64_reg_class classes[MAX_CLASSES]; + char *stack, *argp; + ffi_type **arg_types; + int gprcount, ssecount, ngpr, nsse, i, avn, flags; + struct register_args *reg_args; + + /* Can't call 32-bit mode from 64-bit mode. */ + FFI_ASSERT (cif->abi == FFI_UNIX64); + + /* If the return value is a struct and we don't have a return value + address then we need to make one. Otherwise we can ignore it. */ + flags = cif->flags; + if (rvalue == NULL) + { + if (flags & UNIX64_FLAG_RET_IN_MEM) + rvalue = alloca (cif->rtype->size); + else + flags = UNIX64_RET_VOID; + } + + /* Allocate the space for the arguments, plus 4 words of temp space. */ + stack = alloca (sizeof (struct register_args) + cif->bytes + 4*8); + reg_args = (struct register_args *) stack; + argp = stack + sizeof (struct register_args); + + reg_args->r10 = (uintptr_t) closure; + + gprcount = ssecount = 0; + + /* If the return value is passed in memory, add the pointer as the + first integer argument. */ + if (flags & UNIX64_FLAG_RET_IN_MEM) + reg_args->gpr[gprcount++] = (unsigned long) rvalue; + + avn = cif->nargs; + arg_types = cif->arg_types; + + for (i = 0; i < avn; ++i) + { + size_t n, size = arg_types[i]->size; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) FFI_ALIGN (argp, align); + memcpy (argp, avalue[i], size); + argp += size; + } + else + { + /* The argument is passed entirely in registers. */ + char *a = (char *) avalue[i]; + unsigned int j; + + for (j = 0; j < n; j++, a += 8, size -= 8) + { + switch (classes[j]) + { + case X86_64_NO_CLASS: + case X86_64_SSEUP_CLASS: + break; + case X86_64_INTEGER_CLASS: + case X86_64_INTEGERSI_CLASS: + /* Sign-extend integer arguments passed in general + purpose registers, to cope with the fact that + LLVM incorrectly assumes that this will be done + (the x86-64 PS ABI does not specify this). */ + switch (arg_types[i]->type) + { + case FFI_TYPE_SINT8: + reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); + break; + case FFI_TYPE_SINT16: + reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); + break; + case FFI_TYPE_SINT32: + reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); + break; + default: + reg_args->gpr[gprcount] = 0; + memcpy (&reg_args->gpr[gprcount], a, size); + } + gprcount++; + break; + case X86_64_SSE_CLASS: + case X86_64_SSEDF_CLASS: + memcpy (&reg_args->sse[ssecount++].i64, a, sizeof(UINT64)); + break; + case X86_64_SSESF_CLASS: + memcpy (&reg_args->sse[ssecount++].i32, a, sizeof(UINT32)); + break; + default: + abort(); + } + } + } + } + reg_args->rax = ssecount; + + ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), + flags, rvalue, fn); +} + +#ifndef __ILP32__ +extern void +ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); +#endif + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + { + ffi_call_efi64(cif, fn, rvalue, avalue); + return; + } +#endif + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES + +#ifndef __ILP32__ +extern void +ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure); +#endif + +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + { + ffi_call_go_efi64(cif, fn, rvalue, avalue, closure); + return; + } +#endif + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + +#endif /* FFI_GO_CLOSURES */ + +extern void ffi_closure_unix64(void) FFI_HIDDEN; +extern void ffi_closure_unix64_sse(void) FFI_HIDDEN; + +#ifndef __ILP32__ +extern ffi_status +ffi_prep_closure_loc_efi64(ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc); +#endif + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + static const unsigned char trampoline[24] = { + /* endbr64 */ + 0xf3, 0x0f, 0x1e, 0xfa, + /* leaq -0xb(%rip),%r10 # 0x0 */ + 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff, + /* jmpq *0x7(%rip) # 0x18 */ + 0xff, 0x25, 0x07, 0x00, 0x00, 0x00, + /* nopl 0(%rax) */ + 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 + }; + void (*dest)(void); + char *tramp = closure->tramp; + +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc); +#endif + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + if (cif->flags & UNIX64_FLAG_XMM_ARGS) + dest = ffi_closure_unix64_sse; + else + dest = ffi_closure_unix64; + + memcpy (tramp, trampoline, sizeof(trampoline)); + *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)dest; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +int FFI_HIDDEN +ffi_closure_unix64_inner(ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *rvalue, + struct register_args *reg_args, + char *argp) +{ + void **avalue; + ffi_type **arg_types; + long i, avn; + int gprcount, ssecount, ngpr, nsse; + int flags; + + avn = cif->nargs; + flags = cif->flags; + avalue = alloca(avn * sizeof(void *)); + gprcount = ssecount = 0; + + if (flags & UNIX64_FLAG_RET_IN_MEM) + { + /* On return, %rax will contain the address that was passed + by the caller in %rdi. */ + void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++]; + *(void **)rvalue = r; + rvalue = r; + flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); + } + + arg_types = cif->arg_types; + for (i = 0; i < avn; ++i) + { + enum x86_64_reg_class classes[MAX_CLASSES]; + size_t n; + + n = examine_argument (arg_types[i], classes, 0, &ngpr, &nsse); + if (n == 0 + || gprcount + ngpr > MAX_GPR_REGS + || ssecount + nsse > MAX_SSE_REGS) + { + long align = arg_types[i]->alignment; + + /* Stack arguments are *always* at least 8 byte aligned. */ + if (align < 8) + align = 8; + + /* Pass this argument in memory. */ + argp = (void *) FFI_ALIGN (argp, align); + avalue[i] = argp; + argp += arg_types[i]->size; + } + /* If the argument is in a single register, or two consecutive + integer registers, then we can use that address directly. */ + else if (n == 1 + || (n == 2 && !(SSE_CLASS_P (classes[0]) + || SSE_CLASS_P (classes[1])))) + { + /* The argument is in a single register. */ + if (SSE_CLASS_P (classes[0])) + { + avalue[i] = &reg_args->sse[ssecount]; + ssecount += n; + } + else + { + avalue[i] = &reg_args->gpr[gprcount]; + gprcount += n; + } + } + /* Otherwise, allocate space to make them consecutive. */ + else + { + char *a = alloca (16); + unsigned int j; + + avalue[i] = a; + for (j = 0; j < n; j++, a += 8) + { + if (SSE_CLASS_P (classes[j])) + memcpy (a, &reg_args->sse[ssecount++], 8); + else + memcpy (a, &reg_args->gpr[gprcount++], 8); + } + } + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + + /* Tell assembly how to perform return type promotions. */ + return flags; +} + +#ifdef FFI_GO_CLOSURES + +extern void ffi_go_closure_unix64(void) FFI_HIDDEN; +extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN; + +#ifndef __ILP32__ +extern ffi_status +ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)); +#endif + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ +#ifndef __ILP32__ + if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) + return ffi_prep_go_closure_efi64(closure, cif, fun); +#endif + if (cif->abi != FFI_UNIX64) + return FFI_BAD_ABI; + + closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS + ? ffi_go_closure_unix64_sse + : ffi_go_closure_unix64); + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +#endif /* FFI_GO_CLOSURES */ + +#endif /* __x86_64__ */ + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/ffi_i386.c b/Stinger/libffi/darwin_ios/src/x86/ffi_i386.c new file mode 100644 index 0000000..af9c4c3 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/ffi_i386.c @@ -0,0 +1,775 @@ +#ifdef __i386__ + +/* ----------------------------------------------------------------------- + ffi.c - Copyright (c) 2017 Anthony Green + Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. + Copyright (c) 2002 Ranjit Mathew + Copyright (c) 2002 Bo Thorsen + Copyright (c) 2002 Roger Sayle + Copyright (C) 2008, 2010 Free Software Foundation, Inc. + + x86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined(__i386__) || defined(_M_IX86) +#include "ffi.h" +#include "ffi_common.h" +#include <stdint.h> +#include <stdlib.h> +#include "internal32.h" + +/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; + all further uses in this file will refer to the 80-bit type. */ +#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE +# if FFI_TYPE_LONGDOUBLE != 4 +# error FFI_TYPE_LONGDOUBLE out of date +# endif +#else +# undef FFI_TYPE_LONGDOUBLE +# define FFI_TYPE_LONGDOUBLE 4 +#endif + +#if defined(__GNUC__) && !defined(__declspec) +# define __declspec(x) __attribute__((x)) +#endif + +#if defined(_MSC_VER) && defined(_M_IX86) +/* Stack is not 16-byte aligned on Windows. */ +#define STACK_ALIGN(bytes) (bytes) +#else +#define STACK_ALIGN(bytes) FFI_ALIGN (bytes, 16) +#endif + +/* Perform machine dependent cif processing. */ +ffi_status FFI_HIDDEN +ffi_prep_cif_machdep(ffi_cif *cif) +{ + size_t bytes = 0; + int i, n, flags, cabi = cif->abi; + + switch (cabi) + { + case FFI_SYSV: + case FFI_STDCALL: + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_MS_CDECL: + case FFI_PASCAL: + case FFI_REGISTER: + break; + default: + return FFI_BAD_ABI; + } + + switch (cif->rtype->type) + { + case FFI_TYPE_VOID: + flags = X86_RET_VOID; + break; + case FFI_TYPE_FLOAT: + flags = X86_RET_FLOAT; + break; + case FFI_TYPE_DOUBLE: + flags = X86_RET_DOUBLE; + break; + case FFI_TYPE_LONGDOUBLE: + flags = X86_RET_LDOUBLE; + break; + case FFI_TYPE_UINT8: + flags = X86_RET_UINT8; + break; + case FFI_TYPE_UINT16: + flags = X86_RET_UINT16; + break; + case FFI_TYPE_SINT8: + flags = X86_RET_SINT8; + break; + case FFI_TYPE_SINT16: + flags = X86_RET_SINT16; + break; + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + flags = X86_RET_INT32; + break; + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + flags = X86_RET_INT64; + break; + case FFI_TYPE_STRUCT: +#ifndef X86 + /* ??? This should be a different ABI rather than an ifdef. */ + if (cif->rtype->size == 1) + flags = X86_RET_STRUCT_1B; + else if (cif->rtype->size == 2) + flags = X86_RET_STRUCT_2B; + else if (cif->rtype->size == 4) + flags = X86_RET_INT32; + else if (cif->rtype->size == 8) + flags = X86_RET_INT64; + else +#endif + { + do_struct: + switch (cabi) + { + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_STDCALL: + case FFI_MS_CDECL: + flags = X86_RET_STRUCTARG; + break; + default: + flags = X86_RET_STRUCTPOP; + break; + } + /* Allocate space for return value pointer. */ + bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG); + } + break; + case FFI_TYPE_COMPLEX: + switch (cif->rtype->elements[0]->type) + { + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_SINT64: + case FFI_TYPE_UINT64: + goto do_struct; + case FFI_TYPE_FLOAT: + case FFI_TYPE_INT: + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + flags = X86_RET_INT64; + break; + case FFI_TYPE_SINT16: + case FFI_TYPE_UINT16: + flags = X86_RET_INT32; + break; + case FFI_TYPE_SINT8: + case FFI_TYPE_UINT8: + flags = X86_RET_STRUCT_2B; + break; + default: + return FFI_BAD_TYPEDEF; + } + break; + default: + return FFI_BAD_TYPEDEF; + } + cif->flags = flags; + + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *t = cif->arg_types[i]; + + bytes = FFI_ALIGN (bytes, t->alignment); + bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG); + } + cif->bytes = bytes; + + return FFI_OK; +} + +static ffi_arg +extend_basic_type(void *arg, int type) +{ + switch (type) + { + case FFI_TYPE_SINT8: + return *(SINT8 *)arg; + case FFI_TYPE_UINT8: + return *(UINT8 *)arg; + case FFI_TYPE_SINT16: + return *(SINT16 *)arg; + case FFI_TYPE_UINT16: + return *(UINT16 *)arg; + + case FFI_TYPE_SINT32: + case FFI_TYPE_UINT32: + case FFI_TYPE_POINTER: + case FFI_TYPE_FLOAT: + return *(UINT32 *)arg; + + default: + abort(); + } +} + +struct call_frame +{ + void *ebp; /* 0 */ + void *retaddr; /* 4 */ + void (*fn)(void); /* 8 */ + int flags; /* 12 */ + void *rvalue; /* 16 */ + unsigned regs[3]; /* 20-28 */ +}; + +struct abi_params +{ + int dir; /* parameter growth direction */ + int static_chain; /* the static chain register used by gcc */ + int nregs; /* number of register parameters */ + int regs[3]; +}; + +static const struct abi_params abi_params[FFI_LAST_ABI] = { + [FFI_SYSV] = { 1, R_ECX, 0 }, + [FFI_THISCALL] = { 1, R_EAX, 1, { R_ECX } }, + [FFI_FASTCALL] = { 1, R_EAX, 2, { R_ECX, R_EDX } }, + [FFI_STDCALL] = { 1, R_ECX, 0 }, + [FFI_PASCAL] = { -1, R_ECX, 0 }, + /* ??? No defined static chain; gcc does not support REGISTER. */ + [FFI_REGISTER] = { -1, R_ECX, 3, { R_EAX, R_EDX, R_ECX } }, + [FFI_MS_CDECL] = { 1, R_ECX, 0 } +}; + +#ifdef HAVE_FASTCALL + #ifdef _MSC_VER + #define FFI_DECLARE_FASTCALL __fastcall + #else + #define FFI_DECLARE_FASTCALL __declspec(fastcall) + #endif +#else + #define FFI_DECLARE_FASTCALL +#endif + +extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN; + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + size_t rsize, bytes; + struct call_frame *frame; + char *stack, *argp; + ffi_type **arg_types; + int flags, cabi, i, n, dir, narg_reg; + const struct abi_params *pabi; + + flags = cif->flags; + cabi = cif->abi; + pabi = &abi_params[cabi]; + dir = pabi->dir; + + rsize = 0; + if (rvalue == NULL) + { + switch (flags) + { + case X86_RET_FLOAT: + case X86_RET_DOUBLE: + case X86_RET_LDOUBLE: + case X86_RET_STRUCTPOP: + case X86_RET_STRUCTARG: + /* The float cases need to pop the 387 stack. + The struct cases need to pass a valid pointer to the callee. */ + rsize = cif->rtype->size; + break; + default: + /* We can pretend that the callee returns nothing. */ + flags = X86_RET_VOID; + break; + } + } + + bytes = STACK_ALIGN (cif->bytes); + stack = alloca(bytes + sizeof(*frame) + rsize); + argp = (dir < 0 ? stack + bytes : stack); + frame = (struct call_frame *)(stack + bytes); + if (rsize) + rvalue = frame + 1; + + frame->fn = fn; + frame->flags = flags; + frame->rvalue = rvalue; + frame->regs[pabi->static_chain] = (unsigned)closure; + + narg_reg = 0; + switch (flags) + { + case X86_RET_STRUCTARG: + /* The pointer is passed as the first argument. */ + if (pabi->nregs > 0) + { + frame->regs[pabi->regs[0]] = (unsigned)rvalue; + narg_reg = 1; + break; + } + /* fallthru */ + case X86_RET_STRUCTPOP: + *(void **)argp = rvalue; + argp += sizeof(void *); + break; + } + + arg_types = cif->arg_types; + for (i = 0, n = cif->nargs; i < n; i++) + { + ffi_type *ty = arg_types[i]; + void *valp = avalue[i]; + size_t z = ty->size; + int t = ty->type; + + if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) + { + ffi_arg val = extend_basic_type (valp, t); + + if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) + frame->regs[pabi->regs[narg_reg++]] = val; + else if (dir < 0) + { + argp -= 4; + *(ffi_arg *)argp = val; + } + else + { + *(ffi_arg *)argp = val; + argp += 4; + } + } + else + { + size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); + size_t align = FFI_SIZEOF_ARG; + + /* Issue 434: For thiscall and fastcall, if the paramter passed + as 64-bit integer or struct, all following integer parameters + will be passed on stack. */ + if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) + && (t == FFI_TYPE_SINT64 + || t == FFI_TYPE_UINT64 + || t == FFI_TYPE_STRUCT)) + narg_reg = 2; + + /* Alignment rules for arguments are quite complex. Vectors and + structures with 16 byte alignment get it. Note that long double + on Darwin does have 16 byte alignment, and does not get this + alignment if passed directly; a structure with a long double + inside, however, would get 16 byte alignment. Since libffi does + not support vectors, we need non concern ourselves with other + cases. */ + if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) + align = 16; + + if (dir < 0) + { + /* ??? These reverse argument ABIs are probably too old + to have cared about alignment. Someone should check. */ + argp -= za; + memcpy (argp, valp, z); + } + else + { + argp = (char *)FFI_ALIGN (argp, align); + memcpy (argp, valp, z); + argp += za; + } + } + } + FFI_ASSERT (dir > 0 || argp == stack); + + ffi_call_i386 (frame, stack); +} + +void +ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +#ifdef FFI_GO_CLOSURES +void +ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} +#endif + +/** private members **/ + +void FFI_HIDDEN ffi_closure_i386(void); +void FFI_HIDDEN ffi_closure_STDCALL(void); +void FFI_HIDDEN ffi_closure_REGISTER(void); + +struct closure_frame +{ + unsigned rettemp[4]; /* 0 */ + unsigned regs[3]; /* 16-24 */ + ffi_cif *cif; /* 28 */ + void (*fun)(ffi_cif*,void*,void**,void*); /* 32 */ + void *user_data; /* 36 */ +}; + +int FFI_HIDDEN FFI_DECLARE_FASTCALL +ffi_closure_inner (struct closure_frame *frame, char *stack) +{ + ffi_cif *cif = frame->cif; + int cabi, i, n, flags, dir, narg_reg; + const struct abi_params *pabi; + ffi_type **arg_types; + char *argp; + void *rvalue; + void **avalue; + + cabi = cif->abi; + flags = cif->flags; + narg_reg = 0; + rvalue = frame->rettemp; + pabi = &abi_params[cabi]; + dir = pabi->dir; + argp = (dir < 0 ? stack + STACK_ALIGN (cif->bytes) : stack); + + switch (flags) + { + case X86_RET_STRUCTARG: + if (pabi->nregs > 0) + { + rvalue = (void *)frame->regs[pabi->regs[0]]; + narg_reg = 1; + frame->rettemp[0] = (unsigned)rvalue; + break; + } + /* fallthru */ + case X86_RET_STRUCTPOP: + rvalue = *(void **)argp; + argp += sizeof(void *); + frame->rettemp[0] = (unsigned)rvalue; + break; + } + + n = cif->nargs; + avalue = alloca(sizeof(void *) * n); + + arg_types = cif->arg_types; + for (i = 0; i < n; ++i) + { + ffi_type *ty = arg_types[i]; + size_t z = ty->size; + int t = ty->type; + void *valp; + + if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) + { + if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) + valp = &frame->regs[pabi->regs[narg_reg++]]; + else if (dir < 0) + { + argp -= 4; + valp = argp; + } + else + { + valp = argp; + argp += 4; + } + } + else + { + size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); + size_t align = FFI_SIZEOF_ARG; + + /* See the comment in ffi_call_int. */ + if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) + align = 16; + + /* Issue 434: For thiscall and fastcall, if the paramter passed + as 64-bit integer or struct, all following integer parameters + will be passed on stack. */ + if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) + && (t == FFI_TYPE_SINT64 + || t == FFI_TYPE_UINT64 + || t == FFI_TYPE_STRUCT)) + narg_reg = 2; + + if (dir < 0) + { + /* ??? These reverse argument ABIs are probably too old + to have cared about alignment. Someone should check. */ + argp -= za; + valp = argp; + } + else + { + argp = (char *)FFI_ALIGN (argp, align); + valp = argp; + argp += za; + } + } + + avalue[i] = valp; + } + + frame->fun (cif, rvalue, avalue, frame->user_data); + + if (cabi == FFI_STDCALL) + return flags + (cif->bytes << X86_RET_POP_SHIFT); + else + return flags; +} + +ffi_status +ffi_prep_closure_loc (ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*), + void *user_data, + void *codeloc) +{ + char *tramp = closure->tramp; + void (*dest)(void); + int op = 0xb8; /* movl imm, %eax */ + + switch (cif->abi) + { + case FFI_SYSV: + case FFI_THISCALL: + case FFI_FASTCALL: + case FFI_MS_CDECL: + dest = ffi_closure_i386; + break; + case FFI_STDCALL: + case FFI_PASCAL: + dest = ffi_closure_STDCALL; + break; + case FFI_REGISTER: + dest = ffi_closure_REGISTER; + op = 0x68; /* pushl imm */ + break; + default: + return FFI_BAD_ABI; + } + + /* endbr32. */ + *(UINT32 *) tramp = 0xfb1e0ff3; + + /* movl or pushl immediate. */ + tramp[4] = op; + *(void **)(tramp + 5) = codeloc; + + /* jmp dest */ + tramp[9] = 0xe9; + *(unsigned *)(tramp + 10) = (unsigned)dest - ((unsigned)codeloc + 14); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES + +void FFI_HIDDEN ffi_go_closure_EAX(void); +void FFI_HIDDEN ffi_go_closure_ECX(void); +void FFI_HIDDEN ffi_go_closure_STDCALL(void); + +ffi_status +ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*,void*,void**,void*)) +{ + void (*dest)(void); + + switch (cif->abi) + { + case FFI_SYSV: + case FFI_MS_CDECL: + dest = ffi_go_closure_ECX; + break; + case FFI_THISCALL: + case FFI_FASTCALL: + dest = ffi_go_closure_EAX; + break; + case FFI_STDCALL: + case FFI_PASCAL: + dest = ffi_go_closure_STDCALL; + break; + case FFI_REGISTER: + default: + return FFI_BAD_ABI; + } + + closure->tramp = dest; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} + +#endif /* FFI_GO_CLOSURES */ + +/* ------- Native raw API support -------------------------------- */ + +#if !FFI_NO_RAW_API + +void FFI_HIDDEN ffi_closure_raw_SYSV(void); +void FFI_HIDDEN ffi_closure_raw_THISCALL(void); + +ffi_status +ffi_prep_raw_closure_loc (ffi_raw_closure *closure, + ffi_cif *cif, + void (*fun)(ffi_cif*,void*,ffi_raw*,void*), + void *user_data, + void *codeloc) +{ + char *tramp = closure->tramp; + void (*dest)(void); + int i; + + /* We currently don't support certain kinds of arguments for raw + closures. This should be implemented by a separate assembly + language routine, since it would require argument processing, + something we don't do now for performance. */ + for (i = cif->nargs-1; i >= 0; i--) + switch (cif->arg_types[i]->type) + { + case FFI_TYPE_STRUCT: + case FFI_TYPE_LONGDOUBLE: + return FFI_BAD_TYPEDEF; + } + + switch (cif->abi) + { + case FFI_THISCALL: + dest = ffi_closure_raw_THISCALL; + break; + case FFI_SYSV: + dest = ffi_closure_raw_SYSV; + break; + default: + return FFI_BAD_ABI; + } + + /* movl imm, %eax. */ + tramp[0] = 0xb8; + *(void **)(tramp + 1) = codeloc; + + /* jmp dest */ + tramp[5] = 0xe9; + *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10); + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +void +ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue) +{ + size_t rsize, bytes; + struct call_frame *frame; + char *stack, *argp; + ffi_type **arg_types; + int flags, cabi, i, n, narg_reg; + const struct abi_params *pabi; + + flags = cif->flags; + cabi = cif->abi; + pabi = &abi_params[cabi]; + + rsize = 0; + if (rvalue == NULL) + { + switch (flags) + { + case X86_RET_FLOAT: + case X86_RET_DOUBLE: + case X86_RET_LDOUBLE: + case X86_RET_STRUCTPOP: + case X86_RET_STRUCTARG: + /* The float cases need to pop the 387 stack. + The struct cases need to pass a valid pointer to the callee. */ + rsize = cif->rtype->size; + break; + default: + /* We can pretend that the callee returns nothing. */ + flags = X86_RET_VOID; + break; + } + } + + bytes = STACK_ALIGN (cif->bytes); + argp = stack = + (void *)((uintptr_t)alloca(bytes + sizeof(*frame) + rsize + 15) & ~16); + frame = (struct call_frame *)(stack + bytes); + if (rsize) + rvalue = frame + 1; + + frame->fn = fn; + frame->flags = flags; + frame->rvalue = rvalue; + + narg_reg = 0; + switch (flags) + { + case X86_RET_STRUCTARG: + /* The pointer is passed as the first argument. */ + if (pabi->nregs > 0) + { + frame->regs[pabi->regs[0]] = (unsigned)rvalue; + narg_reg = 1; + break; + } + /* fallthru */ + case X86_RET_STRUCTPOP: + *(void **)argp = rvalue; + argp += sizeof(void *); + bytes -= sizeof(void *); + break; + } + + arg_types = cif->arg_types; + for (i = 0, n = cif->nargs; narg_reg < pabi->nregs && i < n; i++) + { + ffi_type *ty = arg_types[i]; + size_t z = ty->size; + int t = ty->type; + + if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT && t != FFI_TYPE_FLOAT) + { + ffi_arg val = extend_basic_type (avalue, t); + frame->regs[pabi->regs[narg_reg++]] = val; + z = FFI_SIZEOF_ARG; + } + else + { + memcpy (argp, avalue, z); + z = FFI_ALIGN (z, FFI_SIZEOF_ARG); + argp += z; + } + avalue += z; + bytes -= z; + } + if (i < n) + memcpy (argp, avalue, bytes); + + ffi_call_i386 (frame, stack); +} +#endif /* !FFI_NO_RAW_API */ +#endif /* __i386__ */ + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/ffiw64_x86_64.c b/Stinger/libffi/darwin_ios/src/x86/ffiw64_x86_64.c new file mode 100644 index 0000000..04c3d83 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/ffiw64_x86_64.c @@ -0,0 +1,323 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + ffiw64.c - Copyright (c) 2018 Anthony Green + Copyright (c) 2014 Red Hat, Inc. + + x86 win64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#if defined(__x86_64__) || defined(_M_AMD64) +#include "ffi.h" +#include "ffi_common.h" +#include <stdlib.h> +#include <stdint.h> + +#ifdef X86_WIN64 +#define EFI64(name) name +#else +#define EFI64(name) FFI_HIDDEN name##_efi64 +#endif + +struct win64_call_frame +{ + UINT64 rbp; /* 0 */ + UINT64 retaddr; /* 8 */ + UINT64 fn; /* 16 */ + UINT64 flags; /* 24 */ + UINT64 rvalue; /* 32 */ +}; + +extern void ffi_call_win64 (void *stack, struct win64_call_frame *, + void *closure) FFI_HIDDEN; + +ffi_status FFI_HIDDEN +EFI64(ffi_prep_cif_machdep)(ffi_cif *cif) +{ + int flags, n; + + switch (cif->abi) + { + case FFI_WIN64: + case FFI_GNUW64: + break; + default: + return FFI_BAD_ABI; + } + + flags = cif->rtype->type; + switch (flags) + { + default: + break; + case FFI_TYPE_LONGDOUBLE: + /* GCC returns long double values by reference, like a struct */ + if (cif->abi == FFI_GNUW64) + flags = FFI_TYPE_STRUCT; + break; + case FFI_TYPE_COMPLEX: + flags = FFI_TYPE_STRUCT; + /* FALLTHRU */ + case FFI_TYPE_STRUCT: + switch (cif->rtype->size) + { + case 8: + flags = FFI_TYPE_UINT64; + break; + case 4: + flags = FFI_TYPE_SMALL_STRUCT_4B; + break; + case 2: + flags = FFI_TYPE_SMALL_STRUCT_2B; + break; + case 1: + flags = FFI_TYPE_SMALL_STRUCT_1B; + break; + } + break; + } + cif->flags = flags; + + /* Each argument either fits in a register, an 8 byte slot, or is + passed by reference with the pointer in the 8 byte slot. */ + n = cif->nargs; + n += (flags == FFI_TYPE_STRUCT); + if (n < 4) + n = 4; + cif->bytes = n * 8; + + return FFI_OK; +} + +static void +ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + int i, j, n, flags; + UINT64 *stack; + size_t rsize; + struct win64_call_frame *frame; + + FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64); + + flags = cif->flags; + rsize = 0; + + /* If we have no return value for a structure, we need to create one. + Otherwise we can ignore the return type entirely. */ + if (rvalue == NULL) + { + if (flags == FFI_TYPE_STRUCT) + rsize = cif->rtype->size; + else + flags = FFI_TYPE_VOID; + } + + stack = alloca(cif->bytes + sizeof(struct win64_call_frame) + rsize); + frame = (struct win64_call_frame *)((char *)stack + cif->bytes); + if (rsize) + rvalue = frame + 1; + + frame->fn = (uintptr_t)fn; + frame->flags = flags; + frame->rvalue = (uintptr_t)rvalue; + + j = 0; + if (flags == FFI_TYPE_STRUCT) + { + stack[0] = (uintptr_t)rvalue; + j = 1; + } + + for (i = 0, n = cif->nargs; i < n; ++i, ++j) + { + switch (cif->arg_types[i]->size) + { + case 8: + stack[j] = *(UINT64 *)avalue[i]; + break; + case 4: + stack[j] = *(UINT32 *)avalue[i]; + break; + case 2: + stack[j] = *(UINT16 *)avalue[i]; + break; + case 1: + stack[j] = *(UINT8 *)avalue[i]; + break; + default: + stack[j] = (uintptr_t)avalue[i]; + break; + } + } + + ffi_call_win64 (stack, frame, closure); +} + +void +EFI64(ffi_call)(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) +{ + ffi_call_int (cif, fn, rvalue, avalue, NULL); +} + +void +EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue, + void **avalue, void *closure) +{ + ffi_call_int (cif, fn, rvalue, avalue, closure); +} + + +extern void ffi_closure_win64(void) FFI_HIDDEN; + +#ifdef FFI_GO_CLOSURES +extern void ffi_go_closure_win64(void) FFI_HIDDEN; +#endif + +ffi_status +EFI64(ffi_prep_closure_loc)(ffi_closure* closure, + ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + void *codeloc) +{ + static const unsigned char trampoline[FFI_TRAMPOLINE_SIZE - 8] = { + /* endbr64 */ + 0xf3, 0x0f, 0x1e, 0xfa, + /* leaq -0xb(%rip),%r10 # 0x0 */ + 0x4c, 0x8d, 0x15, 0xf5, 0xff, 0xff, 0xff, + /* jmpq *0x7(%rip) # 0x18 */ + 0xff, 0x25, 0x07, 0x00, 0x00, 0x00, + /* nopl 0(%rax) */ + 0x0f, 0x1f, 0x80, 0x00, 0x00, 0x00, 0x00 + }; + char *tramp = closure->tramp; + + switch (cif->abi) + { + case FFI_WIN64: + case FFI_GNUW64: + break; + default: + return FFI_BAD_ABI; + } + + memcpy (tramp, trampoline, sizeof(trampoline)); + *(UINT64 *)(tramp + sizeof (trampoline)) = (uintptr_t)ffi_closure_win64; + + closure->cif = cif; + closure->fun = fun; + closure->user_data = user_data; + + return FFI_OK; +} + +#ifdef FFI_GO_CLOSURES +ffi_status +EFI64(ffi_prep_go_closure)(ffi_go_closure* closure, ffi_cif* cif, + void (*fun)(ffi_cif*, void*, void**, void*)) +{ + switch (cif->abi) + { + case FFI_WIN64: + case FFI_GNUW64: + break; + default: + return FFI_BAD_ABI; + } + + closure->tramp = ffi_go_closure_win64; + closure->cif = cif; + closure->fun = fun; + + return FFI_OK; +} +#endif + +struct win64_closure_frame +{ + UINT64 rvalue[2]; + UINT64 fargs[4]; + UINT64 retaddr; + UINT64 args[]; +}; + +/* Force the inner function to use the MS ABI. When compiling on win64 + this is a nop. When compiling on unix, this simplifies the assembly, + and places the burden of saving the extra call-saved registers on + the compiler. */ +int FFI_HIDDEN __attribute__((ms_abi)) +ffi_closure_win64_inner(ffi_cif *cif, + void (*fun)(ffi_cif*, void*, void**, void*), + void *user_data, + struct win64_closure_frame *frame) +{ + void **avalue; + void *rvalue; + int i, n, nreg, flags; + + avalue = alloca(cif->nargs * sizeof(void *)); + rvalue = frame->rvalue; + nreg = 0; + + /* When returning a structure, the address is in the first argument. + We must also be prepared to return the same address in eax, so + install that address in the frame and pretend we return a pointer. */ + flags = cif->flags; + if (flags == FFI_TYPE_STRUCT) + { + rvalue = (void *)(uintptr_t)frame->args[0]; + frame->rvalue[0] = frame->args[0]; + nreg = 1; + } + + for (i = 0, n = cif->nargs; i < n; ++i, ++nreg) + { + size_t size = cif->arg_types[i]->size; + size_t type = cif->arg_types[i]->type; + void *a; + + if (type == FFI_TYPE_DOUBLE || type == FFI_TYPE_FLOAT) + { + if (nreg < 4) + a = &frame->fargs[nreg]; + else + a = &frame->args[nreg]; + } + else if (size == 1 || size == 2 || size == 4 || size == 8) + a = &frame->args[nreg]; + else + a = (void *)(uintptr_t)frame->args[nreg]; + + avalue[i] = a; + } + + /* Invoke the closure. */ + fun (cif, rvalue, avalue, user_data); + return flags; +} + +#endif /* __x86_64__ */ + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/internal32.h b/Stinger/libffi/darwin_ios/src/x86/internal32.h new file mode 100644 index 0000000..1e43002 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/internal32.h @@ -0,0 +1,34 @@ +#ifdef __i386__ + +#define X86_RET_FLOAT 0 +#define X86_RET_DOUBLE 1 +#define X86_RET_LDOUBLE 2 +#define X86_RET_SINT8 3 +#define X86_RET_SINT16 4 +#define X86_RET_UINT8 5 +#define X86_RET_UINT16 6 +#define X86_RET_INT64 7 +#define X86_RET_INT32 8 +#define X86_RET_VOID 9 +#define X86_RET_STRUCTPOP 10 +#define X86_RET_STRUCTARG 11 +#define X86_RET_STRUCT_1B 12 +#define X86_RET_STRUCT_2B 13 +#define X86_RET_UNUSED14 14 +#define X86_RET_UNUSED15 15 + +#define X86_RET_TYPE_MASK 15 +#define X86_RET_POP_SHIFT 4 + +#define R_EAX 0 +#define R_EDX 1 +#define R_ECX 2 + +#ifdef __PCC__ +# define HAVE_FASTCALL 0 +#else +# define HAVE_FASTCALL 1 +#endif + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/internal64.h b/Stinger/libffi/darwin_ios/src/x86/internal64.h new file mode 100644 index 0000000..9878984 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/internal64.h @@ -0,0 +1,27 @@ +#ifdef __x86_64__ + +#define UNIX64_RET_VOID 0 +#define UNIX64_RET_UINT8 1 +#define UNIX64_RET_UINT16 2 +#define UNIX64_RET_UINT32 3 +#define UNIX64_RET_SINT8 4 +#define UNIX64_RET_SINT16 5 +#define UNIX64_RET_SINT32 6 +#define UNIX64_RET_INT64 7 +#define UNIX64_RET_XMM32 8 +#define UNIX64_RET_XMM64 9 +#define UNIX64_RET_X87 10 +#define UNIX64_RET_X87_2 11 +#define UNIX64_RET_ST_XMM0_RAX 12 +#define UNIX64_RET_ST_RAX_XMM0 13 +#define UNIX64_RET_ST_XMM0_XMM1 14 +#define UNIX64_RET_ST_RAX_RDX 15 + +#define UNIX64_RET_LAST 15 + +#define UNIX64_FLAG_RET_IN_MEM (1 << 10) +#define UNIX64_FLAG_XMM_ARGS (1 << 11) +#define UNIX64_SIZE_SHIFT 12 + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/sysv_i386.S b/Stinger/libffi/darwin_ios/src/x86/sysv_i386.S new file mode 100644 index 0000000..e48e9e8 --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/sysv_i386.S @@ -0,0 +1,1143 @@ +#ifdef __i386__ + +/* ----------------------------------------------------------------------- + sysv.S - Copyright (c) 2017 Anthony Green + - Copyright (c) 2013 The Written Word, Inc. + - Copyright (c) 1996,1998,2001-2003,2005,2008,2010 Red Hat, Inc. + + X86 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __i386__ +#ifndef _MSC_VER + +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "internal32.h" + +#define C2(X, Y) X ## Y +#define C1(X, Y) C2(X, Y) +#ifdef __USER_LABEL_PREFIX__ +# define C(X) C1(__USER_LABEL_PREFIX__, X) +#else +# define C(X) X +#endif + +#ifdef X86_DARWIN +# define L(X) C1(L, X) +#else +# define L(X) C1(.L, X) +#endif + +#ifdef __ELF__ +# define ENDF(X) .type X,@function; .size X, . - X +#else +# define ENDF(X) +#endif + +/* Handle win32 fastcall name mangling. */ +#ifdef X86_WIN32 +# define ffi_call_i386 "@ffi_call_i386@8" +# define ffi_closure_inner "@ffi_closure_inner@8" +#else +# define ffi_call_i386 C(ffi_call_i386) +# define ffi_closure_inner C(ffi_closure_inner) +#endif + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) .balign 8 +#else +# define E(BASE, X) .balign 8; .org BASE + X * 8 +#endif + + .text + .balign 16 + .globl ffi_call_i386 + FFI_HIDDEN(ffi_call_i386) + +/* This is declared as + + void ffi_call_i386(struct call_frame *frame, char *argp) + __attribute__((fastcall)); + + Thus the arguments are present in + + ecx: frame + edx: argp +*/ + +ffi_call_i386: +L(UW0): + # cfi_startproc + _CET_ENDBR +#if !HAVE_FASTCALL + movl 4(%esp), %ecx + movl 8(%esp), %edx +#endif + movl (%esp), %eax /* move the return address */ + movl %ebp, (%ecx) /* store %ebp into local frame */ + movl %eax, 4(%ecx) /* store retaddr into local frame */ + + /* New stack frame based off ebp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-4, so from the + perspective of the unwind info, it hasn't moved. */ + movl %ecx, %ebp +L(UW1): + # cfi_def_cfa(%ebp, 8) + # cfi_rel_offset(%ebp, 0) + + movl %edx, %esp /* set outgoing argument stack */ + movl 20+R_EAX*4(%ebp), %eax /* set register arguments */ + movl 20+R_EDX*4(%ebp), %edx + movl 20+R_ECX*4(%ebp), %ecx + + call *8(%ebp) + + movl 12(%ebp), %ecx /* load return type code */ + movl %ebx, 8(%ebp) /* preserve %ebx */ +L(UW2): + # cfi_rel_offset(%ebx, 8) + + andl $X86_RET_TYPE_MASK, %ecx +#ifdef __PIC__ + call C(__x86.get_pc_thunk.bx) +L(pc1): + leal L(store_table)-L(pc1)(%ebx, %ecx, 8), %ebx +#else + leal L(store_table)(,%ecx, 8), %ebx +#endif + movl 16(%ebp), %ecx /* load result address */ + _CET_NOTRACK jmp *%ebx + + .balign 8 +L(store_table): +E(L(store_table), X86_RET_FLOAT) + fstps (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_DOUBLE) + fstpl (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_LDOUBLE) + fstpt (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_SINT8) + movsbl %al, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_SINT16) + movswl %ax, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_UINT8) + movzbl %al, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_UINT16) + movzwl %ax, %eax + mov %eax, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_INT64) + movl %edx, 4(%ecx) + /* fallthru */ +E(L(store_table), X86_RET_INT32) + movl %eax, (%ecx) + /* fallthru */ +E(L(store_table), X86_RET_VOID) +L(e1): + movl 8(%ebp), %ebx + movl %ebp, %esp + popl %ebp +L(UW3): + # cfi_remember_state + # cfi_def_cfa(%esp, 4) + # cfi_restore(%ebx) + # cfi_restore(%ebp) + ret +L(UW4): + # cfi_restore_state + +E(L(store_table), X86_RET_STRUCTPOP) + jmp L(e1) +E(L(store_table), X86_RET_STRUCTARG) + jmp L(e1) +E(L(store_table), X86_RET_STRUCT_1B) + movb %al, (%ecx) + jmp L(e1) +E(L(store_table), X86_RET_STRUCT_2B) + movw %ax, (%ecx) + jmp L(e1) + + /* Fill out the table so that bad values are predictable. */ +E(L(store_table), X86_RET_UNUSED14) + ud2 +E(L(store_table), X86_RET_UNUSED15) + ud2 + +L(UW5): + # cfi_endproc +ENDF(ffi_call_i386) + +/* The inner helper is declared as + + void ffi_closure_inner(struct closure_frame *frame, char *argp) + __attribute_((fastcall)) + + Thus the arguments are placed in + + ecx: frame + edx: argp +*/ + +/* Macros to help setting up the closure_data structure. */ + +#if HAVE_FASTCALL +# define closure_FS (40 + 4) +# define closure_CF 0 +#else +# define closure_FS (8 + 40 + 12) +# define closure_CF 8 +#endif + +#define FFI_CLOSURE_SAVE_REGS \ + movl %eax, closure_CF+16+R_EAX*4(%esp); \ + movl %edx, closure_CF+16+R_EDX*4(%esp); \ + movl %ecx, closure_CF+16+R_ECX*4(%esp) + +#define FFI_CLOSURE_COPY_TRAMP_DATA \ + movl FFI_TRAMPOLINE_SIZE(%eax), %edx; /* copy cif */ \ + movl FFI_TRAMPOLINE_SIZE+4(%eax), %ecx; /* copy fun */ \ + movl FFI_TRAMPOLINE_SIZE+8(%eax), %eax; /* copy user_data */ \ + movl %edx, closure_CF+28(%esp); \ + movl %ecx, closure_CF+32(%esp); \ + movl %eax, closure_CF+36(%esp) + +#if HAVE_FASTCALL +# define FFI_CLOSURE_PREP_CALL \ + movl %esp, %ecx; /* load closure_data */ \ + leal closure_FS+4(%esp), %edx; /* load incoming stack */ +#else +# define FFI_CLOSURE_PREP_CALL \ + leal closure_CF(%esp), %ecx; /* load closure_data */ \ + leal closure_FS+4(%esp), %edx; /* load incoming stack */ \ + movl %ecx, (%esp); \ + movl %edx, 4(%esp) +#endif + +#define FFI_CLOSURE_CALL_INNER(UWN) \ + call ffi_closure_inner + +#define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ + andl $X86_RET_TYPE_MASK, %eax; \ + leal L(C1(load_table,N))(, %eax, 8), %edx; \ + movl closure_CF(%esp), %eax; /* optimiztic load */ \ + _CET_NOTRACK jmp *%edx + +#ifdef __PIC__ +# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE +# undef FFI_CLOSURE_MASK_AND_JUMP +# define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ + andl $X86_RET_TYPE_MASK, %eax; \ + call C(__x86.get_pc_thunk.dx); \ +L(C1(pc,N)): \ + leal L(C1(load_table,N))-L(C1(pc,N))(%edx, %eax, 8), %edx; \ + movl closure_CF(%esp), %eax; /* optimiztic load */ \ + _CET_NOTRACK jmp *%edx +# else +# define FFI_CLOSURE_CALL_INNER_SAVE_EBX +# undef FFI_CLOSURE_CALL_INNER +# define FFI_CLOSURE_CALL_INNER(UWN) \ + movl %ebx, 40(%esp); /* save ebx */ \ +L(C1(UW,UWN)): \ + /* cfi_rel_offset(%ebx, 40); */ \ + call C(__x86.get_pc_thunk.bx); /* load got register */ \ + addl $C(_GLOBAL_OFFSET_TABLE_), %ebx; \ + call ffi_closure_inner@PLT +# undef FFI_CLOSURE_MASK_AND_JUMP +# define FFI_CLOSURE_MASK_AND_JUMP(N, UWN) \ + andl $X86_RET_TYPE_MASK, %eax; \ + leal L(C1(load_table,N))@GOTOFF(%ebx, %eax, 8), %edx; \ + movl 40(%esp), %ebx; /* restore ebx */ \ +L(C1(UW,UWN)): \ + /* cfi_restore(%ebx); */ \ + movl closure_CF(%esp), %eax; /* optimiztic load */ \ + _CET_NOTRACK jmp *%edx +# endif /* DARWIN || HIDDEN */ +#endif /* __PIC__ */ + + .balign 16 + .globl C(ffi_go_closure_EAX) + FFI_HIDDEN(C(ffi_go_closure_EAX)) +C(ffi_go_closure_EAX): +L(UW6): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW7): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl 4(%eax), %edx /* copy cif */ + movl 8(%eax), %ecx /* copy fun */ + movl %edx, closure_CF+28(%esp) + movl %ecx, closure_CF+32(%esp) + movl %eax, closure_CF+36(%esp) /* closure is user_data */ + jmp L(do_closure_i386) +L(UW8): + # cfi_endproc +ENDF(C(ffi_go_closure_EAX)) + + .balign 16 + .globl C(ffi_go_closure_ECX) + FFI_HIDDEN(C(ffi_go_closure_ECX)) +C(ffi_go_closure_ECX): +L(UW9): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW10): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl 4(%ecx), %edx /* copy cif */ + movl 8(%ecx), %eax /* copy fun */ + movl %edx, closure_CF+28(%esp) + movl %eax, closure_CF+32(%esp) + movl %ecx, closure_CF+36(%esp) /* closure is user_data */ + jmp L(do_closure_i386) +L(UW11): + # cfi_endproc +ENDF(C(ffi_go_closure_ECX)) + +/* The closure entry points are reached from the ffi_closure trampoline. + On entry, %eax contains the address of the ffi_closure. */ + + .balign 16 + .globl C(ffi_closure_i386) + FFI_HIDDEN(C(ffi_closure_i386)) + +C(ffi_closure_i386): +L(UW12): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW13): + # cfi_def_cfa_offset(closure_FS + 4) + + FFI_CLOSURE_SAVE_REGS + FFI_CLOSURE_COPY_TRAMP_DATA + + /* Entry point from preceeding Go closures. */ +L(do_closure_i386): + + FFI_CLOSURE_PREP_CALL + FFI_CLOSURE_CALL_INNER(14) + FFI_CLOSURE_MASK_AND_JUMP(2, 15) + + .balign 8 +L(load_table2): +E(L(load_table2), X86_RET_FLOAT) + flds closure_CF(%esp) + jmp L(e2) +E(L(load_table2), X86_RET_DOUBLE) + fldl closure_CF(%esp) + jmp L(e2) +E(L(load_table2), X86_RET_LDOUBLE) + fldt closure_CF(%esp) + jmp L(e2) +E(L(load_table2), X86_RET_SINT8) + movsbl %al, %eax + jmp L(e2) +E(L(load_table2), X86_RET_SINT16) + movswl %ax, %eax + jmp L(e2) +E(L(load_table2), X86_RET_UINT8) + movzbl %al, %eax + jmp L(e2) +E(L(load_table2), X86_RET_UINT16) + movzwl %ax, %eax + jmp L(e2) +E(L(load_table2), X86_RET_INT64) + movl closure_CF+4(%esp), %edx + jmp L(e2) +E(L(load_table2), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table2), X86_RET_VOID) +L(e2): + addl $closure_FS, %esp +L(UW16): + # cfi_adjust_cfa_offset(-closure_FS) + ret +L(UW17): + # cfi_adjust_cfa_offset(closure_FS) +E(L(load_table2), X86_RET_STRUCTPOP) + addl $closure_FS, %esp +L(UW18): + # cfi_adjust_cfa_offset(-closure_FS) + ret $4 +L(UW19): + # cfi_adjust_cfa_offset(closure_FS) +E(L(load_table2), X86_RET_STRUCTARG) + jmp L(e2) +E(L(load_table2), X86_RET_STRUCT_1B) + movzbl %al, %eax + jmp L(e2) +E(L(load_table2), X86_RET_STRUCT_2B) + movzwl %ax, %eax + jmp L(e2) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table2), X86_RET_UNUSED14) + ud2 +E(L(load_table2), X86_RET_UNUSED15) + ud2 + +L(UW20): + # cfi_endproc +ENDF(C(ffi_closure_i386)) + + .balign 16 + .globl C(ffi_go_closure_STDCALL) + FFI_HIDDEN(C(ffi_go_closure_STDCALL)) +C(ffi_go_closure_STDCALL): +L(UW21): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW22): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl 4(%ecx), %edx /* copy cif */ + movl 8(%ecx), %eax /* copy fun */ + movl %edx, closure_CF+28(%esp) + movl %eax, closure_CF+32(%esp) + movl %ecx, closure_CF+36(%esp) /* closure is user_data */ + jmp L(do_closure_STDCALL) +L(UW23): + # cfi_endproc +ENDF(C(ffi_go_closure_STDCALL)) + +/* For REGISTER, we have no available parameter registers, and so we + enter here having pushed the closure onto the stack. */ + + .balign 16 + .globl C(ffi_closure_REGISTER) + FFI_HIDDEN(C(ffi_closure_REGISTER)) +C(ffi_closure_REGISTER): +L(UW24): + # cfi_startproc + # cfi_def_cfa(%esp, 8) + # cfi_offset(%eip, -8) + _CET_ENDBR + subl $closure_FS-4, %esp +L(UW25): + # cfi_def_cfa_offset(closure_FS + 4) + FFI_CLOSURE_SAVE_REGS + movl closure_FS-4(%esp), %ecx /* load retaddr */ + movl closure_FS(%esp), %eax /* load closure */ + movl %ecx, closure_FS(%esp) /* move retaddr */ + jmp L(do_closure_REGISTER) +L(UW26): + # cfi_endproc +ENDF(C(ffi_closure_REGISTER)) + +/* For STDCALL (and others), we need to pop N bytes of arguments off + the stack following the closure. The amount needing to be popped + is returned to us from ffi_closure_inner. */ + + .balign 16 + .globl C(ffi_closure_STDCALL) + FFI_HIDDEN(C(ffi_closure_STDCALL)) +C(ffi_closure_STDCALL): +L(UW27): + # cfi_startproc + _CET_ENDBR + subl $closure_FS, %esp +L(UW28): + # cfi_def_cfa_offset(closure_FS + 4) + + FFI_CLOSURE_SAVE_REGS + + /* Entry point from ffi_closure_REGISTER. */ +L(do_closure_REGISTER): + + FFI_CLOSURE_COPY_TRAMP_DATA + + /* Entry point from preceeding Go closure. */ +L(do_closure_STDCALL): + + FFI_CLOSURE_PREP_CALL + FFI_CLOSURE_CALL_INNER(29) + + movl %eax, %ecx + shrl $X86_RET_POP_SHIFT, %ecx /* isolate pop count */ + leal closure_FS(%esp, %ecx), %ecx /* compute popped esp */ + movl closure_FS(%esp), %edx /* move return address */ + movl %edx, (%ecx) + + /* From this point on, the value of %esp upon return is %ecx+4, + and we've copied the return address to %ecx to make return easy. + There's no point in representing this in the unwind info, as + there is always a window between the mov and the ret which + will be wrong from one point of view or another. */ + + FFI_CLOSURE_MASK_AND_JUMP(3, 30) + + .balign 8 +L(load_table3): +E(L(load_table3), X86_RET_FLOAT) + flds closure_CF(%esp) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_DOUBLE) + fldl closure_CF(%esp) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_LDOUBLE) + fldt closure_CF(%esp) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_SINT8) + movsbl %al, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_SINT16) + movswl %ax, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_UINT8) + movzbl %al, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_UINT16) + movzwl %ax, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_INT64) + movl closure_CF+4(%esp), %edx + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_INT32) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_VOID) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCTPOP) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCTARG) + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCT_1B) + movzbl %al, %eax + movl %ecx, %esp + ret +E(L(load_table3), X86_RET_STRUCT_2B) + movzwl %ax, %eax + movl %ecx, %esp + ret + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table3), X86_RET_UNUSED14) + ud2 +E(L(load_table3), X86_RET_UNUSED15) + ud2 + +L(UW31): + # cfi_endproc +ENDF(C(ffi_closure_STDCALL)) + +#if !FFI_NO_RAW_API + +#define raw_closure_S_FS (16+16+12) + + .balign 16 + .globl C(ffi_closure_raw_SYSV) + FFI_HIDDEN(C(ffi_closure_raw_SYSV)) +C(ffi_closure_raw_SYSV): +L(UW32): + # cfi_startproc + _CET_ENDBR + subl $raw_closure_S_FS, %esp +L(UW33): + # cfi_def_cfa_offset(raw_closure_S_FS + 4) + movl %ebx, raw_closure_S_FS-4(%esp) +L(UW34): + # cfi_rel_offset(%ebx, raw_closure_S_FS-4) + + movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ + movl %edx, 12(%esp) + leal raw_closure_S_FS+4(%esp), %edx /* load raw_args */ + movl %edx, 8(%esp) + leal 16(%esp), %edx /* load &res */ + movl %edx, 4(%esp) + movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ + movl %ebx, (%esp) + call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ + + movl 20(%ebx), %eax /* load cif->flags */ + andl $X86_RET_TYPE_MASK, %eax +#ifdef __PIC__ + call C(__x86.get_pc_thunk.bx) +L(pc4): + leal L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx +#else + leal L(load_table4)(,%eax, 8), %ecx +#endif + movl raw_closure_S_FS-4(%esp), %ebx +L(UW35): + # cfi_restore(%ebx) + movl 16(%esp), %eax /* Optimistic load */ + jmp *%ecx + + .balign 8 +L(load_table4): +E(L(load_table4), X86_RET_FLOAT) + flds 16(%esp) + jmp L(e4) +E(L(load_table4), X86_RET_DOUBLE) + fldl 16(%esp) + jmp L(e4) +E(L(load_table4), X86_RET_LDOUBLE) + fldt 16(%esp) + jmp L(e4) +E(L(load_table4), X86_RET_SINT8) + movsbl %al, %eax + jmp L(e4) +E(L(load_table4), X86_RET_SINT16) + movswl %ax, %eax + jmp L(e4) +E(L(load_table4), X86_RET_UINT8) + movzbl %al, %eax + jmp L(e4) +E(L(load_table4), X86_RET_UINT16) + movzwl %ax, %eax + jmp L(e4) +E(L(load_table4), X86_RET_INT64) + movl 16+4(%esp), %edx + jmp L(e4) +E(L(load_table4), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table4), X86_RET_VOID) +L(e4): + addl $raw_closure_S_FS, %esp +L(UW36): + # cfi_adjust_cfa_offset(-raw_closure_S_FS) + ret +L(UW37): + # cfi_adjust_cfa_offset(raw_closure_S_FS) +E(L(load_table4), X86_RET_STRUCTPOP) + addl $raw_closure_S_FS, %esp +L(UW38): + # cfi_adjust_cfa_offset(-raw_closure_S_FS) + ret $4 +L(UW39): + # cfi_adjust_cfa_offset(raw_closure_S_FS) +E(L(load_table4), X86_RET_STRUCTARG) + jmp L(e4) +E(L(load_table4), X86_RET_STRUCT_1B) + movzbl %al, %eax + jmp L(e4) +E(L(load_table4), X86_RET_STRUCT_2B) + movzwl %ax, %eax + jmp L(e4) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table4), X86_RET_UNUSED14) + ud2 +E(L(load_table4), X86_RET_UNUSED15) + ud2 + +L(UW40): + # cfi_endproc +ENDF(C(ffi_closure_raw_SYSV)) + +#define raw_closure_T_FS (16+16+8) + + .balign 16 + .globl C(ffi_closure_raw_THISCALL) + FFI_HIDDEN(C(ffi_closure_raw_THISCALL)) +C(ffi_closure_raw_THISCALL): +L(UW41): + # cfi_startproc + _CET_ENDBR + /* Rearrange the stack such that %ecx is the first argument. + This means moving the return address. */ + popl %edx +L(UW42): + # cfi_def_cfa_offset(0) + # cfi_register(%eip, %edx) + pushl %ecx +L(UW43): + # cfi_adjust_cfa_offset(4) + pushl %edx +L(UW44): + # cfi_adjust_cfa_offset(4) + # cfi_rel_offset(%eip, 0) + subl $raw_closure_T_FS, %esp +L(UW45): + # cfi_adjust_cfa_offset(raw_closure_T_FS) + movl %ebx, raw_closure_T_FS-4(%esp) +L(UW46): + # cfi_rel_offset(%ebx, raw_closure_T_FS-4) + + movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ + movl %edx, 12(%esp) + leal raw_closure_T_FS+4(%esp), %edx /* load raw_args */ + movl %edx, 8(%esp) + leal 16(%esp), %edx /* load &res */ + movl %edx, 4(%esp) + movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ + movl %ebx, (%esp) + call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ + + movl 20(%ebx), %eax /* load cif->flags */ + andl $X86_RET_TYPE_MASK, %eax +#ifdef __PIC__ + call C(__x86.get_pc_thunk.bx) +L(pc5): + leal L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx +#else + leal L(load_table5)(,%eax, 8), %ecx +#endif + movl raw_closure_T_FS-4(%esp), %ebx +L(UW47): + # cfi_restore(%ebx) + movl 16(%esp), %eax /* Optimistic load */ + jmp *%ecx + + .balign 8 +L(load_table5): +E(L(load_table5), X86_RET_FLOAT) + flds 16(%esp) + jmp L(e5) +E(L(load_table5), X86_RET_DOUBLE) + fldl 16(%esp) + jmp L(e5) +E(L(load_table5), X86_RET_LDOUBLE) + fldt 16(%esp) + jmp L(e5) +E(L(load_table5), X86_RET_SINT8) + movsbl %al, %eax + jmp L(e5) +E(L(load_table5), X86_RET_SINT16) + movswl %ax, %eax + jmp L(e5) +E(L(load_table5), X86_RET_UINT8) + movzbl %al, %eax + jmp L(e5) +E(L(load_table5), X86_RET_UINT16) + movzwl %ax, %eax + jmp L(e5) +E(L(load_table5), X86_RET_INT64) + movl 16+4(%esp), %edx + jmp L(e5) +E(L(load_table5), X86_RET_INT32) + nop + /* fallthru */ +E(L(load_table5), X86_RET_VOID) +L(e5): + addl $raw_closure_T_FS, %esp +L(UW48): + # cfi_adjust_cfa_offset(-raw_closure_T_FS) + /* Remove the extra %ecx argument we pushed. */ + ret $4 +L(UW49): + # cfi_adjust_cfa_offset(raw_closure_T_FS) +E(L(load_table5), X86_RET_STRUCTPOP) + addl $raw_closure_T_FS, %esp +L(UW50): + # cfi_adjust_cfa_offset(-raw_closure_T_FS) + ret $8 +L(UW51): + # cfi_adjust_cfa_offset(raw_closure_T_FS) +E(L(load_table5), X86_RET_STRUCTARG) + jmp L(e5) +E(L(load_table5), X86_RET_STRUCT_1B) + movzbl %al, %eax + jmp L(e5) +E(L(load_table5), X86_RET_STRUCT_2B) + movzwl %ax, %eax + jmp L(e5) + + /* Fill out the table so that bad values are predictable. */ +E(L(load_table5), X86_RET_UNUSED14) + ud2 +E(L(load_table5), X86_RET_UNUSED15) + ud2 + +L(UW52): + # cfi_endproc +ENDF(C(ffi_closure_raw_THISCALL)) + +#endif /* !FFI_NO_RAW_API */ + +#ifdef X86_DARWIN +# define COMDAT(X) \ + .section __TEXT,__text,coalesced,pure_instructions; \ + .weak_definition X; \ + FFI_HIDDEN(X) +#elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__)) +# define COMDAT(X) \ + .section .text.X,"axG",@progbits,X,comdat; \ + .globl X; \ + FFI_HIDDEN(X) +#else +# define COMDAT(X) +#endif + +#if defined(__PIC__) + COMDAT(C(__x86.get_pc_thunk.bx)) +C(__x86.get_pc_thunk.bx): + movl (%esp), %ebx + ret +ENDF(C(__x86.get_pc_thunk.bx)) +# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE + COMDAT(C(__x86.get_pc_thunk.dx)) +C(__x86.get_pc_thunk.dx): + movl (%esp), %edx + ret +ENDF(C(__x86.get_pc_thunk.dx)) +#endif /* DARWIN || HIDDEN */ +#endif /* __PIC__ */ + +/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ + +#ifdef __APPLE__ +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EHFrame0: +#elif defined(X86_WIN32) +.section .eh_frame,"r" +#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) +.section .eh_frame,EH_FRAME_FLAGS,@unwind +#else +.section .eh_frame,EH_FRAME_FLAGS,@progbits +#endif + +#ifdef HAVE_AS_X86_PCREL +# define PCREL(X) X - . +#else +# define PCREL(X) X@rel +#endif + +/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ +#define ADV(N, P) .byte 2, L(N)-L(P) + + .balign 4 +L(CIE): + .set L(set0),L(ECIE)-L(SCIE) + .long L(set0) /* CIE Length */ +L(SCIE): + .long 0 /* CIE Identifier Tag */ + .byte 1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 1 /* CIE Code Alignment Factor */ + .byte 0x7c /* CIE Data Alignment Factor */ + .byte 0x8 /* CIE RA Column */ + .byte 1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ + .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */ + .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */ + .balign 4 +L(ECIE): + + .set L(set1),L(EFDE1)-L(SFDE1) + .long L(set1) /* FDE Length */ +L(SFDE1): + .long L(SFDE1)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW0)) /* Initial location */ + .long L(UW5)-L(UW0) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW1, UW0) + .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */ + .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */ + ADV(UW2, UW1) + .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */ + ADV(UW3, UW2) + .byte 0xa /* DW_CFA_remember_state */ + .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */ + .byte 0xc0+3 /* DW_CFA_restore, %ebx */ + .byte 0xc0+5 /* DW_CFA_restore, %ebp */ + ADV(UW4, UW3) + .byte 0xb /* DW_CFA_restore_state */ + .balign 4 +L(EFDE1): + + .set L(set2),L(EFDE2)-L(SFDE2) + .long L(set2) /* FDE Length */ +L(SFDE2): + .long L(SFDE2)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW6)) /* Initial location */ + .long L(UW8)-L(UW6) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW7, UW6) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE2): + + .set L(set3),L(EFDE3)-L(SFDE3) + .long L(set3) /* FDE Length */ +L(SFDE3): + .long L(SFDE3)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW9)) /* Initial location */ + .long L(UW11)-L(UW9) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW10, UW9) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE3): + + .set L(set4),L(EFDE4)-L(SFDE4) + .long L(set4) /* FDE Length */ +L(SFDE4): + .long L(SFDE4)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW12)) /* Initial location */ + .long L(UW20)-L(UW12) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW13, UW12) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ +#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX + ADV(UW14, UW13) + .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ + ADV(UW15, UW14) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW16, UW15) +#else + ADV(UW16, UW13) +#endif + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW17, UW16) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW18, UW17) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW19, UW18) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE4): + + .set L(set5),L(EFDE5)-L(SFDE5) + .long L(set5) /* FDE Length */ +L(SFDE5): + .long L(SFDE5)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW21)) /* Initial location */ + .long L(UW23)-L(UW21) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW22, UW21) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE5): + + .set L(set6),L(EFDE6)-L(SFDE6) + .long L(set6) /* FDE Length */ +L(SFDE6): + .long L(SFDE6)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW24)) /* Initial location */ + .long L(UW26)-L(UW24) /* Address range */ + .byte 0 /* Augmentation size */ + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */ + ADV(UW25, UW24) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE6): + + .set L(set7),L(EFDE7)-L(SFDE7) + .long L(set7) /* FDE Length */ +L(SFDE7): + .long L(SFDE7)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW27)) /* Initial location */ + .long L(UW31)-L(UW27) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW28, UW27) + .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ +#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX + ADV(UW29, UW28) + .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ + ADV(UW30, UW29) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ +#endif + .balign 4 +L(EFDE7): + +#if !FFI_NO_RAW_API + .set L(set8),L(EFDE8)-L(SFDE8) + .long L(set8) /* FDE Length */ +L(SFDE8): + .long L(SFDE8)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW32)) /* Initial location */ + .long L(UW40)-L(UW32) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW33, UW32) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW34, UW33) + .byte 0x80+3, 2 /* DW_CFA_offset %ebx 2*-4 */ + ADV(UW35, UW34) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW36, UW35) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW37, UW36) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + ADV(UW38, UW37) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW39, UW38) + .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE8): + + .set L(set9),L(EFDE9)-L(SFDE9) + .long L(set9) /* FDE Length */ +L(SFDE9): + .long L(SFDE9)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW41)) /* Initial location */ + .long L(UW52)-L(UW41) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW42, UW41) + .byte 0xe, 0 /* DW_CFA_def_cfa_offset */ + .byte 0x9, 8, 2 /* DW_CFA_register %eip, %edx */ + ADV(UW43, UW42) + .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ + ADV(UW44, UW43) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + .byte 0x80+8, 2 /* DW_CFA_offset %eip 2*-4 */ + ADV(UW45, UW44) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + ADV(UW46, UW45) + .byte 0x80+3, 3 /* DW_CFA_offset %ebx 3*-4 */ + ADV(UW47, UW46) + .byte 0xc0+3 /* DW_CFA_restore %ebx */ + ADV(UW48, UW47) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + ADV(UW49, UW48) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + ADV(UW50, UW49) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ + ADV(UW51, UW50) + .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ + .balign 4 +L(EFDE9): +#endif /* !FFI_NO_RAW_API */ + +#ifdef _WIN32 + .def @feat.00; + .scl 3; + .type 0; + .endef + .globl @feat.00 +@feat.00 = 1 +#endif + +#ifdef __APPLE__ + .subsections_via_symbols + .section __LD,__compact_unwind,regular,debug + + /* compact unwind for ffi_call_i386 */ + .long C(ffi_call_i386) + .set L1,L(UW5)-L(UW0) + .long L1 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_go_closure_EAX */ + .long C(ffi_go_closure_EAX) + .set L2,L(UW8)-L(UW6) + .long L2 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_go_closure_ECX */ + .long C(ffi_go_closure_ECX) + .set L3,L(UW11)-L(UW9) + .long L3 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_i386 */ + .long C(ffi_closure_i386) + .set L4,L(UW20)-L(UW12) + .long L4 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_go_closure_STDCALL */ + .long C(ffi_go_closure_STDCALL) + .set L5,L(UW23)-L(UW21) + .long L5 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_REGISTER */ + .long C(ffi_closure_REGISTER) + .set L6,L(UW26)-L(UW24) + .long L6 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_STDCALL */ + .long C(ffi_closure_STDCALL) + .set L7,L(UW31)-L(UW27) + .long L7 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_raw_SYSV */ + .long C(ffi_closure_raw_SYSV) + .set L8,L(UW40)-L(UW32) + .long L8 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 + + /* compact unwind for ffi_closure_raw_THISCALL */ + .long C(ffi_closure_raw_THISCALL) + .set L9,L(UW52)-L(UW41) + .long L9 + .long 0x04000000 /* use dwarf unwind info */ + .long 0 + .long 0 +#endif /* __APPLE__ */ + +#endif /* ifndef _MSC_VER */ +#endif /* ifdef __i386__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + +#endif diff --git a/Stinger/libffi/darwin_ios/src/x86/unix64_x86_64.S b/Stinger/libffi/darwin_ios/src/x86/unix64_x86_64.S new file mode 100644 index 0000000..479bb4e --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/unix64_x86_64.S @@ -0,0 +1,626 @@ +#ifdef __x86_64__ + +/* ----------------------------------------------------------------------- + unix64.S - Copyright (c) 2013 The Written Word, Inc. + - Copyright (c) 2008 Red Hat, Inc + - Copyright (c) 2002 Bo Thorsen <bo@suse.de> + + x86-64 Foreign Function Interface + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include "internal64.h" +#include "asmnames.h" + + .text + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) .balign 8 +#else +# ifdef __CET__ +# define E(BASE, X) .balign 8; .org BASE + X * 16 +# else +# define E(BASE, X) .balign 8; .org BASE + X * 8 +# endif +#endif + +/* ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, + void *raddr, void (*fnaddr)(void)); + + Bit o trickiness here -- ARGS+BYTES is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .balign 8 + .globl C(ffi_call_unix64) + FFI_HIDDEN(C(ffi_call_unix64)) + +C(ffi_call_unix64): +L(UW0): + _CET_ENDBR + movq (%rsp), %r10 /* Load return address. */ + leaq (%rdi, %rsi), %rax /* Find local stack base. */ + movq %rdx, (%rax) /* Save flags. */ + movq %rcx, 8(%rax) /* Save raddr. */ + movq %rbp, 16(%rax) /* Save old frame pointer. */ + movq %r10, 24(%rax) /* Relocate return address. */ + movq %rax, %rbp /* Finalize local stack frame. */ + + /* New stack frame based off rbp. This is a itty bit of unwind + trickery in that the CFA *has* changed. There is no easy way + to describe it correctly on entry to the function. Fortunately, + it doesn't matter too much since at all points we can correctly + unwind back to ffi_call. Note that the location to which we + moved the return address is (the new) CFA-8, so from the + perspective of the unwind info, it hasn't moved. */ +L(UW1): + /* cfi_def_cfa(%rbp, 32) */ + /* cfi_rel_offset(%rbp, 16) */ + + movq %rdi, %r10 /* Save a copy of the register area. */ + movq %r8, %r11 /* Save a copy of the target fn. */ + + /* Load up all argument registers. */ + movq (%r10), %rdi + movq 0x08(%r10), %rsi + movq 0x10(%r10), %rdx + movq 0x18(%r10), %rcx + movq 0x20(%r10), %r8 + movq 0x28(%r10), %r9 + movl 0xb0(%r10), %eax /* Set number of SSE registers. */ + testl %eax, %eax + jnz L(load_sse) +L(ret_from_load_sse): + + /* Deallocate the reg arg area, except for r10, then load via pop. */ + leaq 0xb8(%r10), %rsp + popq %r10 + + /* Call the user function. */ + call *%r11 + + /* Deallocate stack arg area; local stack frame in redzone. */ + leaq 24(%rbp), %rsp + + movq 0(%rbp), %rcx /* Reload flags. */ + movq 8(%rbp), %rdi /* Reload raddr. */ + movq 16(%rbp), %rbp /* Reload old frame pointer. */ +L(UW2): + /* cfi_remember_state */ + /* cfi_def_cfa(%rsp, 8) */ + /* cfi_restore(%rbp) */ + + /* The first byte of the flags contains the FFI_TYPE. */ + cmpb $UNIX64_RET_LAST, %cl + movzbl %cl, %r10d + leaq L(store_table)(%rip), %r11 + ja L(sa) +#ifdef __CET__ + /* NB: Originally, each slot is 8 byte. 4 bytes of ENDBR64 + + 4 bytes NOP padding double slot size to 16 bytes. */ + addl %r10d, %r10d +#endif + leaq (%r11, %r10, 8), %r10 + + /* Prep for the structure cases: scratch area in redzone. */ + leaq -20(%rsp), %rsi + jmp *%r10 + + .balign 8 +L(store_table): +E(L(store_table), UNIX64_RET_VOID) + _CET_ENDBR + ret +E(L(store_table), UNIX64_RET_UINT8) + _CET_ENDBR + movzbl %al, %eax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_UINT16) + _CET_ENDBR + movzwl %ax, %eax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_UINT32) + _CET_ENDBR + movl %eax, %eax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_SINT8) + _CET_ENDBR + movsbq %al, %rax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_SINT16) + _CET_ENDBR + movswq %ax, %rax + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_SINT32) + _CET_ENDBR + cltq + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_INT64) + _CET_ENDBR + movq %rax, (%rdi) + ret +E(L(store_table), UNIX64_RET_XMM32) + _CET_ENDBR + movd %xmm0, (%rdi) + ret +E(L(store_table), UNIX64_RET_XMM64) + _CET_ENDBR + movq %xmm0, (%rdi) + ret +E(L(store_table), UNIX64_RET_X87) + _CET_ENDBR + fstpt (%rdi) + ret +E(L(store_table), UNIX64_RET_X87_2) + _CET_ENDBR + fstpt (%rdi) + fstpt 16(%rdi) + ret +E(L(store_table), UNIX64_RET_ST_XMM0_RAX) + _CET_ENDBR + movq %rax, 8(%rsi) + jmp L(s3) +E(L(store_table), UNIX64_RET_ST_RAX_XMM0) + _CET_ENDBR + movq %xmm0, 8(%rsi) + jmp L(s2) +E(L(store_table), UNIX64_RET_ST_XMM0_XMM1) + _CET_ENDBR + movq %xmm1, 8(%rsi) + jmp L(s3) +E(L(store_table), UNIX64_RET_ST_RAX_RDX) + _CET_ENDBR + movq %rdx, 8(%rsi) +L(s2): + movq %rax, (%rsi) + shrl $UNIX64_SIZE_SHIFT, %ecx + rep movsb + ret + .balign 8 +L(s3): + movq %xmm0, (%rsi) + shrl $UNIX64_SIZE_SHIFT, %ecx + rep movsb + ret + +L(sa): call PLT(C(abort)) + + /* Many times we can avoid loading any SSE registers at all. + It's not worth an indirect jump to load the exact set of + SSE registers needed; zero or all is a good compromise. */ + .balign 2 +L(UW3): + /* cfi_restore_state */ +L(load_sse): + movdqa 0x30(%r10), %xmm0 + movdqa 0x40(%r10), %xmm1 + movdqa 0x50(%r10), %xmm2 + movdqa 0x60(%r10), %xmm3 + movdqa 0x70(%r10), %xmm4 + movdqa 0x80(%r10), %xmm5 + movdqa 0x90(%r10), %xmm6 + movdqa 0xa0(%r10), %xmm7 + jmp L(ret_from_load_sse) + +L(UW4): +ENDF(C(ffi_call_unix64)) + +/* 6 general registers, 8 vector registers, + 32 bytes of rvalue, 8 bytes of alignment. */ +#define ffi_closure_OFS_G 0 +#define ffi_closure_OFS_V (6*8) +#define ffi_closure_OFS_RVALUE (ffi_closure_OFS_V + 8*16) +#define ffi_closure_FS (ffi_closure_OFS_RVALUE + 32 + 8) + +/* The location of rvalue within the red zone after deallocating the frame. */ +#define ffi_closure_RED_RVALUE (ffi_closure_OFS_RVALUE - ffi_closure_FS) + + .balign 2 + .globl C(ffi_closure_unix64_sse) + FFI_HIDDEN(C(ffi_closure_unix64_sse)) + +C(ffi_closure_unix64_sse): +L(UW5): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW6): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ + + movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) + movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) + movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) + movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) + movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) + movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) + movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) + movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) + jmp L(sse_entry1) + +L(UW7): +ENDF(C(ffi_closure_unix64_sse)) + + .balign 2 + .globl C(ffi_closure_unix64) + FFI_HIDDEN(C(ffi_closure_unix64)) + +C(ffi_closure_unix64): +L(UW8): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW9): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ +L(sse_entry1): + movq %rdi, ffi_closure_OFS_G+0x00(%rsp) + movq %rsi, ffi_closure_OFS_G+0x08(%rsp) + movq %rdx, ffi_closure_OFS_G+0x10(%rsp) + movq %rcx, ffi_closure_OFS_G+0x18(%rsp) + movq %r8, ffi_closure_OFS_G+0x20(%rsp) + movq %r9, ffi_closure_OFS_G+0x28(%rsp) + +#ifdef __ILP32__ + movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */ + movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */ + movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */ +#else + movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */ + movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */ + movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */ +#endif +L(do_closure): + leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */ + movq %rsp, %r8 /* Load reg_args */ + leaq ffi_closure_FS+8(%rsp), %r9 /* Load argp */ + call PLT(C(ffi_closure_unix64_inner)) + + /* Deallocate stack frame early; return value is now in redzone. */ + addq $ffi_closure_FS, %rsp +L(UW10): + /* cfi_adjust_cfa_offset(-ffi_closure_FS) */ + + /* The first byte of the return value contains the FFI_TYPE. */ + cmpb $UNIX64_RET_LAST, %al + movzbl %al, %r10d + leaq L(load_table)(%rip), %r11 + ja L(la) +#ifdef __CET__ + /* NB: Originally, each slot is 8 byte. 4 bytes of ENDBR64 + + 4 bytes NOP padding double slot size to 16 bytes. */ + addl %r10d, %r10d +#endif + leaq (%r11, %r10, 8), %r10 + leaq ffi_closure_RED_RVALUE(%rsp), %rsi + jmp *%r10 + + .balign 8 +L(load_table): +E(L(load_table), UNIX64_RET_VOID) + _CET_ENDBR + ret +E(L(load_table), UNIX64_RET_UINT8) + _CET_ENDBR + movzbl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_UINT16) + _CET_ENDBR + movzwl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_UINT32) + _CET_ENDBR + movl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_SINT8) + _CET_ENDBR + movsbl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_SINT16) + _CET_ENDBR + movswl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_SINT32) + _CET_ENDBR + movl (%rsi), %eax + ret +E(L(load_table), UNIX64_RET_INT64) + _CET_ENDBR + movq (%rsi), %rax + ret +E(L(load_table), UNIX64_RET_XMM32) + _CET_ENDBR + movd (%rsi), %xmm0 + ret +E(L(load_table), UNIX64_RET_XMM64) + _CET_ENDBR + movq (%rsi), %xmm0 + ret +E(L(load_table), UNIX64_RET_X87) + _CET_ENDBR + fldt (%rsi) + ret +E(L(load_table), UNIX64_RET_X87_2) + _CET_ENDBR + fldt 16(%rsi) + fldt (%rsi) + ret +E(L(load_table), UNIX64_RET_ST_XMM0_RAX) + _CET_ENDBR + movq 8(%rsi), %rax + jmp L(l3) +E(L(load_table), UNIX64_RET_ST_RAX_XMM0) + _CET_ENDBR + movq 8(%rsi), %xmm0 + jmp L(l2) +E(L(load_table), UNIX64_RET_ST_XMM0_XMM1) + _CET_ENDBR + movq 8(%rsi), %xmm1 + jmp L(l3) +E(L(load_table), UNIX64_RET_ST_RAX_RDX) + _CET_ENDBR + movq 8(%rsi), %rdx +L(l2): + movq (%rsi), %rax + ret + .balign 8 +L(l3): + movq (%rsi), %xmm0 + ret + +L(la): call PLT(C(abort)) + +L(UW11): +ENDF(C(ffi_closure_unix64)) + + .balign 2 + .globl C(ffi_go_closure_unix64_sse) + FFI_HIDDEN(C(ffi_go_closure_unix64_sse)) + +C(ffi_go_closure_unix64_sse): +L(UW12): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW13): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ + + movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) + movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) + movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) + movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) + movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) + movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) + movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) + movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) + jmp L(sse_entry2) + +L(UW14): +ENDF(C(ffi_go_closure_unix64_sse)) + + .balign 2 + .globl C(ffi_go_closure_unix64) + FFI_HIDDEN(C(ffi_go_closure_unix64)) + +C(ffi_go_closure_unix64): +L(UW15): + _CET_ENDBR + subq $ffi_closure_FS, %rsp +L(UW16): + /* cfi_adjust_cfa_offset(ffi_closure_FS) */ +L(sse_entry2): + movq %rdi, ffi_closure_OFS_G+0x00(%rsp) + movq %rsi, ffi_closure_OFS_G+0x08(%rsp) + movq %rdx, ffi_closure_OFS_G+0x10(%rsp) + movq %rcx, ffi_closure_OFS_G+0x18(%rsp) + movq %r8, ffi_closure_OFS_G+0x20(%rsp) + movq %r9, ffi_closure_OFS_G+0x28(%rsp) + +#ifdef __ILP32__ + movl 4(%r10), %edi /* Load cif */ + movl 8(%r10), %esi /* Load fun */ + movl %r10d, %edx /* Load closure (user_data) */ +#else + movq 8(%r10), %rdi /* Load cif */ + movq 16(%r10), %rsi /* Load fun */ + movq %r10, %rdx /* Load closure (user_data) */ +#endif + jmp L(do_closure) + +L(UW17): +ENDF(C(ffi_go_closure_unix64)) + +/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ + +#ifdef __APPLE__ +.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support +EHFrame0: +#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) +.section .eh_frame,"a",@unwind +#else +.section .eh_frame,"a",@progbits +#endif + +#ifdef HAVE_AS_X86_PCREL +# define PCREL(X) X - . +#else +# define PCREL(X) X@rel +#endif + +/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ +#ifdef __CET__ +/* Use DW_CFA_advance_loc2 when IBT is enabled. */ +# define ADV(N, P) .byte 3; .2byte L(N)-L(P) +#else +# define ADV(N, P) .byte 2, L(N)-L(P) +#endif + + .balign 8 +L(CIE): + .set L(set0),L(ECIE)-L(SCIE) + .long L(set0) /* CIE Length */ +L(SCIE): + .long 0 /* CIE Identifier Tag */ + .byte 1 /* CIE Version */ + .ascii "zR\0" /* CIE Augmentation */ + .byte 1 /* CIE Code Alignment Factor */ + .byte 0x78 /* CIE Data Alignment Factor */ + .byte 0x10 /* CIE RA Column */ + .byte 1 /* Augmentation size */ + .byte 0x1b /* FDE Encoding (pcrel sdata4) */ + .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp offset 8 */ + .byte 0x80+16, 1 /* DW_CFA_offset, %rip offset 1*-8 */ + .balign 8 +L(ECIE): + + .set L(set1),L(EFDE1)-L(SFDE1) + .long L(set1) /* FDE Length */ +L(SFDE1): + .long L(SFDE1)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW0)) /* Initial location */ + .long L(UW4)-L(UW0) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW1, UW0) + .byte 0xc, 6, 32 /* DW_CFA_def_cfa, %rbp 32 */ + .byte 0x80+6, 2 /* DW_CFA_offset, %rbp 2*-8 */ + ADV(UW2, UW1) + .byte 0xa /* DW_CFA_remember_state */ + .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp 8 */ + .byte 0xc0+6 /* DW_CFA_restore, %rbp */ + ADV(UW3, UW2) + .byte 0xb /* DW_CFA_restore_state */ + .balign 8 +L(EFDE1): + + .set L(set2),L(EFDE2)-L(SFDE2) + .long L(set2) /* FDE Length */ +L(SFDE2): + .long L(SFDE2)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW5)) /* Initial location */ + .long L(UW7)-L(UW5) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW6, UW5) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + .balign 8 +L(EFDE2): + + .set L(set3),L(EFDE3)-L(SFDE3) + .long L(set3) /* FDE Length */ +L(SFDE3): + .long L(SFDE3)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW8)) /* Initial location */ + .long L(UW11)-L(UW8) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW9, UW8) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + ADV(UW10, UW9) + .byte 0xe, 8 /* DW_CFA_def_cfa_offset 8 */ +L(EFDE3): + + .set L(set4),L(EFDE4)-L(SFDE4) + .long L(set4) /* FDE Length */ +L(SFDE4): + .long L(SFDE4)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW12)) /* Initial location */ + .long L(UW14)-L(UW12) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW13, UW12) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + .balign 8 +L(EFDE4): + + .set L(set5),L(EFDE5)-L(SFDE5) + .long L(set5) /* FDE Length */ +L(SFDE5): + .long L(SFDE5)-L(CIE) /* FDE CIE offset */ + .long PCREL(L(UW15)) /* Initial location */ + .long L(UW17)-L(UW15) /* Address range */ + .byte 0 /* Augmentation size */ + ADV(UW16, UW15) + .byte 0xe /* DW_CFA_def_cfa_offset */ + .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ + .balign 8 +L(EFDE5): +#ifdef __APPLE__ + .subsections_via_symbols + .section __LD,__compact_unwind,regular,debug + + /* compact unwind for ffi_call_unix64 */ + .quad C(ffi_call_unix64) + .set L1,L(UW4)-L(UW0) + .long L1 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_closure_unix64_sse */ + .quad C(ffi_closure_unix64_sse) + .set L2,L(UW7)-L(UW5) + .long L2 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_closure_unix64 */ + .quad C(ffi_closure_unix64) + .set L3,L(UW11)-L(UW8) + .long L3 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_go_closure_unix64_sse */ + .quad C(ffi_go_closure_unix64_sse) + .set L4,L(UW14)-L(UW12) + .long L4 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 + + /* compact unwind for ffi_go_closure_unix64 */ + .quad C(ffi_go_closure_unix64) + .set L5,L(UW17)-L(UW15) + .long L5 + .long 0x04000000 /* use dwarf unwind info */ + .quad 0 + .quad 0 +#endif + +#endif /* __x86_64__ */ +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + +#endif \ No newline at end of file diff --git a/Stinger/libffi/darwin_ios/src/x86/win64_x86_64.S b/Stinger/libffi/darwin_ios/src/x86/win64_x86_64.S new file mode 100644 index 0000000..497e0be --- /dev/null +++ b/Stinger/libffi/darwin_ios/src/x86/win64_x86_64.S @@ -0,0 +1,246 @@ +#ifdef __x86_64__ + +#ifdef __x86_64__ +#define LIBFFI_ASM +#include <fficonfig.h> +#include <ffi.h> +#include <ffi_cfi.h> +#include "asmnames.h" + +#if defined(HAVE_AS_CFI_PSEUDO_OP) + .cfi_sections .debug_frame +#endif + +#ifdef X86_WIN64 +#define SEH(...) __VA_ARGS__ +#define arg0 %rcx +#define arg1 %rdx +#define arg2 %r8 +#define arg3 %r9 +#else +#define SEH(...) +#define arg0 %rdi +#define arg1 %rsi +#define arg2 %rdx +#define arg3 %rcx +#endif + +/* This macro allows the safe creation of jump tables without an + actual table. The entry points into the table are all 8 bytes. + The use of ORG asserts that we're at the correct location. */ +/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ +#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) +# define E(BASE, X) .balign 8 +#else +# define E(BASE, X) .balign 8; .org BASE + (X) * 8 +#endif + + .text + +/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) + + Bit o trickiness here -- FRAME is the base of the stack frame + for this function. This has been allocated by ffi_call. We also + deallocate some of the stack that has been alloca'd. */ + + .align 8 + .globl C(ffi_call_win64) + FFI_HIDDEN(C(ffi_call_win64)) + + SEH(.seh_proc ffi_call_win64) +C(ffi_call_win64): + cfi_startproc + _CET_ENDBR + /* Set up the local stack frame and install it in rbp/rsp. */ + movq (%rsp), %rax + movq %rbp, (arg1) + movq %rax, 8(arg1) + movq arg1, %rbp + cfi_def_cfa(%rbp, 16) + cfi_rel_offset(%rbp, 0) + SEH(.seh_pushreg %rbp) + SEH(.seh_setframe %rbp, 0) + SEH(.seh_endprologue) + movq arg0, %rsp + + movq arg2, %r10 + + /* Load all slots into both general and xmm registers. */ + movq (%rsp), %rcx + movsd (%rsp), %xmm0 + movq 8(%rsp), %rdx + movsd 8(%rsp), %xmm1 + movq 16(%rsp), %r8 + movsd 16(%rsp), %xmm2 + movq 24(%rsp), %r9 + movsd 24(%rsp), %xmm3 + + call *16(%rbp) + + movl 24(%rbp), %ecx + movq 32(%rbp), %r8 + leaq 0f(%rip), %r10 + cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx + leaq (%r10, %rcx, 8), %r10 + ja 99f + _CET_NOTRACK jmp *%r10 + +/* Below, we're space constrained most of the time. Thus we eschew the + modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ +.macro epilogue + leaveq + cfi_remember_state + cfi_def_cfa(%rsp, 8) + cfi_restore(%rbp) + ret + cfi_restore_state +.endm + + .align 8 +0: +E(0b, FFI_TYPE_VOID) + epilogue +E(0b, FFI_TYPE_INT) + movslq %eax, %rax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_FLOAT) + movss %xmm0, (%r8) + epilogue +E(0b, FFI_TYPE_DOUBLE) + movsd %xmm0, (%r8) + epilogue +// FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here. +E(0b, FFI_TYPE_DOUBLE + 1) + call PLT(C(abort)) +E(0b, FFI_TYPE_UINT8) + movzbl %al, %eax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT8) + movsbq %al, %rax + jmp 98f +E(0b, FFI_TYPE_UINT16) + movzwl %ax, %eax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT16) + movswq %ax, %rax + jmp 98f +E(0b, FFI_TYPE_UINT32) + movl %eax, %eax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT32) + movslq %eax, %rax + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_UINT64) +98: movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_SINT64) + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_STRUCT) + epilogue +E(0b, FFI_TYPE_POINTER) + movq %rax, (%r8) + epilogue +E(0b, FFI_TYPE_COMPLEX) + call PLT(C(abort)) +E(0b, FFI_TYPE_SMALL_STRUCT_1B) + movb %al, (%r8) + epilogue +E(0b, FFI_TYPE_SMALL_STRUCT_2B) + movw %ax, (%r8) + epilogue +E(0b, FFI_TYPE_SMALL_STRUCT_4B) + movl %eax, (%r8) + epilogue + + .align 8 +99: call PLT(C(abort)) + + epilogue + + cfi_endproc + SEH(.seh_endproc) + + +/* 32 bytes of outgoing register stack space, 8 bytes of alignment, + 16 bytes of result, 32 bytes of xmm registers. */ +#define ffi_clo_FS (32+8+16+32) +#define ffi_clo_OFF_R (32+8) +#define ffi_clo_OFF_X (32+8+16) + + .align 8 + .globl C(ffi_go_closure_win64) + FFI_HIDDEN(C(ffi_go_closure_win64)) + + SEH(.seh_proc ffi_go_closure_win64) +C(ffi_go_closure_win64): + cfi_startproc + _CET_ENDBR + /* Save all integer arguments into the incoming reg stack space. */ + movq %rcx, 8(%rsp) + movq %rdx, 16(%rsp) + movq %r8, 24(%rsp) + movq %r9, 32(%rsp) + + movq 8(%r10), %rcx /* load cif */ + movq 16(%r10), %rdx /* load fun */ + movq %r10, %r8 /* closure is user_data */ + jmp 0f + cfi_endproc + SEH(.seh_endproc) + + .align 8 + .globl C(ffi_closure_win64) + FFI_HIDDEN(C(ffi_closure_win64)) + + SEH(.seh_proc ffi_closure_win64) +C(ffi_closure_win64): + cfi_startproc + _CET_ENDBR + /* Save all integer arguments into the incoming reg stack space. */ + movq %rcx, 8(%rsp) + movq %rdx, 16(%rsp) + movq %r8, 24(%rsp) + movq %r9, 32(%rsp) + + movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ + movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ + movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ +0: + subq $ffi_clo_FS, %rsp + cfi_adjust_cfa_offset(ffi_clo_FS) + SEH(.seh_stackalloc ffi_clo_FS) + SEH(.seh_endprologue) + + /* Save all sse arguments into the stack frame. */ + movsd %xmm0, ffi_clo_OFF_X(%rsp) + movsd %xmm1, ffi_clo_OFF_X+8(%rsp) + movsd %xmm2, ffi_clo_OFF_X+16(%rsp) + movsd %xmm3, ffi_clo_OFF_X+24(%rsp) + + leaq ffi_clo_OFF_R(%rsp), %r9 + call PLT(C(ffi_closure_win64_inner)) + + /* Load the result into both possible result registers. */ + movq ffi_clo_OFF_R(%rsp), %rax + movsd ffi_clo_OFF_R(%rsp), %xmm0 + + addq $ffi_clo_FS, %rsp + cfi_adjust_cfa_offset(-ffi_clo_FS) + ret + + cfi_endproc + SEH(.seh_endproc) +#endif /* __x86_64__ */ + +#if defined __ELF__ && defined __linux__ + .section .note.GNU-stack,"",@progbits +#endif + + +#endif \ No newline at end of file diff --git a/replace.rb b/replace.rb new file mode 100644 index 0000000..cf02dc5 --- /dev/null +++ b/replace.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby + + +headrs = Dir[File.join(Dir.pwd,"Stinger/libffi","**","**")].select { |e| + e.end_with?(".h") +}.map { |e| File.basename(e) } + +Dir[File.join(Dir.pwd,"Stinger/libffi","**","**")].select { |e| + e.end_with?(".h") || e.end_with?(".m") || e.end_with?(".c") +}.each { |e| + puts e + if File.file?(e) + text = "" + File.open(e).each do |line| + if line.include?("#include") && headrs.any? { |e| line.include?(e) } + text += line.gsub("<", "\"").gsub(">", "\"") + else + text += line + end + end + File.open(e, "w") { |file| file.puts text } + end +} \ No newline at end of file From 22f178fa1d5be06082ac9053694eff5680991cfa Mon Sep 17 00:00:00 2001 From: bob <bob170731@gmail.com> Date: Sat, 11 Sep 2021 17:08:35 +0800 Subject: [PATCH 6/8] [CHG] fix libffi crash according to https://juejin.cn/post/6955652447670894606 --- Stinger.podspec | 2 +- Stinger/Classes/STHookInfoPool.m | 4 + Stinger/libffi/darwin_common/src/closures.c | 107 ++++++++++++++---- Stinger/libffi/darwin_common/src/dlmalloc.c | 2 + .../libffi/darwin_ios/src/aarch64/ffi_arm64.c | 18 ++- .../darwin_ios/src/aarch64/sysv_arm64.S | 89 +++++++++++++-- .../libffi/darwin_ios/src/arm/sysv_armv7.S | 4 +- 7 files changed, 189 insertions(+), 37 deletions(-) diff --git a/Stinger.podspec b/Stinger.podspec index e87bbc5..42b3b30 100644 --- a/Stinger.podspec +++ b/Stinger.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = 'Stinger' - s.version = '0.3.0' + s.version = '1.0.0' s.summary = 'Implementing HOOK & AOP using libffi for Objective-C.' # This description is used to generate tags and improve search results. diff --git a/Stinger/Classes/STHookInfoPool.m b/Stinger/Classes/STHookInfoPool.m index 4a9da33..533fd88 100644 --- a/Stinger/Classes/STHookInfoPool.m +++ b/Stinger/Classes/STHookInfoPool.m @@ -263,17 +263,21 @@ - (BOOL)addInfo:(id<STHookInfo>)info { NSUInteger position = info.option & StingerPositionFilter; switch (position) { case STOptionBefore: + if (![[_beforeInfos valueForKey:@"identifier"] containsObject:info.identifier]) { [_beforeInfos addObject:info]; flag = YES; break; + } case STOptionInstead: _insteadInfo = info; flag = YES; break; case STOptionAfter: + if (![[_afterInfos valueForKey:@"identifier"] containsObject:info.identifier]) { [_afterInfos addObject:info]; flag = YES; break; + } default: flag = NO; break; diff --git a/Stinger/libffi/darwin_common/src/closures.c b/Stinger/libffi/darwin_common/src/closures.c index c377a24..29879a9 100644 --- a/Stinger/libffi/darwin_common/src/closures.c +++ b/Stinger/libffi/darwin_common/src/closures.c @@ -153,14 +153,19 @@ ffi_closure_free (void *ptr) #endif #include <stdio.h> #include <stdlib.h> - -extern void *ffi_closure_trampoline_table_page; +extern void *ffi_closure_remap_trampoline_table_page; +extern void *ffi_closure_static_trampoline_table_page; +extern void *ffi_bridge_data_page1; typedef struct ffi_trampoline_table ffi_trampoline_table; typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry; +#define FFI_STATIC_PAGE 0 +#define FFI_REMAP_PAGE 1 struct ffi_trampoline_table { + // 0 static, 1 remap + uint64_t page_type; /* contiguous writable and executable pages */ vm_address_t config_page; vm_address_t trampoline_page; @@ -172,6 +177,8 @@ struct ffi_trampoline_table ffi_trampoline_table *prev; ffi_trampoline_table *next; + + }; struct ffi_trampoline_table_entry @@ -181,71 +188,122 @@ struct ffi_trampoline_table_entry }; /* Total number of trampolines that fit in one trampoline table */ -#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE) +#define FFI_STATIC_TRAMPOLINE_COUNT (PAGE_MAX_SIZE*5 / FFI_TRAMPOLINE_SIZE) +#define FFI_REMAP_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE) static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER; static ffi_trampoline_table *ffi_trampoline_tables = NULL; static ffi_trampoline_table * -ffi_trampoline_table_alloc (void) +ffi_static_trampoline_table_alloc (void) +{ + ffi_trampoline_table *table; + uint16_t i; + + /* We have valid trampoline and config pages */ + table = calloc (1, sizeof (ffi_trampoline_table)); + table->free_count = FFI_STATIC_TRAMPOLINE_COUNT; + table->config_page = (vm_address_t)&ffi_bridge_data_page1; + table->trampoline_page = (vm_address_t)&ffi_closure_static_trampoline_table_page; + table->page_type = FFI_STATIC_PAGE; + /* Create and initialize the free list */ + table->free_list_pool = + calloc (FFI_STATIC_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry)); + + for (i = 0; i < table->free_count; i++) + { + ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; + entry->trampoline = + (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); + + if (i < table->free_count - 1) + entry->next = &table->free_list_pool[i + 1]; + } + + table->free_list = table->free_list_pool; + + return table; +} + +static ffi_trampoline_table * +ffi_remap_trampoline_table_alloc (void) { ffi_trampoline_table *table; + uint16_t i; + vm_address_t config_page; vm_address_t trampoline_page; vm_address_t trampoline_page_template; vm_prot_t cur_prot; vm_prot_t max_prot; kern_return_t kt; - uint16_t i; /* Allocate two pages -- a config page and a placeholder page */ config_page = 0x0; kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2, - VM_FLAGS_ANYWHERE); + VM_FLAGS_ANYWHERE); if (kt != KERN_SUCCESS) - return NULL; + return NULL; + + /* Allocate two pages -- a config page and a placeholder page */ + //bdffc_closure_trampoline_table_page /* Remap the trampoline table on top of the placeholder page */ trampoline_page = config_page + PAGE_MAX_SIZE; - trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page; + trampoline_page_template = (vm_address_t)&ffi_closure_remap_trampoline_table_page; #ifdef __arm__ - /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */ + /* bdffc_closure_trampoline_table_page can be thumb-biased on some ARM archs */ trampoline_page_template &= ~1UL; #endif kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, - VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template, - FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); + VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template, + FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); if (kt != KERN_SUCCESS) - { + { vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2); return NULL; - } + } + /* We have valid trampoline and config pages */ table = calloc (1, sizeof (ffi_trampoline_table)); - table->free_count = FFI_TRAMPOLINE_COUNT; + table->free_count = FFI_REMAP_TRAMPOLINE_COUNT; table->config_page = config_page; table->trampoline_page = trampoline_page; - + table->page_type = FFI_REMAP_PAGE; /* Create and initialize the free list */ table->free_list_pool = - calloc (FFI_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry)); + calloc (FFI_REMAP_TRAMPOLINE_COUNT, sizeof (ffi_trampoline_table_entry)); for (i = 0; i < table->free_count; i++) - { + { ffi_trampoline_table_entry *entry = &table->free_list_pool[i]; entry->trampoline = - (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); + (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE)); if (i < table->free_count - 1) - entry->next = &table->free_list_pool[i + 1]; - } + entry->next = &table->free_list_pool[i + 1]; + } table->free_list = table->free_list_pool; return table; } +static ffi_trampoline_table * +ffi_trampoline_table_alloc (void) +{ +#ifdef __arm64__ + static int static_page_used = 0; + if (static_page_used == 0) { + static_page_used = 1; + return ffi_static_trampoline_table_alloc(); + } +#endif + + return ffi_remap_trampoline_table_alloc(); +} + static void ffi_trampoline_table_free (ffi_trampoline_table *table) { @@ -257,7 +315,7 @@ ffi_trampoline_table_free (ffi_trampoline_table *table) table->next->prev = table->prev; /* Deallocate pages */ - vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2); +// vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2); /* Deallocate free list */ free (table->free_list_pool); @@ -331,11 +389,16 @@ ffi_closure_free (void *ptr) /* If all trampolines within this table are free, and at least one other table exists, deallocate * the table */ - if (table->free_count == FFI_TRAMPOLINE_COUNT + if (table->page_type == FFI_STATIC_PAGE && table->free_count == FFI_STATIC_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) { ffi_trampoline_table_free (table); } + else if (table->page_type == FFI_REMAP_PAGE && table->free_count == FFI_REMAP_TRAMPOLINE_COUNT + && ffi_trampoline_tables != table) + { + ffi_trampoline_table_free (table); + } else if (ffi_trampoline_tables != table) { /* Otherwise, bump this table to the top of the list */ diff --git a/Stinger/libffi/darwin_common/src/dlmalloc.c b/Stinger/libffi/darwin_common/src/dlmalloc.c index 1aba657..04dfd83 100644 --- a/Stinger/libffi/darwin_common/src/dlmalloc.c +++ b/Stinger/libffi/darwin_common/src/dlmalloc.c @@ -654,6 +654,8 @@ extern "C" { /* ------------------- Declarations of public routines ------------------- */ +#define USE_DL_PREFIX 1 + #ifndef USE_DL_PREFIX #define dlcalloc calloc #define dlfree free diff --git a/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c b/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c index 2fe699b..314a84b 100644 --- a/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c +++ b/Stinger/libffi/darwin_ios/src/aarch64/ffi_arm64.c @@ -807,9 +807,21 @@ ffi_prep_closure_loc (ffi_closure *closure, #ifdef HAVE_PTRAUTH codeloc = ptrauth_strip (codeloc, ptrauth_key_asia); #endif - void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); - config[0] = closure; - config[1] = start; + // trampoline_table 前8个字节 page_type字段 + if (*((uint64_t *)closure->trampoline_table) == 0) { + extern void *ffi_closure_static_trampoline_table_page; + extern void *ffi_bridge_data_page1; + size_t offset = (intptr_t)codeloc - (intptr_t)(&ffi_closure_static_trampoline_table_page); + void **config = (void**)((int64_t)&ffi_bridge_data_page1 + offset); + config[0] = closure; + config[1] = start; + } else { + void **config = (void**)((uint8_t *)codeloc - PAGE_MAX_SIZE); + config[0] = closure; + config[1] = start; + } + + #endif #else static const unsigned char trampoline[16] = { diff --git a/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S b/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S index 05a612f..460dadc 100644 --- a/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S +++ b/Stinger/libffi/darwin_ios/src/aarch64/sysv_arm64.S @@ -67,7 +67,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ # define BR(r) br r # define BLR(r) blr r #endif - +.extern _ffi_bridge_data_page1; .text .align 4 @@ -371,22 +371,93 @@ CNAME(ffi_closure_SYSV): #if FFI_EXEC_TRAMPOLINE_TABLE +# 动态remap的 page #ifdef __MACH__ #include <mach/machine/vm_param.h> - .align PAGE_MAX_SHIFT -CNAME(ffi_closure_trampoline_table_page): + .align PAGE_MAX_SHIFT + CNAME(ffi_closure_remap_trampoline_table_page): .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE adr x16, -PAGE_MAX_SIZE ldp x17, x16, [x16] - BR(x16) - nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller than 16 bytes */ + br x16 + nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller that 16 bytes */ + .endr + +.globl CNAME(ffi_closure_remap_trampoline_table_page) +#ifdef __ELF__ + .type CNAME(ffi_closure_remap_trampoline_table_page), #function + .hidden CNAME(ffi_closure_remap_trampoline_table_page) + .size CNAME(ffi_closure_remap_trampoline_table_page), . - CNAME(ffi_closure_remap_trampoline_table_page) +#endif +#endif + +# 静态分配的page +#ifdef __MACH__ +#include <mach/machine/vm_param.h> + + .align 14 + .data + .global _ffi_bridge_data_page1 + _ffi_bridge_data_page1: + .space PAGE_MAX_SIZE*5 + .align PAGE_MAX_SHIFT + .text + CNAME(_ffi_local_forwarding_bridge_page): + + _ffi_local_forwarding_bridge: + adrp x17, ffi_closure_static_trampoline_table_page_start@PAGE;// text page + sub x16, x16, x17;// offset + adrp x17, _ffi_bridge_data_page1@PAGE;// data page + add x16, x16, x17;// data address + ldp x17, x16, [x16];// x17 closure x16 start + br x16 + nop + nop + .align PAGE_MAX_SHIFT + CNAME(ffi_closure_static_trampoline_table_page): + +#这个label 用来adrp@PAGE 计算 trampoline 到 trampoline page的offset +#留了5个用来调试。 +# 我们static trampoline 两条指令就够了,这里使用4个,和remap的保持一致 + ffi_closure_static_trampoline_table_page_start: + adr x16, #0 // mv pc t0 x16 + b _ffi_local_forwarding_bridge + nop + nop + + adr x16, #0 // mv pc t0 x16 + b _ffi_local_forwarding_bridge // cal x16 + nop + nop + + adr x16, #0 // mv pc t0 x16 + b _ffi_local_forwarding_bridge // cal x16 + nop + nop + + adr x16, #0 // mv pc t0 x16 + b _ffi_local_forwarding_bridge // cal x16 + nop + nop + + adr x16, #0 // mv pc t0 x16 + b _ffi_local_forwarding_bridge // cal x16 + nop + nop + + // 5 * 4 + .rept (PAGE_MAX_SIZE*5-5*4) / FFI_TRAMPOLINE_SIZE + adr x16, #0 + b _ffi_local_forwarding_bridge + nop + nop .endr - .globl CNAME(ffi_closure_trampoline_table_page) - FFI_HIDDEN(CNAME(ffi_closure_trampoline_table_page)) + .globl CNAME(ffi_closure_static_trampoline_table_page) + FFI_HIDDEN(CNAME(ffi_closure_static_trampoline_table_page)) #ifdef __ELF__ - .type CNAME(ffi_closure_trampoline_table_page), #function - .size CNAME(ffi_closure_trampoline_table_page), . - CNAME(ffi_closure_trampoline_table_page) + .type CNAME(ffi_closure_static_trampoline_table_page), #function + .size CNAME(ffi_closure_static_trampoline_table_page), . - CNAME(ffi_closure_static_trampoline_table_page) #endif #endif diff --git a/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S b/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S index 45be58d..c9c8cd6 100644 --- a/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S +++ b/Stinger/libffi/darwin_ios/src/arm/sysv_armv7.S @@ -362,13 +362,13 @@ ARM_FUNC_END(ffi_closure_ret) #include <mach/machine/vm_param.h> .align PAGE_MAX_SHIFT -ARM_FUNC_START(ffi_closure_trampoline_table_page) +ARM_FUNC_START(ffi_closure_remap_trampoline_table_page) .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE adr ip, #-PAGE_MAX_SIZE @ the config page is PAGE_MAX_SIZE behind the trampoline page sub ip, #8 @ account for pc bias ldr pc, [ip, #4] @ jump to ffi_closure_SYSV or ffi_closure_VFP .endr -ARM_FUNC_END(ffi_closure_trampoline_table_page) +ARM_FUNC_END(ffi_closure_remap_trampoline_table_page) #endif #else From e80d73e93e80f6a064510d9d28a8c05ce30a8269 Mon Sep 17 00:00:00 2001 From: bob <bob170731@gmail.com> Date: Sat, 11 Sep 2021 17:15:56 +0800 Subject: [PATCH 7/8] bump version to 1.0.0 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 54647c7..6b71fdd 100644 --- a/README.md +++ b/README.md @@ -332,6 +332,7 @@ Assuner-Lee, assuner@foxmail.com | 0.2.8 | improve performance.| | 0.2.9 | support automatic removal| | 0.3.0 | fix kvo crash| +| 1.0.0 | 1. replace STMethodSignature with NSMethodSignature <br />2. support get arguments <br />3. libffi use source code from https://github.com/libffi/libffi, version 3.3.0 <br />4. fix libffi crash according to https://juejin.cn/post/6955652447670894606 <br />5. add weak check signature feature| ## License From 2a01817c086b08993053b614596511e8f199a6db Mon Sep 17 00:00:00 2001 From: bob <bob170731@gmail.com> Date: Sat, 11 Sep 2021 17:31:02 +0800 Subject: [PATCH 8/8] [CHG] fix typo --- Example/Stinger/ASViewController.m | 5 +++++ Example/Tests/HookKVOObjectTests.m | 4 ++-- README.md | 2 +- "README_\344\270\255\346\226\207.md" | 2 +- Stinger/Classes/STDefines.h | 3 ++- Stinger/Classes/STHookInfoPool.m | 10 +++++----- Stinger/Classes/Stinger.m | 8 ++++---- 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/Example/Stinger/ASViewController.m b/Example/Stinger/ASViewController.m index 1e0da63..afe1e3b 100644 --- a/Example/Stinger/ASViewController.m +++ b/Example/Stinger/ASViewController.m @@ -49,5 +49,10 @@ - (IBAction)test:(id)sender { [self methodA]; } NSLog(@"clicked!!"); + NSURL *url = [[NSURL alloc] initWithString:@"https://www.google.com"]; + [url st_hookInstanceMethod:@selector(absoluteString) option:(STOptionBefore) usingIdentifier:@"123" withBlock:^(id<StingerParams> params) { + NSLog(@""); + }]; + [url absoluteString]; } @end diff --git a/Example/Tests/HookKVOObjectTests.m b/Example/Tests/HookKVOObjectTests.m index 5e3070e..3f6e86b 100644 --- a/Example/Tests/HookKVOObjectTests.m +++ b/Example/Tests/HookKVOObjectTests.m @@ -61,7 +61,7 @@ - (void)testSetter1 { temp = [temp stringByAppendingFormat:@"-st"]; }]; self.obj.index = 2; - NSAssert([temp isEqualToString:@"-st"], @""); + NSCAssert([temp isEqualToString:@"-st"], @""); } @@ -71,7 +71,7 @@ - (void)testSetter2 { temp = [temp stringByAppendingFormat:@"-st"]; }]; self.obj.name = @"2"; - NSAssert([temp isEqualToString:@"-kvo-st"], @""); + NSCAssert([temp isEqualToString:@"-kvo-st"], @""); } - (void)testInstanceHookBefore { diff --git a/README.md b/README.md index 6b71fdd..920b274 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ typedef NS_ENUM(NSInteger, STOption) { }; typedef NS_ENUM(NSInteger, STHookResult) { - STHookResultSuccuss = 1, + STHookResultSuccess = 1, STHookResultErrorMethodNotFound = -1, STHookResultErrorBlockNotMatched = -2, STHookResultErrorIDExisted = -3, diff --git "a/README_\344\270\255\346\226\207.md" "b/README_\344\270\255\346\226\207.md" index d0a0459..57e67c5 100644 --- "a/README_\344\270\255\346\226\207.md" +++ "b/README_\344\270\255\346\226\207.md" @@ -20,7 +20,7 @@ typedef NS_ENUM(NSInteger, STOption) { }; typedef NS_ENUM(NSInteger, STHookResult) { - STHookResultSuccuss = 1, + STHookResultSuccess = 1, STHookResultErrorMethodNotFound = -1, STHookResultErrorBlockNotMatched = -2, STHookResultErrorIDExisted = -3, diff --git a/Stinger/Classes/STDefines.h b/Stinger/Classes/STDefines.h index fe2cd3c..c4ab8bd 100644 --- a/Stinger/Classes/STDefines.h +++ b/Stinger/Classes/STDefines.h @@ -25,7 +25,8 @@ typedef NS_OPTIONS(NSInteger, STOption) { #define StingerPositionFilter 0x07 typedef NS_ENUM(NSInteger, STHookResult) { - STHookResultSuccuss = 1, + STHookResultSuccuss = 1, // fix typo + STHookResultSuccess = 1, STHookResultErrorMethodNotFound = -1, STHookResultErrorBlockNotMatched = -2, STHookResultErrorIDExisted = -3, diff --git a/Stinger/Classes/STHookInfoPool.m b/Stinger/Classes/STHookInfoPool.m index 533fd88..0690b7f 100644 --- a/Stinger/Classes/STHookInfoPool.m +++ b/Stinger/Classes/STHookInfoPool.m @@ -311,14 +311,14 @@ - (BOOL)removeInfoForIdentifier:(STIdentifier)identifier { - (StingerIMP)stingerIMP { if (_stingerIMP == NULL) { ffi_type *returnType = st_ffiTypeWithType(self.signature.methodReturnType); - NSAssert(returnType, @"can't find a ffi_type of %s", self.signature.methodReturnType); + NSCAssert(returnType, @"can't find a ffi_type of %s", self.signature.methodReturnType); NSUInteger argumentCount = self->_argsCount; _args = malloc(sizeof(ffi_type *) * argumentCount) ; for (int i = 0; i < argumentCount; i++) { ffi_type* current_ffi_type = st_ffiTypeWithType([self.signature getArgumentTypeAtIndex:i]); - NSAssert(current_ffi_type, @"can't find a ffi_type of %s", [self.signature getArgumentTypeAtIndex:i]); + NSCAssert(current_ffi_type, @"can't find a ffi_type of %s", [self.signature getArgumentTypeAtIndex:i]); _args[i] = current_ffi_type; } @@ -326,10 +326,10 @@ - (StingerIMP)stingerIMP { if(ffi_prep_cif(&_cif, FFI_DEFAULT_ABI, (unsigned int)argumentCount, returnType, _args) == FFI_OK) { if (ffi_prep_closure_loc(_closure, &_cif, _st_ffi_function, (__bridge void *)(self), _stingerIMP) != FFI_OK) { - NSAssert(NO, @"genarate IMP failed"); + NSCAssert(NO, @"genarate IMP failed"); } } else { - NSAssert(NO, @"FUCK"); + NSCAssert(NO, @"FUCK"); } [self _genarateBlockCif]; @@ -378,7 +378,7 @@ - (void)_genarateBlockCif { } if(ffi_prep_cif(&_blockCif, FFI_DEFAULT_ABI, (unsigned int)argumentCount, returnType, _blockArgs) != FFI_OK) { - NSAssert(NO, @"FUCK"); + NSCAssert(NO, @"FUCK"); } } diff --git a/Stinger/Classes/Stinger.m b/Stinger/Classes/Stinger.m index 8ae3ae3..d345349 100644 --- a/Stinger/Classes/Stinger.m +++ b/Stinger/Classes/Stinger.m @@ -57,7 +57,7 @@ - (STHookResult)st_hookInstanceMethod:(SEL)sel option:(STOption)option usingIden if (!stSubClass) return STHookResultOther; STHookResult hookMethodResult = hookMethod(stSubClass, sel, option, identifier, block); - if (hookMethodResult != STHookResultSuccuss) return hookMethodResult; + if (hookMethodResult != STHookResultSuccess) return hookMethodResult; if (!objc_getAssociatedObject(self, STSubClassKey)) { object_setClass(self, stSubClass); objc_setAssociatedObject(self, STSubClassKey, stSubClass, OBJC_ASSOCIATION_ASSIGN); @@ -70,7 +70,7 @@ - (STHookResult)st_hookInstanceMethod:(SEL)sel option:(STOption)option usingIden } STHookInfo *instanceHookInfo = [STHookInfo infoWithOption:option withIdentifier:identifier withBlock:block]; - return [instanceHookInfoPool addInfo:instanceHookInfo] ? STHookResultSuccuss : STHookResultErrorIDExisted; + return [instanceHookInfoPool addInfo:instanceHookInfo] ? STHookResultSuccess : STHookResultErrorIDExisted; } } @@ -124,10 +124,10 @@ NS_INLINE STHookResult hookMethod(Class hookedCls, SEL sel, STOption option, STI st_setHookInfoPool(hookedCls, sel, hookInfoPool); } if (st_isIntanceHookCls(hookedCls)) { - return STHookResultSuccuss; + return STHookResultSuccess; } else { STHookInfo *hookInfo = [STHookInfo infoWithOption:option withIdentifier:identifier withBlock:block]; - return [hookInfoPool addInfo:hookInfo] ? STHookResultSuccuss : STHookResultErrorIDExisted; + return [hookInfoPool addInfo:hookInfo] ? STHookResultSuccess : STHookResultErrorIDExisted; } } }