From ab19f383970ef09129b955cde28e423b031e299d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cihat=20Gu=CC=88ndu=CC=88z?= Date: Thu, 14 Feb 2019 14:52:26 +0100 Subject: [PATCH] Initial commit from NewFrameworkTemplate --- .gitignore | 67 + .projlint.yml | 84 ++ .swiftlint.yml | 380 +++++ CHANGELOG.md | 18 + CODE_OF_CONDUCT.md | 74 + CONTRIBUTING.md | 20 + Cartfile | 5 + Cartfile.resolved | 0 Frameworks/NewFrameworkTemplate/.keep | 0 Frameworks/NewFrameworkTemplate/Globals/.keep | 0 Frameworks/NewFrameworkTemplate/Models/.keep | 0 Frameworks/SupportingFiles/Info.plist | 24 + .../SupportingFiles/NewFrameworkTemplate.h | 15 + LICENSE | 21 + Logo.png | Bin 0 -> 41168 bytes NewFrameworkTemplate.podspec | 29 + .../project.pbxproj | 1224 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/IDETemplateMacros.plist | 11 + .../NewFrameworkTemplate iOS.xcscheme | 99 ++ .../NewFrameworkTemplate macOS.xcscheme | 99 ++ .../NewFrameworkTemplate tvOS.xcscheme | 99 ++ .../NewFrameworkTemplate watchOS.xcscheme | 80 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Package.swift | 29 + README.md | 85 ++ README.md.sample | 101 ++ .../ExampleTests.swift | 11 + Tests/SupportingFiles/Info.plist | 22 + UsageExamples.playground/Contents.swift | 5 + .../contents.xcplayground | 4 + beak.swift | 279 ++++ 34 files changed, 2918 insertions(+) create mode 100755 .gitignore create mode 100755 .projlint.yml create mode 100755 .swiftlint.yml create mode 100755 CHANGELOG.md create mode 100755 CODE_OF_CONDUCT.md create mode 100755 CONTRIBUTING.md create mode 100755 Cartfile create mode 100755 Cartfile.resolved create mode 100755 Frameworks/NewFrameworkTemplate/.keep create mode 100755 Frameworks/NewFrameworkTemplate/Globals/.keep create mode 100755 Frameworks/NewFrameworkTemplate/Models/.keep create mode 100755 Frameworks/SupportingFiles/Info.plist create mode 100755 Frameworks/SupportingFiles/NewFrameworkTemplate.h create mode 100755 LICENSE create mode 100755 Logo.png create mode 100755 NewFrameworkTemplate.podspec create mode 100755 NewFrameworkTemplate.xcodeproj/project.pbxproj create mode 100755 NewFrameworkTemplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100755 NewFrameworkTemplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100755 NewFrameworkTemplate.xcodeproj/xcshareddata/IDETemplateMacros.plist create mode 100755 NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate iOS.xcscheme create mode 100755 NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate macOS.xcscheme create mode 100755 NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate tvOS.xcscheme create mode 100755 NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate watchOS.xcscheme create mode 100755 NewFrameworkTemplate.xcworkspace/contents.xcworkspacedata create mode 100755 NewFrameworkTemplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100755 Package.swift create mode 100755 README.md create mode 100755 README.md.sample create mode 100755 Tests/NewFrameworkTemplateTests/ExampleTests.swift create mode 100755 Tests/SupportingFiles/Info.plist create mode 100755 UsageExamples.playground/Contents.swift create mode 100755 UsageExamples.playground/contents.xcplayground create mode 100755 beak.swift diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..d316cc1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,67 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +Carthage/Checkouts +Carthage/Build +Carthage/Cachefile + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output \ No newline at end of file diff --git a/.projlint.yml b/.projlint.yml new file mode 100755 index 0000000..e6f89f9 --- /dev/null +++ b/.projlint.yml @@ -0,0 +1,84 @@ +shared_variables: + rightholder: Flinesoft + project_name: NewFrameworkTemplate + +rules: + - xcode_build_phases: + project_path: <:project_name:>.xcodeproj + target_name: <:project_name:> iOS + run_scripts: + SwiftLint: | + if [ "${CONFIGURATION}" = "Debug" ]; then + if which swiftlint > /dev/null; then + swiftlint --quiet + else + echo "warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint" + fi + fi + + ProjLint: | + if [ "${CONFIGURATION}" = "Debug" ]; then + if which projlint > /dev/null; then + projlint lint --xcode --timeout 2 --ignore-network-errors + else + echo "warning: ProjLint not installed, download it from https://github.com/JamitLabs/ProjLint" + fi + fi + + - xcode_project_navigator: + project_path: <:project_name:>.xcodeproj + sorted: + - Frameworks/<:project_name:> + - Frameworks/SupportingFiles + - Tests/<:project_name:>Tests + - Tests/SupportingFiles + inner_group_order: + - assets + - entitlements + - plists + - strings + - others + - [code_files, interfaces] + - folders + structure: + - Frameworks: + - <:project_name:> + - SupportingFiles: + - Info.plist + - Tests: + - <:project_name:>Tests + - SupportingFiles: + - Info.plist + - RootFiles: + - beak.swift + - .projlint.yml + - .swiftlint.yml + - Package.swift + - Products + - file_content_template: + matching: + .swiftlint.yml: + template_url: "https://raw.githubusercontent.com/JamitLabs/ProjLintTemplates/master/Framework/SwiftLint.stencil" + parameters: + rightholder: <:rightholder:> + .projlint.yml: + template_url: "https://raw.githubusercontent.com/JamitLabs/ProjLintTemplates/master/Framework/ProjLint.stencil" + parameters: + rightholder: <:rightholder:> + project_name: <:project_name:> + - file_existence: + existing_paths: + - .gitignore + - .swiftlint.yml + - .sourcery/LinuxMain.stencil + - CODE_OF_CONDUCT.md + - CONTRIBUTING.md + - CHANGELOG.md + - LICENSE + - README.md + - <:project_name:>.podspec + - Package.swift + - beak.swift + - <:project_name:>.xcodeproj/xcshareddata/IDETemplateMacros.plist + - Frameworks/SupportingFiles/Info.plist + - Tests/SupportingFiles/Info.plist diff --git a/.swiftlint.yml b/.swiftlint.yml new file mode 100755 index 0000000..75d54b3 --- /dev/null +++ b/.swiftlint.yml @@ -0,0 +1,380 @@ +# Basic Configuration +opt_in_rules: +- array_init +- attributes +- closure_end_indentation +- closure_spacing +- conditional_returns_on_newline +- contains_over_first_not_nil +- convenience_type +- empty_count +- empty_string +- empty_xctest_method +- explicit_init +- explicit_type_interface +- fallthrough +- fatal_error_message +- file_header +- file_name +- file_types_order +- first_where +- function_default_parameter_at_end +- implicitly_unwrapped_optional +- is_disjoint +- joined_default_parameter +- let_var_whitespace +- literal_expression_end_indentation +- lower_acl_than_parent +- missing_docs +- modifier_order +- multiline_arguments +- multiline_arguments_brackets +- multiline_function_chains +- multiline_literal_brackets +- multiline_parameters +- multiline_parameters_brackets +- nimble_operator +- no_extension_access_modifier +- number_separator +- object_literal +- operator_usage_whitespace +- overridden_super_call +- override_in_extension +- pattern_matching_keywords +- private_action +- private_outlet +- prohibited_super_call +- quick_discouraged_call +- quick_discouraged_focused_test +- quick_discouraged_pending_test +- redundant_nil_coalescing +- redundant_type_annotation +- single_test_class +- sorted_first_last +- sorted_imports +- switch_case_on_newline +- trailing_closure +- type_contents_order +- unavailable_function +- unneeded_parentheses_in_closure_argument +- untyped_error_in_catch +- vertical_parameter_alignment_on_call +- vertical_whitespace_between_cases +- vertical_whitespace_closing_braces +- vertical_whitespace_opening_braces +- yoda_condition + +disabled_rules: +- cyclomatic_complexity +- force_cast +- todo +- type_name + +included: +- Frameworks +- Tests + +excluded: +- Tests/LinuxMain.swift + +# Rule Configurations +conditional_returns_on_newline: + if_only: true + +explicit_type_interface: + allow_redundancy: true + excluded: + - local + +file_header: + required_pattern: | + \/\/ + \/\/ Created by [^\(\)\d\n]+ on \S{6,10}\. + \/\/ Copyright © \d{4} Flinesoft\. All rights reserved\. + \/\/ + +file_name: + suffix_pattern: "Extensions?|\\+.*" + +file_types_order: + order: + - supporting_type + - main_type + - extension + +identifier_name: + excluded: + - id + +line_length: 160 + +type_contents_order: + order: + - case + - [type_alias, associated_type] + - subtype + - type_property + - ib_inspectable + - instance_property + - ib_outlet + - initializer + - type_method + - view_life_cycle_method + - ib_action + - other_method + - subscript + +# Custom Rules +custom_rules: + class_name_suffix_collection_view_controller: + included: ".*.swift" + regex: 'class +\w+(?]+>)? *: +\w+CollectionViewController' + name: "Class Name Suffix View Controller" + message: "All `CollectionViewController` subclasses should end on `CollectionViewController`." + severity: warning + class_name_suffix_table_view_controller: + included: ".*.swift" + regex: 'class +\w+(?]+>)? *: +\w+TableViewController' + name: "Class Name Suffix View Controller" + message: "All `TableViewController` subclasses should end on `TableViewController`." + severity: warning + class_name_suffix_view_controller: + included: ".*.swift" + regex: 'class +\w+(?]+>)? *: +\w+ViewController' + name: "Class Name Suffix View Controller" + message: "All `ViewController` subclasses should end on `ViewController`." + severity: warning + closure_params_parantheses: + included: ".*.swift" + regex: '\{\s*\((?!self)[^):]+\)\s*in' + name: "Unnecessary Closure Params Parantheses" + message: "Don't use parantheses around non-typed parameters in a closure." + severity: warning + comment_type_note: + included: ".*.swift" + regex: '// *(?:WORKAROUND|HACK|WARNING)[:\\s]' + name: "Comment Type NOTE" + message: "Use a '// NOTE:' comment instead." + severity: warning + comment_type_refactor: + included: ".*.swift" + regex: '// *(?:TODO|NOTE)[:\\s][^\n]*(?:refactor|REFACTOR|Refactor)' + name: "Comment Type REFACTOR" + message: "Use a '// REFACTOR:' comment instead." + severity: warning + comment_type_todo: + included: ".*.swift" + regex: '// *(?:BUG|MOCK|FIXME|RELEASE|TEST)[:\\s]' + name: "Comment Type TODO" + message: "Use a '// TODO:' comment instead." + severity: warning + controller_class_name_suffix: + included: ".*.swift" + regex: 'class +\w+(?\w+)(?:<[^\>]+>)? *\{.*static let `default`(?:: *\k)? *= *\k\(.*(?<=private) init\(' + name: "Singleton Default Private Init" + message: "Singletons with a `default` object (pseudo-singletons) should not declare init methods as private." + severity: warning + singleton_shared_final: + included: ".*.swift" + regex: '(?\w+)(?:<[^\>]+>)? *\{.*static let shared(?:: *\k)? *= *\k\(' + name: "Singleton Shared Final" + message: "Singletons with a single object (`shared`) should be marked as final." + severity: warning + singleton_shared_private_init: + included: ".*.swift" + regex: 'class +(?\w+)(?:<[^\>]+>)? *\{.*static let shared(?:: *\k)? *= *\k\(.*(?<= |\t|public|internal) init\(' + name: "Singleton Shared Private Init" + message: "Singletons with a single object (`shared`) should declare their init method(s) as private." + severity: warning + singleton_shared_single_object: + included: ".*.swift" + regex: 'class +(?\w+)(?:<[^\>]+>)? *\{.*(?:static let shared(?:: *\k)? *= *\k\(.*static let \w+(?:: *\k)? *= *\k\(|static let \w+(?:: *\k)? *= *\k\(.*static let shared(?:: *\k)? *= *\k\()' + name: "Singleton Shared Single Object" + message: "Singletons with a `shared` object (real Singletons) should not have other static let properties. Use `default` instead (if needed)." + severity: warning + switch_associated_value_style: + included: ".*.swift" + regex: 'case\s+[^\(][^\n]*(?:\(let |[^\)], let)' + name: "Switch Associated Value Style" + message: "Always put the `let` in front of case – even if only one associated value captured." + severity: warning + toggle_bool: + included: ".*.swift" + regex: '(?<=\n)[ \t]*(?\w+) *= *!\k(?=\s)' + name: "Toggle Bool" + message: "Use `toggle()` instead of toggling manually." + severity: warning + too_much_indentation: + included: ".*.swift" + regex: '\n {0}[^\s\/][^\n]*[^,|&]\n+ {5,}\S|\n {4}[^\s\/][^\n]*[^,|&]\n+ {9,}\S|\n {8}[^\s\/][^\n]*[^,|&]\n+ {13,}\S|\n {12}[^\s\/][^\n]*[^,|&]\n+ {17,}\S|\n {16}[^\s\/][^\n]*[^,|&]\n+ {21,}\S|\n {20}[^\s\/][^\n]*[^,|&]\n+ {25,}\S' + name: "Too Much Indentation" + message: "Don't indent code by more than 4 whitespaces." + severity: warning + too_much_unindentation: + included: ".*.swift" + regex: ' {28}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,23}[^\s\/]| {24}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,19}[^\s\/]| {20}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,15}[^\s\/]| {16}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,11}[^\s\/]| {12}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,7}[^\s\/]| {8}[^\s\.](.|[^\n]*[^\)][^\ ][^\}])\n+ {0,3}[^\s\/]' + name: "Too Much Unindentation" + message: "Don't unindent code by more than 4 whitespaces." + severity: warning + tuple_index: + included: ".*.swift" + regex: '(\$\d|\w*[^\d \(\[\{])\.\d' + name: "Tuple Index" + message: "Prevent unwraping tuples by their index – define a typealias with named components instead." + severity: warning + unnecessary_case_break: + included: ".*.swift" + regex: '(case |default)(?:[^\n\}]+\n){2,}\s*break *\n|\n *\n *break(?:\n *\n|\n *\})' + name: "Unnecessary Case Break" + message: "Don't use break in switch cases – Swift breaks by default." + severity: warning + unnecessary_nil_assignment: + included: ".*.swift" + regex: 'var \S+\s*:\s*[^\s]+\?\s*=\s*nil' + name: "Unnecessary Nil Assignment" + message: "Don't assign nil as a value when defining an optional type – it's nil by default." + severity: warning + vertical_whitespaces_around_mark: + included: ".*.swift" + regex: '\/\/\s*MARK:[^\n]*(\n\n)|(\n\n\n)[ \t]*\/\/\s*MARK:|[^\s{]\n[^\n\/]*\/\/\s*MARK:' + name: "Vertical Whitespaces Around MARK:" + message: "Include a single vertical whitespace (empty line) before and none after MARK: comments." + severity: warning + view_controller_variable_naming: + included: ".*.swift" + regex: '(?:let|var) +\w*(?:vc|VC|Vc|viewC|viewController|ViewController) *=' + name: "View Controller Variable Naming" + message: "Always name your view controller variables with the suffix `ViewCtrl`." + severity: warning + whitespace_around_range_operators: + included: ".*.swift" + regex: '\w\.\.[<\.]\w' + name: "Whitespace around Range Operators" + message: "A range operator should be surrounded by a single whitespace." + severity: warning + whitespace_comment_start: + included: ".*.swift" + regex: '[^:#\]\}\)][^:#\]\}\)]\/\/[^\s\/]' + name: "Whitespace Comment Start" + message: "A comment should always start with a whitespace." + severity: warning diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100755 index 0000000..e5efd5c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] +### Added +- None. +### Changed +- None. +### Deprecated +- None. +### Removed +- None. +### Fixed +- None. +### Security +- None. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100755 index 0000000..36a86cd --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic +address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a +professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at github [at] cihatguenduez [dot] de. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100755 index 0000000..aeefc3f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,20 @@ +# Contributing + +Bug reports and pull requests are welcome on GitHub at https://github.com/JamitLabs/MungoHealer. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. + +## Getting Started + +This section will tell you how you can get started contributing to MungoHealer. + +### Prerequisites + +Before you start developing, please make sure you have the following tools installed on your machine: + +- Xcode 10.0+ +- [SwiftLint](https://github.com/realm/SwiftLint) +- [ProjLint](https://github.com/JamitLabs/ProjLint) +- [Beak](https://github.com/yonaskolb/Beak) + +### Commit Messages + +Please also try to follow the same syntax and semantic in your **commit messages** (see rationale [here](http://chris.beams.io/posts/git-commit/)). diff --git a/Cartfile b/Cartfile new file mode 100755 index 0000000..28ed585 --- /dev/null +++ b/Cartfile @@ -0,0 +1,5 @@ +# Handy UI features that should have been part of UIKit in the first place. +# github "Flinesoft/HandyUIKit" ~> 1.8 + +# Handy Swift features that didn't make it into the Swift standard library. +# github "Flinesoft/HandySwift" ~> 2.8 diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100755 index 0000000..e69de29 diff --git a/Frameworks/NewFrameworkTemplate/.keep b/Frameworks/NewFrameworkTemplate/.keep new file mode 100755 index 0000000..e69de29 diff --git a/Frameworks/NewFrameworkTemplate/Globals/.keep b/Frameworks/NewFrameworkTemplate/Globals/.keep new file mode 100755 index 0000000..e69de29 diff --git a/Frameworks/NewFrameworkTemplate/Models/.keep b/Frameworks/NewFrameworkTemplate/Models/.keep new file mode 100755 index 0000000..e69de29 diff --git a/Frameworks/SupportingFiles/Info.plist b/Frameworks/SupportingFiles/Info.plist new file mode 100755 index 0000000..d725449 --- /dev/null +++ b/Frameworks/SupportingFiles/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Frameworks/SupportingFiles/NewFrameworkTemplate.h b/Frameworks/SupportingFiles/NewFrameworkTemplate.h new file mode 100755 index 0000000..7c019a8 --- /dev/null +++ b/Frameworks/SupportingFiles/NewFrameworkTemplate.h @@ -0,0 +1,15 @@ +// +// Created by Cihat Gündüz on 27.06.17. +// Copyright © 2017 Flinesoft. All rights reserved. +// + +#import + +//! Project version number for NewFrameworkTemplate. +FOUNDATION_EXPORT double NewFrameworkTemplateVersionNumber; + +//! Project version string for NewFrameworkTemplate. +FOUNDATION_EXPORT const unsigned char NewFrameworkTemplateVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..3c7cb0b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2018 Flinesoft + +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. diff --git a/Logo.png b/Logo.png new file mode 100755 index 0000000000000000000000000000000000000000..471d55a7d3d16466a4f62580c05aa3590211563e GIT binary patch literal 41168 zcmeFZV|OOe_pTe~iESqxb!^+}*tV07Z9D1Mw%xIjo3uDcDU9%z-en}v};=+P}fFMXoiYkGCfJOeh9tA-CJKKBp_Je>xAXtisC`gHj z5Gy#^n_1eJf`D+w#Hi|8;H#qZcQ~1o{g_s^VGVIE6F?wGNK|9ZZ)*43++?>)kz!vX zJu!K@nob*==49#k%$FBa@Mb#8L?7&F^(Ur!L|W%>Vn~K1Ut1ui;%|BhQaFh!IZx+d zNw;jT-!i@OzR$kS@w#d=zlJ<%tI$YEKnKOlsG-AR-g63z3+JPW4-U)2g34D{B%skP zmjz>&hjVMz-WKWi(qCQN{K~Cv6(_(Tb|5lpJSu|=j|06aRh@7J^?XYp5;)T$d@?#| zWfB}@@cg@LygcBAqS8-6L;!m#l2Vl?I)~5x3XFVk|0Yv~R zeq$@6wglx`RHtekx}rO`sJc0l#P>Lu{hoG@E_{aLcwD(}rLrP%D67wPu$4{g?v4kd zH={W0a$RttM2Z zVswoB8eQAj`K#j4G?sU+cL;lBfL}L4BMc-}8e>=&tegfoiV2k<)HdddMR^b+6f=4? zI!>g1z8MzYaWC&3cT@UQUw41f*XXEz(Cgpnrk^HZ{DGJaxF4}qnDeH$l_5IDXac^p z9AE+zIK-%{K{I;HQcnpE%%G$mk-TzGiTDj@Cf9E((l%mxyc|oPozW~xC7EKITumK$ z2Hz|{Wp$L7t7s8hLdhnm-ywCoK8E${bxvtH6kGOivfI_CU-e(lKbW6rKCFs%{0`J_ zTOCKVCOaBr2QF+hoZM7#ZK3utZ)VenB8CX=9c~ZQk;Hvd#?p^#A9Q&&?dcK4t5PA~ ztX|b{e#MAZJp?_3HPLoa`cQoicTM?>`%L*v`}FC8CGbpS?|1Lg|0Z(MAAYjB$JN^Q z!t}syH9t+Uu97Apv%w(5bnIu}RWxM2ql5<-3oEV!q*R~3W9BmC@DU&y6CIVl>vYqr zfkwR7gFVQ7sj8}+{!XGMP_vig>=r_c{vl!#oy4y4{8#-xpEOziP{|TmnMWC|ynaCl zDXg)?HP068{exh!+^#|CY|ePg2TXIG+wL4;3d2oiF3||Lmi=c+#@R`D8FuKXY^;TH z*qW^t9_01bL)=3qa|aTdHoZjFJA7}q!0p95{a$PnND97xzzCTg_RKi+79{6=@LI!q zA3=hoH{8y`^Tkuo8?(Fb=fdg6pi|W`oqsb2Pj=7tweu3c;CCg6d5j-uUaq&Qg29*l zzxe^?x1^>M2nZb7e-2QPj4W&r5J3u=8% z^A2;$hso(WxbCk@8#i_JkL61BTD`6c)IbJte-r}IT3x5xnzSO(n=S2_Uho~p`=*P-e8a53@_AXI&F0GIA=P*N6n_l&-t8K)QO+t%eom) z?tbJbuJlx$SQlps2JTO_MWZ^CnEw8)kOu*c$N~N(FR05=|2&goBj*h>h1er8z%Bs!;i{sWZNGeD zQx1>ZM93ijAop_?=c~OCp<48d{l^0X+DJN8tp2^*&9&YRYuJ@EJS-eshk|Euaj|I! zv+l3TL*hE?v|kg{*H_7C)aq2lo(oWcjS07)9qLDJxf=zA+KQTLYi`eDOvgzmqqJZc zrp2ipQu%px>)58)-wQ?U(72By8^MMG9avyO3+ZB=~=J(v7Ua2<$6ttu&)%J+B8>feN3<0 z^f- z*&1u)4(l{ljNdPze{?u1oFDMGh>iC!t07 zj^*!nf{S0Rs!7%FnV&p-Zl`nm*yIlrLf|9*uuo!Lmm$>>&a~VcVD~{pH(xCj4Y^bd z`t|h8RgbZrxI%cTDoNEoX&Yr%JXo$hf`EN#^e61WO~Pr_@NX~brnXhhwV)MW%Sw!# zs~~8kCtAIaTa2=A8RP*&z&zqKPr~(KxL5v6B}T1g3^XQ1)O$WH#nU|cE)4ij2V+wND(C0bBC?( z*adH}NxQO1yU4*S(B8daX_X2o%^B!2$rL%zalU-a%^&oeU(wF}UKXSxx+vnH+7di> zk~1H3bBnp6p`~sG*9e&{Isub8Q8!%y@Af;E) zgBT;3S`zIqAXDue>#e%;S{H}?s%yuka{q`Z{AeTyf#=KzeTY4b2!jy#H5?QRmbQNM zVsIy{@6~{PsUfyo0L*7JqIWpPbo)EJF*x?z<4TBa;9<&1tQhxYo&1IX@)c$=9>_ zy_bL8W`>)u+27S7zxkf%XaMpVz94CTAb>IUzTz~AX1_21m=>eu#~rBVt*NeY+UK?d zcQ{koL+#NEDLVQtT>-N-=Q!{2MnP7Hs_p1*3b?mWl1U5F0B*bx_z(Z)T z;q<(KVo+V5peM%c6Oac-e4i2iGD-S2IM!yO9|>`@;={%}Paf?dg9nai>uy4Eggrhd zv#Uf@BAxJ{hYAL-r0&xQfAtYOUnxT%)aI?Mzy(}R=PvtKnEG-BeE|FTcOtiTTMeIZ z@jJ4>FSVv}(gGjvcBH0l*o5hdd*~jJsmF#rR%oYWJjv0K;iWw+QFnD8ybqqeGLY+z z4o~w-H%Q1$q{e>Ht-g19MtGO5!yJ7LcO@6OOZnfqp-+u4mma7VW&kMv!uT*QhHu@Q;8OT9MN)g6<3 z8T>{W_VHz`hhzGgi$>ni5s?m=>$O*ux=!oI${nTvA(w$KSU6tW^VPog zhIvj1U(tAj&_tyk(3UNw1;Vj5m(BCp)LIm3`19%2Djh30SGzCXUV`#5`6wav;LY2< zTBE+do{7nl@gWkSHn9X0tnU)IBp12hs8I}O$dDT{eChzm!&awO+#w4BlpCO#v{z}9V zmgap_Rs)Lfc1%e3uaOI+K>R7FZXrPn1-z@p={+q%vBQtA(LxG73K|IkAydn}Rw0`L zzpqhM7O(RLE+VzzusH{{`_E__dLG71&hn!hp?Qnankz($U*Ter)TCsOUBAFy8a z6jod+@+%!A@o;f%>m&~78muo+h%z$YEAzBl_nkM>;P5}@Xyk)azF3~~-LmCz^G?2Y z@OoWXnq0sq#+L%0aCO}RrxBmdhi!nLe!!A;wUp{YA?rf8+ceIAP)|XCH{xBREXa|lEatG4};r*#{^TSn>wciPyi@$#Wg*=wp`L3}TAl zev=x~9){b1N+lNJ1$+n0*v$pk%EOb)!Uqt%rRM&&*=Av6_Cb_ARm-TT6N4lq*8>F~ zU;XQGpYHmsF>^90xl;+ov=!`iPPg8gi$77jNx;`n9IfQ$x?yfVf?m5R@5C>X$c{TV zM^IKdHbS)iJbLGHo)bqwg@bWE5`;nobHt51uPRm_Ecz49Fb?rp)?X)rh5jm5y?d=4 zq=fb`)F$`%g-W;p2OYj0;;iC4VWy>k-rd^cP<-yLSsa&A6a{sP(cp`wD}y>5rl%%e z`~fZ~+zXk(l7UhsskVz&YnA$koIw7@Jlig4SDDY*hbN5OqGo+ca`hYRp)O22Gn-h7 zR~3(CNc@#=(U{<0`}{GIH);0-S8(SjYWdqgn~l_?G`E<07t!T=$`;a08S#>ajO3aU zE++|VL<-mM6WPr_f?qCf#rWq9z#MlpfOm8l#piExP35|h(GR&N1h~afOq?EYmxZ#* z-Gww-W$}_3yt>%6LTTFRshK`1|2$1g4}<@HvHA34;n;g&fEBfOZx;mNsWAMxXP~y* z$^iXeTSQWSh6$2AlXd&F+N?7vVJ#}p>iM4i**?Aak87YVua)8R=!Mg~ZOsW-FX|Zp zt?$Aweo(kw+9WH85hOn{P?Az>v*Y?U48z?r|GZ_IRG{!2o#rsx#Bd)lcohrzuNJtO&27YPXHvK>_U#rSBXEzW$YtOqeNOXM~7W{&*#VQTpBk_BDnDf z-+u&8kO6U;qcEYi*M*>6y2mHJjCuPK`%`MQgQ(5ga9v<{#4Vb6_afc1aYLBc?38$6 zaq<1zS28y)QmLI`mjnU^FWs8B?Ej12+J9THyb zCO~xfWQl2T#Cv3Y{S5Zlqvb284iV+bK*aU@e6{5BYoRr0VaX3Pi1WA$LnFRIGH*C% zKKNb4%?6kEZKKzql4cslPPzG}%rQ)q2c%c}N4T}zOhe`y{Igp+fZ9l#A@K&LadLC-#JItb^d3>r3_YzJGtiBdse@S=H ziILBb&V3BBoAz?19tu>Awr;`;+W8ZAZP_$MyNRcTWuU29M-V*9Vw-FeSTf#4$OQs^ z+-0z4_^VCgE#euGH!Q&YjyJ=+NINHO|DIpa0asXnPj4fl8wCj@w9)@i2@s*)c|Xn5 zCu(>iDQNTQO4$FxDCt9$;Pve%IA39P{qlY#OGS`zY(we$$< zMLT^?kjObfXpIGO10Ukf;r0d{@9^P0xy9iiKo3EjQ;^6ra0}~7eix)aHgg15Ffe9! zv1(-{*a1PhVK}Pkv29q%iv!=X!`-ysyVhf4;IXc=n`(fP1};6g2nbSkE46dNj~CCG z{W>drXW*>iO7yiFjYrT24*Z?&@QU*c73!IVN>Ho|M(Mim(ptC%T&PzJf0jm$_;!uO zEKeJ$Ch+n?Zo{G3^%UvL=|wi|h11f|4=b%HGo&XOF5a+z2c>9E2Sa%wLsb4;M!7JG zOS9v}@ZckGytOqoosik2(Ek?>v(@QB$d!NC@>tQwVIn>*;-zijw13t6+y*O4xP zC0bY-BWp%HSoQjGi@jehRWA{J!0m$aZ0_0xi_+-Lag%=H^qwJ^yqUD!cbSs(1{zIN z#1%OvW?te!hBhH)RE`+CirN{$;|>7Jmpw#j)N$#&l9G#yuLHS!;KX?ruIO1`nK!rv zky&GI3ASw*q&Z5nT~ zT5*-dS3+xY26ne;c(tSh@tb&_ zQRyHMPA!Ol#G$7Ul|}Z^DU_{tCQ({yZC`9vWuGj;WlTWXxY*)8S3L8Q&-_nB@Os;G zVE5<#Sc%J2o#DM=kM*sSfz{Bz75D9Q^A_56vDEuYc`w@~*|izAF1KY5Kb=b3c*xF^ z*-zZf3);AHxdrFNGH)PzhBI2VY+cX>R?tOlflt&qMKM-_RsF|~_9QDc{8VHfeW;+4 zu1Zdzt!avSkX#{hoe-h0TelV=7*j;yp=q)cdIU&JD2V}lfXbh^p!Gz|yQ&vp1R@xX zJA-Kl6}7$yp=W}>!BB)PWw_#i9#^+64)!_-;{sB36W<)Mv1^)!CDY}2Z*U*oq2Pyh zFv_hO%~aAgkUzhXpEWu6#&f!%w8MA=@kaK3%^wotdc8-?i_qZ_nA+idbx?R(WwCAC zmaohRIjONdt7%6Oqg8dCaD}X6H6~}(pUj@{@iW=f%0>at_GGi&Isb8_5xPaER>N*= zqp_ihV~40Am~#wPLOC28-OwSFlX}a_s7L=Byx%>6Qdxl&(nT)Gzk7zXIuk>`(5tIt zu96Ek<^d=xgk-EBUcOy>|Vj z(=d_Hg+oZV1rDHDA1#h!<5$AketGV%k|F&tu}t64_tde$N>?SbE&>~Db)G`T>;E6|s zY?I(xy2`Dy!w1IG*WsM4L_p+GXw~iM(ktmac9{?h<{P;xrH@Wl{>Tl10HtVtO_2DA zl^F^dJpSnj?Vm`{8_BX@SlRWHh9k$KO>C=v2vv?J)#z-d$n-5%jH-H;9T7B9w#!yQ zR0-&xFV8B30bYzWCi7F>cezHQynTmqAv8~_b4w>JNm{gn6MmLq?OJaIjM7DiE#^#W zz23?EdU!QeYL?$dxi7Hpuy;4i-U?qG3=3Y%`2EHg5R(p8%R;07&xiu8+mnS3DW;?{nx=`s~qQ(h6YNkE&#{bXrkt=#5%`TS)6 z5dFC)YlxiDS(hhyb@EczptvCpXHu}bVwk+abz^q$!dv_2n?lba-Jroi8&^#9tR2y) zI3T&lYjJ7Gl@(rILRJyWV%*<=E)Gp--=^-+O8DmzWX#%=#`a#DwH7gft8I_ilG^vf zygXN4x%=4AM~mV7k>lX(z*YXIo)_I(lgm4M8bIMw!2Vl&W?{_xW_P4loUX|&jbN?$ zoe0xsQMgO);YrPev%k&Cd~;0L5@|K${c^qa*w)Aj=d}9tj0y+O)2+Y_N>J-rQyJKSaY||fM!~$6baUnxgEsbRIT0mBnYuxj4tIv zj0#w;)wjPxDL&0sFboML@k&*%B7#6mX|Z51b1BLR6(%AT{S~X0U`5nmc&}zNXzPyY z_o&Jvy7uSNu7v>U7s*oEYh$8N@8}P6^^mW zBXmE;D18Eqy(V*cpa@wJEbT~fcQ`;K2;_rvc2{jjOZ9ye?SWXkC5W3w8WyrVen$m8~g#f?vTiZNs!-tw(Y3e}N zN&|KG`Lj_KrG_Jn=D`>o(4%E1*BLZZeBHnrIW{OM(ZBnURN5Pd6bSNx0|8=#Ud4B* zh&o@J)3Bj~5UF~cVAxb|2lkaMi#d0O)g?_oe$$+kv!02{w8wPWd*L7m4o27PAT=}` zLpks%_s&5^1tlzbcfH8{+>`u-EH-ai||8Hk*a832tIBK%b+ruhyIoHr_qFq7UDRfIxTiHZ**~EmAr{k;8^5ba9 zIr9&%i63BcW;*GU_#@f)VA=OPTbg?H`2yU1PEnUPe?3S`#L5>r*V~TH5(2x5jXkVWHDJP>|BHR3*0Ffz#a>rI(*pO94?ywtn=5 zpdlD^HDbHaCNCZjv-I=zqt-iZ7XKc<0$HwEwy^R$rSrI(F;BL(1JW`JyDE{^`7+Yb z@TQyb{Q=VWyt|QdVHWFbfSC%6de-@uyiwSa3 zr%`4mvgn8az4jOGiMBY(5Ea!VJ%xcb)->VI( zlm*J$+J-!(zfB&IJZoB`3G-LkZR<#TI(#Jbs5@)iE;M%8Wzqf2vaN&>2ZlHNqAubs zL6OD1u=)sCV&8h06l{pdV=?zk(s-dW&CG+vwIoS~!iao@*vqMPIVPbuSOI?_8s0I_mox9* z#K>CxEgwP*zXwGn%RYR%Ly2z4Jxoad$qDn~5Js%tsp*cWf2@!pWmPJcZcznp_U{)`lw#z7fMf zA0vXoSt*?NkcP7{gwChg=$2n!iotA4gDbD|L4cUtuX0vuBbzc-)Ys=2GMkcCA6Ij# zJ|6WdZZp!}`_P-k03Rxybj3U^hwMByG4(Mt6TzXr$Je@*xLEr5Pgwrp690s6pmj!Mz^{%< z0-%e2W7ZqNbbz5tZmjz0O4rKRzn96+!q$5YZo!#5*2vMa{ z4B7myU{7h$AE<0P#5W0z$B4`uRwszP6(TV0Iq$(n7N80L9!hr{b#5AgR5`z;86=M@ zZ}1o8>1>HNwU8IRtc0VC_@YNO2aRq4n* z)@5efYrT>mM4>0kku$WKKoE?{0R1dFeq9$r^<zJJ29V0Y-gBNHOKgA45`gf5W+M@+8OWC1Lxes82>0RE#{IzQeCV z)ckl23X>Q+Z#@Y^8_iyV3Jbh{U7)jmfyu|?G!V*NaPjdsbUFgorg4FzeArZki8&hc zcyMRCny7hFENM2Aj}LKOtfmoT=YL`hQeV~mevnYD9z>7F1fi55V21G?Q(R!_d(Xmt z@fy6ZZ@#p?_tiY5u523%6b>8dI75(~?drb#T|jp#v1$lj1>pRBX zI!KI~1y?6qzD^`K6ee>g^hsb)0+*|z6^-CJCG(snz#M!e7okXuj%tEP>#fO2sWPW{ zLr@YDEa1x7&1(_ru|tSVd*f|;@ymcgJ?iv$6*!pfFSj!zN8zLO5G*u81rONbn8GxI zC{ZSs1m-15wWu%WfbPyf%T)diBozyBw~U(>06uYZ$AXJOw<^1y-DpLdh`wg9<&sU} z<#nAW@_8+9AmjBja|2UJTm2)G_3+)6c|ki6Y-Wp|jUp!$`o2x(^iW(5x%FckUOO8D zeCSw%p7XE%M1og(e#bJdmR+aujwGnDbmrM;?2xSU^Ljny{*lUgA_*2J{Lrd-2J9D) z)&UFH`y(gS05aZZD5nBjJn43MU%x_#s#YR>gf11L^fOoZd#6IO0=O+pe{y`#<@Ai& zHvymv%hnUVrwWuQ)dL+&@IP`q{`K!k-eIXy|5(V&)>Czl*Y=V6I#WV5;VlI$70Thr z`Yp^Tn@mI>zuOU{!GACUB3{FM!mL9QRBWYFm0Ew8ouECN*j8w+cLM`+pxeiY5TMQi-{z6WwfcIAzn&z-pDNKy;ZKeQ z8ztBGlG-%k(Y1bH@E3=~)_C*fUmCPL;~tb_Vz9+QXmXg6fMPyAFrQh<#4^yZ*%oC6 z8@*7|Xv@t9aOC^A4&3I*58o`Am@ha;cUJf^tz{n>6x6K~*s;vD)xEzWONJJ9e`7R^ zIpaAlzk$b94moT+i@0ZQ6;E_S|CP#yI>qx_y@T(^6z1a$eHw8=tJ#`?Ug63oS~=gc z>+jX?hCN{*i+cu*09 zgD-)q(HGQc|7Pqo7?n(HO59(CipCX+M{k|W#0_#MCnY0Mg$2%+BET$OsBQt+cP4(E zYhK+*Xs`)W(2!JyHi2^)-Di$Wq9@y|rm#0n@7)4hUn4 z!~7TEC6-|ZU4JJh5wy)tbPQL$aD|uH% z*kIAQ$(Bkuh}>qIKI39_VDBSKZWV!W63$dr$3l0l9ONB@kfnYeC|RDNKK0n7ab9tGJxiioQ9M1Paz09> z9^k}}KB~54{?@cSZEt`Onw)uj-`)f_gUT1#xTcuA zItWX%cCp>e1a|U;$^BE68u=L-nrb_xZ4o5XWA>-p_q4YgA`#TVu5IKj%u}ni8^hJo zD$lZkoMnEl^e3(*3xkfdMnA2DSB;q;H5@2#f$??A#WFL>&M4kc&iDG<1dz(Z-^0`M z+twM~pg!_6fcE$OjWd?>k3N|M#Mr#q8d?VJcaV-BHn zzub>nc+Hmh=WgV`Z1Po4663#zii<0C>Egq&?AyC% zR|nHPJ0Y}+nX_0~JO@hXjtvgnY5&e`xdcs z?*#bxfO<`Ho?0BR>#It{K-ktM{ugey^hyU@dLsk}x@CAOMXIu{y>Rw`tWjA$2n~D; zJH~aQ&HJx!_ip4s@3*6L-be$|{9rN&KbJJY7m**f!sPZmOs$uvtC7%fR14kiUz+K4 zqY`=@3=V5-73;n?Tah*N#s5BO@PB$2hG(7;50Q%2x0laq>`s**k3U`uhHDwN4RxS7 zg+T34Wht@1n&N|*ePAQ@r3kKf?u5$tmRjEByV|Z#HeGN}_l{ih|dN+ z1=`}yQC$F3og*J&{_rA}L1S62*48F;l>N|0(_{cEXAz9+Q_H_hLWM3k;9cP!M)oqc zcxZ0>&Z|@qj*ky%=XRcGA)tz4LhqlNZ_?}{v?4BpVkS<^&6kVj{8}kAA6d7-;emLu z_UBl8vr-?+q)fxUJ~)Cp7jnXo2KEyH$A(t4Z?E#^B=SV`giDC8ggb7@W#rmXa$q^S z$v)%j0Ifa!dRLYJMl>O8viP=JUw_Mt>0L-a9^ns#=t?Tx=j~C>tZUdK{5$AU?GKJA z1%bfjbTi^xpS7O7aK43H%07xS6NX53A2Xq4Le9)}?0lJ9z_is&!QOqV(XsNyUKhFd{~HzbEiJT1But}`mYSBQBe=F`9rt= zf>8g%qHFyC`$5$&&OnY}9Yu?5ex@ELsDklSONasWzmw`9YWm(x|HZlfcii>A>z5aU z|C50I_r!p3V1n^~AhG}5H0D3xow4jn$p41Fg8**$BW0ofyG^uUJ2LRV*~aDN+F5Mm z_W!KnzpVaW)b{`0{U43-|7(W;8&Kluc)YTB{%6-)K||)eF2Q+!2^tp4soKar-gJ6= z1YbFbozgGQ7>k&_3D0V5-rUcZ~NE(s10}L;ZCFf zWpJ?tphCe!ujeFnd#0bPrFq6dL;nv(A4W9&=F&G-ys3;#^;7GB?xzxtHIWzWFC9cm zu)#tbAX&cC6B#+ABXvB)bxlW^0|@(>L!ZOHYC)sO zpjt6{q~$84Nt&d|7rB8Wk+iiMS5sGiJ%7!Hd>v6Ow~5JLR4=P!SDo*f6!{^GpLGd# zaOIf-YuEf+p2@fLXU;b)`?B!pH&*dIKG^>0K$myRLM$W5GvHr?&+L0RtYjzZu?ZtT zi^~r+32ldHo@3V*@K=B!Cyi(6VYtHCksptJdAdE|wVoF%VF=IvOi-h~wTQc` zvRJ0@I!qK3vC7Oa`?(8^HD#mQF~BJ#KL}l)f@n1p#_y~r+5#W}Jd#>{@S1M`v z^>*Q{AB@)b=c~ili-g?)@bVG@hK-#Fq}J+La5BaxT!`If zq&c~=q@ZX;NJ2hs>ujIrkAmHv!6-j6qd0=BRTprQ^y$ zCC2%Xj3n~=(%82RmlaMz=wDeLo%wii{&l`sBidQ=%pe6F_hn0kSJO$v$dnFWO;ISE z&%@AO5P^L?0e!l#xYJUkua|j=V#1birm>|z2-Ym-Abhk`d0}Io=mBB2e@113)TyQU z=2&dL782}PIq#IYQSv;s{#i^aIA&!EIf|^I`b56q_AD2v({PbKw8BgQ91BHZk z{m@yxZA7%jcuDk?cwaJ?sz=yU)hN<88n#m+Kv*wX;v0c2oJ!qYzt>LY=Mt20v;O6( zWX_f%g+$M;*=EJlSrHp|BK6gay7Q7_7gamsvFG&o8k_4NwmtYZwIber484VV+X{Q( zwHch9d=K6=R&KJ;Q)xkx(&?=>^g?0BbK8WCgC(>qvIx6??-tW~n8_j4vf4e#&T7Uo1}`JZLd5-@Qq9 zna`2kK`#3SNkL~+?+zkTJd?>a6?7OO-<6HpTdsu&`1;pK;M$2{)q8VE0qY60 z7Emqijx8gpEK`?b5GCb<%-?=}{=b^%nzpCdLA69TWJr)d00nHt6AiR)x#*1-!X#UxAXQRg756GAZzb=2i;7Re-X2aM!xn-o}oYK>jKG# z3d?P!ZyDfADd{@x7jS7}-Q94}5wQjKxi%PLuVz#*y}@z7n4>=QEGp*6ng|99lj+w3 z!?66Z;=6860X?Z0(08AbV?Kpp+SgMq@|^ZL5z()zJMLbc84~!Z>(t-JJHrUN=Yfv; zljlSTz*tD8M=?{Lk`-ZD`E2Wxy$xUEDE(y3ocairVepX|?lFbF@+a0)oZA6JK`+t! z^3u%}0#v4lT*hoFM;cMjQGh!+XV#8C{Ui4r}xFbP`Q*hbm6@M%XpD+FP zt6Y^JJE;F>>vhSml8;4WMKpHO=2_(!ewHEW2BND6nNp z=Ak}COXvm2Xg?CU()e&8F78}P-VArEt)y9*%_Os(V9gQic3(6L59GULHVs`Dgnl^( zw3JUqFhhu>(2xK|j6q0ksJgLeJp^GYi?6b!9{X0=q(j^4wOP5cUQq1vN4E7$bcw)J z9?YdY`x%iA98kzv1*$Z{yB530XHoD%(EUhzK|I?ZKMImG;7g{2J-)kspGj%~F`sdD z9s+AiJO@nU1MEb*pThpB34ZO*i&D!qv3QIFL@c_Rij7E?-$Wq0o^Rps7r|;Za;(+( zwrurQm*c*`Egi7hAX1uzXq|Db_)S}KWeIuk%lw+GR2Xm7!`8>VWxpg)xx~cv@-B*E zW(3Iuf5uRMhc7gUM^y?5@#(o6Z5ct37WT^cIKm_>;08V*5^K)sK&*uY8Nd)2vRs^( z%%8A*zOC-XdYyb|45!7dk$nMYgldFK%}r{ zwul{58Tc$Alesw;*6Z&uFM%VCuFYh2=-xin<#oXQFEe7^mB>YgBP&w%V#nhwuB=d; zUA@eYpz`W_wZi2~u3l~Z8BhHKlUsOwr@zV1Tg7_6gIra_1K#E>A8jZQ0>fsJvPXh7 z$2K|WI$H1t*yjjVTqw?h#aXuK9t7gKvi0$V(DLdIt+=; zs}H-zzv|e!O;T8;u7np0sq1ukwZvkB+F@L94_#!=alJyzX6wDBNRTUCoE^W>;572K zK08ebDE}-pIV*Ee^PF-(a^vq{bs)clxbvYUjv9HW6rp^Q9&2I>Vv~RRQnEr45q{>m zlZJy&N(0l*3JId%Jp%Io={Y+am$?uoRc#;H=W^&3k1s!R8(X&tb=aav=8#76b(h{ zI&b9)5v`}HmAfJ-hmAm|obBSuCTWg>H)QoVG<@)GtRw)H6%Y0xbO$b32$Q~2>T%kS zmvP8k;js-KC-MOcx8VBf#!;{=%ai}+msovDJU&=_(=rZ)W#iijlcqmOdJrypR0xxj zgXFXUDLcCoa+4Qx?KtNWsCpQ|V32{q@b)v1-4SN-=~3vi$ZJ53FnSvSv_y$SI?|^5 zMv|r+(hw|GIxLOdDxSSF2!!p*&ykrlOt$TecBX&yGU-U-I$rXaVc!|n;lp}yyycsK>5Mp!`Kwbwbqh;-1u>{}Q z^e>_1O03y#$5?x5JyWmktH*JcBl)%~<4o=GxTcY`k;G*V?6L{$+0ra7#55ELcwIQR zmn4v%TNs~42DgYf_A+t2&;-@S0>4lp5JcoC#7$;cEq@s5a}r;KCOGJ&etg-Lqz@SG z@frkw1TLS$R0~J%#|adJf}UzPTtu2# z8+>Nq3Pn$jharW1kZ^kHo@Tyg6KLwUeM%^=7J~PE5r$HS+&h`4JZ9`8dGBMo`V$qk zvD#wu?&QyV&AZL6Pa(8X#mkQ-4p|%?23l#nsPw_ov8|Oi;f{8L?O~Z}Hw$UMc+IVO zy&OlE^24Pho+Oj+pv$?CC)P|<{R+bY$X{%MCIgFA+W->95P6$EtKQr{5&Mhf1L}G6 zda+ci~S$Su~-YCQ&@S3z~-7ZErdgmzqsEzI4>i!wcnT0)n z;ZF)=iU%Gz;&^8~6(_1JlTw``r$C7`hiSeBf6nwGp;eE+RA% zK27f&U`LS{I_D`rlKqrZ7~sXdx5w!#2N>n9Y(g$$F40jGqKuORgGT zfTcX&!QOclcBRiBsO6l-{-xJdVk=y6TyH9bg@X_|rvffHpDOxEn+`Q$=r{3P-py^$ zY;-mJhn5#K&bR+d6TX1d}joj6#*q3ik(d51??luqbUtPEzF}KYy5k`ua#r6WtUM z$5qtXLY|~mL*|7}{e|Y1%B{TcefLEG(+myti_?T+EhcbNLYPuahTwUf)33rx1>_`8dT`BO%}3U6cVUNQK~)1+}H+IF}s(+ zf}&~oDa1iGz$==v^4N-p7N^j5H`Y7d(TV>S_GD*--Rz^8up>V(0`3tA8bR3CHeBFz zO&a7_F=3CdA~3Trt#|XT#BkiR=^5!54_|Xl&~)d2yBz}PryPQ!k?U(R-O%2#=xlGW zgF%BBbYPcTZg_S~nOW|9X9Su90i`q>Jz_#P1J`EHj@}U7>~c+$+ZtsPI|j@GBYwl4 zWgO9YF$&Sqa?_2Vt$dd2o^iJWn(-3-vUA6Q5a7Za5Ch~@=}NR`*M09oTosP^lsGE< zu0;3nGe0l_DIj1-<6wI*bj)d?-=d;Zf>^2gmx#FcMqAmB+^Ef5FmZMl`*(icJrJNR zyU=lUvvLcbw;o&6)L8FLxi6eL=1Fv3OB`|7d7faN=fH+vnim0^vIgxSBeI9obq9|| zfz!gH3ApSmZ8V1MVEfjkvcQ{rTW^}w!|mL1+f(itsjOJw7=}ZeNZ!&`iL~b;7PdSY zD{V0AlVW{icSgVs0$5#Y*M>zd>m%P8 zfnAJ%3^Z(y15I2;WDhJdaqwu2q|(Zxg{H;k(Z-(3qcc)jvFH!#W^*dd`VL}gbcB`l zEtUI%Y1e*^G=8y%1rx0@-*JM=PCYQp{*9j*fg};=W%utfyld_6O?}3Ov~M`#!10up z5P*^FSp&vDWM9$h@X9YO6M;ychx$w_&!bJbVXOGLz4REs?6BU0GBDD5<~t+MoCv5a zJ*-hgyU2*_0Y2%JF_e~89-Sq!oIDzUS~3PrLl2xd)3#ksbE2Kzv@=p!v9gE}uA>q? zN~X0EFzuz7 zY$v>WA56~&A>adwiwv}t3fz)Pyd0+a5QyY?SeKMmo@bU!$qyYRR04Dqx}b?3I^dQE z*}l~RgzwFUfb`h6$4UQU7CI*#w%$GL139bDed>ru%0+nJUhmdfRR?ZzeCHQN zzy$(^ziwZLHz`VKVB&CV;tOr^3i=Iiu|UEhHhg`>iWcuz;B4O`t#`gV5$HE=`uKk1 zia+Q#ws<~mW#s(YY;O*pX9z8=8bvCVCxYjJD8Gl6BeVq%W>QpbaB8!ao)d011O|>T zzM%iu>HkB!c&Gn_nWr>cM(Pt*$`{rsLJgNT*~2PV?PpssAZj@E4f4iL(zsjS({@)* z83P;W&uxfXoe@4Tp}}#te@aVboqzMgopDa>r_k8F90=%tkA@0ujROYO$^Olkn_Fgo zPs_7X-`V3qSDuFsz1VWYUQQGGjh}g__0D%jzzqVR-R^dO=!nx#yGQ_9L7X0TqLimQU&`a88SuM~7;xNU zrGqK4KkbQ~msLK#M@PU=Vhs4!Y1lU5BpeSqCAzO&=ju^)4O@I=V8d-a80g_FO@?^1 zjBIaY2PxmQ($)<%>)fIz!uu;)?z{87$$}zvT6O-qH^87nnht5?MFV78U3E8yJM6FK z6kWC1;g*IM&8s<%>oJ6Clh<0Cgs9D}bD)*+No71o+g79@Iga92f&i3`mi7-l67S-Ez_wD3DWgb{$@3Hn9rl8)8Jmg}y(U-R(8S=ddZvpr4e zG15N3kh$5*&{5gSuG-LXr4Sgywu`z_kDWi^(L#G(_<7Gp00V?DO+dSLP;-}7Ww+9; zJY-_S?M6IWW`;*YN#Nkox-Q#fdBs?a^6Ld*)zx2BHQOrdo^Wrnpty3~iqRm)--p03 z?W-P*28=&oI67LewTyJMIk^(jeZvI}cdI!?Bda``c8%qV{^WPMUh@o1ms@UpX9VIQ zfRlb4^b0$cw0HRR={x8bTS~QFFlE$R==2}6@&~#d)qh;^FzcP~Aq3DX1}rSlNrpGV zwcK{~y<(Za5WF$WW6{Cr*++I-pYD8^`!Y&lvzL{v=(tkpQ4QzRD%G)0-}&m``(MaS zclsP(%R~V5*3cesl1S*(lIF{6mZ%A96w&d9+eO-P6gikzA|pH+d3W$=sfpHeCy)LH zc;6c?i&7VWN8cKL-_0MIURkQ)Tt(Q*Tv;-0%>SZc0uZ}8++}7ek%U5|Qx{IF{-~h& zQ%5a;+f2(H9m${p<7eDyz4M(Bh=)KV{VGFcgb8U%M762$XnB7{9)4`dqng!!;>=?k z-uVf_ba*3cF!R>Ujfk!q@x1kOF1#?TRY`CD)Gy)q>Ic9JCXe|Fk2hNG5TuW&DO(>N za9Hkq-!l8$y6o?} z6AvF+rNSWb_I~4LoMXN3&i5t@is-ziaHH!g}XBBM=J#FkJ@|(zMKI#3Pvy245!q&YLo9htDU^ z0VCQ-EW99kR<_=7(MQb#NAJqhAS7PF^ox4owf`&52^Dslx!1JUG zcgPFx8~qPWil?n|BM*PVqQhplSF`fN_sk)HetDZccI9o}HsR~+5BJ5$SCeHAd)eq2 zZNR~!!4EPrYw1(DPC-$G+S?<;hX<7Axd6D=w{wz))pL8omN`wXtOe6XeS~umhvPV@ z=OZi5`R=sU0mI5jC5F;$V3e353~L#vB3os(9t_RH8Y^#x5VN2nzRY^(J0lPc0nm)o z)=bkf(&;PRYiFhyc#E)BfKCPgBl;7#56G5;MYRvMV|cR#t?-Qo-L7+!s-a_)ve^Yi zLpgaKg#66$JezQcL3x;F2>cGM+gyVI@)D~eu;_67o-{3Hm5c9A1i&8}+5 zEGW9qw`>>Tw=&{AZLgrfaJlg8kpAb~J9MMhBL<@5-x5j?U9l2R4j4Q0k7>&QN3_Qw zfClfNUuAgGZfi!MX^|%uNTXp&5#Pax{tG5_y$#^b0p))y-nLXWzkB*)eVZl*EwY-u zuriY8X&K{rC~Hif_hiwKTCXP01_xhW) zO@RJL#byq2(^*biTn--Xky=K0v|k$Gwnk}tgw5;&@AIaNUW#&F0a@4*DEGqS>x0J4 zI>eUO-RjX%;0)({FMIq_X&dbC>3oLh7j6*fFdC&phNqg+&O(~zR28(F9-NBtZ)_oP zRXX$0lHxk&mYH37TcFfxWN^_7K7`D+hi==dbw-$w;ccK@N>5YLwn!nAgOaJEi>1^W zY|oVH9tZ?K__a?%V^C;L%M(iIlRP1`n(@C94xT5ZkrA4yFJS}E6RHu{hC9g2>GV@+k~)I24|%3&i3ZjGt%BL=M!#gR0?b)9*sxO z!Ixp?ggE?QV78C0g6|F*Uwm9fN}l0Jccq}{FfLb`%t$2`6(MFN_OWoosA{?OY`@RH zZ{!k;vipH?R+Bpki@ISv+JD@PiFSW`%5$LBcuW}j7ubyW-@NiMxmvBM{iRhzh`MKs zE^Dxdi}=`-S4|lWt93z}b0?3gh!$VTv{93>8TakhH_&evOhdmnaKfx(EVp0V-EO0Z z=UvI$qC$-UtApoZ2ZlxhT-1OmIHLZ;bb~=ebe=bD^s4ME?KEh1!kSIPF#gtWeDQ-Nen}q`%)pB>r7+=10M&U&dJWr zNP7z!fpA-+a%g$2qqet_`$jzl!^vx{vLb(b>q@+V!C61cZFjlvI_986jsp~>9BOgL zw-kFt5o$HfU1jj zR&Llyl;+pPunY&Ugd`)Q{rcut_i+OW&w~aoMt^XS6NO*Ln;`}50MfFq@Lq!%$QDi^ zYKT>;gT=7$3`2u^)1R=qI?SWNVAj7{G$dv^3#W~FSQGMEYsww;mLmLpn;2)=GXGoWjeF2B za)=ktZt$&P>Qp(WQSEu}KW_Tz7=_OqG-1XWcK2WNv!;1z>N$LYR$?-Su%{Fsz}y?? z*RdT=^avMD8+|*3gpqbeB$V+V9A$TpC9p&fxd*x`QDc>g@Q5d5TmGWm2N%t3T~xFv zY3+-yt79-V@z9d0;u2Fxl@aYsWrpVsE}Gq*Iv}eo+1}WLWAalnW#kW8*`8y8&kt4@ z2vdV}qvn$V;~(1Ja@$?+p&1i(u9bh#LPoUz6#w9x9{-J%PK&!ME!-X`Z;=b-+~$`~ zRimF<|8f0gNTXP99@LOD>YVlxZE#566D%#mtE({-jj4#TQe1G~=!akla}nq;bcCT2 zUTE@X^cy?<(MI{U0=2Mv(#$Yg{s$I4+`*{wzl?9aN~VqO63q|X9BJt?+o2YZ5hiJ8 zCG|tWtgS1qM#l0)`;GO#an^An7{m!Pq8GV?@t)w9fh7YbOdq^p%9u|rzq{>SNi_5j zFb0gJqLl-h)Elus;JxH8sEey%)7S@#C%%m4_t)fR2BBk*(rd&fptx`8FshZInLd4~nI04C?ehYeTSnaDCc00JV=$XB?)^6{h z1r$tDj1Ibx9YEt9FiP$SMo%*k9l`uNnRgt2SG_~eTOz+%i(|NY$I})>mK&D(zoS(& zXg(+1emklX9fIAD;ngxiH?>te54EMU{pEXxM>SWl`4MyP9=Yzkn`WHg4+s)!kEU<9 zBme$SF<86|`{9<@{qI)K+c!4MD4FF-zkp61d`(s5vo(RL-y(_sYl--HHSBP0EvKLi zdXyw*n!0uq8c{* zCt^S1&zn?Mi3J|iMq*rpZk)MaP}h&bQJ3rIO&zt!?O?A~Y;m+T$#YKmJ+vp?P=QnKw8~JOZ1JnqITZD+@zIGd3$)xL6VszNI#$WX^ z!W~cHP@&zhM(ce{Cyj>+dAi%UTB1LUX0omJ=@GJ_L#@wjzwy(rgeDb2qIIb(sq{bN zt=R-c(3BiFvG^$5PQ*Sj`=Lf)gCeV8l3hH1@~H2uoThRo&55D>r-DIZbV%`Pl?$eh zoDz*OVLv=AXiEgbTt;ZOK8eGvq)=zySkH;>3#W~Gq2JgUl~AO;1p0*_WHPjVHB~iV z&{Qdl9Vd3XR^r;W9{-2hDf|Xnvn9J2q#LdqbZIgm9UorO+c- zQ|JLShc7aK_pSO)KN-hwCBLpNLzsr@5E#EBZ3gUt9WyrA5;G%o11&UoUVRRwbuM_~ z9Ag@K6NH9SjjFn*P;7J82Sl?s+S+{NeQKXJzrUrZ=oCBYCyulQ_^7MNaW+vcy;J_g zmoRmRlfA?r!7pBEN|EaY&J#g%eGyN0{IXG(Te8};zAc$Sij@cIkG~U-?Oj*pFAN$% z`v3w2Z@i6_?rrrQb&;ktVfqKxu%fa((FrfA5>uw_!yoZLZLeZ^@DwZrJrtqxfk!PQ z^#5T$<+ttr?9XUdQI!9_ZMe1n8?A%wGCf6>&@&hib{f>DeD z{yjs?%c@l~mk*|zD|0_9sZTNt|LGKm85>5+upgTcO-Lj^IAOy!rSJA4GYX7a`xr{hN4XBBaKNt{{=W~KtqE8F^MKp9T9Q9=#$rd^pMiT{ z6bQnggf>Lvf!Ve${kg8eq{5bIlp8{t3fmIdKADfG>qlLLb#y z3=DfmhKcu1$D?f$TP=aj6!0Ofpeh93ShC}rW1;Q1xTR}5tg^?td(vzw0 znr=I#h`K{Xj~iZ%5y9x`3$s_QTY0He#>wE(2coTagvPHG2EDC5-BBDiL5K{FJjZSi z7!V-`KVozCWlCW&lvFFR+5alT=Ushd)`$xGG%lHCEUo@_B+RpJw8sg0|4eDVCnD3e zzoUP4v+J}OGGb3%yZ0BlQSc8n?``(F` zpIC15rd{_n>b{R(1YQB&$C5wXJ76vNYZ%zxlh>!y-!pf5Q>{!T{ z+VGGzqp_eUajYH?$>eqZ%@233t@Af9c#rl@vgyq!x{wHLC`Ml2p+lOCMi`pLz}by8 zy8rNjV`pAOE2fi;w*~kQcc@?l;k_l%80CO*#gC(E8Zj7j#w7Gdy=aqXzw#G@IUEB< zx763B^@XX7fFmQv^u~bdvh}mje4y!zcF90)Zl@ojeM#hohIj`Ib#6wP8>XhDd>a~+ zp;)1|CRTW*yr78&eN-%eO?8LL{p_$rD%Cfy+&em4Pj2JJsC5+A`j0I>MPzxdg!Vim_Q7uRn5;j2hyMwL89-8R=t8Ts9ur1}u1TsNfW?RCNWZ|# zx7j}N9ck0-L1`gJP*&dze_s50VcL1`WaxRbw(T^KNIgGQUz%}C8s&wfw(sOLW9{QRo`OzRN1wab?66f$vZm#frLU1 zEzXN*yy#Pp(uICkI1$?erjRG%HKCw*ggC(esrv~STMEfNhT6F@XDA??Z=5%29{}awRjG~-Ad)O!lUeiV26uoj@|5xXemHr@h{Lx4d`X7<%`~h<~bV!nD)>P9=!0r zF;|lv|op7$sWgi;6HXm$a^O{6aTd|Lhe z>1c=b?NkP|*4ZDr2o}}Lf~lkbgTn}p0nIG4Jb*WJFbuVTj{T#lM$5e=-)jqU!Zc6$ zRGO+vlwX>%P2|V=4$U)}B!n&*viq}Mg`?BRX9y6Z8!JgG5zYGoETESB09_`P~H<&XmHlgO+35GkL$(}KSK>RAW+5b9m8)J z4Ei3BMndKvBc7Pf$}lc&_$U`OJg4@A)q#t&Z13S9hL5Zm(7-Vjt?q~5QPQGUyjdBx z?hPxQ>zZ4~!%9l?9sh{g1w{Z;n;|m@!sZ3_c#oYvbt&hITm`WQpaDaez6k7k+o~fa%yv&;Z9-UQxap zOg9e1@sszuY3Qw5WjkmWz$9eUR$6ZFgKmDb6PV>GmVc?KCebgI3&PP|n)IBF=dgkW z^xIA8`n#ZC*q^!Y9Ibpc#~sXcyxEbWGermZBHkyVOjqIg43AI#&g*Hl7wDuF-ot|& zQd>|bn2c5sY1lAVzja$y!V&oyK>k6iTl=)S&g|$h4eX#B3@*8dJyl_xu=NDnuq#n!_(V92`^|{Up2!PDN88pxLx0F@UQKfh*!*1^w zIb$Rrs((Y5QMFK@561$EfVl!OHT#Ze`7)3WzNcto&$w{Et zzY^I}9B458s{K`8!9Mc}G|K-a8!!1EG@-bFw$uQlNK0O0<$;K;dI#1y;6g*(V)|wnFn=itqch{ym1fX4xum%SXL78kJQC>!#t`zGfKPKQO)nZLh8$$sTd#n&l;+ z9#cp{{%Wvx1VIK zc8VPh{V(#Gb|z%_>n=sv%qekn097K-_lE2I#ql_Q>c}^6D$ikoI^%f|E!qbzjNXyf zT}yTppLYI)N3U?JQHV?iI|B4EpqI_`LK!+w9%+X=lgNBn@1UK{D5Lp`j<*r*TK;0) zA?X{TQuW@pS02q*-LF!+s+T=n5tE# zg^!ROHu8ENOj2$@ocAK;kR}lwdO*~DfkDP~5X_&6g=0K->@Lwx>iU_vM|FD9r3NZq zbWy*(@b|$1Vb5xSt)xi^B=ig&i#ikV|+FX1PV)2Tpvr zo37Wrje6>3exuWIl=s|)_g(i{*soNFShRwHP+T5IE7lRtAq0lwu{~t@#HK)PgM*<3 zlWr4M=$a*!6Oq3V|9~SfU6@zU>5p@6xX{tBTmEC+%?VbEVBrZHP@_)`UEq5^=C$rL zjAo25YlkW4koggGc2p;mEPpZYAu|9da?Gn;On)hU*jQD4F6z4t1xJ5pcr@{9icvX& z(XJ{OtQ>|N2%bW_>mT|Eqzv&_*sz|2H3XN;n{wSxjzBJ7NE?f-D?4D%-FI9DiRvva z8byHCFy*5;Pb08W1rcnvp6TxKI9E{Fzoqhw^KOTLu)@MnUS6m0bY&{>*~8E(ZfM%Z zV#GpcMB5odXK3NxAjzM!V)ihxoiApQoY!TZoL^)ei+SGAj z+W0@Vd^G71d`{7HBKDX)9ucj!BBPEHwE8pzvFFK-({hh@r*;mZ^JLh4Kcj+rIq2@_ zObLmU56U~3NzlrZ3L0@~6ny7Y@{6+l0fYA=t#GmK=w(8KYk2T@<*Hcz$ep%kGW5C< zFfmg|MBYA!rthc{n~+F;@V&Pck0;CfgZ12$yOHI!_f=$TW9tXp#~fN@CvOdhkmB8a zyY)IhSs~F35BbN6hcvn2!7ChL9(7~btVpxXA_;YjxuuU4Fy`GRV_+~$vtKd2rtrbR zqm_7SwNny5j@90qp413`Nk_z^a` z`v5$m$qK==2#UyfSWrZDw~A2^hoFejTWIl14A03p*LMg*tS|ugr7*!+j%m2l-eTEW z&Y@sJ?>0n7lE3=viZv^i#IvP<=B5ypcNeBu*BVNn2gYzDgy*wh7xd4DxH9upQ?(<^ zAixZ(D3#hJ>oGb~J?m5ag38t?^$1%$JrIDMAFU<@DGOQV^T~toIJ-Vvd(sZpKfAiY zNPY_Pa6Wkk11yeG|@bnO@Rz;s46unKqDnkIg>e~A$;p3`-wK>#-AzS--MX94R^KJH+iF74}i^@kY9O#n=r(b(ewR( zd*=afM^XLpoxSBHuKN4?*6}L_s-tEH+#!_@4iRGx%s@z?DYNZ%$YN1&YU?^ z(h9Q%6Yzk}SGYJvSFUO_PwJrFlXP7?RCVIg<%+bUE?Ki9@0NF-R<_A{>7bzM^H>cV%HCetvB`_BrLfz}vn5 zgT-c!>98HQQ{zF`4&Qwd44uyVQH_;4Ty*Sod{^D}4)2ICud-fSFm?1?{fr5>a6SUR zwAGxE1xuM<{`hb69AC;`CR0VxERYA1a37tR?eVJ9XlPGvafa@vu1n?{*Yd7G$~v!< zy4$dcGj@Q-xc+l%IcCAUUs4`Zbb9Bm?s)3@#jO^j_=PT%4j;=X(&#)!5e?&wbe`_I zm~j{ZFdOP}R3cIJkEqL*ZMq@#W50_o=6TUoD`a~+xc5cF#?8nPZ!!t9BCGF}ZtL5$ z@jPiKSS(01)NJ2fajkkX>ez8eH} zZwZIsIlRMRtb$(0oWehJ#+Hvit#~42@;HLBSv~o`6-YzA7bjkK+OlRS{ABRtebeCp z%H}QVpxbh}j-NS)=rT%?E3A_;nu@Bc&kc~biR;D)jL6i#?L-HpoB6^^)(jw*HBH#H( zI=!;2F>-2GKX=xJ7lMrNgZZQX9;oy4-on@faRm0+VBJTfeGTD?Y(JO$F;nH!XxFJ4 zjrKYm=F4C%1k-l*oqt!dG2Mui#aYs>+ljgL*8F0;VWRFDc0hFJt^b^csj#2dDx1Is{(`YH=sT$Fw+%aL_<-26 z8#_Y>^oDD@5pxchDLVL^Yc^}|$mrG4J3H5nxo@5|HrJHMEiNN2x?ZG&E!<9Wu1>&! zzACFX#ycmLXwxyA>XdK#mQGj94Rm(euakHNoeNfnixPcYda%tADP=9KbW1jnCT0R6 z&30?TN}Lf_ex+f2!h9m+C?P_xR+_(9IS<1!VL_tpZRiPj|ybaz+`$Web`5 zrf6vaSZ}Ue=dbkN6X>%XFj_+YwYJdp@!j9H?Zi>@rkwWl0_$`gy!yEH=|-!uEo@J! z#qJ8D_zDG#A4+05Wr zM46jh3T!z|n6PUC7*ZZy4DP4}GRDbKx$*CxSjJ>yBt~vaOB&|L?)Ym(~+El)p2h zX$t-5C4WY_VKDY@tHLPCPFc%`OHRm@tnR|1%CfMc9`N{97%b};4q`s!c-}Qs;V(vU zH*mbnBbYj4KJ%6^fu4`0kZ^I&^T!--KUNO%RkK;)DzH0+Qb@S<%*U#aD+?l;-O>qT z2Zp|GczlK+tK%lc(3a`N25&d2iOniX{E0*@ThS`7lVdb_lrMpau9#5NwUgGa=sNZ) zlPC>mRUb+eS=o1FGR~27GUyk0Df{}u6)c23oM4^i%o_gvuc#SGdIt9g{j4=E^8NgW z_QT@P@496Nrbr%Kr~Ni&m^CFI?YX3wMf%|rXa66BE;k4~vHw-!Pss`}`%~7vojRGP z^X0jEOEMeix>f1F9m)|7-TywaQbn?QbzZeS_`nw6%v8b}!gvXFq9BHS>A$~0VgKd= zCh@nmiS$mwB=%sFx>fXM{Wq3LG5odJ9Yq<0Fj0XA2IFNN#I>|v*Zw$H`X?h`J3mfz zSQClcqUq4Xekb}&+N$&!|Af3{g$pPK(RJC0CBM2Jc#>U&jkc`W4fTlWjNaVbX?erg zQF)Gl@K6@je`F`rzDOg_=}jh4UK`>TNsL<=*z3q6vrXZijvJgJDm}KXR=4Hpj+(hO~uW}j})>y(5ktp)HIyD~r zgGbu1I8`92y0An|6-7}-fQcLk3{B#A&&28b!9IqIAE8Au*O#h*UF_oCfx-A4MIs;86&yz7f(+|-dGn*P9!{qFY+r3AQR=nB%Ddrl zt=t`^42?*q&lQR$-`lw--&c|d7o;uzs4}wp^M7=dr2{tE{1*M(8?F#&biaNmCOeAN z$49>2Zbmfog z!@)0+uz#WbU2#PM3zghAniqQ4?fxtJZQMq1T3D`U-w{VJ!}uQX_~uaR?IA37o{KA< z@7)BII37vDk*oWyM84iso1@*cwUVSjX-t-Rb~Ec=4mq2J8))oZ4Vc~pn>rptVj zTQnqd3*~4V#OegkJ4u*rs~Ieq?hE3*6pPu3fj|HMmghd%5=!K&=3q1^cG1L^`&BT1 z!J^q#*Djbcc5Z$t!ISg_7V$rc#&OeaMKms&r<9-X@P&?dUDdhq;5bLajP%Xs|C`t# z)n#?XWd~y%*lk>x7xP8;7lz66fK3O??BE|)0OHmtWhEOxAvPy`GJe9mU!|Gl}FpR_b=YZX0JVHDx8!_LSWGnP?Y zvv2?Wk7#+DcJ}Z?;d>u6ai*;1wP;${-Wk`!Fv(9ShyKQI&3) z=H;!@gKIk>jnJ3apBNuT%5jK}gpl5#{o0j9B>nF*{Y-yO zE`8k#xAMdAPIyF_oo~g$E&KDV+wQ%5)JOWUw_K5GvYiw^I zYr-7G{}#XA{$pY`i^j4Tu877(^OW>+Z?ukQr>IlofkT={g?TNzTZ@qc$Imzp9o;Fq zyr^rZya%Gs+AniC-|<%cjQc}>4v7Rry)5$bc?{Kk8r}Nr(qkC6gLFO6m#Ny{n{G?% z(!Hqf+i`WmXiq^E>?&xD7Z+cRu<9_15he0s62;pm9lat-G)1>%<&sY|!_uX9>Bv}@ zOF5F65BTX?b^T{`si1CT!gRnMZSC$;(aw}t9Lmf?$IrMZFRYgz5-PX#0$$td>g|O6 zTkS7!llmEkOQa^gegxg{qQY%zNk^I&#bpB9P26HXw=EOiNPvpMRdI(`bY7%6S*FSF z{O?FOqu^s5U&^KI{dGKTyI%V{>#_j&8dq&S3T9i-cc016ufhotixDIT`=tI*@x=q-gen?Sd~z+ zMQ2-m=Ek-qe`PXK(lAK=#bkJ2TzcNw-(I34Z{h1R#w7A@J>b6VY+1|tCev5OB=dvh zq^;hbW_#;4D)%K5Q7J*OyxH)8QN)&7qQ2&LWzxn*`%Geo_XzK_E${yKw3TEa=2mR9 zZ~d~TBV$Vr0@<`8BP+nT526IMj3sI21(Z)>4X__PK0_d1VuTbq^~OTXC4 ze^%C_LVK_}ow$zMa)Hng@uRkMF?6Or2+y5TmgjE&A`(T~R#S0#jWCyXthmgkZvnLmsE0^Lp((s0*PM{|huptub8O*vV{ zLdXNq{`AVlOG^qb;>yusZ@&NLne>iutDJ*;z22W$$Y0ENyOuv+c;hq8oM`68tr1}P zhO||%<;>jeLnqAsx^8>5UB4rAx6p*;ei137U&Np1<;50712{>$XY{#JzYuT7^5%r; z{aZ!0%RPq?J?9ZFp8;?eHR!?D#y~igZRUgKqnG2G(BV2F-2zTOUYAuu*FnAJvdZmS zSede{M=Mc)&k+k%RJ6?i`lBx2^Eyt~{-}#C-dW+Z@@5v(cM}GUj(>GF?Fv^VCSXxv zGkIoV*_;h8>WnyN_U4)ZljAR4+5YlRBDZ7rje|7c^l2)Y{Jw7zLV2%8D|Rz#ujq57 z{$TR)PK%`fc`;@8NSdm7Wu?5RY1ZA~e6lW-vH2D!lfH#6;w8bIze?AkQcHC`+&j0H_IJuvUU0Yv;@r0Kvuz6VD#zu=j+Hx3X zdM*v(8X;wW*2lbw-)F-+!+PjAKYq!0*QEu7ru}rvDxL}?)ee@z0raogLv=16T zCpf@jSy@vtTS^%mFt}HjB`$SfPu=>74&x$)5C#kWs53XP88;PDK{TjZiQ-O5G&a)rFB+547b^ zg<-2aClluo))s`zX&CR0xPvY9MdU@+^U?gI?$US@y>!F^=j*a4`?lUZ$mcKQ$IZHy zewAwjs#owB`^x1X^QVoTSDQ@lLc3m&HVQpL@OF#ttGeCQa;w59uIa8BWfc1tYaDtY z&*jIdJ$$S5`GIAhTAM#UA7p}+8>y9@7}L`xMWT&@NgPl8e8gbIMchZ2U)eo65M+y% zD~?X4by_*OKi9PVG+It?`RVYhGKxyAvLX)K1JMipf#-AVTHRg{7Cy=V(gT!%f8vO7 zbG8p7@dV7DI@}LK%I8^$YohT{KSo%uhw82?Vd!35xNcqTa>`s=p3xz4#4Yu6GEUep z7*u&gqf|Z}Clgz{m3f-lwj->KPkhMzSDyNg#Dimg|MhYbZHces=PR&#-VI^j;S_mY zgMCRQd8?5|wqo9T?@hKb0z>CPnd*>ivE>;UX9%kb=zoj zQCg(a#JRSoUen=jrehcF7uWC0o_mH4L)vnAF+E#J<5&fUgwS{DiX__C@ygmU_3P#q z3#5t5bUS+5mD_t5hxha6(-LOuMz(ZEu&}rw`u_8#jJ|-$>zSZEUP{!1db(|KIk;^mG#L6o2UK| z%`A()mfLSeJn0K8YWV6 zc!$Y4jBiql5u-7(5B9H3m$Ow~G>!(IFpeCK3P(EjMQi%Q5 zMUAsi2XaS+C34s>kx<{{U`xnYi?Ah~Qb)3&59USB+hygmOOFWiRMArvM$y;9$X%JV zMlnORDb*)SK(cRu-N6;j%L4|Y!j}?blK>bpTy(-47EBpkwzE}OeA#4Ni}N!G!W5lQ zIC{HJYOuc&)qz=8Y(YVAZq~uH`zR#!qKqP|FrP^3w(t(Ol)J78 zGZ?`Nns1u%ocY5i&I%be*5S+-g~+BSK2SQKXu|;B*+m+3Y~D#fTTg&NX)t^H%Atlz%GPP* z&Tz{ArhewM+NirHjc(GCiIMNKPM6xI)T=rlCn@t3$lEj4xs=-=@et@YcB$X)CY?6U9a8s=mr0l>B|=l{ z*toRC!u%~~SIyM%j18oBV{g>YJ?)~0{UfCMcR=@&*}C4btkk#WO_O!S7J6%O+D?;+>ErgPQ@anB#je^kz9MK5?1(r zI&Yk-61nj}d{|Fh+PpAjg^Xe*V$~!sP0WKZ!Z3+<@s5{*7emDQr_s4(W4=+_;R@V)sOxDixfmnY%Tg!ZH2)+zVLKKIF7iuW^@#=^8? zV~`$?>#YN0B1l-&^zxn5f26LTx#+IC4cFTv<$8SFJ~MS|s2nXn!@`sxXSuAbLb7 zReauheXY1g%B?1Jj((Ep7hfx&!_xQ`XdCp zw%-2E{L4=LuvopU8DG?K5T&)AZ+m%j{oHG=r-GGHwnD*8R%u1+_aX|=exg*_Non4c zvG?3AU+^o^hBXAZ z^+nUh`F%ZAPo1gbc+VTS-}6EJ+>@>l@Rla`LEi5>VLi4w7lvbWDQP?tZrFdB`G$mf zS5uE|dGAM>wrRv)v3D(Rjn||PNCqaF5HGgU1~93Q)dg`S-vyJm|l?eNc zysgvTx=S>^H~bh|{y^8W3LWsAAL;igc8k|K_4PZKYQ{zScjge_Z!V>#msiYxl)3!*G_MJ|Dw&w}Wex#ynq zi4f_7*V~239+|5}UCli7gHnPT-a9wmatDxdMO498HAayMDBK3ITic6DS?J{VN81f3 zUvF8o^t5PLoL^3fcCkmgmSy^z7ow>ui|VfTHe;bNST$12^3qYx`xS zLAJ{lL+wOS z4_|M80{squ!69wu@1!{5AgedtFO)U~1$k!_JHQjINVaX!Q@zb+6NsRkSM2(9#Y|?j ztj_w6n@t zJr(cS!HH$cXWrPXE7b%iRlRq!c{kHr#cZWrMZZo!ag(%T1`03 zoy<+(^bJ29J8OOG*Ii|+7S(|x8B0?o4Gn0;w(C)GQZ~o221M)A{y=AKrZ9;oFm_KD zrbx$?ayQ&uy+eh;cD7QRl}fAQq~Arpx$T|hR}+r+$3>Bp99^T4?${{l21P=U6yYNZ zL%KmkKm-AS(PPvI>F(~3lr913-sp|(=il&q{Jqca(|hhY?{i+~-uJuz`UxTiY>+#u zipD1g34dO5<8oK!Gll=nMsU0Td12CJ{HjA?)GCJUsGC^6JNWX-JGL}%AyG-RJTY9V zJq1S9@o`Od+d4!ps3!~eT~LyVH&F|65JpAj)9DvYK~1*5mG2xdBHAOt9o=Yr-EGgR zYY_19ZULT*o*R0Rzg5mVW~*T|%b>x;Eb)ysj_Fm|cOCij!yY-MzclL*8+-LD3trSt zVai}{w|3L!l2S9ET07+@0R^-27DHSPI^2rHiE_-b^`xpPtV6fIqTYdF;FG~mCAY|l z_HF)zr>afxr>4>i9h3utmzk5c16$0SFr}1Zhd}n}&KFO1JTYi{uG^-kH>*SW(wL*g z@C|`&uj)=1VUxMN+yw+S;6C|q^d8xO$McFv**IQrsy{vY;_z|Dugc!PBWNFS=Xx=t ztcvWR+~QPrNJl~JH%sT!4W7o!bkm-iK-LgRNbx~+1yHF5~wYHZIaHsVc@hF{v zZz2|5gxZ;a|F3GeHtDO!e0H6Jc0ogrW5_F$z&&313Djpbd9*&N>ZS9|D1 zpvc&E#?M~s1rKjmp=GFXKTi3d5*&x^dw!d z-oq9psVBy|d(S?`p}#4$2oc3?wMI%Yd8~6el)sPVtgO}Vq~)|U98 z&ChsoFtt;Kv^0wCKg5D#EL?GMOw$LF`P`+;A93C*zd9SXBS+8=h6^*!I z%`45t#U;7r!}XebdB+#<#?+i*8g^a#Q%BH_{g1CK6+_>=wOOl4j27=GU(*A#xYmlt zh4Q?XQMYLHajGF7^Pycry+tD1n{&iA2Z*D zNU`3KeR>^~xLRueVk2xaD)+yMmIo@my#=ShzZ=Yg=(II}`Y$Gfb|gK9GR0(so4{$* z!z-`ootMemlFUV(RB|MUbzp*YZ#h|j8~S|Lo#`YngHp%x$I~A;rqb$TdY1P$pW<2) zg}V)+f6i~~f_YnPbLXX13=S{+ejLH>hJSXnuQo?DjzDBf%-=H~z3N|S`b;l9j-}cN z$HNXqldIIg;YCpH@#&v6LwQg!n6ErLWuK+V@cd1t1Lk*&Uxdu0x z)urn>!FcC6i`Gq#Wk{5a3;XS|JXkX>O>CEH&^shD`RbiDZ{NPVVKk6UQH9@qpLNb+ z<$NqrrcD|tlxSU4eeY4=#W+8l-KD-uO}u(dr?0qeP1L=mAF+~0juu`s@6S@V*y zWP&@{yTVG@RLIpRLTwwKN8!>9e~$u3KA!-}zork~bki3Jk?Gjb1S@Zh?g;`eJrNMj z)ob0N;O*+QiB*S=R_7~2~0y=z! zgO(X7MEB=>1_NWp4V2fNr!_B?OSzR(Nsq?!Lfv3y7SY*ZAu7I9k{mqZK5gqNVjK&jAkm@W<@J_rEMf2*$+yVEVdpKOxh>EoBrksfetFS*8~MyD8Jj z?}_lFw8n;B_`vi0wRCjp23t23EM-!Q`TXbp85feCKn)L-pPyPhNMV)`J=Kk&RKh={ zP44%uYLI3NZYdp2ff;mRt~3zN@=1o=Ek_TrPf+@uaXSty6zUYgHlwwAOcV-%J6ad6 zji8xvOxEiAx#ODIcNN877LRV>MDk*VtZxYNed!aYYX!^GuYdH`2T;|dt;VE7caHU2 z4s>V~4*}NVvBR?U%HvS9*~p^#qKWx^BpgfZDUn?xowI@35z0%^seDj63X9D=~Wllk>#& zxZ1gR_qq&V&ge_1kQc15K@D@gYxmG!jkrOis8r+4NpmTOvebfjqwU=?_0zDCR|ej^^~^a~CKU!hN@eUJ1elMrCn zxd;^+-WMSU2Q7D(*Md%gGTJXOp*Aus6z}X(St-H{PXuJN(Y2I2lnM2|V{Mp+sg4x; zPm-RNBg*DB%TH{^FeOFn4O2oY98BIa60aB6B4ImRd z**!6Jgi&Qp9^IPO*M-mi3G>S1>XG63UF})Pa<6$~)x(wKm09bdBv&RpoW@>ZPYLDG zr=*j!J3Vuma{b8>Y!v-oAbwML{H35 zmm98Oghi%4#?^ix*w|UGN$G~TD}y}dz0Q_zlYc~j9C0-!SlTE_5YXV zt#9&58(Cm@YJ{L!)Pv5f%9)y@awx}LKwOUUjjz(Na=vZN42X553{CRb$=$WM$a4() za(ri8r1t;?SyR%?g*K^x#hxycG{R^8Qq$+sEOxxkVA_dH*XZ}H-#RgLElDKFMlWB` z>`?;=vh;T4T0t|_bY$B=4Ln+*XHnu^QiI&2J~$sjF)dO2YOYMwXf?DQ-+ngs!RtnL zYx+g%9(s7i)TGGt9d}f+W|9a%_z?zZ#0_X24U1H5AAHy15#l3;?e{y|71>GUNRwZx zd&TAx*x<3$t~_;ZjM!`Vn|dBba624+*tl9xeOILm`=%JfhHc9i28{%@*o#J*V@*#>}-GtwM(tRt;>bN|yhd-ut z`XSV<*{jCAv?6Wx(Cfth>!Oh$UrC1iaUH$5U(0t&p0pG|VoCBvRQck-t?P>X^PPu| z%SDg-zYI zUZ^BrqNsHOr3B<5f6o#yGF^Vh((YrN?@9P-XnlcwR}tQahY{7|=&+68AD?_p43K|^ zJX70*5}HFsmA-bI`$Rv?E;KqO4i~GgjY*?+O!9 ztU$uW0*LisN0JdgTvXi@pbPbh&3az>&2n!7;Sh@}@jYSkw;?O}#+r)8u5IQPvWG-; z(~SeH9e^3JJrpLw$07bXEX7dJzV0pITa7e&>yJH<@De7H@FqkSZLzwo?QVRF#Dpfi z^f-#VE~m0dxu~y_<_>7y5hS^`t6A~xK9VIdT5kqmpEoz)2ND!|U4jy9hv|83z+%z# zXJ|{Y>tcsyo9n`=GPX05OSNGYJjk3}q|cRJK*=J7zA}PyA6iL2)ArUp*5?Vg8=0nR zW;1SIO@4LP7JBf*1n|#enz=oU@UsMzu&7g`IsPeN%F{qH^ynKgJ_y7Ej?M-@f>nW_ z4P@3}@?$@%(QukU}*~;nhF)HZ);AQP=yu&)OQi*Qjb) zi?Ne0axy+dLm6x{@+S}%e%kKPjO^>v^7K4(+_TB1E-*dyL`8~4izbf>p65LpAV$vr zi{B_gSsdWUi=OhC2l;gD43YRm9l&xWxK;nWpTY}?@M z?|L!NM-{Z@!Aj8Ss9je`A-r_|TXK||QB+Ni20}y8cz>b9iTN9pXDbuEZHpIk$wPJ= z7(<~5jiI+u>vwj&(4`3TVAUL>-Z=@*_xuNUhT!8T>nSfvDvGVum;0{$qL4C|%XX#b zubPNvYxDMh9;d1a3Y(#EHJ2S!_!+O6k45_!ZY_i7gPMyPKIpYSlCvTq-@TQy^J9th zc?K$}p3I-qyjFNeFE#8S97aP!3*U1UMjRX&TA4ETpGdv+9ufSPA5Y0u;~K!UKLbH5 z(Tkj8oM zlKyKRe3753&D}AZd7Vf1f!-CI;vV#9OM*73@Vh(M^AB%$$lU9@P;u8+uAeb8w-vsH zQeSoK`KiB=bwz>rv3v)_+S#J{6Ymt;XtgJdVlx`PO{9}v9?w}Yl9NT3Xn4y$$(j(` zG4@*LyF#%Hs=#0Q?3Q)T$&_`PHxoCb>npN(x_+NV;s=WWXU(GpTzDR=_U4v~EAnSi zNxl@DK|jBK9mOpMr)_32@&r3hJ9);yni7p&jIWnlxN-Fx&p^tkWLcH zcTATn4e#nq zqj?$`rQFyd_n4n^nH{69HBu|G*|o3@)&0VqssAkPB}nF}>V1H>9W_EY&uA#OM$5dV zoXg(d=TlQ&AH?0a={o2;w53uqwkrAB^ggWwFM~++eE;c1}1R5s)R^^CA3lB3*t(IYp?l|?&7`1N+%V#G~KQDu*Uf)|{ zC3R_%3|&AJcX`f>9Dh1U%WVkFE7G^c3=Z&u*{k^0H6dqtLAT6YC>x`>`j(XTV&@&- z+$p7`r><{>`j8A*5v#yKcVPp)!DqEK`-_0;a@*f?<-Ue)B7U*z)j6`!*^ygLbO&}1 z?ver4WdSRpo>{i~H$mZ|t+K!X(dnx1Ojt9qDZ^*L?G~{DRSJ^J)Q?PQvkzhH&a72- z$OUDSv{`ORqQ4xU776KCY?{CboKjeBLrIyX@_#%O)#pCkM-RTv#7)KOUsZBb&$+Mg z-C0SsW!bv4yXSXt@*B~C%mk{fS7ac~{}Pu{qdvWQ*M-qB^koEC2I$g9ePtvdcz$oC6tdPE|??B?%U-$wN;Uh|zu73U$`w@c3^vpe*E~2Erxsp=9<>Wkf8s( zpQ!3}T4d7~jPp$S2 z=b(`05iR1!;bry7&L3-EpkJ~4x1B=DEf-c}2=nbvGrug!ZNukb!!S!&{nx^sn?*>L z^y;Ay;1a6#K)%*rfgtv=Ibp!HUE4~i`JOXY9xbnUAYkZjd*Qg(rswb^KMkkT_q3}t zg{uX$ZS+=rSc#-JR2*y<%Kx-5Z?H^ihxb5NMGUTD``$`}(SS4j85RCs5>AL+Qp5PJ zNF_A=DCwUBIOcm!7rZHP=;_bWjhYY11tQ8~pVg_ zF2WA=GYytznelL5@EI)4{lTHTFtlTUX>UipCv%mSxJl$?#rfUY`mxc=30Z!W4MY!2 z)2Pa3n)+sC_A%at{)B4Hp5CpQ^Go(AKcekh5UMc#{{A27Cn6$eXqJ^Emazw3F2A|^ z30O2R4(|$8c-Xy>%oDF7)Jc0SamE188}NCpJ3Dp|yXIzPF-syD`-X~p`%bbUgMuS~ z%WTP@snV1FEa`q#8d(1Osnd_V`#*mU*e=b%eID|;9WRd(Z;Tz&K z9t;cSF9CYpNzxhN`o7G=(NAp9(Q9>Z%i&B0&1&l8pIN+u-){*6o_!D$_3!$;U!-We zEuimC5XPqVfVGxYc)~*cu@Uca%Z6tWrm1>RK=N^@BW2gof?AE=#@R@&b`B6T(w62= z72aje61EqeQF&8Zp;Xy;L*^!Fb{u0Y9StK(YPt)epGh2{tWxylGwY "MIT", :file => "LICENSE" } + + s.author = { "Cihat Gündüz" => "cocoapods@cihatguenduez.de" } + s.social_media_url = "https://twitter.com/Dschee" + + s.ios.deployment_target = "8.0" + s.osx.deployment_target = "10.10" + s.tvos.deployment_target = "9.0" + + s.source = { :git => "https://github.com/Flinesoft/NewFrameworkTemplate.git", :tag => "#{s.version}" } + s.source_files = "Sources", "Sources/**/*.swift" + s.framework = "Foundation" + s.swift_version = "4.2" + + # s.dependency "HandyUIKit", "~> 1.6" + # s.dependency "HandySwift", "~> 2.5" + +end diff --git a/NewFrameworkTemplate.xcodeproj/project.pbxproj b/NewFrameworkTemplate.xcodeproj/project.pbxproj new file mode 100755 index 0000000..6d385f9 --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/project.pbxproj @@ -0,0 +1,1224 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + A102BD481F02355A000C6B38 /* NewFrameworkTemplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A102BD3E1F02355A000C6B38 /* NewFrameworkTemplate.framework */; }; + A102BD661F023573000C6B38 /* NewFrameworkTemplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A102BD5D1F023573000C6B38 /* NewFrameworkTemplate.framework */; }; + A102BD821F023582000C6B38 /* NewFrameworkTemplate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A102BD791F023582000C6B38 /* NewFrameworkTemplate.framework */; }; + A102BDB31F0238E8000C6B38 /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A102BDB01F0238BD000C6B38 /* ExampleTests.swift */; }; + A102BDB41F0238E8000C6B38 /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A102BDB01F0238BD000C6B38 /* ExampleTests.swift */; }; + A102BDB51F0238E9000C6B38 /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A102BDB01F0238BD000C6B38 /* ExampleTests.swift */; }; + A102BDFF1F023E32000C6B38 /* NewFrameworkTemplate.h in Headers */ = {isa = PBXBuildFile; fileRef = A102BDFE1F023E13000C6B38 /* NewFrameworkTemplate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A102BE001F023E33000C6B38 /* NewFrameworkTemplate.h in Headers */ = {isa = PBXBuildFile; fileRef = A102BDFE1F023E13000C6B38 /* NewFrameworkTemplate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A102BE011F023E33000C6B38 /* NewFrameworkTemplate.h in Headers */ = {isa = PBXBuildFile; fileRef = A102BDFE1F023E13000C6B38 /* NewFrameworkTemplate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A102BE021F023E34000C6B38 /* NewFrameworkTemplate.h in Headers */ = {isa = PBXBuildFile; fileRef = A102BDFE1F023E13000C6B38 /* NewFrameworkTemplate.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + A102BD491F02355A000C6B38 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A102BD351F02355A000C6B38 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A102BD3D1F02355A000C6B38; + remoteInfo = NewFrameworkTemplate; + }; + A102BD671F023573000C6B38 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A102BD351F02355A000C6B38 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A102BD5C1F023573000C6B38; + remoteInfo = "NewFrameworkTemplate macOS"; + }; + A102BD831F023582000C6B38 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A102BD351F02355A000C6B38 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A102BD781F023582000C6B38; + remoteInfo = "NewFrameworkTemplate tvOS"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + A102BDBD1F023B2B000C6B38 /* Carthage */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = Carthage; + runOnlyForDeploymentPostprocessing = 0; + }; + A102BDBF1F023B3E000C6B38 /* Carthage */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = Carthage; + runOnlyForDeploymentPostprocessing = 0; + }; + A102BDC01F023B47000C6B38 /* Carthage */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = Carthage; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 000E616F2086425500C0638C /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 0085926E2046FD1B00AB529F /* beak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = beak.swift; sourceTree = ""; }; + 82056067217DD00800E23A81 /* .projlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .projlint.yml; sourceTree = ""; }; + 820560AA217DE92600E23A81 /* CODE_OF_CONDUCT.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CODE_OF_CONDUCT.md; sourceTree = ""; }; + 820560AB217DE93100E23A81 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; }; + 820560AD217DE95A00E23A81 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; + A102BD3E1F02355A000C6B38 /* NewFrameworkTemplate.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NewFrameworkTemplate.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BD471F02355A000C6B38 /* NewFrameworkTemplate-iOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "NewFrameworkTemplate-iOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BD5D1F023573000C6B38 /* NewFrameworkTemplate.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NewFrameworkTemplate.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BD651F023573000C6B38 /* NewFrameworkTemplate-macOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "NewFrameworkTemplate-macOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BD791F023582000C6B38 /* NewFrameworkTemplate.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NewFrameworkTemplate.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BD811F023582000C6B38 /* NewFrameworkTemplate-tvOS-Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "NewFrameworkTemplate-tvOS-Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BD951F02358E000C6B38 /* NewFrameworkTemplate.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NewFrameworkTemplate.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A102BDA31F02387A000C6B38 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A102BDB01F0238BD000C6B38 /* ExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTests.swift; sourceTree = ""; }; + A102BDB21F0238BD000C6B38 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A102BDB71F023A7D000C6B38 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + A102BDB91F023A9A000C6B38 /* Cartfile.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.resolved; sourceTree = ""; }; + A102BDD51F023CAA000C6B38 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = ""; }; + A102BDFE1F023E13000C6B38 /* NewFrameworkTemplate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NewFrameworkTemplate.h; sourceTree = ""; }; + A15AD1201F0240C9004D7ED3 /* NewFrameworkTemplate.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = NewFrameworkTemplate.podspec; sourceTree = ""; }; + A15AD1211F02447E004D7ED3 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + A15AD1241F0262D1004D7ED3 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + A1F167732215A5260094788D /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A102BD3A1F02355A000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD441F02355A000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BD481F02355A000C6B38 /* NewFrameworkTemplate.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD591F023573000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD621F023573000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BD661F023573000C6B38 /* NewFrameworkTemplate.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD751F023582000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD7E1F023582000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BD821F023582000C6B38 /* NewFrameworkTemplate.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD911F02358E000C6B38 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 82056065217DCF0700E23A81 /* Globals */ = { + isa = PBXGroup; + children = ( + ); + path = Globals; + sourceTree = ""; + }; + 82056066217DCF1700E23A81 /* Models */ = { + isa = PBXGroup; + children = ( + ); + path = Models; + sourceTree = ""; + }; + A102BD341F02355A000C6B38 = { + isa = PBXGroup; + children = ( + A102BD9D1F02387A000C6B38 /* Frameworks */, + A102BDAE1F0238BD000C6B38 /* Tests */, + A102BDB61F023A6D000C6B38 /* RootFiles */, + A102BDBA1F023B06000C6B38 /* Carthage */, + A102BD3F1F02355A000C6B38 /* Products */, + ); + sourceTree = ""; + }; + A102BD3F1F02355A000C6B38 /* Products */ = { + isa = PBXGroup; + children = ( + A102BD3E1F02355A000C6B38 /* NewFrameworkTemplate.framework */, + A102BD471F02355A000C6B38 /* NewFrameworkTemplate-iOS-Tests.xctest */, + A102BD5D1F023573000C6B38 /* NewFrameworkTemplate.framework */, + A102BD651F023573000C6B38 /* NewFrameworkTemplate-macOS-Tests.xctest */, + A102BD791F023582000C6B38 /* NewFrameworkTemplate.framework */, + A102BD811F023582000C6B38 /* NewFrameworkTemplate-tvOS-Tests.xctest */, + A102BD951F02358E000C6B38 /* NewFrameworkTemplate.framework */, + ); + name = Products; + sourceTree = ""; + }; + A102BD9D1F02387A000C6B38 /* Frameworks */ = { + isa = PBXGroup; + children = ( + A102BDA01F02387A000C6B38 /* NewFrameworkTemplate */, + A102BDA21F02387A000C6B38 /* SupportingFiles */, + ); + path = Frameworks; + sourceTree = ""; + }; + A102BDA01F02387A000C6B38 /* NewFrameworkTemplate */ = { + isa = PBXGroup; + children = ( + 82056065217DCF0700E23A81 /* Globals */, + 82056066217DCF1700E23A81 /* Models */, + ); + path = NewFrameworkTemplate; + sourceTree = ""; + }; + A102BDA21F02387A000C6B38 /* SupportingFiles */ = { + isa = PBXGroup; + children = ( + A102BDA31F02387A000C6B38 /* Info.plist */, + A102BDFE1F023E13000C6B38 /* NewFrameworkTemplate.h */, + ); + path = SupportingFiles; + sourceTree = ""; + }; + A102BDAE1F0238BD000C6B38 /* Tests */ = { + isa = PBXGroup; + children = ( + A102BDAF1F0238BD000C6B38 /* NewFrameworkTemplateTests */, + A102BDB11F0238BD000C6B38 /* SupportingFiles */, + ); + path = Tests; + sourceTree = ""; + }; + A102BDAF1F0238BD000C6B38 /* NewFrameworkTemplateTests */ = { + isa = PBXGroup; + children = ( + A102BDB01F0238BD000C6B38 /* ExampleTests.swift */, + ); + path = NewFrameworkTemplateTests; + sourceTree = ""; + }; + A102BDB11F0238BD000C6B38 /* SupportingFiles */ = { + isa = PBXGroup; + children = ( + A102BDB21F0238BD000C6B38 /* Info.plist */, + ); + path = SupportingFiles; + sourceTree = ""; + }; + A102BDB61F023A6D000C6B38 /* RootFiles */ = { + isa = PBXGroup; + children = ( + A1F167732215A5260094788D /* .gitignore */, + 82056067217DD00800E23A81 /* .projlint.yml */, + A102BDD51F023CAA000C6B38 /* .swiftlint.yml */, + 0085926E2046FD1B00AB529F /* beak.swift */, + A102BDB71F023A7D000C6B38 /* Cartfile */, + A102BDB91F023A9A000C6B38 /* Cartfile.resolved */, + 820560AD217DE95A00E23A81 /* CHANGELOG.md */, + 820560AA217DE92600E23A81 /* CODE_OF_CONDUCT.md */, + 820560AB217DE93100E23A81 /* CONTRIBUTING.md */, + A15AD1241F0262D1004D7ED3 /* LICENSE */, + A15AD1201F0240C9004D7ED3 /* NewFrameworkTemplate.podspec */, + A15AD1211F02447E004D7ED3 /* Package.swift */, + 000E616F2086425500C0638C /* README.md */, + ); + name = RootFiles; + sourceTree = ""; + }; + A102BDBA1F023B06000C6B38 /* Carthage */ = { + isa = PBXGroup; + children = ( + A102BDBB1F023B13000C6B38 /* Framework */, + A102BDBC1F023B18000C6B38 /* Tests */, + ); + name = Carthage; + sourceTree = ""; + }; + A102BDBB1F023B13000C6B38 /* Framework */ = { + isa = PBXGroup; + children = ( + A102BDC11F023BFC000C6B38 /* iOS */, + A102BDC21F023C00000C6B38 /* macOS */, + A102BDC41F023C0F000C6B38 /* tvOS */, + A102BDC31F023C08000C6B38 /* watchOS */, + ); + name = Framework; + sourceTree = ""; + }; + A102BDBC1F023B18000C6B38 /* Tests */ = { + isa = PBXGroup; + children = ( + A102BDC71F023C2B000C6B38 /* iOS */, + A102BDC81F023C2F000C6B38 /* macOS */, + A102BDC61F023C27000C6B38 /* tvOS */, + ); + name = Tests; + sourceTree = ""; + }; + A102BDC11F023BFC000C6B38 /* iOS */ = { + isa = PBXGroup; + children = ( + ); + name = iOS; + sourceTree = ""; + }; + A102BDC21F023C00000C6B38 /* macOS */ = { + isa = PBXGroup; + children = ( + ); + name = macOS; + sourceTree = ""; + }; + A102BDC31F023C08000C6B38 /* watchOS */ = { + isa = PBXGroup; + children = ( + ); + name = watchOS; + sourceTree = ""; + }; + A102BDC41F023C0F000C6B38 /* tvOS */ = { + isa = PBXGroup; + children = ( + ); + name = tvOS; + sourceTree = ""; + }; + A102BDC61F023C27000C6B38 /* tvOS */ = { + isa = PBXGroup; + children = ( + ); + name = tvOS; + sourceTree = ""; + }; + A102BDC71F023C2B000C6B38 /* iOS */ = { + isa = PBXGroup; + children = ( + ); + name = iOS; + sourceTree = ""; + }; + A102BDC81F023C2F000C6B38 /* macOS */ = { + isa = PBXGroup; + children = ( + ); + name = macOS; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + A102BD3B1F02355A000C6B38 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BDFF1F023E32000C6B38 /* NewFrameworkTemplate.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD5A1F023573000C6B38 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BE001F023E33000C6B38 /* NewFrameworkTemplate.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD761F023582000C6B38 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BE011F023E33000C6B38 /* NewFrameworkTemplate.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD921F02358E000C6B38 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BE021F023E34000C6B38 /* NewFrameworkTemplate.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + A102BD3D1F02355A000C6B38 /* NewFrameworkTemplate iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD521F02355A000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate iOS" */; + buildPhases = ( + A102BD391F02355A000C6B38 /* Sources */, + A102BD3A1F02355A000C6B38 /* Frameworks */, + A102BD3B1F02355A000C6B38 /* Headers */, + A102BD3C1F02355A000C6B38 /* Resources */, + A102BDD61F023D4A000C6B38 /* SwiftLint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "NewFrameworkTemplate iOS"; + productName = NewFrameworkTemplate; + productReference = A102BD3E1F02355A000C6B38 /* NewFrameworkTemplate.framework */; + productType = "com.apple.product-type.framework"; + }; + A102BD461F02355A000C6B38 /* NewFrameworkTemplate iOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD551F02355A000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate iOS Tests" */; + buildPhases = ( + A102BD431F02355A000C6B38 /* Sources */, + A102BD441F02355A000C6B38 /* Frameworks */, + A102BD451F02355A000C6B38 /* Resources */, + A102BDBD1F023B2B000C6B38 /* Carthage */, + ); + buildRules = ( + ); + dependencies = ( + A102BD4A1F02355A000C6B38 /* PBXTargetDependency */, + ); + name = "NewFrameworkTemplate iOS Tests"; + productName = NewFrameworkTemplateTests; + productReference = A102BD471F02355A000C6B38 /* NewFrameworkTemplate-iOS-Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + A102BD5C1F023573000C6B38 /* NewFrameworkTemplate macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD6E1F023573000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate macOS" */; + buildPhases = ( + A102BD581F023573000C6B38 /* Sources */, + A102BD591F023573000C6B38 /* Frameworks */, + A102BD5A1F023573000C6B38 /* Headers */, + A102BD5B1F023573000C6B38 /* Resources */, + A102BDD71F023D5B000C6B38 /* SwiftLint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "NewFrameworkTemplate macOS"; + productName = "NewFrameworkTemplate macOS"; + productReference = A102BD5D1F023573000C6B38 /* NewFrameworkTemplate.framework */; + productType = "com.apple.product-type.framework"; + }; + A102BD641F023573000C6B38 /* NewFrameworkTemplate macOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD711F023573000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate macOS Tests" */; + buildPhases = ( + A102BD611F023573000C6B38 /* Sources */, + A102BD621F023573000C6B38 /* Frameworks */, + A102BD631F023573000C6B38 /* Resources */, + A102BDBF1F023B3E000C6B38 /* Carthage */, + ); + buildRules = ( + ); + dependencies = ( + A102BD681F023573000C6B38 /* PBXTargetDependency */, + ); + name = "NewFrameworkTemplate macOS Tests"; + productName = "NewFrameworkTemplate macOSTests"; + productReference = A102BD651F023573000C6B38 /* NewFrameworkTemplate-macOS-Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + A102BD781F023582000C6B38 /* NewFrameworkTemplate tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD8A1F023582000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate tvOS" */; + buildPhases = ( + A102BD741F023582000C6B38 /* Sources */, + A102BD751F023582000C6B38 /* Frameworks */, + A102BD761F023582000C6B38 /* Headers */, + A102BD771F023582000C6B38 /* Resources */, + A102BDD81F023D6C000C6B38 /* SwiftLint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "NewFrameworkTemplate tvOS"; + productName = "NewFrameworkTemplate tvOS"; + productReference = A102BD791F023582000C6B38 /* NewFrameworkTemplate.framework */; + productType = "com.apple.product-type.framework"; + }; + A102BD801F023582000C6B38 /* NewFrameworkTemplate tvOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD8D1F023582000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate tvOS Tests" */; + buildPhases = ( + A102BD7D1F023582000C6B38 /* Sources */, + A102BD7E1F023582000C6B38 /* Frameworks */, + A102BD7F1F023582000C6B38 /* Resources */, + A102BDC01F023B47000C6B38 /* Carthage */, + ); + buildRules = ( + ); + dependencies = ( + A102BD841F023582000C6B38 /* PBXTargetDependency */, + ); + name = "NewFrameworkTemplate tvOS Tests"; + productName = "NewFrameworkTemplate tvOSTests"; + productReference = A102BD811F023582000C6B38 /* NewFrameworkTemplate-tvOS-Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + A102BD941F02358E000C6B38 /* NewFrameworkTemplate watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = A102BD9A1F02358E000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate watchOS" */; + buildPhases = ( + A102BD901F02358E000C6B38 /* Sources */, + A102BD911F02358E000C6B38 /* Frameworks */, + A102BD921F02358E000C6B38 /* Headers */, + A102BD931F02358E000C6B38 /* Resources */, + A102BDD91F023D80000C6B38 /* SwiftLint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "NewFrameworkTemplate watchOS"; + productName = "NewFrameworkTemplate watchOS"; + productReference = A102BD951F02358E000C6B38 /* NewFrameworkTemplate.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A102BD351F02355A000C6B38 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 1010; + ORGANIZATIONNAME = Flinesoft; + TargetAttributes = { + A102BD3D1F02355A000C6B38 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + A102BD461F02355A000C6B38 = { + CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1000; + ProvisioningStyle = Automatic; + }; + A102BD5C1F023573000C6B38 = { + CreatedOnToolsVersion = 9.0; + }; + A102BD641F023573000C6B38 = { + CreatedOnToolsVersion = 9.0; + }; + A102BD781F023582000C6B38 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + A102BD801F023582000C6B38 = { + CreatedOnToolsVersion = 9.0; + }; + A102BD941F02358E000C6B38 = { + CreatedOnToolsVersion = 9.0; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = A102BD381F02355A000C6B38 /* Build configuration list for PBXProject "NewFrameworkTemplate" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = A102BD341F02355A000C6B38; + productRefGroup = A102BD3F1F02355A000C6B38 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A102BD3D1F02355A000C6B38 /* NewFrameworkTemplate iOS */, + A102BD461F02355A000C6B38 /* NewFrameworkTemplate iOS Tests */, + A102BD5C1F023573000C6B38 /* NewFrameworkTemplate macOS */, + A102BD641F023573000C6B38 /* NewFrameworkTemplate macOS Tests */, + A102BD781F023582000C6B38 /* NewFrameworkTemplate tvOS */, + A102BD801F023582000C6B38 /* NewFrameworkTemplate tvOS Tests */, + A102BD941F02358E000C6B38 /* NewFrameworkTemplate watchOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A102BD3C1F02355A000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD451F02355A000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD5B1F023573000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD631F023573000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD771F023582000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD7F1F023582000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD931F02358E000C6B38 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + A102BDD61F023D4A000C6B38 /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if which swiftlint > /dev/null; then\n swiftlint --quiet\n else\n echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n fi\nfi\n"; + }; + A102BDD71F023D5B000C6B38 /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if which swiftlint > /dev/null; then\n swiftlint --quiet\n else\n echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n fi\nfi\n"; + }; + A102BDD81F023D6C000C6B38 /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if which swiftlint > /dev/null; then\n swiftlint --quiet\n else\n echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n fi\nfi\n"; + }; + A102BDD91F023D80000C6B38 /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ \"${CONFIGURATION}\" = \"Debug\" ]; then\n if which swiftlint > /dev/null; then\n swiftlint --quiet\n else\n echo \"warning: SwiftLint not installed, download it from https://github.com/realm/SwiftLint\"\n fi\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A102BD391F02355A000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD431F02355A000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BDB31F0238E8000C6B38 /* ExampleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD581F023573000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD611F023573000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BDB41F0238E8000C6B38 /* ExampleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD741F023582000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD7D1F023582000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A102BDB51F0238E9000C6B38 /* ExampleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A102BD901F02358E000C6B38 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + A102BD4A1F02355A000C6B38 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A102BD3D1F02355A000C6B38 /* NewFrameworkTemplate iOS */; + targetProxy = A102BD491F02355A000C6B38 /* PBXContainerItemProxy */; + }; + A102BD681F023573000C6B38 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A102BD5C1F023573000C6B38 /* NewFrameworkTemplate macOS */; + targetProxy = A102BD671F023573000C6B38 /* PBXContainerItemProxy */; + }; + A102BD841F023582000C6B38 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A102BD781F023582000C6B38 /* NewFrameworkTemplate tvOS */; + targetProxy = A102BD831F023582000C6B38 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + A102BD501F02355A000C6B38 /* 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_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_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + 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 = ( + "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; + INFOPLIST_FILE = "Sources/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(PRODUCT_NAME:c99extidentifier)"; + PRODUCT_NAME = NewFrameworkTemplate; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + A102BD511F02355A000C6B38 /* 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_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_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + 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; + INFOPLIST_FILE = "Sources/Supporting Files/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(PRODUCT_NAME:c99extidentifier)"; + PRODUCT_NAME = NewFrameworkTemplate; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.2; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A102BD531F02355A000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + A102BD541F02355A000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + A102BD561F02355A000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 8DHP3ZYQ2N; + INFOPLIST_FILE = Tests/SupportingFiles/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(TARGET_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME:rfc1034identifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + A102BD571F02355A000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 8DHP3ZYQ2N; + INFOPLIST_FILE = Tests/SupportingFiles/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(TARGET_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME:rfc1034identifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + A102BD6F1F023573000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + A102BD701F023573000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + A102BD721F023573000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 767S6EFMJ8; + INFOPLIST_FILE = Tests/SupportingFiles/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(TARGET_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME:rfc1034identifier)"; + SDKROOT = macosx; + }; + name = Debug; + }; + A102BD731F023573000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = 767S6EFMJ8; + INFOPLIST_FILE = Tests/SupportingFiles/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(TARGET_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME:rfc1034identifier)"; + SDKROOT = macosx; + }; + name = Release; + }; + A102BD8B1F023582000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + A102BD8C1F023582000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Release; + }; + A102BD8E1F023582000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Tests/SupportingFiles/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(TARGET_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME:rfc1034identifier)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 11.0; + }; + name = Debug; + }; + A102BD8F1F023582000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Tests/SupportingFiles/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.flinesoft.$(TARGET_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME:rfc1034identifier)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 11.0; + }; + name = Release; + }; + A102BD9B1F02358E000C6B38 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Debug; + }; + A102BD9C1F02358E000C6B38 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Frameworks/SupportingFiles/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A102BD381F02355A000C6B38 /* Build configuration list for PBXProject "NewFrameworkTemplate" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD501F02355A000C6B38 /* Debug */, + A102BD511F02355A000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD521F02355A000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD531F02355A000C6B38 /* Debug */, + A102BD541F02355A000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD551F02355A000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate iOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD561F02355A000C6B38 /* Debug */, + A102BD571F02355A000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD6E1F023573000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD6F1F023573000C6B38 /* Debug */, + A102BD701F023573000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD711F023573000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate macOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD721F023573000C6B38 /* Debug */, + A102BD731F023573000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD8A1F023582000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD8B1F023582000C6B38 /* Debug */, + A102BD8C1F023582000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD8D1F023582000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate tvOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD8E1F023582000C6B38 /* Debug */, + A102BD8F1F023582000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A102BD9A1F02358E000C6B38 /* Build configuration list for PBXNativeTarget "NewFrameworkTemplate watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A102BD9B1F02358E000C6B38 /* Debug */, + A102BD9C1F02358E000C6B38 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = A102BD351F02355A000C6B38 /* Project object */; +} diff --git a/NewFrameworkTemplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/NewFrameworkTemplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..0f8ecfe --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/NewFrameworkTemplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/NewFrameworkTemplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100755 index 0000000..18d9810 --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/NewFrameworkTemplate.xcodeproj/xcshareddata/IDETemplateMacros.plist b/NewFrameworkTemplate.xcodeproj/xcshareddata/IDETemplateMacros.plist new file mode 100755 index 0000000..859887a --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/xcshareddata/IDETemplateMacros.plist @@ -0,0 +1,11 @@ + + + + + FILEHEADER + +// Created by ___FULLUSERNAME___ on ___DATE___. +// ___COPYRIGHT___ +// + + diff --git a/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate iOS.xcscheme b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate iOS.xcscheme new file mode 100755 index 0000000..e0a3d16 --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate iOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate macOS.xcscheme b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate macOS.xcscheme new file mode 100755 index 0000000..a528203 --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate macOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate tvOS.xcscheme b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate tvOS.xcscheme new file mode 100755 index 0000000..606e2b7 --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate tvOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate watchOS.xcscheme b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate watchOS.xcscheme new file mode 100755 index 0000000..6a2d707 --- /dev/null +++ b/NewFrameworkTemplate.xcodeproj/xcshareddata/xcschemes/NewFrameworkTemplate watchOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NewFrameworkTemplate.xcworkspace/contents.xcworkspacedata b/NewFrameworkTemplate.xcworkspace/contents.xcworkspacedata new file mode 100755 index 0000000..a23dc00 --- /dev/null +++ b/NewFrameworkTemplate.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/NewFrameworkTemplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/NewFrameworkTemplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100755 index 0000000..18d9810 --- /dev/null +++ b/NewFrameworkTemplate.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Package.swift b/Package.swift new file mode 100755 index 0000000..8b9e495 --- /dev/null +++ b/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version:4.2 +import PackageDescription + +let package = Package( + name: "NewFrameworkTemplate", + products: [ + .library(name: "NewFrameworkTemplate", targets: ["NewFrameworkTemplate"]) + ], + dependencies: [ +// .package(url: "https://github.com/Flinesoft/HandySwift.git", .upToNextMajor(from: "2.5.0")), +// .package(url: "https://github.com/Flinesoft/HandyUIKit.git", .upToNextMajor(from: "1.6.0")) + ], + targets: [ + .target( + name: "NewFrameworkTemplate", + dependencies: [ +// "HandySwift", +// "HandyUIKit" + ], + path: "Frameworks/NewFrameworkTemplate", + exclude: ["Frameworks/SupportingFiles"] + ), + .testTarget( + name: "NewFrameworkTemplateTests", + dependencies: ["NewFrameworkTemplate"], + exclude: ["Tests/SupportingFiles"] + ) + ] +) diff --git a/README.md b/README.md new file mode 100755 index 0000000..bab59cf --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ + +

