├── .gitignore
├── README.md
├── cartool.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── steven.xcuserdatad
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── cartool.xcscheme
└── project.pbxproj
└── cartool
├── cartool-Prefix.pch
├── cartool.1
└── main.m
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | xcuserdata/
3 | *.xccheckout
4 |
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | cartool
2 | =======
3 |
4 | Export images from OS X / iOS .car CoreUI archives. Very rough code, probably tons wrong with it, but still useful.
5 |
--------------------------------------------------------------------------------
/cartool.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/cartool/cartool-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header
3 | //
4 | // The contents of this file are implicitly included at the beginning of every source file.
5 | //
6 |
7 | #ifdef __OBJC__
8 | #import
9 | #endif
10 |
--------------------------------------------------------------------------------
/cartool.xcodeproj/xcuserdata/steven.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | cartool.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | B06C818617934BA30082BD37
16 |
17 | primary
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/cartool/cartool.1:
--------------------------------------------------------------------------------
1 | .\"Modified from man(1) of FreeBSD, the NetBSD mdoc.template, and mdoc.samples.
2 | .\"See Also:
3 | .\"man mdoc.samples for a complete listing of options
4 | .\"man mdoc for the short list of editing options
5 | .\"/usr/share/misc/mdoc.template
6 | .Dd 14/07/2013 \" DATE
7 | .Dt cartool 1 \" Program name and manual section number
8 | .Os Darwin
9 | .Sh NAME \" Section Header - required - don't modify
10 | .Nm cartool,
11 | .\" The following lines are read in generating the apropos(man -k) database. Use only key
12 | .\" words here as the database is built based on the words here and in the .ND line.
13 | .Nm Other_name_for_same_program(),
14 | .Nm Yet another name for the same program.
15 | .\" Use .Nm macro to designate other names for the documented program.
16 | .Nd This line parsed for whatis database.
17 | .Sh SYNOPSIS \" Section Header - required - don't modify
18 | .Nm
19 | .Op Fl abcd \" [-abcd]
20 | .Op Fl a Ar path \" [-a path]
21 | .Op Ar file \" [file]
22 | .Op Ar \" [file ...]
23 | .Ar arg0 \" Underlined argument - use .Ar anywhere to underline
24 | arg2 ... \" Arguments
25 | .Sh DESCRIPTION \" Section Header - required - don't modify
26 | Use the .Nm macro to refer to your program throughout the man page like such:
27 | .Nm
28 | Underlining is accomplished with the .Ar macro like this:
29 | .Ar underlined text .
30 | .Pp \" Inserts a space
31 | A list of items with descriptions:
32 | .Bl -tag -width -indent \" Begins a tagged list
33 | .It item a \" Each item preceded by .It macro
34 | Description of item a
35 | .It item b
36 | Description of item b
37 | .El \" Ends the list
38 | .Pp
39 | A list of flags and their descriptions:
40 | .Bl -tag -width -indent \" Differs from above in tag removed
41 | .It Fl a \"-a flag as a list item
42 | Description of -a flag
43 | .It Fl b
44 | Description of -b flag
45 | .El \" Ends the list
46 | .Pp
47 | .\" .Sh ENVIRONMENT \" May not be needed
48 | .\" .Bl -tag -width "ENV_VAR_1" -indent \" ENV_VAR_1 is width of the string ENV_VAR_1
49 | .\" .It Ev ENV_VAR_1
50 | .\" Description of ENV_VAR_1
51 | .\" .It Ev ENV_VAR_2
52 | .\" Description of ENV_VAR_2
53 | .\" .El
54 | .Sh FILES \" File used or created by the topic of the man page
55 | .Bl -tag -width "/Users/joeuser/Library/really_long_file_name" -compact
56 | .It Pa /usr/share/file_name
57 | FILE_1 description
58 | .It Pa /Users/joeuser/Library/really_long_file_name
59 | FILE_2 description
60 | .El \" Ends the list
61 | .\" .Sh DIAGNOSTICS \" May not be needed
62 | .\" .Bl -diag
63 | .\" .It Diagnostic Tag
64 | .\" Diagnostic informtion here.
65 | .\" .It Diagnostic Tag
66 | .\" Diagnostic informtion here.
67 | .\" .El
68 | .Sh SEE ALSO
69 | .\" List links in ascending order by section, alphabetically within a section.
70 | .\" Please do not reference files that do not exist without filing a bug report
71 | .Xr a 1 ,
72 | .Xr b 1 ,
73 | .Xr c 1 ,
74 | .Xr a 2 ,
75 | .Xr b 2 ,
76 | .Xr a 3 ,
77 | .Xr b 3
78 | .\" .Sh BUGS \" Document known, unremedied bugs
79 | .\" .Sh HISTORY \" Document history if command behaves in a unique manner
--------------------------------------------------------------------------------
/cartool.xcodeproj/xcuserdata/steven.xcuserdatad/xcschemes/cartool.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
51 |
52 |
58 |
59 |
60 |
61 |
62 |
63 |
69 |
70 |
76 |
77 |
78 |
79 |
81 |
82 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/cartool/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // cartool
4 | //
5 | // Created by Steven Troughton-Smith on 14/07/2013.
6 | // Copyright (c) 2013 High Caffeine Content. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 |
12 | @interface CUICommonAssetStorage : NSObject
13 |
14 | -(NSArray *)allAssetKeys;
15 | -(NSArray *)allRenditionNames;
16 |
17 | -(id)initWithPath:(NSString *)p;
18 |
19 | -(NSString *)versionString;
20 |
21 | @end
22 |
23 | @interface CUINamedImage : NSObject
24 |
25 | -(CGImageRef)image;
26 |
27 | @end
28 |
29 | @interface CUIRenditionKey : NSObject
30 | @end
31 |
32 | @interface CUIThemeFacet : NSObject
33 |
34 | +(CUIThemeFacet *)themeWithContentsOfURL:(NSURL *)u error:(NSError **)e;
35 |
36 | @end
37 |
38 | @interface CUICatalog : NSObject
39 |
40 | -(id)initWithName:(NSString *)n fromBundle:(NSBundle *)b;
41 | -(id)allKeys;
42 | -(CUINamedImage *)imageWithName:(NSString *)n scaleFactor:(CGFloat)s;
43 | -(CUINamedImage *)imageWithName:(NSString *)n scaleFactor:(CGFloat)s deviceIdiom:(int)idiom;
44 |
45 | @end
46 |
47 | #define kCoreThemeIdiomPhone 1
48 | #define kCoreThemeIdiomPad 2
49 |
50 | void CGImageWriteToFile(CGImageRef image, NSString *path)
51 | {
52 | CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
53 | CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
54 | CGImageDestinationAddImage(destination, image, nil);
55 |
56 | if (!CGImageDestinationFinalize(destination)) {
57 | NSLog(@"Failed to write image to %@", path);
58 | }
59 |
60 | CFRelease(destination);
61 | }
62 |
63 |
64 | void exportCarFileAtPath(NSString * carPath, NSString *outputDirectoryPath)
65 | {
66 | NSError *error = nil;
67 |
68 | outputDirectoryPath = [outputDirectoryPath stringByExpandingTildeInPath];
69 |
70 | CUIThemeFacet *facet = [CUIThemeFacet themeWithContentsOfURL:[NSURL fileURLWithPath:carPath] error:&error];
71 |
72 | CUICatalog *catalog = [[CUICatalog alloc] init];
73 |
74 | /* Override CUICatalog to point to a file rather than a bundle */
75 | [catalog setValue:facet forKey:@"_storageRef"];
76 |
77 | /* CUICommonAssetStorage won't link */
78 | CUICommonAssetStorage *storage = [[NSClassFromString(@"CUICommonAssetStorage") alloc] initWithPath:carPath];
79 |
80 | for (NSString *key in [storage allRenditionNames])
81 | {
82 | printf("%s\n", [key UTF8String]);
83 |
84 | CGImageRef iphone2X = [[catalog imageWithName:key scaleFactor:2.0 deviceIdiom:kCoreThemeIdiomPhone] image];
85 | CGImageRef iphone3X = [[catalog imageWithName:key scaleFactor:3.0 deviceIdiom:kCoreThemeIdiomPhone] image];
86 |
87 | if (iphone2X)
88 | CGImageWriteToFile(iphone2X, [outputDirectoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.png", key]]);
89 |
90 | if (iphone3X)
91 | CGImageWriteToFile(iphone3X, [outputDirectoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@3x.png", key]]);
92 | }
93 | }
94 |
95 | int main(int argc, const char * argv[])
96 | {
97 | @autoreleasepool {
98 |
99 | if (argc != 3)
100 | {
101 | printf("Usage: cartool Assets.car outputDirectory\n");
102 | return -1;
103 | }
104 |
105 | exportCarFileAtPath([NSString stringWithUTF8String:argv[1]], [NSString stringWithUTF8String:argv[2]]);
106 |
107 | }
108 | return 0;
109 | }
--------------------------------------------------------------------------------
/cartool.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | B06C818B17934BA30082BD37 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B06C818A17934BA30082BD37 /* Foundation.framework */; };
11 | B06C818E17934BA30082BD37 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B06C818D17934BA30082BD37 /* main.m */; };
12 | B06C819217934BA30082BD37 /* cartool.1 in CopyFiles */ = {isa = PBXBuildFile; fileRef = B06C819117934BA30082BD37 /* cartool.1 */; };
13 | B06C819917934BCC0082BD37 /* CoreUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B06C819817934BCC0082BD37 /* CoreUI.framework */; };
14 | /* End PBXBuildFile section */
15 |
16 | /* Begin PBXCopyFilesBuildPhase section */
17 | B06C818517934BA30082BD37 /* CopyFiles */ = {
18 | isa = PBXCopyFilesBuildPhase;
19 | buildActionMask = 2147483647;
20 | dstPath = /usr/share/man/man1/;
21 | dstSubfolderSpec = 0;
22 | files = (
23 | B06C819217934BA30082BD37 /* cartool.1 in CopyFiles */,
24 | );
25 | runOnlyForDeploymentPostprocessing = 1;
26 | };
27 | /* End PBXCopyFilesBuildPhase section */
28 |
29 | /* Begin PBXFileReference section */
30 | B06C818717934BA30082BD37 /* cartool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cartool; sourceTree = BUILT_PRODUCTS_DIR; };
31 | B06C818A17934BA30082BD37 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
32 | B06C818D17934BA30082BD37 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
33 | B06C819017934BA30082BD37 /* cartool-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "cartool-Prefix.pch"; sourceTree = ""; };
34 | B06C819117934BA30082BD37 /* cartool.1 */ = {isa = PBXFileReference; lastKnownFileType = text.man; path = cartool.1; sourceTree = ""; };
35 | B06C819817934BCC0082BD37 /* CoreUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreUI.framework; path = ../../../../../../System/Library/PrivateFrameworks/CoreUI.framework; sourceTree = ""; };
36 | /* End PBXFileReference section */
37 |
38 | /* Begin PBXFrameworksBuildPhase section */
39 | B06C818417934BA30082BD37 /* Frameworks */ = {
40 | isa = PBXFrameworksBuildPhase;
41 | buildActionMask = 2147483647;
42 | files = (
43 | B06C819917934BCC0082BD37 /* CoreUI.framework in Frameworks */,
44 | B06C818B17934BA30082BD37 /* Foundation.framework in Frameworks */,
45 | );
46 | runOnlyForDeploymentPostprocessing = 0;
47 | };
48 | /* End PBXFrameworksBuildPhase section */
49 |
50 | /* Begin PBXGroup section */
51 | B06C817E17934BA30082BD37 = {
52 | isa = PBXGroup;
53 | children = (
54 | B06C818C17934BA30082BD37 /* cartool */,
55 | B06C818917934BA30082BD37 /* Frameworks */,
56 | B06C818817934BA30082BD37 /* Products */,
57 | );
58 | sourceTree = "";
59 | };
60 | B06C818817934BA30082BD37 /* Products */ = {
61 | isa = PBXGroup;
62 | children = (
63 | B06C818717934BA30082BD37 /* cartool */,
64 | );
65 | name = Products;
66 | sourceTree = "";
67 | };
68 | B06C818917934BA30082BD37 /* Frameworks */ = {
69 | isa = PBXGroup;
70 | children = (
71 | B06C819817934BCC0082BD37 /* CoreUI.framework */,
72 | B06C818A17934BA30082BD37 /* Foundation.framework */,
73 | );
74 | name = Frameworks;
75 | sourceTree = "";
76 | };
77 | B06C818C17934BA30082BD37 /* cartool */ = {
78 | isa = PBXGroup;
79 | children = (
80 | B06C818D17934BA30082BD37 /* main.m */,
81 | B06C819117934BA30082BD37 /* cartool.1 */,
82 | B06C818F17934BA30082BD37 /* Supporting Files */,
83 | );
84 | path = cartool;
85 | sourceTree = "";
86 | };
87 | B06C818F17934BA30082BD37 /* Supporting Files */ = {
88 | isa = PBXGroup;
89 | children = (
90 | B06C819017934BA30082BD37 /* cartool-Prefix.pch */,
91 | );
92 | name = "Supporting Files";
93 | sourceTree = "";
94 | };
95 | /* End PBXGroup section */
96 |
97 | /* Begin PBXNativeTarget section */
98 | B06C818617934BA30082BD37 /* cartool */ = {
99 | isa = PBXNativeTarget;
100 | buildConfigurationList = B06C819517934BA30082BD37 /* Build configuration list for PBXNativeTarget "cartool" */;
101 | buildPhases = (
102 | B06C818317934BA30082BD37 /* Sources */,
103 | B06C818417934BA30082BD37 /* Frameworks */,
104 | B06C818517934BA30082BD37 /* CopyFiles */,
105 | );
106 | buildRules = (
107 | );
108 | dependencies = (
109 | );
110 | name = cartool;
111 | productName = cartool;
112 | productReference = B06C818717934BA30082BD37 /* cartool */;
113 | productType = "com.apple.product-type.tool";
114 | };
115 | /* End PBXNativeTarget section */
116 |
117 | /* Begin PBXProject section */
118 | B06C817F17934BA30082BD37 /* Project object */ = {
119 | isa = PBXProject;
120 | attributes = {
121 | LastUpgradeCheck = 0500;
122 | ORGANIZATIONNAME = "High Caffeine Content";
123 | };
124 | buildConfigurationList = B06C818217934BA30082BD37 /* Build configuration list for PBXProject "cartool" */;
125 | compatibilityVersion = "Xcode 3.2";
126 | developmentRegion = English;
127 | hasScannedForEncodings = 0;
128 | knownRegions = (
129 | en,
130 | );
131 | mainGroup = B06C817E17934BA30082BD37;
132 | productRefGroup = B06C818817934BA30082BD37 /* Products */;
133 | projectDirPath = "";
134 | projectRoot = "";
135 | targets = (
136 | B06C818617934BA30082BD37 /* cartool */,
137 | );
138 | };
139 | /* End PBXProject section */
140 |
141 | /* Begin PBXSourcesBuildPhase section */
142 | B06C818317934BA30082BD37 /* Sources */ = {
143 | isa = PBXSourcesBuildPhase;
144 | buildActionMask = 2147483647;
145 | files = (
146 | B06C818E17934BA30082BD37 /* main.m in Sources */,
147 | );
148 | runOnlyForDeploymentPostprocessing = 0;
149 | };
150 | /* End PBXSourcesBuildPhase section */
151 |
152 | /* Begin XCBuildConfiguration section */
153 | B06C819317934BA30082BD37 /* Debug */ = {
154 | isa = XCBuildConfiguration;
155 | buildSettings = {
156 | ALWAYS_SEARCH_USER_PATHS = NO;
157 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
158 | CLANG_CXX_LIBRARY = "libc++";
159 | CLANG_ENABLE_MODULES = YES;
160 | CLANG_ENABLE_OBJC_ARC = YES;
161 | CLANG_WARN_BOOL_CONVERSION = YES;
162 | CLANG_WARN_CONSTANT_CONVERSION = YES;
163 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
164 | CLANG_WARN_EMPTY_BODY = YES;
165 | CLANG_WARN_ENUM_CONVERSION = YES;
166 | CLANG_WARN_INT_CONVERSION = YES;
167 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
168 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
169 | COPY_PHASE_STRIP = NO;
170 | GCC_C_LANGUAGE_STANDARD = gnu99;
171 | GCC_DYNAMIC_NO_PIC = NO;
172 | GCC_ENABLE_OBJC_EXCEPTIONS = YES;
173 | GCC_OPTIMIZATION_LEVEL = 0;
174 | GCC_PREPROCESSOR_DEFINITIONS = (
175 | "DEBUG=1",
176 | "$(inherited)",
177 | );
178 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
179 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
180 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
181 | GCC_WARN_UNDECLARED_SELECTOR = YES;
182 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
183 | GCC_WARN_UNUSED_FUNCTION = YES;
184 | GCC_WARN_UNUSED_VARIABLE = YES;
185 | MACOSX_DEPLOYMENT_TARGET = 10.9;
186 | ONLY_ACTIVE_ARCH = YES;
187 | SDKROOT = macosx;
188 | };
189 | name = Debug;
190 | };
191 | B06C819417934BA30082BD37 /* Release */ = {
192 | isa = XCBuildConfiguration;
193 | buildSettings = {
194 | ALWAYS_SEARCH_USER_PATHS = NO;
195 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
196 | CLANG_CXX_LIBRARY = "libc++";
197 | CLANG_ENABLE_MODULES = YES;
198 | CLANG_ENABLE_OBJC_ARC = YES;
199 | CLANG_WARN_BOOL_CONVERSION = YES;
200 | CLANG_WARN_CONSTANT_CONVERSION = YES;
201 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
202 | CLANG_WARN_EMPTY_BODY = YES;
203 | CLANG_WARN_ENUM_CONVERSION = YES;
204 | CLANG_WARN_INT_CONVERSION = YES;
205 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
206 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
207 | COPY_PHASE_STRIP = YES;
208 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
209 | ENABLE_NS_ASSERTIONS = NO;
210 | GCC_C_LANGUAGE_STANDARD = gnu99;
211 | GCC_ENABLE_OBJC_EXCEPTIONS = YES;
212 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
213 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
214 | GCC_WARN_UNDECLARED_SELECTOR = YES;
215 | GCC_WARN_UNINITIALIZED_AUTOS = YES;
216 | GCC_WARN_UNUSED_FUNCTION = YES;
217 | GCC_WARN_UNUSED_VARIABLE = YES;
218 | MACOSX_DEPLOYMENT_TARGET = 10.9;
219 | SDKROOT = macosx;
220 | };
221 | name = Release;
222 | };
223 | B06C819617934BA30082BD37 /* Debug */ = {
224 | isa = XCBuildConfiguration;
225 | buildSettings = {
226 | FRAMEWORK_SEARCH_PATHS = (
227 | "$(inherited)",
228 | "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks",
229 | );
230 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
231 | GCC_PREFIX_HEADER = "cartool/cartool-Prefix.pch";
232 | PRODUCT_NAME = "$(TARGET_NAME)";
233 | };
234 | name = Debug;
235 | };
236 | B06C819717934BA30082BD37 /* Release */ = {
237 | isa = XCBuildConfiguration;
238 | buildSettings = {
239 | FRAMEWORK_SEARCH_PATHS = (
240 | "$(inherited)",
241 | "$(SYSTEM_LIBRARY_DIR)/PrivateFrameworks",
242 | );
243 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
244 | GCC_PREFIX_HEADER = "cartool/cartool-Prefix.pch";
245 | PRODUCT_NAME = "$(TARGET_NAME)";
246 | };
247 | name = Release;
248 | };
249 | /* End XCBuildConfiguration section */
250 |
251 | /* Begin XCConfigurationList section */
252 | B06C818217934BA30082BD37 /* Build configuration list for PBXProject "cartool" */ = {
253 | isa = XCConfigurationList;
254 | buildConfigurations = (
255 | B06C819317934BA30082BD37 /* Debug */,
256 | B06C819417934BA30082BD37 /* Release */,
257 | );
258 | defaultConfigurationIsVisible = 0;
259 | defaultConfigurationName = Release;
260 | };
261 | B06C819517934BA30082BD37 /* Build configuration list for PBXNativeTarget "cartool" */ = {
262 | isa = XCConfigurationList;
263 | buildConfigurations = (
264 | B06C819617934BA30082BD37 /* Debug */,
265 | B06C819717934BA30082BD37 /* Release */,
266 | );
267 | defaultConfigurationIsVisible = 0;
268 | };
269 | /* End XCConfigurationList section */
270 | };
271 | rootObject = B06C817F17934BA30082BD37 /* Project object */;
272 | }
273 |
--------------------------------------------------------------------------------