Ë í#v„úh„ãóð—dZddlZddlZddlZddlZddlZddlZ ddlZejZ e eej$d«Zej$d«Zej$d«Zej$d«Zd„Zd „ZGd „d e«ZGd „d e«ZGd„de«ZGd„de«ZGd„de«ZGd„de«ZGd„deee«Z Gd„dee«Z!Gd„de«Z"Gd„de«Z#Gd„de«Z$Gd „d!e«Z%Gd"„d#e%«Z&Gd$„d%e%«Z'Gd&„d'e%«Z(Gd(„d)e%«Z)Gd*„d+e%«Z*Gd,„d-e%«Z+Gd.„d/e«Z,Gd0„d1e«Z-Gd2„d3e«Z.Gd4„d5e«Z/Gd6„d7e«Z0e0e.jbd8d9<Gd:„d;e0«Z2Gd<„d=e0«Z3Gd>„d?e«Z4Gd@„dAe«Z5y#e $rddl Z e jZ Y�Œ«wxYw#e$reZY�Œ¶wxYw#e$rd„ZY�ŒÂwxYw)BauXcode project file generator. This module is both an Xcode project file generator and a documentation of the Xcode project file format. Knowledge of the project file format was gained based on extensive experience with Xcode, and by making changes to projects in Xcode.app and observing the resultant changes in the associated project files. XCODE PROJECT FILES The generator targets the file format as written by Xcode 3.2 (specifically, 3.2.6), but past experience has taught that the format has not changed significantly in the past several years, and future versions of Xcode are able to read older project files. Xcode project files are "bundled": the project "file" from an end-user's perspective is actually a directory with an ".xcodeproj" extension. The project file from this module's perspective is actually a file inside this directory, always named "project.pbxproj". This file contains a complete description of the project and is all that is needed to use the xcodeproj. Other files contained in the xcodeproj directory are simply used to store per-user settings, such as the state of various UI elements in the Xcode application. The project.pbxproj file is a property list, stored in a format almost identical to the NeXTstep property list format. The file is able to carry Unicode data, and is encoded in UTF-8. The root element in the property list is a dictionary that contains several properties of minimal interest, and two properties of immense interest. The most important property is a dictionary named "objects". The entire structure of the project is represented by the children of this property. The objects dictionary is keyed by unique 96-bit values represented by 24 uppercase hexadecimal characters. Each value in the objects dictionary is itself a dictionary, describing an individual object. Each object in the dictionary is a member of a class, which is identified by the "isa" property of each object. A variety of classes are represented in a project file. Objects can refer to other objects by ID, using the 24-character hexadecimal object key. A project's objects form a tree, with a root object of class PBXProject at the root. As an example, the PBXProject object serves as parent to an XCConfigurationList object defining the build configurations used in the project, a PBXGroup object serving as a container for all files referenced in the project, and a list of target objects, each of which defines a target in the project. There are several different types of target object, such as PBXNativeTarget and PBXAggregateTarget. In this module, this relationship is expressed by having each target type derive from an abstract base named XCTarget. The project.pbxproj file's root dictionary also contains a property, sibling to the "objects" dictionary, named "rootObject". The value of rootObject is a 24-character object key referring to the root PBXProject object in the objects dictionary. In Xcode, every file used as input to a target or produced as a final product of a target must appear somewhere in the hierarchy rooted at the PBXGroup object referenced by the PBXProject's mainGroup property. A PBXGroup is generally represented as a folder in the Xcode application. PBXGroups can contain other PBXGroups as well as PBXFileReferences, which are pointers to actual files. Each XCTarget contains a list of build phases, represented in this module by the abstract base XCBuildPhase. Examples of concrete XCBuildPhase derivations are PBXSourcesBuildPhase and PBXFrameworksBuildPhase, which correspond to the "Compile Sources" and "Link Binary With Libraries" phases displayed in the Xcode application. Files used as input to these phases (for example, source files in the former case and libraries and frameworks in the latter) are represented by PBXBuildFile objects, referenced by elements of "files" lists in XCTarget objects. Each PBXBuildFile object refers to a PBXBuildFile object as a "weak" reference: it does not "own" the PBXBuildFile, which is owned by the root object's mainGroup or a descendant group. In most cases, the layer of indirection between an XCBuildPhase and a PBXFileReference via a PBXBuildFile appears extraneous, but there's actually one reason for this: file-specific compiler flags are added to the PBXBuildFile object so as to allow a single file to be a member of multiple targets while having distinct compiler flags for each. These flags can be modified in the Xcode applciation in the "Build" tab of a File Info window. When a project is open in the Xcode application, Xcode will rewrite it. As such, this module is careful to adhere to the formatting used by Xcode, to avoid insignificant changes appearing in the file when it is used in the Xcode application. This will keep version control repositories happy, and makes it possible to compare a project file used in Xcode to one generated by this module to determine if any significant changes were made in the application. Xcode has its own way of assigning 24-character identifiers to each object, which is not duplicated here. Because the identifier only is only generated once, when an object is created, and is then left unchanged, there is no need to attempt to duplicate Xcode's behavior in this area. The generator is free to select any identifier, even at random, to refer to the objects it creates, and Xcode will retain those identifiers and use them when subsequently rewriting the project file. However, the generator would choose new random identifiers each time the project files are generated, leading to difficulties comparing "used" project files to "pristine" ones produced by this module, and causing the appearance of changes as every object identifier is changed when updated projects are checked in to a version control repository. To mitigate this problem, this module chooses identifiers in a more deterministic way, by hashing a description of each object as well as its parent and ancestor objects. This strategy should result in minimal "shift" in IDs as successive generations of project files are produced. THIS MODULE This module introduces several classes, all derived from the XCObject class. Nearly all of the "brains" are built into the XCObject class, which understands how to create and modify objects, maintain the proper tree structure, compute identifiers, and print objects. For the most part, classes derived from XCObject need only provide a _schema class object, a dictionary that expresses what properties objects of the class may contain. Given this structure, it's possible to build a minimal project file by creating objects of the appropriate types and making the proper connections: config_list = XCConfigurationList() group = PBXGroup() project = PBXProject({'buildConfigurationList': config_list, 'mainGroup': group}) With the project object set up, it can be added to an XCProjectFile object. XCProjectFile is a pseudo-class in the sense that it is a concrete XCObject subclass that does not actually correspond to a class type found in a project file. Rather, it is used to represent the project file's root dictionary. Printing an XCProjectFile will print the entire project file, including the full "objects" dictionary. project_file = XCProjectFile({'rootObject': project}) project_file.ComputeIDs() project_file.Print() Xcode project files are always encoded in UTF-8. This module will accept strings of either the str class or the unicode class. Strings of class str are assumed to already be encoded in UTF-8. Obviously, if you're just using ASCII, you won't encounter difficulties because ASCII is a UTF-8 subset. Strings of class unicode are handled properly and encoded in UTF-8 when a project file is output. éNcó—||kD||kz S©N©)ÚaÚbs ú7/usr/lib/python3.12/site-packages/gyp/xcodeproj_file.pyÚcmpr ¨s€Ø �‰E�a˜!‘eÑ Ðóz^[A-Za-z0-9$./_]+$Ú___z [\\"]|[-]z^\$\((.*?)\)(/(.*))?$cóŒ—tj|«}|r&|jd«}|jd«}||fSd}|}||fS)zæGiven input_path, returns a tuple with sourceTree and path values. Examples: input_path (source_tree, output_path) '$(VAR)/path' ('VAR', 'path') '$(VAR)' ('VAR', None) 'path' (None, 'path') ééN)Ú_path_leading_variableÚmatchÚgroup)Ú input_pathÚsource_group_matchÚ source_treeÚ output_paths rÚSourceTreeAndPathFromPathr¿s\€ô.×3Ñ3°JÓ?ÐÙØ$×*Ñ*¨1Ó-€KØ$×*Ñ*¨1Ó-€Kð �{Ð #Ð#ð€KØ€Kà �{Ð #Ð#r có0—tjdd|«S)Nz \$\((.*?)\)z${\1})ÚreÚsub)Ú input_strings rÚConvertVariablesToShellSyntaxrÓs€Ü �‰� ¨,Ó 7Ð7r cóÚ—eZdZdZiZdZgZdZeed«kr%ejdez«edzZeed«krŒ%ded<d ed <d ed <d ed<ded<ded<d ed<e e«Z e d «e d <e d«e d<e d«e d<d0d„Z d„Zd„Zd„Zd„Zd„Zd„Zd1d„Zd„Zd„Zd„Zd „Zd!„Zd"„Zd#„Zd$„Zd2d%„Zd&„Zej@fd'„Z!d2d(„Z"d)„Z#d*„Z$d+„Z%d,„Z&d-„Z'd.„Z(d/„Z)y)3ÚXCObjectaóThe abstract base of all class types used in Xcode project files. Class variables: _schema: A dictionary defining the properties of this class. The keys to _schema are string property keys as used in project files. Values are a list of four or five elements: [ is_list, property_type, is_strong, is_required, default ] is_list: True if the property described is a list, as opposed to a single element. property_type: The type to use as the value of the property, or if is_list is True, the type to use for each element of the value's list. property_type must be an XCObject subclass, or one of the built-in types str, int, or dict. is_strong: If property_type is an XCObject subclass, is_strong is True to assert that this class "owns," or serves as parent, to the property value (or, if is_list is True, values). is_strong must be False if property_type is not an XCObject subclass. is_required: True if the property is required for the class. Note that is_required being True does not preclude an empty string ("", in the case of property_type str) or list ([], in the case of is_list True) from being set for the property. default: Optional. If is_requried is True, default may be set to provide a default value for objects that do not supply their own value. If is_required is True and default is not provided, users of the class must supply their own value for the property. Note that although the values of the array are expressed in boolean terms, subclasses provide values as integers to conserve horizontal space. _should_print_single_line: False in XCObject. Subclasses whose objects should be written to the project file in the alternate single-line format, such as PBXFileReference and PBXBuildFile, should set this to True. _encode_transforms: Used by _EncodeString to encode unprintable characters. The index into this list is the ordinal of the character to transform; each value is a string used to represent the character in the output. XCObject provides an _encode_transforms list suitable for most XCObject subclasses. _alternate_encode_transforms: Provided for subclasses that wish to use the alternate encoding rules. Xcode seems to use these rules when printing objects in single-line format. Subclasses that desire this behavior should set _encode_transforms to _alternate_encode_transforms. _hashables: A list of XCObject subclasses that can be hashed by ComputeIDs to construct this object's ID. Most classes that need custom hashing behavior should do it by overriding Hashables, but in some cases an object's parent may wish to push a hashable value into its child, and it can do so by appending to _hashables. Attributes: id: The object's identifier, a 24-character uppercase hexadecimal string. Usually, objects being created should not set id until the entire project file structure is built. At that point, UpdateIDs() should be called on the root object to assign deterministic values for id to each object in the tree. parent: The object's parent. This is set by a parent XCObject when a child object is added to it. _properties: The object's property dictionary. An object's properties are described by its class' _schema variable. FrÚ z\U%04xr z\aéz\béz\té z\né z\vé z\fé é Ncó~—||_||_i|_g|_|j «|j |«yr)ÚidÚparentÚ _propertiesÚ _hashablesÚ_SetDefaultsFromSchemaÚUpdateProperties)ÚselfÚ propertiesr'r(s rÚ__init__zXCObject.__init__0s9€Ø€D„GØ€D„KØ€DÔØ€D„OØ×ÑÔ!Ø×ј*Õ%r cóÔ— |j«}d|jj|t |«fzS#t$r'd|jjt |«fzcYSwxYw)Nz <%s at 0x%x>ú<%s %r at 0x%x>)ÚNameÚNotImplementedErrorÚ __class__Ú__name__r'©r-Únames rÚ__repr__zXCObject.__repr__8sf€ðBØ �Y‰Y‹[€dð  §¡× 7Ñ 7¸¼rÀ$»xÐHÑ HÐHøô òBØ ˜tŸ~™~×6Ñ6¼¸4»ÐAÑ AÒAðBús‚7·-A'Á&A'cóÈ—|j|j|j¬«}|jj «D�]œ\}}|j |d}t |t«r9|r'|j«}||_||j|<ŒR||j|<Œbt |t«st |t«r||j|<Œ’t |t«rb|rLg|j|<|D]7}|j«}||_|j|j|«Œ9Œð|dd|j|<�Œt |t«rI|r(td|zdz|jjz«‚|j!«|j|<�Œ]td|jjzdz|zdz|jjz«‚|S)alMake a copy of this object. The new object will have its own copy of lists and dicts. Any XCObject objects owned by this object (marked "strong") will be copied in the new object, even those found in lists. If this object has any weak references to other XCObjects, the same references are added to the new object without making a copy. )r'r(éNzStrong dict for key ú in zUnexpected type z for key )r4r'r(r)ÚitemsÚ_schemaÚ isinstancerÚCopyÚ basestringÚintÚlistÚappendÚdictÚ TypeErrorr5Úcopy)r-ÚthatÚkeyÚvalueÚ is_strongÚ new_valueÚitemÚnew_items rr?z XCObject.Copy?sÀ€ð �>‰>˜TŸW™W¨T¯[©[ˆ>Ó 9€DØ×&Ñ&×,Ñ,×.‰ ˆˆUØ—,‘,˜sÑ# AÑ&€iä �Eœ8Ô $Ù Ø—j‘j“lˆ)Ø!ˆ)Ô Ø"+ˆ$× Ñ ˜3Ò à"'ˆ$× Ñ ˜3Ò Ü �eœZÔ (¬J°u¼cÔ,BØ %ˆ×јÒÜ �eœTÔ "Ù ð#%ˆ$× Ñ ˜3Ñ ÛˆdØ—y‘y“{ˆHØ"ˆHŒOØ × Ñ ˜SÑ !× (Ñ (¨Õ 2ñð #(© (ˆ$× Ñ ˜3Ó Ü �eœTÔ "á ÜÐ0°3Ñ6¸Ñ?ØŸ.™.×1Ñ1ñ2ó3ð 3ð#(§*¡*£,ˆ$× Ñ ˜3Ó äÐ*¨U¯_©_×-EÑ-EÑEØ#ñ$Ø&)ñ*Ø,2ñ3Ø59·^±^×5LÑ5LñMóNð Nð?/ðD €Kr cóÀ—d|jvs d|jvr!|jddr|jdSt|jjdz«‚)z«Return the name corresponding to an object. Not all objects necessarily need to be nameable, and not all that do have a "name" property. Override as needed. r7rz must implement Name)r)r=r3r4r5©r-s rr2z XCObject.NamensZ€ð�×!Ñ!Ñ!Ø �4—<‘<Ñ  D§L¡L°Ñ$8¸Ò$;Ø × Ñ ˜fÑ %Ð%ä ˜dŸn™n×5Ñ5Ð8NÑNÓ OÐOr có"—|j«S)zõReturn a comment string for the object. Most objects just use their name as the comment, but PBXProject uses different values. The returned comment is not escaped and does not have any comment marker strings applied to it. )r2rOs rÚCommentzXCObject.Comments€ð �9‰9‹;Ðr có¶—|jjg}|j«}|dk7r|j|«|j |j «|Sr)r4r5r2rCÚextendr*)r-Ú hashablesr7s rÚ HashableszXCObject.Hashables‹sL€Ø—‘×(Ñ(Ð)€Ià �9‰9‹;€DØ ˆt‚|Ø×Ñ�tÔà ×Ñ�T—_‘_Ô%à Ðr có—yrrrOs rÚHashablesForChildzXCObject.HashablesForChild–s€Ø r có®—d„}|€ t«}|j«}|j«}t|«dkDsJ‚|D] }|||«Œ |rm|j «}|€|} n0t|«dkDsJ‚|j«} |D] }|| |«Œ |j «D]} | j ||| «Œ|s |j€‰|jdzdk(sJ‚|jdz} tjdd| zz|j««} gd¢} td| «D]}| |dzxx| |zcc<Œd t| «z|_yy) aÛSet "id" properties deterministically. An object's "id" property is set based on a hash of its class type and name, as well as the class type and name of all ancestor objects. As such, it is only advisable to call ComputeIDs once an entire project file tree is built. If recursive is True, recurse into all descendant objects and update their hashes. If overwrite is True, any existing value set in the "id" property will be replaced. có —|jtjdt|«««|j|j d««y)aUUpdate hash with data's length and contents. If the hash were updated only with the value of data, it would be possible for clowns to induce collisions by manipulating the names of their objects. By adding the length, it's exceedingly less likely that ID collisions will be encountered, intentionally or not. z>iúutf-8N)ÚupdateÚstructÚpackÚlenÚencode)ÚhashÚdatas rÚ _HashUpdatez(XCObject.ComputeIDs.._HashUpdate¨s4€ð ‡k�k”&—+‘+˜d¤C¨£IÓ.Ô/Ø ‡k�k�$—+‘+˜gÓ&Õ'r NréÚ>ÚI)rrrrz %08X%08X%08X)Ú _new_sha1rFrUr^rWÚChildrenÚ ComputeIDsr'Ú digest_sizer\ÚunpackÚdigestÚrangeÚtuple)r-Ú recursiveÚ overwriteÚ seed_hashrbr`rTÚhashableÚhashables_for_childÚ child_hashÚchildÚdigest_int_countÚ digest_intsÚid_intsÚindexs rrhzXCObject.ComputeIDs™sj€ò (ðÐÜ“+€ià �>‰>Ó €Dà—‘Ó €IÜ ˆy‹>˜AÒ ÐÐ ÛˆÙ�$˜Õ!ðñØ ×2Ñ2Ó4ÐØ Ð $؉ äÐ&Ó'¨!Ò+Ð+Ð+Ø—^‘^Ó%ˆ Û+ˆHÙ �j (Õ +ð,ð—=‘=–?ˆ%Ø ×ј I¨zÕ:ð#ñ�D—G‘G�Oð× Ñ  Ñ ! QÒ &Ð&Ð &Ø×)Ñ)¨QÑ.ÐÜ—M‘M #¨Ð.>Ñ(>Ñ">ÀÇ Á à ÓN€kÚ€gܘÐ,Ö-ˆ%Ø�˜‘ Ó˜k¨%Ñ0Ñ0Ôð.ठw£Ñ/€d…gð$r c óT—i}|j«}|D]‘}|j|vrr||j}td|j›dt|j«›dt|j«›d|jdj «›d� «‚|||j<Œ“y)zLVerifies that no two objects have the same ID. Checks all descendants. z Duplicate ID z , objects "z" and "z" in "Ú rootObjectÚ"N)Ú Descendantsr'ÚKeyErrorÚstrr)r2)r-ÚidsÚ descendantsÚ descendantÚothers rÚEnsureNoIDCollisionszXCObject.EnsureNoIDCollisions×s˜€ð €CØ×"Ñ"Ó$€KÛ!ˆ Ø �‰˜#Ñ Ø�J—M‘MÑ"ˆÝà�}‹}œc *×"8Ñ"8Õ9Ü�5×$Ñ$Õ% t×'7Ñ'7¸ Ñ'E×'JÑ'JÕ'LðNóOð Oð&€cˆ*�-‰-Òñ"r có—g}|jj«D]_\}}|dd\}}}|sŒ||jvsŒ!|s|j|j|«ŒB|j |j|«Œa|S)z?Returns a list of all of this object's owned (strong) children.rr)r=r<r)rCrS)r-ÚchildrenÚpropertyÚ attributesÚis_listÚ property_typerJs rrgzXCObject.Childrenæs€ð€HØ $§ ¡ × 2Ñ 2Ö 4ш�*Ø,6°q¸¨OÑ)€w� ˜yÚ �x 4×#3Ñ#3Ò3ÙØ �/‰/˜$×*Ñ*¨8Ñ4Õ 5à �/‰/˜$×*Ñ*¨8Ñ4Õ 5ð !5ð €Or cóx—|j«}|g}|D]!}|j|j««Œ#|S)zSReturns a list of all of this object's descendants, including this object. )rgrSr|)r-r…r€rts rr|zXCObject.Descendantsós=€ð �}‰}‹€HØ�&€KÛˆØ×ј×*Ñ*Ó,Õ-ðà Ðr cóP—|jr|jj«Syr)r(ÚPBXProjectAncestorrOs rrŒzXCObject.PBXProjectAncestorþs€à ‡{‚{Ø �[‰[× +Ñ +Ó -Ð-Ø r có2—d|jdd«zdzS)z\Encodes a comment to be placed in the project file output, mimicing Xcode behavior. z/* z*/z(*)/z */)Úreplace)r-Úcomments rÚ_EncodeCommentzXCObject._EncodeComments€ð �7—?‘? 4¨Ó0Ñ 0°5Ñ 8Ð8r cól—|jd«}|dk(ry|dk(ry|jt|«S)NrÚ\z\\r{z\")rÚ_encode_transformsÚord)r-rÚchars rÚ_EncodeTransformzXCObject._EncodeTransforms<€ð �;‰;�q‹>€Dð  ˆt‚|Ø Ø ˆs‚{Ø Ø × "Ñ "¤3 t£9Ñ -Ð-r có¦—tj|«rtj|«s|Sdtj |j |«zdzS)z[Encodes a string to be placed in the project file output, mimicing Xcode behavior. r{)Ú _unquotedÚsearchÚ_quotedÚ_escapedrr–©r-rIs rÚ _EncodeStringzXCObject._EncodeString sD€ôD×јԤw§~¡~°eÔ'<Ø €là ”—‘˜d×3Ñ3°UÓ;Ñ ;¸cÑ AÐAr có2—|jd|z|z«y)NÚ )Úwrite)r-ÚfileÚtabsÚlines rÚ_XCPrintzXCObject._XCPrintGs€Ø‡J�Jˆt�d‰{˜TÑ!Õ"r cóF—d}d}|jrd}d}d}nd}d|dzz}d|z}t|t«r!||jz }|j «}�n­t|t «r||j |«z }�n‡t|t«r%||j |jd««z }�nRt|t«r|t |«z }�n2t|t«r‚|rIt|«dkr;t|«dk(r||j d«z }nï||j |d«z }n×d |z}|D]$} |||j|dz| |«zd z|zz }Œ&||d zz }n t|t«rkd |z}t|j««D]A\} } |||j|dz| |«zd z|j|dz| |«zdz|zz }ŒC||dzz }n%t!d|j"j$zdz«‚|dk7r|d|j'|«zz }|S)aNReturns a representation of value that may be printed in a project file, mimicing Xcode's behavior. _XCPrintableValue can handle str and int values, XCObjects (which are made printable by returning their id property), and list and dict objects composed of any of the above types. When printing a list or dict, and _should_print_single_line is False, the tabs parameter is used to determine how much to indent the lines corresponding to the items in the list or dict. If flatten_list is True, single-element lists will be transformed into strings. ÚNrÚ rŸr rZrÚ(Ú,Ú)Ú{ú = Ú;Ú}z Can't make z printable)Ú_should_print_single_liner>rr'rQr~r�r@r_rArBr^Ú_XCPrintableValuerDÚsortedr<rEr4r5r�) r-r¢rIÚ flatten_listÚ printabler�ÚsepÚ element_tabsÚend_tabsrLÚitem_keyÚ item_values rr°zXCObject._XCPrintableValueJsT€ð€IØ€Gà ×%Ò%Ø €cØ€lØ�hà €cؘT A™XÑ&€lؘ‘€hä�%œÔ"Ø�5—8‘8Ñ€iØ— ‘ “‚gÜ �Eœ3Ô Ø�4×%Ñ% eÓ,Ñ,‚iô �Eœ:Ô &Ø�4×%Ñ% e§l¡l°7Ó&;Ó<Ñ<‚iÜ �Eœ3Ô Ø”3�u“:Ñ‚iÜ �Eœ4Ô Ù œ#˜e›*¨š/Ü ˆu‹:˜Š?Ø �t×)Ñ)¨"Ó-Ñ -‰)à �t×)Ñ)¨%°©(Ó3Ñ 3‰)à˜#‘Iˆ ÛˆDØ �|Ø×-Ñ-¨d°Q©h¸¸lÓKñLàñà ñ!ñ !‰)ðð �X ‘^Ñ#‰ Ü �Eœ4Ô Ø˜‘)€iÜ"(¨¯©«Ö"7Ñ ˆ(�JØ�\Ø × "Ñ " 4¨!¡8¨X°|Ó DñEØGLñMà × "Ñ " 4¨!¡8¨Z¸Ó FñGàILñMð ññ ‰ ð#8ð �8˜c‘>Ñ!�iä �m e§o¡o×&>Ñ&>Ñ>ÀÑMÓ NÐNà�$‚Ø�3˜×,Ñ,¨WÓ5Ñ5Ñ5€ià Ðr có.—|jrd}d}nd|z}d}|dk(rt|t«r |j}n|}|dk(rt|t«rd}nd}|d k(rt|t «rd} nd} |j ||| «} |j ||| «} |r#t| «d kDr| d d k(r | d d k(r| d d } || dz| zdz|zz }|j|d |«y#t$r)} tjj| d|z«‚d} ~ wwxYw)a,Prints a key and value, members of an XCObject's _properties dictionary, to file. tabs is an int identifying the indentation level. If the class' _should_print_single_line variable is True, tabs is ignored and the key-value pair will be followed by a space insead of a newline. r¦rrŸr§ÚremoteGlobalIDStringÚsettingsTFÚ buildSettingsr rr{éÿÿÿÿr¬r­zwhile printing key "%s"N) r¯r>ÚPBXContainerItemProxyr'Ú PBXBuildFileÚXCBuildConfigurationr°r^rEÚgypÚcommonÚExceptionAppendr¤) r-r¡r¢rHrIr³Úafter_kvÚvalue_to_printÚstrip_value_quotesr²Ú printable_keyÚprintable_valueÚes rÚ _XCKVPrintzXCObject._XCKVPrint�sN€ð ×%Ò%Ø€iØ�hà˜‘+€iØ€hð Ð$Ò$¬°DÜ4Iô*Kà—x‘x�nà€nð  ˆjÒœZ¨¬lÔ;ØÑà Ðð ˆoÒ¤*¨TÔ3GÔ"HØ�là€lð  Ø×,Ñ,¨T°3¸ ÓE€mØ×.Ñ.¨t°^Ø/;ó=€oá ¤ OÓ 4°qÒ 8Ø ˜!Ñ  Ò #¨¸Ñ(;¸sÒ(BØ)¨!¨BÐ/ˆØ�= 5Ñ(¨?Ñ:¸SÑ@À8ÑKÑK€ið  ‡M�M�$˜˜9Õ%øô ò Ü ‡j�j× Ñ  Ø!:¸SÑ!@ôBà ûð úsÁ2AC"Ã" DÃ+$DÄDcó”—|j«|jrd}d}nd}d}|j|d|jd|«dz|z«|j |dd|j j «t|jj««D]\}}|j |d||«Œ|j||d«y ) z[Prints a reprentation of this object to file, adhering to Xcode output formatting. r¦rr§r:z = {rÚisaú}; N) ÚVerifyHasRequiredPropertiesr¯r¤r°rÊr4r5r±r)r<)r-r¡r´r¶r†rIs rÚPrintzXCObject.PrintÎs¾€ð  ×$Ñ$Ô&à ×%Ò%ð €cØ�hà €cØ€hð ‡M�M�$˜˜4×1Ñ1°!°TÓ:¸VÑCÀcÑIÔJð  ‡O�O�D˜!˜U D§N¡N×$;Ñ$;Ô<ô" $×"2Ñ"2×"8Ñ"8Ó":Ö;‰ˆ�%Ø ‡o�o�d˜A˜x¨Õ/ð<ð ‡M�M�$˜ &Õ)r có†—|€y|j«D�]*\}}||jvr%t|dz|jjz«‚|j|dd\}}}|rÒ|jt k7r?t |dz|jjzdz|jjz«‚|D]z}t||«rŒt|t«r |tk(rŒ*t d|zdz|jjzdz|jzd z|jjz«‚ntt||«sht|t«r |tk(sOt |dz|jjzdz|jzd z|jjz«‚|�rJt|t«r2|r|j«|j|<�n(||j|<�nt|t«st|t«r||j|<nçt|t «rX|rCg|j|<|D].}|j|j|j««Œ0n’|dd|j|<nt|t«r|j!«|j|<nQt d |jjzd z|zd z|jjz«‚||j|<|s�Œø|s||j|_�Œ|j|D] }||_Œ �Œ-y) aôMerge the supplied properties into the _properties dictionary. The input properties must adhere to the class schema or a KeyError or TypeError exception will be raised. If adding an object of an XCObject subclass and the schema indicates a strong relationship, the object's parent will be set to this object. If do_copy is True, then lists, dicts, strong-owned XCObjects, and strong-owned XCObjects in lists will be copied instead of having their references added. Nú not in rrú of z must be list, not úitem of ú must be ú, not zDon't know how to copy a z object for r;)r<r=r}r4r5rBrEr>r@r~rr?r)rArCrDrFr() r-r.Údo_copyr†rIrˆr‰rJrLs rr,zXCObject.UpdatePropertiesôs&€ðÐØ à%×+Ñ+×-‰ˆ�%à ˜Ÿ™Ñ %Ü�x *Ñ,¨t¯~©~×/FÑ/FÑFÓGÐGð-1¯L©L¸Ñ,BÀ1ÀQÐ,GÑ)€w� ˜yÙ Ø �?‰?œdÒ "ÜØ˜6Ñ! D§N¡N×$;Ñ$;Ñ;Ø%ñ&Ø(-¯©×(@Ñ(@ñAóBð BóˆDܘD -Õ0ܘT¤:Ô.°=ÄCÓ3GôؘxÑ'¨&Ñ0°4·>±>×3JÑ3JÑJØñØ -× 6Ñ 6ñ7Ø9AñBà—.‘.×)Ñ)ñ*ó+ð +ñ ô˜% Ô/ܘ5¤*Ô-°-Ä3Ò2FôؘѠ$§.¡.×"9Ñ"9Ñ9¸KÑGØ×$Ñ$ñ%Ø'/ñ0Ø27·/±/×2JÑ2JñKóLð Lò Ü �eœXÔ &Ù Ø).¯©«ˆD× Ñ ˜XÓ &à).ˆD× Ñ ˜XÓ &Ü ˜œzÔ *¬j¸ÄÔ.DØ',ˆ$× Ñ ˜8Ò $Ü ˜œtÔ $Ù ð*,ˆD× Ñ ˜XÑ &Û�Ø×јxÑ(×/Ñ/°· ± ³ Õ<ñð*/©q¨ˆD× Ñ ˜XÒ &Ü ˜œtÔ $Ø',§z¡z£|ˆ$× Ñ ˜8Ò $äÐ5ØŸ/™/×2Ñ2ñ3Ø5CñDà"ñ#à%+ñ,à.2¯n©n×.EÑ.EñFóGð Gð&+ˆ×јÑ"ó ÙØ.2ˆ$× Ñ ˜8Ñ $Ö +à×&Ñ& xÔ0ˆd؈D�Kò1ñ}.r có—||jvSr©r)©r-rHs rÚ HasPropertyzXCObject.HasPropertyEs€Ø �$×"Ñ"Ð "Ð"r có —|j|SrrØrÙs rÚ GetPropertyzXCObject.GetPropertyHs€Ø × Ñ ˜CÑ Ð r có*—|j||i«yr)r,©r-rHrIs rÚ SetPropertyzXCObject.SetPropertyKs€Ø×ј3 ˜,Õ'r có<—||jvr|j|=yyrrØrÙs rÚ DelPropertyzXCObject.DelPropertyNs#€Ø ˆd×ÑÑØ × Ñ ˜3Ñ ðr có.—||jvr%t|dz|jjz«‚|j|dd\}}}|s(t |dz|jjzdz«‚t ||«sRt d|zdz|jjzdz|jzdz|jjz«‚||j vrg|j |<|r||_|j |j|«y) NrÑrrrÒz must be listrÓrÔrÕ) r=r}r4r5rEr>r)r(rC)r-rHrIrˆr‰rJs rÚAppendPropertyzXCObject.AppendPropertyRs€ð �$—,‘,Ñ Ü �S˜:Ñ%¨¯©×(?Ñ(?Ñ?Ó @Ð@à*.¯,©,°sÑ*;¸A¸aÐ*@Ñ'€Wˆm˜YÙ Ü �c˜F‘l T§^¡^×%<Ñ%<Ñ<¸ÑNÓ OÐOÜ �e˜]Ô +Ü �j 3Ñ&¨Ñ/°$·.±.×2IÑ2IÑIØ!ñ"Ø$1×$:Ñ$:ñ;Ø=EñFà—o‘o×.Ñ.ñ/ó 0ð0ð �$×"Ñ"Ñ "Ø €d×Ñ�sÑñØ€e„lð ×Ñ�SÑ× Ñ  Õ'r cóÈ—|jj«D]E\}}|dd\}}}}|sŒ||jvsŒ"t|jj dz|z«‚y)zQEnsure that all properties identified as required by the schema are set. rrcz requires N)r=r<r)r}r4r5)r-r†r‡rˆr‰rJÚ is_requireds rrÎz$XCObject.VerifyHasRequiredPropertiesmsc€ð!%§ ¡ × 2Ñ 2Ö 4ш�*Ø9CÀAÀa¸Ñ6€w� ˜y¨+Ú ˜X¨×)9Ñ)9Ò9Ü�t—~‘~×.Ñ.°Ñ=ÀÑHÓIÐIñ!5r cóú—i}|jj«D]:\}}|dd\}}}}|sŒt|«dk\sŒ"||jvsŒ1|d}|||<Œ<t|«dkDr|j |d¬«yy)zyAssign object default values according to the schema. This will not overwrite properties that have already been set.rrcéT)rÖN)r=r<r^r)r,) r-Údefaultsr†r‡rˆr‰rJråÚdefaults rr+zXCObject._SetDefaultsFromSchemays�€ð€HØ $§ ¡ × 2Ñ 2Ö 4ш�*Ø9CÀAÀa¸Ñ6€w� ˜y¨+Ú œ˜Z›¨AÓ-ؘ$×*Ñ*Ò*ؘQ‘-ˆà$ˆ�Òð !5ô ˆ8ƒ}�qÒð ×јH¨dÐÕ3ðr ©NNN©TTN©F)*r5Ú __module__Ú __qualname__Ú__doc__r=r¯r“Úir”rCrBÚ_alternate_encode_transformsÚchrr/r8r?r2rQrUrWrhrƒrgr|rŒr�r–r�r¤r°rÊÚsysÚstdoutrÏr,rÚrÜrßrárãrÎr+rr rrrÖs{„ñAðF €'Ø#ÐðÐØ€!Ø ‰C�‹HŠ Ø×јi¨!™mÔ,Ø ˆA‰€Að ‰C�‹H‹ ð Ð�QÑØÐ�QÑØÐ�QÑØ Ð�RÑØ Ð�RÑØ Ð�RÑØ Ð�RÑá!%Ð&8Ó!9ÐÙ$'¨£FИqÑ!Ù%(¨£WИrÑ"Ù%(¨£WИrÑ"ó&òIò-ò^Pò" ò òó<0ò| &ò ò òò 9ò .ò%BòN#óDòL<&ð|—z‘zó$*óLOòb#ò!ò(ò ò(ò6 Jó4r rcóð—eZdZdZej j «Zejdeddgdeddgde ddgde ddgde ddgdedddgde ddgde ddgde ddgdœ «dd„Z d„Z d „Z d „Z d „Zd „Zd „Zy)ÚXCHierarchicalElementzVAbstract base for PBXGroup and PBXFileReference. Not represented in a project file.rr ú) ÚcommentsÚ fileEncodingÚincludeInIndexÚ indentWidthÚ lineEndingÚ sourceTreeÚtabWidthÚusesTabsÚ wrapsLinesNcó:—tj||||«d|jvrNd|jvr@|jd}tj|«}|dk7r||k7r|j d|«d|jvr™d|jvs|jddk(rxt |jd«\}}|dk7r||jd<|dk7r||jd<|dk7r/|€,d|jvr|jd=||jd<yyyyyy)NÚpathr7r¦rýr÷)rr/r)Ú posixpathÚbasenamerßr)r-r.r'r(rr7rs rr/zXCHierarchicalElement.__init__¢s9€ä ×Ñ�d˜J¨¨FÔ3Ø �×!Ñ!Ñ!¨&°D×4DÑ4DÑ*DØ × Ñ ˜fÑ %€dÜ × Ñ  Ó %€dØ �Š˜ š Ø ×ј Ô&à �×!Ñ!Ñ!Ø ˜T×-Ñ-Ñ -Ø × Ñ ˜,Ñ '¨9Ò 4ô6°d×6FÑ6FÀvÑ6NÓOÑ€{�DØ ˜Ò Ø)4ˆ×јÑ&Ø �ŠØ#'ˆ×Ñ˜Ñ Ø ˜Ò   Ø �t×'Ñ'Ñ 'ð × Ñ ˜VÐ $Ø#.ˆ×Ñ˜Ò ð (ð".Ð ð 5ð"r cóx—d|jvr|jdSd|jvr|jdSy)Nr7rrØrOs rr2zXCHierarchicalElement.Name¾sE€Ø �×!Ñ!Ñ!Ø × Ñ ˜fÑ %Ð%Ø �4×#Ñ#Ñ #Ø × Ñ ˜fÑ %Ð%ðr có:—||j«jdk(rtj|«Sg}d|jvrF|j |j j dz«|j |jd«|j«}|dk7r_|jtj«}|D];}|j |j j dz«|j |«Œ=|j|j«|S)aCCustom hashables for XCHierarchicalElements. XCHierarchicalElements are special. Generally, their hashes shouldn't change if the paths don't change. The normal XCObject implementation of Hashables adds a hashable for each object, which means that if the hierarchical structure changes (possibly due to changes caused when TakeOverOnlyChild runs and encounters slight changes in the hierarchy), the hashes will change. For example, if a project file initially contains a/b/f1 and a/b becomes collapsed into a/b, f1 will have a single parent a/b. If someone later adds a/f2 to the project file, a/b can no longer be collapsed, and f1 winds up with parent b and grandparent a. That would be sufficient to change f1's hash. To counteract this problem, hashables for all XCHierarchicalElements except for the main group (which has neither a name nor a path) are taken to be just the set of path components. Because hashables are inherited from parents, this provides assurance that a/b/f1 has the same set of hashables whether its parent is b or a/b. The main group is a special case. As it is permitted to have no name or path, it is permitted to use the standard XCObject hash mechanism. This is not considered a problem because there can be only one main group. Ú mainGroupr7z.nameNz.path) rŒr)rrUrCr4r5ÚPathFromSourceTreeAndPathÚsplitrr´rSr*)r-rTrÚ componentsÚ components rrUzXCHierarchicalElement.HashablesÇsö€ð2 ˆt×&Ñ&Ó(×4Ñ4°[ÑAÒAä × Ñ  Ó %Ð%à€Ið �×!Ñ!Ñ!ð×Ñ�t—~‘~×.Ñ.°Ñ8Ô9Ø×Ñ�t×'Ñ'¨Ñ/Ô0ð × )Ñ )Ó +€DØ ˆt‚|Ø—:‘:œiŸm™mÓ,€jÛ!ˆ)Ø×јŸ™×0Ñ0°7Ñ:Ô;Ø×јÕ#ð"ð×Ñ�T—_‘_Ô%à Ðr cóΗtdtdtdi}||j}||j}||k(r(t |j «|j ««S|dk(ryy)Nr¡rr½r )ÚPBXFileReferenceÚPBXGroupÚPBXVariantGroupr4r r2)r-r‚Úvalid_class_typesÚ self_typeÚ other_types rÚComparezXCHierarchicalElement.Compareþsj€ô˜Ü˜Ü˜ðÐð " $§.¡.Ñ1€IØ" 5§?¡?Ñ3€Jà�JÒä �—‘“˜eŸj™j›lÓ +Ð+ð�GÒØ Ø r cóN—gd¢}|j«}|j«}t|t«xr||v}t|t«xr||v}|s|s|j|«S||vr||vry||vr||vry|j |«}|j |«}||kry||kDryy)N)ÚSourceÚ IntermediatesÚProjectsÚ FrameworksÚProductsÚBuildr½r r)r2r>rrrx) r-r‚ÚorderÚ self_nameÚ other_nameÚself_inÚother_inÚ self_indexÚ other_indexs rÚCompareRootGroupz&XCHierarchicalElement.CompareRootGroups¼€ò €Eð — ‘ “ €IØ—‘“€JܘœxÓ(Ò?¨Y¸%Ð-?€Gܘ$¤Ó)ÒA¨j¸EÐ.A€HÙ ™8Ø �\‰\˜%Ó Ð Ø�EÑ *°Ñ"5Ø Ø�UÑ 9°Ñ#5Ø ð—‘˜YÓ'€JØ—+‘+˜jÓ)€KØ�KÒØ Ø�KÒØ Ø r có —g}|jddk7r$|jd|jdzdz«d|jvr|j|jd«t|«dkDrtj|ŽSy)Nrýr÷z$(rªrr)r)rCr^rÚjoin)r-r s rrz/XCHierarchicalElement.PathFromSourceTreeAndPath3s„€ð €JØ ×ј Ñ%¨Ò2Ø×ј˜t×/Ñ/° Ñ=Ñ=ÀÑCÔDØ �×!Ñ!Ñ!Ø×ј×(Ñ(¨Ñ0Ô1ä ˆ:ƒ˜ÒÜ �^‰^˜ZÐ (Ð(à r cój—|}d}t|t«rž|�"|jd«s‹|jd«sz|j«}|dk7r|dk7rt j ||«}n|dk7r|}|j }t|t«r&|€ŒW|jd«s|jd«sŒz|S)NÚ/Ú$)r>röÚ startswithrrr$r()r-ÚxcherÚ this_paths rÚFullPathzXCHierarchicalElement.FullPathCs§€ð €DØ €DÜ �TÔ0Ô 1Ø ˆ<Ø—‘ Ô$¨T¯_©_¸SÔ-AØ×0Ñ0Ó2€iØ �dÒ ˜t tš|Ü�~‰~˜i¨Ó.‰Ø ˜Ò ØˆØ �[‰[€dô �TÔ0Ô 1Ø ‰<Ø—‘ Ô$¨T¯_©_¸SÕ-Að €Kr rê)r5rírîrïrr=rFr[r~rAr/r2rUrr"rr+rr rröröŒs¹„ñð × Ñ × !Ñ !Ó #€'Ø ‡.�.ؘ#˜q !�nؘ#˜q !�nؘ#˜q !�nؘ#˜q !�nؘ#˜q !�nؘ#˜q ! YÐ/ؘ#˜q !�nؘ#˜q !�nؘ#˜q !�nñ ô ó/ò8ò5òn ò( òBó r röcóÔ—eZdZdZej j «Zejdeddggdeddgdeddgdœ«dd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „Zd„Zd„Zdd„Zd„Zy)ra Attributes: _children_by_path: Maps pathnames of children of this PBXGroup to the actual child XCHierarchicalElement objects. _variant_children_by_name_and_path: Maps (name, path) tuples of PBXVariantGroup children to the actual child PBXVariantGroup objects. r r)r…r7rNcó´—tj||||«i|_i|_|jj dg«D]}|j |«Œy©Nr…)rör/Ú_children_by_pathÚ"_variant_children_by_name_and_pathr)ÚgetÚ_AddChildToDicts)r-r.r'r(rts rr/zPBXGroup.__init__hsQ€ä×"Ñ" 4¨°R¸Ô@Ø€DÔØ.0€DÔ+Ø×!Ñ!×%Ñ% j°"Ö5ˆØ ×јEÕ"ñ6r cóÀ—tj|«}|jjdg«D])}|j «}|dk7sŒ|j |«Œ+|Sr.)rörUr)r1r2rC)r-rTrtÚ child_names rrUzPBXGroup.HashablespsZ€ä%×/Ñ/°Ó5€Ið ×!Ñ!×%Ñ% j°"Ö5ˆØ—:‘:“<€jØ �tÓ Ø×јÕ$ð6ð Ðr có,—tj|«Sr)rörUrOs rrWzPBXGroup.HashablesForChilds€ô !× *Ñ *¨4Ó 0Ð0r cóf—|j«}|r+||jvrtd|z«‚||j|<t|t«rd|j j dd«}||f}||jvr&tdt|«zdzt|«z«‚||j|<yy)Nz"Found multiple children with path r7z2Found multiple PBXVariantGroup children with name z and path ) rr/Ú ValueErrorr>rr)r1r0r~)r-rtÚ child_pathr4rHs rr2zPBXGroup._AddChildToDicts„sÆ€à×0Ñ0Ó2€JÙØ �t×-Ñ-Ñ -ÜÐ=À ÑJÓKÐKØ+0€d×јZÑ(ä�%œÔ)Ø×$Ñ$×(Ñ(¨°Ó6€jØ ˜Ð $€cØ �×7Ñ7Ñ 7Üð!Ü#& z£?ñ3Ø5AñBä˜Z›ñ)ó*ð *ð6;€d×-Ñ-¨cÒ2ð*r cóJ—|jd|«|j|«yr.)rãr2©r-rts rÚ AppendChildzPBXGroup.AppendChild•s"€ð ×ј  EÔ*Ø×ј%Õ r cóx—d|jvry|jdD]}|j«|k(sŒ|cSyr.)r)r2)r-r7rts rÚGetChildByNamezPBXGroup.GetChildByNameœsB€ð ˜×)Ñ)Ñ )Ø à×!Ñ! *Ô-ˆØ �‰‹˜Ó ØŠ ð.ð r cóD—|sy||jvr|j|Syr)r/©r-rs rÚGetChildByPathzPBXGroup.GetChildByPath®s*€Ù Ø à ˆt×%Ñ%Ñ%Ø × #Ñ # DÑ )Ð)à r có¶—d|jvry|jdD]8}t|t«sŒ|jd}|jd|k(sŒ6|cSy)Nr…Ú remoteRefrº)r)r>ÚPBXReferenceProxy)r-Ú remote_objectrtÚcontainer_proxys rÚGetChildByRemoteObjectzPBXGroup.GetChildByRemoteObject·sf€ð ˜×)Ñ)Ñ )Ø à×!Ñ! *Ô-ˆÜ ˜Ô0Ô 1Øà×)Ñ)¨+Ñ6€oØ × $Ñ $Ð%;Ñ <À Ó MØŠ ð .ð r cóŽ—d}|jd«rd}tj|«}|r|dz}d}tj|«}tj|«}tj|«}tj |«\}} | dk(r|}|dk(rd}|r|�J‚|j tj«} t| «dk(s|s|dk7rt| «dk(s|sä|€K|j|«} | dk7r| jtk(s J‚td |i«} |j| «| Stj|«} |j| |«} tjj| d d«}| j|«}|dk7r|jtk(s!J‚t||d œ«}| j|«| } | S| d }|j|«}|dk7r|jtk(s J‚td |i«}|j|«|j!tjj| dd«|«S) abReturns an existing or new file reference corresponding to path. If hierarchical is True, this method will create or use the necessary hierarchical group structure corresponding to path. Otherwise, it will look in and create an item in the current group only. If an existing matching reference is found, it is returned, otherwise, a new one will be created, added to the correct group, and returned. If path identifies a directory by virtue of carrying a trailing slash, this method returns a PBXFileReference of "folder" type. If path identifies a variant, by virtue of it identifying a file inside a directory with an ".lproj" extension, this method returns a PBXVariantGroup containing the variant named by path, and possibly other variants. For all other paths, a "normal" PBXFileReference will be returned. Fr&TNz.lprojr¦r r:réþÿÿÿ)r7rr)ÚendswithrÚnormpathÚdirnamerÚsplitextr r´r^r@r4r r;Ú!AddOrGetVariantGroupByNameAndPathr$rÚAddOrGetFileByPath)r-rÚ hierarchicalÚis_dirÚ variant_namer(Ú grandparentÚparent_basenameÚ parent_rootÚ parent_extÚ path_splitÚfile_refÚvariant_group_nameÚvariant_group_refÚ variant_pathÚ variant_refÚnext_dirÚ group_refs rrNzPBXGroup.AddOrGetFileByPathÍs[€ð&€FØ ‡}�}�SÔØ€fÜ × Ñ ˜dÓ #€DÙ Ø �C‰Z€dð€LÜ × Ñ ˜tÓ $€FÜ×#Ñ# FÓ+€KÜ×(Ñ(¨Ó0€OÜ )× 2Ñ 2°?Ó CÑ€[�*Ø�XÒØ €lØ�bÒØ€kñ˜Ð-Ð-Ð -à—‘œIŸM™MÓ*€JÜ ˆ:ƒ˜!ÒÙ �< 4Ò'¬S°«_ÀÒ-AÙ ð Ð à×&Ñ& tÓ,ˆØ �tÒ Ø×#Ñ#Ô'7Ò7Ð 7Ð7ä% v¨t nÓ5ˆ(Ø × Ñ ˜8Ô $ð(€oô'×/Ñ/°Ó5ÐØ ×BÑBØ   ó-Ðä —}‘}×)Ñ)¨*°R°S¨/Ó:ˆ Ø'×6Ñ6°|ÓDˆ Ø ˜$Ò Ø×&Ñ&Ô*:Ò:Ð :Ð:ä(°,Ø2>ñ*@óAˆ+à × 'Ñ '¨ Ô 4ð%ˆØ €oð ˜A‘€hØ×%Ñ% hÓ/€iØ �dÒ Ø×"Ñ"¤hÒ.Ð.Ð.ä˜f hÐ/Ó0ˆ Ø ×јÔ#Ø × )Ñ )¬)¯-©-×*<Ñ*<¸ZÈȸ^Ó*LØ*6ó8ð8r cóÊ—||f}||jvr&|j|}|jtk(sJ‚|Sd|i}|dk7r||d<t|«}|j|«|S)aäReturns an existing or new PBXVariantGroup for name and path. If a PBXVariantGroup identified by the name and path arguments is already present as a child of this object, it is returned. Otherwise, a new PBXVariantGroup with the correct properties is created, added as a child, and returned. This method will generally be called by AddOrGetFileByPath, which knows when to create a variant group based on the structure of the pathnames passed to it. r7Nr)r0r4rr;)r-r7rrHrYÚvariant_group_propertiess rrMz*PBXGroup.AddOrGetVariantGroupByNameAndPath*sƒ€ð �ˆ,€CØ ˆd×5Ñ5Ñ5Ø×AÑAÀ#ÑFÐØ × (Ñ (¬OÒ ;Ð;Ð ;Ø Ðà &¨˜~ÐØ ˆt‚|Ø)-ИvÑ&Ü'Ð(@ÓAÐØ×ÑÐ&Ô'à Ðr cóF—t|jd«dk(�rÉ|jddjtk(�r¥|jdd}|j}|j|_|j|_d|jvs|jddk(rnd|vrTd|jvr4t j |d|jd«|jd<n|d|jd<d|vr|d|jd<d|vr0|ddk7r(|d|j«k7r|d|jd<d|jvr:d|jvr,|jd|jdk(r |jd=|jdD] }||_Œ t|jd«dk(r%|jddjtk(r�Œ¥|r:|jdD]'}|jtk(sŒ|j|«Œ)yy) a!If this PBXGroup has only one child and it's also a PBXGroup, take it over by making all of its children this object's children. This function will continue to take over only children when those children are groups. If there are three PBXGroups representing a, b, and c, with c inside b and b inside a, and a and b have no other children, this will result in a taking over both b and c, forming a PBXGroup for a/b/c. If recurse is True, this function will recurse into children and ask them to collapse themselves by taking over only children as well. Assuming an example hierarchy with files at a/b/c/d1, a/b/c/d2, and a/b/c/d3/e/f (d1, d2, and f are files, the rest are groups), recursion will result in a group for a/b/c containing a group for d3/e. r…r rrýr÷rr7N) r^r)r4rr/rr$r2r(ÚTakeOverOnlyChild)r-ÚrecursertÚold_propertiess rrazPBXGroup.TakeOverOnlyChildEs,€ô( ˆd×јzÑ*Ó +¨qÓ 0Ø × Ñ ˜:Ñ & qÑ )× 3Ñ 3´xÓ ?ð×јzÑ*¨1Ñ-€eð ×'Ñ'€nØ×*Ñ*€dÔØ$×6Ñ6€dÔà ˜T×-Ñ-Ñ -Ø × Ñ ˜,Ñ '¨9Ò 4ð �^Ñ #Ø �t×'Ñ'Ñ 'ä'0§~¡~°nÀVÑ6LØ6:×6FÑ6FÀvÑ6Nó(PˆD× Ñ ˜VÒ $ð(6°fÑ'=ˆD× Ñ ˜VÑ $Ø ˜>Ñ )à+9¸,Ñ+Gˆ$× Ñ ˜<Ñ (ð �>Ñ ! n°VÑ&<ÀÒ&DØ ˜Ñ  4§9¡9£;Ò .Ø#1°&Ñ#9ˆ×Ñ˜Ñ Ø �4×#Ñ#Ñ #¨°$×2BÑ2BÑ(BØ × Ñ ˜&Ñ ! T×%5Ñ%5°fÑ%=Ò =Ø × Ñ ˜VÐ $ð×#Ñ# JÔ/ˆ%؈� ð0ôS ˆd×јzÑ*Ó +¨qÒ 0Ø × Ñ ˜:Ñ & qÑ )× 3Ñ 3´xÔ ?ñXØ×#Ñ# JÔ/ˆ%Ø �?‰?œhÓ &Ø × !Ñ ! 'Õ *ñ0ðr cóþ—t|jdtjtj «¬«|jd<|jdD]#}t |t«sŒ|j«Œ%y)Nr…©rH) r±r)Ú functoolsÚ cmp_to_keyrörr>rÚ SortGroupr:s rrhzPBXGroup.SortGroup‹sh€äˆt×Ñ  Ñ+Ü×'Ñ'Ô(=×(EÑ(EÓFô Hð ×Ñ�ZÑ ð ×!Ñ! *Ô-ˆÜ �Eœ8Õ $Ø �‰Õñ.r rêrì)r5rírîrïrör=rFr[r~r/rUrWr2r;r=r@rFrNrMrarhrr rrrXs•„ñð "× )Ñ )× .Ñ .Ó 0€'Ø ‡.�.ØÐ)¨1¨a°Ð4Ø�C¨1¨aÐ0Ø�C¨1¨aÐ0ñôó #ò ò1ò ;ò"!òò$òò,[8òzó6D+óLr rcó—eZdZd„Zy)ÚXCFileLikeElementcóæ—g}|}|dk7rgt|t«rW|j«}t|«D]\}}|j ||«Œ|j }|dk7rt|t«rŒW|Sr)r>rörUÚ enumerateÚinsertr()r-rTr)Úxche_hashablesrxÚ xche_hashables rÚ PathHashableszXCFileLikeElement.PathHashablesšss€ð€IØ €DØ �$Š,œ: dÔ,AÔBØ—~‘~Ó'€nÜ"+¨NÖ";Ñ ˆ%�Ø×ј  Õ.ð#<à �[‰[€dð �$Š,œ: dÔ,AÕBð Ðr N)r5rírîrprr rrjrj–s„ór rjcó —eZdZy)ÚXCContainerPortalN©r5rírîrr rrrrr¬ó„ðr rrcó —eZdZy)ÚXCRemoteObjectNrsrr rrvrv²rtr rvc ó°—eZdZejj «Zej deddgdeddgdeddgdeddgdœ«dZejZ dd„Z y)r rr )ÚexplicitFileTypeÚlastKnownFileTyper7rTNc óH—tj||||«d|jvr@|jdjd«r"|jddd|jd<d}nd}d|jv�r+d|jv�rd|jv�r idd “d d “d d “dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%“id&d'“d(d)“d*d+“d,d-“d.d/“d0d1“d2d3“d4d5“d6d7“d8d9“d:d7“d;d<“d=d>“d?d@“dAd@“dBdC“dDdE“¥dFdGd dHdIdJdKdLdMdNdOdPœ ¥}ddddQœ}|rdR}d}nvt j |jd«} t j | «\} } | dSk7r| dTdj«} |j| dU«}|j| d«}||j|<yyyy)VNrr&r½TFryrxrú archive.arÚappúwrapper.applicationÚbdicr¡Úbundleúwrapper.cfbundleÚczsourcecode.c.cÚcczsourcecode.cpp.cppÚcppÚcssztext.cssÚcxxÚdartÚ sourcecodeÚdylibúcompiled.mach-o.dylibÚ frameworkúwrapper.frameworkrÁÚgypiÚhzsourcecode.c.hÚhxxzsourcecode.cpp.hÚicnsz image.icnsÚjavazsourcecode.javaÚjszsourcecode.javascriptÚkextú wrapper.kextÚmzsourcecode.c.objcÚmmzsourcecode.cpp.objcppÚnibz wrapper.nibÚozcompiled.mach-o.objfileÚpdfz image.pdfÚplztext.script.perlÚplistztext.plist.xmlÚpmÚpngz image.pngÚpyztext.script.pythonÚrzsourcecode.rezÚrezÚszsourcecode.asmÚ storyboardzfile.storyboardztext.plist.stringszsourcecode.swiftzfolder.assetcatalogz text.xcconfigzwrapper.xcdatamodelzwrapper.xcdatamodeldzwrapper.xcframeworkzfile.xibzsourcecode.yaccz&sourcecode.text-based-dylib-definition) ÚstringsÚswiftÚttfÚxcassetsÚxcconfigÚ xcdatamodelÚ xcdatamodeldÚ xcframeworkÚxibÚyÚtbd)r†rÁrŒÚfolderr¦r Útext) rjr/r)rIrrrLÚlowerr1) r-r.r'r(rPÚ extension_mapÚprop_mapÚ file_typeÚ prop_namerÚrootÚexts rr/zPBXFileReference.__init__Æs$€ä×јt Z°°VÔ<Ø �×!Ñ!Ñ! d×&6Ñ&6°vÑ&>×&GÑ&GÈÔ&LØ!%×!1Ñ!1°&Ñ!9¸#¸2Ð!>€d×Ñ�vÑØ�fà€fà �×!Ñ!Ò!Ø  4×#3Ñ#3Ò 3Ø  $×"2Ñ"2Ò 2ð.Ø �|ð.à Ð,ð.ð �vð.ð Ð)ð .ð Ð'ð .ð Ð+ð .ð Ð+ð.ð �zð.ð Ð+ð.ð �|ð.ð Ð.ð.ð Ð*ð.ð �|ð.ð �|ð.ð Ð'ð.ð Ð)ð!.ð" �|ñ#.ð$ Ð(ð%.ð& Ð.ð'.ð( �~ð).ð* Ð*ð+.ð, Ð.ð-.ð. �}ð/.ð0 Ð0ð1.ð2 �{ð3.ð4 Ð)ð5.ð6 Ð'ð7.ð8 Ð)ð9.ð: �{ð;.ð< Ð+ð=.ð> Ð'ð?.ð@ Ð'ðA.ðB Ð'ðC.ðD Ð(ñE.ðF,Ø)ØØ,Ø&Ø,Ø-Ø,Ø!Ø(Ø?ò[.€mðb*Ø)Ø)ñ€hñ ؈ Ø'‰ ä×%Ñ% d×&6Ñ&6°vÑ&>Ó?ˆÜ×(Ñ(¨Ó2‰ ˆˆsð �"Š9Ø�A�B�— ‘ “ˆ#ð "×%Ñ% c¨6Ó2ˆ Ø—L‘L Ð&9Ó:ˆ à$-€d×Ñ�yÒ!ðY 3ð 4ð"r rê) r5rírîrjr=rFr[r~r¯rñr“r/rr rr r ¸sm„Ø × %Ñ %× *Ñ *Ó ,€'Ø ‡.�.ؘS ! Q˜Ø˜S ! Q˜Ø˜S ! Q˜Ø˜S ! Q˜ñ ôð#Ðà(×EÑEÐôW.r r có—eZdZdZy)rz€à×)Ñ)Ð*?Ô@ˆ Ø × "Ñ " 6Ñ *¨dÓ 2ØÒðAô �4‹.Ðr có>—|j|jd«S)z@Convenience accessor to obtain the default XCBuildConfiguration.rÌ)rÐr)rOs rÚDefaultConfigurationz(XCConfigurationList.DefaultConfiguration`s€à × "Ñ " 4×#3Ñ#3Ð4NÑ#OÓ PÐPr có´—d}d}|jdD]?}|j|«}|€|}n||k7ry|sŒ#|j|«}|€|}Œ9||k7sŒ?y|syy)aµDetermines the state of a build setting in all XCBuildConfiguration child objects. If all child objects have key in their build settings, and the value is the same in all child objects, returns 1. If no child objects have the key in their build settings, returns 0. If some, but not all, child objects have the key in their build settings, or if any children have different values for the key, returns -1. NrÊr½rr )r)r»r½)r-rHÚhasrIrÏÚconfiguration_hasÚconfiguration_values rr»z#XCConfigurationList.HasBuildSettingds�€ð €CØ €EØ×)Ñ)Ð*?Ô@ˆ Ø'×7Ñ7¸Ó<ÐØ ˆØ‰Ø Ð#Ò #Ùâ Ø+×;Ñ;¸CÓ@ÐØ ˆ=Ø%‰%Ø Ð)Ó )ÙðAñ Ø à r có„—d}|jdD]+}|j|«}|€|}Œ||k7sŒtd|z«‚|S)z�Gets the build setting for key. All child XCConfiguration objects must have the same value set for the setting, or a ValueError will be raised. NrÊzVariant values for )r)r½r7)r-rHrIrÏrÖs rr½z#XCConfigurationList.GetBuildSetting†s\€ð €EØ×)Ñ)Ð*?Ô@ˆ Ø)×9Ñ9¸#Ó>ÐØ ˆØ#‰à Ð'Ó 'ÜÐ0°3Ñ6Ó7Ð 7ð Að €Lr cóP—|jdD]}|j||«Œy)z[Sets the build setting for key to value in all child XCBuildConfiguration objects. rÊN©r)r¿©r-rHrIrÏs rr¿z#XCConfigurationList.SetBuildSetting›s+€ð ×)Ñ)Ð*?Ô@ˆ Ø×#Ñ# C¨Õ/ñAr cóP—|jdD]}|j||«Œy)z{Appends value to the build setting for key, which is treated as a list, in all child XCBuildConfiguration objects. rÊN©r)rÁrÚs rrÁz&XCConfigurationList.AppendBuildSetting£s+€ð ×)Ñ)Ð*?Ô@ˆ Ø×&Ñ& s¨EÕ2ñAr cóN—|jdD]}|j|«Œy)zSDeletes the build setting key from all child XCBuildConfiguration objects. rÊN©r)rÃ)r-rHrÏs rrÃz#XCConfigurationList.DelBuildSetting«s)€ð ×)Ñ)Ð*?Ô@ˆ Ø×#Ñ# CÕ(ñAr cóN—|jdD]}|j|«Œy)zLSets the build configuration in all child XCBuildConfiguration objects. rÊN)r)rÅ)r-rIrÏs rrÅz(XCConfigurationList.SetBaseConfiguration³s)€ð×)Ñ)Ð*?Ô@ˆ Ø×(Ñ(¨Õ/ñAr N)r5rírîrÀÚ_configsrr=rFr[rAr~r2rÐrÒr»r½r¿rÁrÃrÅrr rrÇrÇHs¥„á# V¨WÐ$5Ó6Ù# V¨YÐ$7Ó8ð;€(ð × Ñ × !Ñ !Ó #€'Ø ‡.�.Ø&'Ð)=¸qÀ!ÀXÐ%NØ&'¨¸qÀ!ÀQÐ%GØ&'¨¸qÀ!ÀYÐ%Oñôò LòòQò  òDò*0ò3ò)ó0r rÇcó —eZdZejj «Zej deddgdeddgdœ«dZ ejZ d„Z d„Z y)r¿rr ©ÚfileRefr»Tcóx—|jdj«dz|jj«zS)Nrãr;)r)r2r(rOs rr2zPBXBuildFile.NameÆs3€à × Ñ ˜IÑ &× +Ñ +Ó -°Ñ 6¸¿¹×9IÑ9IÓ9KÑ KÐKr cóˆ—tj|«}|j|jdj ««|S)Nrã)rrUrSr)rp©r-rTs rrUzPBXBuildFile.HashablesÊs<€ä×"Ñ" 4Ó(€Ið×Ñ�T×%Ñ% iÑ0×>Ñ>Ó@ÔAà Ðr N)r5rírîrr=rFr[rjr~r¯rñr“r2rUrr rr¿r¿»s_„Ø × Ñ × !Ñ !Ó #€'Ø ‡.�.ØÐ% q¨!Ð,Ø�C q¨!Ð,ñôð #ÐØ×<Ñ<ÐòLó r r¿c ó¸—eZdZdZej j «Zejdedddgde ddggdedddgdœ«d d„Z d„Z d „Z dd „Z dd „Zdd „Zy)Ú XCBuildPhasea{Abstract base for build phase classes. Not represented in a project file. Attributes: _files_by_path: A dict mapping each path of a child in the files list by path (keys) to the corresponding PBXBuildFile children (values). _files_by_xcfilelikeelement: A dict mapping each XCFileLikeElement (keys) to the corresponding PBXBuildFile children (values). rr iÿÿÿ)ÚbuildActionMaskÚfilesÚ"runOnlyForDeploymentPostprocessingNcó´—tj||||«i|_i|_|jj dg«D]}|j |«Œy©Nrê)rr/Ú_files_by_pathÚ_files_by_xcfilelikeelementr)r1Ú_AddBuildFileToDicts)r-r.r'r(Ú pbxbuildfiles rr/zXCBuildPhase.__init__ósQ€ä ×Ñ�d˜J¨¨FÔ3à€DÔØ')€DÔ$Ø×(Ñ(×,Ñ,¨W°bÖ9ˆ Ø ×Ñ  Õ-ñ:r cóF—t|jjdz«‚)Nz must implement FileGroup)r3r4r5r?s rÚ FileGroupzXCBuildPhase.FileGroupüs&€ô Ø �.‰.× !Ñ !Ð$?Ñ ?ó AðAr cóZ—||jvrtd|z«‚||j|<y)z—Adds path to the dict tracking paths belonging to this build phase. If the path is already a member of this build phase, raises an exception. z%Found multiple build files with path N)rîr7©r-rñrs rÚ_AddPathToDictzXCBuildPhase._AddPathToDicts3€ð  ˆt×"Ñ"Ñ"Ü Ð>ÀÑEÓ FÐFØ ,€D×јÒr có—|jd}g}|dk7r"t|t«ru|j|«nct|t«r4|jdD]!}|j|j ««Œ#n|j|j ««|D]}|j ||«Œ||j vr.|j ||k7rtd|j«z«‚||j |<y)a6Maintains the _files_by_path and _files_by_xcfilelikeelement dicts. If path is specified, then it is the path that is being added to the phase, and pbxbuildfile must contain either a PBXFileReference directly referencing that path, or it must contain a PBXVariantGroup that itself contains a PBXFileReference referencing the path. If path is not specified, either the PBXFileReference's path or the paths of all children of the PBXVariantGroup are taken as being added to the phase. If the path is already present in the phase, raises an exception. If the PBXFileReference or PBXVariantGroup referenced by pbxbuildfile are already present in the phase, referenced by a different PBXBuildFile object, raises an exception. This does not raise an exception when a PBXFileReference or PBXVariantGroup reappear and are referenced by the same PBXBuildFile that has already introduced them, because in the case of PBXVariantGroup objects, they may correspond to multiple paths that are not all added simultaneously. When this situation occurs, the path needs to be added to _files_by_path, but nothing needs to change in _files_by_xcfilelikeelement, and the caller should have avoided adding the PBXBuildFile if it is already present in the list of children. rãNr…zFound multiple build files for ) r)r>rrCr+rörïr7r2)r-rñrÚxcfilelikeelementÚpathsÚvariantÚa_paths rrðz!XCBuildPhase._AddBuildFileToDictssú€ð4%×0Ñ0°Ñ;Ðà €EØ ˆt‚|ä Ð%¤Ô 7Ø � ‰ �TÕô Ð%¤Ô 7Ø(×4Ñ4°ZÔ@ˆGØ �,‰,�w×'Ñ'Ó)Õ *ñAð � ‰ Ð&×/Ñ/Ó1Ô2ó ˆØ ×ј,¨Õ/ðð ˜D×<Ñ<Ñ<Ø ×'Ñ'Ð(9Ñ:¸lÒJÜ Ð8Ø(×-Ñ-Ó/ñ0ó 1ð1à:F€D×$Ñ$Ð%6Ò7r cóL—|jd|«|j||«yrí)rãrðrõs rÚAppendBuildFilezXCBuildPhase.AppendBuildFileGs$€ð  ×ј Ô.Ø×јl¨DÕ1r có0—|j|«\}}|j||«}||jvr2t|t«r"|j|}|j ||«y|€t d|i«}nt ||dœ«}|j||«y)Nrãrâ)rórNrïr>rrðr¿rý)r-rr»Ú file_grouprOrWrñs rÚAddFilezXCBuildPhase.AddFilePs—€Ø!%§¡°Ó!5Ñ€Z�Ø×,Ñ,¨T°<Ó@€Hà�4×3Ñ3Ñ3Ü�(œOÔ,ð×5Ñ5°hÑ?€lØ ×Ñ  ¨dÕ3ð Ð Ü# Y°Ð$9Ó:‰ ä#°ÀhÑ$OÓPˆ Ø ×ј<¨Õ.r rêr)r5rírîrïrr=rFr[rAr¿r/rórörðrýrrr rrèrèÙsy„ñð$ × Ñ × !Ñ !Ó #€'Ø ‡.�.Ø+,¨c¸A¸qÀ*Ð*MØ+,¨l¸A¸qÀ"Ð*EØ+,¨c¸A¸qÀ!Ð*Dñôó .òAò-ó6Góp2ô/r rècó—eZdZd„Zd„Zy)ÚPBXHeadersBuildPhasecó—y)NÚHeadersrrOs rr2zPBXHeadersBuildPhase.Namegó€Ø r có@—|j«j|«Sr©rŒÚRootGroupForPathr?s rrózPBXHeadersBuildPhase.FileGroupjó€Ø × "Ñ "Ó $× 5Ñ 5°dÓ ;Ð;r N©r5rírîr2rórr rrrdó „òó—d|jvr|jdSy)Nr7Ú ShellScriptrØrOs rr2zPBXShellScriptBuildPhase.Name s$€Ø �×!Ñ!Ñ!Ø × Ñ ˜fÑ %Ð%à r N) r5rírîrèr=rFr[r~rAr2rr rrr•sw„Ø × Ñ × %Ñ %Ó '€'Ø ‡.�.ؘC  A rÐ*ؘC  A˜Ø˜C  A rÐ*ؘC  A yÐ1ؘC  A˜Ø˜C  A˜ñ ôór rc óÚ—eZdZejj «Zej deddgdeddgdeddgdœ«e jd«Z dddœZ ddd d dd d d ddœ Z d„Zd„Zd„Zy)ÚPBXCopyFilesBuildPhaserr )ÚdstPathÚdstSubfolderSpecr7z,^\$\((.*?)\)(/(\$\((.*?)\)(/(.*)|)|(.*)|)|)$ér")ÚBUILT_PRODUCTS_DIRÚBUILT_FRAMEWORKS_DIRérér#r$r%) Ú WRAPPER_NAMEÚEXECUTABLE_FOLDER_PATHÚ!UNLOCALIZED_RESOURCES_FOLDER_PATHÚJAVA_FOLDER_PATHÚFRAMEWORKS_FOLDER_PATHÚSHARED_FRAMEWORKS_FOLDER_PATHÚSHARED_SUPPORT_FOLDER_PATHÚPLUGINS_FOLDER_PATHÚXPCSERVICES_FOLDER_PATHcó>—d|jvr|jdSy)Nr7Ú CopyFilesrØrOs rr2zPBXCopyFilesBuildPhase.NameÓs$€Ø �×!Ñ!Ñ!Ø × Ñ ˜fÑ %Ð%à r có@—|j«j|«Srrr?s rróz PBXCopyFilesBuildPhase.FileGroupÙr r có€—|jj|«}|rÅ|jd«}||jvr¡|j|}|jd«}|€d}|dk(r»|jd«�ª|jd«}|jd«}d}||jvr#|j|}|€d}d}|d k(r^d |z|z}nU|jd«}nCd }|}n>|j d«rd }|dd}n%t d |›d |jj›�«‚||jd<||jd<y)z±Set the dstSubfolderSpec and dstPath properties from path. path may be specified in the same notation used for XCHierarchicalElements, specifically, "$(DIR)/path". r rNr¦r)rcr,r&r6z#$(CONTENTS_FOLDER_PATH)/XPCServicesrzCan't use path z in a r'r() Ú path_tree_rer™rÚpath_tree_first_to_subfolderÚpath_tree_second_to_subfolderr(r7r4r5r))r-rÚpath_tree_matchÚ path_treeÚ subfolderÚ relative_pathÚ separators rÚSetDestinationz%PBXCopyFilesBuildPhase.SetDestinationÜsn€ð×'Ñ'×.Ñ.¨tÓ4€OÙØ!×'Ñ'¨Ó*€iØ �d×7Ñ7Ñ 7Ø×5Ñ5°iÑ@ˆ Ø'×-Ñ-¨aÓ0ˆ Ø Ð Øˆ-à ˜Š?˜×4Ñ4°QÓ7ÐCð<&×+Ñ+¨AÓ.ˆ)Ø)×/Ñ/°Ó2ˆ-؈)à ˜$×<Ñ<Ñ <Ø×:Ñ:¸9ÑEˆIØÐ$Ø ˆm؈iØÐ5Ò5ØCØ )ñ*Ø,9ñ:‰mð ,×1Ñ1°!Ó4‰Mð ˆ Ø‰ Ø �‰˜Ô à€iؘ1˜2�h�må Ú˜dŸn™n×5Ò5ð7ó 8ð8ð#0€D×Ñ�YÑØ+4€D×ÑÐ'Ò(r N)r5rírîrèr=rFr[r~rArÚcompiler;r<r=r2rórCrr rr&r&§s¤„Ø × Ñ × %Ñ %Ó '€'Ø ‡.�.ؘC  A˜Ø˜C  A˜Ø˜C  A˜ñôð�—‘ÐKÓL€,ð)+Ø(*ñ"Ðð*+ð*+Ø)*Ø(*Ø(*Ø(*Ø(*Ø(*ð)+ñ#Ðò$ò <óO5r r&c ó°—eZdZejj «Zej deddgdeddgdeddgdedddgdeddggdeddgdœ«d„Z d„Z y)Ú PBXBuildRulerr )Ú compilerSpecÚ filePatternsÚfileTypeÚ isEditableÚ outputFilesÚscriptcó.—|jjSr©r4r5rOs rr2zPBXBuildRule.Name9ó€à �>‰>× "Ñ "Ð"r cóÄ—tj|«}|j|jd«d|jvr|j|jd«|S)NrIrH)rrUrCr)ræs rrUzPBXBuildRule.Hashables=sZ€ä×"Ñ" 4Ó(€Ið×Ñ�T×%Ñ% jÑ1Ô2ؘ×)Ñ)Ñ)Ø×Ñ�t×'Ñ'¨Ñ7Ô8Ø Ðr N) r5rírîrr=rFr[r~rAr2rUrr rrFrF.sy„Ø × Ñ × !Ñ !Ó #€'Ø ‡.�.ؘ˜Q �Nؘ˜Q �Nؘ˜Q �Nؘ˜Q  1Ð%ؘ˜Q  2Ð&ؘ˜Q �Nñ ôò#ór rFc óž—eZdZejj «Zej deddgdeddgde ddgde ddgdœ«d„Z d„Z d„Z y)r¾rr ©ÚcontainerPortalÚ proxyTyperºÚ remoteInfocóš—|j}|dj«›d|d›�}d|jj|t |«fzS)NrSz.gyp:rUr1)r)r2r4r5r')r-Úpropsr7s rr8zPBXContainerItemProxy.__repr__bsK€Ø × Ñ €EØÐ 1Ñ2×7Ñ7Õ9¸5ÀÒ;NÐ O€DØ  §¡× 7Ñ 7¸¼rÀ$»xÐHÑ HÐHr có.—|jjSrrNrOs rr2zPBXContainerItemProxy.NamegrOr cóà—tj|«}|j|jdj««|j|jdj««|S)NrSrº©rrUrSr)ræs rrUzPBXContainerItemProxy.Hashablesks`€ä×"Ñ" 4Ó(€Ið×Ñ�T×%Ñ%Ð&7Ñ8×BÑBÓDÔEØ ×Ñ�T×%Ñ%Ð&<Ñ=×GÑGÓIÔJØ Ðr N)r5rírîrr=rFr[rrrArvr~r8r2rUrr rr¾r¾Hsj„ð$ × Ñ × !Ñ !Ó #€'Ø ‡.�.ØÐ 1°1°aÐ8Ø °1°aÐ8Ø °1°aÐ8Ø °1°aÐ8ñ ôòIò #ór r¾có¨—eZdZejj «Zej deddgddjddgde ddgdœ«d„Z d„Z d„Z y)ÚPBXTargetDependencyrNr )r7ÚtargetÚ targetProxycóÀ—|jjd«xs|jdj«}d|jj|t |«fzS)Nr7r]r1)r)r1r2r4r5r'r6s rr8zPBXTargetDependency.__repr__†sQ€Ø × Ñ × Ñ  Ó 'Ò L¨4×+;Ñ+;¸HÑ+E×+JÑ+JÓ+L€DØ  §¡× 7Ñ 7¸¼rÀ$»xÐHÑ HÐHr có.—|jjSrrNrOs rr2zPBXTargetDependency.NameŠrOr cóˆ—tj|«}|j|jdj««|S)Nr^rZræs rrUzPBXTargetDependency.HashablesŽs<€ä×"Ñ" 4Ó(€Ið×Ñ�T×%Ñ% mÑ4×>Ñ>Ó@ÔAØ Ðr ) r5rírîrr=rFr[r~r4r¾r8r2rUrr rr\r\usb„ð × Ñ × !Ñ !Ó #€'Ø ‡.�.Ø�s¨a°Ð3Ø�t—~‘~¨a°Ð3ØÐ,¨a°Ð3ñôò Iò#ór r\có‚—eZdZejj «Zej deddgdeddgdeddgdœ«y)rCrr )rIrrBN) r5rírîrjr=rFr[r~r¾rr rrCrC—sL„Ø × %Ñ %× *Ñ *Ó ,€'Ø ‡.�.Ø�S¨A¨qÐ1Ø�S¨A¨qÐ1ØÐ*¨A¨qÐ1ñõr rCc óâ—eZdZejj «Zej dedde«gdeddggde ddggde ddgde ddgdœ« dd„Z d„Z d„Z d„Zd „Zd „Zd „Zd „Zd „Zy)ÚXCTargetrr )ÚbuildConfigurationListÚ buildPhasesÚ dependenciesr7Ú productNameNcól—tj||||«d|jvr-d|jvr|jd|jd«d|jvrSd|jvrD|jd}|j d«dk(r |j d|jd«yyyy)Nr7rhreÚ PRODUCT_NAMEr)rvr/r)rßr»r¿)r-r.r'r(Ú force_outdirÚ force_prefixÚforce_extensionÚconfigss rr/zXCTarget.__init__²s¿€ô×јD *¨b°&Ô9ð �×!Ñ!Ñ!Ø ˜d×.Ñ.Ñ .Ø ×ј¨×(8Ñ(8¸Ñ(@ÔAà˜×(Ñ(Ñ(Ø ! T×%5Ñ%5Ñ 5Ø×"Ñ"Ð#;Ñ<ˆØ × "Ñ " >Ó 2°aÒ 7Ø × !Ñ ! .Ø"&×"2Ñ"2°=Ñ"Aõ Cð 8ð 6ð)r cóŒ—|j«}|j«}||k(r?t|d||j«dœ«}t||dœ«}|j d|«y|j |«d}t|d||j«dœ«}t|j«|dœ«}|j d|«y)Nr rR)r]r^rg)r7r^)rŒr¾r2r\rãÚAddOrGetProjectReference)r-r‚Ú pbxprojectÚother_pbxprojectÚ containerÚ dependencyÚother_project_refs rÚ AddDependencyzXCTarget.AddDependencyÆsÜ€Ø×(Ñ(Ó*€JØ×/Ñ/Ó1ÐØÐ%Ò%ä'ÀØABØAFØAFÇÁÃñ)OóP€iô'°uØ7@ñ(BóC€jà ×ј.¨*Õ5ð × -Ñ -Ð.>Ó ?ÀÑ Bðä'Ø$5Ø$%Ø$)Ø$)§J¡J£Lñ ) ó €iô '°u·z±z³|Ø7@ñ(BóC€jà ×ј.¨*Õ5r có>—|jdj|«S©Nre)r)rÐr6s rrÐzXCTarget.ConfigurationNamedâs€Ø × Ñ Ð4Ñ 5× HÑ HÈÓ NÐNr có<—|jdj«Srx)r)rÒrOs rrÒzXCTarget.DefaultConfigurationås€Ø × Ñ Ð4Ñ 5× JÑ JÓ LÐLr có>—|jdj|«Srx)r)r»rÙs rr»zXCTarget.HasBuildSettingèó€Ø × Ñ Ð4Ñ 5× EÑ EÀcÓ JÐJr có>—|jdj|«Srx)r)r½rÙs rr½zXCTarget.GetBuildSettingër{r có@—|jdj||«SrxrÙrÞs rr¿zXCTarget.SetBuildSettingîs(€Ø × Ñ Ð4Ñ 5× EÑ EÀcØFKó MðMr có@—|jdj||«SrxrÜrÞs rrÁzXCTarget.AppendBuildSettingòs(€Ø × Ñ Ð4Ñ 5× HÑ HÈØINó PðPr có>—|jdj|«SrxrÞrÙs rrÃzXCTarget.DelBuildSettingör{r ©NNNNNN)r5rírîrvr=rFr[rÇrèr\r~r/rvrÐrÒr»r½r¿rÁrÃrr rrdrd s°„ð × "Ñ "× 'Ñ 'Ó )€'Ø ‡.�.Ø Ð"5°q¸!Ù2Ó4ð6à  ,°q¸!¸RÐ@Ø Ð"5°q¸!¸RÐ@Ø  #°q¸!Ð<Ø  #°q¸!Ð<ñ ôð7;ØEIóCò(6ò8OòMòKòKòMòPóKr rdr]r có,—eZdZejj «Zej dedde«e «ggde ddggde ddgde ddgdœ«gd¢gd¢gd¢gd¢gd¢gd¢gd¢gd ¢gd ¢gd ¢gd ¢gd ¢gd ¢dœ Z dd„Zd„Zd„Zd„Zd„Zd„Zd„Zy)ÚPBXNativeTargetr r)rfÚ buildRulesÚproductReferenceÚ productType)r}r¦z.app)zwrapper.app-extensionr¦z.appex)r€r¦z.bundle)r‹r¦z .framework)r‰Úlibz.dylib)r{r†z.a)úcompiled.mach-o.executabler¦r¦)r€r¦z.xctest)r‰r¦z.so)r“r¦z.kext) z"com.apple.product-type.applicationz+com.apple.product-type.application.watchappz)com.apple.product-type.watchkit-extensionz$com.apple.product-type.app-extensionzcom.apple.product-type.bundleú com.apple.product-type.frameworkú&com.apple.product-type.library.dynamicú%com.apple.product-type.library.staticzcom.apple.product-type.toolz'com.apple.product-type.bundle.unit-testz(com.apple.product-type.bundle.ui-testingúcom.googlecode.gyp.xcode.bundlez'com.apple.product-type.kernel-extensionNcó8—tj||||«d|jv�rsd|jv�rcd|jv�rS|jd|jv�r6d}|j «}|dk7r|j «}|dk7�r|j|jd\} } } |jddk(rLd|jd<|j dd«|j dd «|j d d «|€| d d}|jdd k(s|jdd k(r|€| d d}|�†d|z} | jd«r|j d|«n|j d|«| jd«r:|jd} | | z } d } |jd| «|j d| «|�|} | jd«r|j d| «n|j d| «|�|j d|«|jd} t| «} | r1| d| | k(r)| | d} |jd| «|j d| «| d| | z| zddœ}t|«}|j|«|jd|«yyyyyy)Nrhr…r„r‹r‰Ú MACH_O_TYPEÚ mh_bundleÚDYLIB_CURRENT_VERSIONr¦ÚDYLIB_COMPATIBILITY_VERSIONr z'com.apple.product-type-bundle.unit.testz(com.apple.product-type-bundle.ui-testingÚ.zwrapper.ÚWRAPPER_EXTENSIONÚEXECUTABLE_EXTENSIONr‡rjÚWRAPPER_PREFIXÚEXECUTABLE_PREFIXÚTARGET_BUILD_DIRrr*)rxrúrrý) rdr/r)Ú_product_filetypesrŒÚ ProductsGroupr¿r(rßr^r r;)r-r.r'r(rkrlrmÚproducts_grouprqÚfiletypeÚprefixÚsuffixÚ product_nameÚ prefix_lenÚ ref_propsrWs rr/zPBXNativeTarget.__init__2 sú€ô ×Ñ�d˜J¨¨FÔ3à˜×(Ñ(Ò(ؘ×(Ñ(Ò(Ø  ×!1Ñ!1Ò 1Ø ×ј Ñ&¨$×*AÑ*AÒAØ€nØ×*Ñ*Ó,€jØ �tÒ Ø#×1Ñ1Ó3ˆà ˜4Ó à × #Ñ # D×$4Ñ$4°]Ñ$CÑ Dñ #ˆ�6˜6ð2 × Ñ ˜MÑ *Ð.OÒ Oà6ð × Ñ ˜=Ñ )à × Ñ ˜}¨kÔ :Ø × Ñ Ð6¸Ô ;Ø × Ñ Ð<¸bÔ AØ Ð $Ø$ Q R˜jˆOà × Ñ ˜MÑ *Ø 4ò 5à × Ñ ˜MÑ *Ø 5ò 6à Ð $Ø$ Q R˜jˆOà Ð &ð˜Ñ(ˆ&Ø × Ñ  Ô ,Ø × Ñ Ð!4°oÕ Fà × Ñ Ð!7¸Ô Ià × Ñ Ð!=Ô >Ø×+Ñ+¨MÑ:ˆLØ ˜FÑ "ˆL؈FØ × Ñ ˜]¨LÔ 9Ø × Ñ  °Ô >ð Ð #؈&Ø × Ñ ˜zÔ *Ø × Ñ Ð/°Õ 8à × Ñ Ð2°FÔ ;à Ð #Ø × Ñ Ð1°<Ô @ð×'Ñ'¨ Ñ6ˆ ܘ“[ˆ Ù ˜<¨ ¨Ð4¸Ò>Ø% j kÐ2ˆ,Ø × Ñ ˜=¨,Ô 7Ø × Ñ ˜~¨|Ô <ð'ØØ$ |Ñ3°fÑ<Ø2ñ  ˆ ô $ IÓ.ˆØ×"Ñ" 8Ô,Ø ×ÑÐ+¨XÕ6ð ð Bð 2ð)ð)r cóv—d|jvryd}|jdD]}t||«sŒ|�J‚|}Œ|S©Nrf)r)r>)r-ÚtypeÚ the_phaseÚphases rÚGetBuildPhaseByTypez#PBXNativeTarget.GetBuildPhaseByType¡ sR€Ø ˜D×,Ñ,Ñ ,Ø à€IØ×!Ñ! -Ô0ˆÜ �E˜4Õ ð РРР؉ ð1ð Ðr cól—|jt«}|€œt«}t|jd«}t |jd«D]9\}}t |t «s!t |t«st |t«sŒ7|}n|jdj||«||_ |Sr¡) r¥rr^r)rlr>r rrrmr()r-Ú headers_phaseÚ insert_atrxr¤s rÚ HeadersPhasezPBXNativeTarget.HeadersPhase² s«€Ø×,Ñ,Ô-AÓB€MØÐÜ*Ó,€mô�d×&Ñ& }Ñ5Ó6€iÜ# D×$4Ñ$4°]Ñ$CÖD‰,ˆ%�Ü �eÔ3Ô 4Ü �eÔ1Ô 2Ü �eÔ4Õ 5؈)Ù ð Eð ×Ñ�}Ñ%×,Ñ,¨Y¸ ÔFØ!€mÔà Ðr cóL—|jt«}|€Œt«}t|jd«}t |jd«D])\}}t |t «st |t«sŒ'|}n|jdj||«||_ |Sr¡) r¥r r^r)rlr>rrrmr()r-Úresources_phaser¨rxr¤s rÚResourcesPhasezPBXNativeTarget.ResourcesPhaseÆ s €Ø×.Ñ.Ô/EÓF€OØÐÜ.Ó0€oô�d×&Ñ& }Ñ5Ó6€iÜ# D×$4Ñ$4°]Ñ$CÖD‰,ˆ%�Ü �eÔ1Ô 2Ü �eÔ4Õ 5؈)Ù ð Eð  ×Ñ�}Ñ%×,Ñ,¨Y¸ÔHØ#€oÔà Ðr cól—|jt«}|€t«}|jd|«|Sr¡)r¥rrã)r-Ú sources_phases rÚ SourcesPhasezPBXNativeTarget.SourcesPhaseÙ s7€Ø×,Ñ,Ô-AÓB€MØÐÜ*Ó,€mØ ×ј-¨Ô7à Ðr cól—|jt«}|€t«}|jd|«|Sr¡)r¥rrã)r-Úframeworks_phases rÚFrameworksPhasezPBXNativeTarget.FrameworksPhaseá s:€Ø×/Ñ/Ô0GÓHÐØÐÜ0Ó2ÐØ ×ј-Ð)9Ô:à Ðr cóŠ—tj||«d}d}d}t|t«�rd|jv�r|jd|k7ród|jvrä|jd|k(sI|jd|k(s|jd|k(r­|j d«r|j d«dk7r‡|jd«}|j«}|j«}||k7r%|j|«d}|j|«}|j«jd td |i««yyyyyyy) NrŠr‰rˆr…r�rŽr„rrêrã)rdrvr>r‚r)r»r½rÜrŒrprFr²rãr¿) r-r‚Ústatic_library_typeÚshared_library_typeÚframework_typerWrqrrÚother_project_product_groups rrvzPBXNativeTarget.AddDependencyé s^€ä ×ј4 Ô'àAÐØBÐØ7€NÜ�%œÕ)ؘ×(Ñ(Ò(Ø ×ј Ñ&Ð*=Ò=ؘ×)Ñ)Ñ)Ø ×ј-Ñ(Ð,?Ò?Ø × Ñ ˜MÑ *Ð.AÒ AØ × Ñ ˜MÑ *¨nÒ <Ø×$Ñ$ ]Ô3Ø × Ñ   Ó .°+Ò =à×"Ñ"Ð#5Ó6€hà×*Ñ*Ó,€jØ×1Ñ1Ó3ÐØ Ð'Ò 'à × /Ñ /Ð0@Ó AÀ!Ñ Dð $à.×EÑEÀhÓOˆà ×ÑÓ×+Ñ+¨GÜ,8¸)ÀXÐ9NÓ,OõQð >ð =ð*ð>ð)ð*r r€)r5rírîrdr=rFr[rèrrrFr r~r—r/r¥r©r¬r¯r²rvrr rr‚r‚ÿsî„ð × Ñ × !Ñ !Ó #€'Ø ‡.�.ؘL¨a°Ù.Ó0Ñ2IÓ2KÐLðNà˜L¨a°°BÐ7ØÐ,¨a°Ð3ؘC¨a°Ð3ñ ôò5Aò5Aò5Cò5Cò1@ò1Cò1Bò1>ò19ò1@ò2Aò1<ò1>ñ3Ðð:7;ØEIóm7ò^ò"ò(ò&òóQr r‚có —eZdZy)ÚPBXAggregateTargetNrsrr rr¹r¹ s„Ør r¹cól—eZdZdZej j «Zejdeddgde dde «gde dddgde dddgde dde «gde dddgdeddgde dddgde ddggdœ «dd„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Z d„Z!d„Z"d„Z#y) Ú PBXProjectaE Attributes: path: "sample.xcodeproj". TODO(mark) Document me! _other_pbxprojects: A dictionary, keyed by other PBXProject objects. Each value is a reference to the dict in the projectReferences list associated with the keyed PBXProject. rr z Xcode 3.2r¦) r‡reÚcompatibilityVersionÚhasScannedForEncodingsrÚprojectDirPathÚprojectReferencesÚ projectRootÚtargetsNcóN—||_i|_tj||||«Sr)rÚ_other_pbxprojectsrrr/)r-r.r'r(rs rr/zPBXProject.__init__' s(€Ø€D„IØ €DÔä × %Ñ % d¨J¸¸FÓ CÐCr có^—|j}|dddk(r|dd}tj|«S)Niöÿÿÿz .xcodeproj)rrrr6s rr2zPBXProject.Name- s5€Ø �9‰9€DØ ˆCˆD€z�\Ò!Ø �$�3ˆZ€dÜ × Ñ ˜dÓ #Ð#r có—|jSr)rrOs rÚPathzPBXProject.Path3 s €Ø �9‰9Ðr có—y)NzProject objectrrOs rrQzPBXProject.Comment6 s€Ø r cóœ—tj|«}d|jvr(|jdD]}|j|d«Œ|S)Nr¿Ú ProductGroup)rrrgr)rC)r-r…Ú references rrgzPBXProject.Children9 sP€ä ×)Ñ)¨$Ó/€Hð ˜d×.Ñ.Ñ.Ø×'Ñ'Ð(;Ô<ˆ)Ø�‰˜  .Ñ1Õ2ð=ð €Or có—|SrrrOs rrŒzPBXProject.PBXProjectAncestorG s€Ø €Kr cóÖ—d|jvr|jdt««|jd}|j|«}|€td|i«}|j |«|S)Nrr7)r)rßrr=r;)r-r7Ú main_grouprs rÚ _GroupByNamezPBXProject._GroupByNameJ sh€Ø ˜$×*Ñ*Ñ *Ø ×Ñ�{¤H£JÔ/à×!Ñ! +Ñ.€JØ × %Ñ % dÓ +€EØ €}ܘ �~Ó&€eØ×јUÔ#à €Lr có$—|jd«S)Nr©rÎrOs rÚ SourceGroupzPBXProject.SourceGroupX s€Ø × Ñ ˜XÓ &Ð&r có$—|jd«S)NrrÐrOs rr˜zPBXProject.ProductsGroup[ ó€Ø × Ñ ˜ZÓ (Ð(r có$—|jd«S)NrrÐrOs rÚIntermediatesGroupzPBXProject.IntermediatesGroupa s€Ø × Ñ ˜_Ó -Ð-r có$—|jd«SrrÐrOs rrzPBXProject.FrameworksGroupf s€Ø × Ñ ˜\Ó *Ð*r có$—|jd«S)NrrÐrOs rÚ ProjectsGroupzPBXProject.ProjectsGroupi rÓr cóè—|jdf|jdf|jdf|jdfdœ}t|«\}}|dk7r||vr||\}}|«}||fS|j«dfS)a˜Returns a PBXGroup child of this object to which path should be added. This method is intended to choose between SourceGroup and IntermediatesGroup on the basis of whether path is present in a source directory or an intermediates directory. For the purposes of this determination, any path located within a derived file directory such as PROJECT_DERIVED_FILE_DIR is treated as being in an intermediates directory. The returned value is a two-element tuple. The first element is the PBXGroup, and the second element specifies whether that group should be organized hierarchically (True) or as a single flat list (False). T)ÚDERIVED_FILE_DIRÚINTERMEDIATE_DIRÚPROJECT_DERIVED_FILE_DIRÚSHARED_INTERMEDIATE_DIRN)rÕrrÑ)r-rÚsource_tree_groupsrÚ group_funcrOrs rrzPBXProject.RootGroupForPathl sœ€ð*$(×#:Ñ#:¸DÐ"AØ#'×#:Ñ#:¸DÐ"AØ#'×#:Ñ#:¸DÐ"AØ#'×#:Ñ#:¸DÐ"Añ Ðô4°DÓ9Ñ€[�$Ø�dÒ˜{Ð.@Ñ@Ø#5°kÑ#BÑ €z�<Ù‹l€eØ�\Ð "Ð"ð × Ñ Ó  Ð %Ð%r cóN—|j|«\}}|j||«S)zöReturns a PBXFileReference corresponding to path in the correct group according to RootGroupForPath's heuristics. If an existing PBXFileReference for path exists, it will be returned. Otherwise, one will be created and returned. )rrN)r-rrrOs rÚAddOrGetFileInRootGroupz"PBXProject.AddOrGetFileInRootGroup‘ s,€ð!×1Ñ1°$Ó7Ñ€UˆLØ × #Ñ # D¨,Ó 7Ð7r cóŠ—|jdjdD]$}t|t«sŒ|j|«Œ&y)z9Calls TakeOverOnlyChild for all groups in the main group.rr…N)r)r>rra)r-rbrs rÚRootGroupsTakeOverOnlyChildrenz)PBXProject.RootGroupsTakeOverOnlyChildrenœ s=€ð×!Ñ! +Ñ.×:Ñ:¸:ÔFˆÜ �Eœ8Õ $Ø ×Ñ Õ(ñGr có’—t|jdjdtjtj «¬«|jdjd<|jdjdD]Æ}t |t«sŒ|j«dk(r�g}|jdD]F}t |t«sŒ|jd}||jdvsJ‚|j|«ŒHt|«t|jd«k(sJ‚||jd<Œ·|j«ŒÈy)Nrr…rerrÁr„) r±r)rfrgrör"r>rr2r‚rCr^rh)r-rÚproductsr]Úproducts rÚ SortGroupszPBXProject.SortGroups£ s0€ô ˆt×Ñ  Ñ,×8Ñ8¸ÑDÜ×'Ñ'Ô(=×(NÑ(NÓOô Qð ×Ñ�[Ñ!×-Ñ-¨jÑ9ð×!Ñ! +Ñ.×:Ñ:¸:ÔFˆÜ ˜œxÔ (Øà �‰‹˜Ò #ð ˆØ×&Ñ& yÔ1ˆFܘF¤OÔ4Ø Ø×&Ñ&Ð'9Ñ:ˆ'à˜E×-Ñ-¨jÑ9Ñ9Ð 9Ð9Ø �/‰/˜'Õ "ð 2ô�8‹}¤ E×$5Ñ$5°jÑ$AÓ BÒBÐBÐBØ(0ˆ×ј*Ò%à �‰Õñ/Gr có(‡‡ —d‰jvrg‰jd<d}d}|‰jv�rOtddi«}‰|_|jj |j ««tj‰j««}‰jd«}|r1tj|d«r|}ntj||«}tjj|j«|«}t!d|dd œ«}‰j#«j%|«||d œ}|‰j|<‰j'd|«t)‰jdd „¬ «‰jd<n‰j|}|d }|d}‰j+|||«‰j-|d«Š |jd«} t/ˆ ˆfd„| D««r*|jd} |jj | «||gS)a&Add a reference to another project file (via PBXProject object) to this one. Returns [ProductGroup, ProjectRef]. ProductGroup is a PBXGroup object in this project file that contains a PBXReferenceProxy object for each product of each PBXNativeTarget in the other project file. ProjectRef is a PBXFileReference to the other project file. If this project file already references the other project file, the existing ProductGroup and ProjectRef are returned. The ProductGroup will still be updated if necessary. r¿Nr7rr¾rzwrapper.pb-projectÚ SOURCE_ROOT)ryrrý)rÉÚ ProjectRefcóD—|dj«j«S)Nrê)r2r¯©Úxs rÚz5PBXProject.AddOrGetProjectReference.. s€˜q ™×3Ñ3Ó5×;Ñ;Ô=r rerÉrêFrÁc3óB•K—|]}‰j|‰«–—Œy­wr)Ú_AllSymrootsUnique)Ú.0ÚtÚinherit_unique_symrootr-s €€rÚ z6PBXProject.AddOrGetProjectReference.. s øèø€Ð OÁwÀ!ˆ4× "Ñ " 1Ð&<× =Áwùsƒr)r)rÃrr(r*rSrUrrKrÆrÜÚisabsr$rÁrÂÚ RelativePathr rØr;rãr±Ú_SetUpProductReferencesrðÚall) r-rrÚ product_groupÚ project_refr*r¾Ú other_pathÚref_dictÚproject_ref_dictrÁÚdir_pathrós ` @rrpz#PBXProject.AddOrGetProjectReferenceÆ sù€ð  $×"2Ñ"2Ñ 2Ø.0€d×ÑÐ*Ñ+à€MØ€Kà ˜t×6Ñ6Ò 6ô ¨ Ð3Ó4€mð"€mÔð ×Ñ×%Ñ%Ð&6×&@Ñ&@Ó&BÔCô ×#Ñ# D§I¡I£KÓ0€iØ×'Ñ'Ð(8Ó9€nÙ Ü �?‰?˜>¨!Ñ,Ô -Ø$‰)ä—n‘n Y°Ó?ˆ)Ü—:‘:×*Ñ*Ð+;×+@Ñ+@Ó+BÀIÓN€jô%Ø!5Ø!+Ø!.ñ& ó €kð  ×ÑÓ×&Ñ& {Ô3à"/¸{ÑK€hØ2:€d×ÑÐ.Ñ/Ø ×ÑÐ-¨xÔ8ô �×!Ñ!Ð"5Ñ6Ù=ô ?ð ×ÑÐ*Ò+ð ×0Ñ0Ð1AÑBÐØ& ~Ñ6€mØ$ \Ñ2€kà× Ñ Ð!1°=À+ÔNà!×4Ñ4Ð5EÀuÓMÐØ×*Ñ*¨9Ó5€GÜ Ô OÁwÓ OÔOØ×(Ñ(¨Ñ0€hØ×Ñ×%Ñ% hÔ/à ˜;Ð 'Ð'r có�—|j|«}|j|«D]}|�|j|«r|�Œ|rŒy|rdS|S)NFT)Ú_DefinedSymrootsÚ_IsUniqueSymrootForTarget)r-r]róÚsymrootsr s rrðzPBXProject._AllSymrootsUnique sV€ð ×$Ñ$ VÓ,€HØ × "Ñ " 6Ö *ˆØ ˆ- × >Ñ >¸qÔ AØ ‰)Ò2Ùð+ñˆ4Ð7Ð!7Ð7r có—|jd«}t«}|jd«D]=}|jd«}d|vr|j|d«Œ-|jd«Œ?t|«dk(rd|vr t«S|S)NrerÊr¼ÚSYMROOTr )rÜÚsetÚaddr^)r-r]Ú config_listrÚconfigÚsettings rrzPBXProject._DefinedSymroots! s‰€ð ×$Ñ$Ð%=Ó>€KÜ‹u€HØ×)Ñ)Ð*?Ö@ˆØ×"Ñ" ?Ó3€gØ �gÑ Ø� ‰ �W˜YÑ'Õ(à� ‰ �TÕð Aô  ˆ8ƒ}˜Ò˜d hÑ.Ü ‹U€lØ €Or có8‡—ddg}tˆfd„|D««ryy)Nz$SRCROOTz $(SRCROOT)c3ó&•K—|]}|‰v–—Œ y­wrr)rñríÚsymroots €rrôz7PBXProject._IsUniqueSymrootForTarget..8 søèø€Ð ,¡˜Aˆ1�Œ<¡ùsƒTF)Úany)r-r Ú uniquifiers ` rrz$PBXProject._IsUniqueSymrootForTarget3 s#ø€ð˜lÐ+€JÜ Ó ,¡Ó ,Ô,Ø Ø r có\—|jdD]š}t|t«sŒ|jd}|j|«�Œ5t |d||j «dœ«}t |jd|jd|jd|dœ«}|j|«Œœy) NrÁr„r:rRrxrrý)rIrrýrB)r)r>r‚rFr¾r2rCr;)r-rrrùrúr]Ú other_filerefÚcontainer_itemÚreference_proxys rr÷z"PBXProject._SetUpProductReferences< sº€ð#×.Ñ.¨yÔ9ˆÜ ˜¤Ô 0Øà×(Ñ(Ð);Ñ<€mØ × -Ñ -¨mÓ <Ñ Dô/Ø&1Ø&'Ø&3Ø&,§k¡k£mñ 0óˆô,Ø)×5Ñ5Ð6HÑIØ)×5Ñ5°fÑ=Ø)×5Ñ5°lÑCØ*ñ -óˆð ×!Ñ! /Õ2ñ7:r có2‡—|jj«D]y\}}gŠ|jdD]1}t|t«sŒ‰j |jd«Œ3|d}t |jdˆfd„¬«|jd<Œ{y)NrÁr„rÉr…cóZ•—‰j|jdjd«S)NrBrº)rxr))ríÚremote_productss €rrîz8PBXProject.SortRemoteProductReferences..s s%ø€˜×-Ñ-¨a¯m©m¸KÑ.H×.TÑ.TÐUkÑ.lÔmr re)rÃr<r)r>r‚rCr±)r-rrrür]rùrs @rÚSortRemoteProductReferencesz&PBXProject.SortRemoteProductReferences` s›ø€ð '+×&=Ñ&=×&CÑ&CÖ&EÑ"И(ð€oØ$×0Ñ0°Ô;ˆ&ܘ&¤/Ô2Ø Ø×јv×1Ñ1Ð2DÑEÕFð<ð˜~Ñ.€mÜ.4Ø × #Ñ # JÑ /Ûmô/o€m×Ñ  Ò+ñ'Fr )NNNNrì)$r5rírîrïrrr=rFr[rDrÇr~rArrdr/r2rÆrQrgrŒrÎrÑr˜rÕrrØrrárãrçrprðrrr÷rrr rr»r» s&„ñð × %Ñ %× *Ñ *Ó ,€'Ø ‡.�.Ø  $°q¸!Ð<Ø Ð"5°q¸!Ù2Ó4ð6à  #°q¸!¸[ÐIØ  #°q¸!¸QÐ?Ø  (°q¸!¹X»ZÐHØ  #°q¸!¸RÐ@Ø  $°q¸!Ð<Ø  #°q¸!¸RÐ@Ø  (°q¸!¸RÐ@ñ ô óDò $ò òò òò ò'ò)ò .ò +ò)ò#&òJ 8ó)ò!òFM(ò^ 8òò$ò"3óHor r»c ó¾—eZdZejj «Zej dedddgdeddigdedddgde ddgdœ«d d„Z e jfd„Z d„Zy) Ú XCProjectFilerr é.)ÚarchiveVersionÚclassesÚ objectVersionrzNcóJ—|r!|jdj|||«yy)Nrz)r)rh)r-rnror`s rrhzXCProjectFile.ComputeIDs s)€ñØ ×Ñ�|Ñ$×/Ñ/° ¸9ÀdÕKðr cóº—|j«i|jd<|j|dd«|jr|j|dd«n|j|dd«t |jj ««D]0\}}|dk(r|j |«Œ|j|d||«Œ2|j|dd«|jd=y)NÚobjectsrz// !$*UTF8*$! z{ z{ r z} )rÎr)r¤r¯r±r<Ú _PrintObjectsrÊ)r-r¡r†rIs rrÏzXCProjectFile.Print† sÄ€Ø×$Ñ$Ô&ð #%€D×Ñ�YÑØ‡M�M�$˜Ð,Ô-Ø ×%Ò%Ø ‡m�m�D˜!˜TÕ"à ‡m�m�D˜!˜UÔ#Ü! $×"2Ñ"2×"8Ñ"8Ó":Ö;‰ˆ�%Ø �YÒ Ø ×ј4Õ à �‰˜˜a ¨5Õ1ð <ð  ‡M�M�$˜˜5Ô!Ø ×јÑ#r cóh—|jr|j|dd«n|j|dd«i}|j«D];}||k(rŒ |jj}||vrg||<||j |«Œ=t |«D]n}|j|dd«|j|dd|zdz«t ||d„¬ «D]}|j|«Œ|j|dd |zdz«Œp|jr|j|dd «y|j|dd «y) Nrz objects = {r z objects = { r§z /* Begin z section */ có—|jSr)r'rìs rrîz-XCProjectFile._PrintObjects..­ s€¨¯ªr rez/* End z}; rÍ)r¯r¤r|r4r5rCr±rÏ)r-r¡Úobjects_by_classÚobjectÚ class_names rr zXCProjectFile._PrintObjectsš s/€Ø ×%Ò%Ø ‡m�m�D˜!˜]Õ+à ‡m�m�D˜!˜_Ô-àÐØ×"Ñ"Ö$ˆØ �4ŠØØ×#Ñ#×,Ñ,€jØ Ð+Ñ +Ø')ИÑ$Ø�zÑ"×)Ñ)¨&Õ1ð %ôÐ-Ö.ˆ Ø ‡m�m�D˜!˜TÔ"Ø ‡m�m�D˜!˜[¨:Ñ5¸ÑGÔHÜÐ+¨JÑ7Ù-÷/ˆ&à� ‰ �TÕð/ð ‡m�m�D˜!˜Y¨Ñ3°oÑEÕFð /ð ×%Ò%Ø ‡m�m�D˜!˜UÕ#à ‡m�m�D˜!˜VÕ$r rë)r5rírîrr=rFr[rArDr»rhrórôrÏr rr rrrv sv„Ø × Ñ × !Ñ !Ó #€'Ø ‡.�.ؘ# a¨¨AÐ.ؘ$ a¨¨BÐ/ؘ# a¨¨BÐ/ؘ* a¨Ð+ñ ôóLð—z‘zó$ó(%r r)6rïrfÚ gyp.commonrÁrrr\róÚhashlibÚsha1rfÚ ImportErrorÚshaÚnewr@Ú NameErrorr~r rDr˜ršr›rrrr$rrörrjrrrvr rrÀrÇr¿rèrr rrrr&rFr¾r\rCrdr=r‚r¹r»rrr rÚr-sqðñ EóNÛÛÛ Û Û ð ÛØ�l‰l€)ð á ðáð ˆB�J‰JÐ+Ó ,€ ð ˆ"�*‰*�UÓ €ð ˆ2�:‰:Ð+Ó ,€ð$˜Ÿ™Ð$<Ó=Ðò$ò(8ôs 4ˆvôs 4ôlI˜HôIôX{Ð$ô{ô| Ð-ôô,˜ôô �Xôô e.Ð(Ð*;¸^ôe.ôP�hÐ 1ôô;˜8ô;ô%�Hõ>%øðyVòÛ Ø�g‰gƒ)ðûðò؃*ðûð òõðús3œF?­G°G)Æ?GÇGÇG&Ç%G&Ç)G5Ç4G5