+ +

+ +

+ + Build Status + + + codebeat badge + + + Version: 0.1.0 + + Swift: 4.2 + Platforms: iOS | macOS | tvOS | watchOS + + License: MIT + +

+ +

+ Installation + • Usage + • Issues + • Contributing + • License +

+ + +# NewFrameworkTemplate + +A preconfigured template for new framework projects with batteries included. + +Specifically this is what "battries included" currently means: + +- There's a sensible `.gitignore` for Swift projects included (based on [GitHub gitignore](https://github.com/github/gitignore/blob/master/Swift.gitignore)) +- Targets are configured for iOS, macOS, tvOS & watchOS (just remove what you don't need) +- SwiftLint is preconfigured to help embrace a unified code style +- Support for [Carthage](https://github.com/Carthage/Carthage), [CocoaPods](https://github.com/CocoaPods/CocoaPods) and [Swift Package Manager](https://github.com/apple/swift-package-manager) is setup +- A `README.md` file is setup with appropriate sections +- A `LICENSE` file is setup with MIT license preconfigured + +## Prerequisites + +To use this framework, you need to install a few tools: + +- [Homebrew](https://brew.sh): `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` +- [Beak](https://github.com/yonaskolb/Beak): `brew tap yonaskolb/Beak https://github.com/yonaskolb/Beak.git && brew install Beak` +- [Carthage](https://github.com/Carthage/Carthage): `brew install carthage` +- [SwiftLint](https://github.com/realm/SwiftLint): `brew install swiftlint` + + +## Getting Started + +Here's a few simple steps on how you can use this project to kick-start your next framework project: + +1. **Clone this repo** to your own Git server or **download as ZIP file** (beware) +2. Run `beak run initialize --projectName YourFrameworkName --organization "Your Organization"` to **initialize the project** +3. Set the the **Development Team** to yours (at least in the test targets) +4. Update the **author and social_media_url** entries in the .podspec file + +Additional options you probably want to check: + +5. **Remove the targets and schemes** you are not planning to develop for (all Apple platforms supported by default) +6. Configure the **minimum deployment target** per target (the latest major version by default) + +That's it! Start coding. 🎉 😊 + + +## Contributing + +See the file [CONTRIBUTING.md](https://github.com/JamitLabs/MungoHealer/blob/stable/CONTRIBUTING.md). + + +## License +This library is released under the [MIT License](http://opensource.org/licenses/MIT). See LICENSE for details. diff --git a/README.md.sample b/README.md.sample new file mode 100755 index 0000000..484b36a --- /dev/null +++ b/README.md.sample @@ -0,0 +1,101 @@ +

+ +

+ +

+ + Version: 0.1.0 + + Swift: 4.2 + Platforms: iOS | macOS | tvOS | watchOS + + License: MIT + +

+ +

+ Installation + • Usage + • Issues + • Contributing + • License +

+ +# NewFrameworkTemplate + +TODO: Summarize the project goals here. + +## Installation + +### Carthage + +Place the following line to your Cartfile: + +``` Swift +github "Flinesoft/NewFrameworkTemplate" ~> 1.0 +``` + +Now run `carthage update`. Then drag & drop the NewFrameworkTemplate.framework in the Carthage/Build folder to your project. Now you can `import NewFrameworkTemplate` in each class you want to use its features. Refer to the [Carthage README](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application) for detailed / updated instructions. + +### CocoaPods + +Add the line `pod 'NewFrameworkTemplate'` to your target in your `Podfile` and make sure to include `use_frameworks!` +at the top. The result might look similar to this: + +``` Ruby +platform :ios, '8.0' +use_frameworks! + +target 'MyAppTarget' do + pod 'NewFrameworkTemplate', '~> 1.0' +end +``` + +Now close your project and run `pod install` from the command line. Then open the `.xcworkspace` from within your project folder. +Build your project once (with `Cmd+B`) to update the frameworks known to Xcode. Now you can `import NewFrameworkTemplate` in each class you want to use its features. +Refer to [CocoaPods.org](https://cocoapods.org) for detailed / updates instructions. + +## Usage + +Please have a look at the UsageExamples.playground for a complete list of features provided. +Open the Playground from within the `.xcworkspace` in order for it to work. + +--- +#### Features Overview + +- [Short Section](#short-section) +- Sections Group + - [SubSection1](#subsection1) + - [SubSection2](#subsection2) + +--- + +### Short Section + +TODO: Add some usage information here. + +### Sections Group + +TODO: Summarize the section here. + +#### SubSection1 + +TODO: Add some usage information here. + +#### SubSection2 + +TODO: Add some usage information here. + + +## Contributing + +See the file [CONTRIBUTING.md](https://github.com/JamitLabs/MungoHealer/blob/stable/CONTRIBUTING.md). + + +## License +This library is released under the [MIT License](http://opensource.org/licenses/MIT). See LICENSE for details. diff --git a/Tests/NewFrameworkTemplateTests/ExampleTests.swift b/Tests/NewFrameworkTemplateTests/ExampleTests.swift new file mode 100755 index 0000000..676a7dd --- /dev/null +++ b/Tests/NewFrameworkTemplateTests/ExampleTests.swift @@ -0,0 +1,11 @@ +// +// Created by Cihat Gündüz on 27.06.17. +// Copyright © 2017 Flinesoft. All rights reserved. +// + +@testable import NewFrameworkTemplate +import XCTest + +class ExampleTests: XCTestCase { + // TODO: not yet implemented +} diff --git a/Tests/SupportingFiles/Info.plist b/Tests/SupportingFiles/Info.plist new file mode 100755 index 0000000..6c40a6c --- /dev/null +++ b/Tests/SupportingFiles/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/UsageExamples.playground/Contents.swift b/UsageExamples.playground/Contents.swift new file mode 100755 index 0000000..2540ce6 --- /dev/null +++ b/UsageExamples.playground/Contents.swift @@ -0,0 +1,5 @@ +// swiftlint:disable file_header +import Foundation +import NewFrameworkTemplate + +// Add your usage examples here. diff --git a/UsageExamples.playground/contents.xcplayground b/UsageExamples.playground/contents.xcplayground new file mode 100755 index 0000000..5da2641 --- /dev/null +++ b/UsageExamples.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/beak.swift b/beak.swift new file mode 100755 index 0000000..d83e86b --- /dev/null +++ b/beak.swift @@ -0,0 +1,279 @@ +// beak: kareman/SwiftShell @ .upToNextMajor(from: "4.0.1") +// beak: kylef/PathKit @ .upToNextMajor(from: "0.9.1") +// beak: onevcat/Rainbow @ .upToNextMajor(from: "3.1.2") +// beak: Flinesoft/HandySwift @ .upToNextMajor(from: "2.6.0") + +import HandySwift +import Foundation +import SwiftShell +import PathKit +import Rainbow + +let supportedPlatforms = ["iOS", "tvOS", "macOS", "watchOS"] + +// MARK: - Helpers +private func deleteFile(_ fileName: String) throws { + let command = "[ ! -e \(fileName) ] || rm \(fileName)" + print("Deleting file '\(fileName)': '\(command)'", level: .info) + try runAndPrint(bash: command) +} + +private func renameProject(from oldName: String, to newName: String) throws { + var filesToReplaceContent: [Path] = [ + Path(oldName + ".xcodeproj/project.pbxproj"), + Path(oldName + ".xcodeproj/project.xcworkspace/contents.xcworkspacedata"), + Path(".projlint.yml") + ] + + filesToReplaceContent += supportedPlatforms.map { Path(oldName + ".xcodeproj/xcshareddata/xcschemes/\(oldName) \($0).xcscheme") } + filesToReplaceContent += Path.glob("Frameworks/**/*.swift") + filesToReplaceContent += Path.glob("Tests/**/*.swift") + filesToReplaceContent += [ + "README.md", "Package.swift", "Frameworks/SupportingFiles/\(oldName).h", "UsageExamples.playground/Contents.swift", + "\(oldName).xcworkspace/contents.xcworkspacedata", "\(oldName).podspec" + ].map { Path($0) } + + try filesToReplaceContent.forEach { swiftFilePath in + try replaceInFile(fileUrl: swiftFilePath.url, regex: try Regex(oldName), replacement: newName) + } + + try supportedPlatforms.forEach { platform in + let oldSchemePath = "\(oldName).xcodeproj/xcshareddata/xcschemes/\(oldName)\\ \(platform).xcscheme" + let newSchemePath = "\(oldName).xcodeproj/xcshareddata/xcschemes/\(newName)\\ \(platform).xcscheme" + try runAndPrint(bash: "mv \(oldSchemePath) \(newSchemePath)") + } + + try runAndPrint(bash: "mv \(oldName).xcodeproj/ \(newName).xcodeproj/") + try runAndPrint(bash: "mv \(oldName).xcworkspace/ \(newName).xcworkspace/") + try runAndPrint(bash: "mv \(oldName).podspec \(newName).podspec") + try runAndPrint(bash: "mv Frameworks/SupportingFiles/\(oldName).h Frameworks/SupportingFiles/\(newName).h") + try runAndPrint(bash: "mv Frameworks/\(oldName) Frameworks/\(newName)") + try runAndPrint(bash: "mv Tests/\(oldName)Tests Tests/\(newName)Tests") +} + +private func renameOrganization(from oldName: String, to newName: String, projectName: String) throws { + var filesToReplaceContent: [Path] = [ + Path("LICENSE"), + Path("README.md"), + Path("\(projectName).podspec"), + Path("\(projectName).xcodeproj/project.pbxproj"), + Path("Frameworks/SupportingFiles/\(projectName).h"), + Path(".swiftlint.yml"), + Path(".projlint.yml") + ] + + filesToReplaceContent += Path.glob("Frameworks/**/*.swift") + filesToReplaceContent += Path.glob("Tests/**/*.swift") + + // replace normal URL appearances + let oldNameWithoutWhitespaces = oldName.components(separatedBy: .whitespaces).joined() + let newNameWithoutWhitespaces = newName.components(separatedBy: .whitespaces).joined() + + let urlRegex = try Regex("\(oldNameWithoutWhitespaces)/") + try filesToReplaceContent.forEach { swiftFilePath in + try replaceInFile(fileUrl: swiftFilePath.url, regex: urlRegex, replacement: "\(newNameWithoutWhitespaces)/") + } + + // replace reversed URl appearances + let reversedUrlRegex = try Regex("com.\(oldNameWithoutWhitespaces.lowercased())") + try filesToReplaceContent.forEach { swiftFilePath in + try replaceInFile(fileUrl: swiftFilePath.url, regex: reversedUrlRegex, replacement: "com.\(newNameWithoutWhitespaces.lowercased())") + } + + // replace other + try filesToReplaceContent.forEach { swiftFilePath in + try replaceInFile(fileUrl: swiftFilePath.url, regex: try Regex(oldName), replacement: newName) + } +} + +private func replaceInFile(fileUrl: URL, regex: Regex, replacement: String) throws { + print("Replacing occurences of regex '\(regex)' in file '\(fileUrl.lastPathComponent)' with '\(replacement)' ...", level: .info) + var content = try String(contentsOf: fileUrl, encoding: .utf8) + content = regex.replacingMatches(in: content, with: replacement) + try content.write(to: fileUrl, atomically: false, encoding: .utf8) +} + +private func replaceInFile(fileUrl: URL, substring: String, replacement: String) throws { + print("Replacing occurences of substring '\(substring)' in file '\(fileUrl.lastPathComponent)' with '\(replacement)' ...", level: .info) + var content = try String(contentsOf: fileUrl, encoding: .utf8) + content = content.replacingOccurrences(of: substring, with: replacement) + try content.write(to: fileUrl, atomically: false, encoding: .utf8) +} + +private enum PrintLevel { + case info + case warning + case error +} + +private func print(_ message: String, level: PrintLevel) { + switch level { + case .info: + print("ℹ️ ", message.lightBlue) + + case .warning: + print("⚠️ ", message.yellow) + + case .error: + print("❌ ", message.red) + } +} + +private let semanticVersionRegex = try Regex("(\\d+)\\.(\\d+)\\.(\\d+)\\s") + +private struct SemanticVersion: Comparable, CustomStringConvertible { + let major: Int + let minor: Int + let patch: Int + + init(_ string: String) { + guard let captures = semanticVersionRegex.firstMatch(in: string)?.captures else { + fatalError("SemanticVersion initializer was used without checking the structure.") + } + + major = Int(captures[0]!)! + minor = Int(captures[1]!)! + patch = Int(captures[2]!)! + } + + static func < (lhs: SemanticVersion, rhs: SemanticVersion) -> Bool { + guard lhs.major == rhs.major else { return lhs.major < rhs.major } + guard lhs.minor == rhs.minor else { return lhs.minor < rhs.minor } + return lhs.patch < rhs.patch + } + + static func == (lhs: SemanticVersion, rhs: SemanticVersion) -> Bool { + return lhs.major == rhs.major && lhs.minor == rhs.minor && lhs.patch == rhs.patch + } + + var description: String { + return "\(major).\(minor)" + } +} + +private func appendEntryToCartfile(_ tagline: String?, _ githubSubpath: String, _ version: String) throws { + let comment = tagline != nil ? "# \(tagline!)\n" : "" + let repoSpecifier = "github \"\(githubSubpath)\"" + let versionSpecifier: String = { + guard version != "latest" else { + let tagListCommand = "git ls-remote --tags https://github.com/\(githubSubpath).git" + let commandOutput = run(bash: tagListCommand).stdout + let availableSemanticVersions = semanticVersionRegex.matches(in: commandOutput).map { SemanticVersion($0.string) } + guard !availableSemanticVersions.isEmpty else { + print("Dependency '\(githubSubpath)' has no tagged versions.", level: .error) + fatalError() + } + let latestVersion = availableSemanticVersions.sorted().last! + return " ~> \(latestVersion)" + } + + return " ~> \(version)" + }() + + let textToAddToCartfile = "\n\(comment)\(repoSpecifier)\(versionSpecifier)\n" + + let command = "echo '\(textToAddToCartfile)' >> Cartfile" + print("Adding entry to Cartfile with: '\(command)'", level: .info) + try runAndPrint(bash: command) +} + +private func fetchGitHubTagline(subpath: String) throws -> String? { + let taglineRegex = try Regex("[^\\:]+\\: (.*)<\\/title>") + let url = URL(string: "https://github.com/\(subpath)")! + let html = try String(contentsOf: url, encoding: .utf8) + guard let firstMatch = taglineRegex.firstMatch(in: html) else { return nil } + guard let firstCapture = firstMatch.captures.first else { return nil } + return firstCapture! +} + +private func pathOfXcodeProject() -> Path { + return Path.current.glob("*.xcodeproj").first! +} + +typealias Framework = (identifier: String, name: String) + +private func pbxProjectFilePath() -> Path { + return pathOfXcodeProject() + Path("project.pbxproj") +} + +private func pbxProjectFileContent() throws -> String { + return try pbxProjectFilePath().read(.utf8) +} + +private struct CartfileEntry: CustomStringConvertible { + let commentLine: String? + let dependencyDefinitionLine: String + + var description: String { + guard let commentLine = commentLine else { return dependencyDefinitionLine } + return [commentLine, dependencyDefinitionLine].joined(separator: "\n") + } +} + +// MARK: - Tasks +/// Initializes the project with the given info. +public func initialize(projectName: String, organization: String) throws { + try ["README.md", "Logo.png"].forEach { try deleteFile($0) } + try runAndPrint(bash: "mv README.md.sample README.md") + try renameProject(from: "NewFrameworkTemplate", to: projectName) + try renameOrganization(from: "Flinesoft", to: organization, projectName: projectName) + try updateDependencies() +} + +/// Installs project dependencies. +public func installDependencies() throws { + let command = "carthage bootstrap --platform \(supportedPlatforms.joined(separator: ",")) --cache-builds" + print("Installing dependencies via Carthage: '\(command)'", level: .info) + try runAndPrint(bash: command) +} + +/// Updates project dependencies. +public func updateDependencies() throws { + let command = "carthage update --platform \(supportedPlatforms.joined(separator: ",")) --cache-builds" + print("Updating dependencies via Carthage: \(command)", level: .info) + try runAndPrint(bash: command) +} + +/// Adds a dependency using the configured package manager. +public func addDependency(github githubSubpath: String, version: String = "latest") throws { + let tagline = try fetchGitHubTagline(subpath: githubSubpath) + try appendEntryToCartfile(tagline, githubSubpath, version) + try sortCartfile() + try updateDependencies() + + print("Please add the new frameworks to your projects 'Carthage >> Framework' groups related platforms in the project navigator.", level: .warning) + + run(bash: "open -a Finder Carthage/Build/") +} + +/// Sorts the contents of Cartfile and Cartfile.private. +public func sortCartfile() throws { + let dependecyLineRegex = try Regex("#? ?(?:github|binary|git) \"[^\"]+/([^\"]+)\".*") + + try ["Cartfile", "Cartfile.private"].forEach { fileName in + let cartfileContents = try String(contentsOfFile: fileName) + let cartfileLines = cartfileContents.components(separatedBy: .newlines).filter { !$0.isBlank } + + var temporaryComment: String? + let cartfileEntries: [CartfileEntry] = cartfileLines.compactMap { line in + if dependecyLineRegex.matches(line) { + let newEntry = CartfileEntry(commentLine: temporaryComment, dependencyDefinitionLine: line) + temporaryComment = nil + return newEntry + } else { + temporaryComment = line + return nil + } + } + + let compareClosure = { (lhs: CartfileEntry, rhs: CartfileEntry) -> Bool in + let lhsDependencyName = dependecyLineRegex.firstMatch(in: lhs.dependencyDefinitionLine)!.captures.first!!.lowercased() + let rhsDependencyName = dependecyLineRegex.firstMatch(in: rhs.dependencyDefinitionLine)!.captures.first!!.lowercased() + return lhsDependencyName < rhsDependencyName + } + + let sortedCartfilEntries = cartfileEntries.sorted(by: compareClosure, stable: false) + let newCartfileContents = sortedCartfilEntries.map { $0.description }.joined(separator: "\n\n") + "\n" + try newCartfileContents.write(toFile: fileName, atomically: false, encoding: .utf8) + } +}